基于FairMOT训练的多人脸跟踪(Multi-face tracking)速度和精度都非常好

1.前言
最近研究了一下目标跟踪算法,如deepsort,CenterTrack,JDE,FairMOT等,FairMOT是目前单类多目标SOTA算法,并且是one-shot MOT框架,可以根据自己需求修改为多类多目标跟踪,于是突发奇想基于此修改一个人脸跟踪算法。此博客记录本人开发人脸跟踪的全过程,包括数据准备,模型修改,训练调参fine-tuning,模型转换onnx,部署等

2.准备工作

CenterNet:论文
FairMOT:论文
FairMOT代码:https://github.com/ifzhang/FairMOT
阅读相关论文和源码,对跟踪原理有一个总体理解,也可以结合博客和知乎文章来加深理解,但博客大多是copy文章或内容浮于表面,我们学习中也要学会从众多信息中取其精华去其糟粕,快速有效的学到我们需要的内容。个人认为最好是直接看源码。

3.运行FairMOT

本人环境:Ubuntu18 torch==1.6 2070GPU(安装好cuda,cudnn)。

FairMOT中DCN需要编译,此方法本人亲测成功:git clone https://github.com/lbin/DCNv2/tree/pytorch_1.6 cd DCNv2 && ./make.sh。如果实在无法编译可选择注释掉model.py下的import DCN相关代码
下载好model和CUHK-SYSU数据集,运行demo和训练代码确保项目正常运行,选择数据量最小的CUHK-SYSU数据集运行训练代码只是让我们知道数据的和label的格式,以及训练过程中数据和label的处理全过程。了解源码对输入数据和label的处理过程后我们准备人脸跟踪数据集。

4.人脸跟踪数据准备
我们知道了FairMOT是one-shot MOT框架,即一步完成目标检测和目标跟踪,目前学术界对跟踪主要是行人和车辆的研究,那就没有人脸跟踪的开源数据集,那么我们需要自己标注数据集吗?答案是不用的,解决困难的最好方法是绕过困难,开源有大量的人脸识别和检测数据集,将两者结合就能制作一个质量还可以的人脸跟踪数据集了。我们先选一个稍微简单的人脸检测数据FDDB,用于训练检测部分,然后用CASIA-Webface做Reid的训练,那么如何将两个数据集merge呢?就需要对上一步FairMOT对数据label的充分理解了。
label格式:
[class] [identity] [x_center] [y_center] [width] [height]
只跟踪单类人脸即[class]全为0
FDDB不进行reid训练所以设置 [identity]=-1,通过mask的方式使FDDB不进行reid的loss计算
CASIA-Webface将相同身份设置相同[identity] , 通过人脸检测算法如centerface计算出所有人脸的[x_center] [y_center] [width] [heig]

这样人脸跟踪数据集就做好了,格式和CUHK-SYSU相同

5.开始训练
由于DCN对部署非常不友好,我先用HRnet18小试一下牛刀,一开始训练可以什么都不用改,只需将CUHK-SYSU替换成人脸跟踪数据集,训练5个epoch后会保存第一个模型,我们先运行一下demo,确保数据制作没问题,防止数据错误还继续训练浪费时间,当我们看到能够跟踪人脸时(虽然精度还不高)可以放心继续训练了。如果什么都没有,就要检查数据了,我也是重复制作了两三次数据后才成功训练的。由于HRnet超强的提取特征能力训练到30 epoch就能达到收敛。过程中有任何问题下你看Issues,合理的利用issues很关键,然后在Google或百度
2020-09-18-15-08: epoch: 37 |loss -0.294533 | hm_loss 0.015708 | wh_loss 0.382619 | off_loss 0.053386 | id_loss 0.565185 | time 6.833333 |

HRnet也是一个非常优秀的论文,在分类,分割,检测,对齐,姿态等方面都十分给力。
HRnet
6.fine-tuning
hrnet18做backbone在2070能跑30FPS,但换到其他设备速度就严重不实时,这时我们需要使用其他轻量一点的模型做backbone,如mobilenet系列,EfficientNet系列,起初我使用mobilenetv2做backbone训练,但一直无法收敛,后来我在mobilenet中加上了fpn目的是效仿hrnet融合高低层特征,loss下降明显,但是仍然无法达到HRnet的跟踪效果,后来经过调整学习率,优化器Adam和SGD,学习率衰减策越按step衰减和余弦衰减,warm up,loss函数等一系列调参实验,模型收敛到一个最佳效果,但是对小人脸效果任然不稳定,目标丢失容忍时间短,目标丢失后容易切换ID,
后面我受到retinanet的启发,由于我以前训练过retinaface,在FaceMOT(FairMOT的人脸跟踪版)上加上multi-scale,对输入数据做(608,480)等比例尺寸缩放训练,全卷积模型接受任意输入, FairMOT原版为1088,608固定输入,我修改为适合人脸的输入,最终使用mobilenet_fpn做backbone训练模型至收敛,速度(80FPS)和精度(目标丢失1S内能够跟踪回)都满足要求,并且mobilenet易于移植。
FaceMOT

总结
由于篇幅有限,本文中许多实现细节没有讲,注重的是一个算法的实现流程,算法的核心还是要有好的idea,如何根据自己的实际场景需求与算力成本来定制实现。

猜你喜欢

转载自blog.csdn.net/zengwubbb/article/details/108693096