yolov10 学习笔记
目录
推理代码,source可以是文件名,路径,
预测可视化:
预测可视化加nms
训练自己的数据集,
训练一段时间报错:dill库
解决方法:
推理代码,source可以是文件名,路径,
保存结果:
from ultralytics import YOLOv10# model = YOLOv10.from_pretrained('jameslahm/yolov10{n/s/m/b/l/x}')
# or
# wget https://github.com/THU-MIG/yolov10/releases/download/v1.1/yolov10{n/s/m/b/l/x}.pt
model = YOLOv10('yolov10s.pt')# model.val(data='coco.yaml', batch=256)source = 'http://images.cocodataset.org/val2017/000000039769.jpg'
source = 'F:\data\qijun\dao\pics_re_1'
model.predict(source=source, save=True)
预测可视化:
import cv2
import time
# import torch
from ultralytics import YOLOv10cv2.namedWindow('window', cv2.WINDOW_NORMAL)
cv2.resizeWindow('window', 640, 480)model = YOLOv10('yolov10s.pt')# 打开摄像头
cap = cv2.VideoCapture(0)# 检查摄像头是否打开
if not cap.isOpened():print("无法打开摄像头")exit()# 获取视频帧的宽度和高度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(width, height)# 计时器和FPS初始化
prev_time = 0
fps = 0while True:# 读取帧ret, frame = cap.read()if not ret:print("无法读取帧")break# 改变输入图像尺寸,加快推理速度# frame = cv2.resize(frame, (width // 4, height // 4))# frame = cv2.resize(frame,(128,128) )prev_time = time.time()# 将帧传递给模型进行预测,并明确指定使用CPUresults = model(frame, device='0')curr_time = time.time()# 获取预测结果并绘制在帧上for result in results:boxes = result.boxes.xyxy.cpu().numpy()confidences = result.boxes.conf.cpu().numpy()class_ids = result.boxes.cls.cpu().numpy().astype(int)for i in range(len(boxes)):box = boxes[i]x1, y1, x2, y2 = map(int, box[:4])confidence = confidences[i]class_id = class_ids[i]label = result.names[class_id]cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.putText(frame, f'{label} {confidence:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (36, 255, 12), 1)fps = (curr_time - prev_time)cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)cv2.imshow('window', frame)if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放摄像头并关闭窗口
cap.release()
cv2.destroyAllWindows()
预测可视化加nms
import cv2
import timeimport numpy as np
import torchfrom img_reader import ImgReader
# import torch
from ultralytics import YOLOv10# cv2.namedWindow('window', cv2.WINDOW_NORMAL)
# cv2.resizeWindow('window', 640, 480)# model = YOLOv10('yolov10s.pt')
model = YOLOv10('runs/train/exp2/weights/best.pt')# 计时器和FPS初始化
prev_time = 0
fps = 0f_type='img'
source = r'B:\project\qijun\data\dataSet-coins\images\train'# file_reader = ImgReader(source, f_type=f_type)f_type='cam'
source=0
f_type='mp4'
source = r"B:\project\qijun\data\test\shuiguo1.mp4"
file_reader = ImgReader(source, f_type=f_type)for img_i in range(file_reader.total_frames):img_o, img_index, img_file = file_reader.get_img()if max(img_o.shape[:2]) > 1500:x_scale = 1500 / max(img_o.shape[:2])img_o = cv2.resize(img_o, None, fx=x_scale, fy=x_scale, interpolation=cv2.INTER_AREA)img=img_oframe=img_o.copy()if img_file is not None:print(img_file)# 改变输入图像尺寸,加快推理速度# frame = cv2.resize(frame, (width // 4, height // 4))# frame = cv2.resize(frame,(128,128) )prev_time = time.time()# 将帧传递给模型进行预测,并明确指定使用CPUresults = model(frame, device='0')curr_time = time.time()# 获取预测结果并绘制在帧上for result in results:boxes = result.boxes.xyxy.cpu().numpy()confidences = result.boxes.conf.cpu().numpy()class_ids = result.boxes.cls.cpu().numpy().astype(int)for i in range(len(boxes)):box = boxes[i]x1, y1, x2, y2 = map(int, box[:4])confidence = confidences[i]class_id = class_ids[i]label = result.names[class_id]cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 3)# cv2.putText(img, f'{label} {confidence:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (36, 255, 12), 1)final_boxes = []final_confidences = []final_class_ids = []# 对每个类别单独进行NMSunique_classes = set(class_ids)for cls in unique_classes:cls_indices = (class_ids == cls)# 提取当前类别的boxes, confidencesboxes_cls = torch.tensor(boxes[cls_indices])confidences_cls = torch.tensor(confidences[cls_indices])# 对当前类别进行NMSkeep_indices = torch.ops.torchvision.nms(boxes_cls, confidences_cls, iou_threshold=0.5) # 设置你的IoU阈值num_filtered = len(boxes_cls) - len(keep_indices)if num_filtered>0:print(f"Class {cls}: {num_filtered} boxes filtered out by NMS")# 过滤当前类别的boxes, confidences, class_idsfinal_boxes.append(boxes_cls[keep_indices].numpy())final_confidences.append(confidences_cls[keep_indices].numpy())final_class_ids.append([cls] * len(keep_indices))# 合并所有类别的结果final_boxes = np.concatenate(final_boxes, axis=0)final_confidences = np.concatenate(final_confidences, axis=0)final_class_ids = np.concatenate(final_class_ids, axis=0)for i in range(len(final_boxes)):box = final_boxes[i]x1, y1, x2, y2 = map(int, box[:4])confidence = final_confidences[i]class_id = final_class_ids[i]label = result.names[class_id]cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.putText(img, f'{label} {confidence:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (36, 255, 12), 1)# for result in results:# boxes = result.boxes.xyxy.cpu().numpy()# confidences = result.boxes.conf.cpu().numpy()# class_ids = result.boxes.cls.cpu().numpy().astype(int)## for i in range(len(boxes)):# box = boxes[i]# x1, y1, x2, y2 = map(int, box[:4])# confidence = confidences[i]# class_id = class_ids[i]# label = result.names[class_id]# cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)# cv2.putText(img, f'{label} {confidence:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (36, 255, 12), 1)fps = (curr_time - prev_time)cv2.putText(img, f'{img_i} FPS: {fps:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)cv2.imshow('window', img)waitkey=0if f_type == 'cam':waitkey=2if cv2.waitKey(waitkey) & 0xFF == ord('q'):break
训练自己的数据集,
原版标签是txt格式
我下载了完整代码,自己修改数据集
https://download.csdn.net/download/qq_38408785/89356134
from ultralytics import YOLOv10if __name__ == '__main__':model = YOLOv10('ultralytics/cfg/models/v10/yolov10n.yaml')model.load('yolov10n.pt') # loading pretrain weightsmodel.train(data='data/NEU-DET.yaml',cache=False,imgsz=640,epochs=200,batch=16,close_mosaic=10,device='0',optimizer='SGD', # using SGDproject='runs/train',name='exp',)
训练一段时间报错:dill库
File "D:\ProgramData\miniconda3\envs\py310\lib\pickle.py", line 603, in saveself.save_reduce(obj=obj, *rv)File "D:\ProgramData\miniconda3\envs\py310\lib\pickle.py", line 717, in save_reducesave(state)File "D:\ProgramData\miniconda3\envs\py310\lib\site-packages\dill\_dill.py", line 388, in saveStockPickler.save(self, obj, save_persistent_id)File "D:\ProgramData\miniconda3\envs\py310\lib\pickle.py", line 560, in savef(self, obj) # Call unbound method with explicit selfFile "D:\ProgramData\miniconda3\envs\py310\lib\site-packages\dill\_dill.py", line 1186, in save_module_dictStockPickler.save_dict(pickler, obj)File "D:\ProgramData\miniconda3\envs\py310\lib\pickle.py", line 972, in save_dictself._batch_setitems(obj.items())File "D:\ProgramData\miniconda3\envs\py310\lib\pickle.py", line 997, in _batch_setitemssave(k)File "D:\ProgramData\miniconda3\envs\py310\lib\site-packages\dill\_dill.py", line 388, in saveStockPickler.save(self, obj, save_persistent_id)File "D:\ProgramData\miniconda3\envs\py310\lib\pickle.py", line 539, in savepid = self.persistent_id(obj)File "D:\ProgramData\miniconda3\envs\py310\lib\site-packages\torch\serialization.py", line 622, in persistent_idstorage_type = normalize_storage_type(type(obj))File "D:\ProgramData\miniconda3\envs\py310\lib\site-packages\torch\serialization.py", line 226, in normalize_storage_typereturn getattr(torch, storage_type.__name__)
AttributeError: module 'torch' has no attribute 'str'
解决方法:
pip install dill -U
升级为dill-0.3.8 后报错没有了。
相关文章:
yolov10 学习笔记
目录 推理代码,source可以是文件名,路径, 预测可视化: 预测可视化加nms 训练自己的数据集, 训练一段时间报错:dill库 解决方法: 推理代码,source可以是文件名,路径…...
NAT概述
NAT概念 NAT(Network Address Translation,网络地址转换)是一种用于修改网络地址信息的技术,主要用于在路由器或防火墙上进行地址转换,以解决 IPv4 地址短缺问题、提高网络安全性以及实现私有网络与公有网络之间的通信…...

Ansys Mechanical|学习方法
Ansys Mechanical是Ansys的旗舰产品之一,涉及的学科体系全面丰富,包括的力学分支主要有理论力学,振动理论,连续介质力学,固态力学,物理力学,爆炸力学及应用力学等。 在自媒体及数字经济飞速发展…...

热门开源项目ChatTTS: 国内语音技术突破,实现弯道超车
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

环形链表2证明
解法 快慢指针相遇后,其中一个指回头部,然后同步前进 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNod…...

fetch_lfw_people()报错urllib.error.HTTPError: HTTP Error 403: Forbidden的解决方案
零、实验报告地址 计算机视觉实验二:基于支持向量机和随机森林的分类(Part one: 编程实现基于支持向量机的人脸识别分类 )-CSDN博客 一、代码报错 fetch_lfw_people()报错urllib.error.HTTPError: HTTP Error 403: Forbidden 二、报错原因 通常是由于访问权限不足导致的…...
Verilog-Behavior Level 和 RTL Level 和 GATE Level的区别
硬件设计中对硬件的描述可以具有不同的抽象级别,以Verilog为例: Behavior Level。描述的是硬件的行为,当我们在看到如下关键字时就是行为级别的代码:#,wait,while,force,release等&…...
华为OD机考题HJ1 字符串最后一个单词的长度
前言 描述 计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾) 输入描述: 输入一行,代表要计算的字符串,非空,长度小…...

C语言---------深入理解指针
目录 一、字符指针 二、指针数组: 三、数组指针: 1、定义: 2、&数组名和数组名区别: 3、数组指针的使用: 四、数组参数,指针参数: 1、一维数组传参: 2、二维数组传参&am…...

C++ 算法教程
归并排序 #include<iostream> using namespace std; template <class T> void Merge(T data[],int start,int mid,int end) {int len1 mid - start 1, len2 end - mid;int i, j, k;T* left new int[len1];T* right new int[len2];for (i 0; i < len1; i)…...

【支持向量机】问题梳理
学完支持向量机后我有些地方不太清楚,故做如下梳理: 1.为什么支持向量机模型认为一个点划分正确的标志是y(wxb)>1呢,为什么不是y(wxb)>0,比如y为1,wxb为0.5,大于0,则预测正确。 2.所以意思…...

车载网络安全指南 网络安全框架(二)
返回总目录->返回总目录<- 目录 一、概述 二、网络安全组织管理 三、网络安全活动 四、支撑保障 一、概述 汽车电子系统网络安全活动框架包含汽车电子系统网络安全活动、组织管理以及支持保障。其中,网络安全管理活动是框架的核心,主要指汽车电子系统生命周期各阶段…...

元数据、数据元、数据字典、数据模型及元模型的区别详解
在数据管理和分析领域,有许多相似的概念,如元数据、数据元、数据字典、数据模型和元模型。这些概念的定义和应用往往容易混淆。 数据元 数据元是通过一系列属性描述的数据单元,包括定义、标识、表示以及允许值等。这些属性帮助我们理解和使用…...

【百度智能体】零代码创建职场高情商话术助手智能体
一、前言 作为一个程序猿,工科男思维,走上职场后,总会觉得自己不会处理人际关系,容易背锅说错话,这时候如果有个助手能够时时刻刻提醒自己该如何说话如何做事情就好了。 而我们现在可以通过百度文心智能体平台构建各…...

实战项目: 负载均衡
0. 前言 这个项目使用了前后端,实现一个丐版的LeetCode刷题网站,并根据每台主机的实际情况,选择对应的主机,负载均衡的调度 0.1 所用技术与开发环境 所用技术: C STL 标准库 Boost 准标准库 ( 字符串切割 ) cpp- httplib 第三方开源网络库 ctemplate 第三方开源前端网…...
运维监控系统
做监控系统集成,持续更新ing 1.Prometheus k8s安装prometheusdocker部署prometheusthanos实现prometheus高可用部署 2.Grafana docker安装grafanagrafana的admin密码忘记了grafana使用mysql远程存储 3.Alertmanager 4.Consul 5.夜莺系统 6.时序数据库 6.1 …...

第3章 Unity 3D着色器系统
3.1 从一个外观着色器程序谈起 新建名为basic_diffuse.shader的文件,被一个名为basic_diffuse.mat的材质文件所引用,而basic_diffuse.mat文件则被场景中名为Sphere的game object的MeshRenderer组件所使用。 basic_diffuse.shader代码文件的内容如下所示…...

Qt项目天气预报(1) - ui界面搭建
ui中部 效果演示 ui效果 显示效果 控件列表 配合右图查看 居中对齐-label 设置label居中对齐(别傻傻的空格对齐了) 间距配置 widget03 外围的widget对象: 包含label 和 widget0301,如下图 widget0301 内围的widget对象,如下图 样式表 widget03 …...
一、从C语言到C++(一)
一、从C语言到C(一) C介绍C语言和C的联系C介绍 头文件命名空间定义命名空间使用命名空间中的名称使用using声明或指令命名空间与C语言的对比给命名空间起别名注意事项std 标准输入输出std::endl使用std::cout进行输出使用std::cin进行输入格式化输出 C介…...

MySQL(5)
聚合函数 GROUP BY 的使用 需求:查询各个部门的平均工资,最高工资SELECT department_id,AVG(salary),SUM(salary)FROM employeesGROUP BY department_id;需求:查询各个job_id的平均工资SELECT job_id,AVG(salary)FROM employeesGROUP BY jo…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...