DermAssist 如何使用 TensorFlow.js 进行设备内图像质量检查
2021 年 10 月 11 日

发布者 Miles HutsonAaron Loh, Google Health

在 5 月份的 Google I/O 大会上,我们预览了我们的 DermAssist 网页应用程序,旨在帮助人们了解与皮肤相关的问题。该工具旨在易于使用。打开它后,用户需要从多个角度拍摄他们皮肤、头发或指甲问题的三张图像,并提供有关他们自己和他们的状况的一些额外信息。

This product has been CE marked as a Class I medical device in the EU. It is not available in the United States.
该产品已在欧盟获得 CE 认证为 I 类医疗器械。它在美国不可用。

我们认识到,当用户用手机拍照时,一些图像可能会模糊或光线不足。为了解决这个问题,我们最初在图像上传后添加了“质量检查”,这将在必要时提示人们重新拍摄图像。但是,这些提示可能会让人感到沮丧,具体取决于他们的上传速度、获取图像的时间以及通过质量检查可能需要的多次重新拍摄。

Letting the user know they uploaded an image with insufficient quality and advising them to retake it before they proceed.
让用户知道他们上传的图像质量不足,并建议他们在继续之前重新拍摄。

为了改善他们的体验,我们决定在用户排队拍照时以及他们在上传前查看照片时,向用户提供图像质量反馈。该功能的工作原理如下所示。当用户为拍摄排队他们的相机时,他们可能会收到一条通知,说明他们的环境存在光线问题(右图)。或者,他们可能会收到一条通知,说明他们在移动相机时拍摄了模糊的照片(左图);模型有帮助地让他们知道他们的图像在上传之前是模糊的。他们可以选择回去纠正问题,而无需上传图像。

光线不足或模糊图像的示例,这些图像会获得实时反馈,以便用户知道要拍摄新照片

模型开发

在开发模型时,重要的是确保模型能够在设备上舒适地运行。为此而设计的架构之一是 MobileNetV2,我们将其选为模型的主干。

我们与皮肤科医生的讨论强调了图像质量反复出现的问题,例如图像太模糊、光线太差或不适合解释皮肤病。我们整理了几个数据集来解决这些问题,这些问题也为模型的输出提供了信息。这些数据集包括众包数据收集、公共数据集、从远程皮肤病学服务获得的数据以及合成生成的图像,其中许多图像被经过培训的人类评分员进一步标注。总的来说,我们在超过 30,000 张图像上训练了模型。

我们使用多个二进制头训练了模型,每个头对应一个质量问题。在下图中,我们看到输入图像是如何被馈送到 MobileNet 特征提取器中的。然后将此特征嵌入馈送到多个不同的完全连接层,生成二进制输出(是/否),每个输出对应于某个质量问题。

我们用来训练模型的基础设施是使用 TensorFlow 构建的,并以标准 SavedModel 格式导出模型。

将模型转换为 TensorFlow.js

我们团队用于训练模型的基础设施使用的是 TensorFlow 示例,这意味着导出的 SavedModel 具有用于加载和预处理 TensorFlow 示例 的节点。

目前 TensorFlow.js 不支持此类预处理节点。因此,我们修改了 SavedModel 的签名,以在预处理节点之后使用图像输入节点作为模型的输入。我们在下面的 Angular 集成中重新实现了处理。

在以正确的格式重建了 SavedModel 以便进行转换后,我们使用 TensorFlow.js 转换器 将其转换为 TensorFlow.js 模型格式,该格式由一个标识模型拓扑的 JSON 文件以及分片 bin 文件中的权重组成。

tensorflowjs_converter --input_format=keras /path/to/tfjs/signature/ /path/to/write/tfjs_model

将 TensorFlow.js 与 Observables 和 Image Capture API 集成

在模型经过训练、序列化并可用于 TensorFlow.js 之后,工作可能感觉已经完成了。但是,我们仍然需要将 TensorFlow.js 模型集成到我们的 Angular 2 网页应用程序中。在这样做的时候,我们的目标是模型最终会作为类似于其他组件的 API 公开。良好的抽象可以使前端工程师像对待应用程序的任何其他部分一样对待 TensorFlow.js 模型,而不是将其视为一个独特的组件。

首先,我们在模型 ImageQualityPredictor 周围创建了一个包装类。这个 Typescript 类只公开了两个方法

  1. 一个静态方法 createImageQualityPredictor,它在给定模型的 URL 后,返回对 ImageQualityPredictor 的承诺。
  2. 一个 makePrediction 方法,它接受 ImageData 并返回一组在给定阈值以上的质量预测。

我们发现 makePrediction 的实现是抽象模型内部工作原理的关键。调用我们模型上的 execute 的结果是一组张量,代表每个二进制头的是/否概率。但是我们不希望下游应用程序代码负责对这些张量进行阈值处理并将它们连接回头的描述。相反,我们将这些细节移动到我们的包装类中。返回给调用者的最终值是接口 ImageQualityPrediction

export interface ImageQualityPrediction {
  score: number;
  qualityIssue: QualityIssue;
}

为了确保在整个应用程序中共享单个 ImageQualityPredictor,我们反过来将 ImageQualityPredictor 包装在一个 单例 ImageQualityModelService 中。此服务处理预测器的初始化,并跟踪预测器是否已经有一个请求正在进行中。它还包含用于从 ImageCapture API(我们的相机功能基于此 API)提取帧以及将 QualityIssue 转换为普通英文字符串的辅助方法。

最后,我们在 ImageQualityService 中组合了 CameraService 和我们的 ImageQualityModelService。在任何给定的前端组件中公开使用的最终产品是一个简单的 observable,它提供描述任何质量问题的文本。

@Injectable()
export class ImageQualityService {
  readonly realTimeImageQualityText$: Observable;

  constructor(
      private readonly cameraService: CameraService,
      private readonly imageQualityModelService: ImageQualityModelService) {
    const retrieveText = () =>
        this.imageQualityModelService.runModel(this.cameraService.grabFrame());
    this.realTimeImageQualityText$ =
        interval(REFRESH_INTERVAL_MS)
            .pipe(
                filter(() => !imageQualityModelService.requestInProgress),
                mergeMap(retrieveText),
            );
  }
  // ... 
}

这非常适合 Angular 的常规模板系统,实现了我们的目标,即在 Angular 中使 TensorFlow.js 模型像前端工程师的任何其他组件一样易于使用。例如,建议芯片可以像这样轻松地包含在组件中

 <suggestive-chip *ngIf="(imageQualityText$ | async) as text"
>{{text}}</suggestive-chip>


展望未来

为了帮助用户捕捉到更好的照片,我们为 DermAssist 应用程序开发了一个设备内图像质量检查,以提供有关图像摄入的实时指导。让用户生活更轻松的一部分是确保此模型运行速度足够快,以便我们可以在他们拍照时尽快显示通知。对我们来说,这意味着找到方法来减小模型大小,以减少模型在用户设备上加载所需的时间。可能进一步推进此目标的技术可能是模型量化,或者尝试将模型蒸馏成更小的架构。

要了解有关 DermAssist 应用程序的更多信息,请查看 Google I/O 的 我们的博客文章

要了解有关 TensorFlow.js 的更多信息,您可以访问主站点 此处,还可以查看 教程指南

下一篇文章
How DermAssist uses TensorFlow.js for on-device image quality checks

发布者 Miles HutsonAaron Loh, Google Health 在 5 月份的 Google I/O 大会上,我们预览了我们的 DermAssist 网页应用程序,旨在帮助人们了解与皮肤相关的问题。该工具旨在易于使用。打开它后,用户需要从多个角度拍摄他们皮肤、头发或指甲问题的三张图像,并提供有关他们自己和…