ViT图像分类-中文-日常物品代码实例添加摄像头实时流识别功能扩展教程重要提示本文基于阿里开源的ViT图像识别模型专注于中文日常物品分类。在原有静态图片识别的基础上我们将扩展摄像头实时识别功能让模型真正活起来。1. 项目概述与准备工作ViTVision Transformer是近年来计算机视觉领域的突破性技术它使用Transformer架构处理图像在图像分类任务上表现出色。阿里开源的这款中文日常物品分类模型专门针对中文场景下的常见物品进行了优化训练。原项目功能只能对静态图片进行分类识别本教程新增功能实现摄像头实时视频流识别让模型能够实时分析摄像头画面中的物品1.1 环境准备与快速检查在开始扩展功能前我们先确认基础环境正常运行# 检查Python环境 python --version # 检查OpenCV是否安装我们将用它处理摄像头 python -c import cv2; print(fOpenCV版本: {cv2.__version__}) # 检查PyTorch python -c import torch; print(fPyTorch版本: {torch.__version__})如果OpenCV没有安装可以通过以下命令安装pip install opencv-python1.2 理解原有代码结构先来看看原有的推理代码大致结构# 原推理.py的核心逻辑 import torch from transformers import ViTImageProcessor, ViTForImageClassification from PIL import Image import requests # 加载模型和处理器 processor ViTImageProcessor.from_pretrained(模型路径) model ViTForImageClassification.from_pretrained(模型路径) # 处理图片并进行推理 image Image.open(brid.jpg) inputs processor(imagesimage, return_tensorspt) outputs model(**inputs) logits outputs.logits predicted_class_idx logits.argmax(-1).item() print(预测结果:, model.config.id2label[predicted_class_idx])2. 摄像头实时识别功能实现现在我们来扩展摄像头实时识别功能让模型能够实时分析摄像头画面。2.1 创建实时识别脚本新建一个文件camera_inference.py添加以下代码import cv2 import torch from transformers import ViTImageProcessor, ViTForImageClassification from PIL import Image import numpy as np import time class ViTCameraClassifier: def __init__(self, model_path): 初始化模型和处理器 print(正在加载模型请稍候...) self.processor ViTImageProcessor.from_pretrained(model_path) self.model ViTForImageClassification.from_pretrained(model_path) self.model.eval() # 设置为评估模式 print(模型加载完成) def predict_image(self, image): 对单张图片进行预测 try: # 转换图像格式 if isinstance(image, np.ndarray): image Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # 预处理和推理 inputs self.processor(imagesimage, return_tensorspt) with torch.no_grad(): # 不计算梯度加快推理速度 outputs self.model(**inputs) # 获取预测结果 logits outputs.logits predicted_class_idx logits.argmax(-1).item() confidence torch.nn.functional.softmax(logits, dim1)[0][predicted_class_idx].item() return self.model.config.id2label[predicted_class_idx], confidence except Exception as e: print(f预测出错: {e}) return 识别失败, 0.0 def run_camera(self, camera_index0): 启动摄像头实时识别 cap cv2.VideoCapture(camera_index) if not cap.isOpened(): print(无法打开摄像头请检查连接) return print(摄像头已启动按 q 键退出) print(按 s 键保存当前帧图片) while True: # 读取摄像头帧 ret, frame cap.read() if not ret: print(无法获取视频帧) break # 创建显示副本 display_frame frame.copy() # 进行预测为了性能可以每N帧预测一次 label, confidence self.predict_image(frame) # 在画面上显示结果 result_text f{label} ({confidence:.2%}) cv2.putText(display_frame, result_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 显示帧率 cv2.putText(display_frame, 按 q 退出, (10, 70), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 2) # 显示画面 cv2.imshow(ViT实时物品识别, display_frame) # 键盘操作 key cv2.waitKey(1) 0xFF if key ord(q): # 按q退出 break elif key ord(s): # 按s保存图片 timestamp int(time.time()) cv2.imwrite(fcaptured_{timestamp}.jpg, frame) print(f图片已保存: captured_{timestamp}.jpg) # 释放资源 cap.release() cv2.destroyAllWindows() # 主程序 if __name__ __main__: # 初始化分类器 classifier ViTCameraClassifier(/root/模型路径) # 请替换为实际模型路径 # 启动摄像头识别 classifier.run_camera()2.2 优化版本添加帧 skipping 提高性能为了在普通硬件上获得更流畅的体验我们可以添加帧 skipping 机制# 在run_camera方法中添加帧 skipping def run_camera_optimized(self, camera_index0, skip_frames5): 优化版的摄像头识别通过跳帧提高性能 cap cv2.VideoCapture(camera_index) frame_count 0 while True: ret, frame cap.read() if not ret: break frame_count 1 # 每skip_frames帧进行一次预测 if frame_count % skip_frames 0: label, confidence self.predict_image(frame) # 显示逻辑保持不变 display_frame frame.copy() result_text f{label} ({confidence:.2%}) if frame_count % skip_frames 0 else 处理中... cv2.putText(display_frame, result_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow(ViT实时物品识别, display_frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()3. 完整使用教程3.1 快速开始摄像头识别确保环境准备就绪cd /root pip install opencv-python创建摄像头识别脚本nano /root/camera_inference.py将前面的代码粘贴进去保存退出修改模型路径 在代码中找到ViTCameraClassifier(/root/模型路径)将其中的路径替换为你的实际模型路径运行摄像头识别python /root/camera_inference.py3.2 使用技巧和注意事项摄像头选择默认使用摄像头0通常为内置摄像头如果有多个摄像头可以尝试不同的索引值0, 1, 2...性能优化建议# 如果识别速度慢可以增加跳帧数 classifier.run_camera(camera_index0) # 默认每帧都识别 classifier.run_camera_optimized(camera_index0, skip_frames10) # 每10帧识别一次常见问题解决摄像头无法打开# 尝试不同的摄像头索引 classifier.run_camera(0) # 第一个摄像头 classifier.run_camera(1) # 第二个摄像头识别速度慢增加skip_frames参数值降低摄像头分辨率在代码中添加cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)内存不足确保有足够的GPU内存如果使用GPU可以考虑降低处理频率或图像尺寸3.3 扩展功能批量处理和保存结果如果你想进一步扩展功能可以添加结果记录和批量处理def run_camera_with_logging(self, camera_index0, log_fileresults.log): 带日志记录的摄像头识别 cap cv2.VideoCapture(camera_index) frame_interval 30 # 每30帧记录一次结果 frame_count 0 with open(log_file, w, encodingutf-8) as f: f.write(时间戳,物品类别,置信度\n) while True: ret, frame cap.read() if not ret: break frame_count 1 if frame_count % frame_interval 0: label, confidence self.predict_image(frame) timestamp time.strftime(%Y-%m-%d %H:%M:%S) # 记录到文件 f.write(f{timestamp},{label},{confidence:.4f}\n) f.flush() # 立即写入文件 # 显示在画面上 display_frame frame.copy() result_text f{label} ({confidence:.2%}) cv2.putText(display_frame, result_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow(ViT实时物品识别, display_frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()4. 实际应用场景4.1 智能家居物品识别将摄像头部署在智能家居环境中可以实时识别家中物品# 家居物品监控示例 home_classifier ViTCameraClassifier(/root/模型路径) home_classifier.run_camera() # 监控客厅物品变化4.2 教育学习助手帮助学生识别日常物品特别是语言学习场景# 中英文物品识别教学 def teach_mode(self, camera_index0): 教学模式显示中文和英文标签 # 这里可以扩展显示中英文对照 # 需要有一个中英文标签映射表 pass4.3 零售商品识别用于小型零售店的商品识别和管理# 商品识别和库存管理 def retail_mode(self, camera_index0): 零售模式识别商品并更新库存 # 可以集成数据库操作 # 识别到商品后自动减少库存数量 pass5. 总结通过本教程我们成功将原本只能处理静态图片的ViT图像分类模型扩展为支持摄像头实时识别的强大工具。这个扩展不仅提升了模型的实用性还开辟了更多的应用场景。关键改进点实现了摄像头实时视频流处理添加了帧 skipping 机制优化性能提供了图形界面显示识别结果支持结果记录和保存功能使用建议对于性能较低的设备适当增加跳帧数根据实际应用场景调整识别频率可以考虑添加声音提示功能实现无障碍使用现在你可以让ViT模型睁开眼睛实时观察和理解周围的世界了。尝试对着摄像头展示不同的日常物品看看模型的识别效果如何获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。