← 文章
「生信软件」

microbial-colony-counter:培养皿菌落自动计数与批次参数学习

做微生物实验经常要数培养皿菌落,一次实验几十个平板,全靠人工点一点很崩溃。默认参数自动数又经常偏多偏少——光照、对焦、菌落疏密一变就不稳。最近把 microbial-colony-counter 推到了 v1.1.2,核心是:用少量参考盘的人工真值,为本批次搜一套参数,再批量数其余平板。这里记录一下工具介绍、近期更新和开发时的想法。

1. 这个工具是干什么的

microbial-colony-counter 是一个 培养皿菌落自动计数 工具,当前正式版 v1.1.2(MIT)。

主要能力:

  • 多格式图片:JPG / PNG / BMP / TIFF
  • OpenCV 自动检测与计数
  • 参数可调:模糊、阈值、面积、边缘距离、圆度等
  • 矩形/圆形 ROI;可选自动检测培养皿圆
  • 分水岭分离粘连菌落
  • 桌面 GUI + 局域网 Web(手机浏览器也能用)
  • 批次参数学习(v1.1.1 / v1.1.2):参考盘真值 → 搜参数 → 批量计数

依赖与启动:

git clone https://github.com/Caizhaohui/microbial-colony-counter.git
cd microbial-colony-counter
pip install -r requirements.txt

# 桌面版
python main.py

# Web 版(同局域网手机可访问)
python web_launcher.py

Windows 也可以双击 run_gui.bat / start_web_app.bat。Release 里有 Windows 打包:ColonyCounter-Desktop-v1.1.2-win64.exe

2. 为什么要「学习参数」而不是死磕默认值

传统自动计数靠一组固定默认参数(模糊核、阈值、面积上下限、是否分水岭……)。实际痛点很明确:

  1. 拍照条件敏感:光照、对焦、角度一变,同一套默认参数就漂
  2. 密菌落粘连:固定阈值/分水岭很难兼顾
  3. 实验是成批的:一次几十个平板,菌种、培养基、拍摄方式往往很像

所以更合理的不是追求「一张图打天下」,而是:

用少量已有真值的参考盘,为本批次搜一套 theta*,再把 theta* 套到其余平板上。

这不是云端大模型,而是 批次内的参数标定 / 少样本校准(Few-shot Calibration):可解释、本地跑、和现有 OpenCV 流水线兼容,也不上传数据。

搜索的大致是 process_image 的超参数:

类别示例
预处理高斯模糊核大小
二值化手动 / 自适应阈值
过滤最小/最大面积、边缘距离、最小圆度
结构是否检测培养皿圆、是否分水岭

单盘目标可以粗写成:

找到 theta*,使  | count(I, theta) - N |  尽量小

实现上还会加相对误差、可选点匹配分,避免「总数碰巧对了,圈的却是杂质」这种假准。

3. 最近更新:v1.1.1 → v1.1.2
3.1 v1.1.1:批次标定工作台(学习闭环)

解决的是:只有默认参数或手滑调条,成批实验重复劳动多。

闭环:

  1. 打开桌面主程序 → 「📦 批次标定」
  2. 提供参考盘真值(部分点选+N / 全量点选 / 仅填 N)
  3. 参数搜索得到 theta*
  4. 批量计数其余平板
  5. 导出 CSV、保存参数 JSON,可选应用到主窗口

新增模块大致是:

  • backend/core/calibrator.py — 参数搜索与评分
  • backend/core/batch.py — 多图套同一套参数
  • backend/core/pointset.py — 点集与标注
  • batch_workbench.py — 桌面工作台

兼容原则:原有单图计数、ROI、培养皿检测、分水岭、Web 都保留,批次学习是增量入口。

3.2 v1.1.2:多参考盘联合标定(当前重点)

v1.1.1 只能用 一块 参考盘时,参数容易 过拟合那一块,换盘就漂。

v1.1.2 支持 1~5 块参考盘同时参与搜索(建议 2~5),目标是让各盘误差的 平均值 最小:

找到 theta*,使 (1/K) * (Loss_1 + ... + Loss_K) 最小
能力说明
多参考盘最多 5 块,建议 2~5
主路径每块 图 + 人工总数 N
点选增强列表切换当前盘,左键加点 / 右键删点(可选)
结果透明每盘预测 vs 真值、单盘误差、平均/最大误差
上限保护超过 5 块拒绝并提示

工作台从「加载单张」改成了 参考盘列表(添加 / 移除 / 切换 / 保存 N),按钮是 「联合学习 / 标定」。底层是 calibrate_multi(),单盘 calibrate() 复用同一套逻辑。

4. 批次学习怎么用(v1.1.2)
python main.py
# 工具栏 → 「📦 批次标定」

步骤:

  1. ➕ 添加参考盘…(可多选,最多 5 块),每块填人工菌落数 N
  2. (可选)列表里选中某盘,左键点几个典型菌落作增强
  3. 「联合学习 / 标定」,看各盘误差是否可接受
  4. 添加其余平板 → 批量计数 → 导出 CSV / 保存参数 JSON
  5. 可选:应用到主窗口,用学到的参数再做单张细调

点选快捷键:左键加点 · 右键删最近点 · Ctrl+Z 撤销。

冒烟测试:

python backend/test_calibrator.py
5. 真值怎么给、边界在哪
方式操作适用
图 + 总数 N(主路径)上传图,填人工数完的 N最快;多盘联合首选
部分点选 + N点若干典型菌落,并填 N密菌落、杂质多时更稳
全量点选点完所有菌落(N = 点数)单盘精标

点选不是必须。默认推荐 图 + N;难盘再点选增强。

使用边界(很重要):

  • 学习结果 按批次有效:换菌种、培养基、相机或光照,请 重新标定
  • 参考盘与待测盘尽量 同条件
  • 只拟合总数时缺少位置信息,密菌落建议对 1~2 块难盘做点选
  • 这是经典视觉参数搜索,不是深度学习,数据不出本机

和「纯默认参数」比:

默认参数直接数参考盘参数学习
准备成本人工数 1~5 块参考盘
同批次多盘可能整体偏多/偏少向真值对齐后更稳
可解释性手调滑条给出 theta* 与每盘误差
适用场景单张试探一次数十个平板的实验批次
6. 单图自动计数(原有能力)

批次学习之外,主窗口还是完整的单图流程:

  1. 选图 → 调参 →(可选)选区 → 处理
  2. 看结果 / 菌落详情 → 保存报告
类别参数说明
预处理高斯模糊核去噪,建议 3–15 奇数
二值化手动 / 自适应光照不均优先自适应
培养皿自动检测圆只统计皿内
过滤面积、边缘距离去噪点与边缘伪影
高级分水岭、最小圆度粘连与形状
7. 开发路径与踩坑

这条线也是被真实实验推着长的,大致阶段:

阶段解决什么收获
v1.0.0桌面 + Web 自动计数可用OpenCV 流水线:模糊→阈值→轮廓→过滤
v1.1.0Web 与桌面能力对齐、性能缩略图传输、异步线程池、处理尺寸限制
v1.1.1成批实验不想每张手调参考盘真值 → 参数搜索 → 批量套用
v1.1.2单盘过拟合多盘联合最小化平均误差

几个比较深的体会:

1)别迷信「通用默认参数」

实验室拍照条件千差万别。与其做一套永远不够用的默认值,不如承认 批次内标定 更符合使用方式。

2)真值可以很轻

不一定要全图点完。很多时候 人工总数 N 就够启动搜索;难盘再加点选。准备成本低,闭环才转得起来。

3)单盘拟合会骗人

一块盘误差很小,不代表下一块也准。v1.1.2 把目标改成多盘平均误差,并报告 最大盘误差,过拟合更容易被发现。

4)增量功能比推倒重来重要

单图计数、ROI、Web 已经有人在用。批次标定做成独立工作台入口,旧流程不破坏,心理负担小很多。

5)可解释 > 黑盒准一点点

参数搜索给出的是阈值、面积、是否分水岭这类人能看懂的量。实验记录里能写清「这批用了哪套 JSON」,比端到端模型更贴实验室习惯。

项目结构(核心):

microbial-colony-counter/
├── backend/core/
│   ├── algorithm.py      # 核心计数
│   ├── calibrator.py     # 单盘 / 多盘参数学习
│   ├── batch.py          # 批量套用
│   └── pointset.py       # 点选
├── main.py               # 桌面主程序
├── batch_workbench.py    # 批次工作台
├── web_launcher.py
└── 开发计划-批次标定.md
8. 小结

microbial-colony-counter 更适合:

  • 培养皿照片的自动 / 半自动菌落计数
  • 一次实验几十个平板、拍摄条件相近的批次
  • 需要本地运行、结果可解释、能导出 CSV 的场景

最近重点是 v1.1.1 批次标定闭环v1.1.2 多参考盘联合学习。后面如果继续改,大概会优先:更稳的密菌落点匹配、Web 端批次标定入口、以及更细的失败原因报告。

欢迎 Issue / PR。用到类似场景时,先人工数 2~3 块参考盘再批量跑,通常比死磕默认参数省心得多。

原文链接: https://github.com/Caizhaohui/microbial-colony-counter