Py学习  »  机器学习算法

【深度学习】客流统计赛题冠军方案解读-2023长三角(芜湖)人工智能大赛

机器学习初学者 • 4 月前 • 76 次点击  
编辑丨极市平台

导读

 

长三角(芜湖)人工智能大赛——客流统计赛题冠军方案解读分享。 

团队介绍

团队来自南方科技大学计算机科学与工程系模式识别与智能系统研究组(YuLab)。团队主要从事步态识别,动作图像编辑,雷达3D点云识别方向的研究,曾在在计算机视觉国际顶级会议CVPR、ECCV等中发表数篇文章。在本次比赛中,我们团队获得了第一名。

赛题分析

赛题要求


图 1客流统计任务示意。出处: https://www.bilibili.com/video/BV1xe4y197pv/

本赛题旨在对目标区域内行人跨越标志线的行为进行统计。需要统计的信息包括进出区域的人数,以及他们的年龄和性别。该项任务可以应用在各种人流量较多的场所,如车站、商场、剧院等。通过对客流数据的分析,可以为商业分析、城市决策提供数据支撑。

数据集分析

比赛主办方提供了基于VOC格式的目标检测数据集。该数据集通过2D框标注主要关注人员头部和穿戴工牌情况。头部标签包括性别和年龄信息,而工牌标签按颜色分为5类。训练集为非连续帧,标签为head,包含性别和年龄属性。

图2 训练集标注示意

在进行数据统计时,我们发现检测框的尺寸变化范围较大,整体呈现长尾分布,如图3所示。为了应对检测框尺寸长尾分布的问题,我们选择使用anchor-free的检测器模型以减少anchor超参数的调节。

图3 检测框尺寸统计
图4 工牌统计

在观察到工牌类型虽然分为了5类,但数量极不均衡。因此,我们将细分的工牌类别归为1类,使得训练更稳定。

主要方案

我们将整个算法要求分为了目标检测、目标跟踪、属性识别以及业务逻辑四个流程,相应地,每个流程都存在各自的难点。

图5 方案流程

检测模型

图6 YOLOX简要结构

之前,我们提到检测框尺寸出现长尾分布的挑战,在这里我们使用业界常用的YOLOX作为我们的检测模型。其中的anchor-free设计能很好的缓解这个挑战。我们将工牌"badge"和人头"head"一起作为检测的分类。我们选择了yolox-s的模型尺寸作为基础模型,它的推理速度较快,能够较好的满足赛题要求。

属性识别模型

图 7 PPLC-Net与其他小模型性能对比

在属性识别模型选择上,我们采用了百度提出的PP-LCNet作为骨干网络。它与常用的性别分类模型moilenetv3相比的有准确率更高,延迟更低。

由于训练集提供的标注只包含人头区域,面积较小导致部分图像难以识别人员属性。因此我们对人头框进行了扩充,即, , ,

训练策略:

我们将原始数据的1%作为验证集,剩余的作为训练集。最终模型选择验证集上最好的结果。

检测模型:我们的训练从bytetrack提供的在行人数据上训练好的模型恢复,以减少我们需要训练的轮次。此外,我们采用了yolox论文中提出的强数据增强方式,如mosaic和mixup,并在训练结束前的最后几个轮次停止使用数据增强策略以得到更稳定的模型参数。

识别模型:我们在PaddlePaddle提供的SSLD蒸馏后的模型参数finetune,并将任务简化为性别的单分类。在数据增强策略上我们选择了:随机裁剪,随机翻转,随机擦除等方法。训练了大约10个epoch,最后我们在验证集上的准确率AP达到97%左右。

跟踪算法

图 8 ByteTrack示意图

我们采用了简单有效的ByteTrack算法作为我们的跟踪算法。如上图所示,ByteTrack的基本原理是对低分检测框进行二次关联,以提高跟踪准确率。在我们的实际应用中,我们发现由于检测并不完美,时常会有跟丢的情况出现。在这里我们采取了以下三个策略以改善跟丢情况:

  1. 以检测框中心扩大一倍宽高。我们发现将原始的检测框扩大后,计算得到的IOU值也会变大,使得一些相邻帧间的检测框更好地关联。

  2. 增加跟踪缓冲区。跟踪缓冲区可以使暂时跟丢的tracklet保留以便下次关联,通过调节这个参数,使得一些跟丢的序列被重新激活。

  3. 降低低置信度阈值(low_thresh)。降低low_thresh可以保留更多的低分检测框,一定程度提高了召回,使得跟踪连续性更好。

业务逻辑

业务逻辑要求我们对行人进出商场进行统计,给算法的输入就包括有视频、标志线、参考点、ROI。具体的评分计算方式如下表所示:

下面将会介绍我们对业务逻辑实现的方案。

标志线跨越判定

为了统计行人的进出情况,首先第一个问题就是如何判断行人跨越了标志线。

之前有的方案通过计算直线方程判断线段是否相交来判断行人是否跨越了标志线。这种方法计算方式繁琐,并且需要计算斜率可能会导致斜率消失和爆炸问题。因此在这里我们使用向量叉乘去判断行人轨迹和标志线是否交叉。具体来说,如下图所示,通过计算向量的叉乘以及向量的叉乘。同时,叉乘与向量夹角的正弦值符号相同,那么叉乘异号代表夹角异号,即轨迹交叉。

徘徊问题

在判断跨线之后,我们需要考虑如何去除徘徊对客流统计带来的负面影响,即同一个人重复计数。我们这里通过设定缓冲线来解决。具体如下图所示,只有行人从标志线一边的缓冲线走到标志线另一边的缓冲线才计入统计。

图 9徘徊现象示意图

我们通过计算标志线和ROI两端的三分点位置作为具体的缓冲线设置位置。

性别判定

一般来说,行人的性别识别结果只需要单帧的识别即可得到。然而,可能存在某些帧清晰度较低,被遮挡的情况,这样得到的性别分类概率的置信度较低,不宜用于分类结果。因此,我们综合考虑了速度和准确率后,选择只判断高阈值(95%)第一帧作为性别识别结果。如果无法没有得到高阈值结果,我们使用所有帧的平均值作为最后结果。

工牌绑定
图 10工牌绑定示意图

由于业务需要我们将佩戴工牌的行人剔除统计结果,且检测结果中的工牌和行人是独立的,这里我们需要对行人和工牌进行绑定。我们使用检测框坐标的中心点位置作为匹配对象,采用经典的匈牙利算法对行人和工牌配对。

工程部署及最后结果

为了使我们的算法能够满足赛题的实时性要求(100FPS),我们采取了多种工程策略对我们的算法进行加速。

  • 我们首先对测试时的输入视频进行跳帧识别,即每3帧识别1帧,这样我们的性能分大概上涨了3倍。由于人在3帧内的移动一般不会太多,所以跳帧操作不会对准确率造成太大影响。

  • 此外,我们采用了TensorRT对我们的检测模型(Pytorch)和属性识别模型(PaddlePaddle)进行了导出,并使用了FP16的数值精度。经过这一步操作,我们的性能分上涨50%。

  • 了解到比赛还提供了C++的部署方案,且我们的性能仍未达到100FPS的上限,我们团队决定用C++重写原来的Python推理代码。最终性能分几乎上涨到原来的4倍,在所有参赛选手中名列第一。

  • 考虑到过高的性能分并没有额外的收益,因此我们换用了更大的YOLOX模型,以及更高的输入分辨率,我们的算法准确率得到了进一步的提升达到了0.9036,最后保持第一名完成比赛。

总结

在比赛上,我们发现模型榜上的得分并不关键,只是为选手提供一个参考。实际上,我们应该在前期快速跑通整个流程,得到一个不算太低的分数就应该专注于算法榜的提升。从实际业务的需求出发,深入理解算法问题,并针对性地对算法流程进行改进,而不是仅局限于模型的测试分数。此外,我们在第一次使用极市平台的开放工具时,也碰到了许多使用问题,这些问题应该在比赛前期尽快地和平台工作人员沟通学习,以免耽误开发进度。最后,感谢极市平台和芜湖市政府提供的比赛机会,使我们能够与优秀的开发者同台竞争,同时获得了丰厚的物质奖励。

参考文献

[ 1 ]  Zhang Y, Sun P, Jiang Y, et al. Bytetrack: Multi-object tracking by associating every detection box[C]//European Conference on Computer Vision. Cham: Springer Nature Switzerland, 2022: 1-21.

[ 2 ] Cui C, Gao T, Wei S, et al. PP-LCNet: A lightweight CPU convolutional neural network[J]. arXiv preprint arXiv:2109.15099, 2021.

[ 3 ] Ge Z, Liu S, Wang F, et al. Yolox: Exceeding yolo series in 2021[J]. arXiv preprint arXiv:2107.08430, 2021.

[ 4 ] Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020.




    
往期精彩 回顾




  • 交流群

欢迎加入机器学习爱好者微信群一起和同行交流,目前有机器学习交流群、博士群、博士申报交流、CV、NLP等微信群,请扫描下面的微信号加群,备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~(也可以加入机器学习交流qq群772479961


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/166600
 
76 次点击