caffe框架下目标检测——faster-rcnn实战篇操作

嘟嘟_猪 嘟嘟_猪     2022-08-24     718

关键词:

原有模型

1、下载fasrer-rcnn源代码并安装

git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git

1)  经常断的话,可以采取两步:

git clone https://github.com/rbgirshick/py-faster-rcnn.git

2)  到py-faster-rcnn中,继续下载caffe-faster-rcnn,采取后台跑:

git submodule update --init –recursive

2、编译cython模块

在py-faster-rcnn/lib目录下,运行以下命令:

Make

3、编译caffe和pycaffe

在py-faster-rcnn/caffe-faster-rcnn下,编译

make clean

make all –j16

make test

make runtest

注意:由于py-faster-rcnn使用python层,在Makefile.config中把WITH_PYTHON_LAYER:=1

我的环境会使用

4、下载模型:

Sh  data/scripts/fetch_faster_rcnn_models.sh

5、运行基于python的demo

执行以下命令:

Python tools/demo.py

6、下载训练、测试数据集

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar

 

tar xvf VOCtrainval_06-Nov-2007.tar

tar xvf VOCtest_06-Nov-2007.tar

tar xvf VOCdevkit_08-Jun-2007.tar

 

7、为了PASCAL VOC创建symlinks,创建软连接

ln -s VOCdevkit VOCdevkit2007

 

遇到的问题见caffe框架下目标检测——faster-rcnn实战篇问题集锦

 

工程目录介绍

 

caffe-fast-rcnn —> caffe框架

data —> 存放数据,以及读取文件的cache

experiments —>存放配置文件以及运行的log文件,配置文件

lib —> python接口

models —> 三种模型, ZF(S)/VGG1024(M)/VGG16(L)

output —> 输出的model存放的位置,不训练此文件夹没有

tools —> 训练和测试的python文件

 

训练模型需要修改的部分:

data —> 存放数据,以及读取文件的cache

models —> 三种模型, ZF(S)/VGG1024(M)/VGG16(L)

lib —> python接口

 

开始训练部分:

experiments —>存放配置文件以及运行的log文件,配置文件

 

用模型测试/实验结果部分:

tools —> 训练和测试的python文件

 

数据集

 

参考VOC2007的数据集格式,主要包括三个部分:

 

JPEGImages

Annotations

ImageSets/Main

JPEGImages —> 存放你用来训练的原始图像

 

Annotations —> 存放原始图像中的Object的坐标信息,XML格式

 

ImageSets/Main —> 指定用来train,trainval,val和test的图片的编号

 

JPEGImages

 

把图片放入,但是有三点注意:

 

编号要以6为数字命名,例如000034.jpg

图片要是JPEG/JPG格式的,PNG之类的需要自己转换下

图片的长宽比(width/height)要在0.462-6.828之间,就是太过瘦长的图片不要

0.462-6.828,总之长宽比太大或者太小的,注意将其剔除,否则可能会出现下面实验错误:

 

Traceback (most recent call last):

File “/usr/lib/python2.7/multiprocessing/process.py”, line 258, in _bootstrap

self.run()

File “/usr/lib/python2.7/multiprocessing/process.py”, line 114, in run

self._target(*self._args, **self._kwargs)

File “./tools/train_faster_rcnn_alt_opt.py”, line 130, in train_rpn

max_iters=max_iters)

File “/home/work-station/zx/py-faster-rcnn/tools/../lib/fast_rcnn/train.py”, line 160, in train_net

model_paths = sw.train_model(max_iters)

File “/home/work-station/zx/py-faster-rcnn/tools/../lib/fast_rcnn/train.py”, line 101, in train_model

self.solver.step(1)

File “/home/work-station/zx/py-faster-rcnn/tools/../lib/rpn/anchor_target_layer.py”, line 137, in forward

gt_argmax_overlaps = overlaps.argmax(axis=0)

ValueError: attempt to get argmax of an empty sequence

Google给出的原因是 Because the ratio of images width and heights is too small or large,这个非常重要

 

Annotations

 

faster rcnn训练需要图像的bounding box信息作为监督(ground truth),所以你需要将你的所有可能的object使用框标注,并写上坐标,最终是一个XML格式的文件,一个训练图片对应Annotations下的一个同名的XML文件

 

参考官方VOC的Annotations的格式:

<annotation>

    <folder>VOC2007</folder>#数据集文件夹

    <filename>009963.jpg</filename>#图片的name

    <source>#注释信息,无所谓有无

       <database>The VOC2007 Database</database>

       <annotation>PASCAL VOC2007</annotation>

       <image>flickr</image>

       <flickrid>65163277</flickrid>

    </source>

    <owner>#注释信息,无所谓有无

       <flickrid>Jez_P</flickrid>

       <name>Jeremy Pick</name>

    </owner>

    <size>#图片大小

       <width>374</width>

       <height>500</height>

       <depth>3</depth>

    </size>

    <segmented>0</segmented>

    <object>#多少个框就有多少个object标签

       <name>car</name>#bounding box中的object的class name

       <pose>Frontal</pose>

       <truncated>1</truncated>

       <difficult>0</difficult>

       <bndbox>

           <xmin>2</xmin>#框的坐标

           <ymin>3</ymin>

           <xmax>374</xmax>

           <ymax>500</ymax>

       </bndbox>

    </object>

</annotation>

这里有一个非常好用的工具VOC框图工具,可以自动帮你生成需要的XML格式,实际中发现格式基本无误,只有小的地方需要改动下

 

https://github.com/tzutalin/labelImg

 

Imagesets/Main

 

因为VOC的数据集可以做很多的CV任务,比如Object detection, Semantic segementation, Edge detection等,所以Imageset下有几个子文件夹(Layout, Main, Segementation),修改下Main下的文件 (train.txt, trainval.txt, val.txt, test.txt),里面写上你想要进行任务的图片的编号

 

将上述你的数据集放在py-faster-rcnn/data/VOCdevkit2007/VOC2007下面,替换原始VOC2007的JPEGIMages,Imagesets,Annotations

 

代码修改

 

修改源文件

 

faster rcnn有两种各种训练方式:

 

Alternative training(alt-opt)

Approximate joint training(end-to-end)

推荐使用第二种,因为第二种使用的显存更小,而且训练会更快,同时准确率差不多,两种方式需要修改的代码是不一样的,同时faster rcnn提供了三种训练模型,小型的ZFmodel,中型的VGG_CNN_M_1024和大型的VGG16,论文中说VGG16效果比其他两个好,但是同时占用更大的GPU显存(~11GB)

 

我使用的是VGG16 model + alternative training,需要检测的类别四类,加上背景所以总共是五类

1 、py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage1_fast_rcnn_train.pt

 

layer { 

  name: 'data' 

  type: 'Python' 

  top: 'data' 

  top: 'rois' 

  top: 'labels' 

  top: 'bbox_targets' 

  top: 'bbox_inside_weights' 

  top: 'bbox_outside_weights' 

  python_param { 

    module: 'roi_data_layer.layer' 

    layer: 'RoIDataLayer' 

    param_str: "'num_classes': 5" #按训练集类别改,该值为类别数+1 

  } 

 

layer { 

  name: "cls_score" 

  type: "InnerProduct" 

  bottom: "fc7" 

  top: "cls_score" 

  param {

  lr_mult: 1.0

  } 

  param {

  lr_mult: 2.0

  } 

  inner_product_param { 

    num_output: 5 #按训练集类别改,该值为类别数+1 

    weight_filler { 

      type: "gaussian" 

      std: 0.01 

    } 

    bias_filler { 

      type: "constant" 

      value: 0 

    } 

  } 

 

layer { 

  name: "bbox_pred" 

  type: "InnerProduct" 

  bottom: "fc7" 

  top: "bbox_pred" 

  param {

  lr_mult: 1.0

  } 

  param {

  lr_mult: 2.0

  } 

  inner_product_param { 

    num_output: 20 #按训练集类别改,该值为(类别数+1)*4,四个顶点坐标 

    weight_filler { 

      type: "gaussian" 

      std: 0.001 

    } 

    bias_filler { 

      type: "constant" 

      value: 0 

    } 

  } 

 

2 、py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage1_rpn_train.pt

 

layer { 

  name: 'input-data' 

  type: 'Python' 

  top: 'data' 

  top: 'im_info' 

  top: 'gt_boxes' 

  python_param { 

    module: 'roi_data_layer.layer' 

    layer: 'RoIDataLayer' 

    param_str: "'num_classes': 5" #按训练集类别改,该值为类别数+1 

  } 

3、 py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage2_fast_rcnn_train.pt

 

layer { 

  name: 'data' 

  type: 'Python' 

  top: 'data' 

  top: 'rois' 

  top: 'labels' 

  top: 'bbox_targets' 

  top: 'bbox_inside_weights' 

  top: 'bbox_outside_weights' 

  python_param { 

    module: 'roi_data_layer.layer' 

    layer: 'RoIDataLayer' 

    param_str: "'num_classes': 5" #按训练集类别改,该值为类别数+1 

  } 

 

layer { 

  name: "cls_score" 

  type: "InnerProduct" 

  bottom: "fc7" 

  top: "cls_score" 

  param {

  lr_mult: 1.0

  } 

  param {

  lr_mult: 2.0

  } 

  inner_product_param { 

    num_output: 5 #按训练集类别改,该值为类别数+1 

    weight_filler { 

      type: "gaussian" 

      std: 0.01 

    } 

    bias_filler { 

      type: "constant" 

      value: 0 

    } 

  } 

 

layer { 

  name: "bbox_pred" 

  type: "InnerProduct" 

  bottom: "fc7" 

  top: "bbox_pred" 

  param {

  lr_mult: 1.0

  } 

  param {

  lr_mult: 2.0

  } 

  inner_product_param { 

    num_output: 20 #按训练集类别改,该值为(类别数+1)*4,四个顶点坐标 

    weight_filler { 

      type: "gaussian" 

      std: 0.001 

    } 

    bias_filler { 

      type: "constant" 

      value: 0 

    } 

  } 

4 、py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage2_rpn_train.pt

 

layer { 

  name: 'input-data' 

  type: 'Python' 

  top: 'data' 

  top: 'im_info' 

  top: 'gt_boxes' 

  python_param { 

    module: 'roi_data_layer.layer' 

    layer: 'RoIDataLayer' 

    param_str: "'num_classes': 5" #按训练集类别改,该值为类别数+1 

  } 

5 、py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt

 

layer {

  name: "cls_score"

  type: "InnerProduct"

  bottom: "fc7"

  top: "cls_score"

  inner_product_param {

    num_output: 5#按训练集类别改,该值为类别数+1

  }

}

layer {

  name: "bbox_pred"

  type: "InnerProduct"

  bottom: "fc7"

  top: "bbox_pred"

  inner_product_param {

    num_output: 20#按训练集类别改,该值为(类别数+1)*4

  }

}

6、 py-faster-rcnn/lib/datasets/pascal_voc.py

 

class pascal_voc(imdb): 

    def __init__(self, image_set, year, devkit_path=None): 

        imdb.__init__(self, 'voc_' + year + '_' + image_set) 

        self._year = year 

        self._image_set = image_set 

        self._devkit_path = self._get_default_path() if devkit_path is None \ 

                            else devkit_path 

        self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year) 

        self._classes = ('__background__', # always index 0 

                         captcha' # 有几个类别此处就写几个,我是两个

                      ) 

line 212

 

cls = self._class_to_ind[obj.find('name').text.lower().strip()] 

 

如果你的标签含有大写字母,可能会出现KeyError的错误,所以建议全部使用小写字母

 

到此代码修改就搞定了

 

训练

 

训练前还需要注意几个地方

 

1 cache问题

 

假如你之前训练了官方的VOC2007的数据集或其他的数据集,是会产生cache的问题的,建议在重新训练新的数据之前将其删除

 

(1) py-faster-rcnn/output

(2) py-faster-rcnn/data/cache

 

2 训练参数

 

py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage_fast_rcnn_solver*.pt

 

base_lr: 0.001

lr_policy: 'step'

step_size: 30000

display: 20

....

迭代次数在文件py-faster-rcnn/tools/train_faster_rcnn_alt_opt.py中进行修改

 

line 80

 

max_iters = [80000, 40000, 80000, 40000]

分别对应rpn第1阶段,fast rcnn第1阶段,rpn第2阶段,fast rcnn第2阶段的迭代次数,自己修改即可,不过注意这里的值不要小于上面的solver里面的step_size的大小,大家自己修改吧

 

开始训练:

 

cd py-faster-rcnn

./experiments/scripts/faster_rcnn_alt_opt.sh 0 VGG16 pascal_voc

 

指明使用第一块GPU(0),模型是VGG16,训练数据是pascal_voc(voc2007),没问题的话应该可以迭代训练了

 

结果

 

训练完毕,得到我们的训练模型,我们就可以使用它来进行我们的object detection了,具体是:

1 将py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval/VGG16_faster_rcnn_final.caffemodel,拷贝到py-faster-rcnn/data/faster_rcnn_models下

 

2 将你需要进行test的images放在py-faster-rcnn/data/demo下

 

3 修改py-faster-rcnn/tools/demo.py文件

 

CLASSES = ('_background_', 'captcha') #参考你自己的类别写

 

NETS = {'vgg16': ('VGG16',

'VGG16_faster_rcnn_final.caffemodel'), #改成你训练得到的model的name

'zf': ('ZF',

'ZF_faster_rcnn_final.caffemodel')

}

im_names = ['1559.jpg','1564.jpg']  # 改成自己的test image的name

上几张我的检测结果吧

                                    

使用caffe的hdf5数据完成回归任务

...如何用caffe做行人检测问题,然而参考那些经典结构比如faster-rcnn等,都是自定义的caffe层来完成的检测任务。这些都要求对caffe框架有一定程度的了解。最近看到了如何用caffe完成回归的任务,就想把检测问题当成回归问题来解... 查看详情

菜品识别系统(faster-rcnn目标检测算法)(代码片段)

目录一、Faster-RCNN目标检测算法的介绍二、效果展示三、环境配置四、图片数据集准备五、代码具体实现一、Faster-RCNN目标检测算法的介绍Faster-RCNN算法由于其较高的检测准确率成为主流的目标检测算法之一,相比较YOLO系列算... 查看详情

『caffe』图像检测程序(待续)

...完成检测,当下已经有了最新的基于caffe的RCNN、Fast-RCNN、Faster-RCNN以及SSD框架,个中思路不同,不得叹惋前路漫漫。由于接触本部时走了很多弯路,所以给出几个关键词用于学习滑窗检测理论基础学习:overfeat;全卷积网络;图... 查看详情

faster-rcnn目标检测算法执行思路

我们一起来了解一下,Faster-RCNN目标检测算法执行思路是怎么样的。Faster-RCNN执行思路主要就是看懂这幅图,这幅图里面包含了非常非常多的内容,然后我们一起来梳理一下,这么多内容,它是怎么样进行连接... 查看详情

深度学习和目标检测系列教程10-300:通过torch训练第一个faster-rcnn模型(代码片段)

@Author:Runsen上次介绍了Faster-RCNN模型,那么今天就开始训练第一个Faster-RCNN模型。本文将展示如何在水果图像数据集上使用Faster-RCNN模型。代码的灵感来自此处的Pytorch文档教程和Kagglehttps://pytorch.org/tutorials/intermediate/torc... 查看详情

caffe版faster-rcnn环境搭建

faster-rcnn提出论文:《FasterR-CNN:TowardsReal-TimeObjectDetectionwithRegionProposalNetworks》faster-rcnn的算法详解可看这篇博文(清晰易懂,良心博文!): http://blog.csdn.net/shenxiaolu1984/article/details/51152614faster-rcnn& 查看详情

目标检测ssd相对于yolo与faster-rcnn做了哪些改进?效果如何

参考技术A  但是由于运行selective—search实在是太慢,希望用更快的方法。  逗直接上YOLO呗可以参考博文:物体检测-从RCNN到YOLO参考列表中地YouOnlyLo好Once逗一项,包括YOLO的论文、视频、源码、使用方式。 查看详情

使用caffe完成图像目标检测和caffe全卷积网络

一、【用Python学习Caffe】2.使用Caffe完成图像目标检测标签: pythoncaffe深度学习目标检测ssd2017-06-2222:08 207人阅读 评论(0) 收藏 举报 分类:机器学习(22)  深度学习(12) 版权声明:本文为博主原... 查看详情

用python学习caffe2.使用caffe完成图像目标检测(代码片段)

2.使用Caffe完成图像目标检测本节将以一个快速的图像目标检测网络SSD作为例子,通过PythonCaffe来进行图像目标检测。必须安装windows-ssd版本的Caffe,或者自行在caffe项目中添加SSD的新增相关源代码.图像目标检测网络同图像... 查看详情

keras版faster-rcnn代码学习(iou,rpn)1

...方便,适合于新手练手,于是找来了目标检测经典的模型Faster-RCNN的keras代码来练练手,代码的主题部分转自知乎专栏LearningMachine,作者张潇捷,链接如下: keras版faster-rcnn算法详解(1.RPN计算) keras版faster-rcnn算法详解(2.r... 查看详情

使用 Fast/Faster-RCNN 在 C++ 上制作对象检测器的最简单方法是啥?

】使用Fast/Faster-RCNN在C++上制作对象检测器的最简单方法是啥?【英文标题】:WhatisthesimplestwaytomakeobjectdetectoronC++withFast/Faster-RCNN?使用Fast/Faster-RCNN在C++上制作对象检测器的最简单方法是什么?【发布时间】:2016-08-0906:28:40【问题... 查看详情

深度学习和目标检测系列教程11-300:小麦数据集训练faster-rcnn模型(代码片段)

@Author:Runsen上次训练的Faster-RCNN的数据格式是xml和jpg图片提供,在很多Object-Detection中,数据有的是csv格式,数据集来源:https://www.kaggle.com/c/global-wheat-detectionwidth和heigth是图片的长和宽,b 查看详情

[python图像识别]四十八.pytorch构建faster-rcnn模型实现小麦目标检测(代码片段)

该系列文章是讲解PythonOpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应... 查看详情

paddle学习赛——钢铁目标检测(yolov5ppyoloe+,faster-rcnn)(代码片段)

文章目录一、赛事简介二、ppyoloe+l模型,41.32分(PaddleDetection-voc)2.1安装PaddleDetection2.2数据预处理2.2.1解压数据集2.2.2自定义数据集(感觉很麻烦,暂时放弃)2.2.3准备VOC数据集(直接用这个)2.3修改... 查看详情

ssd+caffe︱singleshotmultiboxdetector目标检测

作者的思路就是FasterR-CNN+YOLO,利用YOLO的思路和FasterR-CNN的anchorbox的思想。.0导读(本节来源于BOT大赛嘉宾问答环节)SSD这里的设计就是导致你可以一下子可以检测8张图,FasterRCNN一下子只能检测1张图片,这样的话会导致会有8张... 查看详情

深度学习caffe实战笔记(19)windows平台faster-rcnn制作自己的数据集

...过程,这篇博客先介绍如果制作voc2007自己的数据集用于faster-rcnn训练,下一篇博客介绍如何用faster-rcnn训练自己的数据。1、准备图像图像要用.jpg或者jpeg格式的,如果是png或者其它格式,自己转换一下就好,图像名称要用000001.jpg... 查看详情

faster-rcnn(testing):ubuntu14.04+caffe+cuda7.5+cudnn5.1.3+opencv3.0+matlabr2014a环境搭建记录

python版本的faster-rcnn见我的另一篇博客:py-faster-rcnn(runningthedemo):ubuntu14.04+caffe+cuda7.5+cudnn5.1.3+python2.7环境搭建记录 1.首先需要配置编译caffe的环境,并降级gcc为4.7.见: ubuntu14.04下安装cudnn5.1.3,opencv3.0,编译caffe及m 查看详情

从yolov1到yolov3,目标检测的进化之路

...: http://dwz.cn/7ZGrif YOLOv1 这是继RCNN,fast-RCNN和faster-RCNN之后,RossGirshick针对DL目标检测速度问题提出的另外一种框架。YOLOV1其增强版本在GPU上能跑45fps,简化版本155fps。 论文下载:http://arxiv.org/abs/1506.02640代码下载... 查看详情