用CV做医疗影像初筛?上周差点被产品经理送走

产品和代码之间
2026-03-28 22:36
阅读 2542

作为一个在杭州某医疗软件公司搬砖的Python后端,平日里主要和DICOM、HL7、FHIR这些“老古董”协议打交道。虽然名义上是后端,但团队小、人手紧,加上我对前端动画有点执念(至今还在研究Three.js怎么优雅地渲染3D器官模型),经常被迫“全栈化”。上周五晚上十点,我正用VSCode调一个React组件的贝塞尔曲线过渡——插件装了三十多个,光Prettier和ESLint就吵了半年——产品经理突然甩来一句话:“能不能搞个计算机视觉模型,自动识别X光片里的肺炎区域?双11前上线。”

我当时差点把咖啡喷到MacBook键盘上。不是,兄弟,我们是做医院HIS系统的,不是AI Lab啊!

但架不住老板画饼:“这项目要是成了,年底奖金翻倍。” 行吧,为了那点子虚乌有的“翻倍”,我硬着头皮接了。

从零开始:Prompt工程救我狗命

说实话,我对CV真不算熟。大学学过OpenCV,工作后主要用PyTorch写些NLP小模型。这次要处理的是公开数据集ChestX-ray14,包含10万多张胸部X光片,标注了14种疾病,其中肺炎是我们重点目标。

第一步,我得快速搭个baseline。这时候,GitHub Copilot 成了我的救命稻草。写个数据加载器,它直接给我补全了torchvision.transforms那一套;定义ResNet50微调结构,它连requires_grad=False都帮我写了。虽然有时候它会瞎猜(比如把nn.CrossEntropyLoss()写成回归损失),但配合Trae(最近超火的AI编程助手,比Copilot更懂上下文)一起用,效率翻倍。

不过真正让我少走弯路的,是Kimi。别误会,不是那个韩国明星,是月之暗面出的大模型。我发现它对医学图像任务特别敏感——可能训练数据里医疗文献多?当我问:“如何用迁移学习做胸部X光分类,数据不平衡怎么办?” 它不仅给出了SMOTE、Focal Loss这些方案,还贴心地附上了PyTych代码片段,甚至提醒我注意DICOM窗宽窗位调整对灰度分布的影响。

那一刻我悟了:Prompt工程不是玄学,是精准描述问题的能力。你越懂业务,AI越能帮你。比如我说“我们系统跑在医院内网,GPU只有T4,模型必须<100MB”,Kimi立刻推荐MobileNetV3 + ONNX量化,而不是一上来就推ViT-Large。

踩坑实录:从OOM到线上崩盘

理想很丰满,现实很骨感。

第一个坑:数据预处理。X光片不是普通RGB图,它是单通道16位灰度图,像素值动辄上万。我一开始直接用ToTensor(),结果模型输出全是NaN。查了半天才发现,得先做窗位映射(windowing):

def apply_window(image, window_center=40, window_width=400):
    min_val = window_center - window_width // 2
    max_val = window_center + window_width // 2
    image = np.clip(image, min_val, max_val)
    image = (image - min_val) / (max_val - min_val)
    return image

第二个坑:类别极度不平衡。10万张图里,肺炎阳性不到8%。我试了加权交叉熵,效果一般;后来用Focal Loss,mAP直接涨了7个点。这里感谢Kimi给的公式,不然我得翻半天论文。

第三个坑最致命:线上部署。模型在本地跑得好好的,一上Docker容器就OOM。运维大哥一脸鄙夷:“你这模型加载占2G内存,我们Pod只分了1.5G。” 我连夜用ONNX Runtime重写推理逻辑,配合动态批处理,总算压到800MB。测试时又发现,前端传来的Base64图片偶尔带Exif旋转信息,导致图像歪了90度……最后在Flask入口加了个Pillow自动校正,才搞定。

优化阶段 模型大小 推理时间(ms) mAP@0.5 内存占用
初始ResNet50 98MB 210 0.68 2.1GB
MobileNetV3 + Focal Loss 14MB 45 0.75 1.8GB
ONNX + 动态批处理 12MB 32 0.74 0.8GB

效果与反思:AI不是银弹

双11前两天,系统终于上线。我们做的不是诊断,而是初筛辅助——把疑似肺炎的片子标红,推给放射科医生优先看。第一周反馈不错,医生说漏诊率明显下降,尤其夜班时帮大忙。

但我也清醒得很:这玩意儿离“智能诊断”差十万八千里。有一次模型把肋骨骨折误判成肺炎(因为阴影形状相似),差点引发纠纷。后来我们加了置信度阈值(<0.85的不报警),并强制要求所有AI标记必须人工复核。

回头想想,这次项目能成,一半靠AI工具链:

  • GitHub Copilot 加速编码
  • Trae 帮我重构复杂逻辑(比如异步队列处理)
  • Kimi 提供领域知识和调参建议
  • Prompt工程 让我和AI高效对话

但另一半,还是——理解医疗场景的边界、知道什么能自动化、什么必须留给人类。毕竟,在医疗行业,一个false positive可能就是一条人命。

给同行的建议

如果你也在医疗IT公司,想搞AI落地,听我一句劝:

  1. 别追求SOTA模型,稳定性和可解释性更重要。医生不关心你mAP多高,只关心“为什么标红这张图”。
  2. 善用AI编程助手,但别当甩手掌柜。Copilot写出来的代码要逐行review,尤其涉及医疗数据。
  3. 和临床人员多聊天。我花三天跟放射科医生喝咖啡,比读十篇论文有用。
  4. 杭州机会多,但坑也多。阿里网易固然香,但医疗AI需要耐心,别被“三个月落地”的KPI忽悠瘸了。

最后,我的VSCode插件列表又更新了——刚装了个ONNX Visualizer,准备下周试试把模型推理流程画出来给产品经理看。希望他看完能放过我,别再提“做个CT三维重建”这种需求了……

(完)

P.S. 本文代码已脱敏上传GitHub,搜med-cv-pneumonia-screening就能找到。欢迎Star,但别fork后直接跑生产——我怕你被你们的产品经理送走。

评论 0

最热最新
暂无评论
产品和代码之间Lv.1
0
影响力
0
文章
0
粉丝