From 2b83c0a183ca94e371eb72391459e35e4dc6244c Mon Sep 17 00:00:00 2001 From: yangyaming Date: Wed, 28 Jun 2017 23:19:10 +0800 Subject: [PATCH] Init demo. --- ssd/README.md | 66 +++++++ ssd/config/__init__.py | 0 ssd/config/pascal_voc_conf.py | 91 +++++++++ ssd/data/label_list | 21 ++ ssd/data/prepare_voc_data.py | 71 +++++++ ssd/data_provider.py | 182 +++++++++++++++++ ssd/eval.py | 48 +++++ ssd/image_util.py | 181 +++++++++++++++++ ssd/images/ssd_network.png | Bin 0 -> 154618 bytes ssd/index.html | 130 ++++++++++++ ssd/infer.py | 104 ++++++++++ ssd/train.py | 89 +++++++++ ssd/vgg_ssd_net.py | 360 ++++++++++++++++++++++++++++++++++ ssd/visual.py | 31 +++ 14 files changed, 1374 insertions(+) create mode 100644 ssd/README.md create mode 100644 ssd/config/__init__.py create mode 100644 ssd/config/pascal_voc_conf.py create mode 100644 ssd/data/label_list create mode 100644 ssd/data/prepare_voc_data.py create mode 100644 ssd/data_provider.py create mode 100644 ssd/eval.py create mode 100644 ssd/image_util.py create mode 100644 ssd/images/ssd_network.png create mode 100644 ssd/index.html create mode 100644 ssd/infer.py create mode 100644 ssd/train.py create mode 100644 ssd/vgg_ssd_net.py create mode 100644 ssd/visual.py diff --git a/ssd/README.md b/ssd/README.md new file mode 100644 index 00000000..428f8fd2 --- /dev/null +++ b/ssd/README.md @@ -0,0 +1,66 @@ +# SSD目标检测 +## 概述 +SSD全称为Single Shot MultiBox Detector,是目标检测领域较新且效果较好的检测算法之一,具体参见论文\[[1](#引用)\]。SSD算法主要特点是检测速度快且检测精度高,当输入图像大小为300*300,显卡采用Nvidia Titan X时,检测速度可达到59FPS,并且在VOC2007 test数据集上mAP高达74.3%。PaddlePaddle已集成SSD算法,本示例旨在介绍如何使用PaddlePaddle的SSD模型进行目标检测。下文展开顺序为:首先简要介绍SSD原理,然后介绍示例包含文件及作用,接着介绍如何在PASCAL VOC数据集上训练、评估及检测,最后简要介绍如何在自有数据集上使用SSD。 +## SSD原理 +SSD使用一个卷积神经网络实现“端到端”的检测,所谓“端到端”指输入为原始图像,输出为检测结果,无需借助外部工具或流程进行特征提取、候选框生成等。论文中SSD的基础模型为VGG-16,其在VGG-16的某些层后面增加了一些额外的层进行候选框的提取,下图为模型的总体结构: + +

+
+图1. SSD网络结构 +

+ +如图所示,候选框的生成规则是预先设定的,比如Conv7输出的特征图每个像素点会对应6个候选框,这些候选框长宽比或面积有区分。在预测阶段模型会对这些提取出来的候选框做后处理,然后输出作为最终的检测结果。 +## 示例总览 +本示例共包含如下文件: +
+ +文件 | 用途 +---- | ----- +train.py | 训练脚本 +eval.py | 评估脚本,用于评估训好模型 +infer.py | 检测脚本,给定图片及模型,实施检测 +visual.py | 检测结果可视化 +image_util.py | 图像预处理所需公共函数 +data_provider.py | 数据处理脚本,生成训练、评估或检测所需数据 +config/pascal\_voc\_conf.py | 神经网络超参数配置文件 +data/label\_list | 类别列表 +data/prepare\_voc\_data.py | 准备训练PASCAL VOC数据列表 + +
+
表1. 示例文件
+ +训练阶段需要对数据做预处理,包括裁剪、采样等,这部分操作在```image_util.py```和```data_provider.py```中完成;值得注意的是,```config/vgg_config.py```为参数配置文件,包括训练参数、神经网络参数等,本配置文件包含参数是针对PASCAL VOC数据配置的,当训练自有数据时,需要仿照该文件配置新的参数;```data/prepare_voc_data.py```脚本用来生成文件列表,包括切分训练集和测试集,使用时需要用户事先下载并解压数据,默认采用VOC2007和VOC2012。 + +## PASCAL VOC数据集 +### 数据准备 +首先需要下载数据集,VOC2007\[[2](#引用)\]和VOC2012\[[3](#引用)\],VOC2007包含训练集和测试集,VOC2012只包含训练集,将下载好的数据解压,目录结构为```VOCdevkit/{VOC2007,VOC2012}```。进入```data```目录,运行```python prepare_voc_data.py```即可生成```trainval.txt```和```test.txt```,默认```prepare_voc_data.py```和```VOCdevkit```在相同目录下,且生成的文件列表也在该目录。需注意```trainval.txt```既包含VOC2007的训练数据,也包含VOC2012的训练数据,```test.txt```只包含VOC2007的测试数据。 +### 预训练模型准备 +下载训练好的VGG-16模型,推荐在ImageNet分类数据集上预训练的模型,针对caffe训练的模型,PaddlePaddle提供转换脚本,可方便转换成PaddlePaddle格式(待扩展),这里默认转换后的模型路径为```atrous_vgg/model.tar.gz```。 +### 模型训练 +直接执行```python train.py```即可进行训练。需要注意本示例仅支持CUDA GPU环境,无法在CPU上训练。```train.py```的一些关键执行逻辑: + +```python +paddle.init(use_gpu=True, trainer_count=4) +data_args = data_provider.Settings( + data_dir='./data', + label_file='label_list', + resize_h=cfg.IMG_HEIGHT, + resize_w=cfg.IMG_WIDTH, + mean_value=[104,117,124]) +train(train_file_list='./data/trainval.txt', + dev_file_list='./data/test.txt', + data_args=data_args, + init_model_path='./atrous_vgg/model.tar.gz') +``` + +调用```paddle.init```指定使用4卡GPU训练;调用```data_provider.Settings```配置数据预处理所需参数,其中```cfg.IMG_HEIGHT```和```cfg.IMG_WIDTH```在配置文件```config/vgg_config.py```中设置,这里均为300;调用```train```执行训练,其中```train_file_list```指定训练数据列表,```dev_file_list```指定评估数据列表,```init_model_path```指定预选模型位置。训练过程中会打印一些日志信息,每训练10个batch会输出当前的轮数、当前batch的cost及mAP,每训练一个pass,会保存一次模型,默认保存在```models```目录下(注:需事先创建)。 + +### 模型评估 +### 图像检测 + +## 自有数据集 + +## 引用 +1. Liu, Wei, et al. "Ssd: Single shot multibox detector." European conference on computer vision. Springer, Cham, 2016. +2. http://host.robots.ox.ac.uk/pascal/VOC/voc2007/index.html +3. http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html diff --git a/ssd/config/__init__.py b/ssd/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ssd/config/pascal_voc_conf.py b/ssd/config/pascal_voc_conf.py new file mode 100644 index 00000000..318b9ae6 --- /dev/null +++ b/ssd/config/pascal_voc_conf.py @@ -0,0 +1,91 @@ +from easydict import EasyDict as edict +import numpy as np + +__C = edict() +cfg = __C + +__C.TRAIN = edict() + +__C.IMG_WIDTH = 300 +__C.IMG_HEIGHT = 300 +__C.IMG_CHANNEL = 3 +__C.CLASS_NUM = 21 +__C.BACKGROUND_ID = 0 + +# training settings +__C.TRAIN.LEARNING_RATE = 0.001 / 4 +__C.TRAIN.MOMENTUM = 0.9 +__C.TRAIN.BATCH_SIZE = 32 +__C.TRAIN.NUM_PASS = 200 +__C.TRAIN.L2REGULARIZATION = 0.0005 * 4 +__C.TRAIN.LEARNING_RATE_DECAY_A = 0.1 +__C.TRAIN.LEARNING_RATE_DECAY_B = 16551 * 80 +__C.TRAIN.LEARNING_RATE_SCHEDULE = 'discexp' + +__C.NET = edict() + +# configuration for multibox_loss_layer +__C.NET.MBLOSS = edict() +__C.NET.MBLOSS.OVERLAP_THRESHOLD = 0.5 +__C.NET.MBLOSS.NEG_POS_RATIO = 3.0 +__C.NET.MBLOSS.NEG_OVERLAP = 0.5 + +# configuration for detection_map +__C.NET.DETMAP = edict() +__C.NET.DETMAP.OVERLAP_THRESHOLD = 0.5 +__C.NET.DETMAP.EVAL_DIFFICULT = False +__C.NET.DETMAP.AP_TYPE = "11point" + +# configuration for detection_output_layer +__C.NET.DETOUT = edict() +__C.NET.DETOUT.CONFIDENCE_THRESHOLD = 0.01 +__C.NET.DETOUT.NMS_THRESHOLD = 0.45 +__C.NET.DETOUT.NMS_TOP_K = 400 +__C.NET.DETOUT.KEEP_TOP_K = 200 + +# configuration for priorbox_layer from conv4_3 +__C.NET.CONV4 = edict() +__C.NET.CONV4.PB = edict() +__C.NET.CONV4.PB.MIN_SIZE = [30] +__C.NET.CONV4.PB.ASPECT_RATIO = [2.] +__C.NET.CONV4.PB.VARIANCE = [0.1, 0.1, 0.2, 0.2] + +# configuration for priorbox_layer from fc7 +__C.NET.FC7 = edict() +__C.NET.FC7.PB = edict() +__C.NET.FC7.PB.MIN_SIZE = [60] +__C.NET.FC7.PB.MAX_SIZE = [114] +__C.NET.FC7.PB.ASPECT_RATIO = [2., 3.] +__C.NET.FC7.PB.VARIANCE = [0.1, 0.1, 0.2, 0.2] + +# configuration for priorbox_layer from conv6_2 +__C.NET.CONV6 = edict() +__C.NET.CONV6.PB = edict() +__C.NET.CONV6.PB.MIN_SIZE = [114] +__C.NET.CONV6.PB.MAX_SIZE = [168] +__C.NET.CONV6.PB.ASPECT_RATIO = [2., 3.] +__C.NET.CONV6.PB.VARIANCE = [0.1, 0.1, 0.2, 0.2] + +# configuration for priorbox_layer from conv7_2 +__C.NET.CONV7 = edict() +__C.NET.CONV7.PB = edict() +__C.NET.CONV7.PB.MIN_SIZE = [168] +__C.NET.CONV7.PB.MAX_SIZE = [222] +__C.NET.CONV7.PB.ASPECT_RATIO = [2., 3.] +__C.NET.CONV7.PB.VARIANCE = [0.1, 0.1, 0.2, 0.2] + +# configuration for priorbox_layer from conv8_2 +__C.NET.CONV8 = edict() +__C.NET.CONV8.PB = edict() +__C.NET.CONV8.PB.MIN_SIZE = [222] +__C.NET.CONV8.PB.MAX_SIZE = [276] +__C.NET.CONV8.PB.ASPECT_RATIO = [2., 3.] +__C.NET.CONV8.PB.VARIANCE = [0.1, 0.1, 0.2, 0.2] + +# configuration for priorbox_layer from pool6 +__C.NET.POOL6 = edict() +__C.NET.POOL6.PB = edict() +__C.NET.POOL6.PB.MIN_SIZE = [276] +__C.NET.POOL6.PB.MAX_SIZE = [330] +__C.NET.POOL6.PB.ASPECT_RATIO = [2., 3.] +__C.NET.POOL6.PB.VARIANCE = [0.1, 0.1, 0.2, 0.2] diff --git a/ssd/data/label_list b/ssd/data/label_list new file mode 100644 index 00000000..87df23ce --- /dev/null +++ b/ssd/data/label_list @@ -0,0 +1,21 @@ +background +aeroplane +bicycle +bird +boat +bottle +bus +car +cat +chair +cow +diningtable +dog +horse +motorbike +person +pottedplant +sheep +sofa +train +tvmonitor diff --git a/ssd/data/prepare_voc_data.py b/ssd/data/prepare_voc_data.py new file mode 100644 index 00000000..a55b232d --- /dev/null +++ b/ssd/data/prepare_voc_data.py @@ -0,0 +1,71 @@ +import os +import os.path as osp +import re +import random + +devkit_dir = './VOCdevkit' +years = ['2007', '2012'] + + +def get_img_dir(devkit_dir, year): + return osp.join(devkit_dir, 'VOC' + year, 'JPEGImages') + + +def get_annotation_dir(devkit_dir, year): + return osp.join(devkit_dir, 'VOC' + year, 'Annotations') + + +def get_filelist_dir(devkit_dir, year): + return osp.join(devkit_dir, 'VOC' + year, 'ImageSets/Main') + + +def walk_dir(devkit_dir, year): + filelist_dir = get_filelist_dir(devkit_dir, year) + annotation_dir = get_annotation_dir(devkit_dir, year) + img_dir = get_img_dir(devkit_dir, year) + trainval_list = [] + test_list = [] + added = set() + + for _, _, files in os.walk(filelist_dir): + for fname in files: + img_ann_list = [] + if re.match('[a-z]+_trainval\.txt', fname): + img_ann_list = trainval_list + elif re.match('[a-z]+_test\.txt', fname): + img_ann_list = test_list + else: + continue + fpath = osp.join(filelist_dir, fname) + for line in open(fpath): + name_prefix = line.strip().split()[0] + if name_prefix in added: + continue + added.add(name_prefix) + ann_path = osp.join(annotation_dir, name_prefix + '.xml') + img_path = osp.join(img_dir, name_prefix + '.jpg') + assert os.path.isfile(ann_path), 'file %s not found.' % ann_path + assert os.path.isfile(img_path), 'file %s not found.' % img_path + img_ann_list.append((img_path, ann_path)) + + return trainval_list, test_list + + +def prepare_filelist(devkit_dir, years, output_dir): + trainval_list = [] + test_list = [] + for year in years: + trainval, test = walk_dir(devkit_dir, year) + trainval_list.extend(trainval) + test_list.extend(test) + random.shuffle(trainval_list) + with open(osp.join(output_dir, 'trainval.txt'), 'w') as ftrainval: + for item in trainval_list: + ftrainval.write(item[0] + ' ' + item[1] + '\n') + + with open(osp.join(output_dir, 'test.txt'), 'w') as ftest: + for item in test_list: + ftest.write(item[0] + ' ' + item[1] + '\n') + + +prepare_filelist(devkit_dir, years, '.') diff --git a/ssd/data_provider.py b/ssd/data_provider.py new file mode 100644 index 00000000..c01eb081 --- /dev/null +++ b/ssd/data_provider.py @@ -0,0 +1,182 @@ +# Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import image_util +from paddle.utils.image_util import * +import random +from PIL import Image +import numpy as np +import xml.etree.ElementTree +import os + + +class Settings(object): + def __init__(self, data_dir, label_file, resize_h, resize_w, mean_value): + self._data_dir = data_dir + self._label_list = [] + label_fpath = os.path.join(data_dir, label_file) + for line in open(label_fpath): + self._label_list.append(line.strip()) + + self._resize_height = resize_h + self._resize_width = resize_w + self._mean_value = mean_value + + img_size = self._resize_height * self._resize_width + self._img_mean = np.zeros(img_size * 3, dtype=np.single) + for idx, value in enumerate(self._mean_value): + self._img_mean[idx * img_size:(idx + 1) * img_size] = value + self._img_mean = self._img_mean.reshape(3, self._resize_height, + self._resize_width) + self._img_mean = self._img_mean.astype('float32') + + @property + def data_dir(self): + return self._data_dir + + @property + def label_list(self): + return self._label_list + + @property + def resize_h(self): + return self._resize_height + + @property + def resize_w(self): + return self._resize_width + + @property + def img_mean(self): + return self._img_mean + + +def _reader_creator(settings, file_list, mode, shuffle): + def reader(): + with open(file_list) as flist: + lines = [line.strip() for line in flist] + if shuffle: + random.shuffle(lines) + for line in lines: + if mode == 'train' or mode == 'test': + img_path, label_path = line.split() + img_path = os.path.join(settings.data_dir, img_path) + label_path = os.path.join(settings.data_dir, label_path) + elif mode == 'infer': + img_path = os.path.join(settings.data_dir, line) + + img = Image.open(img_path) + img_width, img_height = img.size + img = np.array(img) + + # layout: label | xmin | ymin | xmax | ymax | difficult + if mode == 'train' or mode == 'test': + bbox_labels = [] + root = xml.etree.ElementTree.parse(label_path).getroot() + for object in root.findall('object'): + bbox_sample = [] + # start from 1 + bbox_sample.append( + float( + settings.label_list.index( + object.find('name').text))) + bbox = object.find('bndbox') + difficult = float(object.find('difficult').text) + bbox_sample.append( + float(bbox.find('xmin').text) / img_width) + bbox_sample.append( + float(bbox.find('ymin').text) / img_height) + bbox_sample.append( + float(bbox.find('xmax').text) / img_width) + bbox_sample.append( + float(bbox.find('ymax').text) / img_height) + bbox_sample.append(difficult) + bbox_labels.append(bbox_sample) + + sample_labels = bbox_labels + if mode == 'train': + batch_sampler = [] + # hard-code here + batch_sampler.append( + image_util.sampler(1, 1, 1.0, 1.0, 1.0, 1.0, 0.0, + 0.0)) + batch_sampler.append( + image_util.sampler(1, 50, 0.3, 1.0, 0.5, 2.0, 0.1, + 0.0)) + batch_sampler.append( + image_util.sampler(1, 50, 0.3, 1.0, 0.5, 2.0, 0.3, + 0.0)) + batch_sampler.append( + image_util.sampler(1, 50, 0.3, 1.0, 0.5, 2.0, 0.5, + 0.0)) + batch_sampler.append( + image_util.sampler(1, 50, 0.3, 1.0, 0.5, 2.0, 0.7, + 0.0)) + batch_sampler.append( + image_util.sampler(1, 50, 0.3, 1.0, 0.5, 2.0, 0.9, + 0.0)) + batch_sampler.append( + image_util.sampler(1, 50, 0.3, 1.0, 0.5, 2.0, 0.0, + 1.0)) + """ random crop """ + sampled_bbox = image_util.generateBatchSamples( + batch_sampler, bbox_labels, img_width, img_height) + + if len(sampled_bbox) > 0: + idx = int(random.uniform(0, len(sampled_bbox))) + img, sample_labels = image_util.cropImage( + img, bbox_labels, sampled_bbox[idx], img_width, + img_height) + + img = Image.fromarray(img) + img = img.resize((settings.resize_w, settings.resize_h), + Image.ANTIALIAS) + img = np.array(img) + + if mode == 'train': + mirror = int(random.uniform(0, 2)) + if mirror == 1: + img = img[:, ::-1, :] + for i in xrange(len(sample_labels)): + tmp = sample_labels[i][1] + sample_labels[i][1] = 1 - sample_labels[i][3] + sample_labels[i][3] = 1 - tmp + + if len(img.shape) == 3: + img = np.swapaxes(img, 1, 2) + img = np.swapaxes(img, 1, 0) + + img = img.astype('float32') + img -= settings.img_mean + img = img.flatten() + + if mode == 'train' or mode == 'test': + if mode == 'train' and len(sample_labels) == 0: continue + yield img.astype('float32'), sample_labels + elif mode == 'infer': + yield img.astype('float32') + + return reader + + +def train(settings, file_list, shuffle=True): + return _reader_creator(settings, file_list, 'train', shuffle) + + +def test(settings, file_list): + return _reader_creator(settings, file_list, 'test', False) + + +def infer(settings, file_list): + return _reader_creator(settings, file_list, 'infer', False) diff --git a/ssd/eval.py b/ssd/eval.py new file mode 100644 index 00000000..345e46f9 --- /dev/null +++ b/ssd/eval.py @@ -0,0 +1,48 @@ +import paddle.v2 as paddle +import data_provider +import vgg_ssd_net +import os, sys +import gzip +from config.pascal_voc_conf import cfg + + +def eval(eval_file_list, batch_size, data_args, model_path): + cost, detect_out = vgg_ssd_net.net_conf(mode='eval') + + assert os.path.isfile(model_path), 'Invalid model.' + parameters = paddle.parameters.Parameters.from_tar(gzip.open(model_path)) + + optimizer = paddle.optimizer.Momentum() + + trainer = paddle.trainer.SGD( + cost=cost, + parameters=parameters, + extra_layers=[detect_out], + update_equation=optimizer) + + feeding = {'image': 0, 'bbox': 1} + + reader = paddle.batch( + data_provider.test(data_args, eval_file_list), batch_size=batch_size) + + result = trainer.test(reader=reader, feeding=feeding) + + print "TestCost: %f, Detection mAP=%g" % \ + (result.cost, result.metrics['detection_evaluator']) + + +if __name__ == "__main__": + paddle.init(use_gpu=True, trainer_count=4) # use 4 gpus + + data_args = data_provider.Settings( + data_dir='./data', + label_file='label_list', + resize_h=cfg.IMG_HEIGHT, + resize_w=cfg.IMG_WIDTH, + mean_value=[104, 117, 124]) + + eval( + eval_file_list='./data/test.txt', + batch_size=4, + data_args=data_args, + model_path='models/pass-00000.tar.gz') diff --git a/ssd/image_util.py b/ssd/image_util.py new file mode 100644 index 00000000..9997fd55 --- /dev/null +++ b/ssd/image_util.py @@ -0,0 +1,181 @@ +# Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from PIL import Image +import numpy as np +import random +import math + + +class sampler(): + def __init__(self, max_sample, max_trial, min_scale, max_scale, + min_aspect_ratio, max_aspect_ratio, min_jaccard_overlap, + max_jaccard_overlap): + self.max_sample = max_sample + self.max_trial = max_trial + self.min_scale = min_scale + self.max_scale = max_scale + self.min_aspect_ratio = min_aspect_ratio + self.max_aspect_ratio = max_aspect_ratio + self.min_jaccard_overlap = min_jaccard_overlap + self.max_jaccard_overlap = max_jaccard_overlap + + +class bbox(): + def __init__(self, xmin, ymin, xmax, ymax): + self.xmin = xmin + self.ymin = ymin + self.xmax = xmax + self.ymax = ymax + + +def bboxSize(src_bbox): + width = src_bbox.xmax - src_bbox.xmin + height = src_bbox.ymax - src_bbox.ymin + return width * height + + +def preprocessImg(obj, im): + im = im.astype('float32') + pic = im + pic -= obj.img_mean + return pic.flatten() + + +def generateSample(sampler): + scale = random.uniform(sampler.min_scale, sampler.max_scale) + min_aspect_ratio = max(sampler.min_aspect_ratio, (scale**2.0)) + max_aspect_ratio = min(sampler.max_aspect_ratio, 1 / (scale**2.0)) + aspect_ratio = random.uniform(min_aspect_ratio, max_aspect_ratio) + bbox_width = scale * (aspect_ratio**0.5) + bbox_height = scale / (aspect_ratio**0.5) + xmin_bound = 1 - bbox_width + ymin_bound = 1 - bbox_height + xmin = random.uniform(0, xmin_bound) + ymin = random.uniform(0, ymin_bound) + xmax = xmin + bbox_width + ymax = ymin + bbox_height + sampled_bbox = bbox(xmin, ymin, xmax, ymax) + return sampled_bbox + + +def jaccardOverlap(sample_bbox, object_bbox): + if sample_bbox.xmin >= object_bbox.xmax or \ + sample_bbox.xmax <= object_bbox.xmin or \ + sample_bbox.ymin >= object_bbox.ymax or \ + sample_bbox.ymax <= object_bbox.ymin: + return 0 + intersect_xmin = max(sample_bbox.xmin, object_bbox.xmin) + intersect_ymin = max(sample_bbox.ymin, object_bbox.ymin) + intersect_xmax = min(sample_bbox.xmax, object_bbox.xmax) + intersect_ymax = min(sample_bbox.ymax, object_bbox.ymax) + intersect_size = (intersect_xmax - intersect_xmin) * ( + intersect_ymax - intersect_ymin) + sample_bbox_size = bboxSize(sample_bbox) + object_bbox_size = bboxSize(object_bbox) + overlap = intersect_size / ( + sample_bbox_size + object_bbox_size - intersect_size) + return overlap + + +def satisfySampleConstraint(sampler, sample_bbox, bbox_labels): + if sampler.min_jaccard_overlap == 0 and sampler.max_jaccard_overlap == 0: + return True + for i in range(len(bbox_labels)): + object_bbox = bbox(bbox_labels[i][1], bbox_labels[i][2], + bbox_labels[i][3], bbox_labels[i][4]) + overlap = jaccardOverlap(sample_bbox, object_bbox) + if sampler.min_jaccard_overlap != 0 and \ + overlap < sampler.min_jaccard_overlap: + continue + if sampler.max_jaccard_overlap != 0 and \ + overlap > sampler.max_jaccard_overlap: + continue + return True + return False + + +def generateBatchSamples(batch_sampler, bbox_labels, image_width, image_height): + sampled_bbox = [] + index = [] + c = 0 + for sampler in batch_sampler: + found = 0 + for i in range(sampler.max_trial): + if found >= sampler.max_sample: + break + sample_bbox = generateSample(sampler) + if satisfySampleConstraint(sampler, sample_bbox, bbox_labels): + sampled_bbox.append(sample_bbox) + found = found + 1 + index.append(c) + c = c + 1 + return sampled_bbox + + +def clipBBox(src_bbox): + src_bbox.xmin = max(min(src_bbox.xmin, 1.0), 0.0) + src_bbox.ymin = max(min(src_bbox.ymin, 1.0), 0.0) + src_bbox.xmax = max(min(src_bbox.xmax, 1.0), 0.0) + src_bbox.ymax = max(min(src_bbox.ymax, 1.0), 0.0) + return src_bbox + + +def meetEmitConstraint(src_bbox, sample_bbox): + center_x = (src_bbox.xmax + src_bbox.xmin) / 2 + center_y = (src_bbox.ymax + src_bbox.ymin) / 2 + if center_x >= sample_bbox.xmin and \ + center_x <= sample_bbox.xmax and \ + center_y >= sample_bbox.ymin and \ + center_y <= sample_bbox.ymax: + return True + return False + + +def transformLabels(bbox_labels, sample_bbox): + proj_bbox = bbox(0, 0, 0, 0) + sample_labels = [] + for i in range(len(bbox_labels)): + sample_label = [] + object_bbox = bbox(bbox_labels[i][1], bbox_labels[i][2], + bbox_labels[i][3], bbox_labels[i][4]) + if not meetEmitConstraint(object_bbox, sample_bbox): + continue + sample_width = sample_bbox.xmax - sample_bbox.xmin + sample_height = sample_bbox.ymax - sample_bbox.ymin + proj_bbox.xmin = (object_bbox.xmin - sample_bbox.xmin) / sample_width + proj_bbox.ymin = (object_bbox.ymin - sample_bbox.ymin) / sample_height + proj_bbox.xmax = (object_bbox.xmax - sample_bbox.xmin) / sample_width + proj_bbox.ymax = (object_bbox.ymax - sample_bbox.ymin) / sample_height + proj_bbox = clipBBox(proj_bbox) + if bboxSize(proj_bbox) > 0: + sample_label.append(bbox_labels[i][0]) + sample_label.append(float(proj_bbox.xmin)) + sample_label.append(float(proj_bbox.ymin)) + sample_label.append(float(proj_bbox.xmax)) + sample_label.append(float(proj_bbox.ymax)) + sample_label.append(bbox_labels[i][5]) + sample_labels.append(sample_label) + return sample_labels + + +def cropImage(img, bbox_labels, sample_bbox, image_width, image_height): + sample_bbox = clipBBox(sample_bbox) + xmin = int(sample_bbox.xmin * image_width) + xmax = int(sample_bbox.xmax * image_width) + ymin = int(sample_bbox.ymin * image_height) + ymax = int(sample_bbox.ymax * image_height) + sample_img = img[ymin:ymax, xmin:xmax] + sample_labels = transformLabels(bbox_labels, sample_bbox) + return sample_img, sample_labels diff --git a/ssd/images/ssd_network.png b/ssd/images/ssd_network.png new file mode 100644 index 0000000000000000000000000000000000000000..193caa0168a4f981506ad7b97f8b9fb35557ed20 GIT binary patch literal 154618 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�%k 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%0A#!{+z|U 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 literal 0 HcmV?d00001 diff --git a/ssd/index.html b/ssd/index.html new file mode 100644 index 00000000..c312ea50 --- /dev/null +++ b/ssd/index.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + +
+
+ + + + + + + diff --git a/ssd/infer.py b/ssd/infer.py new file mode 100644 index 00000000..600f44b4 --- /dev/null +++ b/ssd/infer.py @@ -0,0 +1,104 @@ +import paddle.v2 as paddle +import data_provider +import vgg_ssd_net +import os, sys +import numpy as np +import gzip +from PIL import Image +from config.pascal_voc_conf import cfg + + +def _infer(inferer, infer_data, threshold): + ret = [] + infer_res = inferer.infer(input=infer_data) + keep_inds = np.where(infer_res[:, 2] >= threshold)[0] + for idx in keep_inds: + ret.append([ + infer_res[idx][0], infer_res[idx][1] - 1, infer_res[idx][2], + infer_res[idx][3], infer_res[idx][4], infer_res[idx][5], + infer_res[idx][6] + ]) + return ret + + +def infer(eval_file_list, save_path, data_args, batch_size, model_path, + threshold): + detect_out = vgg_net_ssd_v2.net_conf(mode='infer') + + assert os.path.isfile(init_model_path), 'Invalid model.' + parameters = paddle.parameters.Parameters.from_tar(gzip.open(model_path)) + + inferer = paddle.inference.Inference( + output_layer=detect_out, parameters=parameters) + + reader = data_provider.infer(data_args, eval_file_list) + all_fname_list = [line.strip() for line in open(eval_file_list).readlines()] + + test_data = [] + fname_list = [] + img_w = [] + img_h = [] + idx = 0 + """Do inference batch by batch, + coords of bbox will be scaled based on image size + """ + with open(save_path, 'w') as fout: + for img in reader(): + test_data.append([img]) + fname_list.append(all_fname_list[idx]) + w, h = \ + Image.open(os.path.join('./data', fname_list[-1])).size + img_w.append(w) + img_h.append(h) + if len(test_data) == batch_size: + ret_res = _infer(inferer, test_data, threshold) + for det_res in ret_res: + img_idx = int(det_res[0]) + label = int(det_res[1]) + conf_score = det_res[2] + xmin = det_res[3] * img_w[img_idx] + ymin = det_res[4] * img_h[img_idx] + xmax = det_res[5] * img_w[img_idx] + ymax = det_res[6] * img_h[img_idx] + fout.write(fname_list[img_idx] + '\t' + str(label) + '\t' + + str(conf_score) + '\t' + str(xmin) + ' ' + str( + ymin) + ' ' + str(xmax) + ' ' + str( + ymax) + '\n') + test_data = [] + fname_list = [] + img_w = [] + img_h = [] + idx += 1 + + if len(test_data) > 0: + ret_res = _infer(inferer, test_data, threshold) + for det_res in ret_res: + img_idx = int(det_res[0]) + label = int(det_res[1]) + conf_score = det_res[2] + xmin = det_res[3] * img_w[img_idx] + ymin = det_res[4] * img_h[img_idx] + xmax = det_res[5] * img_w[img_idx] + ymax = det_res[6] * img_h[img_idx] + fout.write(fname_list[img_idx] + '\t' + str(label) + '\t' + str( + conf_score) + '\t' + str(xmin) + ' ' + str(ymin) + ' ' + + str(xmax) + ' ' + str(ymax) + '\n') + + +if __name__ == "__main__": + paddle.init(use_gpu=True, trainer_count=1) + + data_args = data_provider.Settings( + data_dir='./data', + label_file='label_list', + resize_h=cfg.IMG_HEIGHT, + resize_w=cfg.IMG_WIDTH, + mean_value=[104, 117, 124]) + + infer( + eval_file_list='./data/infer.txt', + save_path='infer.res', + data_args=data_args, + batch_size=4, + model_path='models/pass-00000.tar.gz', + threshold=0.3) diff --git a/ssd/train.py b/ssd/train.py new file mode 100644 index 00000000..f980bf4e --- /dev/null +++ b/ssd/train.py @@ -0,0 +1,89 @@ +import paddle.v2 as paddle +import data_provider +import vgg_ssd_net +import os, sys +import gzip +import tarfile +from pascal_voc_conf import cfg + + +def train(train_file_list, dev_file_list, data_args, init_model_path): + cost, detect_out = vgg_ssd_net.net_conf('train') + + parameters = paddle.parameters.create(cost) + + if not (init_model_path is None): + assert os.path.isfile(init_model_path), 'Invalid model.' + fparams = paddle.parameters.Parameters.from_tar( + gzip.open(init_model_path)) + for param_name in fparams.names(): + parameters.set(param_name, fparams.get(param_name)) + + optimizer = paddle.optimizer.Momentum( + momentum=cfg.TRAIN.MOMENTUM, + learning_rate=cfg.TRAIN.LEARNING_RATE, + regularization=paddle.optimizer.L2Regularization( + rate=cfg.TRAIN.L2REGULARIZATION), + learning_rate_decay_a=cfg.TRAIN.LEARNING_RATE_DECAY_A, + learning_rate_decay_b=cfg.TRAIN.LEARNING_RATE_DECAY_B, + learning_rate_schedule=cfg.TRAIN.LEARNING_RATE_SCHEDULE) + + trainer = paddle.trainer.SGD( + cost=cost, + parameters=parameters, + extra_layers=[detect_out], + update_equation=optimizer) + + feeding = {'image': 0, 'bbox': 1} + + train_reader = paddle.batch( + paddle.reader.shuffle( + data_provider.train(data_args, train_file_list), buf_size=200), + batch_size=cfg.TRAIN.BATCH_SIZE) # generate a batch image each time + + dev_reader = paddle.batch( + data_provider.test(data_args, dev_file_list), + batch_size=cfg.TRAIN.BATCH_SIZE) + + def event_handler(event): + if isinstance(event, paddle.event.EndIteration): + if event.batch_id % 1 == 0: + print "\nPass %d, Batch %d, TrainCost %f, Detection mAP=%f" % \ + (event.pass_id, + event.batch_id, + event.cost, + event.metrics['detection_evaluator']) + else: + sys.stdout.write('.') + sys.stdout.flush() + + if isinstance(event, paddle.event.EndPass): + with gzip.open('models/params_pass_%05d.tar.gz' % event.pass_id, + 'w') as f: + parameters.to_tar(f) + result = trainer.test(reader=dev_reader, feeding=feeding) + print "\nTest with Pass %d, TestCost: %f, Detection mAP=%g" % \ + (event.pass_id, + result.cost, + result.metrics['detection_evaluator']) + + trainer.train( + reader=train_reader, + event_handler=event_handler, + num_passes=cfg.TRAIN.NUM_PASS, + feeding=feeding) + + +if __name__ == "__main__": + paddle.init(use_gpu=True, trainer_count=4) + data_args = data_provider.Settings( + data_dir='./data', + label_file='label_list', + resize_h=cfg.IMG_HEIGHT, + resize_w=cfg.IMG_WIDTH, + mean_value=[104, 117, 124]) + train( + train_file_list='./data/trainval.txt', + dev_file_list='./data/test.txt', + data_args=data_args, + init_model_path='./atrous_vgg/model.tar.gz') diff --git a/ssd/vgg_ssd_net.py b/ssd/vgg_ssd_net.py new file mode 100644 index 00000000..0a4f0d31 --- /dev/null +++ b/ssd/vgg_ssd_net.py @@ -0,0 +1,360 @@ +import paddle.v2 as paddle +from config.vgg_config import cfg + + +def net_conf(mode): + """Network configuration. Total three modes included 'train' 'eval' + and 'infer'. Loss and mAP evaluation layer will return if using 'train' + and 'eval'. In 'infer' mode, only detection output layer will be returned. + """ + default_l2regularization = cfg.TRAIN.L2REGULARIZATION + + default_bias_attr = paddle.attr.ParamAttr( + l2_rate=0.0, learning_rate=2.0, momentum=cfg.TRAIN.MOMENTUM) + default_static_bias_attr = paddle.attr.ParamAttr(is_static=True) + + def xavier(channels, filter_size, local_lr, regularization): + init_w = (3.0 / (filter_size**2 * channels))**0.5 + is_static = False + if local_lr == 0.0: + is_static = True + return paddle.attr.ParamAttr( + initial_min=(0.0 - init_w), + initial_max=init_w, + learning_rate=local_lr, + l2_rate=regularization, + momentum=cfg.TRAIN.MOMENTUM, + is_static=is_static) + + def vgg_block(idx_str, input, num_channels, num_filters, pool_size, + pool_stride, pool_pad): + layer_name = "conv%s_" % idx_str + conv1 = paddle.layer.img_conv( + name=layer_name + "1", + input=input, + filter_size=3, + num_channels=num_channels, + num_filters=num_filters, + stride=1, + padding=1, + bias_attr=default_bias_attr, + param_attr=xavier(num_filters, 3, 1, default_l2regularization), + act=paddle.activation.Relu()) + conv2 = paddle.layer.img_conv( + name=layer_name + "2", + input=conv1, + filter_size=3, + num_channels=num_filters, + num_filters=num_filters, + stride=1, + padding=1, + bias_attr=default_bias_attr, + param_attr=xavier(num_filters, 3, 1, default_l2regularization), + act=paddle.activation.Relu()) + conv3 = paddle.layer.img_conv( + name=layer_name + "3", + input=conv2, + filter_size=3, + num_channels=num_filters, + num_filters=num_filters, + stride=1, + padding=1, + bias_attr=default_bias_attr, + param_attr=xavier(num_filters, 3, 1, default_l2regularization), + act=paddle.activation.Relu()) + pool = paddle.layer.img_pool( + input=conv3, + pool_size=pool_size, + num_channels=num_filters, + pool_type=paddle.pooling.CudnnMax(), + stride=pool_stride, + padding=pool_pad) + return conv3, pool + + def mbox_block(layer_idx, input, num_channels, filter_size, loc_filters, + conf_filters): + mbox_loc_name = layer_idx + "_mbox_loc" + mbox_loc = paddle.layer.img_conv( + name=mbox_loc_name, + input=input, + filter_size=filter_size, + num_channels=num_channels, + num_filters=loc_filters, + stride=1, + padding=1, + bias_attr=default_bias_attr, + param_attr=xavier(loc_filters, filter_size, 1, + default_l2regularization), + act=paddle.activation.Identity()) + + mbox_conf_name = layer_idx + "_mbox_conf" + mbox_conf = paddle.layer.img_conv( + name=mbox_conf_name, + input=input, + filter_size=filter_size, + num_channels=num_channels, + num_filters=conf_filters, + stride=1, + padding=1, + bias_attr=default_bias_attr, + param_attr=xavier(conf_filters, filter_size, 1, + default_l2regularization), + act=paddle.activation.Identity()) + + return mbox_loc, mbox_conf + + def ssd_block(layer_idx, input, img_shape, num_channels, num_filters1, + num_filters2, aspect_ratio, variance, min_size, max_size): + layer_name = "conv" + layer_idx + "_" + conv1_name = layer_name + "1" + conv1 = paddle.layer.img_conv( + name=conv1_name, + input=input, + filter_size=1, + num_channels=num_channels, + num_filters=num_filters1, + stride=1, + padding=0, + bias_attr=default_bias_attr, + param_attr=xavier(num_filters1, 1, 1, default_l2regularization), + act=paddle.activation.Relu()) + conv2_name = layer_name + "2" + conv2 = paddle.layer.img_conv( + name=conv2_name, + input=conv1, + filter_size=3, + num_channels=num_filters1, + num_filters=num_filters2, + stride=2, + padding=1, + bias_attr=default_bias_attr, + param_attr=xavier(num_filters2, 3, 1, default_l2regularization), + act=paddle.activation.Relu()) + + loc_filters = (len(aspect_ratio) * 2 + 1 + len(max_size)) * 4 + conf_filters = ( + len(aspect_ratio) * 2 + 1 + len(max_size)) * cfg.CLASS_NUM + mbox_loc, mbox_conf = mbox_block(conv2_name, conv2, num_filters2, 3, + loc_filters, conf_filters) + mbox_priorbox = paddle.layer.priorbox( + input=conv2, + image=img_shape, + min_size=min_size, + max_size=max_size, + aspect_ratio=aspect_ratio, + variance=variance) + + return conv2, mbox_loc, mbox_conf, mbox_priorbox + + img = paddle.layer.data( + name='image', + type=paddle.data_type.dense_vector(cfg.IMG_CHANNEL * cfg.IMG_HEIGHT * + cfg.IMG_WIDTH), + height=cfg.IMG_HEIGHT, + width=cfg.IMG_WIDTH) + + conv1_1 = paddle.layer.img_conv( + name="conv1_1", + input=img, + filter_size=3, + num_channels=3, + num_filters=64, + stride=1, + padding=1, + bias_attr=default_static_bias_attr, + param_attr=xavier(64, 3, 0, 0), + act=paddle.activation.Relu()) + conv1_2 = paddle.layer.img_conv( + name="conv1_2", + input=conv1_1, + filter_size=3, + num_channels=64, + num_filters=64, + stride=1, + padding=1, + bias_attr=default_static_bias_attr, + param_attr=xavier(64, 3, 0, 0), + act=paddle.activation.Relu()) + pool1 = paddle.layer.img_pool( + name="pool1", + input=conv1_2, + pool_type=paddle.pooling.CudnnMax(), + pool_size=2, + num_channels=64, + stride=2) + + conv2_1 = paddle.layer.img_conv( + name="conv2_1", + input=pool1, + filter_size=3, + num_channels=64, + num_filters=128, + stride=1, + padding=1, + bias_attr=default_static_bias_attr, + param_attr=xavier(128, 3, 0, 0), + act=paddle.activation.Relu()) + conv2_2 = paddle.layer.img_conv( + name="conv2_2", + input=conv2_1, + filter_size=3, + num_channels=128, + num_filters=128, + stride=1, + padding=1, + bias_attr=default_static_bias_attr, + param_attr=xavier(128, 3, 0, 0), + act=paddle.activation.Relu()) + pool2 = paddle.layer.img_pool( + name="pool2", + input=conv2_2, + pool_type=paddle.pooling.CudnnMax(), + pool_size=2, + num_channels=128, + stride=2) + + conv3_3, pool3 = vgg_block("3", pool2, 128, 256, 2, 2, 0) + + conv4_3, pool4 = vgg_block("4", pool3, 256, 512, 2, 2, 0) + conv4_3_mbox_priorbox = paddle.layer.priorbox( + input=conv4_3, + image=img, + min_size=cfg.NET.CONV4.PB.MIN_SIZE, + aspect_ratio=cfg.NET.CONV4.PB.ASPECT_RATIO, + variance=cfg.NET.CONV4.PB.VARIANCE) + conv4_3_norm = paddle.layer.cross_channel_norm( + name="conv4_3_norm", + input=conv4_3, + param_attr=paddle.attr.ParamAttr( + initial_mean=20, + initial_std=0, + is_static=False, + learning_rate=1, + momentum=cfg.TRAIN.MOMENTUM)) + conv4_3_norm_mbox_loc, conv4_3_norm_mbox_conf = \ + mbox_block("conv4_3_norm", conv4_3_norm, 512, 3, 12, 63) + + conv5_3, pool5 = vgg_block("5", pool4, 512, 512, 3, 1, 1) + + fc6 = paddle.layer.img_conv( + name="fc6", + input=pool5, + filter_size=3, + num_channels=512, + num_filters=1024, + stride=1, + padding=1, + bias_attr=default_bias_attr, + param_attr=xavier(1024, 3, 1, default_l2regularization), + act=paddle.activation.Relu()) + + fc7 = paddle.layer.img_conv( + name="fc7", + input=fc6, + filter_size=1, + num_channels=1024, + num_filters=1024, + stride=1, + padding=0, + bias_attr=default_bias_attr, + param_attr=xavier(1024, 1, 1, default_l2regularization), + act=paddle.activation.Relu()) + fc7_mbox_loc, fc7_mbox_conf = mbox_block("fc7", fc7, 1024, 3, 24, 126) + fc7_mbox_priorbox = paddle.layer.priorbox( + input=fc7, + image=img, + min_size=cfg.NET.FC7.PB.MIN_SIZE, + max_size=cfg.NET.FC7.PB.MAX_SIZE, + aspect_ratio=cfg.NET.FC7.PB.ASPECT_RATIO, + variance=cfg.NET.FC7.PB.VARIANCE) + + conv6_2, conv6_2_mbox_loc, conv6_2_mbox_conf, conv6_2_mbox_priorbox = \ + ssd_block("6", fc7, img, 1024, 256, 512, + cfg.NET.CONV6.PB.ASPECT_RATIO, + cfg.NET.CONV6.PB.VARIANCE, + cfg.NET.CONV6.PB.MIN_SIZE, + cfg.NET.CONV6.PB.MAX_SIZE) + conv7_2, conv7_2_mbox_loc, conv7_2_mbox_conf, conv7_2_mbox_priorbox = \ + ssd_block("7", conv6_2, img, 512, 128, 256, + cfg.NET.CONV7.PB.ASPECT_RATIO, + cfg.NET.CONV7.PB.VARIANCE, + cfg.NET.CONV7.PB.MIN_SIZE, + cfg.NET.CONV7.PB.MAX_SIZE) + conv8_2, conv8_2_mbox_loc, conv8_2_mbox_conf, conv8_2_mbox_priorbox = \ + ssd_block("8", conv7_2, img, 256, 128, 256, + cfg.NET.CONV8.PB.ASPECT_RATIO, + cfg.NET.CONV8.PB.VARIANCE, + cfg.NET.CONV8.PB.MIN_SIZE, + cfg.NET.CONV8.PB.MAX_SIZE) + + pool6 = paddle.layer.img_pool( + name="pool6", + input=conv8_2, + pool_size=3, + num_channels=256, + stride=1, + pool_type=paddle.pooling.Avg()) + pool6_mbox_loc, pool6_mbox_conf = mbox_block("pool6", pool6, 256, 3, 24, + 126) + pool6_mbox_priorbox = paddle.layer.priorbox( + input=pool6, + image=img, + min_size=cfg.NET.POOL6.PB.MIN_SIZE, + max_size=cfg.NET.POOL6.PB.MAX_SIZE, + aspect_ratio=cfg.NET.POOL6.PB.ASPECT_RATIO, + variance=cfg.NET.POOL6.PB.VARIANCE) + + mbox_priorbox = paddle.layer.concat( + name="mbox_priorbox", + input=[ + conv4_3_mbox_priorbox, fc7_mbox_priorbox, conv6_2_mbox_priorbox, + conv7_2_mbox_priorbox, conv8_2_mbox_priorbox, pool6_mbox_priorbox + ]) + + loc_loss_input = [ + conv4_3_norm_mbox_loc, fc7_mbox_loc, conv6_2_mbox_loc, conv7_2_mbox_loc, + conv8_2_mbox_loc, pool6_mbox_loc + ] + + conf_loss_input = [ + conv4_3_norm_mbox_conf, fc7_mbox_conf, conv6_2_mbox_conf, + conv7_2_mbox_conf, conv8_2_mbox_conf, pool6_mbox_conf + ] + + detection_out = paddle.layer.detection_output( + input_loc=loc_loss_input, + input_conf=conf_loss_input, + priorbox=mbox_priorbox, + confidence_threshold=cfg.NET.DETOUT.CONFIDENCE_THRESHOLD, + nms_threshold=cfg.NET.DETOUT.NMS_THRESHOLD, + num_classes=cfg.CLASS_NUM, + nms_top_k=cfg.NET.DETOUT.NMS_TOP_K, + keep_top_k=cfg.NET.DETOUT.KEEP_TOP_K, + background_id=cfg.BACKGROUND_ID, + name="detection_output") + + if mode == 'train' or mode == 'eval': + bbox = paddle.layer.data( + name='bbox', type=paddle.data_type.dense_vector_sequence(6)) + loss = paddle.layer.multibox_loss( + input_loc=loc_loss_input, + input_conf=conf_loss_input, + priorbox=mbox_priorbox, + label=bbox, + num_classes=cfg.CLASS_NUM, + overlap_threshold=cfg.NET.MBLOSS.OVERLAP_THRESHOLD, + neg_pos_ratio=cfg.NET.MBLOSS.NEG_POS_RATIO, + neg_overlap=cfg.NET.MBLOSS.NEG_OVERLAP, + background_id=cfg.BACKGROUND_ID, + name="multibox_loss") + paddle.evaluator.detection_map( + input=detection_out, + label=bbox, + overlap_threshold=cfg.NET.DETMAP.OVERLAP_THRESHOLD, + background_id=cfg.BACKGROUND_ID, + evaluate_difficult=cfg.NET.DETMAP.EVAL_DIFFICULT, + ap_type=cfg.NET.DETMAP.AP_TYPE, + name="detection_evaluator") + return loss, detection_out + elif mode == 'infer': + return detection_out diff --git a/ssd/visual.py b/ssd/visual.py new file mode 100644 index 00000000..d2ad7945 --- /dev/null +++ b/ssd/visual.py @@ -0,0 +1,31 @@ +import cv2 +import os + +data_dir = './data' +infer_file = './infer.res' + +path_to_im = dict() + +for line in open(infer_file): + img_path, _, _, _ = line.strip().split('\t') + if img_path not in path_to_im: + im = cv2.imread(os.path.join(data_dir, img_path)) + path_to_im[img_path] = im + +for line in open(infer_file): + img_path, label, conf, bbox = line.strip().split('\t') + xmin, ymin, xmax, ymax = map(float, bbox.split(' ')) + xmin = int(round(xmin)) + ymin = int(round(ymin)) + xmax = int(round(xmax)) + ymax = int(round(ymax)) + + img = path_to_im[img_path] + cv2.rectangle(img, (xmin, ymin), (xmax, ymax), + (0, (1 - xmin) * 255, xmin * 255), 2) + +for img_path in path_to_im: + im = path_to_im[img_path] + cv2.imwrite(img_path, im) + +print 'Done.' -- GitLab