AI未来星球
自从大白在知乎、CSDN等平台,不断分享文章、视频后,很多朋友添加大白的微信(wxqzy68)。
在相互交流中,很多小伙伴从他们的角度,分享了很多AI行业的经验,很多人也都加入了《AI未来星球》
从本周开始,大白将这些宝贵的工作、人生经验,也分享给大家,希望对大家工作学习有帮助。
PS:《AI未来星球》加入方式,可点击最下方“阅读原文”查看。
分享人:潘大强
所属方向:图像算法
所在行业:智能安防

01

个人简介
Hello大家好,我是潘大强,大白的朋友兼粉丝。
我是非科班出身,目前博士毕业4年。
大学里学的是数学专业,由于学术天赋不行,没能加入“青椒”队列。(PS:青椒,青年教师)
2017年博士毕业后,就加入了当时的风口行业:
① 工作的内容从纯算法研究到算法落地
② 从结构化数据分析的ML算法,到图像视频结构化的DL算法
③ 从明文数据的训练推理,到基于多方安全计算的Federated Learning
四年里工作重点的转变,也正是工业界对AI技术逐渐理性化看待的缩影。

02

工作学习中
有哪些印象深刻的事?
一般都是第一次,最深刻吧~
工作的前几个月,一直在学习统计机器学习的理论知识。
迎来的第一个任务,是将数据挖掘的通用流程
数据清洗->特征工程->模型选择和组合->超参优化->性能可视化
做成自动化pipline,类似于AutoML。
因为是个团队任务,我只负责超参优化。
超参数是模型训练之前,需要人为手动设置的参数:
比如线性回归中的惩罚项系数,决策树的最小分叉数和最大深度,XGBoost树的棵树和学习率等。
通常是由算法人员根据数据大小和分布,结合建模经验人为设置
超参数的优化在业界也有多种方案,可以暴力的网格搜索,理论上可以找到全局最优超参,但是开销太大。
也可以无脑的随机搜索,碰运气,连局部最优解都不能保证。
也有基于启发式算法,遗传算法、蚁群算法、模拟退火等,可以找到局部最优解,适合离散型变量的处理。
我最终使用了基于高斯过程的贝叶斯优化方法。
在整个项目过程中,收获颇多:
① 每个函数每个模块都要做好单元测试,不要在下游任务中出现bug。
② 团队合作中,事前沟通十分重要,对齐输入输出格式,规划算力分配等。
③ 还有就是见到本科学的矩阵分解、随机过程等数学知识,终于跳出试卷。切切实实在工业界应用起来,感觉以前没白学。

03

工作学习中
踩过哪些坑,哪些可以改进?
踩的坑实在太多此处只举一个,可以概括为“太执着于端到端的SOTA模型”
前年有个项目需求,是要做室内场景的打架、倒地识别。
当时学术界依靠3D卷积在端到端的行为识别任务中大放异彩,一系列模型(I3D、R3D、SlowFast等)在公开数据集UCF101和K600上,都刷到了0.95和0.75以上的top1准确率。
于是我们采用了基于3D卷积网络的方案,跳过期间各种细节,最终上线版,为了确保精度对使用条件进行了限制。比如必须是固定的若个场景,动作主体必须是画面主体等。
由于使用条件的限制,和端到端的低解释性,最终没能成为成熟产品。
后来,反而是多目标追踪+姿态估计+人为规则+序列预测的组合方案,在性能、可解释性和场景适用性方面达到了商用。
不足的地方更多,很多和自己非科班出身有着直接关系。
比如和身边同事相比,他们会对操作系统、硬件算力、资源调度有着更好的理解和应用。
今年年初有个全景拼接的任务,需要将5张2K图拼接成一张8K图。
这是一个典型的stitching任务,业界也有多种方案。
算法层面,我使用了特征点提取+相机参数预估+图像变换+光线补偿的组合方案,满足了拼接的精度要求。
但是在性能上,我只能做到单进程9FPS,无奈将模型和参数丢给了工程组,让他们去做优化了。
结果工程组的大牛,通过修改OpenCV和CUDA源码,直接堆到了40FPS!
最终仅用单块显卡,就实现了5路视频编解码+拼接+检测。

04

从入门的角度
可以提哪些建议?
自己入行也不久,所以只能从这“不久”的经验中,十分主观地给一些建议。
下面只针对计算机视觉相关算法的学习和应用
(1)对于神经网络的学习,理论部分点到为止重在技巧的应用整理一套自己用着习惯的流程代码和处理工具。
① 理论部分点到为止
在统计机器学习中,线性回归和逻辑回归,因简单和可解释而备受欢迎。
SVM,因凸优化理论加持,确保全局最优,而成为当年的首选分类器。
TreeBased算法,因简洁和易于ensemble,在结构化数据的数据挖掘比赛中,成为常客。
还有以Baysian理论为基础的各类生成式模型,他们都有着属于自己的严格数学推导和参数化解释。因而不会被人诟病“黑盒”。
回到深度学习(或神经网络),支撑他work的底层理论是Universal Approximation Theorem。
简单理解就是:只要有足够多的线性函数(FC,CNN,RNN)和激活函数(Relu, Sigmoid, Tanh)做复合,可以逼近任意一个连续函数(模型)。
参数优化的过程,靠的是反向传播梯度下降(SGD, Momentum, Adam),找到一个局部最优解。
虽然各个CV任务,被各式神经网络模型,各种SOTA。
但所有的SOTA都没能逃出以上两个数学理论,他们玩的更多是“肉眼可理解”的trick(待会列举一些)。
这大大降低了我们神经网络“应用者”的入门门槛(至少不用大规模的手撕数学公式)。
② 重在技巧的应用
既然神经网络的底层理论并没突破,那作为“应用者”应该注重各种技巧的学习和应用。
尽量用较少较小的线性函数们,优化出较优的局部最优解。
作为大白的忠实粉丝,我以YOLO系列为例,举一些“肉眼可理解”的trick。
YOLOv1可能是最早的AnchorFree检测器,总计7*7的栅格,每个栅格只预测一个目标。
由于栅格数量和负责目标数量的限制,导致检测目标的数量极为有限。
YOLOv2的trick之一是引入anchor机制,让最终feature map上的每个pixel对应了5个anchor,从而增加检测目标数量。
YOLOv3的tricks包括添加Residual Block引入FPN结构Multi-Scale等。
Residual Block,借鉴ML中Boosting方法,通过学习残差,缓解网络过深导致模型退化的问题。
FPN,改进了纯下采样的Backbone,通过上采样横向连接空间尺寸相同的特征图。
从而将高分辨率特征图的位置信息和低分辨率特征图的类别信息相融合,提高特征提取能力。
Multi-Scale,则是直接从特征图的大小上,指定小目标和大目标的“负责人”。
YOLOv4在Loss计算时采用了IOU系列,因为这和打比赛、发论文时的mAp指标更接近。
在Backbone设计时,已经不满足FPN下采样+上采样+融合,所以加入PAN下采样+上采样+下采样+融合,进一步提高特征提取能力。
作为“应用者”来说,以上所有trick确实都是很容易理解的(依然要膜拜想到这些trick的大神们)。
但是要灵活应用这些技巧,建议平时多整理多学习不同类型的trick
我一般根据流程分成以下几类:
数据增强时的trick;
Backbone设计时的trick;
Head设计时的trick;
Loss设计时的trick;
后处理时的trick。
理解每种trick work的情形,然后在不同任务中组合使用这些trick。
③ 整理一套自己用着习惯的流程代码和处理工具
每个算法工程师应该都会有一套自己的代码库:涵盖了数据标定,数据清洗,模型训练和推理,效果可视化等。
在此基础上做功能优化和功能拓展。
(2)传统CV方法不能丢,掌握好OpenCV。
在做实际项目时,神经网络端到端的解决任务类型,相对固定。
以我为例,主要包括分类、检测、分割、追踪、比对。
其他CV任务得依靠人为设计规则,用传统CV方法(特征点提取、光流估计、透视变换、图像拼接、模板匹配等)组合解决。
而且大部分CV方法,在可解释性和数据需求上,较深度学习更有优势。
最后,希望大家在AI未来星球,求浆得酒,早日实现躺平无忧。
—  —

推荐阅读

Yolox原理 | 深入浅出Yolox核心基础完整讲解

Yolox训练 |深入浅出Yolox自有数据详细训练教程
继续阅读
阅读原文