Utiliser l'API Cloud Healthcare pour anonymiser des images médicales

Last reviewed 2023-03-28 UTC

Ce tutoriel explique comment utiliser l'opération d'anonymisation DICOM de l'API Cloud Healthcare pour supprimer ou modifier des informations personnelles et des données de santé protégées dans des données DICOM (Digital Imaging and Communications in Medicine). L'anonymisation des données DICOM contribue à garantir la confidentialité des données du patient et à préparer les données de santé en vue de leur utilisation dans le cadre de travaux de recherche, du partage de données et du machine learning.

Le tutoriel et le document conceptuel associé, Supprimer l'identification des images médicales à l'aide de l'API Cloud Healthcare, sont destinés aux chercheurs, aux data scientists, aux équipes informatiques, et aux organisations du secteur de la santé et des sciences de la vie. Ce tutoriel vous guide tout au long de deux cas d'utilisation courants de l'anonymisation des données d'imagerie médicale à l'aide de l'API Cloud Healthcare. Le document conceptuel explique la logique de l'anonymisation des données DICOM et en décrit les étapes générales.

Dans ce tutoriel, nous partons du principe que vous disposez de connaissances de base sur Linux. Il est également utile de connaître les concepts fondamentaux liés à Google Cloud et aux normes DICOM. Exécutez toutes les commandes de ce tutoriel dans un terminal Linux.

Objectifs

  • Utiliser l'opération d'anonymisation DICOM de l'API Cloud Healthcare pour supprimer ou modifier des informations personnelles et des données de santé protégées dans les instances DICOM d'un magasin DICOM
  • Supprimer ou modifier du texte incrusté et des métadonnées d'informations personnelles et de données de santé protégées dans un appel d'API Cloud Healthcare
  • Utilisez l'outil de ligne de commande curl ou Google Cloud CLI pour effectuer des appels d'API Cloud Healthcare d'anonymisation DICOM.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Dans ce tutoriel, nous partons du principe que vos images DICOM ont déjà été importées dans un magasin DICOM. Pour plus d'informations sur la création de magasins DICOM sur Google Cloud, consultez la page Créer et gérer des magasins DICOM. Pour plus d'informations sur l'importation de données DICOM dans des magasins DICOM, consultez la page Importer et exporter des données DICOM à l'aide de Cloud Storage.

Dans ce tutoriel, nous partons également du principe que :

  • vous travaillez sur un projet appelé MyProj ;
  • vous avez créé un ensemble de données appelé dataset1 dans la région Google Cloud us-central1 dans MyProj ;
  • vous avez créé un magasin DICOM appelé dicomstore1 dans dataset1.

Si vos ressources portent un nom différent, vous devez modifier les commandes répertoriées dans ce document en conséquence.

  1. Dans Google Cloud Console, accédez à la page Sélecteur de projet.
    Accéder à la page "Sélecteur de projet"
  2. Sélectionnez un projet Google Cloud appelé MyProj.
  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activez Cloud Healthcare API.

    Activer l'API

  5. Installez Google Cloud CLI.
  6. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  7. Dans un shell, exécutez la commande gcloud components update pour vous assurer que vous disposez de la dernière version de gcloud CLI incluant les fonctionnalités liées à l'API Cloud Healthcare.

Créer un compte de service IAM

Le rôle "Administrateur d'ensembles de données Healthcare" inclut tous les rôles requis pour ce tutoriel.

  1. Créez un compte de service.

  2. Attribuez le rôle "Administrateur d'ensembles de données Healthcare" au compte de service.

  3. Créez et téléchargez la clé JSON du compte de service.

  4. Activez la clé de votre compte de service :

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

    Le résultat est le suivant :

    Activated service account credentials for: [key-name@project-name.iam.gserviceaccount.com]
    
    • key-name est le nom que vous avez attribué à la clé du compte de service.
    • project-name est le nom de votre projet Google Cloud.

Utiliser une visionneuse d'images médicales

Ce tutoriel utilise la visionneuse de diagnostic Mach7 comme visionneuse d'images médicales. Vous pouvez demander une version de démonstration de la visionneuse sur le site Web de Mach7.

Pour utiliser cette visionneuse, attribuez le rôle "Lecteur de Healthcare DICOM" à votre compte utilisateur en procédant comme suit :

  1. En tant qu'administrateur dans Google Cloud Console, accédez à la page IAM.

    Accéder à la page IAM

  2. Cliquez sur Ajouter.

  3. Dans le champ Nouveaux comptes principaux, saisissez votre compte utilisateur ou votre adresse Gmail.

  4. Dans la liste déroulante Sélectionnez un rôle, sélectionnez Cloud Healthcare.

  5. Placez le pointeur de la souris sur Cloud Healthcare, puis sélectionnez le rôle Lecteur de Healthcare DICOM.

  6. Cliquez sur Save.

Pour utiliser la visionneuse à des fins de production, vous devez obtenir une version complète.

Obtenir un jeton d'accès OAuth 2.0

Pour ingérer des données à l'aide de l'API Cloud Healthcare, vous devez disposer d'un jeton d'accès OAuth 2.0 que les commandes de ce tutoriel vous fournissent. Dans ce tutoriel, certains exemples de requêtes API Cloud Healthcare utilisent l'outil de ligne de commande curl. Ces exemples font appel à la commande gcloud auth print-access-token pour obtenir un jeton de support OAuth 2.0 et pour inclure ce jeton dans l'en-tête d'autorisation de la requête. Pour en savoir plus sur cette commande, consultez la page sur gcloud auth application-default print-access-token.

Ce tutoriel traite deux des cas d'utilisation les plus courants de l'anonymisation des informations d'identification dans des données DICOM. Dans les deux cas, la solution est fournie à l'aide de l'outil de ligne de commande curl ou de Google Cloud CLI. Pour obtenir plus d'informations sur l'anonymisation des données DICOM à l'aide de l'API Cloud Healthcare, ainsi que des options de configuration et des exemples de commandes curl et Windows PowerShell, consultez la page Supprimer l'identification des données DICOM.

Configurer des variables d'environnement

Cette étape s'applique aux deux cas d'utilisation.

  • Exportez les variables d'environnement en fonction de l'emplacement et des attributs du magasin DICOM dans lequel vos images sont stockées.

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

Cas d'utilisation I : supprimer toutes les métadonnées et masquer l'ensemble du texte incrusté

Ce cas d'utilisation montre comment anonymiser un ensemble de données contenant des magasins DICOM et des données DICOM en supprimant toutes les métadonnées (à l'exception des données minimales requises pour disposer d'une ressource DICOM valide) et en masquant l'ensemble du texte incrusté des images DICOM. Vous pouvez effectuer les opérations suivantes :

  • Créez une requête POST et indiquez le nom de l'ensemble de données de destination ainsi qu'un jeton d'accès.
  • Supprimez toutes les métadonnées, puis créez un ensemble de tags keepList minimaux requis pour disposer d'une ressource DICOM valide.
  • Masquez tout le texte incrusté sensible de l'image DICOM en créant un objet DeidentifyConfig avec image.text_redaction_mode défini sur REDACT_ALL_TEXT.

Vous pouvez effectuer l'ensemble de ces opérations à l'aide d'une seule commande curl comme suit :

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"

Vous pouvez également effectuer la même opération d'anonymisation sans connaître ni spécifier de nom de tag à l'aide du profil de filtrage de tags MINIMAL_KEEP_LIST_PROFILE. Consultez l'exemple ci-dessous :

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"

Dans toutes les commandes précédentes, si la requête aboutit, le serveur affiche une réponse au format JSON, comme suit :

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

La réponse contient un nom d'opération. Vous pouvez utiliser le nom de l'opération avec la méthode Operation get pour suivre l'état de l'opération.

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 requête aboutit, le serveur affiche une réponse au format JSON. Une fois le processus d'anonymisation terminé, la réponse inclut "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"
  }
}

Vous pouvez également utiliser Google Cloud CLI pour exécuter toutes les versions de l'API Cloud Healthcare, y compris l'API d'anonymisation. Pour obtenir la liste complète des commandes disponibles, consultez la documentation gcloud de l'API Cloud Healthcare ou exécutez la commande suivante :

gcloud healthcare --help

L'exemple suivant montre comment utiliser gcloud CLI pour anonymiser un ensemble de données contenant des magasins DICOM et des données DICOM afin de supprimer toutes les métadonnées et masquer l'ensemble du texte incrusté des images 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 requête aboutit, le serveur affiche une réponse de ce type :

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

Pour vérifier l'état de l'opération, exécutez la commande suivante :

gcloud healthcare operations describe --dataset $SOURCE_DATASET_ID OPERATION_NAME

Si la requête aboutit, le serveur affiche une réponse semblable à celle présentée ci-dessous. Une fois le processus d'anonymisation terminé, la réponse contient "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'

Cas d'utilisation II : modifier les métadonnées et masquer le texte incrusté sensible

Ce cas d'utilisation montre comment anonymiser un ensemble de données contenant des magasins DICOM et des données DICOM à l'aide de la méthode de filtrage de tags filterProfile, pour supprimer certaines métadonnées, en modifier d'autres et masquer le texte incrusté sensible associé aux images. L'objectif est de masquer la valeur PERSON_NAME, remplacer la valeur PHONE_NUMBER par des astérisques, et remplacer DATE et DATE_OF_BIRTH par une valeur de date comprise dans une plage de 100 jours par rapport aux valeurs d'origine.

Dans ce cas d'utilisation, la clé cryptographique fournie, U2FsdGVkX19bS2oZsdbK9X5zi2utBn22uY+I2Vo0zOU=, est une clé 256 bits encodée en base64 et chiffrée par AES, générée à l'aide de la commande suivante. Lorsque l'invite correspondante s'affiche, un mot de passe vide est fourni à la commande :

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

Vous pouvez effectuer les opérations suivantes :

  • Créez une requête POST et indiquez le nom de l'ensemble de données de destination ainsi qu'un jeton d'accès.
  • Supprimez certaines métadonnées et modifiez-en d'autres dans les tags DICOM en utilisant le profil de filtrage DEIDENTIFY_TAG_CONTENT avec les combinaisons appropriées de types d'informations et de transformations primitives.
  • Masquez le texte incrusté d'une image DICOM en définissant image.text_redaction_mode sur REDACT_SENSITIVE_TEXT.

Vous pouvez effectuer l'ensemble de ces opérations à l'aide d'une seule commande curl comme suit :

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 requête aboutit, le serveur affiche une réponse au format JSON comme suit :

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

La réponse contient un nom d'opération. Vous pouvez suivre l'état de l'opération à l'aide de la méthode 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"

Si la requête aboutit, le serveur affiche la réponse suivante au format 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"
  }
}

Nettoyer

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Supprimer le projet

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer les ressources individuelles

  • Supprimez les ensembles de données de destination. Si nécessaire, ajoutez le paramètre --location et spécifiez la région pour votre ensemble de données.

    gcloud healthcare datasets delete $DESTINATION_DATASET_ID
    

Étape suivante