用PaddlePaddle 实现目标检测任务——Paddle Fluid v1.1深度测评
|
其中,train.py、reader.py、mobilenet_ssd.py是与网络训练相关的文件,包括数据读取、网络结构、训练参数等过程的定义都在这3个文件中;eval.py、eval_coco_map.py是网络预测评估相关文件;infer.py是可视化预测结果相关文件。Data文件夹用于存储数据集,使用时可以把训练集、测试集、验证集放在data目录下,reader会在data目录下寻找图片数据加载;pretrained目录存放预训练模型,如果不想从头训练一个SSD,可以把预训练好的模型放在这个目录下,方便进行迁移学习。 4.PaddlePaddle实现SSD的目标检测有了上述的一些基础,我们就可以轻松使用PaddlePaddle上手一些项目了。现在我们就来实现一个基于SSD的目标检测任务。 4.1服务器配置系统:Ubuntu 16.04 GPU:NVIDIA GTX 1080*4 显存:8GB 环境:python 3.5 4.2框架配置Paddle Fluid v1.1 GPU版本 4.3数据准备我们使用微软的COCO2017数据集来预训练模型(PaddlePaddle提供了一个基于COCO的预训练模型,可以直接使用),COCO数据集是微软团队获取的一个可以用来图像recognition+segmentation+captioning 数据集,其官方说明网址:http://mscoco.org/。微软在ECCV Workshops里发表文章《Microsoft COCO: Common Objects in Context》更充分地介绍了该数据集。COCO以场景理解为目标,从复杂场景中截取了328,000张影像,包括了91类目标和2,500,000个label。整个COCO2017数据集20G,官网下载非常慢,可以在国内找一些镜像站下载,数据集里分好了训练集、测试集和验证集,标注和file_list用json文件保存。
拿到预训练数据集后,我们在Pascal VOC数据集上对模型进行进一步训练,做一下微调。Pascal VOC数据集相较COCO数据集来说图片数量和种类小很多,共计20类,11540张训练图片,标注采用xml格式文件保存。 4.4数据读取图片格式为jpg,需要对图像进行转码读取,SSD中的reader.py文件帮助我们实现了这个功能,内置的数据读取使用了一个生成器来逐个batch读取图片并转码,这样内存占用率非常低。由于我们机器内存不大,设置的batch为32,在此情况下load十万张图片的annotation只需要17秒左右,每一个batch的load+train时间只需要0.3秒左右。
可以看一下这个reader的核心代码:
def reader():
if mode == 'train' and shuffle:
np.random.shuffle(images)
batch_out = []
for image in images:
image_name = image['file_name']
image_path = os.path.join(settings.data_dir, image_name)
im = Image.open(image_path)
if im.mode == 'L':
im = im.convert('RGB')
im_width, im_height = im.size
im_id = image['id']
# layout: category_id | xmin | ymin | xmax | ymax | iscrowd
bbox_labels = []
annIds = coco.getAnnIds(imgIds=image['id'])
anns = coco.loadAnns(annIds)
for ann in anns:
bbox_sample = []
# start from 1, leave 0 to background
bbox_sample.append(float(ann['category_id']))
bbox = ann['bbox']
xmin, ymin, w, h = bbox
xmax = xmin + w
ymax = ymin + h
bbox_sample.append(float(xmin) / im_width)
bbox_sample.append(float(ymin) / im_height)
bbox_sample.append(float(xmax) / im_width)
bbox_sample.append(float(ymax) / im_height)
bbox_sample.append(float(ann['iscrowd']))
bbox_labels.append(bbox_sample)
im, sample_labels = preprocess(im, bbox_labels, mode, settings)
sample_labels = np.array(sample_labels)
if len(sample_labels) == 0: continue
im = im.astype('float32')
boxes = sample_labels[:, 1:5]
lbls = sample_labels[:, 0].astype('int32')
iscrowd = sample_labels[:, -1].astype('int32')
if 'cocoMAP' in settings.ap_version:
batch_out.append((im, boxes, lbls, iscrowd,
[im_id, im_width, im_height]))
else:
batch_out.append((im, boxes, lbls, iscrowd))
if len(batch_out) == batch_size:
yield batch_out
batch_out = []
可以看到,这里的reader是一个生成器,逐个batch把数据load进内存。在数据读取过程中,需要注意一下几点: 1. 数据集需要放在项目的data目录下,reader通过annotations下的instances_train2017.json文件区分训练集和验证集,不需要在data目录下用文件夹区分训练集和验证集。 (编辑:PHP编程网 - 金华站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |




