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. 为什么要「学习参数」而不是死磕默认值
传统自动计数靠一组固定默认参数(模糊核、阈值、面积上下限、是否分水岭……)。实际痛点很明确:
- 拍照条件敏感:光照、对焦、角度一变,同一套默认参数就漂
- 密菌落粘连:固定阈值/分水岭很难兼顾
- 实验是成批的:一次几十个平板,菌种、培养基、拍摄方式往往很像
所以更合理的不是追求「一张图打天下」,而是:
用少量已有真值的参考盘,为本批次搜一套 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:批次标定工作台(学习闭环)
解决的是:只有默认参数或手滑调条,成批实验重复劳动多。
闭环:
- 打开桌面主程序 → 「📦 批次标定」
- 提供参考盘真值(部分点选+N / 全量点选 / 仅填 N)
- 参数搜索得到 theta*
- 批量计数其余平板
- 导出 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
# 工具栏 → 「📦 批次标定」
步骤:
- ➕ 添加参考盘…(可多选,最多 5 块),每块填人工菌落数 N
- (可选)列表里选中某盘,左键点几个典型菌落作增强
- 点 「联合学习 / 标定」,看各盘误差是否可接受
- 添加其余平板 → 批量计数 → 导出 CSV / 保存参数 JSON
- 可选:应用到主窗口,用学到的参数再做单张细调
点选快捷键:左键加点 · 右键删最近点 · Ctrl+Z 撤销。
冒烟测试:
python backend/test_calibrator.py
5. 真值怎么给、边界在哪
| 方式 | 操作 | 适用 |
|---|---|---|
| 图 + 总数 N(主路径) | 上传图,填人工数完的 N | 最快;多盘联合首选 |
| 部分点选 + N | 点若干典型菌落,并填 N | 密菌落、杂质多时更稳 |
| 全量点选 | 点完所有菌落(N = 点数) | 单盘精标 |
点选不是必须。默认推荐 图 + N;难盘再点选增强。
使用边界(很重要):
- 学习结果 按批次有效:换菌种、培养基、相机或光照,请 重新标定
- 参考盘与待测盘尽量 同条件
- 只拟合总数时缺少位置信息,密菌落建议对 1~2 块难盘做点选
- 这是经典视觉参数搜索,不是深度学习,数据不出本机
和「纯默认参数」比:
| 默认参数直接数 | 参考盘参数学习 | |
|---|---|---|
| 准备成本 | 无 | 人工数 1~5 块参考盘 |
| 同批次多盘 | 可能整体偏多/偏少 | 向真值对齐后更稳 |
| 可解释性 | 手调滑条 | 给出 theta* 与每盘误差 |
| 适用场景 | 单张试探 | 一次数十个平板的实验批次 |
6. 单图自动计数(原有能力)
批次学习之外,主窗口还是完整的单图流程:
- 选图 → 调参 →(可选)选区 → 处理
- 看结果 / 菌落详情 → 保存报告
| 类别 | 参数 | 说明 |
|---|---|---|
| 预处理 | 高斯模糊核 | 去噪,建议 3–15 奇数 |
| 二值化 | 手动 / 自适应 | 光照不均优先自适应 |
| 培养皿 | 自动检测圆 | 只统计皿内 |
| 过滤 | 面积、边缘距离 | 去噪点与边缘伪影 |
| 高级 | 分水岭、最小圆度 | 粘连与形状 |
7. 开发路径与踩坑
这条线也是被真实实验推着长的,大致阶段:
| 阶段 | 解决什么 | 收获 |
|---|---|---|
| v1.0.0 | 桌面 + Web 自动计数可用 | OpenCV 流水线:模糊→阈值→轮廓→过滤 |
| v1.1.0 | Web 与桌面能力对齐、性能 | 缩略图传输、异步线程池、处理尺寸限制 |
| 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. 小结
- 培养皿照片的自动 / 半自动菌落计数
- 一次实验几十个平板、拍摄条件相近的批次
- 需要本地运行、结果可解释、能导出 CSV 的场景
最近重点是 v1.1.1 批次标定闭环 和 v1.1.2 多参考盘联合学习。后面如果继续改,大概会优先:更稳的密菌落点匹配、Web 端批次标定入口、以及更细的失败原因报告。
欢迎 Issue / PR。用到类似场景时,先人工数 2~3 块参考盘再批量跑,通常比死磕默认参数省心得多。
原文链接: https://github.com/Caizhaohui/microbial-colony-counter