faster-rcnn训练和测试自己的数据(VGG/ResNet)以及遇到的问题

http://www.cnblogs.com/caffeaoto/p/6536482.html

主要参照这个教程改的


需要准备的文件:Annotation文件,图片,用来训练的图片名称list.txt


训练:

需要改的文件:

lib/datasets/下的pascal_voc.py,factory.py

data/faster_rcnn_models/下存放预训练好的模型,需要什么样的网络就到caffe model zoo下载相应的模型,我用了VGG_CNN_M_1024和resnet101

models/pascal_voc/下存放相应的模型配置文件,打开相应的train.prototxt

1、data层的num_classes: n (自己要训练的类别+1,1为背景)
2、roi_data层的num_classes:n
3、cls_score层的num_output:n
4、bbox_preda层的num_output : 4*n


启动网络:

在faster根目录下创建一个train_xx.sh脚本,输入以下内容,

python ./tools/train_net.py --gpu 1 --solver models/hs/faster_rcnn_end2end/solver.prototxt --weights data/imagenet_models/VGG_CNN_M_1024.v2.caffemodel --imdb hs --iters 80000 --cfg experiments/cfgs/faster_rcnn_end2end.yml

指定参数:

train_xx.sh、faster_rcnn_end2end.yml、train_net.py、solver.prototxt都可以指定相关的参数,如果没有特别要求,后三个文件可以不用改

train_xx.sh:

train_net.py是网络的训练文件,之后的参数都是附带的输入参数


--gpu 代表机器上的GPU编号,如果是nvidia系列的tesla显卡,可以在终端中输入nvidia-smi来查看当前的显卡负荷,选择合适的显卡


--solver 代表模型的配置文件,train.prototxt的文件路径已经包含在这个文件之中


--weights 代表初始化的权重文件,这里用的是Imagenet上预训练好的模型,中型的网络我们选择用VGG_CNN_M_1024.v2.caffemodel


--imdb 这里给出的训练的数据库名字需要在factory.py的_sets中,我在文件里面有_sets[‘hs’],train_net.py这个文件会调用factory.py再生成hs这个类,来读取数据


faster_rcnn_end2end.yml

可以根据自己的需要在这个文件中添加配置,例如在训练时进行模型快照的迭代次数,是否翻转等,相应的参数可以参考py-faster-rcnn / lib / fast_rcnn / config.py。

不需要更改config.py,在faster_rcnn_end2end.yml中添加语句即可


solver.prototxt

进一步修改网络训练中的学习速率,步长,gamma值,以及输出模型的名字,也可以训练到一定步数先保存一次



接着在根目录下运行train_xx.sh就可以训练了


训练中遇到的问题

1、

TypeError: coercing to Unicode: need string or buffer, NoneType found

TypeError: must be encoded string without NULL bytes, not str

AssertionError: Path does not exist: /home/py-faster-rcnn/lib/datasts/Images/101.jpg
明明图片是存在的,但是就是显示找不到文件


这是编码问题造成的,list.txt要用默认的ANSI编码,如果特意改容易出错


2、

File "/py-faster-rcnn/tools/../lib/datasets/imdb.py", line 108, in append_flipped_images
    assert (boxes[:, 2] >= boxes[:, 0]).all()
AssertionError
出现这个问题说明图片标注的时候存在错误

修改lib/datasets/imdb.py,append_flipped_images()函数
数据整理,在一行代码为 boxes[:, 2] = widths[i] - oldx1 - 1下加入代码:
for b in range(len(boxes)):
  if boxes[b][2]< boxes[b][0]:
    boxes[b][0] = 0


3、

AttributeError: 'module' object has no attribute ‘text_format'
解决方法:在/home/xxx/py-faster-rcnn/lib/fast_rcnn/train.py的头文件导入部分加上 :import google.protobuf.text_format

4、

TypeError: slice indices must be integers or None or have an __index__ method
numpy v1.12.0不支持浮点数


lib/proposal_target_layer.py
将以下行添加到第126 行之后,
start=int(start)
end=int(end)
在166行之后加上,
fg_rois_per_this_image=int(fg_rois_per_this_image)


5、

TypeError: 'numpy.float64' object cannot be interpreted as an index
还是numpy版本的问题,直接换一个版本好了
sudo pip install -U numpy==1.11.0


6、

File "/home/data1/caffe/py-faster-rcnn/tools/../lib/roi_data_layer/minibatch.py", line 139, in _get_image_blob
im = im[:, ::-1, :]
TypeError: 'NoneType' object has no attribute '__getitem__'


File "/home/data1/caffe/py-faster-rcnn/tools/../lib/utils/blob.py", line 33, in prep_im_for_blob
im = im.astype(np.float32, copy=False)
AttributeError: 'NoneType' object has no attribute 'astype'

其实这两个都是图片读取有问题,第一个可以通过修改minibatch.py, line 139
if roidb[i]['flipped']:
if im is None:
im = []
else:
im = im[:, ::-1, :]

但这不能根本解决问题
在保证自己opencv没问题的情况下,将读取的图片信息print一下,找出出问题的图片,删掉就好了

测试:
将训练好的网络复制到data/faster_rcnn_models
修改demo

CLASSES = ('__background__',
           'aeroplane', 'bicycle', 'bird', 'boat',
           'bottle', 'bus', 'car', 'cat', 'chair',
           'cow', 'diningtable', 'dog', 'horse',
           'motorbike', 'person', 'pottedplant',

           'sheep', 'sofa', 'train', 'tvmonitor')

这部分修改为自己训练的类


NETS = {'vgg16': ('VGG16',
                  'VGG16_faster_rcnn_final.caffemodel'),
        'zf': ('ZF',
                  'ZF_faster_rcnn_final.caffemodel')}

如果用的不是默认的网络,需要添加上网络的相关信息

'vgg16'是参数名,'VGG16',对应models/pascal_voc下相应的文件夹名,'VGG16_faster_rcnn_final.caffemodel'对应data/faster_rcnn_models下训练好的模型


parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16]',
                        choices=NETS.keys(), default='vgg16')

可以将自己用的网络设置为默认

prototxt = os.path.join(cfg.MODELS_DIR, NETS[args.demo_net][0],
     prototxt                       #'rfcn_alt_opt_5step_ohem', 'rfcn_test.pt')


caffemodel = os.path.join(cfg.DATA_DIR, 'faster_rcnn_models',
                              NETS[args.demo_net][1])


改为自己用的caffemodel和prototxt


 im_names就设置为自己的图片


运行demo.py


报错:

F0628 21:11:11.389936  9218 net.cpp:829] Cannot copy param 0 weights from layer 'cls_score'; shape mismatch.  Source param shape is 2 2048 (4096); target param shape is 21 2048 (43008). To learn this layer's parameters from scratch rather than copying from a saved net, rename the layer.

将prototxt对应文件里,21改为自己训练的类别+1,84改为(自己训练的类别+1)*4




展开阅读全文

没有更多推荐了,返回首页