目标检测:FPN_tensorflow训练自己的数据集

代码链接:

本文制作了voc格式的数据集,基于tensorflow训练FPN网络用于目标检测的研究。VOC格式数据集的制作就不详细展开了,网上与很多教程。本文采用anaconda来进行环境搭建,并以gun、knife两个类别的目标检测为例进行说明。

1、环境搭建

安装依赖 python3.5(anaconda推荐) cuda9.0 (如果你想使用cuda8,请在cfgs.py文件中设置CUDA9 = False。) opencv-python tensorflow-plot tensorflow == 1.10
下载预训练模型 下载,预训练模型,将其放到$ PATH_ROOT / data / pretrained_weights。
编译 cd $PATH_ROOT/libs/box_utils/cython_utils python setup.py build_ext --inplace

2、数据集的格式

|—— data/VOCdevkit
|     |——train
|        |——Annotation
|        |——JPEGImages
|     |——test
|        |——Annotation
|        |——JPEGImages

3、cfgs.py的修改配置

在文件夹($ PATH_ROOT / libs / configs /)中选择某一个基础网络,将对应的配置文件的内容复制并覆盖到cfgs.py中。

根据数据集的实际情况(此示例类别数为2,数据集自定义名字为“train”),修改如下几行,有选择性地对训练参数进行修改,比如MOMENTUM,LR,DECAY_STEP,MAX_ITERATION等等

test_annotate_path = $PATH_ROOT/data/VOCdevkit/train/Annotations
DATASET_NAME = train  # ship, spacenet, pascal, coco
CLASS_NUM = 2
注意:推荐自定义一个数据集的名字,否则可能会出现错误:OutOfRangeError (see above for traceback):PaddingFIFOQueue 1_get_batch/batch/padding_fifo_queue is closed and has insufficient elements

4、label_dict.py的修改

在/lib/label_name_dict/label_dict.py文件中,修改为如下代码:

class_names = [
        back_ground, gun, knife]

classes_originID = {
    gun: 1, knife: 2}

if cfgs.DATASET_NAME == train:
    NAME_LABEL_MAP = {
        back_ground: 0,
        gun: 1,
        knife: 2
    }

5、read_tfrecord.py的修改

$PATH_ROOT/data/io/read_tfrecord.py第76行,添加自定义的数据集名字。

if dataset_name not in [ship, spacenet, pascal, coco,train]:
        raise ValueError(dataSet name must be in pascal, coco spacenet and ship)

6、制作tfrecord

cd $PATH_ROOT/data/io/
python convert_data_to_tfrecord.py --VOC_dir=/PATH/TO/VOCdevkit/VOCdevkit_train/ 
                                   --xml_dir=Annotation
                                   --image_dir=JPEGImages
                                   --save_name=train 
                                   --img_format=.jpg 
                                   --dataset=pascal

例如:

python convert_data_to_tfrecord.py --VOC_dir=/home/manager/FPN_Tensorflow-master/data/VOCdevkit/train/ --save_name=train --img_format=.bmp --dataset=train

7、训练 python train.py

8、eval.py

如果数据集所使用图片格式不属于.jpg, jpeg, .png, .tif, .tiff,则修改eval.py 119行。比如本示例所使用的是bmp格式

test_imgname_list = [item for item in os.listdir(eval_dir)
                          if item.endswith((.jpg, jpeg, .png, .tif, .tiff,.bmp))]
cd $PATH_ROOT/tools
python eval.py --eval_imgs=/PATH/TO/IMAGES/  
               --annotation_dir=/PATH/TO/TEST/ANNOTATION/
               --GPU=0

例如

python eval.py --eval_imgs=/home/FPN_Tensorflow-master/data/VOCdevkit/test/JPEGImages/ --annotation_dir=/home/FPN_Tensorflow-master/data/VOCdevkit/test/Annotations/ --GPU=5

9、Demo

如果数据集所使用图片格式不属于.jpg, jpeg, .png, .tif, .tiff,则修改eval.py 84行。

test_imgname_list = [os.path.join(test_dir, img_name) for img_name in os.listdir(test_dir)
                             if img_name.endswith((.jpg, .png, .jpeg, .tif, .tiff, .bmp))]
cd $PATH_ROOT/tools
python inference.py --data_dir=/PATH/TO/IMAGES/ 
                    --save_dir=/PATH/TO/SAVE/RESULTS/ 
                    --GPU=0
经验分享 程序员 微信小程序 职场和发展