py-faster-rcnn(caffe)的end2end使用自己的數(shù)據(jù)從安裝插龄,訓練到demo.py記錄

會保持更新愿棋,作為自己可能還要再趟一次坑的時候好有個靠譜的記錄!網(wǎng)上的記錄實在太多均牢,唯一靠譜的都在github上的issue了糠雨,這真的是計算機代碼歷史上最偉大的發(fā)明了!E枪颉甘邀!


安裝

現(xiàn)在假定你已經(jīng)裝好了新的cuda,cudnn垮庐,python還有caffe(雖然這個東西其實并不實際用到K卤埂@欧!)

根據(jù)github上的tutorial 安裝走是沒錯的,但是你會遇到一些問題:

1. 你在進行?

cd$FRCN_ROOT/caffe-fast-rcnn

make -j8&&make pycaffe?

你發(fā)現(xiàn)你報錯了:

這是因為當前版本的caffe的cudnn實現(xiàn)與系統(tǒng)所安裝的cudnn的版本不一致引起的核畴。

解決辦法:

1.將./include/caffe/util/cudnn.hpp 換成最新版的caffe里的cudnn的實現(xiàn)壹瘟,即相應的cudnn.hpp.

2. 將./include/caffe/layers里的纳胧,所有以cudnn開頭的文件挂捅,例如cudnn_conv_layer.hpp。?? 都替換成最新版的caffe里的相應的同名文件护盈。

3.將./src/caffe/layer里的挟纱,所有以cudnn開頭的文件,例如cudnn_lrn_layer.cu腐宋,cudnn_pooling_layer.cpp紊服,cudnn_sigmoid_layer.cu檀轨。

都替換成最新版的caffe里的相應的同名文件。

rbgirshick的py-faster-rcnn實現(xiàn)欺嗤,因為其cudnn實現(xiàn)為舊版本的實現(xiàn)参萄,所有出現(xiàn)了問題.


使用自己的數(shù)據(jù)的話訓練

首先最重要的就是數(shù)據(jù)了!<灞讹挎!

我在github上上傳了一個lablimg增強版(一張照片可以變成20張!)但是環(huán)境是 windows 和 python3.5.

用這個制作數(shù)據(jù)庫就不會出現(xiàn)那些惱人的問題了吆玖。


其次就是需要修改prototxt配置文件?

這些配置文件都在models下的pascal_voc下筒溃。里面有三種網(wǎng)絡結構:ZF, VGG16, VGG_CNN_M_1024,本文選擇的是VGG_CNN_M_1024沾乘。每個網(wǎng)絡結構中都有三個文件夾怜奖,分別是faster_rcnn_end2end , faster_rcnn_alt_opt , fast_rcnn 。使用近似聯(lián)合訓練faster_rcnn_end2end 翅阵,比交替優(yōu)化快1.5倍歪玲,但是準確率差不多,

1.?train.prototxt和test.prototxt

第一處是input-data層,將原來的21改成:你的實際類別數(shù)+1(背景)掷匠,我目標檢測一共有46類滥崩,所以加上背景這一類,一共47類讹语。?

第二處是cls_score層夭委,將原來的21改成:你的實際類別數(shù)+1(背景),我目標檢測一共有46類募强,所以加上背景這一類,一共47類崇摄。?

第三處是bbox_pred,這里需將原來的84改成(你的類別數(shù)+1)×4擎值,即(46+1)×4=188?

第四處:

layer {

? name: 'roi-data'

? type: 'Python'

? bottom: 'rpn_rois'

? bottom: 'gt_boxes'

? top: 'rois'

? top: 'labels'

? top: 'bbox_targets'

? top: 'bbox_inside_weights'

? top: 'bbox_outside_weights'

? python_param {

? ? module: 'rpn.proposal_target_layer'

? ? layer: 'ProposalTargetLayer'

? ? param_str: "'num_classes': 3" ? !V鹨帧p!2薨薄=俊!CL锿怼!9帷O屯健芹壕!

**

test.prototxt中沒有input-data層,所以只需要按照train中修改cls_score層以及bbox_pred層即可

**

2.修改lib/datasets/pascal_voc.py接奈,將類別改成自己的類別?

這里有一個注意點就是踢涌,這里的類別以及你之前的類別名稱最好是全部小寫,假如是大寫的話序宦,則會報keyError的錯誤睁壁,這時只需要在pascal_voc。py中第212行的lower去掉即可?

dataset目錄下主要有三個文件潘明,分別是

factory.py:這是一個工廠類疫剃,用類生成imdb類并且返回數(shù)據(jù)庫供網(wǎng)絡訓練和測試使用

imdb.py:是數(shù)據(jù)庫讀寫類的基類,封裝了許多db的操作

pascl_voc.pyRoss用這個類來操作

3.修改py-faster-rcnn/lib/datasets/imdb.py?

在使用自己的數(shù)據(jù)進行訓練時巢价,假如你的數(shù)據(jù)集中的圖片沒有統(tǒng)一整理過就會報assert(boxes[:,2]>=boxes[:,0].all()這個錯誤牲阁,故需在imdb.py中加入如下幾行?


3. 下載預訓練的ImageNet的模型

$ cd py-fasyer-rcnn

$./data/scripts/fetch_imagenet_models.sh

下載的imagenet.model是在/data文件夾下?

下載連接就點開這個.sh ?里面就有連接可以下載壤躲!


4. 訓練

$ cd py-faster-rcnn$ ./experiments/scripts/faster_rcnn_end2end.sh0VGG_CNN_M_1024pascal_voc

由于訓練過程太長,訓練過程產(chǎn)生的輸出保存在/experiment/log文件中碉克,這樣可以方便查看凌唬。


訓練的時候會遇到的問題:

問題一:

pb2.text_format.Merge(f.read(), self.solver_param) AttributeError: 'module' object has no attribute 'text_format'

經(jīng)過google之后發(fā)現(xiàn)是protobuf的本版發(fā)生了變換,之前在配置caffe的時候手動安裝了protbuf漏麦,版本是2.5.0,后來安裝了tensorflow 我回憶了一下更耻,protobuf的版本貌似是發(fā)生了變換捏膨。

解決辦法:

sudo pip install protobuf==2.5.0

剛才又發(fā)現(xiàn)一個新的解決方法:

在文件./lib/fast_rcnn/train.py增加一行import google.protobuf.text_format 即可解決問題


問題二: TypeError: slice indices must be integers or None or have an __index__ method

是你的python的numpy 版本太高,這時需要將numpy從1.14.0降為1.11.0目胡,

解決辦法:

打開新終端链快,輸入:

sudo?pip uninstall numpy

sudopip install -U numpy==1.11.0

然后 ?And 文件在?lib/rpn/proposal_target_layer.py. 修改?

for ind in inds:?

cls=clss[ind]?

start=4*cls

end=start+4

bbox_targets[ind, start:end]=bbox_target_data[ind,1:]?

bbox_inside_weights[ind, start:end]=cfg.TRAIN.BBOX_INSIDE_WEIGHTS

add the following two lines after?end = start + 4,

start=int(start)? ? ? ??

end=int(end)

還有在這個行后加入 fg_rois_per_this_image = int (fg_rois_per_this_image)?after code block,

#Guard against the case when an image has fewer than fg_rois_per_image#foreground RoIsfg_rois_per_this_image=min(fg_rois_per_image, fg_inds.size)

這些步驟都是在避免因為numpy的版本問題 導致的情況


問題三: ?/home/wu/faster_rcnn/py-faster-rcnn/tools/../lib/rpn/proposal_layer.py:175: RuntimeWarning: invalid value encountered in greater_equal

keep = np.where((ws >= min_size) & (hs >= min_size))[0]

Floating Point Exception

解決方法:

這是要修改學習率久又,在?/home/deep/py-faster-rcnn/models/pascal_voc/VGG_CNN_M_1024/faster_rcnn_end2end/solver.prototxt 里面lr_base 往小里面改效五,并且配合迭代次數(shù)一起改B濉!戒劫!

還有勒 ?就是需要 修改?RNG_SEED

/home/deep/py-faster-rcnn/lib/fast_rcnn/config.py

里面 把 __C.RNG_SEED = 3

改了

問題四: ?那么隨之而來的問題就是 怎么繼續(xù)訓練:

time ./tools/train_net.py --gpu ${GPU_ID}?

--solver models/${PT_DIR}/${NET}/faster_rcnn_end2end/solver.prototxt?

*--weights data/imagenet_models/${NET}.v2.caffemodel *

--imdb ${TRAIN_IMDB}?

--iters ${ITERS}?

--cfg experiments/cfgs/faster_rcnn_end2end.yml?

${EXTRA_ARGS}


解決方法: 中間把weight層改掉Q赶浮淘邻!

time ./tools/train_net.py --gpu ${GPU_ID}?

--solver models/${PT_DIR}/${NET}/faster_rcnn_end2end/solver_top.prototxt?

--snapshot zf_faster_rcnn_iter_100000.solverstate?

--imdb ${TRAIN_IMDB}?

--iters ${ITERS}?

--cfg experiments/cfgs/faster_rcnn_end2end.yml?

${EXTRA_ARGS}


訓練訓練著,然后問題 五:

File "/usr/local/fast-rcnn/tools/../lib/roi_data_layer/roidb.py", line 23, in prepare_roidb

roidb[i]['image'] = imdb.image_path_at(i)

IndexError: list index out of range

解決方法:

delete the specific cache files for your training data under the folder fast-rcnn-master/data/cache/, and try again


問題六:?

roidb[i][‘image’] = imdb.image_path_at(i)

IndexError: list index out of range

解決方法:刪除data/cache里面的pki文件

注意:不管在訓練過程中遇到什么問題统阿,修正過后扶平,重新訓練之前都需要將cache中的pki文件刪除之后再重新運行蔬蕊,


愚蠢的錯誤一:

net.params['bbox_pred'][0].data[...] = (net.params['bbox_pred'][0].data *self.bbox_stds[:, np.newaxis])

ValueError: operands could not be broadcast together with shapes (84,4096) (12,1) .

解決方法:

你改prototxt的時候 沒改對!


愚蠢的錯誤二:

File"/home/py-faster-rcnn/tools/../lib/datasets/voc_eval.py",?line?126,?in?voc_eval??

R?=?[objfor?obj?in?recs[imagename]?if?obj['name']?==?classname]??

KeyError:'IMG_0805'??

解決方法:

刪除data/VOCdekit2007下的annotations_cache文件夾


可能的問題: 由于做數(shù)據(jù)集 有邊框在像素0的地方麻献。

AssertionError

File "/py-faster-rcnn/tools/../lib/datasets/imdb.py", line 112, in append_flipped_images

assert (boxes[:, 2] >= boxes[:, 0]).all()

AssertionError

解決方法:這些問題的根源都是faster-rcnn系列在處理生成pascal voc數(shù)據(jù)集時猜扮,為了使像素以0為起點,每個bbox的左上右下坐標都減1,如果你的數(shù)據(jù)里有坐標為0,一般是x1或y1,這時x1 = 0-1 = 65535.

打開$faster-rcnn-root/lib/datasets/imdb.py

oldx1?=?boxes[:,?0].copy()??

oldx2?=?boxes[:,2].copy()??

boxes[:,0]?=?widths[i]?-?oldx2?-?1??

boxes[:,2]?=?widths[i]?-?oldx1?-?1??

assert?(boxes[:,?2]?>=?boxes[:,?0]).all()??

改為:

oldx1?=?boxes[:,?0].copy()??

oldx2?=?boxes[:,2].copy()??

boxes[:,0]?=?widths[i]?-?oldx2?-?1??

boxes[:,2]?=?widths[i]?-?oldx1?-?1??

for?b?in?range(len(boxes)):??

if?boxes[b][2]<?boxes[b][0]:??

boxes[b][0]?=?0??

assert?(boxes[:,?2]?>=?boxes[:,?0]).all()??

并且打開:$faster-rcnn-root/lib/datasets/pascal.py(這一步很重要O输觥集惋!)將:

x1?=?float(bbox.find('xmin').text)?-?1???

y1?=?float(bbox.find('ymin').text)?-?1??

x2?=?float(bbox.find('xmax').text)?-?1??

y2?=?float(bbox.find('ymax').text)?-?1??

改為:

x1?=?float(bbox.find('xmin').text)???

y1?=?float(bbox.find('ymin').text)???

x2?=?float(bbox.find('xmax').text)???

y2?=?float(bbox.find('ymax').text)???


問題結束 (九個刮刑,其實 有些問題 你還會反復碰到养渴。泛烙。。)

然后進入demopart

將output中的最終模型拷貝到data/faster_rcnn_models藐唠,

修改tools下的demo.py

我是使用VGG_CNN_M_1024這個中型網(wǎng)絡鹉究,不是默認的ZF,所以要改的地方挺多?

1.修改class?

2.增加你自己訓練的模型?

3.修改prototxt,如果你用的ZF妈嘹,就不用改了?

6.開始檢測?

執(zhí)行 ./tools/demo.py –net myvgg1024?

假如不想那么麻煩輸入?yún)?shù)润脸,可以在demo的parse_args()里修改默認參數(shù)?

parser.add_argument(‘–net’, dest=’demo_net’, help=’Network to use [myvgg1024]’,?

choices=NETS.keys(), default=’myvgg1024’)?

然后注釋掉上一行痘绎!


這樣只需要輸入 ./tools/demo.py 就可以了孤页,也遇到新的問題。

問題一:

im_orig = im.astype(np.float32, copy=True)

AttributeError: 'NoneType' object has no attribute 'astype'

解決方法:

仔細檢查路徑和文件名行施,查看demo.py里路徑相關的文件蛾号。


先看一下關于demo.py的知識

https://blog.csdn.net/smf0504/article/details/52751251

然后 高級的來了: 一些騷東西去改些demo。py來獲得:

獲取Faster RCNN最終候選框坐標值

https://blog.csdn.net/zllljf/article/details/79464217

代碼理解網(wǎng)絡選擇候選區(qū)域及確定最終目標框的過程

https://blog.csdn.net/zllljf/article/details/79525245

faster rcnn可視化(修改demo.py保存網(wǎng)絡中間結果)

https://blog.csdn.net/qq_26898461/article/details/53437398

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末展运,一起剝皮案震驚了整個濱河市精刷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埂软,老刑警劉巖纫事,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炫七,居然都是意外死亡诉字,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門陵霉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伍绳,“玉大人,你說我怎么就攤上這事效床∪ㄋ” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵沪猴,是天一觀的道長采章。 經(jīng)常有香客問我,道長担租,這世上最難降的妖魔是什么抵怎? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任反惕,我火速辦了婚禮,結果婚禮上承璃,老公的妹妹穿的比我還像新娘盔粹。我一直安慰自己,他們只是感情好舷嗡,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布进萄。 她就那樣靜靜地躺著,像睡著了一般可婶。 火紅的嫁衣襯著肌膚如雪援雇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天具温,我揣著相機與錄音筐赔,去河邊找鬼。 笑死达皿,一個胖子當著我的面吹牛较沪,可吹牛的內容都是我干的。 我是一名探鬼主播们何,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼控轿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鹦蠕?” 一聲冷哼從身側響起在抛,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肠阱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體走趋,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡簿煌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年鉴吹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片授滓。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡肆糕,死狀恐怖,靈堂內的尸體忽然破棺而出淮摔,到底是詐尸還是另有隱情始赎,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布魔招,位于F島的核電站办斑,受9級特大地震影響杆逗,放射性物質發(fā)生泄漏。R本人自食惡果不足惜罪郊,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一悔橄、第九天 我趴在偏房一處隱蔽的房頂上張望腺毫。 院中可真熱鬧挣柬,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至遭贸,卻和暖如春壕吹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耳贬。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工咒劲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帐偎。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓蛔屹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嫉父。 傳聞我的和親對象是個殘疾皇子眼刃,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容