3周极速建站:计算机视觉系统零到一交付
|
跟产品经理吵完第三轮——他坚持“边缘检测要支持 SVG 导出”,我盯着他工位上那张用 Blender 渲染的鲸鱼跃出海面的壁纸,没说话。双屏左边是 PyTorch Lightning 的训练日志,右边是标注平台导出的 JSONL,壁纸右下角还挂着个半透明的倒计时小工具,标着“交付剩余:5天”。我抬手去按 F5,食指刚压下去,Ctrl 键卡了半秒,弹起来时带出一个多余的 Ctrl+R,页面重载闪了一下,GPU 利用率曲线掉下去又猛地顶回来——这个我敢打包票,就是那一刻,batch size 暴涨到 32,把后端预处理队列直接捅穿。 优胜劣汰?呵。去年三月那个项目,我们拿三周跑完 CV 系统从 zero 到 one,不是靠什么方法论,是靠人堆着崩坏阈值硬撞。第一天搭 Docker Compose,测试蹲在隔壁桌啃三明治,酱汁滴在键盘上,正好糊住 Delete 键。第二天训第一版模型,label-studio 里上传三百七十二个节点的视频片段,PM 突然说“要不要加个光照鲁棒性开关”——我原以为是个 toggle,结果发现他意思是实时调整 gamma 校正系数并回传给前端 canvas,还要求拖拽滑块时延迟低于十八毫秒。我说不可能,他说“你先试试”。我试了。Chrome DevTools 切到了 Network tab,看 fetch 请求头里塞了个 X-Env-Light-Adapt: true,后端居然真接住了……然后在凌晨两点四十三分,整条 pipeline 因为一个 OpenCV cvtColor 的 color space 缺省值(BGR→RGB)和 WebAssembly 加速模块不兼容,在 Safari 17.3 上静默挂掉——但 Chrome、Edge、Firefox 全过。这事儿我说不准,反正 QA 那天没报,是后端自己查日志翻出来的,他当时正在用保温杯倒水,水溅到键盘上,顺手擦了擦,说:“算了,上线再说。”
文章配图,仅供参考 桌上那盒酸辣粉汤洒了一滴,在 Mac mini 的散热格栅旁边洇开一小片黄晕。我盯着那滴汤,忽然想起上周五 PR review,那个实习生提了个 commit:把 detectron2 的 inference config 里 test.detections_per_image 从一百改成了两百。没人拦。没人问为啥。就 merge 了。后来上线第一小时,OOMKilled 报警响了六次。这不是重点——重点是他改的时候,文档注释里还写着“参考 PASCAL VOC baseline”,而我们压根没 VOC 数据。这种细节,连吐槽都懒得起个头。我们早就不信 baseline 了,只信 last successful build。但 last successful build 是哪一版?没人记得清。我们只记得三周里哪天没烧服务器,哪天 GPU 卡住超二十分钟,哪天有人在 Slack 频道发了个表情包,配文:“loss 收敛了,但我老婆今天产检,我没去。”我昨天翻旧 branch,发现 train.py 里埋着一句 # TODO: refactor resize strategy —— 时间戳是三月七号下午四点零二分。现在是三月二十七号,系统已上线十一天,每天处理八千六百帧工业缺陷图,准确率在 92.4% 到 94.1% 之间浮动。那个 resize strategy 还没动。但它跑得比当年在 lab 里调三天三夜的那个“完美双线性插值+ROI align”的版本还稳。为什么?因为那版太干净了,干净得容不下现场光线抖动、镜头镀膜老化、USB3.0 供电不足带来的帧丢弃。而我们现在这个,resize 是靠 if 块硬切的:if img.shape[0] > 1080: resize to 720p;else if width < 320: skip;else just bilinear。没有注释。没有单元测试。只有三个 hardcode 数字,写死在代码段最底下一行,像钉进木头里的铁钉。我敢打包票,它不会崩——不是因为设计好,是因为它已经崩过十四次,每一次崩都筛掉了一种我们没见过的设备组合。 前两天测到某型号海康 IPC 的 MJPEG 流,timestamp 解析会偶尔跳变负值,前端 video.srcObject 会突然黑屏两帧。解决办法?不是修 timestamp,是让前端在 onplay 事件里偷偷 setTimeout(() => { play() }, 3),强行续命。这个 patch 是测试写的,她边敲边念叨“这跟 CSS 命名有什么区别”,说完把 .video-frame-wrapper--with-fallback 写进了 SCSS 文件。我现在看到 class 名里带 --fallback 就想笑。真的有用吗?不知道。它只是没再报警。我们所有“稳定”,都是这么被漏掉的报警撑起来的。三周交付,本质不是建站,是批量报废冗余路径——那些想“优雅支持所有场景”的代码,全死在第十二天。活下来的,全是带着创口结痂、歪着脖子喘气、但能吐出结果的残兵。 PM 刚给我发消息,说客户想看热力图叠加 AR 叠加。我回他:“行,你拉个需求评审,我带笔记本过去。”——其实我想说的是:别急,先看看你壁纸右下角那个倒计时,它刚把“交付剩余:0天”刷成了“逾期:+2天”。但这话不能说。说了他就得重启排期,重启排期就得动 backend 的 batch queue timeout,timeout 一动,上次那个因 GPU 内存碎片化导致的推理延迟毛刺,又得重新定位。我懒得再翻 nvidia-smi 里那些诡异的显存地址跳跃了。反正今晚我回家前,得先把双屏左边那张鲸鱼壁纸换掉——它尾巴太翘,看着就不稳。 现在我要去重装 Chrome 插件了。刚才发现 Vue DevTools 不识别我们自研的 hooks,但 React Profiler 能捕到 tensor 张量形状变化。这事我还没告诉任何人。你要是看见我桌面右下角多了一个绿色悬浮窗,写着“tensor trace v0.3b (not for prod)”,别点。它会在你切 Tab 的瞬间,往 localStorage 里塞五百一十二个 key,每个 key 都叫 __debug__shape_——这玩意儿,上线前删掉就行。至于删不删……我先去泡杯茶。外卖盒还在桌上,汤那一滴,已经干了,缩成一小粒琥珀色圆点,像一颗没引爆的定时器。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

