從零開始手把手教你利用yolov5訓練自己的數據集(含coco128數據集/yolov5權重文件國內下載)含自動標注數據方法


利用YOLOV5訓練自己的數據/

對於訓練模型標注圖片應該是一繁瑣的過程,推薦一下自動標注

https://www.cnblogs.com/zhaoyingjie/p/14519764.html

 

執行以下命令做好准備工作

git clone https://github.com/ultralytics/yolov5 # 下載 yolov5 項目
python3 -c "from yolov5.utils.google_utils import gdrive_download; gdrive_download('1n_oKgR81BJtqk75b00eAjdv03qVCQn2f','coco128.zip')" # 下載官方例子的數據集
cd yolov5 #進入yolov5 項目文件
pip install -U -r requirements.txt #安裝需求

 

有的人在python3 -c 下載數據集這一步出錯,現提供百度雲下載地址。
另附權重文件百度雲下載地址。
coco128 提取碼:55q6
yolov5權重文件 密碼: gt7l
權重文件更新了20200728-13:33
該項目github地址:github-yolov5

1.requirements

很多人在 pip install -U -r requirements.txt 這一步報錯了,比如我,那么就請手動安裝吧!
依次執行 pip install
如下方式

pip install numpy==1.17
pip install python==3.7
###下面所有的需要全部裝一遍,可以參照 yolov5下的 requirements.txt 文件

 

Python>=3.7
PyTorch>=1.5
Cython
numpy==1.17
opencv-python
torch>=1.5
matplotlib
pillow
tensorboard
PyYAML>=5.3
torchvision
scipy
tqdm
git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI

 

2.訓練自定義數據
2.1創建Dataset.yaml
這里官方的例子使用的是coco128.yaml,這是一個小型教程數據集,由COCO train2017 中的前128張圖像組成。在此示例中,這些相同的128張圖像用於訓練和驗證。coco128.yaml定義1)訓練圖像目錄的路徑(或帶有訓練圖像列表的* .txt文件的路徑),2)與我們的驗證圖像相同的路徑,3)類數,4)類列表名稱:

#train和Val的數據集(圖像目錄或* .txt與圖像路徑文件)
train: …/coco128/images/train2017/
VAL: …/coco128/images/train2017/class number
nc: 80
#類名稱
名稱: [“人”,“自行車”,“汽車”,“摩托車”,“飛機”,“公共汽車”,“火車”,“卡車”,“船”,“交通燈”,
“消防栓” ”,“停車標志”,“停車計時器”,“長凳”,“鳥”,“貓”,“狗”,“馬”,“綿羊”,“牛”,
“大象”,“熊”,“斑馬” ',‘長頸鹿’,'背包,‘雨傘’,‘手袋’,‘領帶’,‘手提箱’,‘飛盤’,
‘滑雪板’,‘滑雪板’,‘運動球’,‘風箏’,‘棒球棒’,“棒球手套”,“滑板”,“沖浪板”,
“網球拍”,“瓶”,“酒杯”,“杯”,“叉”,“刀”,“勺子”,“碗”,“香蕉” ,“蘋果”,
“三明治”,“橙色”,“西蘭花”,“胡蘿卜”,“熱狗”,“比薩餅”,“甜甜圈”,“蛋糕”,“椅子”,“沙發”,
“盆栽”,“床”,“餐桌” ”,“廁所”,“電視”,“筆記本電腦”,“鼠標”,“遙控器”,“鍵盤”,
“手機”,“微波爐”,“烤箱”,“烤面包機”,“水槽”,“冰箱” ,“書”,“時鍾”,“花瓶”,“剪刀”,
“泰迪熊”,“吹風機”,“牙刷”]

 

如果使用自己建立的數據集 要修改的參數有

train:換成你自己的訓練集地址
val:換成自己的val地址
nc: 換成你自己定義的類別的數量
類名稱:換成自己定義的類別的名稱

 

2.2創建標簽

使用LabelboxCVAT工具進行圖像標記,將標簽導出為darknet格式,×.txt每張圖像一個文件(如果圖像中沒有對象,則不需要×.txt文件)。txt文件內容有:

每個對象一行
每行都是class x_center y_center width height格式
框坐標必須采用歸一化的xywh格式(從0到1)。如果boxes以像素為單位,划分x_center和width關於圖像寬度,y_center和height關於圖像高度。
類別定義利用序號,一般從0開始。

每個圖像的標簽文件應該可以通過在其路徑名中簡單地替換/images/ *.jpg為/labels/*.txt來定位。
例如

數據集/圖像/ train2017 / 000000109622.jpg #圖像
數據集/標簽/ train2017 /000000109622.txt #標簽

 

具有5個人(所屬類別定義為0)的標簽文件

在這里插入圖片描述

 

2.3組織目錄

數據集/coco128放在/yolov5項目的旁邊,數據集/coco128下包含兩個文件夾。
一個為/coco128/images,另一個為/coco128/labels,里面分別存放數據集圖片和數據集標注信息。

 

 

2.4選擇模型

從./models文件夾中,選擇模型。yolov5提供了五個模型,這里我們以yolov5s.yaml為例子,雙擊打開,更新其中參數適應2.1中定義的類別。這里一般不用動更新nc就可以了。就是匹配你自己數據集的類別就可以了,其他的參數一般不做優化不需要動。

 

#parameters
nc: 80
#number of classes <------------------ 更新它匹配你自己的數據集
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
 
#anchors
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
 
#YOLOv5 backbone
backbone:
#[from, number, module, args]
[[-1, 1, Focus, [64, 3]], # 1-P1/2
[-1, 1, Conv, [128, 3, 2]], # 2-P2/4
[-1, 3, Bottleneck, [128]],
[-1, 1, Conv, [256, 3, 2]], # 4-P3/8
[-1, 9, BottleneckCSP, [256, False]],
[-1, 1, Conv, [512, 3, 2]], # 6-P4/16
[-1, 9, BottleneckCSP, [512, False]],
[-1, 1, Conv, [1024, 3, 2]], # 8-P5/32
[-1, 1, SPP, [1024, [5, 9, 13]]],
[-1,12, BottleneckCSP, [1024, False]], # 10
]
 
#YOLOv5 head
head: [[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1, 0]], # 12 (P5/32-large)
 
[-2, 1, nn.Upsample, [None, 2, ‘nearest’]],
[[-1, 6], 1, Concat,[1]], # cat backbone P4
[-1, 1, Conv, [512, 1, 1]],
[-1, 3,BottleneckCSP, [512, False]],
[-1, 1, nn.Conv2d, [na * (nc + 5), 1,1, 0]], # 16 (P4/16-medium)
 
[-2, 1, nn.Upsample, [None, 2, ‘nearest’]],
[[-1, 4], 1, Concat,[1]], # cat backbone P3
[-1, 1, Conv, [256, 1, 1]],
[-1, 3,BottleneckCSP, [256, False]],
[-1, 1, nn.Conv2d, [na * (nc + 5), 1,1, 0]], # 21 (P3/8-small)
 
[[], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]

 

2.5訓練

可以從0開始訓練也可以加載–cfg yolov5s.yaml --weights 通過傳遞匹配的權重文件從預訓練的檢查點進行訓練:–cfg yolov5s.yaml --weights yolov5s.pt。

# Train YOLOv5s on coco128 for 5 epochs
$ python train.py --img 640 --batch 16 --epochs 5 --data ./data/coco128.yaml --cfg ./models/yolov5s.yaml --weights ''

 

需要調整的參數

train.py

if __name__ == '__main__':
    check_git_status()
    parser = argparse.ArgumentParser()
    parser.add_argument('--epochs', type=int, default=5)
    parser.add_argument('--batch-size', type=int, default=4)
    parser.add_argument('--cfg', type=str, default='models/yolov5s.yaml', help='*.cfg path')
    parser.add_argument('--data', type=str, default='data/coco128.yaml', help='*.data path')
    parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='train,test sizes')
    parser.add_argument('--rect', action='store_true', help='rectangular training')
    parser.add_argument('--resume', action='store_true', help='resume training from last.pt')
    parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
    parser.add_argument('--notest', action='store_true', help='only test final epoch')
    parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')
    parser.add_argument('--evolve', action='store_true', help='evolve hyperparameters')
    parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
    parser.add_argument('--cache-images', action='store_true', help='cache images for faster training')
    parser.add_argument('--weights', type=str, default='', help='initial weights path')
    parser.add_argument('--name', default='', help='renames results.txt to results_name.txt if supplied')
    parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--adam', action='store_true', help='use adam optimizer')
    parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%')
    parser.add_argument('--single-cls', action='store_true', help='train as single-class dataset')
    opt = parser.parse_args()

 

epochs:指的就是訓練過程中整個數據集將被迭代多少次,顯卡不行你就調小點。
batch-size:一次看完多少張圖片才進行權重更新,梯度下降的mini-batch,顯卡不行你就調小點。
cfg:存儲模型結構的配置文件
data:存儲訓練、測試數據的文件
img-size:輸入圖片寬高,顯卡不行你就調小點。
rect:進行矩形訓練
resume:恢復最近保存的模型開始訓練
nosave:僅保存最終checkpoint
notest:僅測試最后的epoch
evolve:進化超參數
bucket:gsutil bucket
cache-images:緩存圖像以加快訓練速度
weights:權重文件路徑
name: 重命名results.txt to results_name.txt
device:cuda device, i.e. 0 or 0,1,2,3 or cpu
adam:使用adam優化
multi-scale:多尺度訓練,img-size +/- 50%
single-cls:單類別的訓練集

test.py
f __name__ == '__main__':
    parser = argparse.ArgumentParser(prog='test.py')
    parser.add_argument('--weights', type=str, default='weights/yolov5s.pt', help='model.pt path')
    parser.add_argument('--data', type=str, default='data/coco128.yaml', help='*.data path')
    parser.add_argument('--batch-size', type=int, default=16, help='size of each image batch')
    parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')
    parser.add_argument('--conf-thres', type=float, default=0.001, help='object confidence threshold')
    parser.add_argument('--iou-thres', type=float, default=0.65, help='IOU threshold for NMS')
    parser.add_argument('--save-json', action='store_true', help='save a cocoapi-compatible JSON results file')
    parser.add_argument('--task', default='val', help="'val', 'test', 'study'")
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--single-cls', action='store_true', help='treat as single-class dataset')
    parser.add_argument('--augment', action='store_true', help='augmented inference')
    parser.add_argument('--merge', action='store_true', help='use Merge NMS')
    parser.add_argument('--verbose', action='store_true', help='report mAP by class')
    opt = parser.parse_args()
    opt.save_json = opt.save_json or opt.data.endswith('coco.yaml')
    opt.data = check_file(opt.data)  # check file
    print(opt)

 

同理這里的batch_size image_size ,顯卡不行你就調小點。
這就解決了yolov5 訓練時會出現的pytorch出現RuntimeError: CUDA out of memory.

2.6可視化

這算是yolov5提供的一個新的功能,在訓練開始之后,可以通過查看train*.jpg圖像以查看訓練圖像,標簽和增強效果。

 

 

在每代訓練完成后,可以通過test_batch0_gt.jpg,來看它們的標簽還真是標注的邊框。

 

 

可以通過查看test_batch0_pred.jpg 來查看每代的預測結果

 

 

訓練的損失和性能指標保存在tensorboard和results.txt日志文件中。訓練完成后results.txt繪制results.png。在這里,我顯示了從coco128開始訓練到100個代YOLOv5,從零開始(橙色),從預訓練的yolov5s.pt權重(藍色)開始:

 

 

3 補充
3.1 解決 KeyError: "weights/yolov5s.pt is not compatible with models/yolov5s.yaml.
這個很明顯權重文件過期了,沒辦法,需要重新下載,下載地址
yolov5權重下載地址。
這個是谷歌雲,有點慢,開VPN吧。這兩天有空的話我全下載下載把百度雲更新下。
下載好了放進weights文件夾就好了。

3.2解決 運行 train 然后pytorch出現RuntimeError: CUDA out of memory.
參照2.5訓練,改小參數就可以了。就可以解決了

3.3 更新
目前github還在更新,定期下載更新下yolov5文件
原文鏈接:https://blog.csdn.net/ai_faker/article/details/107099907

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM