1. 程式人生 > >使用keras版本的yoloV3訓練並在VOC資料集上測試

使用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。