Como usar a API Cloud Healthcare para desidentificar imagens médicas

Last reviewed 2023-03-28 UTC

Neste tutorial, descrevemos como usar a operação de desidentificação DICOM da API Cloud Healthcare para remover ou modificar informações de identificação pessoal (PII, na sigla em inglês) e informações protegidas de saúde (PHI, na sigla em inglês) dos dados de imagens e comunicações digitais em medicina (DICOM, na sigla em inglês). A desidentificação de dados DICOM ajuda a garantir a privacidade do paciente e a preparar dados de saúde para uso em pesquisa, compartilhamento de dados e machine learning.

O tutorial e o respectivo documento conceitual, Desidentificação de imagens médicas por meio da API Cloud Healthcare, destinam-se a pesquisadores, cientistas de dados, equipes de TI e organizações de saúde e ciências. Neste tutorial, orientamos você em dois casos de uso comuns de desidentificação de dados de imagens médicas usando a API Cloud Healthcare. O documento conceitual explica a lógica da desidentificação de dados DICOM e descreve suas etapas de alto nível.

Neste tutorial, pressupõe-se que você tenha um conhecimento fundamental de Linux. Um entendimento básico dos padrões do Google Cloud e do DICOM também é útil. Execute todos os comandos deste tutorial em um terminal Linux.

Objetivos

  • Usar a operação de desidentificação DICOM da API Cloud Healthcare para remover ou modificar PII e PHI em instâncias DICOM em um armazenamento DICOM.
  • Remover ou modificar os metadados PII e PHI e o texto gravado em uma chamada da API Cloud Healthcare.
  • Use a ferramenta de linha de comando curl ou a Google Cloud CLI para fazer chamadas de API de desidentificação DICOM do Cloud Healthcare.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

Neste tutorial, pressupõe-se que suas imagens DICOM já foram importadas para um repositório DICOM. Para mais informações sobre como criar armazenamentos DICOM no Google Cloud, consulte Como criar e gerenciar armazenamentos DICOM. Para mais informações sobre como importar dados DICOM para armazenamentos DICOM, consulte Como importar e exportar dados DICOM usando o Cloud Storage.

Além disso, neste tutorial, pressupõe-se que:

  • você esteja trabalhando em um projeto chamado MyProj;
  • você criou um conjunto de dados chamado dataset1 na região us-central1do Google Cloud em MyProj;
  • você criou um armazenamento DICOM chamado dicomstore1 em dataset1.

Se os recursos forem nomeados de forma diferente, você precisará modificar os comandos listados neste documento.

  1. No Console do Google Cloud, acesse a página do Seletor de projetos.
    Acessar a página do seletor de projetos
  2. Selecione um projeto do Google Cloud chamado MyProj.
  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative a Cloud Healthcare API.

    Ative a API

  5. Instale a CLI do Google Cloud.
  6. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  7. Em um shell, execute o comando gcloud components update para verificar se você tem a versão mais recente da CLI gcloud que inclui a funcionalidade relacionada à API Cloud Healthcare.

Como criar uma conta de serviço do IAM

O papel de administrador do conjunto de dados do Healthcare inclui todos os papéis necessários para este tutorial.

  1. Crie uma conta de serviço.

  2. Atribua o papel de administrador do conjunto de dados do Healthcare à conta de serviço.

  3. Crie e faça o download da chave JSON da conta de serviço.

  4. Ative a chave da sua conta de serviço:

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

    A saída é esta:

    Activated service account credentials for: [key-name@project-name.iam.gserviceaccount.com]
    
    • key-name é o nome atribuído à chave da conta de serviço.
    • project-name é o nome do projeto do Google Cloud.

Como usar um visualizador de imagens médicas

Neste tutorial, usamos o visualizador de diagnóstico do Mach7 como um visualizador de imagens médicas. Solicite uma versão de demonstração do visualizador no site do Mach7.

Para usar esse visualizador, atribua o papel Leitor DICOM do Healthcare à sua conta de usuário executando as seguintes etapas:

  1. Como administrador no Console do Google Cloud, acesse a página IAM.

    Acessar a página do IAM

  2. Clique em Adicionar.

  3. No campo Novos membros, digite sua conta de usuário ou seu endereço do Gmail.

  4. Na lista suspensa Selecionar um papel, selecione Cloud Healthcare.

  5. Posicione o ponteiro sobre Cloud Healthcare e selecione o papel Leitor DICOM do Healthcare.

  6. Clique em Salvar.

Para usar o visualizador para fins de produção, é necessário ter uma versão completa.

Como conseguir um token de acesso OAuth 2.0

Para usar a API Cloud Healthcare para processar dados, você precisa de um token de acesso do OAuth 2.0 que os comandos deste tutorial conseguem para você. Neste tutorial, algumas das solicitações de exemplo da API Cloud Healthcare usam a ferramenta de linha de comando curl. Esses exemplos usam o comando gcloud auth print-access-token para receber um token do portador OAuth 2.0 e incluir o token no cabeçalho de autorização da solicitação. Para mais informações sobre esse comando, consulte gcloud auth application-default print-access-token.

Neste tutorial, explicamos dois dos casos de uso mais comuns da remoção de informações de identificação dos dados DICOM. Nos dois casos, a solução é fornecida usando a ferramenta de linha de comando curl ou a Google Cloud CLI. Para mais informações sobre como desidentificar dados DICOM usando a API Cloud Healthcare, opções de configuração e exemplos de comandos curl e Windows PowerShell, consulte Como desidentificar dados DICOM.

Configurar variáveis de ambiente

Essa etapa se aplica a ambos os casos de uso.

  • Exporte as variáveis de ambiente com base no local e nos atributos do armazenamento DICOM em que suas imagens estão armazenadas.

    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 de uso I: remover todos os metadados e editar todo o texto gravado

Este caso de uso mostra como desidentificar um conjunto de dados contendo armazenamentos e dados DICOM removendo todos os metadados (exceto os dados mínimos necessários para um recurso DICOM válido) e editando todo o texto gravado das imagens DICOM. Execute estas funções:

  • Crie uma solicitação POST e forneça o nome do conjunto de dados de destino e um token de acesso.
  • Remova todos os metadados e crie um conjunto de keepList para ter um recurso DICOM válido.
  • Edite um texto confidencial com gravação a partir da imagem DICOM criando um objeto DeidentifyConfig com image.text_redaction_mode definido como REDACT_ALL_TEXT.

É possível executar todas essas funções em um comando curl como este:

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"

Também é possível concluir a mesma operação de desidentificação sem saber ou especificar qualquer nome de tag usando o perfil de filtro de tag MINIMAL_KEEP_LIST_PROFILE. Veja o exemplo a seguir:

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"

Em todos os comandos anteriores, se a solicitação for bem-sucedida, o servidor retornará uma resposta no formato JSON, como o seguinte:

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

A resposta contém um nome de operação. Use o nome da operação com o método Operation get para rastrear o status da operação.

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"

Se a solicitação for bem-sucedida, o servidor retornará uma resposta no formato JSON: Depois que o processo de desidentificação for concluído, a resposta 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"
  }
}

Também é possível usar a Google Cloud CLI para o Google Cloud para executar todas as versões da API Cloud Healthcare, incluindo a API de desidentificação. Para ver uma lista completa dos comandos disponíveis, consulte a documentação gcloud da API Cloud Healthcare ou execute o seguinte comando:

gcloud healthcare --help

No exemplo a seguir, mostramos como usar a CLI gcloud para desidentificar um conjunto de dados contendo armazenamentos DICOM e dados DICOM para remover todos os metadados e editar todo o texto gravado das imagens 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

Se a solicitação for bem-sucedida, o servidor retornará uma resposta como a seguinte:

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 o status da operação, execute o seguinte comando:

gcloud healthcare operations describe --dataset $SOURCE_DATASET_ID OPERATION_NAME

Se a solicitação for bem-sucedida, o servidor retornará uma resposta como a seguinte. Depois que o processo de desidentificação for concluído, a resposta conterá "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 de uso II: modificar metadados e editar textos gravados confidenciais

Neste caso de uso, mostramos como desidentificar um conjunto de dados contendo armazenamentos DICOM e dados DICOM usando o método de filtragem de tag filterProfile para remover alguns metadados, modificar outros e editar texto confidencial associado a imagens. A meta é editar o valor PERSON_NAME, substituir o valor PHONE_NUMBER por asteriscos e modificar DATE e DATE_OF_BIRTH para um valor de data no intervalo de 100 dias dos valores originais.

Nesse caso de uso, a chave de criptografia fornecida, U2FsdGVkX19bS2oZsdbK9X5zi2utBn22uY+I2Vo0zOU=, é uma chave codificada em 64 bits com codificação AES de 256 bits gerada usando o comando a seguir. Quando solicitado, uma senha vazia é fornecida ao comando:

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

Execute estas funções:

  • Crie uma solicitação POST e forneça o nome do conjunto de dados de destino e um token de acesso.
  • Remova alguns metadados e modifique outros nas tags DICOM usando o perfil de filtro DEIDENTIFY_TAG_CONTENT com combinações apropriadas de tipos de informações e transformações primárias.
  • Edite o texto gravado de uma imagem DICOM definindo image.text_redaction_mode como REDACT_SENSITIVE_TEXT.

É possível executar todas essas funções em um comando curl como este:

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"

Se a solicitação for bem-sucedida, o servidor retornará uma resposta no formato JSON como a seguir:

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

A resposta contém um nome de operação. Use o método Operation get para rastrear o status da operação:

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"

Se a solicitação for bem-sucedida, o servidor retornará a seguinte resposta no formato 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"
  }
}

Limpeza

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Exclua o projeto

  1. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir recursos individuais

  • Exclua os conjuntos de dados de destino. Se necessário, adicione o parâmetro --location e especifique a região do conjunto de dados.

    gcloud healthcare datasets delete $DESTINATION_DATASET_ID
    

A seguir