最近,Ultralytics推出了YOLOv5,但它的名字卻引發了爭議。為了了解背景,《YOLO》(你只能看一次)的前三個版本是由約瑟夫·雷蒙(Joseph Redmon)創作的。在此之後,Alexey Bochkovskiy在darknet上創建了YOLOv4,號稱比之前的迭代具有更高的平均精度(AP)和更快的結果。
現在,Ultralytics已經發布了YOLOv5,具有可比的AP和比YOLOv4更快的推斷時間。這就產生了許多疑問:新版本是否保證了與YOLOv4相似的準確性?無論答案是什麼,這絕對是目標檢測界發展速度的一個標誌。
自從他們第一次移植YOLOv3以來,Ultralytics就使得使用Pytorch創建和部署模型變得非常簡單,所以我很想嘗試YOLOv5。事實證明,Ultralytics 進一步簡化了這個過程,結果不言自明。
在本文中,我們不探討YOLOv5這個名字是否正規,我們只使用YOLOv5創建一個檢測模型,從創建數據集和注釋到使用它們出色的庫進行訓練和推斷。這篇文章主要關注YOLOv5的實現,包括:
創建數據集注釋圖像數據創建項目結構訓練YOLOv5創建自定義數據集
使用OIDv4下載圖片:
要從開放的數據集下載圖像,我們首先克隆OIDv4_ToolKit並安裝依賴。
git clone github /EscVM/OIDv4_ToolKit cd OIDv4_ToolKit pip install -r requirements.txt
我們現在可以使用這個文件夾中的main.py腳本來下載圖像以及多個類的標籤。
下面我正在下載板球和足球的數據來創建我們的自定義數據集。也就是說,我們將創建一個包含足球和板球的數據集,而學習任務就是檢測這些球。
python3 main.py downloader --classes Cricket_ball Football --type_csv all -y --limit 500
下面的命令創建一個名為「OID」的目錄,其結構如下:
OID目錄結構。我們將只使用這裡的圖像文件(.jpgs),而不使用我們將手動注釋以創建自定義數據集的標籤,儘管我們可以在不同項目需要時使用它們。
在繼續之前,我們需要將所有圖像複製到同一個文件夾中,以便從頭開始標記練習。你可以選擇手動完成,但這也可以快速完成通過遞歸glob函數:
import os from glob import globos.system("mkdir Images") images = glob(r'OID/**/*.jpg', recursive=True) for img in images: os.system(f"cp {img} Images/")
使用HyperLabel標籤圖像
我們將使用一個名為Hyperlabel的工具來標記圖像。過去,我使用過很多工具來創建注釋,比如labelimg、labelbox等,但從來沒有遇到過這麼簡單、這麼開源的工具。唯一的缺點是你不能在Linux上使用這個工具,只能在Mac和Windows上使用,但我想這對我們大多數人來說是可以的。
創建項目
2,設置標籤
3。添加本地圖像數據源
4。標註
這個工具最好的部分是它提供的各種輸出格式。因為我們想要得到Yolo的數據,我們將使用Yolo格式並在注釋完成後導出它。但是如果希望獲得JSON格式(COCO)或XML格式(Pascal VOC)的注釋,也可以選擇使用這個工具。
以Yolo格式導出實際上為我們的每個圖像創建了一個.txt文件,其中包含圖像的classid、xcenter、ycenter、寬度和高度。它還創建了一個名為obj.names的文件,這有助於將classid映射到類名。例如:
注意,注釋文件中的坐標從0到1。另外,請注意,根據obj.names文件(從0開始),class_id對於板球是0,對於足球是1。我們還使用它創建了一些其他文件,但在本例中不會使用它們。
一旦我們完成了這些操作,我們就基本上建立了自定義數據集,並且只需要重新安排這些文件中的一些,以便在以後訓練模型時進行後續的訓練和驗證分割。數據集目前將是一個單獨的文件夾,如下所示,包含圖像和注釋:
dataset - 0027773a6d54b960.jpg - 0027773a6d54b960.txt - 2bded1f9cb587843.jpg - 2bded1f9cb587843.txt -- --
建立項目
為了訓練我們的自定義目標檢測器,我們將使用來自Ultralytics的Yolov5。我們首先克隆存儲庫並安裝依賴項:
git clone github /ultralytics/yolov5 # clone repo cd yolov5 pip install -U -r requirements.txt
然後我們開始創建自己的名為training的文件夾,我們將在其中保存自定義數據集。
!mkdir training
我們首先將自定義數據集文件夾複製到該文件夾中,並使用簡單的trainvalfolder_split創建訓練和驗證文件夾。下面的代碼創建了一些訓練和驗證文件夾,並用圖像填充它們。
import glob, os import random# put your own path here dataset_path = 'dataset'# Percentage of images to be used for the validation set percentage_test = 20!mkdir data !mkdir data/images !mkdir data/labels !mkdir data/images/train !mkdir data/images/valid !mkdir data/labels/train !mkdir data/labels/valid# Populate the folders p = percentage_test/100 for pathAndFilename in glob.iglob(os.path.join(dataset_path, "*.jpg")): title, ext = os.path.splitext(os.path.basename(pathAndFilename)) if random.random() <=p : os.system(f"cp {dataset_path}/{title}.jpg data/images/valid") os.system(f"cp {dataset_path}/{title}.txt data/labels/valid") else: os.system(f"cp {dataset_path}/{title}.jpg data/images/train") os.system(f"cp {dataset_path}/{title}.txt data/labels/train")
運行之後,您的數據文件夾結構應該如下所示。它應該有兩個目錄映像和標籤。
我們現在必須添加兩個配置文件到訓練文件夾:
數據集。我們創建一個文件「dataset」。包含訓練和驗證圖像的路徑以及類。# train and val datasets (image directory or *.txt file with image paths) train: training/data/images/train/ val: training/data/images/valid/# number of classes nc: 2# class names names: ['Cricketball', 'Football']
模型。yaml:在創建網絡時,我們可以使用從小到大的多種模型。例如,yolov5s。yolov5/models目錄中的yaml文件是帶有7M參數的小Yolo模型,而yolov5x。yaml是最大的Yolo型號,有96M Params。對於這個項目,我將使用yolov5l。有50m params的yaml。首先從yolov5/models/yolov5l中複製文件。將yaml轉換到training文件夾,並更改nc,即根據我們的項目需求將類數改為2。# parameters nc: 2 # change number of classes depth_multiple: 1.0 # model depth multiple width_multiple: 1.0 # layer channel multiple
訓練
此時,我們的訓練文件夾看起來如下:
一旦我們完成了上述步驟,我們就可以開始訓練我們的模型了。這和運行下面的命令一樣簡單,在這裡我們提供配置文件和各種其他參數的位置。您可以在train.py文件中查看其他不同的選項,但這些是我認為值得注意的選項。
# Train yolov5l on custom dataset for 300 epochs $ python train.py --img 640 --batch 16 --epochs 300--data training/dataset.yaml --cfg training/yolov5l.yaml --weights ''
有時你可能會得到一個錯誤,PyTorch 1.5版本在這種情況下運行在一個單一的GPU使用:
# Train yolov5l on custom dataset for 300 epochs $ python train.py --img 640 --batch 16 --epochs 300--data training/dataset.yaml --cfg training/yolov5l.yaml --weights '' --device 0
開始訓練之後,可以通過檢查自動創建的filetrainbatch0.jpg和testbatch0_gt.jpg來檢查訓練是否已經設置好,前者包含第一批的訓練標籤,後者包含測試圖像的groundtruth
結果
要查看使用tensorboard在瀏覽器中的localhost:6006上的結果,請在另一個命令行終端中運行此命令
tensorboard --logdir=runs
下面是各種驗證度量。在訓練結束時,這些度量也會保存在一個results.png文件中。
預測
Yolov5提供了很多不同的方法來檢查新數據的結果。
要檢測一些圖像,您可以簡單地將它們放入名為inference/images的文件夾中,然後根據自動運行推斷:
python detect.py --weights weights/best.pt
您也可以在視頻使用detect.py文件進行檢測:
python detect.py --weights weights/best.pt --source inference/videos/messi.mp4 --view-img --output inference/output
在這裡,我指定希望使用- view-img標誌查看輸出,並將輸出存儲在位置推斷/輸出中。這將在這個位置創建一個.mp4文件。令人印象深刻的是,網絡模型可以找到球,在這裡進行推斷的速度,以及從未觀察到的數據令人震驚的準確性。
您還可以通過將——source指定為0來使用webcam作為源。您可以在detect.py文件中查看其他各種選項。
結論
在這篇文章中,我討論了如何使用自定義數據集創建Yolov5對象檢測模型。我喜歡Ultralytics讓創建物體檢測模型變得如此容易。
此外,他們提供的查看模型結果的各種方式使它成為我很久以來看到的一個完整的包。
如果你想親身體驗自定義數據集,你可以在Kaggle上下載注釋數據,在Github上下載代碼。
作者:Rahul Agarwal
deephub翻譯組