在前兩篇博客中我們分別配置了環境和進行了demo的測試,接下來我們訓練自己的圖像數據並進行檢測.
(1)製作數據集
我們採用VOC2007的數據模板,進行數據製作
- VOC2007數據文件圖:
VOC2007
├── Annotations #圖像標籤文件,是.xml格式
├── ImageSets
│ ├── Layout
│ ├── Main #訓練和測試用到的數據文件
│ └── Segmentation
└── JPEGImages #圖像文件
#Layout和Segmentation文件在這裏不需要
-
採用labelimg進行圖像標記.可以下載,直接運行可能會出現錯誤,先根據項目網址中的提示安裝依賴文件,再運行.
- 修改data/predefined_classes.txt文件,改成自己的類名
- 運行程序,界面如下圖所示:
- 點擊Change Save Dir修改標籤文件的保存目錄
- 點擊Open Dir ,打開圖片路徑
- 點擊圖片進行標註,如下圖
詳細的使用可以參考網上的其他說明.至此,標籤數據我們已經做好.我們將製作的數據按照VOC2007的格式進行放入.-生成訓練,測試數據.在這裏,我們利用代碼來生成
import os import random def _main(): trainval_percent = 0.5 train_percent = 0.5 xmlfilepath = 'Annotations' total_xml = os.listdir(xmlfilepath) num = len(total_xml) list = range(num) tv = int(num * trainval_percent) tr = int(tv * train_percent) trainval = random.sample(list, tv) train = random.sample(trainval, tr) ftrainval = open('ImageSets/Main/trainval.txt', 'w') ftest = open('ImageSets/Main/test.txt', 'w') ftrain = open('ImageSets/Main/train.txt', 'w') fval = open('ImageSets/Main/val.txt', 'w') for i in list: name = total_xml[i][:-4] + '\n' if i in trainval: ftrainval.write(name) if i in train: ftest.write(name) else: fval.write(name) else: ftrain.write(name) ftrainval.close() ftrain.close() fval.close() ftest.close() if __name__ == '__main__': _main()
將程序文件放在VOC2007文件夾下(本人是按照這個路徑進行編寫的),其中trainval_percent與 train_percent可以根據需要修改,隨後執行,會生成四個文件
/ImageSets/Main$ tree . ├── test.txt ├── train.txt ├── trainval.txt └── val.txt
在VOC數據中,對圖像的像素比例有一定的要求,因此我們將圖像進行修改.代碼如下:
import cv2 import os file_path='./JPEGImages/' for filename in os.listdir(file_path): print(filename) img=cv2.imread(file_path+filename) size=cv2.resize(img,(500,375)) cv2.imwrite(file_path+filename,size) if img is not None: continue
現在,我們自己的數據集總算是完成了,將製作好的數據集與原先的數據進行替換,就可以開始訓練自己的模型了.
(2) 訓練自己的數據模型
- 在lib/pascal_voc.py文件中,修改類別參數
self._classes = ('__background__', # always index 0
'#自己的類名'
- 在train_faster_rcnn.sh和test_faster_rcnn.sh修改
ITEMS=#自己設置,本人設置爲10000
- 在項目根目錄下執行
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc_0712 res101
此時會生成:output
和tensorboard
文件
output #生成的訓練模型
└── res101
├── voc_2007_test
│ └── default
│ └── res101_faster_rcnn_iter_100
│ ├── detections.pkl
│ ├── license_pr.pkl
│ └── _pr.pkl
└── voc_2007_trainval+voc_2012_trainval
└── default
├── checkpoint
├── res101_faster_rcnn_iter_10000.ckpt.data-00000-of-00001
├── res101_faster_rcnn_iter_10000.ckpt.index
├── res101_faster_rcnn_iter_10000.ckpt.meta
├── res101_faster_rcnn_iter_10000.pkl
tensorboard #可視化文件,可利用命令tensorboard --logdir=tensorborad/res101進行可視化觀察
└── res101
└── voc_2007_trainval+voc_2012_trainval
├── default
│ ├── events.out.tfevents.1545706608.guo-ThinkPad-E550
│ ├── events.out.tfevents.1545711447.guo-ThinkPad-E550
│ ├── events.out.tfevents.1545732554.guo-ThinkPad-E550
│ └── events.out.tfevents.1545818970.guo-ThinkPad-E550
└── default_val
├── events.out.tfevents.1545706693.guo-ThinkPad-E550
├── events.out.tfevents.1545711504.guo-ThinkPad-E550
├── events.out.tfevents.1545732622.guo-ThinkPad-E550
└── events.out.tfevents.1545819033.guo-ThinkPad-E550
(3)最後,就是測試了
- 修改類名
CLASSES = ('__background__',
'#自己的類')
- 修改模型
NETS = {'vgg16': ('vgg16_faster_rcnn_iter_70000.ckpt',),'res101': ('res101_faster_rcnn_iter_10000.ckpt',)}#其中的10000,是我自己的訓練設置,個人要根據自己的設置修改,一定要和初始設置的參數一致
- 修改測試圖片
原文是:
im_names=['#demo中圖片的名稱']
本人進行了修改,遍歷文件夾下所有的圖片進行讀取,修改代碼如下
im_path='#圖片文件的路徑'
im_names = os.listdir(im_path)
#這裏的im_path是以項目的根路徑進行設置的,此時如果你讀取的不是demo或者demo下的文件夾,那就需要再修改一處
#im_file = os.path.join(cfg.DATA_DIR, 'demo', image_name)其中的demo就要根據自己的進行修改
- 執行測試,執行命令
./tools/demo.py
在這裏,如果圖片太多,或者不想顯示的時候,可以進行結果的保存,添加一行代碼,如下:
demo(sess,net,im_name)
plt.savefig('./../data/demo-show/'+im_name)
#前面是路徑,demo-show文件需要自己創建,也是以項目的根路徑進行設置的
#im_name是圖片原本的名稱,所以在保存的時候,如果還是在測試圖片的文件下進行保存,會被覆蓋
(4)最後,就是小小的慶祝一下,總算是完成了…
這是本人自己的記錄,其中可能遇到和大家不一樣的問題,的如果有什麼疑問,可以下方留言討論!!!