參考:https://cloud.tencent.com/developer/news/303081
實現步驟也很簡單,實現流程如下:
1.安裝前准備:
安裝前請確保TensorFlow和相關的依賴庫安裝成功
2.下載 faster rcnn程序包
連接:https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3
解壓,然后可以看一下里面的readme
3.安裝python依賴庫
注意還是要在TensorFlow虛擬環境下安裝,命令:
pip install cython
pip install python-opencv
pip install easydict
4.編譯:
在cmd中使用cd命令到解壓后的文件夾下../data/coco/PythonAPI目錄下,執行以下代碼:
python setup.py build_ext --inplace
python setup.py build_ext install
執行時如果報錯 Unable to find vcvarsall.bat,建議安裝visual studio 2015,安裝時默認的語言是C#和VB,需要把C++也勾上。
附python版本與C++編譯器版本對應關系圖:
所以,VS2015必不可少
如果已經安裝了VS 2015,檢查VS安裝目錄下是否有vcvarsall.bat文件,例如我的路徑為:D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC,如果沒有此文件,表明安裝時是默認安裝的,還缺少C++編譯文件,這個時候可以打開VS,新建項目,語言選擇C++,此時VS會讓你安裝一個工具,安裝后就好了。
5.下載VOC2007格式的數據集
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
將下載后的三個壓縮包解壓到同一個文件夾下,以WinRAR為例,同時選中三個壓縮包,右鍵,然后選擇解壓到當前文件夾
可以得到VOCDevkit文件夾,將VOCDevkit重命名為VOCDevkit2007,然后將這個文件夾拷貝到你自己的Faster-RCNN中data目錄下
6.下載預訓練的VGG16網絡模型:
下載地址:http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz
下載之后解壓,文件重命名為vgg16.ckpt,新建文件夾imagenet_weights,把vgg16.ckpt放到imagenet_weights下,再將imagenet_weights文件夾拷貝到data文件夾下,
這樣,VGG16網絡模型的地址應該類似於這樣:../data/imagenet_weights/vgg16.ckpt
7.訓練模型:
在faster rcnn目錄下運行命令
python train.py
OK,搞定,這時候,就是在用VOCDevkit2007下的示例圖片訓練分類模型了。第一次運行時可能會報錯說找不到matplotlib,scipy,PIL(對應的是pillow庫)等,安裝這些庫就好了。另外,不管是CPU版本還是GPU版本的TensorFlow,建議是使用較低版本的,比如1.3。使用anaconda的好處就是,你隨時可以新建一個虛擬環境,重新安裝配置TensorFlow,不用去管python環境了。
模型訓練結束后,
在 ..\default\voc_2007_trainval\default目錄下可以看到訓練的模型
默認每5000次保存,一共迭代40000次(max_iters),這些在config.py中可以自己設置。
9.運行demo
在運行demo.py前在編輯器中對demo.py作些更改
這句代碼指向訓練模型結果,但實際是不存在的,需要我們新建文件夾,並且拷貝上一步生成的模型到該文件夾下,為了簡化,直接把這句代碼替換成自己的路徑即可,例如:
tfmodel=r'D:\FasterRCNN\output\vgg16\voc_2007_trainval\default\vgg16_faster_rcnn_iter_40000.ckpt'
注意后綴是ckpt,關於tensorflow生成的ckpt模型,大家可以自行查閱相關的參考資料,這里簡單介紹一下,ckpt模型實際包含三個部分,ckpt.meta保存graph結構,ckpt.index是一個string-string table,ckpt.data保存模型的所有變量值
另外,找到def parse_args()函數,輸入的參數中net默認是res101,dataset默認是pascal_voc_0712,實際上我們用的網絡模型是vgg16,數據集是pascal_voc,改成下面這樣:
然后,就可以運行了,執行代碼:
python demo.py
這樣就能得到文章開頭的結果了。
