作者 | Joseph Nelson
来源 | Medium
编辑 | 代码医生团队
按照本教程,只需要更改两行代码即可将对象检测模型训练到自己的数据集中。
计算机视觉正在彻底改变医学成像。算法正在帮助医生识别可能错过的十分之一的癌症患者。甚至有早期迹象表明胸部扫描可有助于COVID-19的识别,这可能有助于确定哪些患者需要进行实验室检查。
在本示例中,将逐步使用TensorFlow对象检测API训练对象检测模型。尽管本教程介绍了如何在医学影像数据上训练模型,但只需进行很少的调整即可轻松将其适应于任何数据集。
在此处直接跳到Colab笔记本。
https://colab.research.google.com/drive/1U3fkRu6-hwjk7wWIpg-iylL2u5T9t7rr#scrollTo=uQCnYPVDrsgx
示例各节如下:
在整个教程中,将使用Roboflow这个工具,该工具可以大大简化数据准备和训练过程。Roboflow对于小型数据集是免费的,因此在此示例中,已经准备就绪!
https://roboflow.ai/
示例数据集:血细胞计数和检测(BCCD)
示例数据集是364张细胞种群图像和4888个标记,用于识别红细胞,白细胞和血小板。最初是两年前由comicad和akshaymaba开源的,可在网站上获得。(请注意,与原始版本相比,Roboflow上托管的版本在标签方面进行了较小的改进。)
https://public.roboflow.ai/
https://blog.roboflow.ai/releasing-an-improved-blood-count-and-cell-detection-dataset/
通过Roboflow Public截屏。
幸运的是,该数据集已预先标记,因此可以直接为模型准备图像和注释。
了解患者的红细胞,白细胞和血小板的存在及其比例是确定潜在疾病的关键。使医生能够提高识别上述血球计数的准确性和通量,可以大大改善数百万患者的医疗保健!
对于自定义数据,请考虑以自动方式从Google图像搜索中收集图像,并使用LabelImg之类的免费工具对其进行标记。
https://github.com/tzutalin/labelImg
准备图像和注释
从数据收集到模型训练直接导致次优结果。数据可能有问题。即使没有,应用图像增强也会扩展数据集并减少过度拟合。
准备用于物体检测的图像包括但不限于:
与表格数据类似,清理和扩充图像数据比模型中的体系结构更改更能改善最终模型的性能。
看一下数据集的“运行状况检查 ”:
https://public.roboflow.ai/object-detection/bccd/health
可以清楚地看到数据集中存在大量的类不平衡。数据集中显示的红细胞比白细胞或血小板要多得多,这可能会导致模型训练出现问题。根据问题背景,可能还要优先确定一个类别而不是另一个类别。
而且图像大小都相同,这使得调整尺寸的决定变得更加容易。
当检查对象(细胞和血小板)在图像中的分布方式时,看到红血球遍布各处,血小板有些散布在边缘,白血球聚集在图像中间。鉴于此在检测RBC和血小板时,可能不希望裁剪图像的边缘,但是如果仅检测白细胞,则边缘显得不太重要。还想检查训练数据集是否代表样本外图像。例如,能否期望白细胞通常集中在新收集的数据中?
对于自定义数据集,请按照此简单的分步指南将图像及其注释上载到Roboflow 。
https://blog.roboflow.ai/getting-started-with-roboflow/
创建TFRecords和标签图
将使用Faster R-CNN的TensorFlow实现(稍后对此进行更多说明),这意味着需要为TensorFlow生成TFRecords才能读取我们的图像及其标签。TFRecord是一种文件格式,其中包含图像及其注释。它在数据集级别进行了序列化,这意味着为训练集,验证集和测试集创建了一组记录。还需要创建一个label_map,它将标签名(RBC,WBC和血小板)映射为字典格式的数字。
坦白说,TFRecords有点麻烦。作为开发人员,时间应该集中在微调模型或使用模型的业务逻辑上,而不是编写冗余代码来生成文件格式。因此,将使用Roboflow只需单击几下即可生成TFRecords和label_map文件。
首先,访问将在此处使用的数据集:网站(请注意,使用的是特定版本的数据集。图像已调整为416x416。)
https://public.roboflow.ai/object-detection/bccd/1%E2%80%8B
接下来,点击“下载”。系统可能会提示使用电子邮件或GitHub创建免费帐户。
在下载时,可以以多种格式下载并在本地下载到您的计算机,或生成代码段。就目的而言,要生成TFRecord文件并创建一个下载代码段(而不是本地下载文件)。
导出数据集
将获得一个要复制的代码段。该代码段包含指向源图像,其标签以及分为训练,验证和测试集的标签图的链接。
对于自定义数据集,如果按照分步指南上传图像,则系统会提示创建训练有效的测试分割。还可以将数据集导出为所需的任何格式。
训练模型
将训练更快的R-CNN神经网络。更快的R-CNN是一个两阶段的对象检测器:首先,它识别感兴趣的区域,然后将这些区域传递给卷积神经网络。输出的特征图将传递到支持向量机(VSM)进行分类。计算预测边界框和地面真值边界框之间的回归。尽管有更快的R-CNN,但它的名称却比其他一些推理方法(例如YOLOv3或MobileNet)慢,但准确性更高。
更快的R-CNN是TensorFlow对象检测API默认提供的许多模型架构之一,其中包括预先训练的权重。这意味着将能够启动在COCO(上下文中的公共对象)上训练的模型并将其适应用例。
TensorFlow甚至在COCO数据集上提供了数十种预训练的模型架构。
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md#coco-trained-models
还将利用Google Colab进行计算,这是一种提供免费GPU的资源。将利用Google Colab免费提供GPU计算(长达12小时)。
Colab笔记本在这里。基于GitHub的仓库在这里。
https://colab.research.google.com/drive/1U3fkRu6-hwjk7wWIpg-iylL2u5T9t7rr#scrollTo=uQCnYPVDrsgx
https://github.com/roboflow-ai/tensorflow-object-detection-faster-rcnn
需要确保使用自己的Roboflow导出数据更新单元格要求的代码片段。除此之外,笔记本还是按原样训练的!
关于此笔记本电脑,需要注意以下几点:
在使用BCCD的示例中,经过10,000个步骤的训练后,在TensorBoard中看到以下输出:
一般而言,损失在10,000个纪元后继续下降。
正在寻找合适的盒子,但是可能会过度拟合。
在这个例子中,应该考虑收集或生成更多的训练数据,并利用更多的数据扩充。
对于自定义数据集,只要将Roboflow导出链接更新为特定于数据集,这些步骤将基本相同。留意TensorBoard输出是否过拟合!
模型推论
在训练模型时,其拟合度存储在名为的目录中./fine_tuned_model。笔记本中有一些步骤可以保存该模型拟合-通过本地下载到计算机,或者通过连接到Google云端硬盘并在其中保存模型拟合。保存模型的拟合度不仅使能够在以后的生产中使用它,而且甚至可以通过加载最新的模型权重从上次中断的地方继续进行训练!
在这个特定的笔记本中,需要将原始图像添加到/ data / test目录。它包含TFRecord文件,但希望模型的原始(未标记)图像进行预测。
应该上传模型未见的测试图像。为此可以将原始测试图像从Roboflow下载到本地计算机,然后将这些图像添加到Colab Notebook中。
重新访问数据集下载页面:
https://public.roboflow.ai/object-detection/bccd/1
点击下载。对于格式,请选择COCO JSON并在本地下载到自己的计算机上。(实际上可以下载非TFRecord的任何格式,以将原始图像与注释格式分开!)
一旦在本地解压缩该文件,将看到测试目录原始图像:
现在在Colab笔记本中,展开左侧面板以显示测试文件夹:
右键单击“测试”文件夹,然后选择“上传”。现在可以从本地计算机中选择刚刚下载的所有图像!
在笔记本中,其余单元格将介绍如何加载创建的已保存,训练有素的模型,并在刚刚上传的图像上运行它们。
对于BCCD,输出如下所示:
模型在10,000个纪元后表现不错!
对于自定义数据集,此过程看起来非常相似。无需从BCCD下载图像,而是可以从自己的数据集中下载图像,并相应地重新上传它们。
下一步是什么
已经将对象检测模型训练为自定义数据集。
现在,在生产中使用此模型将引起确定生产环境将是一个问题。例如是要在移动应用程序中,通过远程服务器还是在Raspberry Pi上运行模型?模型的使用方式决定了保存和转换其格式的最佳方法。
根据问题,将这些资源视为下一步:转换为TFLite(对于Android和iPhone),转换为CoreML(对于iPhone应用程序),转换为在远程服务器上使用或部署到Raspberry Pi。