日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 目标检测 >内容正文

目标检测

caffe框架下目标检测——faster-rcnn实战篇操作

發布時間:2024/9/21 目标检测 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 caffe框架下目标检测——faster-rcnn实战篇操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原有模型

1、下載fasrer-rcnn源代碼并安裝

git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git

1)? 經常斷的話,可以采取兩步:

git clone https://github.com/rbgirshick/py-faster-rcnn.git

2)? 到py-faster-rcnn中,繼續下載caffe-faster-rcnn,采取后臺跑:

git submodule update --init –recursive

2、編譯cython模塊

在py-faster-rcnn/lib目錄下,運行以下命令:

Make

3、編譯caffe和pycaffe

在py-faster-rcnn/caffe-faster-rcnn下,編譯

make clean

make all –j16

make test

make runtest

注意:由于py-faster-rcnn使用python層,在Makefile.config中把WITH_PYTHON_LAYER:=1

我的環境會使用

4、下載模型:

Sh? data/scripts/fetch_faster_rcnn_models.sh

5、運行基于python的demo

執行以下命令:

Python tools/demo.py

6、下載訓練、測試數據集

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar

?

tar xvf VOCtrainval_06-Nov-2007.tar

tar xvf VOCtest_06-Nov-2007.tar

tar xvf VOCdevkit_08-Jun-2007.tar

?

7、為了PASCAL VOC創建symlinks,創建軟連接

ln -s VOCdevkit VOCdevkit2007

?

遇到的問題見caffe框架下目標檢測——faster-rcnn實戰篇問題集錦

?

工程目錄介紹

?

caffe-fast-rcnn —> caffe框架

data —> 存放數據,以及讀取文件的cache

experiments —>存放配置文件以及運行的log文件,配置文件

lib —> python接口

models —> 三種模型, ZF(S)/VGG1024(M)/VGG16(L)

output —> 輸出的model存放的位置,不訓練此文件夾沒有

tools —> 訓練和測試的python文件

?

訓練模型需要修改的部分:

data —> 存放數據,以及讀取文件的cache

models —> 三種模型, ZF(S)/VGG1024(M)/VGG16(L)

lib —> python接口

?

開始訓練部分:

experiments —>存放配置文件以及運行的log文件,配置文件

?

用模型測試/實驗結果部分:

tools —> 訓練和測試的python文件

?

數據集

?

參考VOC2007的數據集格式,主要包括三個部分:

?

JPEGImages

Annotations

ImageSets/Main

JPEGImages —> 存放你用來訓練的原始圖像

?

Annotations —> 存放原始圖像中的Object的坐標信息,XML格式

?

ImageSets/Main —> 指定用來train,trainval,val和test的圖片的編號

?

JPEGImages

?

把圖片放入,但是有三點注意:

?

編號要以6為數字命名,例如000034.jpg

圖片要是JPEG/JPG格式的,PNG之類的需要自己轉換下

圖片的長寬比(width/height)要在0.462-6.828之間,就是太過瘦長的圖片不要

0.462-6.828,總之長寬比太大或者太小的,注意將其剔除,否則可能會出現下面實驗錯誤:

?

Traceback (most recent call last):

File “/usr/lib/python2.7/multiprocessing/process.py”, line 258, in _bootstrap

self.run()

File “/usr/lib/python2.7/multiprocessing/process.py”, line 114, in run

self._target(*self._args, **self._kwargs)

File “./tools/train_faster_rcnn_alt_opt.py”, line 130, in train_rpn

max_iters=max_iters)

File “/home/work-station/zx/py-faster-rcnn/tools/../lib/fast_rcnn/train.py”, line 160, in train_net

model_paths = sw.train_model(max_iters)

File “/home/work-station/zx/py-faster-rcnn/tools/../lib/fast_rcnn/train.py”, line 101, in train_model

self.solver.step(1)

File “/home/work-station/zx/py-faster-rcnn/tools/../lib/rpn/anchor_target_layer.py”, line 137, in forward

gt_argmax_overlaps = overlaps.argmax(axis=0)

ValueError: attempt to get argmax of an empty sequence

Google給出的原因是 Because the ratio of images width and heights is too small or large,這個非常重要

?

Annotations

?

faster rcnn訓練需要圖像的bounding box信息作為監督(ground truth),所以你需要將你的所有可能的object使用框標注,并寫上坐標,最終是一個XML格式的文件,一個訓練圖片對應Annotations下的一個同名的XML文件

?

參考官方VOC的Annotations的格式:

<annotation>

??? <folder>VOC2007</folder>#數據集文件夾

??? <filename>009963.jpg</filename>#圖片的name

??? <source>#注釋信息,無所謂有無

?????? <database>The VOC2007 Database</database>

?????? <annotation>PASCAL VOC2007</annotation>

?????? <image>flickr</image>

?????? <flickrid>65163277</flickrid>

??? </source>

??? <owner>#注釋信息,無所謂有無

?????? <flickrid>Jez_P</flickrid>

?????? <name>Jeremy Pick</name>

??? </owner>

??? <size>#圖片大小

?????? <width>374</width>

?????? <height>500</height>

?????? <depth>3</depth>

??? </size>

??? <segmented>0</segmented>

??? <object>#多少個框就有多少個object標簽

?????? <name>car</name>#bounding box中的object的class name

?????? <pose>Frontal</pose>

?????? <truncated>1</truncated>

?????? <difficult>0</difficult>

?????? <bndbox>

?????????? <xmin>2</xmin>#框的坐標

?????????? <ymin>3</ymin>

?????????? <xmax>374</xmax>

?????????? <ymax>500</ymax>

?????? </bndbox>

??? </object>

</annotation>

這里有一個非常好用的工具VOC框圖工具,可以自動幫你生成需要的XML格式,實際中發現格式基本無誤,只有小的地方需要改動下

?

https://github.com/tzutalin/labelImg

?

Imagesets/Main

?

因為VOC的數據集可以做很多的CV任務,比如Object detection, Semantic segementation, Edge detection等,所以Imageset下有幾個子文件夾(Layout, Main, Segementation),修改下Main下的文件 (train.txt, trainval.txt, val.txt, test.txt),里面寫上你想要進行任務的圖片的編號

?

將上述你的數據集放在py-faster-rcnn/data/VOCdevkit2007/VOC2007下面,替換原始VOC2007的JPEGIMages,Imagesets,Annotations

?

代碼修改

?

修改源文件

?

faster rcnn有兩種各種訓練方式:

?

Alternative training(alt-opt)

Approximate joint training(end-to-end)

推薦使用第二種,因為第二種使用的顯存更小,而且訓練會更快,同時準確率差不多,兩種方式需要修改的代碼是不一樣的,同時faster rcnn提供了三種訓練模型,小型的ZFmodel,中型的VGG_CNN_M_1024和大型的VGG16,論文中說VGG16效果比其他兩個好,但是同時占用更大的GPU顯存(~11GB)

?

我使用的是VGG16 model + alternative training,需要檢測的類別四類,加上背景所以總共是五類

1 、py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage1_fast_rcnn_train.pt

?

layer {?

? name: 'data'?

? type: 'Python'?

? top: 'data'?

? top: 'rois'?

? top: 'labels'?

? top: 'bbox_targets'?

? top: 'bbox_inside_weights'?

? top: 'bbox_outside_weights'?

? python_param {?

??? module: 'roi_data_layer.layer'?

??? layer: 'RoIDataLayer'?

??? param_str: "'num_classes': 5" #按訓練集類別改,該值為類別數+1?

? }?

}?

?

layer {?

? name: "cls_score"?

? type: "InnerProduct"?

? bottom: "fc7"?

? top: "cls_score"?

? param {

? lr_mult: 1.0

? }?

? param {

? lr_mult: 2.0

? }?

? inner_product_param {?

??? num_output: 5 #按訓練集類別改,該值為類別數+1?

??? weight_filler {?

????? type: "gaussian"?

????? std: 0.01?

??? }?

??? bias_filler {?

????? type: "constant"?

????? value: 0?

??? }?

? }?

}?

?

layer {?

? name: "bbox_pred"?

? type: "InnerProduct"?

? bottom: "fc7"?

? top: "bbox_pred"?

? param {

? lr_mult: 1.0

? }?

? param {

? lr_mult: 2.0

? }?

? inner_product_param {?

??? num_output: 20 #按訓練集類別改,該值為(類別數+1)*4,四個頂點坐標?

??? weight_filler {?

????? type: "gaussian"?

????? std: 0.001?

??? }?

??? bias_filler {?

????? type: "constant"?

????? value: 0?

??? }?

? }?

}?

?

2 、py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage1_rpn_train.pt

?

layer {?

? name: 'input-data'?

? type: 'Python'?

? top: 'data'?

? top: 'im_info'?

? top: 'gt_boxes'?

? python_param {?

??? module: 'roi_data_layer.layer'?

??? layer: 'RoIDataLayer'?

??? param_str: "'num_classes': 5" #按訓練集類別改,該值為類別數+1?

? }?

}?

3、 py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage2_fast_rcnn_train.pt

?

layer {?

? name: 'data'?

? type: 'Python'?

? top: 'data'?

? top: 'rois'?

? top: 'labels'?

? top: 'bbox_targets'?

? top: 'bbox_inside_weights'?

? top: 'bbox_outside_weights'?

? python_param {?

??? module: 'roi_data_layer.layer'?

??? layer: 'RoIDataLayer'?

??? param_str: "'num_classes': 5" #按訓練集類別改,該值為類別數+1?

? }?

}?

?

layer {?

? name: "cls_score"?

? type: "InnerProduct"?

? bottom: "fc7"?

? top: "cls_score"?

? param {

? lr_mult: 1.0

? }?

? param {

? lr_mult: 2.0

? }?

? inner_product_param {?

??? num_output: 5 #按訓練集類別改,該值為類別數+1?

??? weight_filler {?

????? type: "gaussian"?

????? std: 0.01?

??? }?

??? bias_filler {?

????? type: "constant"?

????? value: 0?

??? }?

? }?

}?

?

layer {?

? name: "bbox_pred"?

? type: "InnerProduct"?

? bottom: "fc7"?

? top: "bbox_pred"?

? param {

? lr_mult: 1.0

? }?

? param {

? lr_mult: 2.0

? }?

? inner_product_param {?

??? num_output: 20 #按訓練集類別改,該值為(類別數+1)*4,四個頂點坐標?

??? weight_filler {?

????? type: "gaussian"?

????? std: 0.001?

??? }?

??? bias_filler {?

????? type: "constant"?

????? value: 0?

??? }?

? }?

}?

4 、py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage2_rpn_train.pt

?

layer {?

? name: 'input-data'?

? type: 'Python'?

? top: 'data'?

? top: 'im_info'?

? top: 'gt_boxes'?

? python_param {?

??? module: 'roi_data_layer.layer'?

??? layer: 'RoIDataLayer'?

??? param_str: "'num_classes': 5" #按訓練集類別改,該值為類別數+1?

? }?

}?

5 、py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt

?

layer {

? name: "cls_score"

? type: "InnerProduct"

? bottom: "fc7"

? top: "cls_score"

? inner_product_param {

??? num_output: 5#按訓練集類別改,該值為類別數+1

? }

}

layer {

? name: "bbox_pred"

? type: "InnerProduct"

? bottom: "fc7"

? top: "bbox_pred"

? inner_product_param {

??? num_output: 20#按訓練集類別改,該值為(類別數+1)*4

? }

}

6、 py-faster-rcnn/lib/datasets/pascal_voc.py

?

class pascal_voc(imdb):?

??? def __init__(self, image_set, year, devkit_path=None):?

??????? imdb.__init__(self, 'voc_' + year + '_' + image_set)?

??????? self._year = year?

??????? self._image_set = image_set?

??????? self._devkit_path = self._get_default_path() if devkit_path is None \?

??????????????????????????? else devkit_path?

??????? self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)?

??????? self._classes = ('__background__', # always index 0?

???????????????????????? captcha' # 有幾個類別此處就寫幾個,我是兩個

????????????????????? )?

line 212

?

cls = self._class_to_ind[obj.find('name').text.lower().strip()]?

?

如果你的標簽含有大寫字母,可能會出現KeyError的錯誤,所以建議全部使用小寫字母

?

到此代碼修改就搞定了

?

訓練

?

訓練前還需要注意幾個地方

?

1 cache問題

?

假如你之前訓練了官方的VOC2007的數據集或其他的數據集,是會產生cache的問題的,建議在重新訓練新的數據之前將其刪除

?

(1) py-faster-rcnn/output

(2) py-faster-rcnn/data/cache

?

2 訓練參數

?

py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage_fast_rcnn_solver*.pt

?

base_lr: 0.001

lr_policy: 'step'

step_size: 30000

display: 20

....

迭代次數在文件py-faster-rcnn/tools/train_faster_rcnn_alt_opt.py中進行修改

?

line 80

?

max_iters = [80000, 40000, 80000, 40000]

分別對應rpn第1階段,fast rcnn第1階段,rpn第2階段,fast rcnn第2階段的迭代次數,自己修改即可,不過注意這里的值不要小于上面的solver里面的step_size的大小,大家自己修改吧

?

開始訓練:

?

cd py-faster-rcnn

./experiments/scripts/faster_rcnn_alt_opt.sh 0 VGG16 pascal_voc

?

指明使用第一塊GPU(0),模型是VGG16,訓練數據是pascal_voc(voc2007),沒問題的話應該可以迭代訓練了

?

結果

?

訓練完畢,得到我們的訓練模型,我們就可以使用它來進行我們的object detection了,具體是:

1 將py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval/VGG16_faster_rcnn_final.caffemodel,拷貝到py-faster-rcnn/data/faster_rcnn_models下

?

2 將你需要進行test的images放在py-faster-rcnn/data/demo下

?

3 修改py-faster-rcnn/tools/demo.py文件

?

CLASSES = ('_background_', 'captcha') #參考你自己的類別寫

?

NETS = {'vgg16': ('VGG16',

'VGG16_faster_rcnn_final.caffemodel'), #改成你訓練得到的model的name

'zf': ('ZF',

'ZF_faster_rcnn_final.caffemodel')

}

im_names = ['1559.jpg','1564.jpg']? # 改成自己的test image的name

上幾張我的檢測結果吧

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

總結

以上是生活随笔為你收集整理的caffe框架下目标检测——faster-rcnn实战篇操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。