如何解决Google Colab中Detectron2调用webcam检测失效问题
Detectron2 摄像头推理启动失败解决方案
从运行命令的%run魔法命令、/content路径特征判断,问题核心是运行环境和摄像头调用逻辑不匹配,对应解决方法如下:
场景1:在Colab云端环境运行
Colab的运行载体是云端虚拟机,无法直接通过OpenCV接口访问本地电脑的摄像头,demo.py自带的--webcam参数默认读取虚拟机本地设备,加载完模型后会一直卡在帧读取步骤,对应日志里的0it [00:00, ?it/s]状态。
解决步骤:
- 不要直接使用原demo的
--webcam参数启动 - 首先在Notebook开头添加浏览器摄像头授权代码,通过JS接口获取本地摄像头的帧数据:
from IPython.display import display, Javascript from google.colab.output import eval_js from base64 import b64decode import cv2 import numpy as np def get_colab_cam_frame(): js = Javascript(''' async function getFrame(){ const stream = await navigator.mediaDevices.getUserMedia({video: true}); const video = document.createElement('video'); video.srcObject = stream; await video.play(); const canvas = document.createElement('canvas'); canvas.width = video.videoWidth; canvas.height = video.videoHeight; canvas.getContext('2d').drawImage(video, 0, 0); stream.getVideoTracks()[0].stop(); return canvas.toDataURL('image/jpeg', 0.8); } ''') display(js) img_b64 = eval_js('getFrame()') img_bin = b64decode(img_b64.split(',')[1]) nparr = np.frombuffer(img_bin, np.uint8) return cv2.imdecode(nparr, cv2.IMREAD_COLOR)
- 改写推理循环:逐帧调用上面的函数获取摄像头画面,送入训练好的Detectron2模型做分割推理,再把结果回显到Notebook输出单元即可。
场景2:在本地物理机运行
如果是本地环境运行出现卡帧问题,按以下顺序排查:
- 检查系统摄像头权限:Windows在「隐私设置-相机」中给运行脚本的终端/IDE开放摄像头权限;macOS在「系统设置-隐私与安全性-摄像头」中给对应程序授权;Linux执行
sudo usermod -aG video $USER将当前用户加入video用户组,重启后生效。 - 校验摄像头设备索引:demo.py默认调用索引为0的摄像头设备,如果设备有多个摄像头(自带+外接),找到demo.py中
cv2.VideoCapture(0)的代码,将0依次替换为1、2测试,直到能正常读取画面。 - 补全OpenCV依赖:Linux环境先执行
sudo apt install ffmpeg libv4l-dev安装视频编解码和摄像头驱动依赖,再重新安装opencv-python包。 - 先跑基础摄像头测试脚本确认硬件连通性,测试通过后再启动Detectron2 demo:
import cv2 cap = cv2.VideoCapture(0) assert cap.isOpened(), "摄像头连接失败" while True: ret, frame = cap.read() if not ret: break cv2.imshow("cam_test", frame) if cv2.waitKey(1) == ord('q'): break cap.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Leonardo AGNUSDEI
相关产品推荐
相关产品推荐

