使用keras版本的yoloV3訓練並在VOC資料集上測試
一、環境需求:
tensorflow
keras
(編譯執行時按照錯誤提示pip install 相應庫檔案即可)
二、Demo:
1、下載程式碼:
git clone https://github.com/qqwweee/keras-yolo3
2、下載yoloV3權重檔案:
https://pjreddie.com/media/files/yolov3.weights
3、將darknet下的yolov3配置檔案轉換成keras適用的h5檔案:
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
4、執行預測影象程式(預測視訊程式跳過):
python yolo.py
輸入需要預測的圖片路徑即可,示例如下,可以看到結果還是蠻準確的,但對於某些小目標(如圖片左半部分)仍然未能很好地檢測出來:
三、訓練:
1、將VOC資料集放在程式碼同一目錄下,然後先生成需要進行訓練的txt檔案,包括圖片路徑、類別和bbox,一張圖片有多個目標時用' '隔開,根據使用VOC資料集的年份修改voc_annotation.py檔案中的sets,根據需要訓練的類別修改classes(如註釋中只使用person類)。
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')] # classes = ['person'] classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
執行生成txt檔案程式,根據sets得到三個不同的txt檔案,方便用於做訓練、驗證和測試:
python voc_annotation.py
2、修改train.py中的annotation_path為剛剛生成的txt檔案,data_path是根據txt提供的訓練影象提取出的資料資訊並儲存為了npz格式(注意,如果需要更換訓練資料的話,需要刪除上一次生成的npz檔案,或者在給get_training_data函式傳參時設定load_previous=False),output_path是當前訓練的模型儲存路徑,log_dir記錄了每一次迭代生成的模型,classes_path是需要訓練的目標種類,根據上一步修改過的classes調整(如註釋中選擇的txt檔案中只包含自己需要訓練的類別),anchors_path是錨點檔案(因還不太瞭解所以沒有改過)。
annotation_path = '2007_train.txt'
data_path = 'train.npz'
output_path = 'model_data/my_yolo.h5'
log_dir = 'logs/000/'
#classes_path = 'model_data/my_classes.txt'
classes_path = 'model_data/voc_classes.txt'
anchors_path = 'model_data/yolo_anchors.txt'
同時,在訓練時還會存在這樣的情況:可能資料集中某些影象中不包含你想要訓練的目標,那麼可以在生成txt檔案時就篩除掉,或者在讀取訓練資料時跳過沒有資料的那一行,這裡作者選擇後者,修改train.py中get_training_data函式:
with open(annotation_path) as f:
for line in f.readlines():
line = line.split(' ')
# skip the rows contain no target
if len(line) <= 1:
continue
filename = line[0]
image = Image.open(filename)
這裡需要注意的是,如果想要訓練某一類或某幾類特定的目標類別,必須要同時修改以上兩步中voc_annotation.py和train.py相應的位置,否則可能會報維數不符的錯誤。
修改完成後,開始訓練:
python train.py
隨著epoch迭代,會得到越來越小的loss,直到loss達到某一閾值自動停止,或者epoch達到上限也會停止。可以在train.py中的train函式中修改預設的epochs。
3、修改yolo.py,使用自己訓練的模型預測影象:
#self.model_path = 'model_data/yolo.h5'
self.model_path = 'model_data/my_yolo.h5'
self.anchors_path = 'model_data/yolo_anchors.txt'
#self.classes_path = 'model_data/coco_classes.txt'
self.classes_path = 'model_data/my_classes.txt'
因為只在2007VOC訓練集上進行30次的迭代訓練,所以得到的模型效果不算好,在VOC測試影象上的預測效果還可以,但不夠精確。如果測試影象更大,差的預測結果就比較明顯了,因此需要更多訓練資料來訓練自己的模型。
四、在VOC2007上評估MAP
五、其他:
1、如果想要使用自己的權重繼續訓練,在train.py中的create_model函式中修改weights_path。如果不想使用預訓練的權重,設定傳給create_model函式的引數load_pretrained=False。