极市导读
本文为CCBR2022 行为特征识别大赛中躺坐识别赛道冠军队伍的方案分享,队伍详细介绍了整体的算法思路,模型训练推理等过程。>>加入极市CV技术交流群,走在计算机视觉的最前沿
任务介绍
-
项目背景:在当前这个大融合、开放程度不断提高的社会,虽然社会文明程度取得飞跃性发展成果,但同时社会各个方面治安的管理难度和管理复杂度也随之增加,城市街道管控也需要更加智能化,当街道有人躺或瘫坐在街道或者自助银行厅,管理部门应立即有人进行处理。 -
项目算法要达到的目的:用于检测街道上有人躺坐在街道上或自助银行厅内,单帧识别状态,可以提高算法的泛化性。
数据分析
本次比赛提供的标注方式为:2D框标注+骨胳点标注。具体如下:
-
2D框标注共有10类
(1)lying:人员躺着/趴着
(2)standing:人员站着
(3)sitting:人员坐着
(4)squatting:人员蹲着
(5)others:其它动作
(6)lying_unsure:人员躺着/趴着
(7)standing_unsure:人员站着
(8)sitting_unsure:人员坐着
(9)squatting_unsure:人员蹲着
(10)others_unsure:其它动作
其中,6到10类是由于遮挡或者图片截断等原因导致不清楚人员是具体哪种类别(基本是下半身被遮挡时),而打上unsure标签的行人 -
骨骼点标注则采用coco格式的行人17点标注,示例图如下:
同时,举办方还贴心的提供了标注信息解析代码,如下
import json
def ground_truth_parser(jsonpath):
f = open(jsonpath, 'rb')
infos = json.load(f)
bbox_anno, kpts_anno = [], []
for info in infos:
xmin, ymin, width, height = info['bbox'] ###检测框的左上角坐标和高宽
box_name = info['box_name'] ###检测框的名称
bbox_anno.append({'name':box_name, 'xmin':xmin, 'ymin':ymin, 'width':width, 'height':height})
anno = {'keypoints': info['keypoints'], 'num_keypoints': 17,
'category_id': 1, 'id': info['id'], 'bbox': info['bbox'], 'area': info['area'],
'iscrowd': int(info['iscrowd'])} ###关键点的标注信息
kpts_anno.append(anno)
return bbox_anno, kpts_anno
-
数据集是由监控摄像头采集的现场场景数据,样本示例图如下。训练数据集的数量为11174张,测试数据集的数量为2818张。通过查看样例集的数据,可以发现数据集中有各种场景,且相对复杂。另外,数据集主要是从类似工厂监控摄像头中采集,近远行人目标都有,行人的尺度变化比较大。因此需要选用具有多尺度检测能力的检测器。综合考虑计算成本和精度,对于检测模型,我们最终采用的是Yolov5s模型。
算法思路
考虑到
1)项目在实际场景中的实时性,让最终方案可落地,需要保证模型的大小以及速度。
2)方案后续场景优化,模型需要预留一定扩展功能。
因此最终使用检测模型、关键点模型级联的解决方案。部署使用TensorRT FP16加速推理
检测模型
根据之前在极市平台的竞赛经验,考虑检测模型精度和速度的平衡,直接敲定了使用Yolov5s,检测模型也直接输出行人的状态,使用10类的检测。在平台提供解析标注代码的基础上,生成Yolov5支持的数据格式。
Yolov5的基本原理如下:
如上图所示,以640640图片输入为例,Yolov5模型首先通过特征提取网络对输入图像提取特征,得到20x20特征图;计算loss时,GT跨层预测,即有些bbox在多个预测层都算正样本;在预测得到的输出特征图有两个维度是提取到的特征的维度,还有一个维度(深度)是 B(5+C), B表示每个grid cell预测的边界框的数量,C表示边界框的类别数;5表示4个坐标信息和一个目标性得分(objectness score)
在推理阶段,使用352x640推理,TensorRT加速,可以达到100FPS。
关键点模型
使用基于回归的关键点预测模型。如下图,相比于左边基于HeatMap的模型
1)基于回归的关键点模型可以摆脱高分辨率热图的依赖
2)计算成本和内存开销都比较小
3)由于输出是连续的,对于部署时的量化也比较友好
根据调研,我们最终采用ICCV21Oral的基于RLE Loss的关键点回归的方案。在coco测试集上的性能对比如下图:
该方案的核心如下图,通过flow方法,估计出模型输出关键点的分布概率密度。一旦估计出令人满意的先验分布函数,就能动态优化损失函数loss,从而促进模型的回归训练。详细的原理,可以参考以下两篇知乎:
https://zhuanlan.zhihu.com/p/395521994
https://zhuanlan.zhihu.com/p/440567782
对于关键点模型的数据处理,参考RLE的官方GitHub和极市提供的解析代码,将标注转换为coco的关键点标注格式进行训练
模型训练
模型训练采用分别训练的策略,检测模型训练脚本start_train_det.sh如下:
# 训练数据生成
cd /project/train/src_repo
python data_processor_det.py
# 训练
cd yolov5
export CUDA_VISIBLE_DEVICES=0
python train.py --batch-size 16 --data data/sitting.yaml --weights ./yolov5s.pt --hyp data/hyps/hyp.scratch-low.yaml --epochs 10 --device 0 --img-size 640 --noautoanchor
rm -r /project/train/models/runs_det
mv /project/train/src_repo/yolov5_multilabel/runs /project/train/models/runs_det
# 模型转换,Torch2TensorRT
python export.py --weights /project/train/models/runs_det/train/exp/weights/last.pt --imgsz 352 640 --half --device 0 --include engine --simplify
关键点模型训练脚本start_train_kp.sh如下
# 训练数据生成
cd /project/train/src_repo
python data_processor_kp.py
cd /project/train/src_repo/res-loglikelihood-regression
# 训练
export CUDA_VISIBLE_DEVICES=0
export PYTHONPATH="pwd":$PYTHONPATH
CONFIG=configs/256x192_res50_regress_cls-flow.yaml
EXPID=${2:-"test_rle"}
PORT=${3:-23456}
HOST=$(hostname -i)
python ./scripts/train.py \
--nThreads 4 \
--launcher pytorch --rank 0 \
--dist-url tcp://${HOST}:${PORT} \
--exp-id ${EXPID} \
--cfg ${CONFIG} --seed 123123
# 模型转换,Torch2TensorRT
rm -r /project/train/models/runs_kp
mv /project/train/src_repo/res-loglikelihood-regression/exp /project/train/models/runs_kp
python scripts/onnxExport.py --cfg=configs/256x192_res50_regress_cls-flow.yaml
python onnx2trt.py
检测模型和关键点模型训练时的参数如下:
Yolov5s检测模型:
-
图片尺寸: 640X640 -
SGD优化器 -
初始学习率为0.01 -
学习率预热,余弦下降法 -
L2正则化 -
训练时batch_size大小设置成16 -
Mosaic和MixUp等数据增强策略 -
训练时采用多尺度训练 -
epoch为10,fintune
RLE关键点模型:
-
图片尺寸: 256x192 -
Backbone: Resnet50 -
Adam优化器 -
初始学习率为0.001 -
阶梯下降法 -
L2正则化 -
训练时batch_size大小设置成32 -
随机翻转和旋转 -
epoch为30,fintune
模型推理
推理阶段,我们采用的是使用FP16精度的TensorRT加速的方案。这里检测模型使用3x352x640的输入尺寸,关键点模型使用3x256x196,最终推理速度为45FPS.
首先,利用Yolov5s检测模型推理出当前场景中行人目标框及对应的姿态,这里我们对10个类别给了不同的过滤score,可以有效提高模型的f1-score得分。
其次,利用RLE关键点模型输出行人的关键点位置信息。
最后,根据比赛规则,输出目标的json信息。
结果展示
最终提交结果显示,我们团队的方案在精度上面与其他团队还是有比较大的领先优势,最终也是获得了第一名的好成绩。对于我们的方案,还有如下几点可以进行探索优化:
-
模型剪枝、蒸馏,在保证精度的情况下提升推理速度 -
使用灰度图训练推理,我们团队做过实验,模型的30%计算量集中在第一层的卷积计算上,使用灰度图,理论上可以节省第一层67%计算量。 -
使用YoloX或者Yolov7等更新的检测模型
团队介绍
很幸运,在极市平台举办的CCBR2022 行为特征识别大赛—躺坐识别赛道获得第一名。感谢极市平台提供的竞赛支持。同时也欢迎各位读者与我们研究中心交流合作。
汕头市人工智能与大数据工程技术研究中心依托汕头职业技术学院计算机系建设,由汕头市科学技术局于2019年12月挂牌成立,致力于人工智能、大数据等新一代信息技术的学术研究和技术研发。研究中心以计算机视觉感知技术为核心,研发软硬件一体化智能装备,主要应用到智慧工业、智慧交通等领域。
公众号后台回复“CNN综述”获取67页综述深度卷积神经网络架构
技术干货:损失函数技术总结及Pytorch使用示例|深度学习有哪些trick?|目标检测正负样本区分策略和平衡策略总结
实操教程:GPU多卡并行训练总结(以pytorch为例)|CUDA WarpReduce 学习笔记|卷积神经网络压缩方法总结
# 极市原创作者激励计划 #
极市平台深耕CV开发者领域近5年,拥有一大批优质CV开发者受众,覆盖微信、知乎、B站、微博等多个渠道。通过极市平台,您的文章的观点和看法能分享至更多CV开发者,既能体现文章的价值,又能让文章在视觉圈内得到更大程度上的推广,并且极市还将给予优质的作者可观的稿酬!
我们欢迎领域内的各位来进行投稿或者是宣传自己/团队的工作,让知识成为最为流通的干货!
对于优质内容开发者,极市可推荐至国内优秀出版社合作出书,同时为开发者引荐行业大牛,组织个人分享交流会,推荐名企就业机会等。
“
点击阅读原文进入CV社区
收获更多技术干货

