代码链接:https://github.com/DetectionTeamUCAS/FPN_Tensorflow
本文制作了voc格式的数据集,基于tensorflow训练FPN网络用于目标检测的研究。VOC格式数据集的制作就不详细展开了,网上与很多教程。本文采用anaconda来进行环境搭建,并以gun、knife两个类别的目标检测为例进行说明。
- 安装依赖
python3.5(anaconda推荐)
cuda9.0 (如果你想使用cuda8,请在cfgs.py文件中设置CUDA9 = False。)
opencv-python
tensorflow-plot
tensorflow == 1.10
- 下载预训练模型
下载resnet50_v1,resnet101_v1预训练模型,将其放到$ PATH_ROOT / data / pretrained_weights。
- 编译
cd $PATH_ROOT/libs/box_utils/cython_utils python setup.py build_ext --inplace
|—— data/VOCdevkit
| |——train
| |——Annotation
| |——JPEGImages
| |——test
| |——Annotation
| |——JPEGImages
在文件夹($ 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
在/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
}
$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')
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'
如果数据集所使用图片格式不属于'.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'
如果数据集所使用图片格式不属于'.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'