加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 金华站长网 (https://www.0579zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动 > 正文

用PaddlePaddle 实现目标检测任务——Paddle Fluid v1.1深度测评

发布时间:2018-12-14 19:16:02 所属栏目:移动 来源:睿博远航
导读:副标题#e# 【51CTO.com原创稿件】 1.前言 11月1日,百度发布了Paddle Fluid的1.1版本,作为国内首个深度学习框架,PaddlePaddle对中文社区非常友好,有完善的中文社区、项目为导向的中文教程,可以让更多中文使用者更方便地进行深度学习、机器学习相关的研

其中,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文件保存。

用PaddlePaddle 实现目标检测任务——Paddle Fluid v1.1深度测评

拿到预训练数据集后,我们在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秒左右。

用PaddlePaddle 实现目标检测任务——Paddle Fluid v1.1深度测评

可以看一下这个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编程网 - 金华站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!