本教程及其随附的概念性文档(通过 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 的以下收费组件:
准备工作
本教程假定您的 DICOM 图片已导入 DICOM 存储区。如需了解如何在 Google Cloud 上创建 DICOM 存储区,请参阅创建和管理 DICOM 存储区。如需了解如何将 DICOM 数据导入 DICOM 存储区,请参阅使用 Cloud Storage 导入和导出 DICOM 数据。
此外,本教程还作了以下假定:
- 您在一个名为
MyProj
的项目中开展工作。 - 您在
MyProj
的us-central1
Google Cloud 区域中创建了一个名为dataset1
的数据集。 - 您在
dataset1
中创建了一个名为dicomstore1
的 DICOM 存储区。
如果您的资源名称有所不同,则您需要相应地修改本文档中列出的命令。
- 在 Google Cloud 控制台中,前往项目选择器页面。
前往“项目选择器”(Project Selector) 页面 - 选择名为
MyProj
的 Google Cloud 项目。 -
启用 Cloud Healthcare API。
- 安装 Google Cloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
- 在 shell 中运行
gcloud components update
命令,以确保您拥有包含 Cloud Healthcare API 相关功能的最新版 gcloud CLI。
创建 IAM 服务账号
Healthcare Dataset Administrator 角色包含了本教程的所有必需角色。
激活您的服务账号密钥:
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 角色分配给您的用户账号:
以管理员身份登录 Google Cloud 控制台后,转到 IAM 页面。
点击添加 person_add。
在新主账号字段中,输入您的用户账号或 Gmail 地址。
在选择角色下拉列表中,选择 Cloud Healthcare。
将指针悬停在 Cloud Healthcare 上,然后选择 Healthcare DICOM Viewer 角色。
点击保存。
如需将查看器用于生产环境,您需要获取完整版本。
获取 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
值替换为星号,以及将 DATE
和 DATE_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 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
- 在 Google Cloud 控制台中,进入管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
逐个删除资源
删除目标数据集。如果需要,请添加
--location
参数并指定数据集的区域。gcloud healthcare datasets delete $DESTINATION_DATASET_ID
后续步骤
- 通过 Cloud Healthcare API 对医疗图片进行去标识化处理
- 对 DICOM 数据进行去标识化处理
- Healthcare API Beta 版公告
- 将 DICOM 元数据导出到 BigQuery
- 如需详细了解 DICOM 功能,请参阅 DICOM 一致性声明。
如需详细了解 Cloud Healthcare API(包括有关 FHIR 和 HL7v2 支持的信息),请参阅 Cloud Healthcare API 文档。
探索有关 Google Cloud 的参考架构、图表和最佳做法。查看我们的云架构中心。