当前位置:   article > 正文

工作两年的算法工程师的小反思(1)_算法工程师 年终总结

算法工程师 年终总结

欢迎大家关注我的公众号:CV伍六七,定期分享成长干货~

工作两年了,这新的一年时间里自己有了很大的成长,无论是技术上还是汇报沟通方面,总结一下自己的收获和错误,也希望可以给大家带来新的启发。第一篇文章可见:工作一年的算法工程师的小反思,感兴趣的可以再看一下。

技术
    作为一个计算机视觉算法工程师,需要掌握的技术栈有opencv, pytorch/tensorflow/xxx, python,C++,深度学习基础,数学基础,CV相关任务:检测、分割、识别、姿态估计等等。

    在工具链的广度上,做CV相关的工作还是比其他岗位少很多。搜光推的同学还要SQL,Spark等工具,前后端那就更多了。所以CV还是易学难精的一个岗位。
  • 1
  • 2
  • 3
Python
    Python的入门真的非常简单,但是想要用好Python还是比较难的。这主要原因还是因为我们很少有需要用Python去构建一个大的项目工程,而且在机器学习中性能瓶颈不是Python这个语言限制的,还是硬件资源,代码逻辑等决定的。学习Python的基础最好的方式是做题,往深了学的最好方式就是阅读Pytorch和OpenMMLab的代码。当然这是对于做机器学习相关工作的一个要求。Python需要掌握的不仅仅是其本身,其中的一些模块是必须要熟练掌握的。我自身感觉自己的Python代码能力在MMlab的MMDetection、MMCls等框架中得到了比较大的成长。
  • 1
C++
    这一年的工作我觉得自己的C++水平是有明显提高的。也解决了自己的一个问题:**C++掌握到什么水平才是一个合格的算法工程师?**

    这一年因为需要自己去操作很多SDK的开发工作,所以在C++的代码能力上有了长进,也明确了我对这个技术栈的想法。我之前总是会觉得写C++的人比写Python的人代码能力更强。其实自己实践之后觉得**这说的代码能力**其实很多时候是语言特性决定的。但是对一个算法工程师来说,需要**掌握的C++能力就是能写SDK后处理就行**。对于专门的工程部署的C++开发人员来说,写SDK后处理却是最低要求。

    我会这么觉得一方面是我自己的实践,一方面是自己对工程团队的观察。其实写好SDK后处理本质上就是逻辑而已,当然在写SDK的时候不能写Python那样随心所欲,C++基础数据类型,STL容器的操作指令,指针,引用,重载,模板,继承,多态,命名空间都是代码上基础。除此之外还要学会gdb,ldd工具以及了解C++的运行流程,堆是什么,栈是什么,静态链接库、动态链接库,库路径问题,CMakeList问题。还是解决问题的能力比如GCC,G++,CMake,Opencv版本不匹配等等。而工程团队的人我的观察来看一般写算法逻辑的还是工作经验<3年的比较多,再往后的人都是想着做更深入的东西。总体来说就是三块:前处理加速、算子加速、后处理加速。关注的点也会更底层,内存,芯片平台多核优化,单核优化,内存复用,带宽,异构计算等等一堆反正我也不懂的东西。现在我也不再去纠结要不要学怎么写CUDA算子的事情。首先写了也用不到。再者我看了mmcv里的cuda算子,其实需要的内容还是C++基础以及cuda op。需要的时候再根据文档来开发就行。
  • 1
  • 2
  • 3
  • 4
  • 5
CV知识

工作第二年的时候接触了很多新的知识,对于计算机视觉这个方向有了新的理解。对于如何做好一个CV项目也有了新的认识。

做算法的本质,就是在找规律

深度学习是不是黑盒这个问题对于目前我们做的很多项目来说,并不重要,重要的是它可以学习到数据的规律。不管是CV还是NLP,深度学习在这一点上的能力毋庸置疑。

CV算法的领域这么多,方向这么多。但是不同领域的的算法模型,我发现其实最根本的区别还是在于网络target和真实数据之间是如何建模的。

sigmoid和softmax虽然很简单,但是其蕴含的能量真的不一般,随处可见它的身影。分类、检测、分割是三大CV基础任务。但是其实差别就是在于他们最后的target一个是一维向量通过函数映射与实际类别对应。一个是网络输出和位置+类别对应。一个是像素点和类别对应。

一个功能的优化就是两个步骤:

  • 一个是如何构建出高质量的数据集。
  • 一个是如何更好建模出输出和GroundTruth之间的关系。

我感觉我和刚开始做CV项目的时候最大的一个改变就是思想上,就和很多人刚开始做算法类项目的时候就是会觉得得用创新的、fancy的方法去解决这个问题,然后当性能提了0.5%的时候开始自我安慰嗯!我做到了!我用XXX的方法提高了精度。这个问题我发现不仅我有过,很多刚开始做CV或者其他机器学习项目的人也有。

在工业界,做算法的本质是先解决问题,再考虑性能

当沉浸在提点的时候,猛然回头发现自己的测试集根本不完备。当把错误的case都看一遍的时候,发现精度提升了,但是也没解决啥问题。刚开始工作的时候,老板就说我的思维是top-down的而不是bottom-up的,所以会导致思路不完备,容易做无用功,方向走偏。我觉得后面的这一年的时间,我也在为这句话反复斟酌,反复思考。

在工业界,完备的思路是这样:

  • 方案调研,输出调研报告:发表时间|出版物|核心点|可落地性|精度指标|开源代码|方案评价(打分) 我一般就是采用这样的表头做算法调研
  • 跑通baseline:找到开源代码,利用开源数据集先跑个baseline,验证代码的正确性,也顺便熟悉架构。
  • 数据定义和采集:根据这个任务定义好标注边界,根据实际场景需求发出采集任务,任务量不要太多。一般情况下有1w张图片就可以验证出效果。分离测试集的时候不要随机取,很多任务其实和场景、人有强相关。大多数时候是根据人来区分出测试集,这也我走过的一个坑,尤其是在人脸相关任务中如果没有根据人来区分测试集,那么精度一定是偏高。
  • baseline建模出来后写inference,集成SDK,跑通C++视频流下的结果。
  • 根据baseline不断扩展,分析测试集中的长尾问题,不断完备测试集,不断扩展训练集,在数据维度上做更多的工作。在测试集上也不断完备测试结果的准确性全面性。
  • 算法优化层面:不断地读paper不断地读paper,不仅要考虑paper是不是新的,还要考虑在实际项目中能否落地,paper的idea解决了你实际项目中遇到的哪个问题?盲目尝试只会浪费时间,特别注意:不要沉迷于一些fancy的结构, 事实上最重要的内容还是各种数据增强,长尾loss,额外监督,知识蒸馏等工作。
  • 功能层面优化:是否可以考虑其他方案,一般情况下一个算法项目会有多个模块组成的。是否可以通过一些额外的模型单独处理一些问题,是否可以通过一些额外的标注提高算法的性能?比如一个人脸识别任务,人脸检测,人脸质量评分,人脸关键点,人脸属性,人脸跟踪,人脸GAN,人脸朝向这些虽然是不同的模块,但是都是为了同一个功能服务的。
  • 逻辑层面优化:算法总是有边界的,有些case确实比较难以解决的要想办法在逻辑层面去解决。序列平滑,区域限制,结合其他摄像头/功能的结果做逻辑过滤,对特殊case使用特殊逻辑等等,都是非常常见的手段。
  • 性能优化:不断压缩模型的大小,算法落地一方面要不断提高模型的精度,不断提高召回不断提高误报,也要不断压缩模型,让模型在轻量化的体系下有高精度的结果。这个是很长期的事情,模型轻量化有AutoML的相关研究,不过这块我感觉落地还是比较难的,很多时候不如手工调整模型来得快,性能好。除此之外还需要了解芯片平台,不同的平台的算法支持力度不一样。学术和工业界有一定gap,很多人可能都不知道数据排布NCHW和NHWC有啥差别。在输出侧就是做量化优化,目前大家基本都是用8bit的量化方案,4bit还是挺少见的。量化精度损失也是常见的问题,可以做离线量化上的优化,也可以根据浮点模型去做在线量化finetune。
  • 其他层面:数据闭环,今年也做了一个数据闭环的事情。我发现数据闭环真的是一个非常有价值的事情。一方面可以提供一些高精度的预标注标签,可以显著减少标注时间,另一方面可以通过数据闭环的流程去做自动化的数据挖掘,因为到后期盲目加数据是一个低效的事情,通过数据闭环可以不断挖掘出有价值的数据,然后又通过这些有价值的数据去提升大模型的效果,这样就进入了正向反馈。数据闭环中因为用到大模型,那么对于论文的可选择范围又更广了。

算法工程师的核心竞争力肯定是要包括上述的这种全流程上工作能力。我愿称之为“稳”的能力

从老板的工作风格中,字随处可见。一个项目处于什么样的阶段,数据分布是怎样,测试场景是否补全,紧急迭代的时候流程把控,数据处理自动化,算法方案调研分析、代码实现等等。稳健性是一个非常核心的点,这是我个人的看法。而稳健性的底层,还是要依托于对业务的理解,对论文的理解,代码实现能力等有关系。这块有很多事想说,后续打算举些例子详细聊聊。

入了机器学习这个坑之后,每当见到一篇新奇的文章去建模出输出和GT之间联系的时候,就有种初高中时代见到某种解法解决了压轴题的那种豁然开朗的感觉。就如同第一次看faster-rcnn的时候,惊讶于其中利用Anchor作为桥梁去链接输出和GT之间的关系,降低了学习能力。第一次看objects as points的时候,我有种耳目一新的感觉,热力图的建模方式还可以这么用,原来CNN输出的feature map中的每一个点,它自身就是一个Anchor!有一次看论文分享的时候,了解到年龄估计任务中采用高斯分布去估计年龄,我也被作者的思想所折服。

我觉得也是做算法工作非常重要的点,学会建立相关的模型把业务数据和模型输出联系起来,学术论文都是一些参考答案,在实际应用的时候其实有很多改动的地方。比如一个序列任务,假设你想去对一种序列做一个多分类,那么肯定要去思考这不同类别的序列有什么差异,如果把这些差异提取出来作为新的特征给到模型,其实也是所谓的特征工程。在模型的选择上也不是一提到序列就是transformer/LSTM/,当时我第一次看完HCN的时候,发现CNN竟然也可以用于序列建模。并且巧妙地应用了卷积去学习序列关系,对于数据特征处理上也用了很多巧妙的方法。

其他知识

盘点一下自己的研发工具:

  • 操作系统:ubuntu16.04/deepin
  • IDE: Pycharm/Vscode/Clion
  • 其他:docker/shell/vim/linux/shell以及linux下指令集

路漫漫其修远兮,机器学习无止境

工作的第二年,我感觉更多的是在于方法论的积累,以及在自己的所负责的业务上去研读更多的paper,把业务强相关的几个方向的文章吃透一点,挖深一点。CV这么卷,大佬云集。做一个默默潜行的学习者,不断积累经验,不断提高能力。

有几句话我时刻提醒自己。

先想好问题是什么,再去想解决方案,再考虑创新

工作就是不断遇到问题然后解决问题 ,要享受解决问题后的成长,而不是享受没有问题的轻松

算法的核心在于将业务数据和模型之间相结合,先把性能提上去,再考虑把华丽但没什么卵用的trick放到PPT

机器学习如星辰大海,不能局限于一隅之地,很多时候没有广度,很难做好一个项目

以上一年就是自己的一些总结,希望自己可以自勉自励,不断提高自己。

看大佬的文章是高山仰止,看同阶段的人的体会才能感同身受。祝好!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/753681
推荐阅读
相关标签
  

闽ICP备14008679号