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

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

摄像头视频图片文件检测

  • 视频文件
  • 图片文件
  • 效果如下
    • 视频与摄像头
    • 图片文件

视频文件

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

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运行检测:

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中,如果想要检测时就查看图片,可以将这段代码取消注释:

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

效果如下

视频与摄像头

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

图片文件

在这里插入图片描述
在这里插入图片描述
所有推理出的文件都会在代码同级的predict目录下,按q退出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968180.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Segformer模型的平台部署和项目应用

最近因为离职太忙了之前的很多内容没有更新,离开BYD进入新的环境中成长。 本文包含了Segformer的网络结构重构后如何部署到算法平台中方便标注训练推理的过程,以及如何应用到项目中(BYD最后一个项目:异物检测系统) C做…

react redux用法学习

参考资料: https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具:deepseek,通义灵码 第一天 安装相关依赖: 使用redux的中间件: npm i react-redu…

【2025 Unity Meta Quest MR 开发教程】透视 Passthrough 模块配置(戴上头显看见现实画面)

XR 开发者社区:https://www.spatialxr.tech/ 文章目录 📕导入透视模块📕OVRManager📕OVRPassthroughLayer 脚本📕相机 教程中使用的 SDK:Meta XR SDK v72(可以从 Unity 资源商店添加 Meta XR A…

UWB功耗大数据插桩调研

一、摘要 UWB功耗点 插桩点 日志关键字 电流 蓝牙持锁 BatteryStats的锁统计 vendor_bluetooth_lock 30~40mA 测距 UwbSessionManager.startRanging UwbSessionManager.stoptRanging 或接入fadiKey Uwb状态广播 "com.fadiui.dkservice.action.uwb.state.change&q…

旅游行业内容管理系统CMS提升网站建设效率与体验

内容概要 在如今快速发展的互联网时代,旅游行业对网站的要求越来越高,内容管理系统(CMS)的应用不可或缺。以 Baklib 为代表的先进CMS可显著提高旅游网站的建设效率与用户体验。为了满足不断变化的市场需求,这些系统通…

【vscode+latex】实现overleaf本地高效编译

overleaf本地高效编译 1. 配置本地latex环境2. vscode插件与配置3. 使用 之前觉得用overleaf在线写论文很方便,特别是有辅助生成latex格式公式的网页,不需要在word上一个一个手打调格式。 然而,最近在写一篇论文的时候,由于这篇论…

消费电子产品中的噪声对TPS54202的影响

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、概述 在白色家电领域,降压转换器的应用非常广泛,为了实现不同的功能就需要不同的电源轨。TPS542…

51c自动驾驶~合集49

我自己的原文哦~ https://blog.51cto.com/whaosoft/13164876 #Ultra-AV 轨迹预测新基准!清华开源:统一自动驾驶纵向轨迹数据集 自动驾驶车辆在交通运输领域展现出巨大潜力,而理解其纵向驾驶行为是实现安全高效自动驾驶的关键。现有的开…

IGBT的两级关断

IGBT(绝缘栅双极型晶体管)的两级关断(Two-stage turn-off)是一种优化关断过程的方法,主要用于减少关断时的电压过冲和dv/dt(电压变化率)过高的问题,特别是在大功率应用中&#xff08…

centos 7 关于引用stdatomic.h的问题

问题&#xff1a;/tmp/tmp4usxmdso/main.c:6:23: fatal error: stdatomic.h: No such file or directory #include <stdatomic.h> 解决步骤&#xff1a; 1.这个错误是因为缺少C编译器的标准原子操作头文件 stdatomic.h。在Linux系统中&#xff0c;我们需要安装开发工具…

20250211解决荣品的RK3566核心板在Android13下出现charge_extrem_low_power的问题

20250211解决荣品的RK3566核心板在Android13下出现charge_extrem_low_power的问题 2025/2/11 17:45 缘起&#xff1a;荣品的RK3566核心板在Android13下&#xff0c;出现charge_extrem_low_power之后就直接挂住了。 由于我司使用了CW2217这个电量计&#xff0c;没有使用核心板自…

动手学深度学习---深层神经网络

目录 一、神经网络1.1、模型训练1.2、损失函数1.2.1、分类&#xff1a;hinge loss/合页损失/支持向量机损失1.2.2、分类&#xff1a;交叉熵损失(softmax分类器)1.2.2.1 二分类交叉熵损失1.2.2.2 多分类交叉熵损失 1.2.3、回归&#xff1a;误差平方和&#xff08;SSE&#xff09…

(定时器,绘制事件,qt简单服务器的搭建)2025.2.11

作业 笔记&#xff08;复习补充&#xff09; 1> 制作一个闹钟软件 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> //按钮类 #include <QTimer> //定时器类 #include <QTime> //…

STM32_USART通用同步/异步收发器

目录 背景 程序 STM32浮空输入的概念 1.基本概念 2. STM32浮空输入的特点 3. STM32浮空输入的应用场景 STM32推挽输出详解 1. 基本概念 2. 工作原理 3. 应用场景 使能外设时钟 TXE 和 TC的区别 USART_IT_TXE USART_IT_TC 使能串口外设 中断处理函数 背景 单片…

大语言模型多代理协作(MACNET)

大语言模型多代理协作(MACNET) Scaling Large-Language-Model-based Multi-Agent Collaboration 提出多智能体协作网络(MACNET),以探究多智能体协作中增加智能体数量是否存在类似神经缩放定律的规律。研究发现了小世界协作现象和协作缩放定律,为LLM系统资源预测和优化…

安川伺服控制器MP系列优势特点及行业应用

在工业自动化领域&#xff0c;运动控制器的性能直接决定了设备的精度、效率和可靠性。作为全球领先的运动控制品牌&#xff0c;安川电机伺服控制器凭借其卓越的技术优势和广泛的应用场景&#xff0c;正在为智能制造注入强劲动力&#xff01; MP3100&#xff1a;主板型运动控制…

AIoT时代来临,物联网技术如何颠覆未来生活?

在这个万物互联的时代&#xff0c;“物联网”&#xff08;IoT&#xff09;正以前所未有的速度改变我们的生活&#xff0c;而“AIoT”则是在物联网基础上融入人工智能技术&#xff0c;赋予设备更高的智能和自主决策能力。随着5G、边缘计算和云技术的不断发展&#xff0c;物联网正…

2025.2.11

1> 制作一个闹钟软件 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QTime> #include <QTimer> #include <QTimeEdit> #include <QDa…

安装OpenJDK21(linux、macos)

文章目录 安装OpenJDK21java21linux下安装配置mac下安装 安装OpenJDK21 java21 封神&#xff01;Java 21正式发布了&#xff0c;迎来了史诗级新特性&#xff0c;堪称版本最强&#xff01;&#xff01;&#xff01; 视频链接&#xff1a;https://www.bilibili.com/video/BV1E8…

PortSwigger——WebSockets vulnerabilities

文章目录 一、WebSockets二、Lab: Manipulating WebSocket messages to exploit vulnerabilities三、Lab: Manipulating the WebSocket handshake to exploit vulnerabilities四、Using cross-site WebSockets to exploit vulnerabilities4.1 跨站WebSocket劫持&#xff08;cro…