模型訓練篇 | yolov10來了!手把手教你如何用yolov10訓練自己的數據集(含網絡結構 + 模型訓練 + 模型推理等)

前言:Hello大家好,我是小哥談。YOLOv9還沒捂熱乎,YOLOv10就推出來了,太卷了,太快了,坐等YOLOv9000!自今年2月YOLOv9發布之后, YOLO(You Only Look Once)系列的接力棒傳到了清華大學研究人員的手上。YOLOv10推出的消息引發了AI界的關注,它被認為是計算機視覺領域的突破性框架,以實時的端到端目標檢測能力而聞名,通過提供結合效率和準確性的強大解決方案,延續了YOLO系列的傳統。新版本發布之后,很多人已經進行了部署測試,效果不錯,本節課就帶領大家如何基于YOLOv10訓練模型并推理測試!~🌈

? ? ?目錄

🚀1.算法介紹

🚀2.網絡結構

🚀3.數據標注

🚀4.模型訓練

第1步:準備數據集

第2步:創建yaml文件

第3步:下載預訓練權重

第4步:新建Python文件

第5步:調節參數

第6步:開始訓練

🚀5.模型推理

🚀6.導出模型

🚀7.本節總結

🚀1.算法介紹

在我們深入探討YOLOv10之前,讓我們回顧一下YOLO的發展歷程。YOLO在實時目標檢測領域一直是先驅,兼顧速度準確性。從YOLOv1到YOLOv9,每個版本在架構、優化和數據增強方面都引入了顯著的改進。然而,隨著模型的發展,某些限制依然存在,特別是對后處理依賴非極大值抑制(NMS),這會減慢推理速度。YOLOv10正面解決了這些挑戰,使其成為實時應用中穩健高效的模型。

YOLOv10清華大學研究人員所研發的一種新的實時目標檢測方法,解決了YOLO以前版本在后處理和模型架構方面的不足。通過消除非最大抑制(NMS)優化各種模型組件,YOLOv10在顯著降低計算開銷的同時實現了最先進的性能。并用大量實驗證明,YOLOv10在多個模型尺度上實現了卓越的精度-延遲權衡

YOLOv10亮點:

  1. 無 NMS 設計:利用一致的雙重分配來消除對NMS的需求,從而減少推理延遲。

  2. 整體模型設計:從效率和準確性的角度全面優化各種組件,包括輕量級分類頭、空間通道去耦向下采樣和等級引導塊設計。

  3. 增強的模型功能:納入大核卷積和部分自注意模塊,在不增加大量計算成本的情況下提高性能。

自從Ultralytics發布YOLOv5以來,我們已經習慣了每次YOLO發布時提供各種模型尺寸:nanosmallmediumlargexlarge。YOLOv10也不例外,清華大學的研究人員也提供了一系列預訓練模型,可以用于各種目標檢測任務。

所有這些模型在延遲和平均精度(AP)方面表現出優于之前YOLO版本的性能,如下圖所示:

YOLOv10有多種型號,可滿足不同的應用需求:

YOLOv10-N:用于資源極其有限環境的納米版本。
YOLOv10-S:兼顧速度和精度的小型版本。
YOLOv10-M:通用中型版本。
YOLOv10-B:平衡型,寬度增加,精度更高。
YOLOv10-L:大型版本,精度更高,但計算資源增加。
YOLOv10-X:超大型版本可實現最高精度和性能。

論文題目:《YOLOv10: Real-Time End-to-End Object Detection》

論文地址:??https://arxiv.org/pdf/2405.14458

代碼實現:??GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection


🚀2.網絡結構

關于YOLOv10的網絡結構圖具體如下圖所示:

備注:后續關于改進就是基于上述YOLOv10網絡結構圖,請大家提前熟悉其基礎組件。?


🚀3.數據標注

利用labelimg或者make sense軟件來標注數據,關于如何使用labelimg或者make sense軟件來為自己的數據集打上標簽,請參考作者專欄文章:👇

說明:??????

數據標注工具的使用教程:

YOLOv5入門實踐(1)— 手把手教你使用labelimg標注數據集(附安裝包+使用教程)

YOLOv5入門實踐(2)— 手把手教你使用make sense標注數據集(附工具地址+使用教程)


🚀4.模型訓練

第1步:準備數據集

將數據集放在datasets文件夾中。datasets屬于放置數據集的地方,位于PycharmProjects中,C:\Users\Lenovo\PycharmProjects(這是我的電腦位置,跟你的不一定一樣,反正位于PycharmProjects中,如果沒有,可自行創建),屬于項目的同級文件夾。

具體如下圖所示:

打開datasets文件夾,可以看到本次安全帽訓練所使用的數據集。

安全帽佩戴檢測數據集是我手動標注好的,可以在我的博客“資源”中下載。

打開數據集文件,我們會看到數據集文件包括imageslabels兩個文件夾,其中,images放的是數據集圖片,包括trainval兩個文件夾,labels放的是經過labelimg標注所生成的標簽,也包括trainval兩個文件夾。

關于此處數據集的邏輯關系,用一張圖總結就是:??????

第2步:創建yaml文件

打開pycharm,選擇yolov10-main項目源碼文件,在datasets下新建一個helmet.yaml,具體位置是ultralytics/cfg/datasets,如下圖所示:👇

打開helmet.yaml,其內容如下:

# Train/val
train: C:\Users\Lenovo\PycharmProjects\datasets\SafetyHelmetWearingDataset\images\train
val: C:\Users\Lenovo\PycharmProjects\datasets\SafetyHelmetWearingDataset\images\val
test: # test images# Classes
nc: 2  # number of classes
names: ['helmet','nohelmet']

說明:??????

1.trainval為絕對路徑地址,可根據自己數據集的路徑地址自行設置。

2.nc指的是分類,即模型訓練結果分類,此處為在用labelimg或者make sense為數據集標注時候確定。

3.由于本次進行的是安全帽佩戴檢測模型訓練,所以分兩類,分別是:helmet(佩戴安全帽)nohelmet(不佩戴安全帽)

打開coco.yaml文件,可以看到里面寫的是相對路徑,和我們的寫法不同,但是都可以使用,據我所知還有很多種數據集讀取方式:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# COCO 2017 dataset https://cocodataset.org by Microsoft
# Documentation: https://docs.ultralytics.com/datasets/detect/coco/
# Example usage: yolo train data=coco.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── coco  ← downloads here (20.1 GB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco # dataset root dir
train: train2017.txt # train images (relative to 'path') 118287 images
val: val2017.txt # val images (relative to 'path') 5000 images
test: test-dev2017.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794# Classes
names:0: person1: bicycle2: car3: motorcycle4: airplane5: bus6: train7: truck8: boat9: traffic light10: fire hydrant11: stop sign12: parking meter13: bench14: bird15: cat16: dog17: horse18: sheep19: cow20: elephant21: bear22: zebra23: giraffe24: backpack25: umbrella26: handbag27: tie28: suitcase29: frisbee30: skis31: snowboard32: sports ball33: kite34: baseball bat35: baseball glove36: skateboard37: surfboard38: tennis racket39: bottle40: wine glass41: cup42: fork43: knife44: spoon45: bowl46: banana47: apple48: sandwich49: orange50: broccoli51: carrot52: hot dog53: pizza54: donut55: cake56: chair57: couch58: potted plant59: bed60: dining table61: toilet62: tv63: laptop64: mouse65: remote66: keyboard67: cell phone68: microwave69: oven70: toaster71: sink72: refrigerator73: book74: clock75: vase76: scissors77: teddy bear78: hair drier79: toothbrush# Download script/URL (optional)
download: |from ultralytics.utils.downloads import downloadfrom pathlib import Path# Download labelssegments = True  # segment or box labelsdir = Path(yaml['path'])  # dataset root dirurl = 'https://github.com/ultralytics/yolov5/releases/download/v1.0/'urls = [url + ('coco2017labels-segments.zip' if segments else 'coco2017labels.zip')]  # labelsdownload(urls, dir=dir.parent)# Download dataurls = ['http://images.cocodataset.org/zips/train2017.zip',  # 19G, 118k images'http://images.cocodataset.org/zips/val2017.zip',  # 1G, 5k images'http://images.cocodataset.org/zips/test2017.zip']  # 7G, 41k images (optional)download(urls, dir=dir / 'images', threads=3)
第3步:下載預訓練權重

打開YOLOv10官方倉庫地址,可以根據需要下載相應的預訓練權重。

預訓練權重下載地址:

GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection

下載完畢后,在主目錄下新建weights文件夾(如果已存在,就不需要新建,直接使用即可),然后將下載的權重文件放在weights文件夾下。具體如下圖所示:👇

第4步:新建Python文件

通過查看YOLOv10官方文檔可知,YOLOv10提供CLIpython兩種訓練方式。區別在于:

  • 方式1:CLI就是直接在終端運行指令
  • 方式2:python需要你新建一個python文件,然后運行代碼

方式1:

訓練模型的話直接用命令行就可以了

yolo detect train data=custom_dataset.yaml model=yolov10s.yaml epochs=300 batch=8 imgsz=640 device=0,1

device:設備id,如果只有一張顯卡,則device=0,如果有兩張,則device=0,1,依次類推。

imgsz:圖像放縮大小resize,默認是640,如果資源不夠可以設置為320試試。

方式2:

考慮到部分同學不喜歡使用命令行方式,在YOLOv10源碼目錄下新建Python文件,命名為train.py具體如下圖所示:

關于train.py文件的完整代碼如下所示:

# coding:utf-8
from ultralytics import YOLOv10
# 模型配置文件
model_yaml_path = "ultralytics/cfg/models/v10/yolov10n.yaml"
# 數據集配置文件
data_yaml_path = 'ultralytics/cfg/datasets/helmet.yaml'
# 預訓練模型
pre_model_name = 'yolov10n.pt'if __name__ == '__main__':# 加載預訓練模型model = YOLOv10("ultralytics/cfg/models/v10/yolov10n.yaml").load('yolov10n.pt')# 訓練模型results = model.train(data=data_yaml_path,epochs=100,batch=8,name='train_v10')
第5步:調節參數

YOLOv10關于模型的各種參數都在ultralytics/cfg/default.yaml(其實是與YOLOv8一致的),通過調節這些參數我們就可以實現各種我們所需的操作。

第6步:開始訓練

點擊運行train.py文件即可進行訓練了,可以看到所打印的網絡結構如下所示。


🚀5.模型推理

模型推理測試(默認讀取yolov10/ultralytics/assets文件夾下的所有圖像)

yolo predict model=yolov10s.pt

如果測試別的路徑下的文件可以在上面命令后面加上source='xxx/bus.jpg',如果想測試視頻,可以使用source='xxx/bus.mp4'

也可以在YOLOv10根目錄下創建predict.py文件,該文件源代碼如下所示:

from ultralytics import YOLOv10# Load a pretrained YOLOv10n model
model = YOLOv10("runs/detect/train_v10/weights/best.pt")# Perform object detection on an image
# results = model("test1.jpg")
results = model.predict("ultralytics/assets/bus.jpg")# Display the results
results[0].show()

備注:上面的相對路徑地址為訓練后的權重文件和所檢測的圖片地址,根據實際絕對地址填寫。

點擊運行,模型推理結果如下所示:


🚀6.導出模型

本節課提供兩種導出模型的方法:

方法1:CLI命令方式

yolo export model=yolov10x.pt format=onnx # export official model
yolo export model=path/to/best.pt format=onnx # export custom trained model

方式2:Python文件方式

from ultralytics import YOLOv10
# Load a model
model = YOLOv10('yolov10x.pt') # load an official model
model = YOLOv10('path/to/best.pt') # load a custom trained model# Export the model
model.export(format='onnx')

🚀7.本節總結

清華大學研究人員推出的YOLOv10,作為首個無NMS目標檢測模型,代表了計算機視覺領域的重大進步。與YOLOv8相比,YOLOv10顯著減少了推理延遲,使其更適合高速實時應用,如自動駕駛視頻監控交互式AI系統。這種推理過程中計算步驟的減少突顯了YOLOv10的效率和響應能力。

此外,YOLOv10采用了新的無NMS訓練方法,對其各部分進行了微調以提高性能,并在速度準確性之間達到了很好的平衡。這些升級使得模型的部署更容易,性能更強,速度更快,響應更迅速。無論你是研究人員、開發人員還是技術愛好者,YOLOv10都是值得關注的模型。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22463.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22463.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22463.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣2953.統計完全子字符串

力扣2953.統計完全子字符串 先分組循環求出每個組 分別算個數 對于每個組 枚舉一遍其中有多少種字母用cnt數組記錄每個字母出現次數 check的時候也是暴力枚舉cnt中每個字母出現次數 **分組循環:**從i(新一組的起點)開始,當滿足條件時,最后退…

CentOS 7基礎操作03_Linux命令的分類

1、Linux命令的分類 Linux命令的執行必須依賴于 Shell命令解釋器。Shell實際上是在Linux操作系統中運行的一種特殊程序,它位于操作系統內核與用戶之間,負責接收用戶輸入的命令并進行解釋.將需要執行的操作傳遞給系統內核執行,Shell在用戶和內…

搜維爾科技: 使用 Xsens 和 HTC Vive進行電影制作案例

搜維爾科技: 使用 Xsens 和 HTC Vive進行電影制作案例 搜維爾科技: 使用 Xsens 和 HTC Vive進行電影制作案例

全域外賣平臺是什么?有哪些系統可以推薦?

隨著本地生活下半場的開啟,以團購外賣為代表的一系列相關業務也邁入了全域時代。在此背景下,全域外賣賽道正式興起,全域外賣平臺也隨之備受矚目。 作為創業的一大新風口,全域外賣囊括了公域和私域內所有的外賣業務,主…

基礎篇03——SQL約束

概述 約束示例 完成以下案例&#xff1a; create table user (id int primary key auto_increment comment 主鍵,name varchar(10) not null unique comment 姓名,age tinyint unsigned check ( age > 0 and age < 120 ) comment 年齡,status char(1) default 1 commen…

嵌入式C語言--Pragma Section與Map文件

嵌入式C語言–Pragma Section與Map文件 嵌入式C語言--Pragma Section與Map文件 嵌入式C語言--Pragma Section與Map文件一. Pragma修飾符二. Map文件1&#xff09;什么是map文件2&#xff09;map文件的構成3&#xff09;常用的段映射地址4&#xff09;map文件生成 三. Section修…

HAL_UART_IRQHandler(UART_HandleTypeDef *huart)分析

//接收沒錯誤&#xff1a;執行UART_Receive_IT(huart) //接收有錯誤&#xff1a;執行UART_Receive_IT(huart)、HAL_UART_ErrorCallback(huart) void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) {uint32_t isrflags READ_REG(huart->Instance->SR);uint32_t cr1…

java項目部署腳本

一、java項目部署腳本示例 在Java項目中&#xff0c;部署腳本通常依賴于項目的構建工具&#xff08;如Maven或Gradle&#xff09;以及部署環境&#xff08;如Docker、Tomcat、Kubernetes等&#xff09;。以下是一個基于Maven和Shell腳本的Java項目部署示例&#xff0c;假設我們…

8*8LED點陣點亮一個點

#include<reg51.h> typedef unsigned int u16; //對系統默認數據進行重定義 typedef unsigned char u8; //定義74HC595控制管腳 sbit SRCLKP3^6; //移位寄存器時鐘輸入 sbit RCLKP3^5; //存儲寄存器時鐘輸入 sbit SERP3^4; //串…

SpaceX: 太空火箭自主精準著陸

本文是根據Lars Blackmore在16年的一篇公開論文翻譯而來&#xff0c;雖然有些早而且是科普文章&#xff0c;但是可以初見一些SpaceX火箭著陸的細節&#xff0c;后面我會對spaceX landing control 技術主管MIT博士期間研究火箭控制算法的論文進行講解&#xff0c;敬請期待。 Lar…

Linux系統常用命令

Linux 系統常用命令 1、文件操作2、目錄操作 1、文件操作 創建文件&#xff1a; touch 文件名 創建文件并編輯&#xff1a;vim 文件名 查看文件全部內容&#xff1a;cat 文件名 帶行號查看文件內容&#xff1a; cat -n file 查看文件內容并監視內容更新&#xff1a; 以翻頁形…

【電機】步進電機相關指標

一 靜態指標&#xff1a; 相數&#xff1a;線圈的組數&#xff0c;兩相步進電機步距角一般為 1.8&#xff0c;三相的步進電機步距角為 1.2&#xff0c;相數越多步距角越小。 步距角&#xff1a;一個脈沖信號所對應的電機轉動的角度&#xff0c;這個步距角他不一定是電機實際工…

OpenEuler華為歐拉系統安裝—從零開始,小白也能學會

介紹 openEuler&#xff08;歐拉&#xff09;是一款開源操作系統。 當前openEuler內核源于Linux&#xff0c;支持鯤鵬及其它多種處理器&#xff0c; 能夠充分釋放計算芯片的潛能&#xff0c;是由全球開源貢獻者構建的高效、 穩定、安全的開源操作系統&#xff0c;適用于數據庫…

JVM運行數據區-Java堆

Java堆 堆區&#xff08;Heap區&#xff09;是JVM運行時數據區占用內存最大的一塊區域&#xff0c;每一個JVM進程只存在一個堆區&#xff0c;它在JVM啟動時被創建&#xff0c;JVM規范中規定堆區可以是物理上不連續的內存&#xff0c;但必須是邏輯上連續的內存。 1、堆區是線程…

Java面試題-基礎

Java面試題-基礎 1、Java語言有哪些特點&#xff1f;2、面向對象和面向過程的區別是什么&#xff1f;3、說說標識符的命名規則&#xff1f;4、說說Java八種基本數據類型的大小以及他們的封裝類&#xff1f;5、instanceof關鍵字有什么作用&#xff1f;6、自動裝箱與自動拆箱是什…

「網絡編程」基于 UDP 協議實現回顯服務器

&#x1f387;個人主頁&#xff1a;Ice_Sugar_7 &#x1f387;所屬專欄&#xff1a;計網 &#x1f387;歡迎點贊收藏加關注哦&#xff01; 實現回顯服務器 &#x1f349;socket api&#x1f349;回顯服務器&#x1f34c;實現&#x1f95d;服務器&#x1f95d;客戶端 &#x1f3…

純血鴻蒙實戰開發—如何添加頂部tab頁面

1.Tabs組件 Tabs組件的頁面組成包含兩個部分&#xff0c;分別是TabContent和TabBar。TabContent是內容頁&#xff0c;TabBar是導航頁簽欄. 根據不同的導航類型&#xff0c;布局會有區別&#xff0c;可以分為底部導航、頂部導航、側邊導航&#xff0c;其導航欄分別位于底部、頂…

react基礎學習 JSX

JSX的測試網站 Babel Babel 可以測試代碼的效果 JSX實現map列表 注意 key不一樣&#xff08;使用遍歷的時候&#xff09; 簡單條件渲染 復雜條件渲染 綁定事件 function App() {const colorse (e)>{console.log("測試點擊",e);}const colorse1 (name)>{…

代碼隨想錄訓練營第六十天 | 84.柱狀圖中最大的矩形

84.柱狀圖中最大的矩形 題目鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 文檔講解&#xff1a;代碼隨想錄 視頻講解&#xff1a;單調棧&#xff0c;又一次經典來襲&#xff01; LeetCode&#xff1a;84.柱狀圖中最大的矩形_嗶哩嗶哩_bilibili 狀態&#xff1a;未…

地理信息科學中的大數據挑戰

在信息化爆炸的時代&#xff0c;地理信息科學&#xff08;GIScience&#xff09;正經歷著前所未有的變革&#xff0c;其中&#xff0c;地理空間大數據的涌現為科學研究與應用帶來了前所未有的機遇與挑戰。作為地理信息與遙感領域的探索者&#xff0c;本文旨在深入剖析地理空間大…