前言
代碼倉庫地址:https://github.com/Oneflow-Inc/one-yolov5歡迎star one-yolov5項(xiàng)目 獲取 最新的動(dòng)態(tài)。如果你有問題,歡迎在倉庫給我們提出寶貴的意見。 如果對你有幫助,歡迎來給我Star呀~
聲明:Model Train(以coco數(shù)據(jù)集為例) 。本文涉及到了大量的超鏈接,但是在微信文章里面外鏈接會(huì)被吃掉,所以歡迎大家到這里查看本篇文章的完整版本:https://start.oneflow.org/oneflow-yolo-doc/tutorials/03_chapter/quick_start.html
項(xiàng)目結(jié)構(gòu)預(yù)覽

安裝
gitclonehttps://github.com/Oneflow-Inc/one-yolov5#clone
cdone-yolov5
pipinstall-rrequirements.txt#install
訓(xùn)練
兩種訓(xùn)練方式
- 帶權(quán)重訓(xùn)練
$pythonpath/to/train.py--datacoco.yaml--weightsyolov5s--img640
- 不帶權(quán)重訓(xùn)練
$pythonpath/to/train.py--datacoco.yaml--weights''--cfgyolov5s.yaml--img640
單GPU訓(xùn)練
$pythontrain.py--datacoco.yaml--weightsyolov5s--device0
多GPU訓(xùn)練
$python-moneflow.distributed.launch--nproc_per_node2train.py--batch64--datacoco.yaml--weightsyolov5s--device0,1
注意:
-
--nproc_per_node 指定要使用多少GPU。舉個(gè)例子:在上面 多GPU訓(xùn)練指令中它是2。
-
--batch 是總批量大小。它將平均分配給每個(gè)GPU。在上面的示例中,每GPU是64/2=32。
-
--cfg : 指定一個(gè)包含所有評估參數(shù)的配置文件。
-
上面的代碼默認(rèn)使用GPU 0…(N-1)。使用特定的GPU?可以通過簡單在 --device 后跟指定GPU來實(shí)現(xiàn)?!赴咐?,在下面的代碼中,我們將使用GPU 2,3。
$python-moneflow.distributed.launch--nproc_per_node2train.py--batch64--datacoco.yaml--cfgyolov5s.yaml--weights''--device2,3
恢復(fù)訓(xùn)練
如果你的訓(xùn)練進(jìn)程中斷了,你可以這樣恢復(fù)先前的訓(xùn)練進(jìn)程。
#多卡訓(xùn)練.
python-moneflow.distributed.launch--nproc_per_node2train.py--resume
你也可以通過 --resume 參數(shù)指定要恢復(fù)的模型路徑
#記得把/path/to/your/checkpoint/path替換為你要恢復(fù)訓(xùn)練的模型權(quán)重路徑
--resume/path/to/your/checkpoint/path
使用SyncBatchNorm
SyncBatchNorm可以提高多gpu訓(xùn)練的準(zhǔn)確性,但會(huì)顯著降低訓(xùn)練速度。它僅適用于多GPU DistributedDataParallel 訓(xùn)練。
建議最好在每個(gè)GPU上的樣本數(shù)量較?。?em style="font-style:italic;color:#000000;">樣本數(shù)量<=8)時(shí)使用。
要使用SyncBatchNorm,只需將添加 --sync-bn 參數(shù)選項(xiàng),具體「案例」如下:
$python-moneflow.distributed.launch--nproc_per_node2train.py--batch64--datacoco.yaml--cfgyolov5s.yaml--weights''--sync-bn
評估
下面的命令是在COCO val2017數(shù)據(jù)集上以640像素的圖像大小測試 yolov5x
模型。yolov5x
是可用小模型中最大且最精確的,其它可用選項(xiàng)是 yolov5n
,yolov5m
,yolov5s
,yolov5l
,以及他們的 P6 對應(yīng)項(xiàng)比如 yolov5s6
,或者你自定義的模型,即 runs/exp/weights/best
。有關(guān)可用模型的更多信息,請參閱我們的README-TABLE
$pythonval.py--weightsyolov5x--datacoco.yaml--img640
推理
首先,下載一個(gè)訓(xùn)練好的模型權(quán)重文件,或選擇你自己訓(xùn)練的模型;
然后,通過 detect.py文件進(jìn)行推理。
pythonpath/to/detect.py--weightsyolov5s--source0#webcam
img.jpg#image
vid.mp4#video
path/#directory
path/*.jpg#glob
'https://youtu.be/Zgi9g1ksQHc'#YouTube
'rtsp://example.com/media.mp4'#RTSP,RTMP,HTTPstream
訓(xùn)練結(jié)果
本地日志
默認(rèn)情況下,所有結(jié)果都記錄為runs/train,并為每個(gè)新訓(xùn)練創(chuàng)建一個(gè)新的訓(xùn)練結(jié)果目錄,如runs/train/exp2、runs/train/exp3等。查看訓(xùn)練和測試JPG以查看 mosaics, labels, predictions and augmentation 效果。注意:Mosaic Dataloader 用于訓(xùn)練(如下所示),這是Ultralytics發(fā)表的新概念,首次出現(xiàn)在YOLOv4中。
train_batch0.jpg 顯示 batch 為 0 的 (mosaics and labels):

val_batch0_labels.jpg 展示測試 batch 為 0 的labels:

val_batch0_pred.jpg 展示測試 batch 為 0 predictions(預(yù)測):
訓(xùn)練訓(xùn)損失和性能的指標(biāo)有記錄到Tensorboard和自定義結(jié)果中results.csv日志文件,訓(xùn)練訓(xùn)完成后作為結(jié)果繪制 results.png如下。在這里,我們展示了在COCO128上訓(xùn)練的YOLOV5結(jié)果
- 從零開始訓(xùn)練 (藍(lán)色)。
- 加載預(yù)訓(xùn)練權(quán)重 --weights yolov5s (橙色)。

具體的指標(biāo)分析詳見文章《模型精確度評估》
訓(xùn)練技巧
聲明:大多數(shù)情況下,只要數(shù)據(jù)集足夠大且標(biāo)記良好,就可以在不改變模型或訓(xùn)練設(shè)置的情況下獲得良好的結(jié)果。如果一開始你沒有得到好的結(jié)果,你可以采取一些步驟來改進(jìn),但我們始終建議用戶在考慮任何更改之前先使用所有默認(rèn)設(shè)置進(jìn)行一次訓(xùn)練。這有助于建立評估基準(zhǔn)和發(fā)現(xiàn)需要改進(jìn)的地方 。
模型選擇
類似于YOLOv5x和YOLOv5x6的大型模型在幾乎所有情況下都會(huì)產(chǎn)生更好的結(jié)果,但參數(shù)更多,需要更多的CUDA內(nèi)存進(jìn)行訓(xùn)練,運(yùn)行速度較慢。
對于移動(dòng)部署,我們推薦YOLOv5s/m,對于云部署,我們建議YOLOV5l/x。
有關(guān)所有模型的完整比較,請參閱詳細(xì)表
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-FotYkHQk-1668949640644)( https://user-images.githubusercontent.com/35585791/201064824-f97c82d5-6bba-4421-86d9-194e47842e35.png)]
- 從預(yù)先訓(xùn)練的權(quán)重開始訓(xùn)練。建議用于中小型數(shù)據(jù)集(即VOC、VisDrone、GlobalWheat)。將模型的名稱傳遞給--weights參數(shù)。模型自動(dòng)從latest YOLOv5 releasse 下載 。
pythontrain.py--datacustom.yaml--weightsyolov5s
yolov5m
yolov5l
yolov5x
custom_pretrained#自定義的網(wǎng)絡(luò)結(jié)構(gòu)文件
-
從頭開始訓(xùn)練的話,推薦用大的數(shù)據(jù)集(即 COCO、Objects365、OIv6 )在
--cfg
選項(xiàng)后傳遞你感興趣的網(wǎng)絡(luò)結(jié)構(gòu)文件參數(shù) 以及空的--weights ''
參數(shù):
pythontrain.py--datacustom.yaml--weights''--cfgyolov5s.yaml
yolov5m.yaml
yolov5l.yaml
yolov5x.yaml
訓(xùn)練配置
在修改任何內(nèi)容之前,首先使用默認(rèn)設(shè)置進(jìn)行訓(xùn)練,以建立性能基線。訓(xùn)練參數(shù)的完整列表,能夠在train.py文件中發(fā)現(xiàn)。
-
Epochs : 默認(rèn)訓(xùn)練300個(gè)epochs。如果早期過擬合,則可以減少訓(xùn)練。如果在300個(gè)周期后未發(fā)生過擬合,則可以訓(xùn)練更長,比如600、1200個(gè)epochs。
-
Image size: COCO以 --img 640,的分辨率進(jìn)行訓(xùn)練,但由于數(shù)據(jù)集中有大量的小對象,它可以從更高分辨率(如--img 1280)的訓(xùn)練中訓(xùn)練。如果有許多小對象,則自定義數(shù)據(jù)集將從更高分辨率的訓(xùn)練中獲益。最好的推斷結(jié)果是在相同的--img 處獲得的 ,即如果在-img 1280處進(jìn)行訓(xùn)練,也應(yīng)該在--img 1280處進(jìn)行測試和檢測。
-
Batch Size: 使用更大的 --batch-size 。能夠有效緩解小樣本數(shù)產(chǎn)生的batchnorm統(tǒng)計(jì)的錯(cuò)誤。
-
Hyperparameters:默認(rèn)超參數(shù)在hyp.scratch-low.yaml文件中。我們建議你在考慮修改任何超參數(shù)之前,先使用默認(rèn)超參數(shù)進(jìn)行訓(xùn)練。一般來說,增加增強(qiáng)超參數(shù)將減少和延遲過度擬合,允許更長的訓(xùn)練和得到更高mAP值。減少損耗分量增益超參數(shù),如hyp['obj'],將有助于減少這些特定損耗分量中的過度擬合。有關(guān)優(yōu)化這些超參數(shù)的自動(dòng)化方法,請參閱我們的 《超參數(shù)演化教程》。
-
...更多訓(xùn)練的超參數(shù)配置請查看本文的附錄。
拓展
使用多機(jī)訓(xùn)練
這僅適用于多GPU分布式數(shù)據(jù)并行訓(xùn)練。
在訓(xùn)練之前,確保所有機(jī)器上的文件都相同,數(shù)據(jù)集、代碼庫等。之后,確保機(jī)器可以相互通信。
你必須選擇一臺(tái)主機(jī)器(其他機(jī)器將與之對話)。記下它的地址(master_addr)并選擇一個(gè)端口(master-port)。對于下面的示例,將使用master_addr=192.168.1.1和master_ port=1234。
要使用它,可以執(zhí)行以下指令:
#Onmastermachine0
$python-moneflow.distributed.launch--nproc_per_nodeG--nnodesN--node_rank0--master_addr"192.168.1.1"--master_port1234train.py--batch64--datacoco.yaml--cfgyolov5s.yaml--weights''
#OnmachineR
$python-moneflow.distributed.launch--nproc_per_nodeG--nnodesN--node_rankR--master_addr"192.168.1.1"--master_port1234train.py--batch64--datacoco.yaml--cfgyolov5s.yaml--weights''
其中G是每臺(tái)機(jī)器的GPU數(shù)量,N是機(jī)器數(shù)量,R是從0到(N-1)的機(jī)器數(shù)量。
假設(shè)我有兩臺(tái)機(jī)器,每臺(tái)機(jī)器有兩個(gè)GPU,對于上面的情況,G=2,N=2,R=1。
在連接所有N臺(tái)機(jī)器之前,訓(xùn)練不會(huì)開始。輸出將僅顯示在主機(jī)上!
注意
- oneflow目前不支持windows平臺(tái)
- --batch 必須是GPU數(shù)量的倍數(shù)。
- GPU 0 將比其他GPU占用略多的內(nèi)存,因?yàn)樗S護(hù)EMA并負(fù)責(zé)檢查點(diǎn)等。
- 如果你得到 RuntimeError: Address already in use ,可能是因?yàn)槟阋淮握谶\(yùn)行多個(gè)訓(xùn)練程序。要解決這個(gè)問題,只需通過添加--master_port來使用不同的端口號,如下所示
$python-moneflow.distributed.launch--master_port1234--nproc_per_node2...
配置代碼
#prepare
t=https://github.com/Oneflow-Inc/one-yolov5:latest&&sudodockerpull$t&&sudodockerrun-it--ipc=host--gpusall-v"$(pwd)"/coco:/usr/src/coco$t
pipinstall--preoneflow-fhttps://staging.oneflow.info/branch/master/cu112
cd..&&rm-rfapp&&gitclonehttps://github.com/Oneflow-Inc/one-yolov5-bmasterapp&&cdapp
cpdata/coco.yamldata/coco_profile.yaml
#profile
pythontrain.py--batch-size16--datacoco_profile.yaml--weightsyolov5l--epochs1--device0
python-moneflow.distributed.launch--nproc_per_node2train.py--batch-size32--datacoco_profile.yaml--weightsyolov5l--epochs1--device0,1
python-moneflow.distributed.launch--nproc_per_node4train.py--batch-size64--datacoco_profile.yaml--weightsyolov5l--epochs1--device0,1,2,3
python-moneflow.distributed.launch--nproc_per_node8train.py--batch-size128--datacoco_profile.yaml--weightsyolov5l--epochs1--device0,1,2,3,4,5,6,7
附件
表3.1
表3.1 : train.py參數(shù)解析表
參數(shù) | help | 幫助 |
---|---|---|
--weight | initial weights path | 加載的權(quán)重文件路徑 |
--cfg | model.yaml path | 模型配置文件,網(wǎng)絡(luò)結(jié)構(gòu) 路徑 |
--data | dataset.yaml path | 數(shù)據(jù)集配置文件,數(shù)據(jù)集路徑 |
--hyp | hyperparameters path | 超參數(shù)文件 路徑 |
--epochs | Total training rounds | 訓(xùn)練總輪次 |
--batch-size | total batch size for all GPUs, -1 for autobatch | 一次訓(xùn)練所選取的樣本數(shù) |
--imgsz | train, val image size (pixels) | 輸入圖片分辨率大小 |
--rect | rectangular training | 是否采用矩形訓(xùn)練,默認(rèn)False |
--resume | resume most recent training | 接著打斷訓(xùn)練上次的結(jié)果接著訓(xùn)練 |
--nosave | only save final checkpoint | 只保存最終的模型,默認(rèn)False |
--noautoanchor | disable AutoAnchor | 不自動(dòng)調(diào)整anchor,默認(rèn)False |
--noplots | save no plot files | 不保存打印文件,默認(rèn)False |
--evolve | evolve hyperparameters for x generations | 是否進(jìn)行超參數(shù)進(jìn)化,默認(rèn)False |
--bucket | gsutil bucket | 谷歌云盤bucket,一般不會(huì)用到 |
--cache | --cache images in "ram" (default) or "disk" | 是否提前緩存圖片到內(nèi)存,以加快訓(xùn)練速度,默認(rèn)False |
--device | cuda device, i.e. 0 or 0,1,2,3 or cpu | 訓(xùn)練的設(shè)備,cpu;0(表示一個(gè)gpu設(shè)備cuda:0);0,1,2,3(多個(gè)gpu設(shè)備) |
--multi-scale | vary img-size +/- 50%% | 是否進(jìn)行多尺度訓(xùn)練,默認(rèn)False |
--single-cls | train multi-class data as single-class | 數(shù)據(jù)集是否只有一個(gè)類別,默認(rèn)False |
--optimizer | optimizer | 優(yōu)化器 |
--sync-bn | use SyncBatchNorm, only available in DDP mode | 是否使用跨卡同步BN,在DDP模式使用 |
--workers | max dataloader workers (per RANK in DDP mode) | dataloader的最大worker數(shù)量 |
--project | save to project path | 保存到項(xiàng)目結(jié)果地址 |
--name | save to project/name/ | 保存到項(xiàng)目結(jié)果/名稱 |
--exist-ok | existing project/name ok, do not increment | 現(xiàn)有項(xiàng)目/名稱確定,不遞增,默認(rèn)False |
--quad | quad dataloader | 四元數(shù)據(jù)加載器 開啟之后在尺寸大于640的圖像上識(shí)別效果更好,但是有可能會(huì)使在640尺寸的圖片上效果更差 |
--cos-lr | cosine LR scheduler | 是否采用退火余弦學(xué)習(xí)率,默認(rèn)False |
--label-smoothing | Label smoothing epsilon | 標(biāo)簽平滑 |
--patience | EarlyStopping patience (epochs without improvement) | 早停機(jī)制,默認(rèn)False |
--freez | Freeze layers: backbone=10, first3=0 1 2 | 凍結(jié)層數(shù),默認(rèn)不凍結(jié) |
--save-period | Save checkpoint every x epochs (disabled if < 1) | 用于記錄訓(xùn)練日志信息,int 型,默認(rèn) -1 |
--seed | Global training seed | 隨機(jī)數(shù)種子設(shè)置 |
--local_rank | Automatic DDP Multi-GPU argument, do not modify | 自動(dòng)單機(jī)多卡訓(xùn)練 一般不改動(dòng) |
Reference
- https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
- https://docs.ultralytics.com/quick-start/
審核編輯 :李倩
-
gpu
+關(guān)注
關(guān)注
28文章
4949瀏覽量
131283 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1224瀏覽量
25459
原文標(biāo)題:《YOLOv5全面解析教程》六,YOLOv5使用教程詳解(單卡,多卡,多機(jī)訓(xùn)練)
文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
在K230上部署yolov5時(shí) 出現(xiàn)the array is too big的原因?
RV1126 yolov8訓(xùn)練部署教程

請問如何在imx8mplus上部署和運(yùn)行YOLOv5訓(xùn)練的模型?
YOLOv5類中rgb888p_size這個(gè)參數(shù)要與模型推理和訓(xùn)練的尺寸一致嗎?一致會(huì)達(dá)到更好的效果?
yolov5轉(zhuǎn)onnx在cubeAI進(jìn)行部署,部署失敗的原因?
【米爾RK3576開發(fā)板評測】+項(xiàng)目名稱YOLOV5目標(biāo)檢測
【ELF 2學(xué)習(xí)板試用】ELF2開發(fā)板(飛凌嵌入式)部署yolov5s的自定義模型
在RK3568教學(xué)實(shí)驗(yàn)箱上實(shí)現(xiàn)基于YOLOV5的算法物體識(shí)別案例詳解
在樹莓派上部署YOLOv5進(jìn)行動(dòng)物目標(biāo)檢測的完整流程

RK3588 技術(shù)分享 | 在Android系統(tǒng)中使用NPU實(shí)現(xiàn)Yolov5分類檢測
RK3588 技術(shù)分享 | 在Android系統(tǒng)中使用NPU實(shí)現(xiàn)Yolov5分類檢測-迅為電子

評論