Faster rcnn 训练自己的数据集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caicaiatnbu/article/details/86288041

安装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 https://blog.csdn.net/caicaiatnbu/article/details/85125018

 修改 ../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 里面保存的样本数一定要为偶数,否则会报错

扫描二维码关注公众号,回复: 4944352 查看本文章

  •  代码部分修改

修改 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)* 4
    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)* 4
  }
}

修改 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 * 2

删除缓存文件

删除 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

猜你喜欢

转载自blog.csdn.net/caicaiatnbu/article/details/86288041