从被裁到远程搞CV项目:一个老程序员的架构踩坑实录
去年十月,我坐在北京国贸附近一间不到20平的出租屋里,盯着电脑屏幕上那封HR发来的邮件——“组织架构调整”、“N+1补偿”、“感谢贡献”。那一刻,窗外正下着冷雨,我手里的半杯瑞幸已经凉透。月薪15k没了,房租3500还得照交,老婆在老家刚怀上二胎。说实话,当时真的很焦虑,差点想转行去送外卖。
但程序员嘛,总得有点倔劲儿。我跟老婆视频聊了半小时,她说:“要不回来吧?咱家三楼空着,你在家办公,省下的房租够买两罐奶粉。”于是,我收拾行李,带着一台MacBook Pro和一摞技术书,回到了南方小城的老家。
面试题挑战?不,是生存挑战
回到老家第一周,我投了47份简历,面试了8家公司。有家初创公司CTO问我:“你做过计算机视觉项目吗?比如YOLO或者OpenCV那种?”我老实回答:“工作中用过,但没从零搭过完整pipeline。”对方笑了笑:“那可能不太符合我们对‘实战经验’的要求。”
挂掉电话后,我翻出床头那本《深度学习入门:基于Python的理论与实现》(斋藤康毅著),书页都卷边了。突然意识到:光会调API不行,得自己动手造轮子。于是,我给自己定了个目标:三个月内,用Python从零搭建一个完整的计算机视觉项目,不仅能跑通,还要能讲清楚架构设计。
这不就是一场现实版的“面试题挑战”吗?只不过考官是我自己,题目是“活下去”。
动手干:一个车牌识别系统的诞生
我选了个经典场景——车牌识别。别笑,这玩意儿看似简单,其实涉及图像预处理、目标检测、字符分割、OCR识别、后处理校验……一整套CV pipeline全齐了。
第一周:算法选型纠结症
我翻遍了GitHub,对比了三种方案:
- 传统方法:OpenCV + SVM
- 轻量级深度学习:YOLOv5 + CRNN
- 端到端Transformer:ViT + DETR(太重,pass)
最后决定用YOLOv5做检测,CRNN做识别。为什么?因为我家宽带只有100M,GPU是GTX 1660 Super(还是五年前买的),得考虑部署成本。架构设计第一条铁律:不要为了炫技而牺牲可用性。
第二周:数据哪来?
公开数据集?太干净。真实场景里,车牌可能是斜的、模糊的、反光的,甚至被泥巴糊住一半。我厚着脸皮找老家做停车场系统的朋友要了2000张脱敏图片,又用手机在小区车库拍了500张。标注工具用LabelImg,每天晚上9点孩子睡了才开工,一边打哈欠一边框车牌,活像深夜值班的保安。
第三周:代码架构大翻车
一开始我把所有逻辑塞进一个main.py,结果改个阈值就要重启整个流程。某天凌晨2点,我改完一行代码,系统崩了,日志输出了一屏幕红色。老婆在隔壁喊:“又熬夜?明天还要陪产检!” 我默默删掉那坨屎山代码,重新设计模块:
plate_recognition/
├── config/ # 配置文件
├── data/ # 数据加载与增强
├── models/ # YOLOv5 + CRNN
├── pipelines/ # 核心流程
│ ├── detection.py
│ ├── recognition.py
│ └── postprocess.py
├── utils/ # 工具函数
└── app.py # 启动入口
这次用了工厂模式+策略模式,检测和识别模块完全解耦。以后想换模型?改个配置就行。架构不是画PPT,是给未来的自己留条活路。
Python不是玩具,是生产力工具
很多人觉得Python就是脚本语言,写点小工具还行。但在这次项目里,我彻底改变了看法。
- 用
hydra管理多环境配置(开发/测试/生产) - 用
torchserve打包模型成REST API - 用
pytest写单元测试,覆盖了90%的边界case(比如输入一张纯黑图会不会炸) - 甚至用
streamlit做了个简易前端,老婆都能上传照片试玩
最骚的是,我把整个项目打包成Docker镜像,推到阿里云ECS上。现在老家小区物业想试试智能停车,直接docker run就能跑起来。Python生态的强大,在于它能把算法快速变成产品。
从算法到架构:别只盯着loss下降
很多初级工程师(包括曾经的我)以为CV项目就是调参让mAP涨0.5。但现实是:算法只是冰山一角,水下才是架构的战场。
举个例子:车牌识别经常遇到“粤B88888”被识别成“粤B8888B”。怎么办?
- 初级做法:加更多训练数据
- 中级做法:在CRNN后加语言模型校正
- 我的做法:在
postprocess.py里加规则引擎——如果最后一位是字母,且前五位全是数字,就强制修正为数字(因为国内车牌格式固定)
这个规则引擎后来成了项目的亮点。面试时,我说:“我们用20行Python规则,替代了需要上万样本才能学到的先验知识。” 面试官眼睛一亮。
好的架构,懂得在算法做不到的地方,用工程智慧补位。
意外收获:面试逆袭
今年三月,我拿着这个项目去面一家做智慧城市的公司。终面时,CTO让我白板画架构图。我没画什么高大上的微服务,而是掏出手机打开Streamlit界面:“您看,这是我家车库实时识别效果——刚才那辆特斯拉,车牌‘粤A·D12345’,识别耗时0.8秒。”
他愣了一下,问:“你自己做的?”
“从数据采集到部署,一个人,三个月,老家书房。”
最后谈薪时,HR说:“本来预算20k,但你的项目展示了端到端能力,给到22k,接受吗?” 我想起北京那间3500块的出租屋,笑了:“接受,但我得远程办公。”
写在最后:技术人的长期主义
回头看这段经历,我最大的感悟不是“学到了多少算法”,而是明白了技术的价值在于解决问题,而不是堆砌术语。
那些深夜调试的崩溃、被拒的失落、重构代码的烦躁……现在都成了简历上轻描淡写的一行字。但正是这些“脏活累活”,让我从“API调用员”变成了能独立负责模块的工程师。
如果你也在焦虑职业发展,不妨试试:
- 选一个小而真实的场景(别一上来就想做人脸支付)
- 用Python把全流程跑通(哪怕很简陋)
- 重点思考架构如何支撑迭代(今天加个功能,明天换模型)
- 把项目变成你的“作品集”(比刷100道LeetCode更有说服力)
技术没有捷径,但有路径。而这条路,往往始于你关掉招聘软件,打开IDE的那个夜晚。
我现在每天早上送完孩子上学,泡杯茶,坐在阳台上coding。远处是青山,近处是代码。偶尔老婆会端来一碗汤:“别光顾着写你的‘车牌’,记得吃饭。” 我笑着保存代码,心想:这日子,好像也不赖。
共勉。

评论 0