本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。
原文链接:基于YOLOv8检测培养皿中细菌菌落
在培养皿中寻找细菌菌落是药物制造过程中控制生产环境无菌性的常规方法。经过几次模型选择试验,我成功训练出一个 YOLOv8 模型,其准确率为 76%,召回率为 99%。这种性能足以满足药物制造的需求,目前唯一阻碍实际应用的因素是缺乏用于拍摄图像的自动硬件。
简 介
在培养皿中发现细菌菌落是控制药物制造过程中无菌性的常规方法。将样品加入装有琼脂凝胶的培养皿中,然后将其放入培养箱中以促进细菌生长。此后约 2 周,技术人员每天检查培养皿,如果发现培养皿上有菌落,则记录下来。发现菌落会引发调查和纠正措施,因为这意味着样品或环境不无菌——这对制药制造业来说是一个大问题。这种测试非常主观,只是人类所说的他们所看到的,而技术人员的动机往往相互矛盾,因为他们是处理发现污染后果的人。
制药公司可能有兴趣使用计算机视觉和机器学习来生成更客观的记录并做出更少偏见的决策。这是一个召回驱动问题的案例:遗漏受污染的盘子比将阴性盘子标记为“阳性”要糟糕得多。如果人工智能辅助识别出不少于 99% 的受污染盘子(召回率 >99%),人们可以考虑使用它。准确率不那么重要,因为所有阳性病例无论如何都会由人类专家审查。尽管如此,准确率应该保持在约 30% 以上,以确保提议的工具显著减少人工审查人员的工作量。
数 据
该数据集包含 4421 张 3 通道图像 ~ 1500x1500 像素。371 张图像中有细菌菌落,4050 张没有。专家对每张图像进行了标记,给出了菌落数量。许多照片是同一块盘子,拍摄间隔约 24 小时,但许多盘子在数据集中出现过一次。该数据集是在欧洲一家生产放射性药物的工厂的日常运营过程中收集的,并以实物形式共享用于研究目的。
该数据集的主要挑战在于大量与细菌无关的图像伪影:LED 反射、记号笔痕迹、胶带、琼脂裂缝等。其中许多特征看起来与细菌菌落相似。另一个挑战是菌落非常多样化,从几毫米宽的模糊点到几乎覆盖整个培养皿表面的团块。10 倍的类别不平衡也无济于事。
为了避免数据泄露,我们将数据集分为保留测试和训练验证子集。测试集保留用于最终模型评估,我们不会将其用于训练或验证。训练集包括 300 张含有细菌的图像和 3479 张不含细菌的图像。

图像预处理
大约一半的图像区域被无关特征占据:车牌边缘和 LED 反射。这在训练过程中浪费了大量计算能力。裁剪掉不相关的图像部分并调整对比度的预处理可以改善训练过程。简而言之,它包括以下步骤:
-
-
使用霍夫变换,找到最多 100 个大致位于图像中心并与琼脂培养基区域大致重合的圆圈。
-
通过找到径向维度上亮度增加最快的圆,选择与介质区域最吻合的圆。
-
将最佳圆外的图像设置为 0,将图像裁剪到边界正方形,并标准化分辨率。
-
调整图像对比度来突出显示通常与菌落相关的亮度区域。
-

基线模型:CNN 分类器
最低限度合理的卷积神经网络作为基准模型。它由四个卷积层和两个密集层组成。使用 5 倍交叉验证,该网络训练在 Google Colab TPU 运行时上仅需大约 100 分钟。

要了解预处理是否有意义,可以比较在原始数据集和预处理数据集上训练的模型。这里选择的指标是精确度-召回率曲线,通过改变将图像称为“阳性”的概率阈值构建。为了了解性能的变化,进行了 5 倍交叉验证以测量精确度和召回率的平均值和标准差。预处理数据集的变化较小,但召回率也较低,这可能是由于某些图像裁剪不准确造成的。在 0.05% 的阈值下,该模型在预处理数据集上的精确度为 0.316,召回率为 0.844。在原始数据集上,精确度为 0.280,召回率为 0.942。在这两种情况下,模型都没有在任何正阈值下达到所需的 99% 召回率,突显了问题的复杂性。


迁移学习:EffNet B0 作为分类器
EffNet 模型系列是为图像分类问题开发的最先进的 CNN 架构之一,是迁移学习方法的完美选择。EffNet 最轻量的 B0 变体设计用于 224x224 图像。预处理在基线情况下似乎没有太大帮助,因此没有必要再次使用它。相反,尝试两种数据集增强方法似乎是个有趣的想法。首先,来自 scklearn 库的两个增强层:旋转和对比度调整。自定义增强在第二个实验中补充了标准 sklearn 工具。它包括将正图像叠加在随机负图像上。对每个正图像重复 20 次,通过添加多个合成正图像有效地平衡数据集。


结果表明,B0 模型的性能比简单的 CNN 更稳定。在 5 倍交叉验证中,阈值范围内的标准差要小得多,但平均性能并没有显著提高。使用库提供的增强功能,B0 模型在阈值为 0.05% 时实现了 0.329 的精度和 0.911 的召回率。添加自定义增强功能后,性能更加稳定,平均精度为 0.219,召回率为 0.951。这比基线好很多,但 95% 的召回率仍然太低。漏掉 5% 污染情况的模型在质量控制应用中不会获得太多信任。
迁移学习:EffNet B5 作为分类器
B5 EffNet 模型是 B0 的姊妹模型,用于处理 456x456 图像。它的计算量要大得多:使用自定义增强功能,即使冻结所有不可训练层,在 V100 Google Colab 运行时上训练此模型也需要大约 4 个小时。由于计算成本,我们无法再进行 5 倍交叉验证,考虑到在 B0 上观察到的严格标准偏差,这可能没问题。相反,在初始训练运行之后,我们将时间花在以 0.0001 的低学习率对未冻结的模型进行微调上。


B5 模型的表现明显优于 B0 模型。微调后的模型在阈值为 0.125% 时,精度为 0.174,召回率为 0.977。未经微调的模型在相同阈值下精度为 0.124,召回率为 0.955。如果没有交叉验证,很难说差异是否显著。不过,这对于生产来说还不够好。虽然 98% 的召回率几乎有用,但 16% 的精度还不够高。生产人员必须审查几乎与以前相同数量的图像,因此将这种 AI 添加到他们的工作流程中不会有任何好处。
YOLOv8 物体检测器
原始问题可以定义为对象检测,尽管它本质上是一个分类问题。最终,决策是二元的:样本要么被污染,要么没有被污染,要么适合在临床上使用,要么不适合。然而,对象检测算法会更细致地观察图像,这可能是有益的。一旦模型检测到菌落,我们就可以使用阈值将问题带回到分类领域。
YOLO 是一种流行的对象检测架构,由 Ultralytics 开发。由于其速度快,并且 Ultralitics 提供了方便的 Python API,它已成为首选模型。大量出版物解释了该模型的内部工作原理;这篇博客文章尤其出色。
缺乏用于训练的标记数据集是本例中的主要障碍,这种情况通常如此。专家提供了每张图片的菌落数量,但 YOLO 需要物体周围的边界框。手动标记 4000 张图像并不好玩,因此开发了一种半自动化方法。首先,我标记了大约 200 张图像,在这个小数据集上训练模型,然后使用这个第一个模型标记更多图像。模型标记的图像还不错,经过几次修正后,我生成了一个带有边界框的约 1000 张图像的数据集。额外的工作是标记菌落和常见伪影。拥有看起来像菌落但实际上不是菌落的例子有助于模型做出更准确的预测。这张图片就是一个很好的例子:

图片中有一个菌落,但图片中央还有一个盘子的注塑模具浇口。经验不足的人可能会把浇口误认为是菌落,提供此背景信息可以提高模型性能。
数据集准备遵循了为 CNN 方法开发的路径。首先,将训练集分为正例和负例,然后从两者中随机选择图像来对比训练和验证数据集。这样,我就避免了在如此不平衡的数据集中很容易出现的正例随机代表性不足的情况。然后,我对训练数据集应用了简单的增强,垂直和水平翻转每幅图像,并随机调整亮度。这种增强使我的训练集增加了 3 倍,而验证集保持不变。
使用 Collab 的 T4 训练了大约 50 个时期后,验证准确率不再提高,有用的 Keras 回调停止了训练。通过这个模型运行完整的数据集,我计算了专家和模型在图像中检测到或未检测到任何菌落的意义上达成一致的次数。
结果比 CNN 分类器有了明显的改进。该模型的召回率为 99%,准确率为 73%,这意味着每 100 个受污染样本中只有 1 个会被遗漏,并且每 4 个被标记为受污染的样本中就有 3 个值得人工注意。以下是输出的几个示例。

第一个例子是完美执行的物体检测的情况:模型正确识别了 7 个菌落中的 7 个,并没有被标记、气泡、 LED 眩光、胶带等混淆。下一个是模型错过一个菌落的例子,可能是因为它与图像周边通常存在的 LED 眩光非常相似。

THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

299

被折叠的 条评论
为什么被折叠?



