当前位置: 首页 > 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 移动光标到…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...