YOLO從零開始:基於YOLOv3的行人檢測入門指南
本文全部內容和代碼可從Github下載:
pascal1129/yolo_person_detect
- 本文採用markdown書寫,知乎存在一定的排版bug,但Github的顯示是正常的;
- 本文會持續更新,由於代碼放在Github中,所以請多關注Github的動態;
- 本文主要針對初學者,如果有什麼建議和想法,可以在Github issue和知乎文章評論里提出,我會儘快完善的;
按照下述步驟可以實現一個效果較好的基於YOLOv3的行人檢測系統
本代碼主要是針對YOLOv3的兩個主流版本(AlexeyAB/darknet & pjreddie/darknet)的腳本輔助集合,主要用途如下:
- 將YOLOv3常用的網址和資料歸納整理了一下;
- 從VOC2007/VOC2012/COCO等數據集中提取出person類圖片,並轉換標註(使用VOC時默認保留了全部difficult=1的圖片);
- 計算mAP正確率;
- 從實驗的訓練日誌中提取出loss變化圖
效果對比
YOLO_mine(只檢測行人)
YOLO_pj(官版,全檢測)
文件結構
yolo_person_detect
|
│ README.md
│
├─make_yolo_dataset
│ │ helmet_to_yolo.py # 某次比賽用到的轉換代碼
│ │ show_voc_xml.py # 可視化VOC數據集
│ │ show_yolo_label.py # 可視化YOLO數據集
│ │ xml2json.py #
│ │ coco_to_yolo.py # COCO --> YOLO
│ │
│ ├─YOLO_VOC2007 # VOC2007
│ │ extract_person.py # 從VOC2007數據集中提取person圖片
│ │ voc_label.py # 將提取到的person圖片轉為YOLO格式
│ │
│ └─YOLO_VOC2007_2012 # VOC2007 + VOC2012
│ extract_person_2007.py
│ extract_person_2012.py
│ voc_label.py
│
├─yolo_compute_mAP_on_VOC2007 # 在VOC2007上測試性能
│ reval_voc_py3.py
│ voc_eval_py3.py
│
└─yolo_loss_analyse
│ analyse.py # 訓練過程可視化代碼
│ result.png # 可視化訓練過程
└─loss
train7-loss.txt # 示例訓練日誌
官方Demo運行
- 下載源代碼、預訓練權重
git clone https://github.com/AlexeyAB/darknet.git
cd darknet/
wget https://pjreddie.com/media/files/yolov3.weights
- 修改Makefile並編譯,可以加上 -j8 等參數設定多CPU編譯
vim Makefile
make
注意:OpenCV版本號親測3.40可用,但是3.41不可用,可參見YOLOv3的Darknet在OpenCV下編譯出錯填坑
- 試運行圖片檢測demo
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
- 試運行視頻檢測demo
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>
數據集準備
處理時,默認所有的train = train+val,不區分二者,2007單獨還有個test
0、下載VOC2007+2012數據集
下載數據集
wget <http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar>
wget <http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar>
wget <http://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar>
解壓縮
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCtrainval_11-May-2012.tar
1、通過extract_person.py提取含人數據
分別運行2007和2012的提取代碼
2、通過voc_label.py轉化voc數據格式為yolo支持的格式
會在腳本所在文件夾產生相應的txt文本,存儲數據集地址信息:
2007_train.txt
2007_test.txt
2012_train.txt
可根據情況進行配置,比如說不想要測試集,那就整合下訓練集、測試集:
cat 2007_train.txt 2012_train.txt > train.txt
配置文件
0、下載源代碼,下載預訓練權重
git clone https://github.com/AlexeyAB/darknet.git
wget https://pjreddie.com/media/files/darknet53.conv.74
1、配置Makefile
2、配置cfg/voc.data
classes= 1
train = /home/pascal/person_data2/train.txt
valid = /home/pascal/person_data2/2007_test.txt
names = data/voc.names
backup = backup
3、配置data/voc.names
person
4、新建backup文件夾
mkdir backup
5、配置cfg/yolov3-voc.cfg
batch, sub按需修改
一共三個YOLO層,均需要修改:
classes=1
filters=18 3*(1+1+4)=18
# filters=(classes + coords + 1)*<number of mask>
6、make編譯
7、開始訓練,並留下日誌
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg ../darknet53.conv.74 -gpus 0,1 | tee -a helmet1.txt
8、恢復訓練
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc.backup -gpus 0,1 | tee -a train7.log
9、單張圖片測試(需要將batch、subvision均修改為1)
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights test_data/p0.jpg
10、性能檢測
計算mAp
./darknet detector map cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_80172.weights
計算recall(2097張的結果)
./darknet detector recall cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights
VOC2007test
mkdir results
#(PJ版本需要這一步)
# (會在/results生成默認的comp4_det_test_person.txt,這是在VOC2007 test上的結果)
./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights -gpu 0,1
#在 https://github.com/AlexeyAB/darknet/tree/master/scripts 下載voc_eval_py3.py reval_voc_py3.py ,在./執行
python reval_voc_py3.py output_dir=./
訓練常用指令
訓練:加上了tee指令把訓練日誌保存到txt文本
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1 |tee -a train7.txt
恢復訓練
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc.backup -gpus 0,1 tee -a train7.txt
測試
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_50000.weights ../test_data/p2.jpg
VOC數據集格式
以上述VOC2007+VOC2012數據集為例,以下均為處理過的數據集:
VOCdevkit/
├── VOC2007
│ ├── Annotations 原始的VOC標註信息
│ ├── ImageSets
│ │ └── Main VOC的類標籤,和人為提取的樣本索引
│ ├── JPEGImages 圖片文件夾
│ └── labels VOC-->YOLO格式的標註信息
└── VOC2012
├── Annotations
├── ImageSets
│ └── Main
├── JPEGImages
└── labels
VOC的xml格式
核心部分如下:
<annotation>
<object>
<name>person</name>
<difficult>0</difficult>
<bndbox>
<xmin>xxx</xmin>
<ymin>xxx</ymin>
<xmax>xxx</xmax>
<ymax>xxx</ymax>
</bndbox>
</object>
</annotation>
VOC的圖片格式
行列分布同pillow.Image,先行後列
COCO數據集格式
數據集格式
COCO
├── annotations
├── filelist 訓練圖片位置
└── train2017
├── JPEGImages 圖片
└── labels 生成的YOLO格式標籤
COCO數據集下載
COCO-->YOLO格式轉換,代碼包含了操作介紹
數據集統計
* 括弧裡面為person類圖片數量
訓練過程
數據集:VOC2007+VOC2012+COCO2017
硬體環境:GTX1080ti*2, Ubuntu16.04, CUDA9
訓練迭代數:8w iters
訓練技巧:參見how-to-train-to-detect-your-custom-objects
配置:batch=64/16,總計8w次迭代,在原來的5w次之後,追加2w次0.001和1w次0.0001,0.00001 耗時:5h/萬次迭代 結果:0.98
參考資料
yolov3訓練的集大成者
配置文件的設定參考
YOLO官網
推薦閱讀:
TAG:計算機視覺 | 深度學習(DeepLearning) | 機器學習 |