Utilizzo dell'API Cloud Healthcare per anonimizzare le immagini mediche

Last reviewed 2023-03-28 UTC

Questo tutorial mostra come utilizzare l'operazione di anonimizzazione DICOM dell'API Cloud Healthcare per rimuovere o modificare informazioni che consentono l'identificazione personale (PII) e informazioni sanitarie protette (PHI) dai dati (Digital Imaging and Communications in Medicine (DICOM)). L'anonimizzazione dei dati DICOM aiuta a garantire la privacy del paziente e a preparare i dati sanitari per l'utilizzo nella ricerca, nella condivisione dei dati e nel machine learning.

Il tutorial e il documento concettuale associato, Anonimizzazione delle immagini mediche tramite l'API Cloud Healthcare, sono destinati a ricercatori, data scientist, team IT e organizzazioni sanitarie e di scienze biologiche. Questo tutorial illustra due casi d'uso comuni di anonimizzazione dei dati delle immagini mediche mediante l'API Cloud Healthcare. Il documento concettuale spiega il motivo dell'anonimizzazione dei dati DICOM e evidenzia i suoi passaggi generali.

Questo tutorial presuppone che tu abbia una conoscenza di base di Linux. È utile anche una conoscenza di base di Google Cloud e degli standard DICOM. Esegui tutti i comandi di questo tutorial in un terminale Linux.

Obiettivi

  • Utilizzare l'operazione di anonimizzazione DICOM dell'API Cloud Healthcare per rimuovere o modificare PII e PHI nelle istanze DICOM in un archivio DICOM.
  • Rimuovere o modificare i metadati PII e PHI e il testo in sovrimpressione in un'unica chiamata API Cloud Healthcare.
  • Utilizza lo strumento a riga di comando curl o Google Cloud CLI per effettuare chiamate all'API Cloud Healthcare per l'anonimizzazione DICOM.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Prima di iniziare

Questo tutorial presuppone che le immagini DICOM siano già state importate in un archivio DICOM. Per informazioni sulla creazione di archivi DICOM su Google Cloud, consulta Creazione e gestione degli archivi DICOM. Per informazioni sull'importazione dei dati DICOM negli archivi DICOM, consulta Importazione ed esportazione dei dati DICOM tramite Cloud Storage.

Inoltre, questo tutorial presuppone che:

  • Stai lavorando in un progetto chiamato MyProj.
  • Hai creato un set di dati denominato dataset1 nella regione us-central1 di Google Cloud in MyProj.
  • Hai creato un archivio DICOM chiamato dicomstore1 in dataset1.

Se le risorse hanno un nome diverso, dovrai modificare di conseguenza i comandi elencati in questo documento.

  1. Nella console Google Cloud, vai alla pagina Selettore progetti.
    Vai alla pagina Selettore progetto
  2. Seleziona un progetto Google Cloud denominato MyProj.
  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Attiva Cloud Healthcare API.

    Abilita l'API

  5. Installa Google Cloud CLI.
  6. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  7. In una shell, esegui il comando gcloud components update per assicurarti di avere la versione più recente di gcloud CLI che include le funzionalità relative all'API Cloud Healthcare.

Creazione di un account di servizio IAM

Il ruolo Amministratore set di dati di Healthcare include tutti i ruoli richiesti per questo tutorial.

  1. Crea un account di servizio.

  2. Assegna il ruolo Amministratore set di dati Healthcare all'account di servizio.

  3. Crea e scarica la chiave JSON dell'account di servizio.

  4. Attiva la chiave dell'account di servizio:

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

    L'output è il seguente:

    Activated service account credentials for: [key-name@project-name.iam.gserviceaccount.com]
    
    • key-name è il nome che hai assegnato alla chiave dell'account di servizio.
    • project-name è il nome del tuo progetto Google Cloud.

Utilizzo di un visualizzatore di immagini mediche

Questo tutorial utilizza il visualizzatore diagnostico Mach7 come visualizzatore di immagini mediche. Puoi richiedere una versione dimostrativa del visualizzatore sul sito web di Mach7

Per utilizzare questo visualizzatore, assegna il ruolo Visualizzatore DICOM Healthcare al tuo account utente, seguendo questi passaggi:

  1. In qualità di amministratore della console Google Cloud, vai alla pagina IAM.

    Vai alla pagina IAM

  2. Fai clic su Aggiungi.

  3. Nel campo Nuove entità, inserisci il tuo account utente o il tuo indirizzo Gmail.

  4. Nell'elenco a discesa Seleziona un ruolo, scegli Cloud Healthcare.

  5. Tieni il puntatore del mouse su Cloud Healthcare e seleziona il ruolo Visualizzatore DICOM Healthcare.

  6. Fai clic su Salva.

Per utilizzare il visualizzatore a fini di produzione, devi ottenere una versione completa.

Ottenere un token di accesso OAuth 2.0

Per utilizzare l'API Cloud Healthcare per importare i dati, è necessario un token di accesso OAuth 2.0 ottenuto dai comandi in questo tutorial. In questo tutorial, alcune richieste dell'API Cloud Healthcare di esempio utilizzano lo strumento a riga di comando curl. In questi esempi viene utilizzato il comando gcloud auth print-access-token per ottenere un token di connessione OAuth 2.0 e per includere il token nell'intestazione di autorizzazione della richiesta. Per maggiori informazioni su questo comando, consulta gcloud auth application-default print-access-token.

Questo tutorial illustra due dei casi d'uso più comuni della rimozione delle informazioni di identificazione dai dati DICOM. In entrambi i casi, la soluzione viene fornita utilizzando lo strumento a riga di comando curl o Google Cloud CLI. Per ulteriori informazioni sull'anonimizzazione dei dati DICOM tramite l'API Cloud Healthcare, le opzioni di configurazione e i comandi curl e Windows PowerShell di esempio, consulta Anonimizzazione dei dati DICOM.

Imposta le variabili di ambiente

Questo passaggio si applica a entrambi i casi d'uso.

  • Esporta le variabili di ambiente in base alla posizione e agli attributi dell'archivio DICOM in cui sono archiviate le immagini.

    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 d'uso I: rimozione di tutti i metadati e oscuramento di tutto il testo in sovrimpressione

Questo caso d'uso mostra come anonimizzare un set di dati contenente archivi DICOM e dati DICOM, rimuovendo tutti i metadati (ad eccezione dei dati minimi richiesti per una risorsa DICOM valida) e oscurando tutto il testo in sovrimpressione dalle immagini DICOM. Puoi eseguire le seguenti operazioni:

  • Crea una richiesta POST e specifica il nome del set di dati di destinazione e un token di accesso.
  • Rimuovi tutti i metadati e crea un insieme di almeno keepList tag per avere una risorsa DICOM valida.
  • Oscura tutto il testo sensibile in sovrimpressione dall'immagine DICOM creando un oggetto DeidentifyConfig con image.text_redaction_mode impostato su REDACT_ALL_TEXT.

Puoi eseguire tutte queste funzioni con un solo comando curl come segue:

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'
        }
      }
    }" "http://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID:deidentify"

In alternativa, puoi completare la stessa operazione di anonimizzazione senza conoscere o specificare il nome di un tag utilizzando il profilo di filtro dei tag MINIMAL_KEEP_LIST_PROFILE. Vedi l'esempio che segue:

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'
        }
      }
    }" "http://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID:deidentify"

In tutti i comandi precedenti, se la richiesta ha esito positivo, il server restituisce una risposta in formato JSON, come la seguente:

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

La risposta contiene il nome di un'operazione. Puoi utilizzare il nome dell'operazione con il metodo get dell'operazione per monitorare lo stato dell'operazione.

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

Se la richiesta ha esito positivo, il server restituisce una risposta in formato JSON. Una volta completato il processo di anonimizzazione, la risposta include "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"
  }
}

Puoi anche utilizzare Google Cloud CLI per eseguire tutte le versioni dell'API Cloud Healthcare, inclusa l'API di anonimizzazione. Per un elenco completo dei comandi disponibili, consulta la documentazione gcloud dell'API Cloud Healthcare o esegui questo comando:

gcloud healthcare --help

Il seguente esempio mostra come utilizzare gcloud CLI per anonimizzare un set di dati contenente archivi DICOM e dati DICOM al fine di rimuovere tutti i metadati e oscurare tutto il testo in sovrimpressione dalle immagini 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 la richiesta ha esito positivo, il server restituisce una risposta simile alla seguente:

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

Per controllare lo stato dell'operazione, esegui questo comando:

gcloud healthcare operations describe --dataset $SOURCE_DATASET_ID OPERATION_NAME

Se la richiesta ha esito positivo, il server restituisce una risposta come la seguente. Al termine del processo di anonimizzazione, la risposta contiene "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 d'uso II: modifica dei metadati e oscuramento del testo sensibile in sovraimpressione

Questo caso d'uso mostra come anonimizzare un set di dati contenente archivi DICOM e dati DICOM utilizzando il metodo di filtro dei tag filterProfile per rimuovere alcuni metadati, modificare altri metadati e oscurare il testo sensibile in sovrimpressione associato alle immagini. L'obiettivo è oscurare il valore PERSON_NAME, sostituire il valore PHONE_NUMBER con asterischi e modificare DATE e DATE_OF_BIRTH in un valore di data compreso nell'intervallo di 100 giorni rispetto ai valori originali.

In questo caso d'uso, la chiave di crittografia fornita, U2FsdGVkX19bS2oZsdbK9X5zi2utBn22uY+I2Vo0zOU=, è una chiave con codifica Base64 a 256 bit criptata con AES e generata utilizzando il seguente comando. Quando richiesto, viene fornita una password vuota al comando:

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

Puoi eseguire le seguenti operazioni:

  • Crea una richiesta POST e specifica il nome del set di dati di destinazione e un token di accesso.
  • Rimuovi alcuni metadati e modifica altri metadati nei tag DICOM utilizzando il profilo di filtro DEIDENTIFY_TAG_CONTENT con combinazioni appropriate di tipi di informazioni e trasformazioni primitive.
  • Oscura il testo in sovrimpressione da un'immagine DICOM impostando image.text_redaction_mode su REDACT_SENSITIVE_TEXT.

Puoi eseguire tutte queste funzioni con un solo comando curl come segue:

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'}}}" \
"http://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID:deidentify"

Se la richiesta ha esito positivo, il server restituisce una risposta in formato JSON come il seguente:

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

La risposta contiene il nome di un'operazione. Puoi utilizzare il metodo dell'operazione get per monitorare lo stato dell'operazione:

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

Se la richiesta ha esito positivo, il server restituisce la seguente risposta in 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"
  }
}

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Elimina le singole risorse

  • Elimina i set di dati di destinazione. Se necessario, aggiungi il parametro --location e specifica la regione per il tuo set di dati.

    gcloud healthcare datasets delete $DESTINATION_DATASET_ID
    

Passaggi successivi