寫在前面
我本來是使用這個模型進行手寫簽名的定位,但是因為比賽的主辦方原因,數(shù)據(jù)不允許公開,所以我使用動物世界的一段開頭視屏來制作我的數(shù)據(jù)集。這整個模型跑通的過程中,我參考了很多不錯的博客,寫這篇博客的原因是記錄一下我的所見所感。我的模型是在移動九天的平臺上跑的。本文參考的博客如下:
YOLOv5訓(xùn)練自己的數(shù)據(jù)集(超詳細完整版)
目標檢測—教你利用yolov5訓(xùn)練自己的目標檢測模型
寫這篇文章的目的是為了能給大家一些建議,也是為了記錄一下自己的成長。
1.環(huán)境
識別模型有很多,但是目前比較實用的是YOLOV5,是一個國外的公司做的,比較好用。這是github的鏈接
萬事開頭難,我認為一個模型只要環(huán)境搭好了,模型就成功了90%。但是好在YOLOv5所需要的各種庫都是比較熱門的,沒有各種坑,(此文主要給大家增加信心)所以我覺得環(huán)境是很好配的。
這里還是先建議大家創(chuàng)建虛擬環(huán)境,我是在服務(wù)器上跑的就沒有創(chuàng)建。創(chuàng)建虛擬環(huán)境的教程,然后激活自己的虛擬環(huán)境就可以了。這里就不得不說服務(wù)器是真香。
YOLOv5的項目里面已經(jīng)寫好我們需要的環(huán)境,在requirements.txt中,所以我們只需要將github的代碼拉到本地,然后一條命令就可以安裝好:
pip install -r requirements.txt
我在服務(wù)器上跑的給大家演示:
出現(xiàn)上面的東西就大致OK了
接下來可以直接運行train.py檢驗自己的環(huán)境有沒有配好,我認為這一步是很重要的,當我看到模型可以跑通的時候,給了我極大的信心。
如果直接運行,使用的數(shù)據(jù)集是默認的coco128第一次需要從官網(wǎng)上下載,然后就可以使用了,如果出現(xiàn)了epoch如上圖所示,就說明模型已經(jīng)開始訓(xùn)練了,環(huán)境已經(jīng)配好了。也就是說以后都不用為這個模型的環(huán)境擔(dān)憂了,恭喜邁出了一大步。
如果告訴你缺少包,缺啥就pip install 啥就行了,一般不會報錯。
在運行成功后就可以制作自己的數(shù)據(jù)集準備訓(xùn)練了。
2.制作自己的數(shù)據(jù)集
2.1 視頻轉(zhuǎn)圖片
在這一小節(jié),我們需要把視頻進行逐幀處理,轉(zhuǎn)化為圖片,便于我們最終制作的數(shù)據(jù)集。這里我使用的是vedio_to_pictures
這個代碼,程序會放到下面的附錄里面。程序的主要作用就是將圖片逐幀處理成一張一張的圖片,并保存到當前目錄下的allimages文件夾下。
我視頻的基本信息是:
我是使用QQ自帶的錄屏錄制的b站上一段視頻(或者是其他網(wǎng)站上的,具體記不清了),得到的幀率是19.58幀每秒,總時長是69秒。所以得到圖片數(shù)大約是19.58*69=1351張,最終我使用圖片處理得到的圖片是1357張,如下,大致符合。
大家可以根據(jù)得到的圖片挑選一些圖片制作自己的數(shù)據(jù)集,因為我最終使用了45張圖片來制作我自己的數(shù)據(jù)集,所以我是手動挑選的。大家可以寫一個隨機函數(shù)自動挑選。
2.2 標注圖片制作標準數(shù)據(jù)集
這一節(jié)是將上面得到的45張圖片進行標注,制作成YOLO能夠訓(xùn)練的數(shù)據(jù)集的標準樣式。
標準數(shù)據(jù)集的樣子
首先看一下YOLO數(shù)據(jù)集的格式是物體的類別編號,x,y,w,h.
拿第一條數(shù)據(jù)來舉例,比如:
0 0.21584984358706988 0.5041743970315399 0.11678832116788321 0.10296846011131726
第一個0是指此類對象的編碼,這個當你標注完對象之后,就會自動的進行編號。后面的坐標分別表示目標的中心坐標和目標的寬和高,這里的寬和高是歸一化之后的寬和高。
用labelImg標注自己的數(shù)據(jù)集
任何一款圖像標注軟件都是可以進行標注的,這里我選擇的時候LabelImg(以上附有安裝教程).標注的格式我這里選擇的是voc格式(下圖左邊所示),后期會用代碼將voc格式轉(zhuǎn)化成YOLO格式,沒有直接選擇YOLO格式的原因是,我的labelImgYOLO格式標出來不是標準的,可能是我安裝的版本太老的原因,也有同學(xué)是直接使用YOLO格式標注的,大家也可以進行嘗試。
這里標注的時候有一些小技巧,比如提前更改要標注的類別、自動保存,一些快捷鍵,w鍵可以快速起框,d鍵切換下一張等等,記得要設(shè)置保存的文件夾。大家可以搜一下。
標注完成之后,voc得到的是xml文件。我這里是這樣的
在這里進行一個格式的轉(zhuǎn)化。
首先在YOLOv5文件夾下面新建一個data文件夾,我這里命名是hanzi_data:
然后在hanzi_data文件夾下面分別創(chuàng)建images文件夾(名字不可以更改)和Annotations文件夾,一個存放你要訓(xùn)練的圖片,也就是我們標注的圖片,一個存放我們的xml文件。 如下所示:
劃分訓(xùn)練集、測試集和驗證集
接下來進行劃分訓(xùn)練集、測試集合驗證集。這里是運行代碼split_train_val.py
得到的,后面會給出連接,如果你的文件夾有改動,代碼相應(yīng)的修改
如果運行結(jié)果的文件夾沒有修改的話,運行完成之后就會出現(xiàn)一個新的文件夾ImageSets。這里我們運行結(jié)果如下:
打開文件夾里面有個main文件夾,然后里面有test、train、trainval和val四個txt文件,里面都是圖片的名稱,沒有后綴。我這里有個不速之客,是我的代碼存放的問題,一般不會有,我這里直接刪除即可。
XML格式轉(zhuǎn)yolo_txt格式
這里是運行text_to_yolo.py
,然后就可以得到dataSet_path文件夾和labels文件夾,如下所示:
dataSet_path文件夾里面的三個txt分別存放的是你自己訓(xùn)練集、驗證集、測試集的路徑。
此時的label文件夾下的txt數(shù)據(jù)也是標準的YOLO模式,如下所示:
至此數(shù)據(jù)集制作完成,接下來準備訓(xùn)練啦。
建立自己的配置文件
在 yolov5 目錄下的 data 文件夾下 新建一個 myvoc.yaml文件(可以自定義命名),用記事本打開。
內(nèi)容是:
訓(xùn)練集以及驗證集(train.txt和val.txt)的路徑(可以改為相對路徑)
以及目標的類別數(shù)目和類別名稱。
3.模型的訓(xùn)練
更改模型配置
選擇一個模型,在yolov5目錄下的model文件夾下是模型的配置文件,有n、s、m、l、x版本,模型依次復(fù)雜,權(quán)重依次增多,訓(xùn)練的時間的也依次增加。
這里我選擇的是yolov5s,然后進行更改,如下所示:
開始訓(xùn)練
python train.py --weights weights/yolov5s.pt --cfg models/yolov5s.yaml --data data/myvoc.yaml --epoch 200 --batch-size 8
–weights 自己權(quán)重的路徑,看自己的yolov5s.pt所在的位置,你也許需要更改。
–cfg 模型配置的路徑,也就是上一步更改的那個模型配置。
–data 是制作自己的數(shù)據(jù)集的時候建立自己配置文件的路徑。
–epoch 訓(xùn)練的輪數(shù)
–batch-size 一次訓(xùn)練喂進去的照片數(shù)量,電腦配置不好就改小一點。
訓(xùn)練過程
在訓(xùn)練的過程中會打印訓(xùn)練結(jié)果存儲的位置,一般保存在runs/train/下最新的exp文件夾里面
我的訓(xùn)練好的模型存放在了runs/train/exp22下面
除此之外訓(xùn)練的exp下面還有你訓(xùn)練過程的圖片:
里面還有一些其他的訓(xùn)練過程的圖片:
R_curve 召回率Recall和置信度confidence之間的關(guān)系。
PR_curve PR曲線中的P代表的是Precision(精準率),R代表的是Recall(召回率),其代表的是精準率與召回率的關(guān)系.一般情況下,將recall設(shè)置為橫坐標,precision設(shè)置為縱坐標。PR曲線下圍成的面積即AP,所有類別AP平均值即map。AP值是衡量目標檢測模型分類器性能優(yōu)劣的重要評估指標,AP值越大則分類器性能越好,越小則分類器性能越差。
P_curve 精確率Precision和置信度confidence的關(guān)系圖.
F1_curve 數(shù)學(xué)定義為 F1分數(shù),又稱為平衡F分數(shù),它被定義為正確率和召回率的調(diào)和平均數(shù).
confusion_matrix 指的是混淆矩陣.
模型檢測
模型檢測的代碼如下:
python detect.py --weights runs/train/exp/weights/best.pt --source ../data/video/animal.mp4
–weights 權(quán)重存放的位置
–source 你要檢測的東西。支持圖片,文件夾,視頻和攝像頭
這里我測試的是test_data下面的Animal.mp4
可以看到在跑視頻的時候,他是一幀一幀的圖像處理的,這就體現(xiàn)出他快的特性。
最后會保存到runs/detect/exp里面,如下所示
最終我的結(jié)果如下所示:
YOLO演示
模型到這里基本就結(jié)束了,遇到問題不要著急,機器是不會壞的,多嘗試幾次總是可以的。
4 相關(guān)問題
訓(xùn)練緩存
在訓(xùn)練的時候也會生成數(shù)據(jù)緩存,在你的hanzi_data/dataSet_path文件夾下面,如果后面需要再次訓(xùn)練,可能需要刪除一下。(我不刪也沒事)
訓(xùn)練時間
我的數(shù)據(jù)是45張圖片,使用了GPU,200個epochs大概訓(xùn)練了25分鐘。
文章來源:http://www.zghlxwxcb.cn/news/detail-430621.html
代碼附錄
vedio_to_pictures
split_train_val.py
text_to_yolo.py文章來源地址http://www.zghlxwxcb.cn/news/detail-430621.html
到了這里,關(guān)于YOLOv5訓(xùn)練自己的數(shù)據(jù)集實現(xiàn)視頻的識別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!