寫在前面:本人對 python 也接觸不久,也是最近兩個禮拜才接觸 YOLO,摸索過程很是艱辛,各種環境配置,踩坑不少,記錄一下,希望能幫助到正在學習的你。
我的配置
Win10 + cuda11.1 + cudnn8.1


配置 YOLOv4-darknet
如果你還沒有配置好,可以參考我的這篇教程,
Taosy:Win10 + VS2019 配置 YOLOv4-darknet 教程
製作數據集
如果是視頻,可以先把視頻存爲圖片,參考代碼:
# -*- coding: utf-8 -*-""" Created on 2021/4/11 17:53 Filename: demo_image_2_image.py Author : Taosy Zhihu : https://www.zhihu.com/people/1105936347 Github : https://github.com/AFei19911012 Describe: video --> image"""import cv2 as cvimport timeimport osimport sysif __name__ == '__main__': # file path video_name = 'helmet.mp4' video_path = 'videos/' + video_name image_path = 'data/' + video_name[:-4] + '_' + time.strftime('%Y_%m_%d', time.localtime()) # generate a fold if not os.path.exists(image_path): os.makedirs(image_path) # read video if not os.path.isfile(video_path): print(video_path + ' not exist') sys.exit(1) cap = cv.VideoCapture(video_path) # frame --> image has_frame = True idx = 0 while has_frame: has_frame, frame = cap.read() if has_frame and idx % 5 == 1: # file_name = f'{idx//5}'.zfill(6) + '.jpg' file_name = f'{idx//5:06d}.jpg' cv.imwrite(os.path.join(image_path, file_name), frame) idx += 1 cap.release() print('Done processing.')
需要用到 labelImg,
labelImg下載鏈接:
https://github.com/tzutalin/labelImg
下載後解壓到目錄,python 打開文件夾,先配置解釋器,
D:\anaconda\python.exe
安裝必要的包,Terminal 執行以下代碼,第三句代碼沒有返回信息,第四句打開軟件,
pip install pyqt5
pip install lxml
pyrcc5 -o libs/resources.py resources.qrc
python labelImg.py

定位到 labelImg 目錄,labelImg.py 文件右鍵屬性,更改打開方式爲:
D:\anaconda\python.exe
發送到桌面快捷方式,下次直接雙擊就能打開了;
labelImg 使用
在 labelImg → data 文件夾裏有 predefined_classes.txt 文件,將內容修改爲你的目標

一些基本設置:

一個小技巧:如果類型較少,可以選擇 【Single Class Mode】,會自動標註好,不用你選擇類別
一些常用快捷鍵:
W:彈出十字架開始標記
A:切換到上一張圖片
D:切換到下一張圖片
右鍵選擇修改編輯
【Open Dir】打開圖片所在文件夾;
【Change Save Dir】設置保存標記文件目錄,默認和圖片一個目錄,也必然要放在一個目錄的;
標註錯了也沒有關係,右鍵菜單可修改;

標註完成後,生成文件格式如下:
一行表示一個標註目標
0 表示第一個類型,爲 person
1 表示第二個類型,爲 helmet
後面的四個數值表示目標的中心位置和寬高(歸一化)

同時還會生成一個 classes.txt 文件,內容爲標註出來的類別;
【注意,圖片文件和對應的標註結果 txt 文件要放在一起】
有了這些標註文件,現在把圖片文件全路徑名放到一個文本里,可以參考代碼,我這裏只做了train.txt:

# -*- coding: utf-8 -*-""" Created on 2021/4/11 21:40 Filename: demo_voc_label.py Author : Taosy Zhihu : https://www.zhihu.com/people/1105936347 Github : https://github.com/AFei19911012 Describe:"""import osif __name__ == '__main__': wd = os.getcwd() # Get train and val file_list = os.listdir('data/helmet_2021_04_11') train_list = [] for f in file_list: if '.jpg' in f: train_list.append(f[:-4]) # Write to train.txt list_file = open(f'config/helmet_train.txt', 'w') for image_id in train_list: list_file.write(f'{wd}/data/helmet_2021_04_11/{image_id}.jpg\n') list_file.close()
配置文件
拷貝三個文件,重命名爲 helmet.names,helmet.data,helmet.cfg
names文件就是類別:

data 文件存放路徑,內容如下(相對路徑或者絕對路徑都可以):

cfg 文件是配置文件,部分參數解釋如下:

需要修改三個地方:搜索 yolo,filters = 3 * (5 + classes)



然後把 helmet.names,helmet.data,helmet.cfg,helmet_train.txt 文件放到以下目錄對應位置,注意和 data 文件裏的路徑對應:

shift+右鍵,在此處打開 PowerShell 窗口,執行以下代碼,有沒有預訓練模型都行:
.\darknet.exe detector train data/helmet.data cfg/helmet_yolov4.cfg
有預訓練模型:
.\darknet.exe detector train data/helmet.data cfg/helmet_yolov4.cfg yolov4.conv.137
下載鏈接:
鏈接:
https://pan.baidu.com/s/1N-3h5IuVrwdxHOOA69mg2g
提取碼:991m
複製這段內容後打開百度網盤手機App,操作更方便哦--來自百度網盤超級會員V4的分享
我用上面的 batch = 64 會有 Out of memory 錯誤,修改爲 16 可以;

訓練過程有 Loss 圖,跑完是這樣的,每訓練 1000 次會自動保存一次,我們要最後這個權重就行了,改下名字爲 helmet.weights,



運行以下代碼測試:
.\darknet.exe detector test data/helmet.data cfg/helmet.cfg weights/helmet.weights helmet.jpg

至此,所有流程走完。
寫在後面:後續會繼續踩坑,分享更多的實操教程,歡迎學習、討論、關注,喜歡請【一鍵三連】支持一下。另外,本人對 Matlab 也略知一二,歡迎共同學習進步。
Matlab學習案例