YOLO從零開始:基於YOLOv3的行人檢測入門指南

本文全部內容和代碼可從Github下載:

pascal1129/yolo_person_detect?

github.com

  • 本文採用markdown書寫,知乎存在一定的排版bug,但Github的顯示是正常的;
  • 本文會持續更新,由於代碼放在Github中,所以請多關注Github的動態;
  • 本文主要針對初學者,如果有什麼建議和想法,可以在Github issue和知乎文章評論里提出,我會儘快完善的;

按照下述步驟可以實現一個效果較好的基於YOLOv3的行人檢測系統

本代碼主要是針對YOLOv3的兩個主流版本(AlexeyAB/darknet & pjreddie/darknet)的腳本輔助集合,主要用途如下:

  1. 將YOLOv3常用的網址和資料歸納整理了一下;

  2. 從VOC2007/VOC2012/COCO等數據集中提取出person類圖片,並轉換標註(使用VOC時默認保留了全部difficult=1的圖片);

  3. 計算mAP正確率;

  4. 從實驗的訓練日誌中提取出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) | 機器學習 |