深夜两点半,我在浦东的出租屋里用 Cline 手搓了一个计算机视觉项目,然后我悟了

AICode
2026-07-21 21:54
阅读 907

作者:一个快被生活磨平棱角的二娃奶爸 / 坐标上海浦东 / 白天搬砖晚上带娃的野生程序员


凌晨两点,娃终于睡了

上周五晚上,准确说是周六凌晨两点十七分,我盯着手机屏幕上的监控画面——二宝终于不哭了。大宝早就睡死了,口水流了一枕头。我轻手轻脚地从次卧的小床上爬起来,膝盖"咔"一声响,二十八岁的人,膝盖像个六十岁的老头。

客厅里没开灯,只有我那台用了三年的 ThinkPad 屏幕泛着蓝光。桌上是中午没吃完的外卖,已经凉透了,油凝成白色的块,看着就反胃。旁边还堆着大宝的绘本、二宝的奶瓶,以及一张这个月的房租账单——4200

是的,我和我女朋友,哦不,现在是老婆了,带着两个娃,合租在浦东三林那边一个两室一厅的老破小。主卧给娃当游戏房了,我们俩睡次卧,两张单人床拼一起,中间留个缝,谁翻身都能把对方震醒。

你说惨不惨?惨。但你问我后不后悔?

我猛灌了一口凉掉的可乐,打了个嗝,打开了 VS Code。

惨归惨,代码还是要写的。


先说说我是谁吧

我叫老周,今年29,在上海干了五年后端开发。之前在某中型互联网公司做 Java,月薪从刚来上海的 15k 一路涨到了 22k,听着还行对吧?但你算算账就知道了。

两个娃,奶粉、尿不湿、早教班,一个月光这俩碎钞机就得吃掉 8000+。房租 4200,水电煤网加起来小几百,吃饭两个人省着点 3000,交通通讯杂七杂八 1000。你算算,22k 到手也就 17k 多点,每个月都是负现金流,全靠之前攒的老底在撑。

我老婆之前做行政的,生完二宝后就全职带娃了。她也不容易,白天一个人带两个,大宝上幼儿园小班,二宝才一岁半,正是最磨人的时候。我每天下班回家,看到她头发乱糟糟的,衣服上不知道是奶渍还是饭粒,眼里全是红血丝,心里真的很不是滋味。

所以我想搞钱。或者说,我想搞点副业,搞点能让自己有"第二曲线"的东西。

去年十月的一个晚上,也是这么个深夜,我刷到一篇关于计算机视觉的帖子,讲的是怎么用开源模型做一些实战项目。当时我脑子里就蹦出一个想法:我能不能也搞一个 CV 方向的项目?不求多牛,但至少能写进简历,能接点私活,能让自己在技术上有新的增长点。

说干就干。程序员嘛,最不缺的就是冲动。


一开始,我是真的菜

你可能觉得我夸张,干了五年后端的人,搞个计算机视觉项目能有多难?

兄弟,真的难。

我一上来就想搞个大的——做一个"智能宝宝监控"系统。想法很美好:用摄像头实时监测宝宝的状态,如果检测到宝宝翻身压到口鼻、或者爬到床边有坠落风险,就自动报警推送到我手机上。

你看,这需求多刚需,完全是从痛点出发的对吧?

结果一上手,我傻了。

我连 PyTorch 都装不利索。CUDA 版本不对、cuDNN 找不到、Python 环境乱七八糟,光是配环境就搞了我三个晚上。那三个晚上,白天上班写 Java 写到头秃,晚上回来对着终端里的红色报错信息怀疑人生。

RuntimeError: CUDA out of memory. Tried to allocate 2.00 GiB 
(GPU 0; 4.00 GiB total capacity; 2.33 GiB already allocated; 
0 bytes free; 2.45 GiB reserved in total by PyTorch)

你看这个报错,我那块破显卡只有 4G 显存,跑个 ResNet-50 的 Fine-tuning 直接 OOM。我当时真的想骂娘。

更要命的是,我不知道该往哪个方向走。

计算机视觉这个领域太大了。目标检测、图像分割、图像分类、姿态估计、OCR、人脸识别……每个方向都能钻进去研究好几年。我就像站在一个巨大的图书馆门口,满眼都是书,但不知道从哪本开始看。

那段时间,我白天在公司摸鱼看论文,晚上回来跑代码跑不通,心态真的崩了。有一次,我对着屏幕上的 loss 曲线看了半小时,那玩意儿跟心电图似的上上下下,就是不收敛。二宝在旁边哭,大宝在喊"爸爸陪我玩",我老婆在厨房喊"你能不能来帮个忙",我坐在那里,突然就觉得很无力。

那种感觉,就像你拼命想抓住点什么,但手里全是沙子,越攥越漏。


转机:Cline 这个逼玩意儿,真香

转折发生在今年一月底。

那天我在掘金上逛,看到有人推荐 Cline——一个 VS Code 的 AI 编程助手插件。说实话,我之前对这类工具是不屑一顾的。你想啊,我一个写了五年代码的人,让 AI 帮我写代码?那不是打自己脸吗?

但那天晚上,我实在是被一个 bug 搞烦了。我在做数据增强的时候,albumentations 库的一个 transform 怎么调都不对,图像预处理出来的结果全是花的。我搜了 Google、翻了 GitHub Issues、看了 Stack Overflow,搞了一个多小时没搞定。

死马当活马医,我装了 Cline。

然后,我的世界观被刷新了。

Cline 跟那些只会补全代码的 AI 不一样。它能直接读你的整个项目上下文,理解你的文件结构、你的代码逻辑、甚至你的报错信息。我把那个报错丢给它,它不但告诉我问题出在哪——原来是我把 normalize 的 mean 和 std 写反了——还顺手帮我把整个数据 pipeline 重构了一遍,代码比我自己写的还优雅。

我当时就一个感觉:卧槽,这玩意儿要是早出来两年,我能少掉多少头发?

从那以后,Cline 就成了我深夜写代码的标配。说几个让我觉得最爽的点:

第一,它能帮你理解开源项目。 计算机视觉领域有大量的开源项目和论文复现代码,但说实话,很多代码写得跟屎一样(没有冒犯开源作者的意思,但有些学术代码真的没法看)。以前我读这些代码,跟考古似的,一行一行猜。现在我把项目丢进 VS Code,让 Cline 帮我梳理整个调用链,十分钟就能搞明白核心逻辑。

第二,它能帮你写 Fine-tuning 的代码。 这个太关键了。我后面会详细讲,但简单来说,Fine-tuning 一个预训练模型,你需要写一堆 boilerplate code——dataset 类、dataloader、训练循环、验证逻辑、checkpoint 保存、TensorBoard 日志……这些东西每换一个项目就要重写一遍,烦得要死。现在我把需求描述清楚,Cline 直接给你生成,你只需要微调一下就行。

第三,也是最让我惊喜的,它能帮你做架构决策。 比如我在纠结用 YOLO 还是 Faster R-CNN 的时候,我把我的场景描述给 Cline——实时性要求高、检测目标小、部署在边缘设备上——它帮我分析了两者的优劣,最后建议我用 YOLOv8 的 nano 版本,还给了我具体的修改建议。

这不是替代你思考,这是放大你的思考。


项目落地:Fine-tuning 一个属于我自己的模型

好了,说了这么多铺垫,终于要到干货了。

我的"智能宝宝监控"项目,核心其实就两个模块:

  1. 姿态估计模块:检测宝宝的姿态,判断是否有危险(比如趴睡、口鼻被遮挡)
  2. 区域检测模块:检测宝宝是否在危险区域(比如床边)

我先说第一个模块,也就是 Fine-tuning 的部分。

为什么是 Fine-tuning?

一开始我想从零训练一个模型,但很快就放弃了。你猜怎么着?我那块 4G 显存的破卡,跑一个 epoch 要四个小时,而收敛至少需要 100 个 epoch。四百个小时,我等到下辈子去吧。

而且,从零训练需要大量的标注数据。你让我自己标注几千张宝宝姿态的图片?我白天上班晚上带娃,哪来的时间?

所以 Fine-tuning 是唯一的出路。

我选了 MMPose 框架里的 HRNet-w32 作为 backbone,这个模型在姿态估计任务上效果很好,而且模型大小适中。然后我找了一个开源的婴儿姿态数据集——虽然不大,只有 3000 多张图,但够用了。

Fine-tuning 的核心思路其实很简单:

# 加载预训练权重
model = HRNet_W32(pretrained='hrnet_w32-36af842e.pth')

# 冻结前面的层,只训练最后几层
for name, param in model.named_parameters():
    if 'head' not in name:
        param.requires_grad = False

# 替换分类头,适配我们的关键点数量
model.head = KeypointHead(num_keypoints=16)  # 婴儿姿态16个关键点

# 用较大的学习率训练新头,较小的学习率微调后面的层
optimizer = torch.optim.AdamW([
    {'params': model.head.parameters(), 'lr': 1e-3},
    {'params': model.layer4.parameters(), 'lr': 1e-5},
])

就这么几行核心代码,但背后的门道可不少。比如:

  • 学习率的选择:预训练层用很小的学习率(1e-5),新加的头部用大一点的学习率(1e-3)。这叫"差异化学习率",防止预训练权重被新数据带偏。
  • 数据增强:婴儿的姿态跟成人差异很大,所以我在数据增强上花了很多心思。随机旋转、随机缩放、颜色抖动这些常规的就不说了,我还加了一个"模拟遮挡"的增强——随机在图像上贴一些色块,模拟被子遮住宝宝一部分身体的情况。这个增强上线后,模型在真实场景下的鲁棒性提升了至少 15%。
  • Loss 函数:一开始我用的是标准的 MSE Loss,但发现对关键点的预测精度不够。后来换成了 Wing Loss,这个 loss 对小误差更敏感,能让关键点预测更精准。

这些细节,很多都是 Cline 帮我梳理的。 我把论文里的公式描述给它,它帮我翻译成代码;我告诉它效果不好,它帮我分析可能的原因并给出改进方案。说实话,如果没有 Cline,这个项目我至少要再多花两个月。

Midjourney:数据增强的秘密武器

这里要插一段,讲讲 Midjourney 在我项目里扮演的角色。

你可能觉得奇怪,一个画画用的 AI 工具,跟计算机视觉项目有什么关系?

关系大了。

前面说了,我做的数据增强里有一个"模拟遮挡"。但问题是,真实的遮挡场景很难用代码模拟。被子褶皱的纹理、毛绒玩具的形状、甚至大人手臂的轮廓——这些东西你用代码画出来,跟真实场景差距太大,模型学了也没用。

然后有一天凌晨三点,我哄完二宝,刷 Midjourney 的图解压。看着那些精美的 AI 生成图,我脑子里突然灵光一闪:

我为什么不用 Midjourney 来生成训练数据呢?

说干就干。我开始写各种 prompt,生成各种"婴儿睡觉时被遮挡"的场景图:

/imagine a baby sleeping on a bed, partially covered by a white 
blanket, soft lighting, realistic photography style, top-down view, 
high resolution --ar 4:3 --v 6
/imagine an infant lying on a crib, a stuffed bear partially 
covering the baby's face, warm bedroom lighting, photorealistic, 
shot from above --ar 4:3 --v 6

你别说,Midjourney V6 生成的图,质量是真的高。褶皱、光影、纹理,跟真实照片几乎无法区分。我前后生成了大概 800 多张各种遮挡场景的图,然后用一个脚本自动做标注(因为是我生成的,所以遮挡区域是已知的),直接丢进训练集。

效果?直接起飞。

加上这批 Midjourney 生成的数据后,模型在真实测试集上的 mAP 从 72.3% 提升到了 81.6%。特别是在遮挡场景下,准确率从 58% 飙升到了 79%

这波啊,这波叫"AI 生成数据训练 AI",用魔法打败魔法。

后来我把这个经验分享到一个技术群里,有个哥们的回复让我笑了半天:"你这是用 Midjourney 当数据标注员,一个月薪三千的标注员都省了。资本家看了都流泪。"


部署:从笔记本到树莓派

模型训练好了,下一个问题是怎么部署。

我的目标是在家里用一个树莓派 + 摄像头实时跑这个模型。但问题来了,HRNet-w32 这个模型太大了,就算量化之后,树莓派也跑不动。

模型压缩,安排。

我先做了知识蒸馏——用一个大的 teacher 模型(HRNet-w48)去指导一个小的 student 模型(一个魔改的 MobileNetV3)训练。然后对 student 模型做了 INT8 量化。最后,student 模型在树莓派 4B 上能跑到 8 FPS,虽然不高,但对于宝宝监控这个场景来说够用了——毕竟宝宝又不是在跳街舞,一秒钟看八次足够了。

整个部署过程,Cline 又帮了大忙。ONNX 导出、TensorRT 量化、OpenCV DNN 推理……这些我以前完全没碰过的东西,在 Cline 的辅助下,一周就搞定了。

最终的成品长这样:

一个树莓派接一个 USB 摄像头,放在婴儿床旁边。模型实时检测宝宝的姿态和位置,如果发现异常(比如趴睡超过三分钟、或者靠近床边),就通过 MQTT 推送消息到我手机上的 Home Assistant,然后触发一个蜂鸣器提醒。

成本?树莓派 4B 四百多,摄像头六十,加起来不到五百块。 市面上类似的婴儿监护仪,带 AI 功能的最便宜也要一两千,而且功能还没我这个强。

我老婆看到成品的时候,说了句让我至今难忘的话:"你终于干了件正事。"


复盘:这半年我学到了什么

到今天,这个项目已经跑了三个多月了。中间迭代了好几个版本,也踩了不少坑。趁这个机会,做个复盘,也算给同样想在 CV 方向搞点事情的朋友一些参考。

1. 不要从零开始,永远不要

Fine-tuning 是普通人玩 CV 的唯一正确姿势。 除非你有几百张 A100 和几百万张标注数据,否则别想着从零训练。站在巨人的肩膀上,不丢人。

2. AI 工具不是来替代你的,是来放大你的

Cline 也好,ChatGPT 也好,Midjourney 也好,这些工具不会让你变成一个更好的程序员,但它们能让你变成一个更高效的程序员。以前我需要一周做的事情,现在两天就能搞定。省下来的时间,我可以用来思考更高层的问题——架构怎么设计、数据怎么增强、模型怎么优化。

工具的价值,不在于它能帮你写多少代码,而在于它能帮你把精力聚焦在真正重要的事情上。

3. 数据比模型重要

这是我这半年最大的感悟。同一个模型,换一批更好的训练数据,效果能提升 10 个点。而换一个更复杂的模型,可能只能提升 1-2 个点。

与其花时间调模型结构,不如花时间搞数据。 Midjourney 生成数据这条路,我觉得会被越来越多的人发现。毕竟,真实世界的长尾场景太多了,靠人工采集根本不现实,但 AI 生成可以无限扩展。

4. 时间管理是王道

这一点跟技术无关,但我觉得最重要。

两个娃的家庭,你能挤出来的学习时间真的非常有限。我的策略是:把学习时间切成小块,每块 30-60 分钟,聚焦一个具体问题。 不要想着"今晚我要把整个项目搞完",而是"今晚我要把数据增强这个模块跑通"。

小步快跑,持续迭代。这是带娃程序员的生存法则。

5. 别一个人闷头干

这半年我加了四五个技术群,认识了一帮同样在搞 CV 的朋友。遇到问题在群里问一句,经常能秒解。有时候别人的一句话,能帮你省几天的摸索时间。

闭门造车是这个时代最奢侈的浪费。


写在最后

现在是凌晨四点二十分。

二宝又哼了两声,我起身去看了看,翻了个身又睡了。回到电脑前,看着屏幕上跑着的训练日志,loss 在稳步下降,心里居然有一种久违的踏实感。

说实话,这半年真的很累。白天上班,晚上带娃,深夜写代码。有时候真的觉得自己像个陀螺,被生活抽着转,停不下来。

但你问我值不值?

值。

不是因为这个项目能帮我赚多少钱——说实话,目前还没赚到一分钱。而是因为,在这个过程中,我重新找到了那种"搞技术"的纯粹的快乐。

你还记得你第一次写出一段能跑的代码时的感觉吗?你还记得你第一次调通一个模型时的兴奋吗?你还记得你第一次部署一个项目上线时的成就感吗?

那种感觉,跟年龄无关,跟薪资无关,跟 KPI 无关。那是一种"我在创造一些东西"的满足感。

这种满足感,是带两个娃的疲惫生活里,为数不多的光亮。


最后,如果你也是一个在生活的缝隙里还在坚持学技术的程序员,我想对你说:

别放弃。

不是因为坚持就一定能成功——这碗鸡汤太假了。而是因为,坚持本身,就是一种对抗平庸的方式。

这个世界变化太快了,AI 在进化,行业在洗牌,35 岁的焦虑像一把悬在头顶的剑。但只要你还在学,还在写,还在创造,你就还没有输。

好了,不说了,大宝要醒了,我得去准备早饭了。

我是老周,一个在浦东出租屋里用代码对抗生活的二娃奶爸。

我们下篇文章见。


项目技术栈总结:

  • 框架:PyTorch + MMPose
  • 模型:HRNet-w32(Fine-tuning)+ MobileNetV3(部署)
  • AI 辅助:Cline(代码开发)+ Midjourney V6(数据生成)
  • 部署:树莓派 4B + ONNX + OpenCV DNN
  • 总耗时:约 4 个月(利用深夜和周末时间)
  • 总花费:硬件约 500 元,Midjourney 订阅约 200 元

评论 0

最热最新
暂无评论
AICodeLv.1
0
影响力
0
文章
0
粉丝