---
title: YOLOv5模型
tags: YOLOv5 tutorials
---
# YOLOv5訓練過程
## 實驗環境
### 軟體部分
* Windows 11 專業版
* Anaconda Navigator
* python 3.9.12
* Spyder 5.1.5
### 硬體部分
* 處理器:Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz 2.59 GHz
* 記憶體:32.0 GB (31.8 GB 可用)
* GPU:nvidia quadro rtx 3000 with max-q
### 套件部分
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.1
Pillow>=7.1.2
PyYAML>=5.3.1
requests>=2.23.0
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.64.0
protobuf<=3.20.1
cuda=11.6
cudnn=8.4.1(for CUDA11)
cudatoolkit=11.6
## 模型介紹
這次YOLOV5總共推出了10種模型類型,而這5種模型大小則是以神經網絡的複雜程度來區分這次則會介紹基礎常用的五大類,在還沒開始介紹以下五種模型之前,這五類的效能分析在官方的效能分析方面有提出以下五大種類爲主
* FP16(Float)
FP可以解釋成浮點計算能力,主要是用來計算進行AI運算的計算格式,而它的表示範圍和範圍則可以參考下圖

第一個Sign主要是用來做正負號0代表正1代表負。
接著之後10至14的位置則是用來表示指數位。
最後0至9的位置都是表示有效數字
最大值為65504
最小值為6.10* 10^-5
除了FP16之外也有FP32,由於FP16和FP32的對比能夠有接近一倍的速度,所以大部分人在訓練模型時都采取FP16爲主,好處是只要消耗一半的效能就可以取得相同的效果,可以減少GPU所占用的内存。可是若想要使用FP16這樣的方式來進行訓練的話前提是GPU必須要具備FP16的計算能力。FP16唯一的缺點是若在參數調整不當時會造成GPU内存溢出。
> 公式(-1)^signbit(符號位)* 2^(e) * (1+significantbits(最高有效數))
> 最大值为:0 11110 1111111111=(-1)^0 * 2^15 * (1+1-2^-10)=65504
> 最小值为:0 00001 0000000000=2^-14=6.10 * 10^-5
* 訓練速度
以下的訓練時間都是以V100(訓練設備)和1個Batch(批次)所訓練出來的結果爲主而時間單位都是以ms(毫秒)爲主
>V100是目前用來作爲深度學習最高的顯示卡,因爲它同時具備了可以8個GPU一起進行運算而每一張V100的GPU規格都是32GB的内存。1張V100可以媲美100張同等級的CPU或者GPU的訓練效能。
* mAP(COCO數據集)
最後則是以mAP(mean Average Precision)就是每一種物體的AP(Average Precision)算完後的平均值。而這次所采用的數據集是COCO數據集裏面所包含的標簽有80種。
>AP(每一個物體的平均辨識率)
>mean Average Precision(IoU=0.5)
>数值越高,即阈值越大,精度越低。
* 網絡深度(depth_multiple)
主要是用來理解為控制**卷積核(Kernal)的個數**,個數越多代表的複雜度越高,在YOLOV5中和**網絡寬度**的配置搭配的不同造就了以下的五種大小的模型
* 網絡寬度(width_multiple)
主要是用來理解為輸出層通道的大小
而YOLO的網絡架構一般都會分成以下三大部分為主這三者都在訓練的時候都扮演各自不同的角色。
* Backbone特徵提取(feature extraction)
這部分主要是用來做特徵提取(feature extraction),用來形成特徵圖(feature maps)。而YOLOV5則采用了EfficientDet(Google)。因爲這種架構下載相同的網絡大小通常辨識率比其他的網絡好,而且使用者可以自由調整Convet的參數。一般在執行BackBone這塊通常都是先用預先訓練好的(權重)Weight來做處理,因爲這樣會節省比較多時間。若結果不理想的話則會通過新的訓練樣本去做慢慢調整
* Neck(特徵聚合Feature Aggregation)
這部分主要是將Backbone所得到的特徵圖做整合(mix and combine)爲了下一層的偵測而做準備而YOLOV5在這裏采取的是PANet的架構下去實作。Neck通常只會連接convnet中的最後幾層(5層、涵蓋不同大小的特徵點),然後將資訊在layer中上下流動的連接結合
> PANet全名Path Aggregation Network for Instance Segmentation中文名字為實例分割的路徑聚合網絡
* Head(偵測步驟Detection Step)
這部分是用來做最後圖像所生成的特征做預測,生成邊界框(Bounding Box)和預測類別。在這部分的網絡訓練中,網絡在初始錨(anchor)框的基礎上輸出預測框,之後會和真實框(ground truth)去做比對,計算兩者的差距,一直反復更新和運算網絡中的參數。
YOLOV5中有將此功能嵌入到代碼中,每次訓練時都會自我調整并且計算不同資料集中的最佳錨框值
### YOLOv5n(Nano)
4MB~FP16~
6.3ms~V100~
28.4mAP~coco~
depth_multiple: 0.33
width_multiple: 0.25
### YOLOv5s(Small)
14MB~FP16~
6.4ms~V100~
37.2mAP~coco~
depth_multiple: 0.33
width_multiple: 0.50
### YOLOv5m(Medium)
41MB~FP16~
8.2ms~V100~
45.2mAP~coco~
depth_multiple: 0.67
width_multiple: 0.75
### YOLOv5l(Large)
89MB~FP16~
10.1ms~V100~
48.8mAP~coco~
depth_multiple: 1.0
width_multiple: 1.0
### YOLOv5x(XLarge)
166MB~FP16~
12.1ms~V100~
50.7mAP~coco~
depth_multiple: 1.33
width_multiple: 1.25
## 資料集介紹
本次實驗采用的是VOC2007(Visual Object Classes)和coco128(Common Objects in COntext)的Dataset
* coco128
1. 圖片大小為640*480
2. 只有訓練樣本
3. 樣本數為128張
4. 有提供YOLO專用的TXT檔案(已圈好目標物件區域)
5. **圖一**為YOLO專用的格式檔案,而**圖二**則是原始圖片以下五個值分別是(物件標籤類別,物件所在X軸,物件所在Y軸,物件的寬度以及物件的高度)
6. COCO128總共有80個標籤
> 
圖一:YOLO專用的格式檔

圖二:原始圖片
* VOC2007
1. 圖片大小為460*500
2. 有訓練集(2501張),驗證集(2510張),測試集(4952張)
3. 有提供YOLO專用的TXT檔,也有專門給非YOLO架構下做訓練的VOC格式,檔案格式為XML。
4. 如圖一這是VOC2007測試集第一張的XML檔案而圖二是原始圖片
5. VOC只有20個標籤
>
>圖一:XML檔案
>
>圖二:原始檔案
* COCO2017
1. 圖片大小為640*425
2. 有訓練集(15583張),驗證集(5000張),測試集(40670張)
3. 有提供YOLO專用的TXT檔案(已圈好目標物件區域)
## 模擬步驟
**步驟一**:首先要先把Anaconda環境給建立起來
>下載網址:https://www.anaconda.com/
**步驟二**:安裝好Anaconda后把YOLOV5的模型和預設資料及下載下來
>下載網址: https://github.com/ultralytics/yolov5
**步驟三**:進入到Anaconda界面并且在Environments裏Create一個新的環境并且命名爲YOLOV5
**步驟四**:點選YOLOV5的環境并且進入終端機,利用CD這個指令跳到步驟二已經下載好的YOLOV5資料夾并且輸入**pip install -r requirements.txt**這個指令
**步驟五**:之後需要下載跟自己GPU符合版本的CUDA,查詢方式有兩種方式第一種是透過CMD輸入nvidia-smi之後Enter觀看結果如下圖
上圖為使用CMD查看Cuda版本和驅動器
> 桌面右鍵->Nvidia控制面板->左下角系統資訊->查看NVCUDA64.DLL後面的版本號或者在
> 之後在Google搜尋相關的版本號+cuda toolkit下載即可
> **下載Cuda Toolkit時也需要登錄賬號**
**步驟五**:安裝好之後需要到Pytorch下載符合自己GPU的CUDA環境**Package**的話選擇Conda這樣可以直接帶入到YOLOV5的環境
> 下載網址:https://pytorch.org/get-started/locally/
**步驟六**:安裝好pytorch后需要下載cuDNN這是一個可以加速神經網絡訓練的套件下載好后解壓把裏面的三個文件夾替換到Cuda文件夾裏面即可
> 下載網址:https://developer.nvidia.com/rdp/cudnn-download
> **在下載cuDNN時需要注冊它的官方賬號**
**步驟七**:所有物件都裝好后最後要做的事是把Cuda裏面的Bin、x64和libnvvp放如環境變數裏面如下圖最後三個環境變數
>
**步驟八**:若以上步驟完成后可以回到Anaconda環境裏面點選YOLOV5點選Open with Python之後輸入**import pytorch**之後輸入**torch.cuda.is_available()**.之後點選Enter看回傳值是True還是False,若Cuda已經裝好了正常來説是會回傳結果會是True如**圖一**。
>
圖一:測試Cuda是否以及安裝好
**步驟九**: 打開Anaconda,把當前環境設置為YOLOV5之後安裝Spyder,之後打開Spyder並進入YOLOV5目錄底下的Train.py並且修改496行default=""若有多個GPU都同時具備Cuda的資源則可以在""處填寫0,1,2,3的方式來進行同時訓練。
> 若只有單張GPU訓練的話則default="0"即可,若當下GPU不支援Cuda資源的話Train.py則會讀取CPU來進行訓練下圖是成功案例採取GPU訓練的方式
> 
上圖為成功採取GPU來訓練的方式,若不是使用GPU來訓練的話gpu_mem會是0的狀態。
## 實驗結果
本次實驗由於經過調整參數,所以兩個資料集所訓練的Batch Size和次數也有不同。實際情況如下
* COCO128
1. Epochs次數->300
2. Batch Size->16
3. Image Size->640
4. 純CPU訓練
| coco128 | Precision | Recall | mAP_0.5|
| ------- | --------- | ------ | ---- |
| yolov5n | **0.97389**|0.91654|0.95345|
| yolov5s | 0.95272 |0.95397|0.97143|
| yolov5m | 0.95772 |0.96931|**0.98171**|
| yolov5l | 0.96359 |0.96703|0.97475|
| yolov5x | 0.96628 |**0.97697**|0.9807|
* PASCAL VOC2007
1. Epochs次數->150
2. Batch Size->5
3. Image Size->640
4. 純GPU訓練
| VOC2007 | Precision | Recall | mAP_0.5|
| ------- | --------- | ------ | ---- |
| yolov5n | 0.74623 |0.72401|0.76762|
| yolov5s | 0.79757 |0.78698|0.83264|
| yolov5m | 0.83814 |0.83047|0.87189|
| yolov5l | 0.84924 |0.83360 |0.88126|
| yolov5x | **0.84498** |**0.85323**|**0.89036**|
* COCO2017
1. Epochs次數->150
2. Batch Size->5
3. Image Size->640
4. 純GPU訓練
| COCO2017 | Precision | Recall | mAP_0.5|
| ------- | ---------| ------ | ---- |
| yolov5n | 0.54145 |0.37867|0.39167|
| yolov5s | 0.62039 |0.47545|0.50933|
| yolov5m | 0.6787 |0.54213|0.58474|
| yolov5l | 0.70336 |0.57595|0.62389|
| yolov5x | 0.72501 |0.5973|0.65018|
* pcb焊點分析
1. Epochs次數->200
2. Batch Size->5
3. Image Size->640
4. 純GPU訓練
5. 優化器:Adam
| pcb焊點分析 | Precision | Recall | mAP_0.5|
| ------- | ---------| ------ | ---- |
| yolov5n | 0.92563 |0.82339|0.71876|
| yolov5s | 0.89004 |0.80106|0.67824|
| yolov5m | 0.83781 |0.70602|0.64163|
| yolov5l | 0.85057 |0.69649|0.58745|
| yolov5x | 0.73889 |0.62364|0.50516|
* pcb焊點分析
1. Epochs次數->200
2. Batch Size->5
3. Image Size->640
4. 純GPU訓練
5. 優化器:SGD
| pcb焊點分析 | Precision | Recall | mAP_0.5|
| ------- | ---------| ------ | ---- |
| yolov5n | 0.82275 |0.91335|0.86206|
| yolov5s | 0.85340 |0.92047|0.86761|
| yolov5m | 0.83209 |0.92632|0.87144|
| yolov5l | 0.86320 |0.92420|0.87360|
| yolov5x | 0.86243 |0.90769|0.88277|
* pcb焊點分析(pcb文件夾)
* (訓練集)第0類->張,第一類->張,第二類->214張
* (測試集)第0類->張,第一類->張,第二類->27張
* (測試集)第0類->張,第一類->張,第二類->26張
1. Epochs次數->200
2. Batch Size->5
3. Image Size->640
4. 純GPU訓練
5. 優化器:AdamW
| pcb焊點分析 | Precision | Recall | mAP_0.5|
| ------- | ---------| ------ | ---- |
| yolov5n | 0.82844 |0.83935|0.78852|
| yolov5s | 0.91408 |0.79440|0.69105|
| yolov5m | 0.83904 |0.81452|0.67806|
| yolov5l | 0.84321 |0.67561|0.64877|
| yolov5x | 0.77097 |0.55911|0.46536|
* pcb焊點分析(pcb4文件夾)
* (訓練集)第0類->127張,第一類->111張,第二類->133張,第三類->96,第四類->98,第五類->140張=10616張
* (驗證集)第0類->48張,第一類->64張,第二類->63張,第三類->79,第四類->62,第五類->79張=696張
1. Epochs次數->200
2. Batch Size->6
3. Image Size->640
4. 純GPU訓練
5. 優化器:SGD
6. 訓練集有進行資料强化(裁剪(crop)成600*600,旋轉90°,旋轉270°)
7. 训练集数目:8534, 验证集数目:1066,测试集数目:1068 (8:1:1)
>資料集->https://github.com/Ixiaohuihuihui/Tiny-Defect-Detection-for-PCB/blob/master/README.md 0.93:0.07(訓練:測試)
>測試集以及驗證集->https://universe.roboflow.com/srtimagedefectdetection-wuadb/pcb-defect-detection-hdqc8
第三個測試用的datasets準確度
第三個測試用的datasets資料强化和前處理
>標簽類別
>0:missing hole
1:mouse bite
2:open circuit
3:short
4:spur
5:spurious_copper
## 結論
* 在使用GPU方面來説,由於YOLOV5在訓練的時候會預先讀取已經具備cuda的顯卡,若該顯卡不具備有Cuda功能的話則會預設使用CPU去做訓練。
* 對於GPU而言,YOLOV5對於GPU所需的性能需要非常强大。儘管是本次使用所使用的**nvidia quadro rtx 3000 with max-q**顯卡在加載訓練集和驗證集的時間相對於CPU來說慢了非常多的速度。官方所使用的是專門用來進行深度學習的機器**NVIDIA A100 TENSOR CORE GPU**這部機器的特點是它最高極限有80GB的顯卡内存可以做訓練。
* 若想使用自身GPU來訓練YOLOV5的話可以采取以下幾種方法來加速訓練方式
1:把Batch Size和Epoch降低
2:把需要訓練的圖片大小進行縮小
3:使用多張GPU來進行同步訓練**需要該GPU都同時具備cuda的功能**
4 : 樹莓派/Jetson Nano
## 記錄區
## 深度學習之術語
**舉例子以狗和貓的照片來説**
TP(True Positive)=狗的照片正確識別為狗
FP(False Positive)=狗的照片錯誤被識別為貓
FN(False Negative)=狗的照片沒有被識別出來,系統錯誤認定那些是貓
TN(True Negative)=狗的照片沒有被識別出來,系統正確認定那些是狗
準確率(Accuracy)=(tp+tn)/(tp+fp+fn+tn)
Precision=TP/(TP+FP)
> 即陽性的樣本中有幾個是預測正確的。
>
Recall=TP/(TP+FN)
> 即事實為真的樣本中有幾個是預測正確的。
F1=2 / ( (1/ Precision) + (1/ Recall) )
> 即精確率與召回率的調和平均數。
>
IOU(intersection over union)=兩個物件的重疊/交集比例,從下公式和下圖可以明顯得知,
Overlap=交集
Union=聯集
IOU的輸入
1:ground-truth的bounding box
2:预测的bounding box
IOU的输出为值在[0,1]之间的数字


### YOLOV5之架構術語記錄筆記
## FPN
FPN(feature pyramid networks)低層的特徵語義信息比較少,但是目標位置準確;高層的特徵語義信息比較豐富,但是目標位置比較粗略。另外雖然也有些演算法採用多尺度特徵融合的方式,但是一般是採用融合後的特徵做預測,而本文不一樣的地方在於預測是在不同特徵層獨立進行的。
(a)圖像金字塔,即將圖像做成不同的scale,然後不同scale的圖像生成對應的不同scale的特徵。這種方法的缺點在於增加了時間成本。有些演算法會在測試時候採用圖像金字塔。
(b)像SPP net,Fast RCNN,Faster RCNN是採用這種方式,即僅採用網路最後一層的特徵。
(c)像SSD(Single Shot Detector)採用這種多尺度特徵融合的方式,沒有上採樣過程,即從網路不同層抽取不同尺度的特徵做預測,這種方式不會增加額外的計算量。作者認為SSD演算法中沒有用到足夠低層的特徵(在SSD中,最低層的特徵是VGG網路的conv4_3),而在作者看來足夠低層的特徵對於檢測小物體是很有幫助的。
(d)頂層特徵通過上採樣和低層特徵做融合,而且每層都是獨立預測的。
## 模型架構&模組記錄筆記
## PANet架構 
PANet大致上可以分爲以下四個模組爲主
a:FPN主要網絡架構
b:Bottom-Up Path Augmentation-
c:Adaptive Feature Pooling-
e:Fully-Connected Fusion-
## Focus模組
以Yolov5s的結構為例,原始608 x 608 x 3的圖像輸入Focus結構,采用切片操作,先變成304 x 304 x 12的特征圖,再經過一次32個卷積核的卷積操作,最終變成
304 x 304 x 32的特征圖。
yolov5s架構圖


## 圖表結構之記錄筆記
**下圖都是以yolov5n_result_VOC裏的檔案圖爲例子**
**confusion_matrix**
模糊矩陣能對分類問題的預測結果進行總結,顯示了分類模型的在進行預測時會對哪一部分產生混淆。

**F1 Score**
主要是用來作爲分類問題的一個指標,是Precision和Recall的調整平均數,最大為1,最小為0,1是最好,0是最差
Confidence是用來表示這個物件是否為一個物件的信心程度

**P_curve**

**PR_curve**

**R_curve**

**result**

1. train/box_loss=YOLO V5使用 GIOU Loss作為bounding box的損失,Box推測為GIoU損失函數均值,越小方框越準。
2. train/obj_loss=推測為目標檢測loss均值,越小目標檢測越準。
3. train/cls_loss(classification_loss)=推測為分類loss均值,越小分類越準。
4. precision=精準度(找到正確的目標/所有找到的目標)
5. recall=真實為positive的準確率,即正樣本有多少被找出來了(召回了多少).Recall從真實結果角度出發,描述了測試集中的真實正例有多少被二分類器挑選了出來,即真實的正例有多少被該二分類器召回。
6. val/box_loss=驗證集bounding box損失。
7. val/obj_loss=驗證集目標檢測loss均值。
8. val/cls_loss=驗證集分類loss均值。
9. mAP_0.5=
10. mAP_0.5:0.95=表示在不同IoU閾值(從0.5到0.95,步長0.05)(0.5、0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均mAP
## 資料集設計
### 利用Python搭配bing_image_downloader批量下載圖片
1:先pip3 install bing_image_downloader 安裝套件
2:開啓一個Python寫入以下程式
```python=
from bing_image_downloader import downloader
downloader.download("cat", limit=200, output_dir='dataset',
adult_filter_off=True, force_replace=False, timeout=60)
```
**第一個""是要搜尋的關鍵字**
**Limit是限制要下載多少張**
**樹莓派版本 torch=1.8.0 torchvision=0.9.1 因爲torchvision只有在0.9.1開始支援archlinux**
>樹莓派環境4b 64bit os
## 超參數設定(Hyperparameter)
# 雜項
1:https://ithelp.ithome.com.tw/articles/10220716
2:https://github.com/soumilshah1995/GoogleImageDownloader/blob/master/googleimagedownloader/googleimagedownloader.py
3:https://pypi.org/project/bing-image-downloader/
4:https://blog.csdn.net/briblue/article/details/91366128
5:https://sa123.cc/1tnt6hpe1awo7p7shbsr.html
# 論文引用
1. 全球搶用的物件偵測演算法上線 最神速精準 一眼揪出你有沒有超速!取自https://newsletter.sinica.edu.tw/22279/。
2. 在視覺辨識方案中,什麼是機器學習? 與傳統作法有什麼差別?取自https://www.urvisiontw.com/article_detail/19.htm
3. 深度學習: 物件偵測上的模型結構變化取自https://chih-sheng-huang821.medium.com/深度學習-物件偵測上的模型結構變化-e23fd928ee59
4. Zhengxia Zou(2019), Zhenwei Shi, Member, IEEE, Yuhong Guo, and Jieping Ye , Senior Member, IEEE 。Object Detection in 20 Years: A Survey。取自https://arxiv.org/pdf/1905.05055.pdf%C2%A0%EF%BC%88PS。
5. AlexNet取自https://en.wikipedia.org/wiki/AlexNet。
6. RELU取自https://zh.wikipedia.org/zh-tw/%E7%BA%BF%E6%80%A7%E6%95%B4%E6%B5%81%E5%87%BD%E6%95%B0。
7. Tausif Diwan(2022),G. Anirudh ,Jitendra V. Tembhurne。Object detection using YOLO: challenges, architectural
successors, datasets and applications。取自https://link.springer.com/article/10.1007/s11042-022-13644-y。
8. Borui Jiang(2018),Ruixuan Luo,Jiayuan Mao,Tete Xiao,Yuning Jiang。Acquisition of Localization Confidence for Accurate Object Detection。取自https://arxiv.org/abs/1807.11590
9. Joseph Redmon(2016),Santosh Divvala,Ross Girshick,Ali Farhadi。You Only Look Once: Unified,Real-Time Object Detection。取自https://arxiv.org/abs/1506.02640v5。
10. Venkat Anil Adibhatla(2022),Huan-Chuang Chih,Chi-Chang Hsu,Joseph Cheng,Maysam F. Abbod and Jiann-Shing Shieh。Applying deep learning to defect detection in printed circuit boards via a newest model of you-only-look-once。取自https://www.aimspress.com/article/doi/10.3934/mbe.2021223
11. Wang Hao and Song Zhili(2020)。Improved Mosaic: Algorithms for more Complex Images。取自https://iopscience.iop.org/article/10.1088/17426596/1684/1/012094/meta。
12. yolov5 anchors设置详解。取自https://blog.csdn.net/qq_27278957/article/details/120036450?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-120036450-blog113487612.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-120036450-blog-113487612.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=1。
13. 計算機視覺:目標檢測 先驗框和模型。取自https://zhuanlan.zhihu.com/p/337479794。
14. SR綜述文章閱讀--上采樣--網絡設計。取自https://blog.csdn.net/qq_41332469/article/details/103165773