使用 Cloud Healthcare API 对医疗图片进行去标识化处理

Last reviewed 2023-03-28 UTC

本教程介绍如何使用 Cloud Healthcare API 的 DICOM 去标识化操作来移除或修改(医学数字成像和通信 [DICOM])数据中的个人身份信息 (PII) 和受保护健康信息 (PHI)。对 DICOM 数据进行去标识化处理有助于确保患者隐私,并且有助于准备医疗保健数据以便用于研究、数据共享和机器学习。

本教程及其随附的概念性文档(通过 Cloud Healthcare API 对医疗图片进行去标识化处理)旨在供研究人员、数据科学家、IT 团队以及医疗保健和生命科学组织使用。本教程将介绍使用 Cloud Healthcare API 对医疗图片数据进行去标识化处理的两种常见使用场景。上述概念性文档说明了 DICOM 数据去标识化处理的基本原理,并概述了其高级步骤。

本教程假定您具备 Linux 基本知识。对 Google Cloud 和 DICOM 标准有基本的了解也有助于学习本教程。请在 Linux 终端中运行本教程中的所有命令。

目标

  • 使用 Cloud Healthcare API 的 DICOM 去标识化操作来移除或修改 DICOM 存储区的 DICOM 实例中的 PII 和 PHI。
  • 在一次 Cloud Healthcare API 调用中,移除或修改 PII 和 PHI 元数据和内置文本。
  • 使用 curl 命令行工具或 Google Cloud CLI 进行 DICOM 去标识化 Cloud Healthcare API 调用。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

本教程假定您的 DICOM 图片已导入 DICOM 存储区。如需了解如何在 Google Cloud 上创建 DICOM 存储区,请参阅创建和管理 DICOM 存储区。如需了解如何将 DICOM 数据导入 DICOM 存储区,请参阅使用 Cloud Storage 导入和导出 DICOM 数据

此外,本教程还作了以下假定:

  • 您在一个名为 MyProj 的项目中开展工作。
  • 您在 MyProjus-central1 Google Cloud 区域中创建了一个名为 dataset1 的数据集。
  • 您在 dataset1 中创建了一个名为 dicomstore1 的 DICOM 存储区。

如果您的资源名称有所不同,则您需要相应地修改本文档中列出的命令。

  1. 在 Google Cloud 控制台中,前往项目选择器页面。
    前往“项目选择器”(Project Selector) 页面
  2. 选择名为 MyProj 的 Google Cloud 项目。
  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Cloud Healthcare API。

    启用 API

  5. 安装 Google Cloud CLI。
  6. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  7. 在 shell 中运行 gcloud components update 命令,以确保您拥有包含 Cloud Healthcare API 相关功能的最新版 gcloud CLI。

创建 IAM 服务账号

Healthcare Dataset Administrator 角色包含了本教程的所有必需角色。

  1. 创建服务账号

  2. 将 Healthcare Dataset Administrator 角色分配给服务账号

  3. 创建并下载服务账号 JSON 密钥

  4. 激活您的服务账号密钥:

    gcloud auth activate-service-account --key-file=path-to-key-file
    

    输出如下所示:

    Activated service account credentials for: [key-name@project-name.iam.gserviceaccount.com]
    
    • key-name 是您分配给服务账号密钥的名称。
    • project-name 是您的 Google Cloud 项目的名称。

使用医疗图片查看器

本教程将 Mach7 诊断查看器用作医疗图片查看器。您可以在 Mach7 网站上请求该查看器的演示版本。

如需使用此查看器,请执行以下步骤,将 Healthcare DICOM Viewer 角色分配给您的用户账号:

  1. 以管理员身份登录 Google Cloud 控制台后,转到 IAM 页面。

    转到 IAM 页面

  2. 点击添加

  3. 新主账号字段中,输入您的用户账号或 Gmail 地址。

  4. 选择角色下拉列表中,选择 Cloud Healthcare

  5. 将指针悬停在 Cloud Healthcare 上,然后选择 Healthcare DICOM Viewer 角色。

  6. 点击保存

如需将查看器用于生产环境,您需要获取完整版本。

获取 OAuth 2.0 访问令牌

如需使用 Cloud Healthcare API 提取数据,您需要本教程中的命令为您获取的 OAuth 2.0 访问令牌。在本教程中,一些示例 Cloud Healthcare API 请求将使用 curl 命令行工具。这些示例使用 gcloud auth print-access-token 命令获取 OAuth 2.0 不记名令牌,以及将该令牌包含在请求的授权标头中。如需详细了解此命令,请参阅 gcloud auth application-default print-access-token

本教程介绍了从 DICOM 数据中移除标识信息的两种最常见使用场景。在这两种情况下,解决方案都是使用 curl 命令行工具或 Google Cloud CLI 提供的。如需详细了解如何使用 Cloud Healthcare API 对 DICOM 数据进行去标识化处理、配置选项以及示例 curl 和 Windows PowerShell 命令,请参阅对 DICOM 数据进行去标识化处理

设置环境变量

此步骤适用于这两种使用场景。

  • 根据存储图片的 DICOM 存储区的位置和特性导出环境变量。

    export PROJECT_ID=MyProj
    export REGION=us-central1
    export SOURCE_DATASET_ID=dataset1
    export DICOM_STORE_ID=dicomstore1
    export DESTINATION_DATASET_ID=deid-dataset1
    

使用场景 I:移除所有元数据并隐去所有内置文本

本使用场景展示了如何通过从 DICOM 图片中移除所有元数据(有效 DICOM 资源所需的最少数据除外)以及隐去所有内置文本,对包含 DICOM 存储区和 DICOM 数据的数据集进行去标识化处理。您可以执行以下操作:

  • 创建 POST 请求并提供目标数据集的名称和访问令牌。
  • 移除所有元数据并创建一组最少的 keepList 标记,以获得有效的 DICOM 资源。
  • 通过创建 DeidentifyConfig 对象并将 image.text_redaction_mode 设置为 REDACT_ALL_TEXT,从 DICOM 图片中隐去所有敏感的内置文本。

您可以在一条 curl 命令中执行所有这些操作,如下所示:

curl -X POST \
    -H "Authorization: Bearer "$(gcloud auth print-access-token) \
    -H "Content-Type: application/json; charset=utf-8" \
    --data "{
      'destinationDataset': 'projects/$PROJECT_ID/locations/$REGION/datasets/$DESTINATION_DATASET_ID',
      'config': {
        'dicom': {'keepList': {
           'tags': [
              'StudyInstanceUID',
              'SOPInstanceUID',
              'TransferSyntaxUID',
              'PixelData',
              'Columns',
              'NumberOfFrames',
              'PixelRepresentation',
              'MediaStorageSOPClassUID',
              'MediaStorageSOPInstanceUID',
              'Rows',
              'SamplesPerPixel',
              'BitsAllocated',
              'HighBit',
              'PhotometricInterpretation',
              'BitsStored' ] }
                 },
        'image': {
          'textRedactionMode': 'REDACT_ALL_TEXT'
        }
      }
    }" "https://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID:deidentify"

或者,您也可以使用 MINIMAL_KEEP_LIST_PROFILE 标记过滤条件配置文件,在不知道或不指定任何标记名称的情况下完成相同的去标识化操作。请参阅以下示例:

curl -X POST \
    -H "Authorization: Bearer "$(gcloud auth print-access-token) \
    -H "Content-Type: application/json; charset=utf-8" \
    --data "{
      'destinationDataset': 'projects/$PROJECT_ID/locations/$REGION/datasets/$DESTINATION_DATASET_ID',
      'config': {

'dicom':{'filterProfile':'MINIMAL_KEEP_LIST_PROFILE'},

        'image': {
          'textRedactionMode': 'REDACT_ALL_TEXT'
        }
      }
    }" "https://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID:deidentify"

在上述所有命令中,如果请求成功,则服务器会返回 JSON 格式的响应,如下所示:

{
  "name": "projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/OPERATION_NAME"
}

响应包含操作名称。您可以将操作名称与 Operation get 方法搭配使用,以跟踪操作的状态。

curl -X GET \
    -H "Authorization: Bearer "$(gcloud auth print-access-token) \
    -H "Content-Type: application/json; charset=utf-8" \
"https://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/operations/OPERATION_NAME"

如果请求成功,则服务器会返回 JSON 格式的响应。去标识化过程完成后,响应会包含 "done": true

{
  "name": "projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/operations/OPERATION_NAME",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.dataset.DatasetService.DeidentifyDataset",
    "createTime": "2018-01-01T00:00:00Z",
    "endTime": "2018-01-01T00:00:00Z"
  },
  "done": true,
  "response": {
    "@type": "...",
    "successStoreCount": "SUCCESS_STORE_COUNT"
  }
}

您还可以在 Google Cloud 中使用 Google Cloud CLI 运行所有 Cloud Healthcare API 版本,包括去标识化 API。如需查看可用命令的完整列表,请参阅 Cloud Healthcare API gcloud 文档或者执行以下命令:

gcloud healthcare --help

以下示例展示了如何使用 gcloud CLI 对包含 DICOM 存储区和 DICOM 数据的数据集进行去标识化处理,以便从 DICOM 图片中移除所有元数据并隐去所有内置文本。

gcloud healthcare datasets deidentify $SOURCE_DATASET_ID \
--location $REGION \
--dicom-filter-tags=StudyInstanceUID,SOPInstanceUID,TransferSyntaxUID,PixelData,Columns,NumberOfFrames,PixelRepresentation,MediaStorageSOPClassUID,MediaStorageSOPInstanceUID,Rows,SamplesPerPixel,BitsAllocated,HighBit,PhotometricInterpretation,BitsStored \
--text-redaction-mode all \
--destination-dataset projects/$PROJECT_ID/locations/$REGION/datasets/$DESTINATION_DATASET_ID \
--async

如果请求成功,则服务器会返回如下所示的响应:

Request issued for: [$SOURCE_DATASET_ID]
Check operation [OPERATION NAME] for status.
name: projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/operations/OPERATION_NAME

如需检查操作状态,请运行以下命令:

gcloud healthcare operations describe --dataset $SOURCE_DATASET_ID OPERATION_NAME

如果请求成功,则服务器会返回如下所示的响应。去标识化过程完成后,响应会包含 "done": true

done: true
metadata:
  '@type': type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata
  apiMethodName: google.cloud.healthcare.v1.dataset.DatasetService.DeidentifyDataset
  "createTime": "2018-01-01T00:00:00Z",
  "endTime": "2018-01-01T00:00:00Z"
name: "projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/operations/OPERATION_NAME"
response:
  '@type': type.googleapis.com/google.cloud.healthcare.v1.dataset.DeidentifySummary
  successResourceCount: 'SUCCESS_RESOURCE_COUNT'
  successStoreCount: 'SUCCESS_STORE_COUNT'

使用场景 II:修改元数据并隐去敏感的内置文本

本使用场景展示了如何通过使用 filterProfile 标记过滤方法来移除一些元数据,修改其他元数据以及隐去与图片关联的敏感内置文本,从而对包含 DICOM 存储区和 DICOM 数据的数据集进行去标识化处理。最终的目标是隐去 PERSON_NAME 值,将 PHONE_NUMBER 值替换为星号,以及将 DATEDATE_OF_BIRTH 修改为自原始值算起 100 天范围内的日期值。

本使用场景所提供的加密密钥 U2FsdGVkX19bS2oZsdbK9X5zi2utBn22uY+I2Vo0zOU= 是使用以下命令生成的 256 位 AES 加密的 base64 编码密钥。出现提示时,请为该命令提供空密码:

 echo -n "test" | openssl enc -e -aes-256-ofb -a -salt

您可以执行以下操作:

  • 创建 POST 请求并提供目标数据集的名称和访问令牌。
  • 使用 DEIDENTIFY_TAG_CONTENT 过滤条件配置文件以及适当的信息类型和原初转换组合,移除 DICOM 标记中的一些元数据以及修改 DICOM 标记中的其他元数据。
  • 通过将 image.text_redaction_mode 设置为 REDACT_SENSITIVE_TEXT,从 DICOM 图片中隐去内置文本。

您可以在一条 curl 命令中执行所有这些操作,如下所示:

curl -X POST \
    -H "Authorization: Bearer "$(gcloud auth print-access-token) \
    -H "Content-Type: application/json; charset=utf-8" \
    --data "{
      'destinationDataset': 'projects/$PROJECT_ID/locations/$REGION/datasets/$DESTINATION_DATASET_ID',
      'config':{
    'dicom':{'filterProfile':'DEIDENTIFY_TAG_CONTENTS'},
    'text':{
        'transformations':[
            {'infoTypes':['PERSON_NAME'], 'redactConfig':{}},
            {'infoTypes':['PHONE_NUMBER'], 'characterMaskConfig':{'maskingCharacter':''}},
            {'infoTypes':['DATE', 'DATE_OF_BIRTH'], 'dateShiftConfig':{'cryptoKey':'U2FsdGVkX19bS2oZsdbK9X5zi2utBn22uY+I2Vo0zOU='}}]},
    'image':{'textRedactionMode':'REDACT_SENSITIVE_TEXT'}}}" \
"https://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID:deidentify"

如果请求成功,则服务器会返回 JSON 格式的响应,如下所示:

{
  "name": "projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/OPERATION_NAME"
}

响应包含操作名称。您可以使用 Operation get 方法来跟踪操作的状态:

curl -X GET \
    -H "Authorization: Bearer "$(gcloud auth print-access-token) \
    -H "Content-Type: application/json; charset=utf-8" \
"https://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/operations/OPERATION_NAME"

如果请求成功,则服务器会返回 JSON 格式的以下响应:

{
  "name": "projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/operations/OPERATION_NAME",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.dataset.DatasetService.DeidentifyDataset",
    "createTime": "2018-01-01T00:00:00Z",
    "endTime": "2018-01-01T00:00:00Z"
  },
  "done": true,
  "response": {
    "@type": "...",
    "successStoreCount": "SUCCESS_STORE_COUNT"
  }
}

清除数据

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

逐个删除资源

  • 删除目标数据集。如果需要,请添加 --location 参数并指定数据集的区域。

    gcloud healthcare datasets delete $DESTINATION_DATASET_ID
    

后续步骤