|
| 1 | +# 人流量统计/人体检测 |
| 2 | + |
| 3 | +## 1. 项目说明 |
| 4 | + |
| 5 | +本案例面向人流量统计/人体检测等场景,提供基于PaddleDetection的解决方案,希望通过梳理优化模型精度和性能的思路帮助用户更高效的解决实际问题。 |
| 6 | + |
| 7 | +本项目AI Studio链接:https://aistudio.baidu.com/aistudio/projectdetail/2421822 |
| 8 | + |
| 9 | +应用场景:静态场景下的人员计数和动态场景下的人流量统计 |
| 10 | + |
| 11 | + |
| 12 | + |
| 13 | +业务难点: |
| 14 | + |
| 15 | +* 遮挡重识别问题。场景中行人可能比较密集,人与人之间存在遮挡问题。这可能会导致误检、漏检问题。同时,对遮挡后重新出现的行人进行准确的重识别也是一个比较复杂的问题。容易出现ID切换问题。 |
| 16 | + |
| 17 | +* 行人检测的实时性。在实际应用中,往往对行人检测的处理速度有一定要求。 |
| 18 | + |
| 19 | + |
| 20 | + |
| 21 | +## 2. 数据准备 |
| 22 | + |
| 23 | +### 训练数据集 |
| 24 | + |
| 25 | +请参照 [数据准备文档](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) |
| 26 | + |
| 27 | +### 数据格式 |
| 28 | + |
| 29 | +上述数据集都遵循以下结构: |
| 30 | + |
| 31 | +``` |
| 32 | +Caltech |
| 33 | + |——————images |
| 34 | + | └——————00001.jpg |
| 35 | + | |—————— ... |
| 36 | + | └——————0000N.jpg |
| 37 | + └——————labels_with_ids |
| 38 | + └——————00001.txt |
| 39 | + |—————— ... |
| 40 | + └——————0000N.txt |
| 41 | +MOT17 |
| 42 | + |——————images |
| 43 | + | └——————train |
| 44 | + | └——————test |
| 45 | + └——————labels_with_ids |
| 46 | + └——————train |
| 47 | +``` |
| 48 | + |
| 49 | +所有数据集的标注是以统一数据格式提供的。各个数据集中每张图片都有相应的标注文本。给定一个图像路径,可以通过将字符串`images`替换为 `labels_with_ids`并将 `.jpg`替换为`.txt`来生成标注文本路径。在标注文本中,每行都描述一个边界框,格式如下: |
| 50 | + |
| 51 | +``` |
| 52 | +[class] [identity] [x_center] [y_center] [width] [height] |
| 53 | +``` |
| 54 | + |
| 55 | +注意: |
| 56 | + |
| 57 | +* `class`为`0`,目前仅支持单类别多目标跟踪。 |
| 58 | +* `identity`是从`1`到`num_identifies`的整数(`num_identifies`是数据集中不同物体实例的总数),如果此框没有`identity`标注,则为`-1`。 |
| 59 | +* `[x_center] [y_center] [width] [height]`是中心点坐标和宽高,它们的值是基于图片的宽度/高度进行标准化的,因此值为从0到1的浮点数。 |
| 60 | + |
| 61 | +### 数据集目录 |
| 62 | + |
| 63 | +首先按照以下命令下载`image_lists.zip`并解压放在`dataset/mot`目录下: |
| 64 | + |
| 65 | +```bash |
| 66 | +wget https://dataset.bj.bcebos.com/mot/image_lists.zip |
| 67 | +``` |
| 68 | + |
| 69 | +然后依次下载各个数据集并解压,最终目录为: |
| 70 | + |
| 71 | +``` |
| 72 | +dataset/mot |
| 73 | + |——————image_lists |
| 74 | + |——————caltech.10k.val |
| 75 | + |——————caltech.all |
| 76 | + |——————caltech.train |
| 77 | + |——————caltech.val |
| 78 | + |——————citypersons.train |
| 79 | + |——————citypersons.val |
| 80 | + |——————cuhksysu.train |
| 81 | + |——————cuhksysu.val |
| 82 | + |——————eth.train |
| 83 | + |——————mot15.train |
| 84 | + |——————mot16.train |
| 85 | + |——————mot17.train |
| 86 | + |——————mot20.train |
| 87 | + |——————prw.train |
| 88 | + |——————prw.val |
| 89 | + |——————Caltech |
| 90 | + |——————Cityscapes |
| 91 | + |——————CUHKSYSU |
| 92 | + |——————ETHZ |
| 93 | + |——————MOT15 |
| 94 | + |——————MOT16 |
| 95 | + |——————MOT17 |
| 96 | + |——————PRW |
| 97 | +``` |
| 98 | + |
| 99 | + |
| 100 | + |
| 101 | +### 调优数据集 |
| 102 | + |
| 103 | +在进行调优时,我们采用 Caltech Pedestrian, CityPersons, CHUK-SYSU, PRW, ETHZ和MOT17中一半的数据集,使用MOT17另一半数据集作为评测数据集。调优时和训练时使用的数据集不同,主要是因为MOT官网的测试集榜单提交流程比较复杂,这种数据集的使用方式也是学术界慢慢摸索出的做消融实验的方法。调优时使用的训练数据共 51035 张。 |
| 104 | + |
| 105 | + |
| 106 | + |
| 107 | +## 3. 模型选择 |
| 108 | + |
| 109 | +PaddleDetection对于多目标追踪算法主要提供了三种模型,DeepSORT、JDE和FairMOT。 |
| 110 | + |
| 111 | +- [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`模型。 |
| 112 | +- [JDE](https://arxiv.org/abs/1909.12605) (Joint Detection and Embedding) 是在一个单一的共享神经网络中同时学习目标检测任务和embedding任务,并同时输出检测结果和对应的外观embedding匹配的算法。JDE原论文是基于Anchor Base的YOLOv3检测器新增加一个ReID分支学习embedding,训练过程被构建为一个多任务联合学习问题,兼顾精度和速度。 |
| 113 | +- [FairMOT](https://arxiv.org/abs/2004.01888) 以Anchor Free的CenterNet检测器为基础,克服了Anchor-Based的检测框架中anchor和特征不对齐问题,深浅层特征融合使得检测和ReID任务各自获得所需要的特征,并且使用低维度ReID特征,提出了一种由两个同质分支组成的简单baseline来预测像素级目标得分和ReID特征,实现了两个任务之间的公平性,并获得了更高水平的实时多目标跟踪精度。 |
| 114 | + |
| 115 | +综合精度和速度,这里我们选择了FairMOT算法进行人流量统计/人体检测。 |
| 116 | + |
| 117 | + |
| 118 | + |
| 119 | +## 4. 模型训练 |
| 120 | + |
| 121 | +下载PaddleDetection |
| 122 | + |
| 123 | +```bash |
| 124 | +git clone https://github.com/PaddlePaddle/PaddleDetection.git |
| 125 | +``` |
| 126 | + |
| 127 | +**说明:** 本实验使用**PaddleDetection release/2.2**,如遇PaddleDetection更新训练效果出现变动,可尝试下载PaddleDetection 2.2版本进行实验。 |
| 128 | + |
| 129 | +在训练前先正确安装PaddleDetection所需依赖: |
| 130 | + |
| 131 | +```bash |
| 132 | +cd PaddleDetection/ |
| 133 | +pip install -r requirements.txt |
| 134 | +``` |
| 135 | + |
| 136 | +运行如下代码开始训练模型: |
| 137 | + |
| 138 | +使用两个GPU开启训练 |
| 139 | + |
| 140 | +```bash |
| 141 | +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 |
| 142 | +``` |
| 143 | + |
| 144 | + |
| 145 | + |
| 146 | +## 5. 模型评估 |
| 147 | + |
| 148 | +FairMOT使用单张GPU通过如下命令一键式启动评估: |
| 149 | + |
| 150 | +```bash |
| 151 | +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 |
| 152 | +``` |
| 153 | + |
| 154 | +**注意:** 默认评估的是MOT-16 Train Set数据集,如需换评估数据集可参照以下代码修改`configs/datasets/mot.yml`,修改`data_root`: |
| 155 | + |
| 156 | +```bash |
| 157 | +EvalMOTDataset: |
| 158 | + !MOTImageFolder |
| 159 | + dataset_dir: dataset/mot |
| 160 | + data_root: MOT16/images/train |
| 161 | + keep_ori_im: False # set True if save visualization images or video |
| 162 | +``` |
| 163 | + |
| 164 | + |
| 165 | + |
| 166 | +## 6. 模型优化(进阶) |
| 167 | + |
| 168 | +具体内容参见[模型优化文档](./improvements.md)。 |
| 169 | + |
| 170 | + |
| 171 | + |
| 172 | +## 7. 模型预测 |
| 173 | + |
| 174 | +使用单个GPU通过如下命令预测一个视频,并保存为视频 |
| 175 | + |
| 176 | +```bash |
| 177 | +# 预测一个视频 |
| 178 | +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 |
| 179 | +``` |
| 180 | + |
| 181 | +使用单个GPU通过如下命令预测一个图片文件夹,并保存为视频 |
| 182 | + |
| 183 | +```bash |
| 184 | +# 预测一个图片文件夹 |
| 185 | +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 |
| 186 | +``` |
| 187 | + |
| 188 | +**注意:** 请先确保已经安装了[ffmpeg](https://ffmpeg.org/ffmpeg.html), Linux(Ubuntu)平台可以直接用以下命令安装:`apt-get update && apt-get install -y ffmpeg`。`--frame_rate`表示视频的帧率,表示每秒抽取多少帧,可以自行设置,默认为-1表示会使用OpenCV读取的视频帧率。 |
| 189 | + |
| 190 | + |
| 191 | + |
| 192 | +## 8. 模型导出 |
| 193 | + |
| 194 | +```bash |
| 195 | +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 |
| 196 | +``` |
| 197 | + |
| 198 | + |
| 199 | + |
| 200 | +## 9. 模型上线选择 |
| 201 | + |
| 202 | + |
| 203 | + |
| 204 | +## 引用 |
| 205 | + |
| 206 | + |
| 207 | + |
0 commit comments