目标检测: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