Usa la API de Cloud Healthcare para desidentificar imágenes médicas

Last reviewed 2023-03-28 UTC

En este instructivo, se muestra cómo usar la operación de desidentificación de DICOM de la API de Cloud Healthcare para quitar o modificar la información de identificación personal (PII) y la información de salud protegida (PHI) de los datos de (Imágenes digitales y comunicación en medicina (DICOM)). data. La desidentificación de datos de DICOM ayuda a garantizar la privacidad del paciente y a preparar los datos de atención médica para su uso en la investigación, el uso compartido de datos y el aprendizaje automático.

El instructivo y su documento conceptual Desidentificación de imágenes médicas mediante la API de Cloud Healthcare están dirigidos a investigadores, científicos de datos, equipos de TI, y organizaciones de salud y ciencias biológicas. En este instructivo, se explican dos casos prácticos comunes para desidentificar datos de imágenes médicas mediante la API de Cloud Healthcare. En el documento conceptual, se explica la lógica de la desidentificación de datos de DICOM y se describen sus pasos de alto nivel.

En este instructivo, se da por hecho que tienes un conocimiento fundamental de Linux. También es útil tener conocimientos básicos de los estándares de Google Cloud y DICOM. Ejecuta todos los comandos de este instructivo en una terminal de Linux.

Objetivos

  • Usar la operación de desidentificación de DICOM de la API de Cloud Healthcare para quitar o modificar la PII y la PHI en las instancias de DICOM en un almacén DICOM
  • Quitar o modificar los metadatos de PII y PHI, y el texto grabado en una llamada a la API de Cloud Healthcare
  • Usar la herramienta de línea de comandos de curl o la CLI de Google Cloud para realizar las llamadas de desidentificación de DICOM a la API de Cloud Healthcare.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

En este instructivo, se supone que las imágenes de DICOM ya se importaron a un almacén de DICOM. Para obtener información sobre cómo crear almacenes de DICOM en Google Cloud, consulta Crea y administra almacenes de DICOM. Para obtener información sobre cómo importar datos de DICOM a almacenes de DICOM, consulta Importa y exporta datos de DICOM mediante Cloud Storage.

Además, en este instructivo, se dan por hecho los siguientes puntos:

  • Trabajas en un proyecto llamado MyProj.
  • Creaste un conjunto de datos llamado dataset1 en la región us-central1 de Google Cloud en MyProj.
  • Creaste un almacén de DICOM llamado dicomstore1 en dataset1.

Si los recursos tienen un nombre diferente, deberás modificar los comandos que aparecen en este documento según corresponda.

  1. En la consola de Google Cloud, ve a la página Selector de proyectos.
    Ir a la página Selector de proyectos
  2. Selecciona un proyecto de Google Cloud llamado MyProj.
  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita Cloud Healthcare API.

    Habilita la API

  5. Instala Google Cloud CLI.
  6. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  7. En una shell, ejecuta el comando gcloud components update para asegurarte de tener la versión más reciente de la gcloud CLI que incluye la funcionalidad relacionada con la API de Cloud Healthcare.

Crea una cuenta de servicio de IAM

La función de administrador del conjunto de datos de Healthcare incluye todas las funciones necesarias para este instructivo.

  1. Crea una cuenta de servicio.

  2. Asigna la función de administrador del conjunto de datos de Healthcare a la cuenta de servicio.

  3. Crea y descarga la clave JSON de la cuenta de servicio.

  4. Activa la clave de tu cuenta de servicio mediante la ejecución del siguiente comando:

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

    Este es el resultado:

    Activated service account credentials for: [key-name@project-name.iam.gserviceaccount.com]
    
    • key-name es el nombre que asignaste a la clave de la cuenta de servicio.
    • project-name es el nombre del proyecto de Google Cloud.

Usa un visualizador de imágenes médicas

En este instructivo, se usa el visualizador de diagnóstico de Mach7 como visualizador de imágenes médicas. Puedes solicitar una versión de demostración del visor en el sitio web de Mach7.

Para usar este visualizador, asigna la función DE visualizador de DICOM de Healthcare a la cuenta de usuario mediante los siguientes pasos:

  1. Como administrador de la consola de Google Cloud, ve a la página IAM.

    Ve a la página IAM

  2. Haz clic en Agregar .

  3. En el campo Miembros nuevos, ingresa tu cuenta de usuario o tu dirección de Gmail.

  4. En la lista desplegable Seleccionar una función, selecciona Cloud Healthcare.

  5. Mantén el cursor sobre Cloud Healthcare y, luego, selecciona la función Visualizador de Healthcare DICOM.

  6. Haz clic en Guardar.

Para usar el visualizador con fines de producción, debes obtener una versión completa.

Obtén un token de acceso de OAuth 2.0

Si deseas usar la API de Cloud Healthcare para transferir datos, necesitas un token de acceso de OAuth 2.0 que los comandos de este instructivo obtienen para ti. En este instructivo, en algunas de las solicitudes a la API de Cloud Healthcare de ejemplo, se usa la herramienta de línea de comandos de curl. En estos ejemplos, se usa el comando gcloud auth print-access-token para obtener un token del portador de OAuth 2.0 y, luego, incluirlo en el encabezado de autorización de la solicitud. Para obtener más información sobre este comando, consulta gcloud auth application-default print-access-token.

En este instructivo, se analizan dos de los casos de uso más comunes para quitar información de identificación de los datos de DICOM. En ambos casos, la solución se proporciona mediante la herramienta de línea de comandos de curl o la CLI de Google Cloud. Para obtener más información sobre la desidentificación de datos de DICOM mediante la API de Cloud Healthcare, las opciones de configuración y los comandos curl y los de Windows PowerShell de muestra, consulta Desidentifica datos de DICOM.

Configura variables de entorno

Este paso se aplica a ambos casos prácticos.

  • Exporta las variables de entorno según la ubicación y los atributos del almacén de DICOM en el que se almacenan las imágenes.

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

Caso práctico I: Quita todos los metadatos y oculta todo el texto grabado

En este caso práctico, se muestra cómo desidentificar un conjunto de datos que contiene almacenes de DICOM y datos de DICOM mediante la quita de todos los metadatos (excepto los datos mínimos requeridos para un recurso de DICOM válido) y el ocultamiento de todo el texto grabado de las imágenes de DICOM. Puedes realizar las siguientes funciones:

  • Crear una solicitud POST y proporcionar el nombre del conjunto de datos de destino y un token de acceso
  • Quitar todos los metadatos y crear un conjunto de etiquetas keepList mínimas para tener un recurso de DICOM válido
  • Ocultar todo el texto sensible grabado de la imagen de DICOM mediante la creación de un objeto DeidentifyConfig con image.text_redaction_mode establecido en REDACT_ALL_TEXT

Puedes realizar todas estas funciones en un solo comando curl como el que se muestra a continuación:

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"

Como alternativa, puedes completar la misma operación de desidentificación sin conocer ni especificar ningún nombre de etiqueta mediante el perfil de filtro de etiquetas MINIMAL_KEEP_LIST_PROFILE. Consulta el siguiente ejemplo:

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"

En todos los comandos anteriores, si la solicitud tiene éxito, se mostrará una respuesta en formato JSON en el servidor, como la que se muestra a continuación:

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

La respuesta contiene un nombre de operación. Puedes usar el nombre de la operación con el método get de operación para realizar un seguimiento del estado de la operación.

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"

Si la solicitud tiene éxito, en el servidor se mostrará una respuesta en formato JSON. Cuando se complete el proceso de desidentificación, la respuesta incluirá "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"
  }
}

También puedes usar la CLI de Google Cloud en Google Cloud para ejecutar todas las versiones de la API de Cloud Healthcare, incluida la API de desidentificación. Para obtener una lista completa de los comandos disponibles, consulta la documentación de gcloud de la API de Cloud Healthcare o ejecuta el siguiente comando:

gcloud healthcare --help

En el siguiente ejemplo, se muestra cómo usar la gcloud CLI con el fin de desidentificar un conjunto de datos que contiene almacenes y datos de DICOM para quitar todos los metadatos y ocultar todo el texto grabado de las imágenes de 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

Si la solicitud se realiza de forma correcta, en el servidor se mostrará una respuesta como la siguiente:

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

Para verificar el estado de la operación, ejecuta el siguiente comando:

gcloud healthcare operations describe --dataset $SOURCE_DATASET_ID OPERATION_NAME

Si la solicitud tiene éxito, en el servidor se mostrará una respuesta como la que se muestra a continuación. Cuando se complete el proceso de desidentificación, la respuesta contendrá "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'

Caso práctico II: Modifica metadatos y oculta el texto sensible grabado

En este caso práctico, se muestra cómo desidentificar un conjunto de datos que contiene almacenes y datos de DICOM mediante el método de filtrado por etiquetas filterProfile para quitar algunos metadatos, modificar otros y ocultar el texto sensible grabado asociado a imágenes. El objetivo es ocultar el valor PERSON_NAME, reemplazar el valor PHONE_NUMBER por asteriscos, y modificar DATE y DATE_OF_BIRTH por un valor de fecha en el rango de 100 días de los valores originales.

En este caso práctico, U2FsdGVkX19bS2oZsdbK9X5zi2utBn22uY+I2Vo0zOU=, la clave criptográfica proporcionada, es una clave de encriptación AES codificada en base64 de 256 bits que se genera mediante el siguiente comando. Cuando se te solicite, proporciona una contraseña vacía al siguiente comando:

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

Puedes realizar las siguientes funciones:

  • Crear una solicitud POST y proporcionar el nombre del conjunto de datos de destino y un token de acceso
  • Quitar algunos metadatos y modificar otros en las etiquetas de DICOM mediante el perfil de filtro DEIDENTIFY_TAG_CONTENT con las combinaciones adecuadas de tipos de información y transformaciones primitivas
  • Redactar el texto grabado de una imagen de DICOM mediante la configuración de image.text_redaction_mode en REDACT_SENSITIVE_TEXT

Puedes realizar todas estas funciones en un solo comando curl como el que se muestra a continuación:

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"

Si la solicitud tiene éxito, se mostrará una respuesta en formato JSON en el servidor, como la que se encuentra a continuación:

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

La respuesta contiene un nombre de operación. Puedes usar el método get de operación para realizar un seguimiento del estado de la operación:

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"

Si la solicitud tiene éxito, se mostrará la siguiente respuesta en formato JSON en el servidor:

{
  "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"
  }
}

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra los recursos individuales

  • Borra los conjuntos de datos de destino mediante la ejecución del siguiente comando. Si es necesario, agrega el parámetro --location y especifica la región para tu conjunto de datos.

    gcloud healthcare datasets delete $DESTINATION_DATASET_ID
    

¿Qué sigue?