2024年小结
2024年是复杂的一年,我在学习如何适应工作、专业和生活中的变化。
工作
2024年我在明胜品智参与了不少餐饮领域的视觉AI项目。明胜品智(简称MY)作为百胜中国(简称YumC)的供应商,在肯德基/必胜客等连锁餐厅的门店进行计算机视觉场景的开发和落地。毫无疑问,在MY的工作模式和工作节奏是全新的体验,首先MY成员(算法工程师、项目经理、测试和运维等童鞋)分布在不同城市(上海/南京/大连/西安),依赖于企业微信、飞书和邮件以及每日电话会议进行交流沟通;其次YumC业务部门会基于餐厅各种场景提出视觉AI需求,单纯上家公司(自研生鲜/水果/零食识别AI称)使用的技术栈无法解决当前餐饮场景的视觉AI需求,必须持续优化改造更符合餐饮场景的CV算法。非常开心自己能够参与到中国最大餐饮集团连锁餐厅的智能化创新进程中,在2024年能够进行全新的技术实践。
从软件架构来看,无论是边缘端平台还是服务器设备,针对CV算法的落地,都可以划分为4层:
- 应用层:构建WEB服务器,通过WEB API对外进行交互;
- 任务层:实现业务需求,具体场景结合不同的算法进行落地;
- 算法层:实现具体CV算法,比如目标分类、目标检测和目标分割算法;
- 后端层:针对不同硬件平台为算法层提供不同的模型推理后端;
通过上述软件架构设计,再结合一系列软件工具就可以最大程度的复用之前开发的CV算法,还能够灵活的迁移到不同硬件平台,从而提高CV工程开发的鲁棒性。具体来说:
- 开发环境搭建:Docker + Shell;
- WEB应用构建:Flask + Gunicorn;
- 异步任务处理:Celery + RabbitMQ;
- 模型调度部署:Triton Server + TensorRT/ONNXRuntime。
对于视觉AI场景,不论是边缘端还是服务器开发,算法部署架构逐渐走向大一统。
目前视觉AI需求的落地大体要经历3个阶段的开发,分别是数据阶段、算法阶段和部署阶段。数据阶段指的是采集实际业务场景的数据进行清洗和标注;算法阶段指的是针对深度学习算法进行训练和调优;部署阶段指的是将CV工程结合训练好的模型部署到不同硬件平台。从参与的项目来看,算法落地的实际效果依赖于场景数据 + 算法设计,其中场景数据的采集还严重依赖于人工清洗,并且需要甲方配合,实际情况下会有各种条件约束,导致获取真实有效的餐饮数据需要付出极大的成本。这种情况下算法工程师不能仅仅关注于具体需求怎么实现,在立项阶段就得平衡好各个环节有限的开发成本,但是越多真实的数据 + 越多迭代的算法才能够得到越好的效果,这是我在MY项目制开发过程中真实遇到的痛点和难点。
理想的算法开发:有足够的人力采集和清洗数据,专注于算法的迭代优化,能够努力创造出适合的算法来解决不论多么困难的需求。
真实的算法开发:数据采集困难 + 项目成本有控制 = 场景数据量有限 + 算法迭代周期有限 = 能够落地的AI解决方案有限
我在2024年年初都很难想象LLM在CV场景的部署,不仅仅是因为LLM巨大的参数量(动辄以10亿计数),还因为它不靠谱的推理结果(大模型幻觉)无法落地到需要高准确率的商业场景。在2024年LLM领域发生了非常多的进步,我先后部署测试了多个视觉大模型(SAM/MobileSAM、Qwen2-VL、InternVL2),LLM在零样本的情况下可以很好的识别很多视觉场景(尤其是OCR,效果非常好)。结合我在MY的工作经历,我认为大模型可以深刻改变数据阶段和算法阶段的工作模式。在数据阶段,可以使用大模型来加速数据的采集和标注;在算法阶段,可以直接使用LLM进行目标识别。
这让我恍惚回到了10年前(2014/2015年),深度学习模型(GoogLeNet/ResNet、Fast R-CNN/YOLOv1)的识别精度已经超过了很多机器学习算法,只不过因为需要巨大的算力资源(相对于当时而言)而缺乏落地场景,但是随着GPU/NPU硬件算力的提升以及硬件价格的降低,几乎所有的场景都应用了深度学习算法。回看这10年,DeepLearning就是一场技术革命。目前在很多场景中,LLM的性能已经足够好于小模型,并且在持续的进化发展中,不断出现各种更领先的算法(计算资源更小同时性能更好,比如DeepSeek-V3),这给予大家足够的想像空间。相信在未来,硬件厂家也能够设计出更加符合LLM推理需求的硬件设备。
LLM/VLLM对于CV算法工程师而言,是一场新的技术革命。
专业
在2024年,我重点研究了开源仓库ultralytics/yolov5,目前最新版本是v7.0
。
- YOLOv5
- Backbone使用CSP-Darknet53
- YOLOv5的Backbone基于CSPNet(Cross Stage Partial Network),其核心思想是在通道维度上进行多分支卷积计算。一部分特征通过深层卷积处理,另一部分则经过浅层卷积处理,最后将两者融合输出。这种方法增加了网络梯度路径的多样性,减少了卷积特征的冗余计算,从而提高了计算效率和模型性能;
- 在Backbone的最后一层引入了SPPF(Spatial Pyramid Pooling Fast)模块,这是YOLOv5的一个原创设计,旨在提升计算效率的同时保持与传统SPP模块相似的功能。SPPF模块通过对输入的卷积特征图执行不同尺度的最大池化操作,并将这些多尺度特征融合在一起,增强了模型对不同尺度对象的识别能力;
- YOLOv5 Backbone在ImageNet的准确率是
79.0 Top1和94.4 Top5(224 x 224输入大小,YOLOv5x-cls)
。
- Neck使用PANet(Path Aggregation Network)
- PANet在传统的FPN基础上进行了改进,不仅采用自顶向下的上采样路径来融合多层特征,还加入了自底向上的下采样路径进行特征融合。这种方式可以更有效地利用低层细节信息,有助于提高目标检测的精度,特别是对于小目标的检测效果有显著提升。
- Head层设计了全新的锚点计算算法以及预测框计算方式
- 对于锚点计算,YOLOv5优化了锚点生成策略,使得模型能够根据训练数据自动调整锚点尺寸,以适应更多种类的目标形状和大小,提高了定位的准确性;
- 对于预测框计算,YOLOv5采用了更为精细的边界框回归方法,结合了CIoU(Complete Intersection over Union)损失函数,这有助于更准确地预测物体的位置和大小,尤其是在处理重叠或紧密排列的目标时表现尤为出色。
- 在COCO 2017验证集的
mAP_50/95 = 50.7 / mAP_50 = 68.9(640 x 640输入大小,YOLOv5x)
; - yolov5工程是第一个没有经过YOLO原作者确认的YOLO算法,从此开启了YOLO系列算法大爆炸时代(从2020年开始)。
- Backbone使用CSP-Darknet53
- YOLOv5-seg
- 基于YOLACT(You Only Look At Coefficients)目标分割算法的实现,在Head层创建了两个分支:
- 目标检测分支:保留了原有的预测框坐标、置信度评分以及分类概率的计算,同时新增了逐个目标的实例分割系数计算。这使得模型不仅能定位和分类对象,还能为每个检测到的目标生成详细的实例分割信息;
- 目标分割分支:专门用于预测固定数量的实例分割原型掩码。这些原型掩码作为基础模板,通过与检测分支输出的分割系数线性组合,能够针对每个检测到的对象生成精确的实例级分割掩码;
- 经过后处理步骤(非极大值抑制NMS)过滤后剩下的预测目标,将分割系数与原型掩码进行线性组合,从而获得该目标的最终实例分割掩码。这种方法不仅提高了分割精度,还确保了实时处理速度。
- 在COCO 2017验证集的
mAP^box_50/95 = 50.7 / mAP^mask_50/95 = 41.4(640 x 640输入大小,YOLOv5x-seg)
。
- 基于YOLACT(You Only Look At Coefficients)目标分割算法的实现,在Head层创建了两个分支:
基于yolov5-v7.0工程,我复现了YOLOv2/YOLOv3两个基础的YOLO目标检测算法。
- YOLOv2
- Backbone使用Darknet19
- Darknet19架构是专门为YOLOv2设计的全卷积网络,通过一系列3x3和1x1卷积层的组合来提高处理速度的同时保持较高的检测准确性;
- 在ImageNet验证集的准确率是
72.9% Top1
和91.2% Top5
。
- Neck层使用Passthrough Layer + 多个特征层连接
- Passthrough Layer:此层在空间维度上拆分高分辨率特征图,并将这些拆分的部分与低分辨率特征图在通道维度上进行连接,以此来增强模型对小目标的检测能力;
- 特征层连接:通过在通道维度连接来自Backbone中第4次下采样后的输出特征图和第5次下采样的输出特征图,从而融合多尺度特征信息,有助于提升模型对于不同大小目标的识别效果。
- Head首次引入锚点来加强预测框的计算
- 通过引入锚点机制,模型可以基于预定义的不同尺寸和比例的边界框进行调整,从而更精确地预测物体的位置和大小。这种方法显著提高了定位精度,尤其是对形状不规则或特定比例的目标。
- 在VOC 2012验证集的
mAP_50 = 78.6(544 x 544输入大小)
; - 从YOLOv2开始,YOLO系列算法进入Anchor-based时代。
- Backbone使用Darknet19
- YOLOv3
- Backbone使用Darknet53
- Darknet53是基于Darknet19发展而来的加强版本,加入了残差网络结构来获取更深的网络架构,增强模型的特征提取能力的同时保留较高的计算效率;
- 在ImageNet验证集的准确率是
77.2% Top1
和93.8% Top5
。
- Neck层使用特征金字塔网络(FPN)
- FPN通过自顶向下的路径不断上采样特征图,并与Backbone中不同层次的特征图进行融合,以此实现多尺度特征的有效结合;
- 这种结构的引入使得YOLOv3能够在多个尺度上执行特征融合,极大地提高了模型对不同大小目标的检测能力,特别是对于小目标和遮挡目标有更好的识别效果。
- Head层首次在多尺度特征图上进行预测
- 首次在三个不同尺度上进行目标预测,每个尺度都有其对应的锚点列表,分别针对大、中、小尺寸的目标进行优化设计。
- 在COCO验证集的
mAP_50/95 = 33.0 / mAP_50 = 57.9(608 x 608输入大小)
; - 从YOLOv3开始,YOLO系列算法进入多尺度预测时代。
- Backbone使用Darknet53
除了YOLOv5目标检测和YOLOv5-seg目标分割算法的创新外,yolov5工程在训练和部署阶段也进行了多项优化,比如在数据预处理阶段结合了Mosaic、随机透视变换、等比填充及左右/上下翻转等图像处理算法;在训练阶段支持分布式训练、混合精度训练、EMA(指数移动平均)和EarlyStop等方法。yolov5工程提供了一栈式训练和部署PIPELINE,简化了从数据准备到模型训练再到最终部署的全过程,不仅仅能够提升模型性能,同时加快训练速度以及减轻部署难度。
- Repos
- Blogs
此外,我还尝试结合yolov5-v7.0工程与其他算法应用到实际场景:
- YOLO5Face:该方案基于yolov5-v7.0工程,不仅能高效同步检测人脸的预测框,还能同时精确定位人脸关键点(左眼、右眼、鼻头、左嘴角、右嘴角);
- LPDet(车牌检测与识别):此方案专注于同步检测、分割并识别中文车牌。首先利用YOLOv5-seg目标分割算法来精确检测和分割车牌区域,然后通过CRNN(卷积递归神经网络)或LPRNET(车牌识别网络)算法对分割出的车牌图像进行文字识别,从而准确识别车牌上的中文字符和数字。
- Online DEMO
- Repos
- Blogs
虽然小模型算法在持续进化中,但是和大语言模型(LLM)相比,小模型算法(拥有百万级参数量)似乎难以提供具有突破性的想象空间。我用当下燃油车(简称油车)和新能源电动车(简称电车)的发展来比较小模型和大模型的关系,就像油车和电车都是为了满足人们的出行需求一样,小模型和大模型都旨在解决计算机视觉中的问题。电车还没有出现油车完全无法实现的功能,但是它采用了更新的技术和架构设计,能够提供更强大的智能化驾驶体验,并且因为不断有新技术的研发和应用,电车比油车具有更大的想象空间。同样的道理适用于计算机视觉领域:尽管当前大模型的应用还没有达到新能源电车的普及程度,但是在实验室的性能表现已经显示了LLM强大的能力。很明显,未来大模型将在实际应用中发挥更重要的作用,并迎来更大的发展。
未来是多模态、大模型和AIGC的时代。
另一方面,我认为当前阶段的小模型算法反而展现出了最大的应用价值。现有的小模型算法有了很成熟的实现和部署流程,能够为各种行业(如餐饮、零售等)带来高效的智能化解决方案。YOLOv5开发团队在2023年发布了YOLOv8,同时推出了更强大的ultralytics/ultralytics。到了2024年,ultralytics发布了当前最先进的目标检测算法YOLO11。作为一名计算机视觉算法工程师,有必要在2025年好好的研究和实践ultralytics。
生活
非常开心能来到上海工作,上海给我的第一印象就是干净,不知道是不是因为这里早已经完成了城市化发展的进程。在上海可以享受到丰富的公共资源,比如上海自然博物馆/上海博物馆/上海图书馆/上海马戏团等等,每个地方都值得消磨一整个下午。唯一的小缺憾就是上海缺乏山地资源,最高的佘山不到半小时就能登顶~~~。今年我还花了好多时间在补牙和做牙套上,牙齿问题在这两年集中爆发,我花费了好多时间进行治疗和调整后终于解决了大部分问题,我得好好的维护好自己的口腔健康。
2024年下半年的生活并不如愿。我渴望尽快掌握现有技术框架下的SOTA算法和技术,又急于切入新的技术体系,甚至尝试通过减少睡眠时间和运动时间来挤出更多学习和实践的时间,到头来这些想法都没有实现。我回到宿舍常常就是玩手机,机械式的刷几个小时;我的注意力很难集中,都没办法浏览稍长一些的电视剧/综艺/电影/小说;我会胡思乱想,经常没办法清晰的表达出自己的想法。我能感觉到自己出现了问题,不仅仅是身体素质的下降,还包括精神上的紧张和焦虑。
回顾近半年的经历,我发现自己犯了“贪多”的错误:总想着解决所有问题,反而没办法聚焦自己的精力去做重要的事情。在2025年,我需要做出改变:
- 保持充足的睡眠时间:一个小小的体会,只有休息充分才能保证白天的精力;
- 坚持锻炼和运动:健康的身体才能做事情,永远永远把身体的锻炼时间腾出来;
- 多出去找人交流:一个人埋头容易装牛角尖。
最后,我希望在生活和工作中找到自己的原则和底线,学会拒绝那些不符合自己标准的事情,以此来减少不必要的复杂情况,让生活和工作都更加简单明了,让我更专注于真正重要的目标。
展望
2024年是复杂的一年。通过各种APP上的新闻和视频片段,加上周围朋友的经历和遭遇,我能感觉到经济环境在发生变化:一些曾经很火的行业出现了很大的波动,同时也有新的行业在迅速崛起,我自己在工作和专业领域也有感受到大模型这一新技术体系带来的冲击。面对这些变化,我有尝试做出调整,不过效果并不是特别理想。希望在2025年,我能慢慢找到新的节奏和方向,逐步适应这些变化并取得进展。