当前位置: 首页 > article >正文

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 filedialogdef 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_pathelse: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 = Falsevideo_writer = Noneoutput_path = Noneanswer = 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# 摄像头模式下显示FPSif 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)# 按键退出qif 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 filedialogdef 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_pathsdef 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 = 1while os.path.exists(f"{save_dir}{i}"):i += 1save_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') :breakcv2.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退出。

相关文章:

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

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492,我们详细探讨了YOLO11的部署以及推理训练,但是评论区的观众老爷就说了:“博主博主,你这个只能推理…...

PyQt6/PySide6 的 QPushButton 类

QPushButton 是 PyQt6 或 PySide6 库中用于创建按钮控件的类。按钮是用户界面中最常用的控件之一,用于触发特定的动作或事件。QPushButton 提供了丰富的功能和灵活性,使得开发者可以轻松地创建各种类型的按钮。下面我将详细介绍 QPushButton 的主要特性及…...

libdrm移植到arm设备

一、环境资源要求 下载libdrm Index of /libdrm 这边使用的是2.4.114版本,版本太高对meson版本要求也很高,为了省事用apt安装meson就不用太高版本了,1.x版本虽然使用makefile编译方便但是太老,对应用支持不太好。 https://dri…...

自定义序列化数据类型

目录 1. WritableComparable1.1 Writable1.2 Comparable1.3 IntWritable 2. 自定义序列化数据类型RectangleWritable3. 矩形面积计算3.1 Map3.2 Reduce 4. 代码和结果4.1 pom.xml中依赖配置4.2 工具类util4.3 矩形面积计算4.4 结果 参考 本文引用的Apache Hadoop源代码基于Apac…...

【Linux网络编程】:URL(encode),HTTP协议,telnet工具

🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 ​ Linux网络编程笔记: https://mp.csdn…...

C语言基础系列【3】VSCode使用

前面我们提到过VSCode有多么的好用,本文主要介绍如何使用VSCode编译运行C语言代码。 安装 首先去官网(https://code.visualstudio.com/)下载安装包,点击Download for Windows 获取安装包后,一路点击Next就可以。 配…...

学前端框架之前,你需要先理解 MVC

MVC 软件架构设计模式鼎鼎大名,相信你已经听说过了,但你确定自己已经完全理解到 MVC 的精髓了吗? 如果你是新同学,没听过 MVC,那可以到网上搜一些文章来看看,不过你要有心理准备,那些文章大多都…...

Mysql:数据库

Mysql 一、数据库概念?二、MySQL架构三、SQL语句分类四、数据库操作4.1 数据库创建4.2 数据库字符集和校验规则4.3 数据库修改4.4 数据库删除4.4 数据库备份和恢复其他 五、表操作5.1 创建表5.2 修改表5.3 删除表 六、表的增删改查6.1 Create(创建):数据新增1&#…...

python的函数介绍

一.定义和调用函数 1.定义函数 在 Python 中,使用 def 关键字来定义一个函数。函数可以包含参数,也可以包含返回值 基本语法 def function_name(parameters):"""docstring"""# Function bodyreturn resultdef greet(n…...

要完成使用MLflow比较模型运行、选择模型并将其部署到REST API的教程

要完成使用MLflow比较模型运行、选择模型并将其部署到REST API的教程,请按照以下有序步骤操作: 设置环境 导出MLflow跟踪URI:设置环境变量以指向您的MLflow跟踪服务。export MLFLOW_TRACKING_URIyour-organizations-MLflow-server-url 加载数…...

Windows Docker笔记-简介摘录

Docker是一个开源的容器化平台,可以帮助开发人员将应用程序与其依赖项打包在一个独立的容器中,然后在任何安装的Docker的环境中快速、可靠地运行。 几个基本概念和优势: 容器:容器是一个轻量级、独立的运行环境,包含了…...

MVC 文件夹:架构之美与实际应用

MVC 文件夹:架构之美与实际应用 引言 MVC(Model-View-Controller)是一种设计模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种架构模式不仅提高了代码的可维护性和可扩展性,而且使得开发流程更加清晰。本文将深入探讨MVC文…...

AI透明化与全球政治格局的发展:如何避免AI被人为操控

在现代社会,人工智能(AI)已经逐渐渗透到我们的日常生活中,尤其是在社交平台和信息传播领域。虽然AI可以极大地推动社会发展,但也潜藏着被恶意操控的风险。最令人担忧的是,某些势力可能通过操控AI来操控公众…...

ubuntu 网络管理--wpa_supplicant、udhcpc

ubuntu 网络管理--wpa_supplicant 1 介绍wpa_supplicant 无线认证wpa_passphrase 配置工具 NetworkManager 网络管理udhcpc 与 dhclient对比dhclient概述主要功能 udhcpc概述主要功能 2 联系依赖关系配置文件 3 区别4 如何选择5 示例使用 wpa_supplicant 手动连接无线网络使用 …...

熟练掌握Http协议

目录 基本概念请求数据Get请求方式和Post请求方式 响应数据响应状态码 基本概念 Http协议全称超文本传输协议(HyperText Transfer Protocol),是网络通信中应用层的协议,规定了浏览器和web服务器数据传输的格式和规则 Http应用层协议具有以下特点&#…...

C++的 I/O 流

本文把复杂的基类和派生类的作用和关系捋出来,具体的接口请参考相关文档 C的 I/O 流相关的类,继承关系如下图所示 https://zh.cppreference.com/w/cpp/io I / O 的概念:内存和外设进行数据交互称为 I / O ,例如:把数…...

寒假刷题Day22

一、2570. 合并两个二维数组 - 求和法 class Solution { public:vector<vector<int>> mergeArrays(vector<vector<int>>& nums1, vector<vector<int>>& nums2) {int i 0, j 0, n1 nums1.size(), n2 nums2.size();int tmp 0;…...

【PDF多区域识别】如何批量PDF指定多个区域识别改名,基于Windows自带的UWP的文字识别实现方案

海关在对进口货物进行查验时,需要核对报关单上的各项信息。对报关单 PDF 批量指定区域识别改名后,海关工作人员可以更高效地从文件名中获取关键信息,如货物来源地、申报价值等。例如文件名 “[原产国]_[申报价值].pdf”,有助于海关快速筛选重点查验对象,提高查验效率和监管…...

【大数据技术】本机PyCharm远程连接虚拟机Python

本机PyCharm远程连接虚拟机Python 注意:本文需要使用PyCharm专业版。 pycharm-professional-2024.1.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本地PyCharm远程连接虚拟机,运行Python脚本,提高编程效率。 注意: …...

Windows图形界面(GUI)-QT-C/C++ - Qt Combo Box

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 1.1 基本概念 1.2 应用场景对比 二、核心属性详解 2.1 行为控制 2.2 显示配置 三、数据操作与访问 3.1 基础数据管理 3.2 高级数据访问 四、用户交互处理 4.1 信号处…...

数字化转型:概念性名词浅谈(第四讲)

​大家好&#xff0c;本篇文章是在新年之际写的&#xff0c;所以在这里先给大家拜个年。 今天要介绍的名词为ETL: ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transfor…...

标题:市场波动中的价格趋势分析与策略优化

在市场投资中&#xff0c;价格的波动不仅是常态&#xff0c;更是影响投资决策的关键因素。市场价格的变化受多种因素影响&#xff0c;包括供需关系、政策调整、国际市场动态等。如何理解价格走势&#xff0c;并在其中寻找合适的交易机会&#xff0c;是投资者需要长期研究的课题…...

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)

目录 1 -> List 1.1 -> 创建List组件 1.2 -> 添加滚动条 1.3 -> 添加侧边索引栏 1.4 -> 实现列表折叠和展开 1.5 -> 场景示例 2 -> dialog 2.1 -> 创建Dialog组件 2.2 -> 设置弹窗响应 2.3 -> 场景示例 3 -> form 3.1 -> 创建…...

Linux:文件系统(软硬链接)

目录 inode ext2文件系统 Block Group 超级块&#xff08;Super Block&#xff09; GDT&#xff08;Group Descriptor Table&#xff09; 块位图&#xff08;Block Bitmap&#xff09; inode位图&#xff08;Inode Bitmap&#xff09; i节点表&#xff08;inode Tabl…...

深度学习系列--01.入门

一.深度学习概念 深度学习&#xff08;Deep Learning&#xff09;是机器学习的分支&#xff0c;是指使用多层的神经网络进行机器学习的一种手法抖音百科。它学习样本数据的内在规律和表示层次&#xff0c;最终目标是让机器能够像人一样具有分析学习能力&#xff0c;能够识别文字…...

如何抓取酒店列表: 揭开秘密

搜索酒店列表是一种强大的工具&#xff0c;可以从各种在线资源中收集有关住宿、价格和可用性的综合数据。无论您是要比较价格、分析市场趋势&#xff0c;还是要创建个性化的旅行计划&#xff0c;搜索都能让您有效地汇编所需的信息。在本文中&#xff0c;我们将介绍如何搜索酒店…...

深度剖析 C++17 中的 std::byte:解锁字节级编程新境界

文章目录 一、引入背景二、基本定义三、特性详解不可隐式转换为整型显式转换为unsigned char位运算支持字面量支持四、使用场景内存操作数据序列化与反序列化网络通信文件读写操作五、与其他数据类型的交互与字符类型的交互与整数类型的交互与指针类型的交互六、注意事项避免混…...

【多线程】线程池核心数到底如何配置?

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 前置回顾2. 动态线程池2.1 JMX 的介绍2.1.1 MBeans 介绍 2.2 使用 JMX jconsole 实现动态修改线程池2.2.…...

三维空间全局光照 | 及各种扫盲

Lecture 6 SH for diffuse transport Lecture 7关于 SH for glossy transport 三维空间全局光照 diffuse case和glossy case的区别 在Lambertian模型中&#xff0c;BRDF是一个常数 diffuse case 跟outgoing point无关 glossy case 跟outgoing point有关 &#xff08;Gloss…...

通过C/C++编程语言实现“数据结构”课程中的链表

引言 链表(Linked List)是数据结构中最基础且最重要的线性存储结构之一。与数组的连续内存分配不同,链表通过指针将分散的内存块串联起来,具有动态扩展和高效插入/删除的特性。本文将以C/C++语言为例,从底层原理到代码实现,手把手教你构建完整的链表结构,并深入探讨其应…...