会保持更新,作为自己可能还要再趟一次坑的时候好有个靠谱的记录!网上的记录实在太多,唯一靠谱的都在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