會保持更新愿棋,作為自己可能還要再趟一次坑的時候好有個靠譜的記錄!網(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薨薄=俊!CL锿怼!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