在Colab Notebook运行人体检测代码时遇SystemExit:2错误求解决
解决Colab中人数检测代码的参数错误问题
错误原因
Colab的Jupyter内核会自动向脚本传递额外的-f参数(用于内核连接),而你的argparse解析器未处理该未知参数,因此抛出unrecognized arguments错误。
修复方案
1. 修改参数解析逻辑
将原有的parse_args()替换为parse_known_args(),该方法会忽略未定义的参数,仅保留你需要的配置项。
2. 完整可运行代码示例
以下是包含参数解析、HOG检测逻辑的完整代码,适配Colab环境:
import cv2 import argparse from google.colab.patches import cv2_imshow # Colab专用图像显示函数 def argsParser(): parser = argparse.ArgumentParser(description='人数检测工具') parser.add_argument('-v', '--video', help='视频文件路径') parser.add_argument('-i', '--image', help='图像文件路径') parser.add_argument('-c', '--camera', action='store_true', help='使用摄像头') parser.add_argument('-o', '--output', help='输出文件路径') return parser def humanDetector(args): HOGCV = cv2.HOGDescriptor() HOGCV.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) # 处理图像检测 if args.image: img = cv2.imread(args.image) if img is None: print("无法读取目标图像文件") return boxes, weights = HOGCV.detectMultiScale(img, winStride=(4,4), padding=(8,8), scale=1.05) for (x,y,w,h) in boxes: cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2) print(f"检测到人数: {len(boxes)}") cv2_imshow(img) if args.output: cv2.imwrite(args.output, img) # 处理视频检测 elif args.video: cap = cv2.VideoCapture(args.video) if not cap.isOpened(): print("无法打开目标视频文件") return while cap.isOpened(): ret, frame = cap.read() if not ret: break boxes, weights = HOGCV.detectMultiScale(frame, winStride=(4,4), padding=(8,8), scale=1.05) for (x,y,w,h) in boxes: cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2) cv2.putText(frame, f"人数: {len(boxes)}", (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2) cv2_imshow(frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() # 处理摄像头检测(Colab环境专属配置) elif args.camera: from IPython.display import display, Javascript from google.colab.output import eval_js from base64 import b64decode # 调用Colab摄像头捕获图像 def capture_camera_img(filename='temp_cam.jpg', quality=0.8): js = Javascript(''' async function takePhoto(quality) { const div = document.createElement('div'); const captureBtn = document.createElement('button'); captureBtn.textContent = '点击捕获画面'; div.appendChild(captureBtn); const video = document.createElement('video'); video.style.display = 'block'; const stream = await navigator.mediaDevices.getUserMedia({video: true}); document.body.appendChild(div); div.appendChild(video); video.srcObject = stream; await video.play(); google.colab.output.setIframeHeight(document.documentElement.scrollHeight, true); await new Promise((resolve) => captureBtn.onclick = resolve); const canvas = document.createElement('canvas'); canvas.width = video.videoWidth; canvas.height = video.videoHeight; canvas.getContext('2d').drawImage(video, 0, 0); stream.getVideoTracks()[0].stop(); div.remove(); return canvas.toDataURL('image/jpeg', quality); } ''') display(js) data = eval_js('takePhoto({})'.format(quality)) binary = b64decode(data.split(',')[1]) with open(filename, 'wb') as f: f.write(binary) # 对捕获的图像进行人数检测 img = cv2.imread(filename) boxes, weights = HOGCV.detectMultiScale(img, winStride=(4,4), padding=(8,8), scale=1.05) for (x,y,w,h) in boxes: cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2) print(f"检测到人数: {len(boxes)}") cv2_imshow(img) if args.output: cv2.imwrite(args.output, img) if __name__ == "__main__": parser = argsParser() args, _ = parser.parse_known_args() # 忽略内核传递的未知参数 humanDetector(args)
使用说明
- 图像检测:运行前将
-i参数指向已上传到Colab的图像路径,例如在代码中修改为args, _ = parser.parse_known_args(['-i', '/content/test.jpg'])。 - 视频检测:替换
-v后的路径为上传的视频文件路径,运行后逐帧显示检测结果。 - 摄像头检测:运行代码后会弹出捕获按钮,点击即可获取摄像头画面并完成检测。
内容的提问来源于stack exchange,提问作者Sowmya reddy
相关产品推荐
相关产品推荐

