减少浸润性导管癌分类器中的假阴性
Intel® AI DevJam 演示 GUI 使用一个 Windows 应用程序与面部识别分类器和一个选项,该选项包含两个已训练用于检测组织学图像中浸润性导管癌(乳腺癌)的分类器。
摘要
Intel AI DevJam 演示项目,“减少浸润性导管癌(IDC)分类器的假阴性”,提供了用于设置将在 2018 年 7 月于瑞典举行的 ICML(国际机器学习大会)上的 Intel AI DevJam 上演示的项目源代码和教程。
Intel® AI DevJam 演示 GUI 使用一个 Windows* 应用程序,该应用程序与面部识别分类器以及一个包含两个已训练用于检测组织学图像中浸润性导管癌(乳腺癌)的分类器的选项进行通信。该项目结合了 使用计算机视觉和物联网进行浸润性导管癌(IDC)分类 和 TASS Movidius Facenet 分类器 项目,并进行了一些新的改进。
该项目的目标是使用一组较小的测试数据中非常相似但类别相反的图像,故意尝试欺骗模型,我相信这些图像人类可能难以区分。提供了一组较大的测试数据,以比较模型在更大数据集上的表现。
如果我们发现假阳性,我们将尝试找到一种方法来减少它们,为可能意味着生与死之间差别的错误分类提供一个安全网。
物联网连接
该项目的物联网连接由 IoT JumpWay 提供。IoT JumpWay 是一个物联网通信平台即服务 (PaaS),具有社交网络前端。IoT JumpWay 开发者很快将能够分享项目/照片/视频和活动。使用 IoT JumpWay 是完全免费的,您可以在 开发者计划 页面上了解更多信息。
清单
在继续配置通用 Windows 应用程序之前,请确保您已完成以下步骤,因为在完成本教程之前,您需要它们等待查询或命令。
-
设置 IDC 分类服务器/API。
-
设置 IoT 警报设备。
软件要求
设置通用 Windows 应用程序
当您完成 IDC 分类服务器/API 设置时,您应该已经下载了存储库源代码。导航到 IoT-JumpWay-Microsoft-Examples/Intel-AI-DevJam-IDC,然后双击 IDC-Classifier-GUI.sln 文件在 Visual Studio 2017 中打开解决方案。
您需要应用程序连接到您在遵循 IDC 分类器教程时设置的服务器。在 IDC 分类 GUI 类文件夹 中,您会找到一个名为 GlobalData.cs 的文件,其中包含可用于连接到您的 IDC 分类服务器的设置。当您启动 IDC 分类服务器时,输出将显示 IP/FQD 和端口号。
class GlobalData { public string protocol = "http://"; public string ip = "YOUR SERVER IP"; public int port = 8080; public string endpoint = "/api/TASS/infer"; public string endpointIDC = "/api/IDC/infer"; public string dataFolder = "Data\\1"; //public string dataFolder = "Data\\2"; public double threshold = 0.80; public int expectedCount = 6; }
测试数据
在 GUI 项目文件夹中,您会找到一个名为 Data 的文件夹,其中包含 2 个数据文件夹:1 和 2。目前,第一个文件夹包含 12 张经过特别挑选的未见过的组织学图像。选择的图像是我认为与相反类别中的示例非常相似的示例。选择这些图像的目的是查看网络对非常相似但类别相反的图像的反应。您可以在两个不同大小的数据集 1 和 2 之间切换,或在 Classes/GlobalData.cs 的 dataFolder 设置中指向您自己的数据集。
要添加您自己的数据,您可以删除 Data 文件夹中的图像,并将您自己的数据集添加到该文件夹中。将它们添加到文件夹后,您需要在 Visual Studio 中删除目录中任何未使用的图像,然后通过右键单击 Data 文件夹、单击添加,然后选择您新的数据集来将新图像添加到项目中。
IDC 分类器评估结果
IDC 分类器评估的结果如下所示
INFO:tensorflow:Global Step 73: Streaming Accuracy: 0.8935 (0.61 sec/step) INFO:tensorflow:Global Step 74: Streaming Accuracy: 0.8942 (0.67 sec/step) INFO:tensorflow:Final Streaming Accuracy: 0.8941
测试通用 Windows 应用程序
为了使其工作,您需要在 已知数据 文件夹中添加您的照片,该文件夹位于 IDC 分类器 文件夹中。
运行应用程序,当应用程序启动时,它会请求相机和麦克风权限(麦克风在开发阶段尚未使用)。在您接受权限后,相机应会启动并在屏幕上显示。
此应用程序的此部分存在一个已知错误,它使用了 Windows 通用样本:基本相机应用示例 中的代码。您可能需要多次重新启动应用程序才能加载您的相机。
单击右侧的相机按钮以进行身份验证。应用程序会为您拍照,并将其发送到服务器进行分类。您现在应该已通过系统身份验证,要添加其他有权使用该系统的人员,只需将他们的照片添加到 IDC 分类器中的已知数据文件夹中。
单击“分类所有图像”按钮开始分类过程。应用程序将遍历数据并将其发送到服务器进行分类。每处理一张图像,应用程序都会通过语音通知您,完成后,它会通知您正面识别结果。
Inception V3 结果
这些结果来自使用 AI DevJam Inception V3 IDC 分类器。如前所述,这些图像是故意选择的,旨在挑战模型在假阴性和假阳性方面的能力。理想情况下,两者都应为 **零**,但最好的情况是误分类为假阳性,因为将非癌误判为癌比将癌误判为非癌要好。
应用程序已设置为通过检查文件名中的字符串来检测测试分类是否正确,以与预测进行比较。在此应用程序中,它将检查阴性预测,查看文件名中是否存在字符串 class0,对于阳性预测,它将检查 class1,这有助于确定它们是假阴性还是假阳性。
可以在 Visual Studio 的输出区域查看日志。此处将显示处理的每张图像的信息、预测以及它是假阳性/假阴性还是正确/错误,或者分类器是否因置信度低而不确定。我希望看到但预期会看到的是假阴性,因为我选择了一个我认为可能会欺骗分类模型的测试数据集。
我的测试下方的控制台日志和信息显示,IDC 分类器将 **一个** 阳性示例识别为阴性,并且应用程序将 **三个** 假阳性标记为不确定,并且由于置信度低而需要进一步检查。
2 true positives, 0 false positives, 1 false negatives, 3 unsure, 6 true negatives, 1 incorrect examples classified, 0.44 accuracy, 1 precision, 0.67 recall, 0.8 fscore - 2 true positives, 0 false positives, 1 false negatives, 6 true negatives - 3 unsure - 1 incorrect examples classified - 0.44 accuracy - 1 precision - 0.67 recall - 0.8 fscore
如果分类是阳性或阴性,但置信度低于 Classes/GlobalData.cs 中设置的阈值,应用程序会将分类标记为不确定。
假阴性
8975_idx5_x1001_y1451_class1.png {"Confidence": "0.9526", "ResponseMessage": "IDC Not Detected With Confidence 0.9526", "Response": "OK", "Results": 0} FALSE NEGATIVE: IDC incorrectly not detected in image 4 8975_idx5_x1001_y1451_class1.png with 0.9526 confidence. Processed image 4
不确定
通过检测分类器是否不确定,我们可以移除一些需要进一步检查的数据。在此示例中,如果它是阴性或阳性分类,但置信度低于阈值,则会将其从计算中排除,并将不确定的分类识别出来以供进一步调查。这使得应用程序能够捕获三个假阴性并将其标记为不确定。
在实际应用中,使用阈值将使应用程序更安全。通过捕获三个假阴性,我们帮助分类器区分了不确定的数据。
应用程序能够理解它对某些分类的图像 not very confident。这很好,因为错误分类的图像是假阴性,这意味着如果我们没有捕获到这些,三个分类将显示为没有癌症,而实际上有癌症。
该应用程序允许医生例如手动检查分类器已分类但又不确定的图像。
以下是应用程序使用 Classes/GlobalData.cs 中的 Data\1 dataFolder 设置所做的不确定分类
8975_idx5_x1051_y1251_class1.png {"Confidence": "0.807", "ResponseMessage": "IDC Not Detected With Confidence 0.807", "Response": "OK", "Results": 0} UNSURE: IDC detected in image 5 8975_idx5_x1051_y1251_class1.png with 0.807 confidence. Processed image 5
您可以在上面的图像中看到被错误分类的图像,以及来自相反类别且我认为可能欺骗 IDC 分类器的图像。我能够从阴性类别中找到外观相似的图像,这表明分类器可能混淆了两个不同类别的相似图像。
使用 IDC 分类器测试程序 也进行了相同的测试,结果相同。似乎与面部识别类似,Inception V3 会混淆于相似的图像,这可以通过测试更大的数据集来确认或否认。
尝试事项
- 在更大的数据集上测试
- 训练更多相似的错误识别图像示例
- 将数据集中的训练图像大小增加到 200px x 200px
- 使用不同的模型
在更大的数据集上测试
Data 文件夹中的第二个文件夹可用于在 100 张图像(50 张阴性,50 张阳性)上测试分类器。这些图像是随机选择的,可能会或不会混淆来自不同类别的相似图像。
数据文件夹
您需要应用程序使用较大的 IDC 测试数据文件夹。您可以通过编辑 Classes/GlobalData.cs 文件并取消注释 Data\2 文件夹并注释掉 Data\1 文件夹来实现。然后将 expectedCount 更改为 50。
class GlobalData { public string protocol = "http://"; public string ip = "YOUR SERVER IP"; public int port = 8080; public string endpoint = "/api/TASS/infer"; public string endpointIDC = "/api/IDC/infer"; //public string dataFolder = "Data\\1"; public string dataFolder = "Data\\2"; public double threshold = 0.80; public int expectedCount = 50; }
下次运行应用程序时,这将使应用程序使用较大的数据集。过程与我们测试较小数据集时相同。单击“分类所有图像”按钮,程序将开始处理图像。
Inception V3 结果
您可以在下方看到使用 Data\2 文件夹(包含 50 张 IDC 阳性图像和 50 张 IDC 阴性图像)进行测试的控制台输出的末尾。
27 true positives, 0 false positives, 7 false negatives, 16 unsure, 50 true negatives, 7 incorrect examples classified, 0.03 accuracy, 1 precision, 0.79 recall, 0.89 fscore - 27 true positives, 0 false positives, 7 false negatives, 50 true negatives - 16 unsure - 7 incorrect examples classified - 0.03 accuracy - 1 precision - 0.79 recall - 0.89 fscore
以上显示,在 100 张图像的数据集上,有 7 个错误分类,所有这些都是置信度为 0.90 或更高的假阴性。应用程序将 16 张图像标记为不确定,并正确识别了 50 张 IDC 阳性图像中的 27 张。
假阴性
似乎所有假阴性至少有两个共同点。
- 它们都有明显的白色区域
- 它们至少有一个在相反类别中有非常相似的训练示例
8975_idx5_x1001_y1451_class1.png {"Confidence": "0.9526", "ResponseMessage": "IDC Not Detected With Confidence 0.9526", "Response": "OK", "Results": 0} FALSE NEGATIVE: IDC incorrectly not detected in image 20 8975_idx5_x1001_y1451_class1.png with 0.9526 confidence. Processed image 20
不确定
我们的不确定分类使我们能够捕获模型 not confident 的分类,这在捕获假阴性时可以帮助挽救生命。
似乎所有不确定分类至少有两个共同点。
- 它们大多数都有明显的白色区域
- 在带有粉色背景的图像中未检测到少量的紫色
8975_idx5_x1001_y1301_class1.png {"Confidence": "0.8223", "ResponseMessage": "IDC Detected With Confidence 0.8223", "Response": "OK", "Results": 1} UNSURE: IDC detected in image 17 8975_idx5_x1001_y1301_class1.png with 0.8223 confidence. Processed image 17
尝试事项
我们可以尝试几件事来增强应用程序的功能。
- 预检测并删除具有大量白色区域的图像以供手动检查
- 检查阴性分类,看它们是否确实包含紫色
- 训练更多相似的错误识别图像示例
- 将数据集中的训练图像大小增加到 299px x 299px
- 使用不同的模型
参与进来
该项目已在 MIT 许可证下开源。所有贡献都欢迎,您可以选择以下任何功能列表,或通过拉取请求提交您自己的功能以供审查。
功能列表
您将在下面找到将要实现的所有功能。欢迎提交拉取请求。
错误/问题
在使用此或其他任何 IoT JumpWay Microsoft 存储库时,请随时创建有关您遇到的错误和一般问题的 issue:IoT-JumpWay-Microsoft-Examples Github Issues
已知bug
您将在下面找到应用程序中所有已知的错误。每个错误在存储库 issues 区域都有一个相应的 issue。欢迎提交拉取请求。