YoLo 實踐(1)


YoLo 實踐(1)


by lizhen

參考代碼:
keras-yolo3 ***

yolo_tensorflow

所需環境:
python3 | annconda
keras
tensorflow
configparser

目標:

使用Keras| tensorflow完成基於Yolo的車輛檢測的訓練;

實施方法:

(1). Yolo是目前使用比較廣泛的模型之一, 在github等開源網站中有很多實現方式, 自己找一個比較靠譜的程序,對其改進. 改進方式有以下幾點: (a) 訓練給予VOC的模型(復現Yolov3) ; (b) 根據論文去閱讀yolo

(2). 改進訓練方法, 適用雨車輛檢測

Step 0. 測試項目是否可以正常運行

wget https://pjreddie.com/media/files/yolov3.weights # 下載yolo的模型

python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5 # 將yolo的模型轉化成適合Kears加載的格式

python yolo_video.py --image # 指定使用圖片檢測

運行效果圖

使用VOC數據結構訓練模型

Step1: 生成統一格式的標注文件和類別文件

為了方便訓練, 針對每一個圖片都有一種格式的標注文件:
這兩種格式的文件是:

Row format: image_file_path box1 box2 ... boxN
Box 的格式 : x_min,y_min,x_max,y_max,class_id

對於VOC數據集,由於已經有了xml格式的標注文件, 僅需要轉換標注的格式即可, 在此提供voc_annotation.py

vim voc_annotation.py # 修改有關VOC2007數據的路徑
python voc_annotation.py # 運行有關

通過閱讀voc_annotation.py文件, 可以得知:
該腳本可以將VOC2007 中標注修改成上述格式的文本;
轉換的過程需要修改VOC數據集的路徑;
轉換后,會待當前目錄(getcwd())創建有關訓練和校驗的標注文件:


~/workspace/keras-yolo3$ ll
-rw-rw-r--  1 lizhen lizhen    297885 Oct 23 15:48 2007_train.txt # 產生的新文件
-rw-rw-r--  1 lizhen lizhen    298595 Oct 23 15:48 2007_val.txt

文件的格式如下:

/keras-yolo3/VOCdevkit/VOC2007/JPEGImages/000064.jpg 1,23,451,500,2
keras-yolo3/VOCdevkit/VOC2007/JPEGImages/000066.jpg 209,187,228,230,14 242,182,274,259,14 269,188,2
95,259,14
keras-yolo3/VOCdevkit/VOC2007/JPEGImages/000073.jpg 121,143,375,460,15 2,154,64,459,15 270,155,375,
331,3 22,143,146,500,14

Step2: 加載預訓練模型

為了加快訓練的速度和Auc, 可以在已有的模型上進行訓練,
在后期的訓練中,會凍結yolo模型的前249層, 主要訓練后面的高維度的特征
Freeze the first 249 layers of total 252 layers.

cd /home/lizhen/workspace/keras-yolo3 # 切換到工作目錄
python convert.py -w yolov3.cfg yolov3.weights model_data/yolo_weights.h5 # 將適用於darknet的模型轉換成Keras

....
__________________________________________________________________________________________________
conv2d_67 (Conv2D)              (None, None, None, 2 130815      leaky_re_lu_65[0][0]             
__________________________________________________________________________________________________
conv2d_75 (Conv2D)              (None, None, None, 2 65535       leaky_re_lu_72[0][0]             
==================================================================================================
Total params: 62,001,757
Trainable params: 61,949,149
Non-trainable params: 52,608
__________________________________________________________________________________________________
None
Saved Keras model to model_data/yolo.h5
Read 62001757 of 62001757.0 from Darknet weights.

Step3: 訓練VOC數據

為了防止在訓練過程中出現OOM異常, 根據問題1的提示, 可以將epoch和batch的數量降低;
對 train.py 的讀取文件位置進行修改, 替換成上Step1中生成207_train.txt

python train.py # 讀取2017_train.txt ,同時運行模型

~/workspace/keras-yolo3$ ls logs/001/
ep003-loss38.801-val_loss35.522.h5  ep009-loss26.373-val_loss27.126.h5     events.out.tfevents.1540299060.BoHong
ep003-loss39.940-val_loss36.366.h5  events.out.tfevents.1540294790.BoHong  trained_weights_final.h5
ep006-loss29.750-val_loss28.700.h5  events.out.tfevents.1540296584.BoHong  trained_weights_stage_1.h5

通過閱讀train.py 可知, 經過訓練以后會在./logs/0001下產生模型, 模型是** trained_weights_final.h5**
訓練過程中的loss變化如下:

Step4: 測試模型

python yolo_video.py --model logs/0001/trained_weights_final.h5 --image

測試效果:

問題集合

1. Out of system memory when unfreeze all of the layers.

在訓練數據的過程中(python train.py), 會因為GPU的OOM異常而提前退出訓練;
根據
https://github.com/qqwweee/keras-yolo3/issues/122
中提供的信息, 可以嘗試一下集中方案:

1 only train 2 classes, car and person, modify model_data/voc_classes.txt

2 batch_size = 2 & epoch = 20

3 set load_pretrained=False

4 update tensorflow to 1.8.0

附錄A

ConfigParser

ConfigParser模塊在python3中修改為configparser.這個模塊定義了一個ConfigParser類,該類的作用是使用配置文件生效,配置文件的格式和windows的INI文件的格式相同

該模塊的作用 就是使用模塊中的RawConfigParser()、ConfigParser()、 SafeConfigParser()這三個方法,創建一個對象使用對象的方法對指定的配置文件做增刪改查 操作。


后期准備解析yolo論文,改代碼 敬請期待~


免責聲明!

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



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