2020年小结

2020年过去了,发生了很多事,自己的生活也有了很大的变化,记录一下。

生活

因为疫情的关系,在家里待了好几个月,之前的计划全部被打乱。我一边在家里继续着学习计划,另一边也会抽出时间去探索老家附近的山水。之前因为在外读书的关系,总是没有很长的时间待在家里;另外也可能是年纪的原因,现在的我更喜欢登山和健身,所以机缘巧合之下,让我更加了解了家乡的山水之美。

工作

我对于工作地点没有限制,只想要寻求一份视觉算法类工作,所以5月初开始在网上找工作的时候,就向全国各地的公司投递了简历,前前后后搞了大半个月,最终选择了江苏万维艾斯网络智能产业创新中心,从事机器视觉和图像处理算法开发。

在入职公司后的近半年时间里,参与了大大小小好几个项目,发觉对于实际落地的视觉项目而言,不仅仅涉及到视觉算法的开发,还需要和客户充分的需求沟通,和系统开发同事充分的接口交流,有时候还需要负担起后台开发的任务。

从目前来看,现实世界中还有很多可以落地的视觉场景,与工业产业的结合也会催生出极大的市场需求。另一方面,视觉算法目前的发展还远远不能满足所有场景的要求,不仅仅是准确度、推理时间、计算量之间的权衡,还包括数据采集的优化和不同场景的覆盖等等方面。

专业

打算从两个维度来阐述目前我对于视觉算法的认识和学习进展:

  1. 视觉研究方向
  2. 视觉处理流水线

视觉研究方向

目前参与的项目中,大体可分为4类视觉研究方向:

  1. 目标识别
  2. 目标检测
  3. 视频识别
  4. OCR

目标识别

目标识别可以看成所有其他方向的基础了,目标识别算法的进步,可以为下游方向(检测、分割、OCR等)直接提供性能提高的保证。

目标识别模型大体可分为两部分:

  1. 轻量级模型(lightweight):
    1. 轻量级模型指的是能够满足嵌入式设备运行所要求的模型大小、推理时间和计算量的要求。
    2. 当前轻量级模型中常用的模型是MobileNet系列和ShuffleNet系列;
  2. 重量级模型:
    1. 重量级模型通常指的是在GPU设备上运行的模型,其模型大小通常不做限制,但是对于模型所需计算量和模型推理时间还是有一定要求。重量级模型可细分为两种:中量级模型(middleweight)和重量级模型(heavyweight),通常使用重量级模型在基准测试中实现SOTA的准确率,而不考虑所需时间和计算所需性能;在实际实现过程中,通常使用中量级模型进行工作,其实现了很好的准确率、推理时间和计算量之间的平衡。
    2. 当前常用的重量级模型主要是ResNet及其变体的系列模型,通过结合多分支连接+残差连接+注意力机制,以更好的进行特征提取,常用的有ResNet/ResNeXt/SENet/SKNet/ResNeSt等等。与此同时,分离训练阶段和推理阶段的模型设计,通过插拔式实现,在训练时提高模型泛化能力,在推理时保留原始模型的计算时间,也是一种极好的设计理念,当前实现的有ACBNetRepVGG

在当前模型设计中,流行一种家族式设计理念,即基于某种设计规则(人工设计或者自动设计),同时提供轻量级、中量级和重量级的模型实现(不仅仅是目标识别,后续所有的方向也都如此)。相对而言,由于模型大小、计算性能和推理时间的限制,轻量级模型的识别准确率总是会低于重量级模型。

目标检测

目标检测也是当前视觉研究中非常基础同时非常实用的方向,目标检测的进步,同样可以为下游方向(比如分割、OCR等等)提供极有价值的参考。

目标检测实现了两种功能:目标定位和目标识别。通常分为两种模式实现:

  1. Two-Stage:分离目标定位和目标识别任务,先进行目标定位,再进行目标识别。最常用的就是R-CNN系列模型;
  2. One-Stage:综合了目标定位和目标识别任务,同时输出定位区域和识别类别。最常用的就是YOLO系列模型。

2020年出现的目标检测模型中,传播范围最广的应该就是YOLOv4YOLOv5了。

视频识别

目标识别是对于图像的识别,而视频识别是对于视频的识别,也就是一系列图像的识别。由于视频增加了一个时间维度,所以能够提供更多的时间信息,在动作理解和异常检测方面能够拥有更好的检测性能。

视频识别的发展可分为几个方向进行:

  1. 双流网络:通过结合针对两种不同模态(可见光+RGBDiff/轨迹/光流等等)进行识别的2D网络,往往能够得到更好的识别结果。常用的网络模型有TSN/TRN/TSM
  2. 3D网络:3D网络天然的适用于视频数据,能够同时处理空间和时间维度。常用的网络模型有I3D/X3D
  3. 混合网络:
    1. SlowFast:设计两条不同的网络模型,用于处理不同帧率的视频数据,以模拟现实生活中人眼对于物体和动作分开理解的特性;
    2. R2+1D:3D卷积相比于2D卷积而言具有更好的识别性能,同时也有更高的计算量,所以能否结合2D3D卷积,在保留检测精度的同时降低计算量。

2020年,亚马逊发布了针对视频识别的综述性论文:A Comprehensive Study of Deep Video Action Recognition,全面的剖析了视频识别领域的研究方向和进展。

OCR

OCR也是项目开发过程中经常会遇到的视觉任务。其細分为2個研究方向:

  1. 文本检测:不同于目标检测任务常用的矩形框检测;文本检测任务通常需要检测斜框,也就是检测结果需要给出4个点的坐标;
  2. 文本识别:文本识别的一大难点在于不定长文字的识别,同时文字中如果同时包括了数字、多种语言和多种符号,也会增加识别的难度。

除了分开进行文本检测和识别任务,还出现了端到端的检测识别算法研究。

视觉处理流水线

上一节的视觉研究方向阐述了当前我对视觉算法的研究广度,而视觉处理流水线则描述了我对于视觉算法的研究深度。每一个项目,从最开始的数据、到中间的模型设计和训练以及最后的推理和部署,可分为如下几步进行:

  1. 数据处理
  2. 模型设计
  3. 训练调优
  4. 模型部署

数据处理

数据处理包括了数据标注和数据增强两方面:

  1. 数据标注:包含数据标注工具以及数据保存格式两方面
    1. 数据标注工具:目前常用的有LabelImage(矩形框标注)/LabelMe(多边形标注)
    2. 数据保存格式:当前常用的有Pascal VOC/COCO/KITTI等数据格式
  2. 数据增强:通过各种数据转换函数来模拟各种现实场景,以完成在有限数据量的情况下仅可能的提高模型泛化能力。除了常用的几何转换(旋转、变形、透视等等)和颜色转换(对比度增强、色度增强、颜色抖动等等)外,目前研究人员还发现了几种混合转换实现,包括mixup/cutup/cutout/cutmix;与此同时,研究人员还通过自动增强算法来搜索多种转换函数的有效组合,包括auto augment/fast augment等等

模型设计

模型设计也就是上一节说的视觉研究方向,是整个视觉处理流水线的核心。一方面可以通过各种实验以得到更好的模型,其实现需要研究人员提供极好的设计理念;另一方面也可以通过自动架构搜索技术来搜索模型,这种实现方式需要大量的计算能力。目前而言,两种方式均发挥着各自的作用,而如何改进自动搜索需要的计算需求,以能够在可接受的前提下让更多的研究人员可以利用自动搜索技术实践自己的设计理念,这也是研究的热点问题。

训练调优

训练流程需要设置如下内容:

  1. 数据加载器
  2. 损失函数
  3. 优化器
  4. 学习率调度器
  5. 其他超参数设置(包括了迭代次数、初始学习率、权重衰减等等)

在长期的实验中,能够总结出一套有效的、普遍适用的参数设置准则。

模型部署

模型部署是目前研究的热点问题之一,也是实际场景落地的具体需求。模型部署可分为两个研究方向:

  1. 模型压缩:给定具体的计算场景,通过轻量化模型以符合具体实际需求。常用的压缩方法包括结构优化、量化、剪枝、知识蒸馏等等;
  2. 模型加速:在打通具体计算场景之后,如何通过优化进一步提高算法运行速度。常用的加速方法包括代码层加速(PythonC++)、框架层加速(包括编译优化、缓存优化、算子优化等等)以及硬件层优化(GPU/TPU/FPGA等各种具体硬件环境)

代码仓库

2020年,为了更好的整理学习内容,我新建了一个github帐号:zjykzj。在工作和学习过程中,开源了若干个目标识别和视频识别项目:

  1. ZJCV/ZCls:目标识别代码库。当前复现了ResNet/ResNeXt/SKNet/ResNeSt、MobileNetv1/v2/v3、MNasNet、ShuffleNetv1/v2、SENet/Non-local/GCNet、ACBNet/RepVGG
  2. ZJCV/TSN:视频识别2D模型代码库,实现了TSN模型,同时参考SlowFastMMAction2,实现了视频算法训练流水线
  3. ZJCV/Non-local:视频识别3D模型代码库

同时开源了以下项目:

  1. zjykzj/zlogo:一个生成自定义logo的工具;
  2. zjykzj/pnno:一个处理图像标注的工具;
  3. zjykzj/python-setup.py:打包和分发python包的示例模板;
  4. zjykzj/pytorch-distributedPyTorch分布式训练示例。

展望

2021年,希望在目标检测、OCR以及模型部署方面有更深入的研究;同时希望能够在具体落地的视觉项目上有所进展。