极市导读
打架识别算法冠军分享的一些关于极市打榜的方法策略,总结了许多关于模型训练的经验,希望可以帮助极市打榜人冲上榜首呀! >>加入极市CV技术交流群,走在计算机视觉的最前沿
作为一个刚走上工作岗位的打工人,算法研究与落地的差异性是首先需要学习与适应的。在周末的网上冲浪中,偶然发现了极市平台,其中有不少计算机视觉比赛以及项目招募,这些基本都是针对计算机视觉技术落地应用,还有丰厚的奖励~于是就抱着试试看的想法接触了一下。
后来,极市平台推出了一种新的项目合作模式,即极市打榜。我第一次参与时选择了打架识别这一榜单,按照平台学习、算法调研、模型训练、测试优化等步骤完成了打榜过程,达到了0.96的分数,虽然后来被人超越了哈哈。
详见极市打榜平台:https://www.cvmart.net/topList
打架识别算法可对进入检测区域的人员进行自动识别:若检测到人员有打架行为动作,可立即报警,报警信号同步推送至管理人员。该算法极大地提升了人员的管控效率,保障了人员的安全,可应用于监狱、学校、小区等场景。
建模为算法问题,打架识别算法就是对视频进行分类,因此评价指标就是通用的F1分数:
数据来源为公共数据集 + 极视角数据集,共4413段视频,分为fight和no_fight两类。首先,在数据集页面下,可以看到数据集的统计信息,训练集有10459段视频,测试集有2346段视频,大约为5:1,共21.509G。可以看出视频数据占用存储较大,对程序运行时存储有较高要求,但数据量较为充足,训练测试比例合理。同时,页面可以查看样例集100个数据的情况,可以对数据场景有基本了解。
详见打架识别榜单:https://www.cvmart.net/topList/10014?tab=RealTime&dbType=1-1-1
不同于应用广泛的目标检测与人脸识别等CV算法,视频分类属于视频类的算法,由于增加了时间维度,在难度上天然的高于图像算法,基于视频的各种算法如视频分类、动作时空定位、视频抽取等还处于研究阶段,没有图像算法应用广泛。
下面我将分为平台学习、算法调研、模型训练、测试优化四个部分讲述我的打架识别打榜流程,希望大家可以有所收获。
在极市平台提供的官方文档中,有着详细的平台使用说明,可以说是新手必看,其中的快速入门、极市打榜等项保姆级教程可以让大家快速掌握平台使用方法。
详见:https://www.cvmart.net/document
在熟悉了平台使用后,首先需要进一步了解打架识别的详情,在榜单页面中,除了上述提到的赛道说明对任务进行了详细的描述,还有数据集预览可以让我们对任务有更加直观的了解。
确定了视频分类的算法类别后,接下来就需要寻找合适算法,为了更快更好的在榜单中获得一定成绩,我们最好能够寻找到适合的算法实现,即论文和代码,并且选择熟悉的编程语言和算法框架。
对于我个人而言,在调研一种新的算法时,一般有以下几个途径:百度/谷歌相关文章(大力出奇迹)、在主要顶会(CVPR/ICCV/ECCV等)的工作中寻找、在github等代码网站搜索,最后,极市公众号也会推送最新的CV工作。在上述渠道初步查找后进行筛选,选择1-2个可行方案。经过初步调研,我选择了CVPR2021的工作https://github.com/MCG-NJU/TDN,用于高效动作识别的时域差分网络,与打架识别任务比较契合。由示例数据集可以看出,训练数据长度大多在几秒中,与TDN论文中任务数据也较为接近,且打架动作识别在通用数据集中也是常见的类别,微调训练可以更好的泛化应用。
选择Pytorch1.4的基础镜像搭建编码环境,参照代码README安装缺少的包,即完成环境配置。在编码环境中,我们可以看到少部分数据示例,可以以此编写完整代码,正式训练时就替换成全部数据了。
TDN提供了在大型动作识别数据集上训练好的模型,我们可以以此作为预训练数据集获得好的效果,在./train/models里可以放入预训练模型。
./train/src_repo中存放我们的源码,我将github下载的源码直接放入,需要做的主要工作就是组织数据进行训练。我将全部数据分为训练集和评估集,并和数据类别记录为txt文件。代码如下:
classInd.txt
full_video.txt
然后,需要在原有代码中修改有关数据处理的部分,如ops/dataset.py、ops/dataset_config.py、main,py等,这一部分需要对代码结构有比较清楚的了解。参照README上的训练命令,我们可以做一定调整
在示例数据上调通后,就可以在极市平台上发起训练了,切记训练的排队与环境初始化等都需要时间,所以一定要在编码环境中调通后再尝试训练!训练过程中可以查看实时日志,且可以在训练后查看tendorboard,因此可以做好日志的组织。在顺利训练完成后,模型会自动保存展示,以备后续测试。
测试需要按照一定的接口规范进行,同样可以在赛道说明中查看。./ev_sdk/src/ji.py中,init()函数负责初始化模型,只会运行一次;process_image()接受init()的返回然后对每个数据进行处理返回结果,调用次数根据测试数据数量而定。
在正式测试之前,可以用例子进行验证以避免错误等待时间。
如果测试结果和训练时的验证集结果相近,说明模型泛化性能较好。若训练时的训练精度和验证精度都较好,而测试成绩较差,首先考虑是否是测试的数据处理程序与验证不同,如果排查无误,可考虑数据特异性分布问题,确保训练集、验证集与测试集处于同一分布上。而如果训练精度与验证精度不匹配,则是一般的过拟合或欠拟合问题,可以采用通用的方法如增广数据、改变模型复杂度等方式。
在打架识别任务中,TDN获得了比较好的效果,但算法精度同样会受视频长短、数据分布等影响,需要适应调整。同时,极市平台提供的一站式算法环境,具有数据模型隔离、资源共享等特性,同样需要注意打榜策略,提高时间利用率,如在编码环境中利用示例数据测试成功后再发起正式训练,毕竟排队有时会需要很长时间的。早起的鸟儿才有奖励~,祝各位打榜成功!
公众号后台回复“94”获取最新CVPR22直播链接~
CV算法项目实践
极市打榜是极市平台推出的一种算法项目合作模式。参与打榜除可获得定额奖励外,还有机会与平台签约合作,持续获得算法的订单分成收益。平台支持已标注数据集+免费算力+群内技术答疑!
如果你想要获得真实的企业项目实践经验,或是希望获得一笔丰厚的副业收入,欢迎扫码了解&报名:
扫码查看(报名)40+算法打榜
备注“打榜”
进入打榜技术交流群