From d8a70404089aac901f0080778f6c807677cce938 Mon Sep 17 00:00:00 2001 From: ZhangHandi Date: Tue, 28 Sep 2021 15:14:11 +0800 Subject: [PATCH 01/10] add pedestrian_detection_and_tracking case code+readme --- .../README.md | 197 ++++++++++++ .../code/centernet_fpn_attention.py | 303 ++++++++++++++++++ .../code/centernet_head_iou_head.py | 232 ++++++++++++++ .../dataset.md | 54 ++++ .../images/dataset/caltech.png | Bin 0 -> 1006852 bytes .../images/dataset/citypersons.png | Bin 0 -> 231369 bytes .../images/dataset/cuhk_sysu.png | Bin 0 -> 2244951 bytes .../images/dataset/ethz.png | Bin 0 -> 1063027 bytes .../images/dataset/mot16.png | Bin 0 -> 414494 bytes .../images/dataset/prw.png | Bin 0 -> 217129 bytes .../images/demo.png | Bin 0 -> 1084204 bytes .../images/optimization/cutmix.png | Bin 0 -> 203566 bytes .../images/optimization/dcn.png | Bin 0 -> 163643 bytes .../images/optimization/dla.png | Bin 0 -> 163413 bytes .../improvements.md | 258 +++++++++++++++ 15 files changed, 1044 insertions(+) create mode 100644 examples/Pedestrian_Detection_and_Tracking/README.md create mode 100644 examples/Pedestrian_Detection_and_Tracking/code/centernet_fpn_attention.py create mode 100644 examples/Pedestrian_Detection_and_Tracking/code/centernet_head_iou_head.py create mode 100644 examples/Pedestrian_Detection_and_Tracking/dataset.md create mode 100644 examples/Pedestrian_Detection_and_Tracking/images/dataset/caltech.png create mode 100644 examples/Pedestrian_Detection_and_Tracking/images/dataset/citypersons.png create mode 100644 examples/Pedestrian_Detection_and_Tracking/images/dataset/cuhk_sysu.png create mode 100644 examples/Pedestrian_Detection_and_Tracking/images/dataset/ethz.png create mode 100644 examples/Pedestrian_Detection_and_Tracking/images/dataset/mot16.png create mode 100644 examples/Pedestrian_Detection_and_Tracking/images/dataset/prw.png create mode 100644 examples/Pedestrian_Detection_and_Tracking/images/demo.png create mode 100644 examples/Pedestrian_Detection_and_Tracking/images/optimization/cutmix.png create mode 100644 examples/Pedestrian_Detection_and_Tracking/images/optimization/dcn.png create mode 100644 examples/Pedestrian_Detection_and_Tracking/images/optimization/dla.png create mode 100644 examples/Pedestrian_Detection_and_Tracking/improvements.md diff --git a/examples/Pedestrian_Detection_and_Tracking/README.md b/examples/Pedestrian_Detection_and_Tracking/README.md new file mode 100644 index 000000000..614aab2f6 --- /dev/null +++ b/examples/Pedestrian_Detection_and_Tracking/README.md @@ -0,0 +1,197 @@ +# 人流量统计/人体检测 + +## 1. 项目说明 + +本案例面向人流量统计/人体检测等场景,提供基于PaddleDetection的解决方案,希望通过梳理优化模型精度和性能的思路帮助用户更高效的解决实际问题。 + +应用场景:静态场景下的人员计数和动态场景下的人流量统计 + +![demo](./images/demo.png) + +业务难点: + +* 遮挡重识别问题。场景中行人可能比较密集,人与人之间存在遮挡问题。这可能会导致误检、漏检问题。同时,对遮挡后重新出现的行人进行准确的重识别也是一个比较复杂的问题。容易出现ID切换问题。 + +* 行人检测的实时性。在实际应用中,往往对行人检测的处理速度有一定要求。 + + + +## 2. 数据准备 + +### 训练数据集 + +请参照 [数据准备文档](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.2/docs/tutorials/PrepareMOTDataSet_cn.md) 去下载并准备好所有的数据集,包括 Caltech Pedestrian, CityPersons, CHUK-SYSU, PRW, ETHZ, MOT17和MOT16。训练时,我们采用前六个数据集,共 53694 张已标注好的数据集用于训练。MOT16作为评测数据集。所有的行人都有检测框标签,部分有ID标签。如果您想使用这些数据集,请遵循他们的License。对数据集的详细介绍参见:[数据集介绍](dataset.md) + +### 数据格式 + +上述数据集都遵循以下结构: + +``` +Caltech + |——————images + | └——————00001.jpg + | |—————— ... + | └——————0000N.jpg + └——————labels_with_ids + └——————00001.txt + |—————— ... + └——————0000N.txt +MOT17 + |——————images + | └——————train + | └——————test + └——————labels_with_ids + └——————train +``` + +所有数据集的标注是以统一数据格式提供的。各个数据集中每张图片都有相应的标注文本。给定一个图像路径,可以通过将字符串`images`替换为 `labels_with_ids`并将 `.jpg`替换为`.txt`来生成标注文本路径。在标注文本中,每行都描述一个边界框,格式如下: + +``` +[class] [identity] [x_center] [y_center] [width] [height] +``` + +注意: + +* `class`为`0`,目前仅支持单类别多目标跟踪。 +* `identity`是从`1`到`num_identifies`的整数(`num_identifies`是数据集中不同物体实例的总数),如果此框没有`identity`标注,则为`-1`。 +* `[x_center] [y_center] [width] [height]`是中心点坐标和宽高,它们的值是基于图片的宽度/高度进行标准化的,因此值为从0到1的浮点数。 + +### 数据集目录 + +首先按照以下命令下载`image_lists.zip`并解压放在`dataset/mot`目录下: + +```bash +wget https://dataset.bj.bcebos.com/mot/image_lists.zip +``` + +然后依次下载各个数据集并解压,最终目录为: + +``` +dataset/mot + |——————image_lists + |——————caltech.10k.val + |——————caltech.all + |——————caltech.train + |——————caltech.val + |——————citypersons.train + |——————citypersons.val + |——————cuhksysu.train + |——————cuhksysu.val + |——————eth.train + |——————mot15.train + |——————mot16.train + |——————mot17.train + |——————mot20.train + |——————prw.train + |——————prw.val + |——————Caltech + |——————Cityscapes + |——————CUHKSYSU + |——————ETHZ + |——————MOT15 + |——————MOT16 + |——————MOT17 + |——————PRW +``` + + + +### 调优数据集 + +在进行调优时,我们采用 Caltech Pedestrian, CityPersons, CHUK-SYSU, PRW, ETHZ和MOT17中一半的数据集,使用MOT17另一半数据集作为评测数据集。调优时和训练时使用的数据集不同,主要是因为MOT官网的测试集榜单提交流程比较复杂,这种数据集的使用方式也是学术界慢慢摸索出的做消融实验的方法。调优时使用的训练数据共 51035 张。 + + + +## 3. 模型选择 + +PaddleDetection对于多目标追踪算法主要提供了三种模型,DeepSORT、JDE和FairMOT。 + +- [DeepSORT](https://arxiv.org/abs/1812.00442) (Deep Cosine Metric Learning SORT) 扩展了原有的 [SORT](https://arxiv.org/abs/1703.07402) (Simple Online and Realtime Tracking) 算法,增加了一个CNN模型用于在检测器限定的人体部分图像中提取特征,在深度外观描述的基础上整合外观信息,将检出的目标分配和更新到已有的对应轨迹上即进行一个ReID重识别任务。DeepSORT所需的检测框可以由任意一个检测器来生成,然后读入保存的检测结果和视频图片即可进行跟踪预测。ReID模型此处选择 [PaddleClas](https://github.com/PaddlePaddle/PaddleClas) 提供的`PCB+Pyramid ResNet101`模型。 +- [JDE](https://arxiv.org/abs/1909.12605) (Joint Detection and Embedding) 是在一个单一的共享神经网络中同时学习目标检测任务和embedding任务,并同时输出检测结果和对应的外观embedding匹配的算法。JDE原论文是基于Anchor Base的YOLOv3检测器新增加一个ReID分支学习embedding,训练过程被构建为一个多任务联合学习问题,兼顾精度和速度。 +- [FairMOT](https://arxiv.org/abs/2004.01888) 以Anchor Free的CenterNet检测器为基础,克服了Anchor-Based的检测框架中anchor和特征不对齐问题,深浅层特征融合使得检测和ReID任务各自获得所需要的特征,并且使用低维度ReID特征,提出了一种由两个同质分支组成的简单baseline来预测像素级目标得分和ReID特征,实现了两个任务之间的公平性,并获得了更高水平的实时多目标跟踪精度。 + +综合精度和速度,这里我们选择了FairMOT算法进行人流量统计/人体检测。 + + + +## 4. 模型训练 + +下载PaddleDetection + +```bash +git clone https://github.com/PaddlePaddle/PaddleDetection.git +``` + +运行如下代码开始训练模型: + +使用两个GPU开启训练 + +```bash +cd PaddleDetection/ +python -m paddle.distributed.launch --log_dir=./fairmot_dla34_30e_1088x608/ --gpus 0,1 tools/train.py -c configs/mot/fairmot/fairmot_dla34_30e_1088x608.yml +``` + + + +## 5. 模型评估 + +FairMOT使用单张GPU通过如下命令一键式启动评估: + +```bash +CUDA_VISIBLE_DEVICES=0 python tools/eval_mot.py -c configs/mot/fairmot/fairmot_dla34_30e_1088x608.yml -o weights=output/fairmot_dla34_30e_1088x608/model_final.pdparams +``` + +**注意:** 默认评估的是MOT-16 Train Set数据集,如需换评估数据集可参照以下代码修改`configs/datasets/mot.yml`,修改`data_root`: + +```bash +EvalMOTDataset: + !MOTImageFolder + dataset_dir: dataset/mot + data_root: MOT16/images/train + keep_ori_im: False # set True if save visualization images or video +``` + + + +## 6. 模型优化(进阶) + +具体内容参见[模型优化文档](./improvements.md)。 + + + +## 7. 模型预测 + +使用单个GPU通过如下命令预测一个视频,并保存为视频 + +```bash +# 预测一个视频 +CUDA_VISIBLE_DEVICES=0 python tools/infer_mot.py -c configs/mot/fairmot/fairmot_dla34_30e_1088x608.yml -o weights=https://paddledet.bj.bcebos.com/models/mot/fairmot_dla34_30e_1088x608.pdparams --video_file={your video name}.mp4 --frame_rate=20 --save_videos +``` + +使用单个GPU通过如下命令预测一个图片文件夹,并保存为视频 + +```bash +# 预测一个图片文件夹 +CUDA_VISIBLE_DEVICES=0 python tools/infer_mot.py -c configs/mot/fairmot/fairmot_dla34_30e_1088x608.yml -o weights=https://paddledet.bj.bcebos.com/models/mot/fairmot_dla34_30e_1088x608.pdparams --image_dir={your infer images folder} --save_videos +``` + +**注意:** 请先确保已经安装了[ffmpeg](https://ffmpeg.org/ffmpeg.html), Linux(Ubuntu)平台可以直接用以下命令安装:`apt-get update && apt-get install -y ffmpeg`。`--frame_rate`表示视频的帧率,表示每秒抽取多少帧,可以自行设置,默认为-1表示会使用OpenCV读取的视频帧率。 + + + +## 8. 模型导出 + +```bash +CUDA_VISIBLE_DEVICES=0 python tools/export_model.py -c configs/mot/fairmot/fairmot_dla34_30e_1088x608.yml -o weights=https://paddledet.bj.bcebos.com/models/mot/fairmot_dla34_30e_1088x608.pdparams +``` + + + +## 9. 模型上线选择 + + + +## 引用 + + + diff --git a/examples/Pedestrian_Detection_and_Tracking/code/centernet_fpn_attention.py b/examples/Pedestrian_Detection_and_Tracking/code/centernet_fpn_attention.py new file mode 100644 index 000000000..c6eca57e4 --- /dev/null +++ b/examples/Pedestrian_Detection_and_Tracking/code/centernet_fpn_attention.py @@ -0,0 +1,303 @@ +# Copyright (c) 2021 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 numpy as np +import math +import paddle +import paddle.nn as nn +from paddle.nn.initializer import KaimingUniform +from ppdet.core.workspace import register, serializable +from ppdet.modeling.layers import ConvNormLayer +from ..shape_spec import ShapeSpec + + +import paddle.nn.functional as F +# attention + +# SGE attention +class BasicConv(nn.Layer): + def __init__(self, in_planes, out_planes, kernel_size, stride=1, padding=0, dilation=1, groups=1, relu=True, bn=True, bias_attr=False): + super(BasicConv, self).__init__() + self.out_channels = out_planes + self.conv = nn.Conv2D(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups, bias_attr=bias_attr) + self.bn = nn.BatchNorm2D(out_planes, epsilon=1e-5, momentum=0.01, weight_attr=False, bias_attr=False) if bn else None + self.relu = nn.ReLU() if relu else None + + def forward(self, x): + x = self.conv(x) + if self.bn is not None: + x = self.bn(x) + if self.relu is not None: + x = self.relu(x) + return x + + +class ChannelPool(nn.Layer): + def forward(self, x): + return paddle.concat((paddle.max(x,1).unsqueeze(1), paddle.mean(x,1).unsqueeze(1)), axis=1) + + +class SpatialGate(nn.Layer): + def __init__(self): + super(SpatialGate, self).__init__() + kernel_size = 7 + self.compress = ChannelPool() + self.spatial = BasicConv(2, 1, kernel_size, stride=1, padding=(kernel_size-1) // 2, relu=False) + print(f'************************************ use SpatialGate ************************************') + + def forward(self, x): + x_compress = self.compress(x) + x_out = self.spatial(x_compress) + scale = F.sigmoid(x_out) # broadcasting + return x * scale + + +# used by SANN_Attention +def autopad(k, p=None): # kernel, padding + # Pad to 'same' + if p is None: + p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-pad + return p + + +class Conv(nn.Layer): + # Standard convolution + def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True): # ch_in, ch_out, kernel, stride, padding, groups + super(Conv, self).__init__() + self.conv = nn.Conv2D(c1, c2, k, s, autopad(k, p), groups=g, bias_attr=False) + self.bn = nn.BatchNorm2D(c2) + self.act = nn.LeakyReLU(0.1) if act else nn.Identity() + + def forward(self, x): + return self.act(self.bn(self.conv(x))) + + def fuseforward(self, x): + return self.act(self.conv(x)) + + +class SANN_Attention(nn.Layer): + def __init__(self, k_size = 3, ch = 64, s_state = False, c_state = False): + super(SANN_Attention, self).__init__() + print(f'************************************use SANN_Attention s_state => {s_state} -- c_state => {c_state}') + self.avg_pool = nn.AdaptiveAvgPool2D(1) + self.max_pool = nn.AdaptiveAvgPool2D(1) + self.sigmoid = nn.Sigmoid() + self.s_state = s_state + self.c_state = c_state + + if c_state: + self.c_attention = nn.Sequential(nn.Conv1D(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias_attr=False), + nn.LayerNorm([1, ch]), + nn.LeakyReLU(0.3), + nn.Linear(ch, ch, bias_attr=False)) + + if s_state: + self.conv_s = nn.Sequential(Conv(ch, ch // 4, k=1)) + self.s_attention = nn.Conv2D(2, 1, 7, padding=3, bias_attr=False) + + def forward(self, x): + # x: input features with shape [b, c, h, w] + b, c, h, w = x.shape + + # channel_attention + if self.c_state: + y_avg = self.avg_pool(x) + y_max = self.max_pool(x) + y_c = self.c_attention(y_avg.squeeze(-1).transpose((0,2,1))).transpose((0,2,1)).unsqueeze(-1)+\ + self.c_attention(y_max.squeeze(-1).transpose((0,2,1))).transpose((0,2,1)).unsqueeze(-1) + y_c = self.sigmoid(y_c) + + #spatial_attention + if self.s_state: + x_s = self.conv_s(x) + avg_out = paddle.mean(x_s, axis=1, keepdim=True) + max_out = paddle.max(x_s, axis=1, keepdim=True) + y_s = paddle.concat([avg_out, max_out], axis=1) + y_s = self.sigmoid(self.s_attention(y_s)) + + if self.c_state and self.s_state: + y = x * y_s * y_c + x + elif self.c_state: + y = x * y_c + x + elif self.s_state: + y = x * y_s + x + else: + y = x + return y + + +def fill_up_weights(up): + weight = up.weight + f = math.ceil(weight.shape[2] / 2) + c = (2 * f - 1 - f % 2) / (2. * f) + for i in range(weight.shape[2]): + for j in range(weight.shape[3]): + weight[0, 0, i, j] = \ + (1 - math.fabs(i / f - c)) * (1 - math.fabs(j / f - c)) + for c in range(1, weight.shape[0]): + weight[c, 0, :, :] = weight[0, 0, :, :] + + +class IDAUp(nn.Layer): + def __init__(self, ch_ins, ch_out, up_strides, dcn_v2=True): + super(IDAUp, self).__init__() + for i in range(1, len(ch_ins)): + ch_in = ch_ins[i] + up_s = int(up_strides[i]) + proj = nn.Sequential( + ConvNormLayer( + ch_in, + ch_out, + filter_size=3, + stride=1, + use_dcn=dcn_v2, + bias_on=dcn_v2, + norm_decay=None, + dcn_lr_scale=1., + dcn_regularizer=None), + nn.ReLU()) + node = nn.Sequential( + ConvNormLayer( + ch_out, + ch_out, + filter_size=3, + stride=1, + use_dcn=dcn_v2, + bias_on=dcn_v2, + norm_decay=None, + dcn_lr_scale=1., + dcn_regularizer=None), + nn.ReLU()) + + param_attr = paddle.ParamAttr(initializer=KaimingUniform()) + up = nn.Conv2DTranspose( + ch_out, + ch_out, + kernel_size=up_s * 2, + weight_attr=param_attr, + stride=up_s, + padding=up_s // 2, + groups=ch_out, + bias_attr=False) + # TODO: uncomment fill_up_weights + #fill_up_weights(up) + setattr(self, 'proj_' + str(i), proj) + setattr(self, 'up_' + str(i), up) + setattr(self, 'node_' + str(i), node) + + def forward(self, inputs, start_level, end_level): + for i in range(start_level + 1, end_level): + upsample = getattr(self, 'up_' + str(i - start_level)) + project = getattr(self, 'proj_' + str(i - start_level)) + + inputs[i] = project(inputs[i]) + inputs[i] = upsample(inputs[i]) + node = getattr(self, 'node_' + str(i - start_level)) + inputs[i] = node(paddle.add(inputs[i], inputs[i - 1])) + + +class DLAUp(nn.Layer): + def __init__(self, start_level, channels, scales, ch_in=None, dcn_v2=True): + super(DLAUp, self).__init__() + self.start_level = start_level + if ch_in is None: + ch_in = channels + self.channels = channels + channels = list(channels) + scales = np.array(scales, dtype=int) + for i in range(len(channels) - 1): + j = -i - 2 + setattr( + self, + 'ida_{}'.format(i), + IDAUp( + ch_in[j:], + channels[j], + scales[j:] // scales[j], + dcn_v2=dcn_v2)) + scales[j + 1:] = scales[j] + ch_in[j + 1:] = [channels[j] for _ in channels[j + 1:]] + + def forward(self, inputs): + out = [inputs[-1]] # start with 32 + for i in range(len(inputs) - self.start_level - 1): + ida = getattr(self, 'ida_{}'.format(i)) + ida(inputs, len(inputs) - i - 2, len(inputs)) + out.insert(0, inputs[-1]) + return out + + +@register +@serializable +class CenterNetDLAFPN(nn.Layer): + """ + Args: + in_channels (list): number of input feature channels from backbone. + [16, 32, 64, 128, 256, 512] by default, means the channels of DLA-34 + down_ratio (int): the down ratio from images to heatmap, 4 by default + last_level (int): the last level of input feature fed into the upsamplng block + out_channel (int): the channel of the output feature, 0 by default means + the channel of the input feature whose down ratio is `down_ratio` + dcn_v2 (bool): whether use the DCNv2, true by default + + """ + + def __init__(self, + in_channels, + down_ratio=4, + last_level=5, + out_channel=0, + dcn_v2=True): + super(CenterNetDLAFPN, self).__init__() + self.first_level = int(np.log2(down_ratio)) + self.down_ratio = down_ratio + self.last_level = last_level + scales = [2**i for i in range(len(in_channels[self.first_level:]))] + self.dla_up = DLAUp( + self.first_level, + in_channels[self.first_level:], + scales, + dcn_v2=dcn_v2) + self.out_channel = out_channel + if out_channel == 0: + self.out_channel = in_channels[self.first_level] + self.ida_up = IDAUp( + in_channels[self.first_level:self.last_level], + self.out_channel, + [2**i for i in range(self.last_level - self.first_level)], + dcn_v2=dcn_v2) + + self.attention = SpatialGate() + #self.attention = SANN_Attention(c_state = False, s_state = True) # spatial_attention + + @classmethod + def from_config(cls, cfg, input_shape): + return {'in_channels': [i.channels for i in input_shape]} + + def forward(self, body_feats): + dla_up_feats = self.dla_up(body_feats) + + ida_up_feats = [] + for i in range(self.last_level - self.first_level): + ida_up_feats.append(dla_up_feats[i].clone()) + + self.ida_up(ida_up_feats, 0, len(ida_up_feats)) + + feat = ida_up_feats[-1] + feat = self.attention(feat) + return feat + + @property + def out_shape(self): + return [ShapeSpec(channels=self.out_channel, stride=self.down_ratio)] diff --git a/examples/Pedestrian_Detection_and_Tracking/code/centernet_head_iou_head.py b/examples/Pedestrian_Detection_and_Tracking/code/centernet_head_iou_head.py new file mode 100644 index 000000000..f67c84439 --- /dev/null +++ b/examples/Pedestrian_Detection_and_Tracking/code/centernet_head_iou_head.py @@ -0,0 +1,232 @@ +# Copyright (c) 2021 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 math +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle.nn.initializer import KaimingUniform +from ppdet.core.workspace import register +from ppdet.modeling.losses import CTFocalLoss, GIoULoss, IouLoss + + +class ConvLayer(nn.Layer): + def __init__(self, + ch_in, + ch_out, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + bias=False): + super(ConvLayer, self).__init__() + bias_attr = False + fan_in = ch_in * kernel_size**2 + bound = 1 / math.sqrt(fan_in) + param_attr = paddle.ParamAttr(initializer=KaimingUniform()) + if bias: + bias_attr = paddle.ParamAttr( + initializer=nn.initializer.Uniform(-bound, bound)) + self.conv = nn.Conv2D( + in_channels=ch_in, + out_channels=ch_out, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + groups=groups, + weight_attr=param_attr, + bias_attr=bias_attr) + + def forward(self, inputs): + out = self.conv(inputs) + + return out + + +@register +class CenterNetHead(nn.Layer): + """ + Args: + in_channels (int): the channel number of input to CenterNetHead. + num_classes (int): the number of classes, 80 by default. + head_planes (int): the channel number in all head, 256 by default. + heatmap_weight (float): the weight of heatmap loss, 1 by default. + regress_ltrb (bool): whether to regress left/top/right/bottom or + width/height for a box, true by default + size_weight (float): the weight of box size loss, 0.1 by default. + offset_weight (float): the weight of center offset loss, 1 by default. + + """ + + __shared__ = ['num_classes'] + + def __init__(self, + in_channels, + num_classes=80, + head_planes=256, + heatmap_weight=1, + regress_ltrb=True, + size_weight=0.1, + offset_weight=1): + super(CenterNetHead, self).__init__() + self.weights = { + 'heatmap': heatmap_weight, + 'size': size_weight, + 'iou': size_weight, + 'offset': offset_weight + } + self.heatmap = nn.Sequential( + ConvLayer( + in_channels, head_planes, kernel_size=3, padding=1, bias=True), + nn.ReLU(), + ConvLayer( + head_planes, + num_classes, + kernel_size=1, + stride=1, + padding=0, + bias=True)) + self.heatmap[2].conv.bias[:] = -2.19 + self.size = nn.Sequential( + ConvLayer( + in_channels, head_planes, kernel_size=3, padding=1, bias=True), + nn.ReLU(), + ConvLayer( + head_planes, + 4 if regress_ltrb else 2, + kernel_size=1, + stride=1, + padding=0, + bias=True)) + self.iou = nn.Sequential( + ConvLayer( + in_channels, head_planes, kernel_size=3, padding=1, bias=True), + nn.ReLU(), + ConvLayer( + head_planes, + 4 if regress_ltrb else 2, + kernel_size=1, + stride=1, + padding=0, + bias=True)) + self.offset = nn.Sequential( + ConvLayer( + in_channels, head_planes, kernel_size=3, padding=1, bias=True), + nn.ReLU(), + ConvLayer( + head_planes, 2, kernel_size=1, stride=1, padding=0, bias=True)) + self.focal_loss = CTFocalLoss() + self.iou_loss = GIoULoss(reduction='sum') + + @classmethod + def from_config(cls, cfg, input_shape): + if isinstance(input_shape, (list, tuple)): + input_shape = input_shape[0] + return {'in_channels': input_shape.channels} + + def forward(self, feat, inputs): + heatmap = self.heatmap(feat) + size = self.size(feat) + iou = self.iou(feat) + offset = self.offset(feat) + if self.training: + loss = self.get_loss(heatmap, size, iou, offset, self.weights, inputs) + return loss + else: + heatmap = F.sigmoid(heatmap) + return {'heatmap': heatmap, 'size': size, 'iou':iou, 'offset': offset} + + def get_loss(self, heatmap, size, iou, offset, weights, inputs): + heatmap_target = inputs['heatmap'] + size_target = inputs['size'] + offset_target = inputs['offset'] + index = inputs['index'] + mask = inputs['index_mask'] + heatmap = paddle.clip(F.sigmoid(heatmap), 1e-4, 1 - 1e-4) + heatmap_loss = self.focal_loss(heatmap, heatmap_target) + + size = paddle.transpose(size, perm=[0, 2, 3, 1]) + size_n, size_h, size_w, size_c = size.shape + size = paddle.reshape(size, shape=[size_n, -1, size_c]) + index = paddle.unsqueeze(index, 2) + batch_inds = list() + for i in range(size_n): + batch_ind = paddle.full( + shape=[1, index.shape[1], 1], fill_value=i, dtype='int64') + batch_inds.append(batch_ind) + batch_inds = paddle.concat(batch_inds, axis=0) + index = paddle.concat(x=[batch_inds, index], axis=2) + pos_size = paddle.gather_nd(size, index=index) + mask = paddle.unsqueeze(mask, axis=2) + size_mask = paddle.expand_as(mask, pos_size) + size_mask = paddle.cast(size_mask, dtype=pos_size.dtype) + pos_num = size_mask.sum() + size_mask.stop_gradient = True + size_target.stop_gradient = True + size_loss = F.l1_loss( + pos_size * size_mask, size_target * size_mask, reduction='sum') + size_loss = size_loss / (pos_num + 1e-4) + + ### giou loss + iou = paddle.transpose(iou, perm=[0, 2, 3, 1]) + iou_n, iou_h, iou_w, iou_c = iou.shape + iou = paddle.reshape(iou, shape=[iou_n, -1, iou_c]) + pos_iou = paddle.gather_nd(iou, index=index) + iou_mask = paddle.expand_as(mask, pos_iou) + iou_mask = paddle.cast(iou_mask, dtype=pos_iou.dtype) + pos_num = iou_mask.sum() + iou_mask.stop_gradient = True + gt_bbox_xys = inputs['bbox_xys'] + gt_bbox_xys.stop_gradient = True + centers_x = (gt_bbox_xys[:,:,0:1] + gt_bbox_xys[:,:,2:3]) / 2.0 + centers_y = (gt_bbox_xys[:,:,1:2] + gt_bbox_xys[:,:,3:4]) / 2.0 + x1 = centers_x - pos_size[:,:,0:1] + y1 = centers_y - pos_size[:,:,1:2] + x2 = centers_x + pos_size[:,:,2:3] + y2 = centers_y + pos_size[:,:,3:4] + pred_boxes = paddle.concat([x1, y1, x2, y2], axis=-1) + + iou_loss = self.iou_loss( + pred_boxes * iou_mask, + gt_bbox_xys * iou_mask, + iou_weight=iou_mask, + loc_reweight=None) + iou_loss = iou_loss / (pos_num + 1e-4) + + offset = paddle.transpose(offset, perm=[0, 2, 3, 1]) + offset_n, offset_h, offset_w, offset_c = offset.shape + offset = paddle.reshape(offset, shape=[offset_n, -1, offset_c]) + pos_offset = paddle.gather_nd(offset, index=index) + offset_mask = paddle.expand_as(mask, pos_offset) + offset_mask = paddle.cast(offset_mask, dtype=pos_offset.dtype) + pos_num = offset_mask.sum() + offset_mask.stop_gradient = True + offset_target.stop_gradient = True + offset_loss = F.l1_loss( + pos_offset * offset_mask, + offset_target * offset_mask, + reduction='sum') + offset_loss = offset_loss / (pos_num + 1e-4) + + det_loss = weights['heatmap'] * heatmap_loss + weights['size'] * size_loss + weights['offset'] * offset_loss + weights['iou'] * iou_loss + + return { + 'det_loss': det_loss, + 'heatmap_loss': heatmap_loss, + 'size_loss': size_loss, + 'iou_loss': iou_loss, + 'offset_loss': offset_loss + } diff --git a/examples/Pedestrian_Detection_and_Tracking/dataset.md b/examples/Pedestrian_Detection_and_Tracking/dataset.md new file mode 100644 index 000000000..c9399c4dd --- /dev/null +++ b/examples/Pedestrian_Detection_and_Tracking/dataset.md @@ -0,0 +1,54 @@ +# 数据集介绍 + +**Caltech Pedestrian** + +Caltech Pedestrain 数据集由加州理工提供、由固定在在城市环境中常规行驶的车辆上的摄像头采集得到。数据集包含约10小时的 640x480 30Hz 视频,其中标注了约250,000帧(约137分钟的片段)中的350,000个边界框和2300个行人。更多信息可参考:[Caltech Pedestrain Detection Benchmark](http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/) + +![caltech dataset](./images/dataset/caltech.png) + + + +**CityPersons** + +CityPersons 数据集是基于CityScapes数据集在行人检测领域专门建立的数据集,它选取了CityScapes 中5000张精标图片,并对其中的行人进行边界框标注。其中训练集包含2975张图片,验证集包含500张,测试集包含1575张。图片中行人的平均数量为7人,标注提供全身标注和可视区域标注。更多信息可参考:[CityPersons](https://github.com/cvgroup-njust/CityPersons) + +![CityPersons](./images/dataset/citypersons.png) + +**CUHK-SYSU** + +CUHK-SYSU 是一个大规模的人员搜索基准数据集,包含18184张图像和8432个行人,以及99,809个标注好的边界框。根据图像来源,数据集可分为在街道场景下采集和影视剧中采集两部分。在街道场景下,图像通过手持摄像机采集,包含数百个场景,并尝试尽可能的包含不同的视角、光线、分辨率、遮挡和背景等。另一部分数据集采集自影视剧,因为它们可以提供更加多样化的场景和更具挑战性的视角。 + +该数据集为行人检测和人员重识别提供注释。每个查询人会出现在至少两个图像中,并且每个图像可包含多个查询人和更多的其他人员。数据集被划分为训练集和测试集。训练集包含11206张图片和5532个查询人,测试集包含6978张图片和2900个查询人。更多信息可参考:[End-to-End Deep Learning for Person Search](http://www.ee.cuhk.edu.hk/~xgwang/PS/dataset.html) + +![CUHK-SYSU](./images/dataset/cuhk_sysu.png) + +**PRW** + +PRW (Person Re-identification in the Wild) 是一个人员重识别数据集。该数据集采集于清华大学,通过六个摄像机,采集共10小时的视频。数据集被分为训练、验证和测试集。训练集包含5134帧和482个ID,验证集共570帧和482个ID,测试集则包含6112帧和450个ID。每帧中出现的所有行人都会被标注边界框,同时分配一个ID。更多信息可参考:[PRW](https://github.com/liangzheng06/PRW-baseline) + +![prw](./images/dataset/prw.png) + +**ETHZ** + +ETHZ 数据集由一对车载的AVT Marlins F033C摄像头拍摄采集,分辨率为 640x480,帧率为13-14 fps。数据集给出原始图像、标定信息和行人标注信息。更多信息可参考:[ETHZ](https://data.vision.ee.ethz.ch/cvl/aess/dataset/) + +![ETHZ](./images/dataset/ethz.png) + + + +**MOT16** + +MOT16数据集是在2016年提出的用于衡量多目标跟踪检测和跟踪方法标准的数据集,专门用于行人跟踪。其主要标注目标为移动或静止的行人与行进中的车辆。MOT16基于MOT15添加了更细化的标注和更多的边界框,它拥有更加丰富的画面、不同拍摄视角及不同的天气情况。MOT16数据集共有14个视频,其中7个为带有标注的训练集,7个为测试集。它因为提供了标注好的检测结果,因此可以免去目标检测部分,更加关注在目标跟踪部分。更多信息可参考:[MOT16](https://motchallenge.net/data/MOT16/) + +![mot16](./images/dataset/mot16.png) + + + +**MOT17** + +MOT17与MOT16数据集相同,但标注更为准确。更多信息可参考:[MOT17](https://motchallenge.net/data/MOT17/) + +## + + + diff --git a/examples/Pedestrian_Detection_and_Tracking/images/dataset/caltech.png b/examples/Pedestrian_Detection_and_Tracking/images/dataset/caltech.png new file mode 100644 index 0000000000000000000000000000000000000000..2680ff3ee4b453214867e04344fdb646326b1d79 GIT binary patch literal 1006852 zcmeFYWmH_vwkQfAxP?G)*AU#D#sVQ|aCdiayden|+#wJM4hilF?k>UI-D#|8=tgvq=baYXBh7=+ZetfX~@_i z7Xm5hFd0)w2|s?JGS+fCrT_BE_|*p|Hd>#P;rxXM3+cD|B;GZ7U}nbe$L-*@t02$w zTs~X4=9%)D1d?6w#(PH8QevdAEqZ$kISd8~hGglZ=ZqoGIHb^njdGN`zr@EQtD~KR z(t$!q`OT)@I&Lsec*hq!Q`&9hkeE>6EUxWWGJ%vxfgEb|9M3{ZCk<8KB)z_1kMu6$ zmWtGU?N<5HRd>UQNmAS_IeRc1!i(gf#i{!hJEUKt)RySVgD$?`Hqy8+Fp(5Vg(VWj zPll7m;_ZoQSQsHuGnR#z9aku6KT5{py89kH77!4bJ2FPqJ=}^W$DzfTOypMbm|Jwe zuAxUub8U`-uKhYzS!)O1(U%P*Q~ykp?u^)Wpr6$N_Y$4JR3C_>{zaWSGrwLT){j@P zoMtj&A$0;bHhh6}%gtTdDdv6dHwLVIDI6fSsJ>ROV)z2m*8MYmy`*8A0xy~TVUnc; z2J1R4sHf3kh-p|AI{1+&?F%ASz4ODRB{@^~4u2%;3&U5@8kTf(Aq#KQa)~Nx$@J;1 z2Jn{N?M8ipRM4stMKZ{wJnFf}@r!@3HZ^%oF-o%hn#kQk+t)OaTSP;j=7cC->;+&H zwT1mfod%lU^V;i-E+fdtNp9=21ug^|YN0nKWccmRdyxb&P;qD@7$}sH{G?{)Ru^zVthU|A zB=4j-Um)40+PJ-4>Wm>ZNtVKdpwJ^H;8tLhWxNWpC`IrVYMXqM9`AIz?EDgVL9`|F z0vBt;^}h4XWkQqI#d8Na#Km~nC-iNO5Lq6?`OT*#S90Q+-co+BbUekuNVjj3(#;YkT5n)#*|YUDdRp4q*1+L#*>$fE14s+UDDj9c zS5Yx$q@^RIY_Y*)rRY>qBX_z^5T=Un6iz5>^>ZI?8sG-*qck@L$_H9J#!oohcslwR zcfW{~pG|in-v)g%PUWW-w>z(o>EF>?QGzf& zCcGe*QNSVK>m_%WTOnY68Tpxx=N)}gs1@C>NYX@x=>(B?sI@rypPXbI659r)cb
6*7*K-|SHQpS4Ar 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