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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lianggyu/article/details/100096400

代码链接:https://github.com/DetectionTeamUCAS/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

  • 下载预训练模型

下载resnet50_v1resnet101_v1预训练模型,将其放到$ 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

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

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'

猜你喜欢

转载自blog.csdn.net/lianggyu/article/details/100096400
今日推荐