1. 程式人生 > >文章標題 faster rcnn-pytorch版訓練自己的資料

文章標題 faster rcnn-pytorch版訓練自己的資料

pytorch框架比起tenserflow和caffe等框架相對簡單很多,程式碼短小精悍,這裡記錄一下用pytorch版的faster rcnn訓練自己的資料並測試的過程,以及途中遇到的一些問題。
一、github上下載faster rcnn pytorch的程式碼連結:https://github.com/longcw/faster_rcnn_pytorch
按照此工程下面的readme配置相應庫,測試或對VOC2007資料集進行訓練等。
二、對於自己的資料集,首先需要標記資料生成相應的xml檔案,標記工具連結:https://github.com/DuinoDu/BBox-Label-Tool

,執行python tools/createDS.py,這裡會提示標記的類別名、標記圖片的匯入路徑、標記結果的儲存路徑,以及詢問影象中是否只含一個目標,注意不是一個類別,是一個目標!!!這裡的預設路徑是家目錄下bbox_label.txt中的路徑,可根據實際情況修改:vim .bbox_label.txt。
如圖所示
完成後執行 python main_voc.py,然後畫框標記,左下角有標記座標的顯示,可隨時檢視標記是否成功;
完成標記後進入BBOX_Label_Tool/tools裡面執行checkAnno.py ,檢查一下你的xml是否有問題,有問題的話將其和其對應的圖片刪除,然後重新命名,然後在執行createSplit.py,執行後會自動生成Imagesets資料夾,裡面包含資料劃分的txt,這裡要注意一個問題,就是你標記時候定義的classes_name要和你的xml中object的名字一樣,否則執行createSplit.py後tranval.txt等一系列txt中都不會有內容!!!!!並且你還發現不了這個問題,所以一定要注意注意,貼圖說明:
這裡寫圖片描述

這裡寫圖片描述
重新命名指令碼:

import xml.etree.ElementTree as ET
import os
import cPickle
import numpy as np
import cv2
import random

annopath="/home/lsj/project/faster_rcnn_pytorch/data/VOCdevkit2007/VOC2007/Annotations"
imgpath="/home/lsj/project/faster_rcnn_pytorch/data/VOCdevkit2007/VOC2007/JPEGImages"
new_xml_dir="/home/lsj/project/faster_rcnn_pytorch/data/VOCdevkit2007/VOC2007/cache/Annotations"
new_img_dir="/home/lsj/project/faster_rcnn_pytorch/data/VOCdevkit2007/VOC2007/cache/JPEGImages"
def updatexml(ann_path,new):
    updatetree=ET.parse(ann_path)
    root=updatetree.getroot()
    filename=root.find('filename')
    filename.text=str(new)
    updatetree.write(os.path.join(new_xml_dir,new+'.xml'))
def preprocess():
   filelist=os.listdir(annopath)
   num = 1  #從1開始命名,避免0、1造成的程式問題
   number = 0
   for file in filelist:
        print('number =  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~',number)
        number += 1
        ann_path = os.path.join(annopath,file)
        name = os.path.splitext(file)[0]
        jpg = name + '.jpg'
        jpg_path = os.path.join(imgpath,jpg)
        img=cv2.imread(jpg_path)
        new_name = (6 - len(str(num)))*'0' + str(num)
        num+=1
        cv2.imwrite(os.path.join(new_img_dir,new_name+'.jpg'), img)
        updatexml(ann_path,new_name) 
if __name__ == '__main__':
    preprocess()

二、修改pytorch faster rcnn程式碼資料傳送介面
1.找到faster_rcnn_pytorch/experiments/cfgs/faster_rcnn_end2end.yml檔案,修改這裡面的引數,一般只需要修改下類別,除錯過程中如果需要可修改batchsize的數值或學習率等。
2.找到faster_rcnn_pytorch/faster_rcnn/faster_rcnn.py檔案,在 FasterRCNN類中修改類別數量和類別名稱,類別名稱就是你的xml中object的名字,例如我這裡是上面途中紅色標註的suspension_point,這個類中還可以改變輸入影象的resize結果,原py檔案中是將短邊固定為600,按原圖的長寬比放縮長邊,並限制最大size不超過1000,這些引數可根據具體情況修改。
3.找到faster_rcnn_pytorch/faster_rcnn/datasets/pascal_voc.py檔案修改類別數和類別名,和2差不多
4.如果你用faster_rcnn_pytorch自己訓練過VOC2007資料集,那麼在faster_rcnn_pytorch中會有三個資料夾:cache、pretrained_model、 VOCdevkit2007,cache是存的從你資料集中load 進來的資料快取,訓練前將裡面的內容刪除執行程式時會自動生成, pretrained_model 裡面存的是預訓練模型,比如你要用VGG16作為你的basenet,那麼你要去github上下載一個VGG_imagenet.npy檔案,放進這個資料夾中,最後一個VOCdevkit2007裡面就是你的資料,為了少修改程式碼,我們可以將自己的資料變為和VOC2007一樣的格式,具體來說需要在VOCdevkit2007中建立一個VOC2007資料夾,然後把你之前資料準備檢測並重命名後的資料放在這個資料夾中,最後的效果是VOCdevkit2007/VOC2007這個資料夾中含有三個子檔案:Annotations、JPEGImages、ImageSets。
5.訓練吧,見證奇蹟的一刻,在faster_rcnn_pytorch目錄下執行python train.py。
三、感想
pytorch真的是一個很棒的框架,簡單易懂,官網的docs裡面也有很多例子,大家都可以抽空去看看,你們一定也會愛上它的!資料準備真的很重要啊,中間某個過程出錯就會導致訓練不成功,所以一定要養成check的好習慣,未雨綢繆,防患於未然,之後的過程就會很順暢了!實踐過程中需要注意的問題部落格中基本都涵蓋了,希望能幫到不知道從何入手的你~(^▽^)