YOLOv10沒想到出來的如此之快,作為一名YOLO的愛好者,以YOLOv5和YOLOv8的經驗,打算出一套從數據集裝備->環境配置->訓練->驗證->目標追蹤全系列教程。請大家多多點贊和收藏!!!
YOLOv5和YOLOv8親測全都適用
廢話不多說,直接開搞!!!
1.準備圖片文件
這里也沒什么好說的,關鍵要提一點就是,將所有圖片文件先放入到一個目錄文件夾中,便于后續劃分訓練集,測試集和驗證集,同時不能有重復文件名,每一張圖片最好取一個合適的名字,例如下圖,我的每個圖片前綴fish1
表示來自fish1視頻,后綴000001表示第一幀畫面。圖片文件jpg、png都可以,我這里是.jpg
2.準備labels標簽文件
這里很關鍵,很多同學可能之前用的另外的模型訓練,用的labels是coco格式或者其他格式,但是這里需要統一轉成YOLO格式的labels。
準備一個目錄,準備存放所有的labels標簽文件。如下圖,我的文件夾中已經準備好了所有的標簽文件,可以看到,文件名與上述的圖片文件名是一一對應的,只是這里都是.txt文件。
我們再來看每個txt文件里面到底是什么?下面是我的fish1_000001.txt文件內容:
0 0.441753 0.815461 0.061021 0.042763
0 0.395895 0.759868 0.066198 0.046053
0 0.497781 0.744737 0.060651 0.039474
0 0.575629 0.787171 0.059541 0.042763
0 0.566568 0.727303 0.059911 0.059868
0 0.561206 0.691447 0.058802 0.096053
0 0.523669 0.681908 0.054734 0.042763
0 0.549741 0.648355 0.061760 0.038816
0 0.622411 0.646382 0.051775 0.069079
0 0.700999 0.786184 0.056583 0.080263
0 0.688425 0.724671 0.041050 0.091447
0 0.679734 0.651974 0.062870 0.040789
0 0.669009 0.602632 0.044379 0.053947
0 0.614645 0.605263 0.049556 0.040789
0 0.568047 0.573355 0.049556 0.051974
0 0.529216 0.597697 0.052515 0.057237
0 0.470969 0.637171 0.057322 0.061184
0 0.452663 0.610197 0.063609 0.050658
0 0.396820 0.694408 0.054734 0.055921
0 0.340843 0.636322 0.053254 0.044737
0 0.280325 0.584211 0.051775 0.046053
0 0.346339 0.583553 0.057322 0.048684
0 0.711169 0.438158 0.024408 0.080263
0 0.681583 0.399342 0.023669 0.063158
0 0.367973 0.515132 0.036243 0.076316
0 0.353365 0.551645 0.042530 0.050658
0 0.296783 0.542763 0.029956 0.082895
0 0.249815 0.515461 0.024038 0.075658
0 0.286612 0.434868 0.035503 0.075000
0 0.286428 0.404276 0.019601 0.059868
0 0.375899 0.377303 0.040680 0.059868
0 0.560466 0.312171 0.030695 0.053289
0 0.538092 0.280592 0.011095 0.034868
0 0.543454 0.226316 0.028476 0.040789
0 0.357618 0.301974 0.017751 0.061842
0 0.386280 0.271711 0.037352 0.032895
0 0.397374 0.195395 0.040311 0.030263
0 0.280695 0.127632 0.035503 0.044737
0 0.338203 0.103289 0.041050 0.032895
0 0.405141 0.130263 0.043269 0.028947
0 0.429364 0.150987 0.043639 0.032237
0 0.429179 0.469079 0.038831 0.077632
0 0.427885 0.563158 0.048077 0.061842
0 0.482618 0.563487 0.064349 0.037500
0 0.551960 0.517105 0.051405 0.061842
0 0.549001 0.501316 0.040311 0.035526
0 0.718565 0.525329 0.028107 0.083553
0 0.655695 0.468750 0.023669 0.082237
0 0.697115 0.466776 0.025148 0.078289
0 0.526759 0.414306 0.034834 0.074178
0 0.533284 0.438158 0.039941 0.088158
0 0.506102 0.464145 0.029956 0.086184
0 0.477905 0.518336 0.045632 0.035868
0 0.387759 0.472039 0.049186 0.050658
0 0.381074 0.085451 0.036084 0.032638
0 0.394362 0.080737 0.032274 0.035539
0 0.323364 0.128533 0.037740 0.021592
0 0.435300 0.400431 0.040496 0.046112
0 0.372879 0.218283 0.038384 0.046645
0 0.337794 0.199641 0.031705 0.033257
0 0.291575 0.334826 0.022722 0.063849
0 0.245625 0.194227 0.015614 0.058296
0 0.644136 0.353197 0.014138 0.071395
0 0.589170 0.371263 0.016498 0.079026
0 0.627219 0.565461 0.063609 0.044079
0 0.626233 0.482260 0.031350 0.051836
0 0.630899 0.382102 0.019793 0.078401
0 0.561601 0.367086 0.024320 0.070987
0 0.585442 0.457530 0.034834 0.066480
0 0.255194 0.422036 0.016150 0.083941
0 0.314734 0.420063 0.017419 0.091270
0 0.268748 0.304063 0.033887 0.059151
0 0.266533 0.270260 0.033251 0.067046
0 0.326387 0.277299 0.022485 0.063099
0 0.318628 0.231951 0.022167 0.060283
0 0.258423 0.212891 0.034530 0.047336
0 0.274588 0.165941 0.032992 0.045776
0 0.358741 0.198010 0.014479 0.047928
0 0.367082 0.158563 0.041420 0.032928
0 0.601516 0.529605 0.061021 0.040789
0 0.301596 0.261954 0.022874 0.055553
0 0.312095 0.159832 0.032837 0.040757
0 0.334209 0.162372 0.036901 0.040559
0 0.367411 0.122694 0.033750 0.026086
0 0.411428 0.278618 0.014423 0.037500
0 0.389238 0.328289 0.026257 0.056579
可以看到里面是一行一行的數據組成,那么每行數據的每個數據分別表示什么意思呢?
以第一行數據0 0.441753 0.815461 0.061021 0.042763
為例,第一個0表示目標框框住物體的類別,我的數據集中只有魚一個類別,因此都是每一行的第一個數據都是0,如果你自己的數據集有四類,假設有貓,狗,人,魚,那么你可以將0-貓,1-狗,2-人,3-魚。
再看后面幾個小數, 0.441753 0.815461
表示的目標框的中心點,0.061021 0.042763
表示的是目標框的長和寬。這里又有同學要問了,為什么中心點和長寬都是小數?這就和YOLO創始人定義的labels格式有關了,這是人家定義的規則,我們照著做就行。那么具體是什么規則呢?
解釋如下:
因此請各位自己根據自己標注的目標框轉換成對應的YOLO目標框格式數據。上述我的該label文件中有87行數據,表示的是這一張圖片中有87個目標框,每個目標框對應的類別都是0-魚。如果有不知道如何轉數據的同學,點贊收藏該博客然后關注我私聊,單獨一對一教學
3.按比例劃分數據集
在各位同學按照前三步準備好了圖片和labels標簽的前提下,按照YOLO系列的官方推薦比例訓練集:驗證集:測試集=7:2:1劃分。
首先提前定義好存放訓練集、驗證集和測試集的空文件夾:
文件夾目錄如下:
train、valid和test目錄中都是如下結構:
提供以下腳本:
import os
import random
import shutil# 設置目錄路徑
image_dir = 'D:/ModelsDatas/test/allimgs' # 改成你自己的原圖片目錄
label_dir = 'D:/ModelsDatas/test/alllables' # 改成你自己的原標簽目錄# 獲取圖片和txt文件列表
images = os.listdir(image_dir)
labels = os.listdir(label_dir)# 隨機打亂圖片列表
random.shuffle(images)# 計算訓練集、驗證集和測試集的數量
total_images = len(images)
train_count = int(total_images * 0.7)
val_count = int(total_images * 0.2)
test_count = total_images - train_count - val_count# 分配文件到訓練集、驗證集和測試集
train_images = images[:train_count]
val_images = images[train_count:train_count + val_count]
test_images = images[train_count + val_count:]# 移動文件到對應的目錄
for image in train_images:# 移動圖片和標簽到訓練集目錄shutil.move(os.path.join(image_dir, image), 'D:/ModelsDatas/YOLO_datasets/train/images') # 請改成你自己的訓練集存放圖片的文件夾目錄shutil.move(os.path.join(label_dir, image[:-4]+'.txt'), 'D:/ModelsDatas/YOLO_datasets/train/labels')# 請改成你自己的訓練集存放標簽的文件夾目錄for image in val_images:# 移動圖片和標簽到驗證集目錄shutil.move(os.path.join(image_dir, image), 'D:/ModelsDatas/YOLO_datasets/valid/images')# 請改成你自己的驗證集存放圖片的文件夾目錄shutil.move(os.path.join(label_dir, image[:-4] + '.txt'), 'D:/ModelsDatas/YOLO_datasets/valid/labels')# 請改成你自己的驗證集存放標簽的文件夾目錄for image in test_images:# 移動圖片和標簽到測試集目錄shutil.move(os.path.join(image_dir, image), 'D:/ModelsDatas/YOLO_datasets/test/images')# 請改成你自己的測試集存放圖片的文件夾目錄shutil.move(os.path.join(label_dir, image[:-4] + '.txt'), 'D:/ModelsDatas/YOLO_datasets/test/labels')# 請改成你自己的測試集存放標簽的文件夾目錄
4.準備yaml文件,用于后續訓練
文件命名為data.yaml,建議先放在與train、test和valid同級目錄下,如下所示:
data.yaml中文件內容和說明如下:
names: # class names- 0:fish # 類別號: 類別名稱 (需要改成自己的)#-1:cat #如果還有其他類別,以此往下加就行了,類別號請認真和自己當時目標框labels文件中的一一對應#-2:dog
nc: 1 # number of classes 數據集中一共有幾個類別,參考上面說的
path: ultralytics/datasets/det/fish2 # 數據集路徑(需要改成自己的,也就是train、test和valid目錄的上級目錄)
train: train/images # 訓練集路徑(相對于數據集路徑)
val: valid/images # 驗證集路徑(相對于數據集路徑)
test: test/images # 測試集路徑(相對于數據集路徑)
如上,YOLO需要的自己數據集就構建完成了,接下來就是訓練啦!!!還請各位同學多多點贊收藏,你們的認可是我繼續更新更好文章的最大動力!!!