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

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的部署以及推理训练,但是评论区的观众老爷就说了:“博主博主,你这个只能推理…...

Node.js学习指南

一、模块化规范 nodejs使用的模块化规范 叫做 common.js 规范: 每一个模块都有独立的作用域 代码在各自模块中执行 不会造成全局污染 每一个模块都是一个独立的文件(module对象) 模块可以被多次加载(module.exports 属性) 但是仅…...

2.5学习总结

今天看了二叉树&#xff0c;看的一脸懵&#xff0c;写了两道题 P4913&#xff1a;二叉树深度 #include <stdio.h> #include <stdlib.h> struct hly {int left;int right; }tree[1000005]; int hulingyun(int x) {if(x0)return 0;return 1max(hulingyun(tree[x].le…...

java进阶文章链接

java 泛型&#xff1a;java 泛型详解-绝对是对泛型方法讲解最详细的&#xff0c;没有之一 Java 泛型&#xff0c;你了解类型擦除吗&#xff1f; java 注解&#xff1a;深入理解Java注解类型 秒懂&#xff0c;Java 注解 &#xff08;Annotation&#xff09;你可以这样学 jav…...

vue2+vue3 HMCXY基础入门

vue2vue3 HMCXY基础入门 一、Vue2.x技术精讲1.Vue快速上手&#xff08;1&#xff09;Vue概念&#xff08;2&#xff09;创建实例&#xff08;3&#xff09;插值表达式&#xff08;4&#xff09;响应式特性&#xff08;5&#xff09;开发者工具 2.Vue指令二、Vue3.x技术精讲 一、…...

一次线程数超限导致的hive写入hbase作业失败分析

1.集群配置 操作系统:SuSe操作系统 集群节点:100台相同配置的服务器 单台:核心112Core,内存396G 2.问题现象 现象1:跑单个入库任务报错,批量提交任务后出现OOM异常 执行12个hivesql,将数据写入hbase.hbase入库有近一半的任务报错。 每次报错的任务不是同一个,hivesql…...

ip属地是手机号还是手机位置?一文理清

在数字化和网络化的今天&#xff0c;IP属地这一概念逐渐成为了人们关注的焦点。特别是在社交媒体和在线平台上&#xff0c;IP属地的显示往往让人联想到用户的地理位置。然而&#xff0c;关于IP属地到底与手机号还是手机位置有关&#xff0c;却存在着不少误解和混淆。本文将深入…...

查看设备uuid

在大多数操作系统中&#xff0c;可以通过不同的方式来查看设备的 UUID&#xff08;Universally Unique Identifier&#xff09;。以下是一些常见的方法&#xff1a; 在Linux系统中&#xff0c;可以使用命令行工具blkid或lsblk来查看设备的 UUID。例如&#xff0c;执行以下命令…...

C_C++输入输出(下)

C_C输入输出&#xff08;下&#xff09; 用两次循环的问题&#xff1a; 1.一次循环决定打印几行&#xff0c;一次循环决定打印几项 cin是>> cout是<< 字典序是根据字符在字母表中的顺序来比较和排列字符串的&#xff08;字典序的大小就是字符串的大小&#xff09;…...

All in one 的 AI tool Chain “Halomate”

这不算广告啊&#xff0c;就是真好用&#xff0c;虽然是我哥们儿的产品 比如你定了个gpt的plus 订阅&#xff0c;你发现好像有挺多功能 1- chat&#xff0c;这个自不必说&#xff0c;必须的功能 2- 高级语音 现在变成学英语的了&#xff0c;实时视频也就是我过年给姑婶介绍是…...

crewai框架第三方API使用官方RAG工具(pdf,csv,json)

最近在研究调用官方的工具&#xff0c;但官方文档的说明是在是太少了&#xff0c;后来在一个视频里看到了如何配置&#xff0c;记录一下 以PDF RAG Search工具举例&#xff0c;官方文档对于自定义模型的说明如下&#xff1a; 默认情况下&#xff0c;该工具使用 OpenAI 进行嵌…...

脉冲信号傅里叶变换与频域分析:从计算到理解

摘要 本文聚焦于脉冲信号的傅里叶变换&#xff0c;详细推导了矩形脉冲信号和单边指数信号的傅里叶变换过程&#xff0c;深入解释了傅里叶变换结果 F ( ω ) F(\omega) F(ω) 的内涵&#xff0c;包括其定义、物理意义、包含的信息以及在实际应用中的重要性。旨在帮助读者全面掌…...

6.【BUUCTF】[SUCTF 2019]CheckIn

打开题目页面如下 看样子是一道有关文件上传的题 上传一句话木马 显示&#xff1a;非法后缀&#xff01; 看来.php后缀被过滤了 上传一张带有木马的照片 在文件地址处输入cmd 输入以下代码执行 copy 1.jpg/b4.php/a 5.jpg 最后一行有一句话木马 上传带有木马的图片 但其实…...

基于springboot的体质测试数据分析及可视化设计

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…...

孟加拉国_行政边界省市边界arcgis数据shp格式wgs84坐标

这篇内容将深入探讨孟加拉国的行政边界省市边界数据&#xff0c;该数据是以arcgis的shp格式提供的&#xff0c;并采用WGS84坐标系统。ArcGIS是一款广泛应用于地理信息系统&#xff08;GIS&#xff09;的专业软件&#xff0c;它允许用户处理、分析和展示地理空间数据。在GIS领域…...

可视化相机pose colmap形式的相机内参外参

目录 内参外参转换 可视化相机pose colmap形式的相机内参外参 内参外参转换 def visualize_cameras(cameras, images):fig plt.figure()ax fig.add_subplot(111, projection3d)for image_id, image_data in images.items():qvec image_data[qvec]tvec image_data[tvec]#…...

数据结构 树2

文章目录 前言 一&#xff0c;二叉搜索树的高度 二&#xff0c;广度优先VS深度优先 三&#xff0c;广度优先的代码实现 四&#xff0c;深度优先代码实现 五&#xff0c;判断是否为二叉搜索树 六&#xff0c;删除一个节点 七&#xff0c;二叉收索树的中序后续节点 总结 …...

GB/T 44721-2024 与 L3 自动驾驶:自动驾驶新时代的基石与指引

1.前言 在智能网联汽车飞速发展的当下&#xff0c;自动驾驶技术成为了行业变革的核心驱动力。从最初的辅助驾驶功能&#xff0c;到如今不断迈向高度自动化的征程&#xff0c;每一步都凝聚着技术的创新与突破。而在这一进程中&#xff0c;标准的制定与完善对于自动驾驶技术的规…...

AURIX TC275学习笔记3 官方例程 (UART LED WDT)

文章目录 参考资料1. ASCLIN_UART_12. GPIO_LED_Button_13. WDT (Watch Dog Timer) 参考资料 AURIX TC275学习笔记1 资料收集Getting Started with AURIX™ Development Studio 官方帮助文档happy hacking for TC275! 硬件平台使用AURIX™ TC275 Lite 套件&#xff0c;按照参…...

Vim的基础命令

移动光标 H(左) J(上) K(下) L(右) $ 表示移动到光标所在行的行尾&#xff0c; ^ 表示移动到光标所在行的行首的第一个非空白字符。 0 表示移动到光标所在行的行首。 W 光标向前跳转一个单词 w光标向前跳转一个单词 B光标向后跳转一个单词 b光标向后跳转一个单词 G 移动光标到…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...