You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:25:23