Advertisement

Faster rcnn 训练自己的数据集

阅读量:

安装cpython,python-opencv easydict

复制代码
 pip install cpython

    
 pip install easydict
    
 apt-get install python-opencv

进如 py-faster-rcnn/lib 进行make操作

复制代码
    make

进入 py-faster-rcnn/caffe-fast-rcnn

复制代码
    cp Makefile.config.example Makefile.config

对Makefile.config文件进行配置,我的配置文件如下:

复制代码
 ## Refer to http://caffe.berkeleyvision.org/installation.html

    
 # Contributions simplifying and improving our build system are welcome!
    
  
    
 # cuDNN acceleration switch (uncomment to build with cuDNN).
    
 USE_CUDNN := 1
    
  
    
 # CPU-only switch (uncomment to build without GPU support).
    
 # CPU_ONLY := 1
    
  
    
 # uncomment to disable IO dependencies and corresponding data layers
    
 # USE_OPENCV := 0
    
 # USE_LEVELDB := 0
    
 # USE_LMDB := 0
    
  
    
 # uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)
    
 #	You should not set this flag if you will be reading LMDBs with any
    
 #	possibility of simultaneous read and write
    
 # ALLOW_LMDB_NOLOCK := 1
    
  
    
 # Uncomment if you're using OpenCV 3
    
 # OPENCV_VERSION := 3
    
  
    
 # To customize your choice of compiler, uncomment and set the following.
    
 # N.B. the default for Linux is g++ and the default for OSX is clang++
    
 # CUSTOM_CXX := g++
    
  
    
 # CUDA directory contains bin/ and lib/ directories that we need.
    
 CUDA_DIR := /usr/local/cuda
    
 # On Ubuntu 14.04, if cuda tools are installed via
    
 # "sudo apt-get install nvidia-cuda-toolkit" then use this instead:
    
 # CUDA_DIR := /usr
    
  
    
 # CUDA architecture setting: going with all of them.
    
 # For CUDA < 6.0, comment the *_50 lines for compatibility.
    
 CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
    
 		-gencode arch=compute_20,code=sm_21 \
    
 		-gencode arch=compute_30,code=sm_30 \
    
 		-gencode arch=compute_35,code=sm_35 \
    
 		-gencode arch=compute_50,code=sm_50 \
    
 		-gencode arch=compute_50,code=compute_50
    
  
    
 # BLAS choice:
    
 # atlas for ATLAS (default)
    
 # mkl for MKL
    
 # open for OpenBlas
    
 BLAS := atlas
    
 # Custom (MKL/ATLAS/OpenBLAS) include and lib directories.
    
 # Leave commented to accept the defaults for your choice of BLAS
    
 # (which should work)!
    
 # BLAS_INCLUDE := /path/to/your/blas
    
 # BLAS_LIB := /path/to/your/blas
    
  
    
 # Homebrew puts openblas in a directory that is not on the standard search path
    
 # BLAS_INCLUDE := $(shell brew --prefix openblas)/include
    
 # BLAS_LIB := $(shell brew --prefix openblas)/lib
    
  
    
 # This is required only if you will compile the matlab interface.
    
 # MATLAB directory should contain the mex binary in /bin.
    
 # MATLAB_DIR := /usr/local
    
 # MATLAB_DIR := /Applications/MATLAB_R2012b.app
    
  
    
 # NOTE: this is required only if you will compile the python interface.
    
 # We need to be able to find Python.h and numpy/arrayobject.h.
    
 PYTHON_INCLUDE := /usr/include/python2.7 \
    
 		/usr/lib/python2.7/dist-packages/numpy/core/include
    
 # Anaconda Python distribution is quite popular. Include path:
    
 # Verify anaconda location, sometimes it's in root.
    
 # ANACONDA_HOME := $(HOME)/anaconda
    
 # PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
    
 		# $(ANACONDA_HOME)/include/python2.7 \
    
 		# $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \
    
  
    
 # Uncomment to use Python 3 (default is Python 2)
    
 # PYTHON_LIBRARIES := boost_python3 python3.5m
    
 # PYTHON_INCLUDE := /usr/include/python3.5m \
    
 #                 /usr/lib/python3.5/dist-packages/numpy/core/include
    
  
    
 # We need to be able to find libpythonX.X.so or .dylib.
    
 PYTHON_LIB := /usr/lib
    
 # PYTHON_LIB := $(ANACONDA_HOME)/lib
    
  
    
 # Homebrew installs numpy in a non standard path (keg only)
    
 # PYTHON_INCLUDE += $(dir $(shell python -c 'import numpy.core; print(numpy.core.__file__)'))/include
    
 # PYTHON_LIB += $(shell brew --prefix numpy)/lib
    
  
    
 # Uncomment to support layers written in Python (will link against Python libs)
    
 WITH_PYTHON_LAYER := 1
    
  
    
 # Whatever else you find you need goes here.
    
 INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
    
 LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
    
  
    
 # If Homebrew is installed at a non standard location (for example your home directory) and you use it for general dependencies
    
 # INCLUDE_DIRS += $(shell brew --prefix)/include
    
 # LIBRARY_DIRS += $(shell brew --prefix)/lib
    
  
    
 # Uncomment to use `pkg-config` to specify OpenCV library paths.
    
 # (Usually not necessary -- OpenCV libraries are normally installed in one of the above $LIBRARY_DIRS.)
    
 # USE_PKG_CONFIG := 1
    
  
    
 BUILD_DIR := build
    
 DISTRIBUTE_DIR := distribute
    
  
    
 # Uncomment for debugging. Does not work on OSX due to https://github.com/BVLC/caffe/issues/171
    
 # DEBUG := 1
    
  
    
 # The ID of the GPU that 'make runtest' will use to run unit tests.
    
 TEST_GPUID := 0
    
  
    
 # enable pretty build (comment to see full commands)
    
 Q ?= @

配置完Makefile.config文件后,执行:

复制代码
 make -j4

    
 make pycaffe
  • 数据制作:

目标检测数据集制作工具 labelImg <>

修改 ../py-faster-rcnn/data/VOCdevkit2007/VOC2007/ 目录下的 Annotations 和 JPEGImage 以及ImageSets/Main 三个文件夹,下面依次讲述这个三个文件夹

JPEGImage 文件夹保存着所有图片,这里我们所有图片的格式统一都是jpg,命名规则**"000001.jpg"** 开始。

Annotation 文件夹保存着每张图片对应的XML文件,这里我们将我们的XML文件格式贴出来:

复制代码
 <annotation>

    
 	<folder>VOC2007</folder>
    
 	<filename>000001.jpg</filename>
    
 	<source>
    
 		<database>Unknown</database>
    
 	</source>
    
 	<size>
    
 		<width>499</width>
    
 		<height>374</height>
    
 		<depth>3</depth>
    
 	</size>
    
 	<segmented>0</segmented>
    
 	<object>
    
 		<name>label_A</name>
    
 		<pose>Frontal</pose>
    
 		<truncated>1</truncated>
    
 		<difficult>0</difficult>
    
 		<bndbox>
    
 			<xmin>121</xmin>
    
 			<ymin>127</ymin>
    
 			<xmax>208</xmax>
    
 			<ymax>144</ymax>
    
 		</bndbox>
    
 	</object>
    
 	<object>
    
 		<name>label_B</name>
    
 		<pose>Frontal</pose>
    
 		<truncated>1</truncated>
    
 		<difficult>0</difficult>
    
 		<bndbox>
    
 			<xmin>194</xmin>
    
 			<ymin>153</ymin>
    
 			<xmax>240</xmax>
    
 			<ymax>170</ymax>
    
 		</bndbox>
    
 	</object>
    
 	<object>
    
 		<name>label_C</name>
    
 		<pose>Frontal</pose>
    
 		<truncated>1</truncated>
    
 		<difficult>0</difficult>
    
 		<bndbox>
    
 			<xmin>119</xmin>
    
 			<ymin>202</ymin>
    
 			<xmax>301</xmax>
    
 			<ymax>252</ymax>
    
 		</bndbox>
    
 	</object>
    
 	<object>
    
 		<name>label_D</name>
    
 		<pose>Frontal</pose>
    
 		<truncated>1</truncated>
    
 		<difficult>0</difficult>
    
 		<bndbox>
    
 			<xmin>117</xmin>
    
 			<ymin>267</ymin>
    
 			<xmax>391</xmax>
    
 			<ymax>290</ymax>
    
 		</bndbox>
    
 	</object>
    
 	<object>
    
 		<name>label_E</name>
    
 		<pose>Frontal</pose>
    
 		<truncated>1</truncated>
    
 		<difficult>0</difficult>
    
 		<bndbox>
    
 			<xmin>89</xmin>
    
 			<ymin>98</ymin>
    
 			<xmax>421</xmax>
    
 			<ymax>312</ymax>
    
 		</bndbox>
    
 	</object>
    
 </annotation>

ImageSets/Main 文件夹下包含4个.txt文件,分别为 train.txt val.txt trainval.txt test.txt ,没给txt中保存都是图片的名称。

注意:trainval.txt 为 train.txt 和 val.txt的总和。train.txt 和 val.txt 里面保存的样本数一定要为偶数,否则会报错

  • 代码部分修改

修改 py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/stage1_rcnn_train.pt 和 stage2_fast_rcnn_train.pt 两个文件

复制代码
 name: "ZF"

    
 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': 6"     #按训练集类更改,该值为类别数+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: 6  #按训练集类更改,该值为类别数+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: 24 #按训练集类更改,该值为(类别数+1)
    
     weight_filler {
    
       type: "gaussian"
    
       std: 0.001
    
     }
    
     bias_filler {
    
       type: "constant"
    
       value: 0
    
     }
    
   }
    
 }

修改 py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/stage1_rpn_train.pt 和 stage2_rpn_train.pt

复制代码
 name: "ZF"

    
 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': 6" #按训练集类更改,该值为类别数+1
    
   }
    
 }

修改py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/faster_rcnn_test.pt

复制代码
 layer {

    
   name: "cls_score"
    
   type: "InnerProduct"
    
   bottom: "fc7"
    
   top: "cls_score"
    
   inner_product_param {
    
     num_output: 6   #按训练集类更改,该值为类别数+1
    
   }
    
 }
    
 layer {
    
   name: "bbox_pred"
    
   type: "InnerProduct"
    
   bottom: "fc7"
    
   top: "bbox_pred"
    
   inner_product_param {
    
     num_output: 24   #按训练集类更改,该值为(类别数+1)
    
   }
    
 }

修改 py-faster-rcnn/lib/datasets/pascal_voc.py

注意 标签名尽可能为英文小写。否则会报bug

复制代码
  self._classes = ('__background__', # always index 0

    
 			'label_a','label_b','label_c','label_d','label_e')
    
                     # 'aeroplane', 'bicycle', 'bird', 'boat',
    
                     # 'bottle', 'bus', 'car', 'cat', 'chair',
    
                     # 'cow', 'diningtable', 'dog', 'horse',
    
                     # 'motorbike', 'person', 'pottedplant',
    
                     # 'sheep', 'sofa', 'train', 'tvmonitor')

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

复制代码
 def append_flipped_images(self):

    
     num_images = self.num_images
    
     #widths = self._get_widths()
    
 	widths = [PIL.Image.open(self.image_path_at(i)).size[0]
    
           for i in xrange(self.num_images)]
    
     for i in xrange(num_images):
    
         boxes = self.roidb[i]['boxes'].copy()
    
         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()
    
         entry = {'boxes' : boxes,
    
                  'gt_overlaps' : self.roidb[i]['gt_overlaps'],
    
                  'gt_classes' : self.roidb[i]['gt_classes'],
    
                  'flipped' : True}
    
         self.roidb.append(entry)
    
     self._image_index = self._image_index

删除缓存文件

删除 py-faster-rcnn文件夹下所有的.pyc 文件 以及 data文件件下的cache文件夹,

删除 data/VOCdevkit2007/annotations_cache 文件夹

删除 py-faster-rcnn/lib/datasets/ 下的imdb.pyc 和 pascal_voc.pyc

开始训练:

复制代码
    ./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc

全部评论 (0)

还没有任何评论哟~