【目标检测】yolo系列:从yolov1到yolov5之YOLOv5训练自己数据集(v6.0)
一、源碼下載及requirments
源碼下載地址:https://github.com/ultralytics/yolov5 (持續更新中)
本人所用環境如下:
pytorch:1.8(因為cuda版本用了pytorch1.8)
cuda:10.1
Python:3.8
官方要求:Python>=3.6.0 并且PyTorch>=1.7,并通過pip安裝requirements.txte文件。
$ git clone https://github.com/ultralytics/yolov5
$ cd yolov5
$ pip install -r requirements.txt
二、準備自己的數據集
因為學長已經將數據集和標注好的txt文件直接發給了我,所以如何標注數據集這里就不詳細介紹了。
總之就是要把你的圖像數據轉換成yolo.txt文件的形式,就是把將每個xml標注提取bbox信息為txt格式,文件的每一行作為一個目標的信息,從左到右依次是(class, X_center, Y_center, width, height)。
參考如下:https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data#2-create-labels
在yolov5目錄下創建Adata文件夾(名字可以自定義),要注意的是yolov5曾經的版本和最新的不同,最新版本目錄結構要求如下,將之前標注好的txt文件和圖片劃分為訓練集和驗證集后放到對應目錄下:
- Adata
- images # 存放圖片
- train # 存放訓練集圖片
- val #存放驗證集圖片
- labels # 存放圖片對應的yolo_txt文件
- train # 存放訓練集標注好的文件
- val #存放驗證集標注好的文件
- images # 存放圖片
trainval = random.sample(list_index, num * trainval_percent)
三、配置文件
yolov5是個集成好的目標檢測框架,根據自己整理好的數據集來修改其中配置。
1. 數據集的配置
在yolov5目錄下的data文件夾下新建一個c.yaml文件(可以自定義命名),用來存放訓練集和驗證集的劃分文件(train和val文件夾的路徑),這兩個文件夾就是通過我們上述標注和劃分得到的,然后是目標的類別數目nc和具體類別名列表names,c.yaml內容如下(可以參考官方數據集data/coco128.yaml的格式):
2. 預訓練模型的配置
預訓練模型主要是先驗框和權重文件的配置。
最新版的yolov5會自動使用kmeans算出anchors的取值。如果想要自己生成先驗框可使用kmeans算法聚類生成新anchors。
選擇一個你需要的模型,在yolov5目錄的model文件夾下是模型的配置文件,v6.0版本為我們提供n、s、m、l、x五個版本,模型架構的增大,模型也更為復雜,訓練時間也會增大。我這里采用了yolov5m.yaml,只用修改nc為自己的類別數。
如果anchors是重新生成的,也需要修改,根據anchors.txt 中的 Best Anchors 修改。
如下面一個例子:
上圖中的參數解釋如下:
- nc:類別數目。
- depth_multiple / width_multiple:通過兩個參數來進行控制網絡的深度和寬度。
- backbone:網絡結構定義。
- anchors:yolov5中默認保存了一些針對官方coco數據集的預設錨定框,在 yolov5 的配置文件*.yaml 中已經預設了640×640圖像大小下錨定框的尺寸,但yolov5 中不是只使用默認錨定框,在開始訓練之前會對數據集中標注信息進行核查,計算此數據集標注信息針對默認錨定框的最佳召回率,當最佳召回率大于或等于0.98,則不需要更新錨定框;如果最佳召回率小于0.98,則需要重新進行K-means聚類計算得到符合此數據集的錨定框anchors。
anchors參數共有三行,每行9個數值,且每一行代表應用不同的特征圖:第一行是在最大的特征圖上的錨框;第二行是在中間的特征圖上的錨框;第三行是在最小的特征圖上的錨框。
在目標檢測任務中,一般希望在大的特征圖上去檢測小目標,因為大特征圖才含有更多小目標信息,因此大特征圖上的anchor數值通常設置為小數值,而小特征圖上數值設置為大數值檢測大的目標。
至此,配置已經定義完成,然后就是訓練模型。
三、訓練模型
3.1 模型訓練
在train.py中進行如下幾個參數的修改:
部分以上參數解釋如下:
- weights:加載的權重文件的路徑(預訓練模型的權重文件會在訓練前自動下載并加載)
- cfg:模型配置文件,backbone網絡結構等內容
順便說一句,我看了一下yolo.py的源碼,發現yolov5是把配置模型文件加載進去,然后解析模型的網絡結構并構建。(也就是說你可以自己定義backbone,當然如果你有能力你的性能超過它!!!哈哈哈) - data:數據集配置文件的路徑
- hyp:超參數文件的路徑(后面調參可能會用)
- epochs:訓練總輪次(默認300)
- batch-size:批次大小(看你自己電腦運行能力)
- evolve:是否進行超參數進化,默認False
- device:訓練的設備,cpu;0(表示一個gpu設備cuda:0);0,1,2,3(多個gpu設備)
主要用到的參數如上。然后去進行訓練。
#前臺運行
python train.py --device '0' # 0號GPU
# 如果上述參數的default都已經輸入可以不用帶--后綴參數#后臺運行
nohup python -u train.py > log_t.txt 2>&1
根據自己的硬件配置修改參數,訓練好的模型會被保存在yolov5目錄下的runs/exp/weights/last.pt和best.pt,(多次訓練會保存為exp2.3.4等形式),詳細訓練數據和結果圖會保存在runs/exp/文件中,包括confusion_matrix(混合矩陣)、f1-score、設置的超參數等等,可以詳細看看來判斷模型的表現。
我通過查看log文件發現,yolov5最新版會在訓練的最后自動進行驗證,所以可以直接通過驗證后的模型表現來進行相應的調參。
log文件如下:
3.3 訓練可視化
利用tensorboard可視化訓練過程,執行下列命令,可以打開tensorboard的相關網站查看即時的訓練日志。(圖忘截屏了,大家打開之后可以自己體會哈,有各種指標的變化,包含精度率,召回率,mAP等)
tensorboard --logdir=runs
四、模型驗證
看了一些博客和教程,發現最新版的yolov5已經沒有了test.py,而變成了val.py。
評估模型好壞就是在有標注的測試集或者驗證集上進行模型效果的評估,在目標檢測中最常使用的評估指標為mAP。
在val.py文件中指定數據集配置文件和訓練結果模型,將訓練生成的最優權重路徑導入模型,進行驗證,如下所示:
運行代碼和訓練一樣:
#前臺運行
python val.py --device '0' # 0號GPU
# 如果上述參數的default都已經輸入可以不用帶--后綴參數#后臺運行
nohup python -u val.py > log_v.txt 2>&1
調參在data/hyps下的hyp.finetune.yaml或者hyp.scratch.yaml進行超參數調優,可自行選擇,hyp.scratch.yaml是針對官方給出的coco數據集最優化的參數。(我這里因為模型在我的數據集上表現的非常好,所以沒有進行長時間調參)
五、模型推理
最后,模型在沒有標注的數據集上進行推理,在detect.py文件中指定數據圖片和模型的路徑,其他參數(置信度object confidence threshold、交并比IOU threshold for NMS、save_txt選項用于生成結果的txt標注文件等),如下:
推理完畢后,在runs文件夾下會生成detect文件夾,其中會生成數據集的檢測信息以及目標框的置信比。如果不指定save_txt則只會生成結果圖像,如果指定了save_txt,每個txt會生成一行一個目標的信息,信息包括(class, xcenter, ycenter, w, h),后面四個為bbox位置,均為歸一化數值。
總結
YOLOv5訓練自己的數據集整個過程:制作數據集----模型訓練----模型驗證----模型推理階段已全部完成。
總結
以上是生活随笔為你收集整理的【目标检测】yolo系列:从yolov1到yolov5之YOLOv5训练自己数据集(v6.0)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成语接龙下笑成章下一句是什么呢?
- 下一篇: 【目标检测】yolo系列:从yolov1