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.
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ãous-central1
do Google Cloud emMyProj
; - você criou um armazenamento DICOM chamado
dicomstore1
emdataset1
.
Se os recursos forem nomeados de forma diferente, você precisará modificar os comandos listados neste documento.
- No Console do Google Cloud, acesse a página do Seletor de projetos.
Acessar a página do seletor de projetos - Selecione um projeto do Google Cloud chamado
MyProj
. -
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
-
Ative a Cloud Healthcare API.
- Instale a CLI do Google Cloud.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
- 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.
Atribua o papel de administrador do conjunto de dados do Healthcare à conta de serviço.
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:
Como administrador no Console do Google Cloud, acesse a página IAM.
Clique em Adicionarperson_add.
No campo Novos membros, digite sua conta de usuário ou seu endereço do Gmail.
Na lista suspensa Selecionar um papel, selecione Cloud Healthcare.
Posicione o ponteiro sobre Cloud Healthcare e selecione o papel Leitor DICOM do Healthcare.
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
comimage.text_redaction_mode
definido comoREDACT_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
- No Console do Google Cloud, acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- 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
- Desidentificação de imagens médicas por meio da API Cloud Healthcare
- Como desidentificar os dados DICOM
- Anúncio da API Healthcare Beta
- Como exportar metadados do DICOM para o BigQuery
- Para mais informações sobre recursos DICOM, consulte a instrução de conformidade DICOM.
Para mais informações sobre a API Cloud Healthcare, incluindo informações sobre suporte para FHIR e HL7v2, consulte a documentação da API Cloud Healthcare.
Confira arquiteturas de referência, diagramas e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.