从裸辞到CV项目落地:我在新东家的AI提效实战
去年夏天,我做了一个让同事惊掉下巴的决定——裸辞了。在大厂卷了三年多,每天不是修祖传代码就是在和产品经理“友好协商”,精神状态堪忧。Gap的这半年,我一边陪家人,一边把之前想看没时间看的开源项目源码翻了个底朝天,尤其中间花了不少时间啃 OpenMMLab 的 MMDetection 和 Hugging Face 的 Transformers。说真的,不上班的日子很爽,但钱包和简历焦虑很快就找上门来。
两个月前,我入职了这家成立不到三年的 AI 初创公司。团队不大,但氛围出奇地好——没人半夜三点拉你进会,PR(Pull Request)评论里也不会出现“你怎么连这个都不懂”。唯一让我头皮发麻的是:入职第一周,老板就甩给我一个任务——搞个计算机视觉(CV)项目,用来自动检测产品包装上的标签是否贴歪、信息是否完整,目标是替代人工质检,提升产线效率。
说实话,刚看到需求文档时,我内心是拒绝的。毕竟上一份工作做的全是后端微服务,CV?那不是隔壁算法组才碰的东西吗?但转念一想,这不正是我 Gap 期间研究的方向吗?而且,新公司给的自由度高,技术栈也新,正好可以实践一把“AI 提效”的理念。
需求背后的真实痛点
这个项目来自我们一个重要客户——一家日化巨头。他们每天要生产几十万瓶洗发水,每瓶都要贴标签。传统做法是工人肉眼检查,不仅效率低(人均每分钟只能检 10 瓶),还容易漏检。更麻烦的是,标签一旦贴错,轻则返工,重则召回,损失动辄上百万。
客户给了我们几千张产线实拍图作为初始数据集,质量嘛……怎么说呢,光线忽明忽暗、背景杂乱、瓶子角度千奇百怪,还有不少模糊到连我都看不出标签在哪。典型的“理想很丰满,现实很骨感”。
我们的目标很明确:
- 准确率 ≥98%
- 单图推理时间 ≤200ms(部署在边缘设备上)
- 支持后续扩展其他质检项(比如瓶盖是否拧紧)
听起来简单?实际做起来才知道什么叫“魔鬼在细节”。
技术选型:别被“SOTA”绑架
一开始,我差点掉进“必须用最新模型”的陷阱。看到论文里 YOLOv8、RT-DETR 各种刷榜,心痒痒。但冷静下来一想:产线不是 Kaggle,稳定性和可维护性比那零点几个百分点的 mAP 重要得多。
最后我们定了这套组合拳:
- 主干模型:YOLOv5s(不是 v8!因为 v5 的 ONNX 导出更稳,社区支持也更成熟)
- 预处理:OpenCV + Albumentations(做光照归一化和仿射变换增强)
- 后处理:自定义逻辑判断标签是否“歪斜”(基于 bounding box 的长宽比和旋转角)
- 部署框架:TensorRT(针对 NVIDIA Jetson 设备优化)
为什么没直接上通义千问这类大模型?别误会,我超爱 Qwen,但它更适合文本或跨模态任务。对于这种结构化检测问题,专用 CV 模型性价比更高。不过,通义千问在开发过程中帮了大忙——不是跑模型,而是写代码。
AI 提效:通义千问当我的“编程搭子”
坦白讲,这次项目能两周内跑通 demo,通义千问功不可没。我不是让它生成整个系统,而是把它当成一个超级智能的“代码片段助手”。
举个例子:我需要从视频流中截取关键帧,但 OpenCV 的 VideoCapture 在不同分辨率下行为诡异。以前我会去 Stack Overflow 翻半小时,现在直接问 Qwen:
“用 Python OpenCV 从 RTSP 流稳定读取帧,跳过缓冲,只保留最新一帧”
它秒回一段带异常处理的代码,还贴心地加了注释说明 cv2.CAP_FFMPEG 和 cv2.CAP_GSTREAMER 的区别。虽然不能直接 copy-paste(毕竟环境差异),但省了我至少 40% 的调试时间。
更神的是,当我写完训练脚本想加个“早停机制”(Early Stopping),但记不清 PyTorch Lightning 的 callback 写法,Qwen 直接给我生成了一个带详细 docstring 的类,连 unit test 的 mock 数据都写了。那一刻我真觉得:AI 不是取代程序员,而是把我们从 CRUD 里解放出来,专注真正有创造性的工作。
Function Calling:让模型“听话”的关键
很多人以为 CV 模型训完就能直接用,其实后处理才是业务落地的生死线。我们的模型能框出标签位置,但怎么判断“歪了”?总不能靠人眼定阈值吧。
这里我们用了一个小技巧:把业务规则封装成函数,通过 Function Calling 的方式和模型输出联动。
def is_label_skewed(bbox: List[float], max_skew_ratio: float = 0.3) -> bool:
"""
判断标签是否歪斜
:param bbox: [x1, y1, x2, y2] 格式的边界框
:param max_skew_ratio: 允许的最大宽高比偏差(正方形标签理想 ratio=1)
:return: True 表示歪斜
"""
x1, y1, x2, y2 = bbox
width = abs(x2 - x1)
height = abs(y2 - y1)
if width == 0 or height == 0:
return True # 无效框
ratio = min(width, height) / max(width, height)
return ratio < (1 - max_skew_ratio)
然后在推理 pipeline 里这样调用:
results = model.predict(image)
for det in results[0].boxes:
if det.cls == LABEL_CLASS_ID:
if is_label_skewed(det.xyxy[0].tolist()):
alert_system.trigger("Label skewed!")
这种设计的好处是:
- 业务逻辑和模型解耦:以后换模型不用改判断逻辑
- 可配置:
max_skew_ratio可以从配置文件读,方便不同产品线调整 - 可测试:单独测
is_label_skewed函数,不用跑整个 CV pipeline
说真的,以前在大厂,这种代码会被 review 说“过度设计”,但在新公司,CTO 看完直接点赞:“这才是可持续交付的代码。”
踩坑实录:那些让我想砸键盘的瞬间
坑1:数据增强过头,模型学会“作弊”
为了让模型适应各种光照,我用了 Albumentations 的 RandomBrightnessContrast 和 HueSaturationValue。结果训练 loss 降得飞快,但一上真实产线,误报率爆表。
排查半天才发现:增强后的图像里出现了现实中不可能存在的颜色组合,模型学会了根据这些“伪特征”判断,而不是真正看标签内容。后来我把增强强度砍掉一半,并加了域随机化(Domain Randomization)——在合成数据上训练,反而泛化更好。
坑2:ONNX 导出时算子不支持
YOLOv5 默认用 SiLU 激活函数,但老版本 TensorRT 不支持。导出 ONNX 时直接报错:
RuntimeError: Exporting the operator silu to ONNX opset version 11 is not supported.
解决方案?要么升级 TensorRT(客户设备不支持),要么换激活函数。最后我 fork 了 YOLOv5 仓库,把 nn.SiLU() 换成 nn.ReLU6(),虽然精度掉了 0.5%,但换来的是部署的确定性。有时候,工程就是妥协的艺术。
坑3:边缘设备内存泄漏
Jetson Nano 跑着跑着就 OOM(Out of Memory)。用 tegrastats 监控发现,Python 的垃圾回收没及时释放 CUDA 张量。
解决办法是在每次推理后手动清缓存:
import torch
# 推理后
torch.cuda.empty_cache()
并把 batch size 从 4 降到 1。性能牺牲一点,但稳定性拉满。上线一周零故障,产线师傅都说“这玩意比人靠谱”。
效果与反思:AI 提效的真实模样
项目上线一个月后,客户给了反馈:
- 检出准确率 98.7%
- 单瓶检测耗时 163ms
- 人工复检量减少 85%
最让我骄傲的不是数字,而是产线工人不用再盯着瓶子看一整天了。他们现在只处理系统报警的 case,工作强度大大降低。
回头看看这段经历,我有几个真心话想分享:
| 经验点 | 裸辞前(大厂思维) | 裸辞后(新公司实践) |
|---|---|---|
| 技术选型 | 追求 SOTA、新潮 | 稳定 > 新颖,可维护性优先 |
| 代码风格 | “能跑就行” | 注重可读性,函数单一职责 |
| AI 工具 | 当玩具玩玩 | 深度融入开发流,提效利器 |
| 项目目标 | 完成 KPI | 解决真实问题,创造价值 |
写在最后
裸辞这半年,我一度怀疑自己是不是脱离 industry 太久。但这次 CV 项目让我明白:技术人的核心竞争力,从来不是记住多少 API,而是解决问题的思路和对代码的敬畏心。
通义千问这样的 AI 工具,确实能大幅提升编码效率,但它不会替你做架构决策,也不会帮你理解业务本质。真正的“AI 提效”,是人机协作——你负责思考“做什么”和“为什么”,AI 帮你搞定“怎么做”的脏活累活。
如果你也在 Gap 或准备跳槽,别焦虑。把时间花在理解原理、阅读优秀开源项目上,远比刷 LeetCode 有用。毕竟,世界不会奖励最卷的人,但一定会犒赏那些能把技术变成生产力的人。
对了,上周五晚上,我终于没加班。坐在阳台上喝着冰啤酒,看着公司 Slack 上客户发来的感谢消息,突然觉得:裸辞,真香。

评论 0