首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >YOLOv10的改进、部署和微调训练总结

YOLOv10的改进、部署和微调训练总结

作者头像
deephub
发布于 2024-06-03 11:37:37
发布于 2024-06-03 11:37:37
2.3K04
代码可运行
举报
文章被收录于专栏:DeepHub IMBADeepHub IMBA
运行总次数:4
代码可运行

YOLO模型因其在计算成本和检测性能之间的平衡而在实时目标检测中很受欢迎。前几天YOLOv10也刚刚发布了。我们这篇文章就来看看YOLOv10有哪些改进,如何部署,以及微调。

YOLOv10通过无nms的训练解决了延迟问题,作者为无nms训练引入了一致的双任务,同时获得了具有竞争力的性能和低推理延迟。他们还提出了一种整体的效率-精度驱动模型设计策略,从效率和精度两个角度对各种YOLO组件进行优化。这减少了计算开销并提高了性能。

通过以上一些列的优化YOLOv10具有最先进的性能和效率。例如,YOLOv10-S比RT-DETR-R18快1.8倍,精度相似但参数和FLOPs更少。与YOLOv9-C相比,在相同性能下,YOLOv10-B的延迟减少了46%,参数减少了25%。

方法

Consistent Dual Assignments

YOLO模型通常使用任务对齐学习(Task Alignment Learning, TAL)进行训练,这涉及到为每个实例分配多个正样本,增强优化和性能。但是这种方法需要进行非最大抑制(NMS)后处理,降低了推理效率。虽然一对一匹配避免了NMS,但它并不能得到最佳的性能。

送一作者介绍了一种使用双标签分配和一致匹配度量的无nms训练策略。

在训练过程中,一对一头部与传统的一对多头部合并,两者共享相同的优化目标,但使用不同的匹配策略。一对多头部提供了丰富的监控信号,而一对一头部在推理过程中确保了高效,无nms的预测。在推理时只使用一对一的头部,避免额外的成本。

为了协调训练过程,使用了一致的匹配度量。该度量使用平衡语义预测和位置回归任务的统一方法,评估一对多和一对一分配的预测和实例之间的一致性。通过调整来自两个头部的监督,模型可以确保一个头部的最佳样本也是另一个头部的最佳样本,从而一致地优化两者。这种方法显著改善了一对一匹配对与一对多匹配的顶级结果的一致性。

精度驱动的模型设计

由于YOLO模型本身的结构,其计算冗余和能力有限,在平衡效率和准确性方面面临挑战。所以作者提出了全面的模型设计来解决这些问题,同时注重效率和准确性。

效率驱动型模型设计:

  • 通过使用深度可分离卷积的简化架构来减少计算开销。
  • 分离空间减少和信道增加减少计算成本并保留信息。
  • 使用内在秩分析来识别和减少模型阶段的冗余,用更有效的结构代替复杂的块。

精度驱动的模型设计:

  • 通过增加深度阶段的接受场来增强模型能力,有选择地使用大核深度卷积来避免浅阶段的开销。
  • 通过PSA划分特征并将自注意力应用于部分特征,结合有效的自注意力,降低计算复杂性和内存使用,同时增强全局表示学习。

实验结果

与基线YOLOv8模型相比,YOLOv10在AP方面表现出显著的改善,N型增加1.2%,S型增加1.4%,M型增加0.5%,L型增加0.3%,X型增加0.5%。此外,YOLOv10显著降低了延迟,从37%到70%不等。

部署和使用示例

我们将从安装所需的库开始。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 # Clone ultralytics repo
 git clone https://github.com/ultralytics/ultralytics
 
 # cd to local directory
 cd ultralytics
 
 # Install dependencies
 pip install -r requirements.txt

1、使用YOLOv10进行目标检测

目标检测是计算机视觉中的一项基本任务。YOLOv10通过在推理期间消除非最大抑制(NMS)的需要来增强这一点,从而降低延迟并提高性能。

我们先载入模型和需要处理的视频

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import cv2
 import numpy as np
 from ultralytics import YOLO
 
 # Load YOLOv10 model
 model = YOLO('yolov10.pt')
 
 # Path to the video file
 video_path = 'path/to/your/deephub.mp4'
 cap = cv2.VideoCapture(video_path)

然后就可以处理视频帧

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 while cap.isOpened():
     ret, frame = cap.read()
     if not ret:
         break
 
     # Perform object detection
     results = model(frame)
 
     # Draw bounding boxes
     for result in results:
         boxes = result['boxes']
         for box in boxes:
             x1, y1, x2, y2 = box['coords']
             label = box['label']
             confidence = box['confidence']
             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, (0, 255, 0), 2)
 
     # Display the frame
     cv2.imshow('YOLOv10 Object Detection', frame)
     if cv2.waitKey(1) & 0xFF == ord('q'):
         break
 
 cap.release()
 cv2.destroyAllWindows()

结果如下:

2、使用YOLOv10进行区域计数

区域计数可以对指定区域内的对象进行计数,这个例子演示了如何使用YOLOv10对定义区域中的对象进行计数。

定义区域和设置模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 from shapely.geometry import Polygon, Point
 
 # Define counting regions
 counting_regions = [
     {
         "name": "Region 1",
         "polygon": Polygon([(50, 80), (250, 20), (450, 80), (400, 350), (100, 350)]),
         "counts": 0,
         "color": (255, 0, 0)
     },
     {
         "name": "Region 2",
         "polygon": Polygon([(200, 250), (440, 250), (440, 550), (200, 550)]),
         "counts": 0,
         "color": (0, 255, 0)
     },
 ]
 
 model = YOLO('yolov10.pt')

处理视频和计数区域中的对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 cap = cv2.VideoCapture('path/to/your/deephub.mp4')
 while cap.isOpened():
     ret, frame = cap.read()
     if not ret:
         break
 
     # Perform object detection
     results = model(frame)
 
     # Draw regions
     for region in counting_regions:
         points = np.array(region["polygon"].exterior.coords, dtype=np.int32)
         cv2.polylines(frame, [points], isClosed=True, color=region["color"], thickness=2)
         region["counts"] = 0  # Reset counts for each frame
 
     # Count objects in regions
     for result in results:
         boxes = result['boxes']
         for box in boxes:
             x1, y1, x2, y2 = box['coords']
             center = Point((x1 + x2) / 2, (y1 + y2) / 2)
             for region in counting_regions:
                 if region["polygon"].contains(center):
                     region["counts"] += 1
 
     # Display counts
     for region in counting_regions:
         text = f'{region["name"]}: {region["counts"]}'
         cv2.putText(frame, text, (int(region["polygon"].centroid.x), int(region["polygon"].centroid.y)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, region["color"], 2)
 
     # Display the frame
     cv2.imshow('YOLOv10 Region Counting', frame)
     if cv2.waitKey(1) & 0xFF == ord('q'):
         break
 
 cap.release()
 cv2.destroyAllWindows()

微调训练

在使用模型时最主要的还是要在我们自己的数据集上进行微调,所以我们最后再介绍一下如何使用自己的数据进行微调。

我将使用一个预先准备好的检测x射线图像中的危险物品的数据集来作为演示。

我们只用roboflow直接下载yolov8格式的数据集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 !pip install -q roboflow
 from roboflow import Roboflow
 rf = Roboflow(api_key="your-api-key")
 project = rf.workspace("vladutc").project("x-ray-baggage")
 version = project.version(3)
 dataset = version.download("yolov8")

指定参数和文件路径,然后开始模型训练。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 !yolo task=detect mode=train epochs=25 batch=32 plots=True \
 model='/content/-q/yolov10n.pt' \
 data='/content/X-Ray-Baggage-3/data.yaml'

这里需要一个data.yaml文件,他的格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 names:
 - Gun
 - Knife
 - Pliers
 - Scissors
 - Wrench
 
 nc: 5
 
 roboflow:
   license: CC BY 4.0
   project: x-ray-baggage
   url: https://universe.roboflow.com/vladutc/x-ray-baggage/dataset/3
   version: 3
   workspace: vladutc
 
 test: /content/X-Ray-Baggage-3/test/images
 train: /content/X-Ray-Baggage-3/train/images
 val: /content/X-Ray-Baggage-3/valid/images

训练完成后我们可以看看结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Image(filename='/content/runs/detect/train/results.png', width=1000)

最后可以测试数据并在网格中显示结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 from ultralytics import YOLOv10
 import glob
 import matplotlib.pyplot as plt
 import matplotlib.image as mpimg
 
 model_path = '/content/runs/detect/train/weights/best.pt'
 model = YOLOv10(model_path)
 results = model(source='/content/X-Ray-Baggage-3/test/images', conf=0.25,save=True)
 
 
 images = glob.glob('/content/runs/detect/predict/*.jpg')
 
 images_to_display = images[:10]
 
 fig, axes = plt.subplots(2, 5, figsize=(20, 10))
 
 for i, ax in enumerate(axes.flat):
     if i < len(images_to_display):
         img = mpimg.imread(images_to_display[i])
         ax.imshow(img)
         ax.axis('off')  
     else:
         ax.axis('off')  
 
 plt.tight_layout()
 plt.show()

总结

YOLOv10的改进在性能和延迟方面均达到了最先进的水平,充分展示了其优越性。并且继承了Ultralytics的传统,无论是部署还是自定义训练和微调都十分的友好,有兴趣的可以现在开始研究了。

https://docs.ultralytics.com/tr/models/yolov10/#key-features

https://github.com/THU-MIG/yolov10


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DeepHub IMBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Maven Archetype 多 Module 自定义代码脚手架
大部分公司都会有一个通用的模板项目,帮助你快速创建一个项目。通常,这个项目需要集成一些公司内部的中间件、单元测试、标准的代码格式、通用的代码分层等等。
艾小仙
2022/01/24
1.2K0
Maven Archetype 多 Module 自定义代码脚手架
Maven私服搭建及自定义Archetype(骨架)
通过私服MAVEN能够更有效的管理自己的依赖包,像阿里云的短信jar包等第三方的依赖包,很多公服是没有的,在比如MAVEN是不支持多个仓库下载的,但是可以配置多个仓库。在私服上就可以解决以上问题。
Vincent-yuan
2021/12/08
1.4K0
Maven私服搭建及自定义Archetype(骨架)
基于maven的项目脚手架,一键创建项目的项目模板
Springboot的出现极大的简化了项目开发的配置,然而,到真实使用的时候还是会有一堆配置需要设定。比如依赖管理,各种插件,质量扫描配置,docker配置,持续集成配置,设置业务独特的架构配置等。这时候,如果创建一个包含这一切的脚手架,当需要创建项目的时候,只要create就好了。
Ryan-Miao
2019/07/03
2.2K0
基于maven的项目脚手架,一键创建项目的项目模板
手写Maven的archetype项目脚手架
  maven是一个很好的代码构建工具,采用“约定优先于配置”的原则进行项目管理,相信很多的java开发者应该都了解maven并可能在工作当中都是通过maven来管理项目的,在创建的项目的时候,我们往往会使用maven内置的项目骨架也就是archetype来快速生成项目结构。但是在一个团队做开发的过程中,可能仅仅依靠maven预先提供的archetyp可能是不够的,团队之间协作有自己的定义方式,每个人的结构定义风格也不尽相同,在这样的背景下我们有必要去定义一个统一的代码骨架供团队使用,这样做的好处是当团队需要开始一个新项目的时候,可以利用自定义的maven骨架一键生成项目。
阿豪聊干货
2018/08/09
1.8K0
手写Maven的archetype项目脚手架
Mavan:自定义骨架及工程初始化
最近在看低代码平台和流水线相关的一些东西,看到一些平台会提供自动生成代码库的能力,顺藤摸瓜,正好回顾一下maven的能力,并在这里做一些尝试和验证。
程序员架构进阶
2022/12/01
8690
Mavan:自定义骨架及工程初始化
基于start.spring.io,我实现了Java脚手架定制
2020 年,我们公司迎来了业务发展的迅猛期,滋生大量创建工程的需求。总体来说,创建工程面临着以下几个问题。
杨同学technotes
2022/12/01
1.2K0
老大说新项目的结构和 xxx 项目一样就可以了,我 ……
" 又要开发新项目了,还是创建新项目,怎么办?老大说按照 xxx 项目的结构创建一个新项目就可以了…… "
程序员小航
2020/11/23
8300
老大说新项目的结构和 xxx 项目一样就可以了,我 ……
自定义maven项目结构-maven archtype
背景 经常使用同一套类似的工程结构,就想着能不能自动构建,不用每次都进行工程结构的拷贝,另外呢也是想建立一套项目工程结构的规范,运用技术代替人工
shengjk1
2018/12/27
1K0
基于领域模型构建多模块项目骨架
互联网发展到现在,从刚开始的单体单机架构到现在的分布式微服务架构,虽然带来了不胜枚举的好处和便利,但是也让新应用的或者新业务板块的搭建增加了游戏难度,举个具体的场景,应用经过应用模块细分和代码分层后大致变成了这个样子:
叔牙
2020/11/19
1.8K0
基于领域模型构建多模块项目骨架
使用Maven Archetype创建Java项目模板
简而言之,Archetype是一个Maven项目模板工具包。原型被定义为一种原始的模式或模型,所有其他同类的东西都是从中产生的。当我们试图提供一个提供生成Maven项目的一致方法的系统时,这个名字就合适了。Archetype将帮助作者为用户创建Maven项目模板,并为用户提供生成这些项目模板的参数化版本的方法。
东溪陈姓少年
2020/08/06
1.4K0
Maven快速学习教程
在开发中经常需要依赖第三方的包,包与包之间存在依赖关系,版本间还有兼容性问题,有时还里要将旧的包升级或降级,当项目复杂到一定程度时包管理变得非常重要。
张果
2018/10/09
2.5K0
Maven快速学习教程
Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
两年半前写的关于Maven的介绍,现在看来都还是不错的,自己转下。写博客的一大好处就是方便自己以后查阅,自己总结的总是最靠谱的。
bear_fish
2018/09/19
3.8K0
Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
项目管理与构建——Maven
Maven下载地址http://maven.apache.org/download.cgi
羊羽shine
2019/05/29
7200
我把公司 10 年老系统改造 Maven,真香!!
公司有几个老古董项目,应该是 10 年前开发的了,有一个是 JSP + Servlet,有一个还用的 SSH 框架,打包用的 Ant,是有多老啊,我想在座的各位很多都没听过吧。
Java技术栈
2020/09/24
5290
我把公司 10 年老系统改造 Maven,真香!!
一个小时学会Maven
在开发中经常需要依赖第三方的包,包与包之间存在依赖关系,版本间还有兼容性问题,有时还里要将旧的包升级或降级,当项目复杂到一定程度时包管理变得非常重要。
张果
2018/10/09
2.8K0
一个小时学会Maven
老问题了:idea中使用maven archetype新建项目时卡住.md
作为一个后端Java打工人,idea就是最重要的打饭工具。创建项目,熟悉吧,但是,这么多年下来,因为idea换了版本,电脑换了等等,我还是时不时遇到根据maven archetype新建maven项目卡住。没错,我说的就是下面这样的场景:
低级知识传播者
2023/08/30
1.7K0
老问题了:idea中使用maven archetype新建项目时卡住.md
Maven常用命令 原
说到命令,则不得不提一下环境变量,在之前的博文中简单提了一下环境变量的配置,这里具体说一下。说完环境变量的配置,然后就是Maven的常用命令,这里说的是常用的几个命令,不常用的也许不会提到,后续可能会补上。
云飞扬
2019/03/13
6980
Maven常用命令
                                                                            原
入门maven?本文足矣
以前开发的时候,如果A项目需要某个jar包,可能去网上搜索下载jar包,然后复制粘贴在开发对应的位置,如果B项目也需要这个jar包,那么同样需要再次手动复制粘贴到对应的位置。
用户8902830
2022/09/22
7120
入门maven?本文足矣
Maven 那点事儿(转)
毋庸置疑,Jason 也是一个秃顶。James Gosling、Rod Johnson、Gavin King,你们可以告诉我为什么吗?
Dawnzhang
2018/10/18
6820
Maven 那点事儿(转)
十二、Maven项目模板「建议收藏」
Maven提供用户,使用原型的概念,不同类型的项目模板(以数字614)是一个非常大的列表。 Maven帮助用户快速开始使用以下命令创建新的Java项目
全栈程序员站长
2022/09/09
7200
十二、Maven项目模板「建议收藏」
相关推荐
Maven Archetype 多 Module 自定义代码脚手架
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档