py-faster-rcnn(caffe)的end2end使用自己的数据从安装,训练到demo.py记录

会保持更新,作为自己可能还要再趟一次坑的时候好有个靠谱的记录!网上的记录实在太多,唯一靠谱的都在github上的issue了,这真的是计算机代码历史上最伟大的发明了!!!


安装

现在假定你已经装好了新的cuda,cudnn,python还有caffe(虽然这个东西其实并不实际用到!!!)

根据github上的tutorial 安装走是没错的,但是你会遇到一些问题:

1. 你在进行 

cd$FRCN_ROOT/caffe-fast-rcnn

make -j8&&make pycaffe 

你发现你报错了:

这是因为当前版本的caffe的cudnn实现与系统所安装的cudnn的版本不一致引起的。

解决办法:

1.将./include/caffe/util/cudnn.hpp 换成最新版的caffe里的cudnn的实现,即相应的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实现,因为其cudnn实现为旧版本的实现,所有出现了问题.


使用自己的数据的话训练

首先最重要的就是数据了!!!

我在github上上传了一个lablimg增强版(一张照片可以变成20张!)但是环境是 windows 和 python3.5.

用这个制作数据库就不会出现那些恼人的问题了。


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

这些配置文件都在models下的pascal_voc下。里面有三种网络结构:ZF, VGG16, VGG_CNN_M_1024,本文选择的是VGG_CNN_M_1024。每个网络结构中都有三个文件夹,分别是faster_rcnn_end2end , faster_rcnn_alt_opt , fast_rcnn 。使用近似联合训练faster_rcnn_end2end ,比交替优化快1.5倍,但是准确率差不多,

1. train.prototxt和test.prototxt

第一处是input-data层,将原来的21改成:你的实际类别数+1(背景),我目标检测一共有46类,所以加上背景这一类,一共47类。 

第二处是cls_score层,将原来的21改成:你的实际类别数+1(背景),我目标检测一共有46类,所以加上背景这一类,一共47类。 

第三处是bbox_pred,这里需将原来的84改成(你的类别数+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"   !!!!!!!!!!!!!

**

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类并且返回数据库供网络训练和测试使用

imdb.py:是数据库读写类的基类,封装了许多db的操作

pascl_voc.pyRoss用这个类来操作

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

在使用自己的数据进行训练时,假如你的数据集中的图片没有统一整理过就会报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

由于训练过程太长,训练过程产生的输出保存在/experiment/log文件中,这样可以方便查看。


训练的时候会遇到的问题:

问题一:

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

经过google之后发现是protobuf的本版发生了变换,之前在配置caffe的时候手动安装了protbuf,版本是2.5.0,后来安装了tensorflow 我回忆了一下,protobuf的版本貌似是发生了变换。

解决办法:

sudo pip install protobuf==2.5.0

刚才又发现一个新的解决方法:

在文件./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 往小里面改,并且配合迭代次数一起改!!!

还有勒  就是需要 修改 RNG_SEED

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

里面 把 __C.RNG_SEED = 3

改了

问题四:  那么随之而来的问题就是 怎么继续训练:

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层改掉!!

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文件夹


可能的问题: 由于做数据集 有边框在像素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数据集时,为了使像素以0为起点,每个bbox的左上右下坐标都减1,如果你的数据里有坐标为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(这一步很重要!!)将:

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这个中型网络,不是默认的ZF,所以要改的地方挺多 

1.修改class 

2.增加你自己训练的模型 

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

6.开始检测 

执行 ./tools/demo.py –net myvgg1024 

假如不想那么麻烦输入参数,可以在demo的parse_args()里修改默认参数 

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

代码理解网络选择候选区域及确定最终目标框的过程

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

faster rcnn可视化(修改demo.py保存网络中间结果)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容