YOLOv11实时目标检测 | 摄像头视频图片文件检测

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492,我们详细探讨了YOLO11的部署以及推理训练,但是评论区的观众老爷就说了:"博主博主,你这个只能推理只能推理图片,还要将图片放在文件夹下,有没有更简单方便的推理方法?" 有的兄弟,有的,像这样更简单的方法还有10086个,下面我挑一个用于流式视频文件检测。

摄像头视频图片文件检测

视频文件

对于视频或者摄像头等输入,可以将以下代码复制到predict_camera.py运行检测:

python 复制代码
from ultralytics import YOLO
import cv2
import torch
from pathlib import Path
import sys
import os
import tkinter as tk
from tkinter import filedialog

def choose_input_source():
    print("请选择输入来源:")
    print("[1] 摄像头")
    print("[2] 视频文件")
    choice = input("请输入数字 (1 或 2): ").strip()

    if choice == "1":
        return 0, "摄像头"
    elif choice == "2":
        #选择视频文件
        root = tk.Tk()
        root.withdraw()
        video_path = filedialog.askopenfilename(
            title="选择视频文件",
            filetypes=[("视频文件", "*.mp4;*.avi;*.mkv;*.mov"), ("所有文件", "*.*")]
        )
        if not video_path:
            print("未选择视频文件,程序退出")
            sys.exit(0)
        return video_path, video_path
    else:
        print("无效的输入,程序退出")
        sys.exit(1)

def detect_media():
    # ======================= 配置区 =======================
    # 模型配置
    model_config = {
        'model_path': r'E:\git-project\YOLOV11\ultralytics-main\weights\yolo11n.pt',  # 本地模型路径,注意配置!!!!!!!!!!!!!!!!!!!!!!!
        'download_url': 'https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.pt'  # 如果没有模型文件下载URL
    }
    
    # 推理参数
    predict_config = {
        'conf_thres': 0.25,     # 置信度阈值
        'iou_thres': 0.45,      # IoU阈值
        'imgsz': 640,           # 输入分辨率
        'line_width': 2,        # 检测框线宽
        'device': 'cuda:0' if torch.cuda.is_available() else 'cpu'  # 自动选择设备
    }
    # ====================== 配置结束 ======================

    try:
        # 选择输入来源
        input_source, source_desc = choose_input_source()

        # 初始化视频源
        cap = cv2.VideoCapture(input_source)
        if isinstance(input_source, int):
            # 如果使用摄像头,设置分辨率
            cap.set(cv2.CAP_PROP_FRAME_WIDTH, 720)
            cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
        if not cap.isOpened():
            raise IOError(f"无法打开视频源 ({source_desc}),请检查设备连接或文件路径。")

        # 询问是否保存推理出的视频文件
        save_video = False
        video_writer = None
        output_path = None
        answer = input("是否保存推理出的视频文件?(y/n): ").strip().lower()
        if answer == "y":
            save_video = True
            # 创建保存目录:代码文件所在目录下的 predict 文件夹
            save_dir = os.path.join(os.getcwd(), "predict")
            os.makedirs(save_dir, exist_ok=True)
            # 获取视频属性(宽度、高度、fps)
            frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
            frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
            fps = cap.get(cv2.CAP_PROP_FPS)
            if fps == 0 or fps is None:
                fps = 25  # 如果无法获取fps,设定默认值
            # 构造输出视频文件路径
            output_path = os.path.join(save_dir, "output_inference.mp4")
            fourcc = cv2.VideoWriter_fourcc(*"mp4v")
            video_writer = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
            print(f"推理视频将保存至: {output_path}")

        # 加载模型(带异常捕获)
        if not Path(model_config['model_path']).exists():
            if model_config['download_url']:
                print("开始下载模型...")
                YOLO(model_config['download_url']).download(model_config['model_path'])
            else:
                raise FileNotFoundError(f"模型文件不存在: {model_config['model_path']}")

        # 初始化模型
        model = YOLO(model_config['model_path']).to(predict_config['device'])
        print(f"✅ 模型加载成功 | 设备: {predict_config['device'].upper()}")
        print(f"输入来源: {source_desc}")

        # 实时检测循环
        while True:
            ret, frame = cap.read()
            if not ret:
                print("视频流结束或中断")
                break

            # 执行推理
            results = model.predict(
                source=frame,
                stream=True,  # 流式推理
                verbose=False,
                conf=predict_config['conf_thres'],
                iou=predict_config['iou_thres'],
                imgsz=predict_config['imgsz'],
                device=predict_config['device']
            )

            # 遍历生成器获取结果(取第一个结果)
            for result in results:
                annotated_frame = result.plot(line_width=predict_config['line_width'])
                break

            # 摄像头模式下显示FPS
            if isinstance(input_source, int):
                fps = cap.get(cv2.CAP_PROP_FPS)
                cv2.putText(annotated_frame, f'FPS: {fps:.2f}', (10, 30),
                            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

            # 显示实时画面
            cv2.imshow('YOLO Real-time Detection', annotated_frame)

            # 如保存视频,写入视频文件
            if save_video and video_writer is not None:
                video_writer.write(annotated_frame)

            # 按键退出q
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        # 释放资源
        cap.release()
        if video_writer is not None:
            video_writer.release()
        cv2.destroyAllWindows()
        print("✅ 检测结束")
        if save_video and output_path is not None:
            print(f"推理结果视频已保存至: {output_path}")

    except Exception as e:
        print(f"\n❌ 发生错误: {str(e)}")
        print("问题排查建议:")
        print("1. 检查视频源是否正确连接或文件路径是否正确")
        print("2. 确认模型文件路径正确")
        print("3. 检查CUDA是否可用(如需GPU加速)")
        print("4. 尝试降低分辨率设置")

if __name__ == "__main__":
    detect_media()

需要更改的参数:
1 .model_path:模型文件位置,默认使用的是yolo11n.pt
2 .predict_config下置信度等
3 .分辨率等

需要注意的是退出按q ,点击视频框的**×**是无法退出的,当然也可以使用Ctrl+C方式退出,退出不会造成摄像头不保存推理文件,文件保存在代码所在文件夹下predict文件夹内。

图片文件

对于图片文件,将图片放在picture文件夹下太麻烦,同样采用选择图片进行检测,同时可以框选多个图片,可以将以下代码复制到predict_images.py运行检测:

python 复制代码
from ultralytics import YOLO
import cv2
import torch
from pathlib import Path
import os
import tkinter as tk
from tkinter import filedialog

def choose_input_files():
    root = tk.Tk()
    root.withdraw()  # 隐藏主窗口
    image_paths = filedialog.askopenfilenames(
        title="选择图片文件",
        filetypes=[("图片文件", "*.jpg;*.jpeg;*.png;*.bmp;*.tiff;*.gif"), ("所有文件", "*.*")]
    )
    if not image_paths:
        print("未选择任何图片文件,程序退出")
        exit(0)
    return image_paths

def detect_images():
    # ======================= 配置区 =======================
    # 模型配置
    model_config = {
        'model_path': r'E:\git-project\YOLOV11\ultralytics-main\weights\yolo11n.pt',  # 本地模型路径
        'download_url': 'https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.pt'  # 如果没有模型文件可在此处添加下载URL
    }
    
    # 推理参数
    predict_config = {
        'conf_thres': 0.25,     # 置信度阈值
        'iou_thres': 0.45,      # IoU阈值
        'imgsz': 640,           # 输入分辨率
        'line_width': 2,        # 检测框线宽
        'device': 'cuda:0' if torch.cuda.is_available() else 'cpu'  # 自动选择设备
    }
    # ====================== 配置结束 ======================

    try:
        # 选择图片文件
        image_paths = choose_input_files()

        # 创建保存目录:代码文件所在目录下的 predict 文件夹
        save_dir = os.path.join(os.getcwd(), "predict", "exp")
        os.makedirs(save_dir, exist_ok=True)
        if os.path.exists(save_dir):
            i = 1
            while os.path.exists(f"{save_dir}{i}"):
                i += 1
            save_dir = f"{save_dir}{i}"
            os.makedirs(save_dir)

        # 加载模型(带异常捕获)
        if not Path(model_config['model_path']).exists():
            if model_config['download_url']:
                print("开始下载模型...")
                YOLO(model_config['download_url']).download(model_config['model_path'])
            else:
                raise FileNotFoundError(f"模型文件不存在: {model_config['model_path']}")

        # 初始化模型
        model = YOLO(model_config['model_path']).to(predict_config['device'])
        print(f"✅ 模型加载成功 | 设备: {predict_config['device'].upper()}")

        # 处理每个选定的图片文件
        for image_path in image_paths:
            print(f"正在处理图片: {image_path}")
            img = cv2.imread(image_path)

            if img is None:
                print(f"无法读取图片: {image_path}")
                continue

            # 执行推理
            results = model.predict(
                source=img,  # 输入图片
                stream=False,  # 禁用流模式
                verbose=False,
                conf=predict_config['conf_thres'],
                iou=predict_config['iou_thres'],
                imgsz=predict_config['imgsz'],
                device=predict_config['device']
            )

            # 解析并绘制结果(取第一个结果)
            for result in results:
                annotated_img = result.plot(line_width=predict_config['line_width'])
                break

            # 保存推理结果图像到文件
            output_image_path = os.path.join(save_dir, f"output_{os.path.basename(image_path)}")
            cv2.imwrite(output_image_path, annotated_img)
            print(f"推理结果已保存至: {output_image_path}")

            # 显示实时画面,取消下面注释就会边检测边弹出结果
            # cv2.imshow('YOLO Real-time Detection', annotated_img)

            # 等待按键退出当前图片查看
            if cv2.waitKey(0) & 0xFF == ord('q') :
                break

        cv2.destroyAllWindows()
        print("✅ 检测结束")

    except Exception as e:
        print(f"\n❌ 发生错误: {str(e)}")
        print("问题排查建议:")
        print("1. 检查图片文件路径是否正确")
        print("2. 确认模型文件路径正确")
        print("3. 检查CUDA是否可用(如需GPU加速)")
        print("4. 尝试降低分辨率设置")

if __name__ == "__main__":
    detect_images()

同样需要更改模型文件地址、置信度等,图片文件保存在代码文件夹的predict文件夹下exp中,如果想要检测时就查看图片,可以将这段代码取消注释:

python 复制代码
            # 显示实时画面
            cv2.imshow('YOLO Real-time Detection', annotated_img)

效果如下

视频与摄像头



图片文件


所有推理出的文件都会在代码同级的predict目录下,按q退出。

相关推荐
数智化管理手记8 小时前
手工统计指标误差大、效率低?指标管理系统如何告别人工算数痛点?
大数据·运维·数据库·人工智能·云计算
fthux12 小时前
RenoPit 能为普通业主做什么?看懂图纸、审查合同,提前发现装修坑
javascript·人工智能·ai·开源·github·chrome扩展·open source·edge扩展·firefox扩展
火山引擎开发者社区14 小时前
火山引擎混合云 veStack 智算平台 Day0 适配 Kimi K3
人工智能
RSABLOCKCHAIN14 小时前
AI Agents in LangGraph-2
人工智能·python
cd_9492172115 小时前
哪些AI工具适合生成游戏开发用的3D道具模型?从道具草稿到引擎测试的选择方法
人工智能·3d
FII工业富联科技服务15 小时前
工业设备运维如何Agentic化?拆解Factory Brain的设备运维架构
大数据·运维·人工智能·架构·制造
WA内核拾荒者15 小时前
WhatsApp 账号异常检测的自动化告警系统设计
数据库·python·自动化
糖果店的幽灵15 小时前
人已经用 WorkBuddy 找工作拿了面试,你还在一份份手工改简历
人工智能·面试·职场和发展·langgraph
qq295316 小时前
2026 财搭子决策模拟器:多智能体投研架构能力拆解
大数据·人工智能·架构
码流怪侠16 小时前
【GitHub】Bend:让 GPU 并行编程像写 Python 一样简单
python·github