Utiliser l'API Cloud Healthcare pour la pathologie numérique

Cette page explique comment stocker, analyser et gérer des images de diapositives entières (Whole slide images, WSI) à l'aide de l'API Cloud Healthcare.

Présentation

La pathologie numérique permet de stocker, de traiter et de gérer des diapositives en verre classiques en les numérisant pour produire des images de diapositives entières (WSI).

Les fichiers WSI sont généralement des fichiers volumineux pouvant atteindre plusieurs Go. Ils sont disponibles dans différents formats, ce qui peut les rendre difficiles à gérer. L'API Cloud Healthcare simplifie le processus de stockage, d'analyse et de gestion des fichiers WSI.

Stocker des images de diapositives entières à l'aide de DICOM

L'API Cloud Healthcare fournit un service géré pour le stockage d'images DICOM. Ce service permet également de stocker et de récupérer des WSI. Pour plus d'informations sur DICOM dans l'API Cloud Healthcare, consultez la page DICOM.

L'utilisation de DICOM présente les avantages suivants :

  • Compatibilité avec plusieurs fournisseurs et logiciels.
  • DICOM est un format de fichier ainsi qu'un protocole réseau qui définit les API DICOMweb et DIMSE. Ces API, utilisées pour récupérer et stocker des instances DICOM, offrent de nombreuses fonctionnalités et simplifient l'interaction avec les images.

Convertir des images de diapositives entières en fichiers DICOM

La plupart des scanneurs WSI ne produisent pas de fichiers DICOM natifs à partir des WSI. Par conséquent, vous devez convertir les WSI en fichiers DICOM manuellement.

Les outils suivants peuvent convertir des WSI en fichiers DICOM :

La section suivante montre comment générer des fichiers DICOM à l'aide de l'outil de ligne de commande wsi2dcm.

Générer des fichiers DICOM à l'aide de l'outil de ligne de commande wsi2dcm

Avant d'effectuer les étapes suivantes, assurez-vous de disposer d'un fichier WSI valide. Des exemples de données sont disponibles sur OpenSlide et d'autres ressources répertoriées sur le site Web Digital Pathology Association.

Exécutez l'outil de ligne de commande wsi2dcm :

wsi2dcm \
    --input=INPUT_WSI \
    --outFolder=PATH/TO/OUTPUT/FOLDER \
    --seriesDescription=WSI_DESCRIPTION

où :

  • INPUT_WSI est le chemin d'accès et le nom du fichier WSI.
  • PATH/TO/OUTPUT/FOLDER est le chemin d'accès au fichier DICOM converti par l'outil.
  • WSI_DESCRIPTION est la description du fichier DICOM converti que vous avez choisi.

L'exécution de l'outil génère plusieurs fichiers DICOM à partir d'une image WSI. Les fichiers DICOM comportent le suffixe .dcm.

Importer des fichiers DICOM dans l'API Cloud Healthcare

Si vous n'avez pas encore créé de magasin DICOM, faites-le maintenant.

Vous pouvez importer les fichiers DICOM générés dans un magasin DICOM à l'aide de l'une des méthodes suivantes :

Récupérer des fichiers DICOM et leurs métadonnées

Après avoir importé les fichiers DICOM dans un magasin DICOM, vous pouvez répertorier et afficher les métadonnées des images DICOM.

Répertorier l'intégralité des images de diapositives entières

Chaque WSI est une étude DICOM. Pour répertorier les WSI, vous pouvez appeler la méthode dicomStores.searchForStudies :

curl

Pour rechercher des études dans un magasin DICOM, envoyez une requête GET et spécifiez les informations suivantes :

  • Nom de l'ensemble de données parent
  • Le nom du magasin DICOM
  • Un jeton d'accès

L'exemple suivant montre une requête GET utilisant curl.

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies"

Si la requête aboutit, le serveur renvoie la réponse au format JSON :

[
  {
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    }
  },
  {
    "00080005": {
      "vr": "CS",
      "Value": [
        "SPECIFIC_CHARACTER_SET"
      ]
    },
    "00080020": {
      "vr": "DA",
      "Value": [
        "STUDY_DATE"
      ]
    },
    "00080030": {
      "vr": "TM"
    },
    "00080050": {
      "vr": "SH",
      "Value": [
        "ACCESSION_NUMBER"
      ]
    },
    "00080090": {
      "vr": "PN"
    },
    "00100010": {
      "vr": "PN"
    },
    "00100020": {
      "vr": "LO",
      "Value": [
        "PATIENT_ID"
      ]
    },
    "00100030": {
      "vr": "DA"
    },
    "00100040": {
      "vr": "CS"
    },
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    },
    "00200010": {
      "vr": "SH"
    }
  }
]

PowerShell

Pour rechercher des études dans un magasin DICOM, envoyez une requête GET et spécifiez les informations suivantes :

  • Nom de l'ensemble de données parent
  • Le nom du magasin DICOM
  • Un jeton d'accès

L'exemple suivant montre une requête GET utilisant Windows PowerShell.

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-RestMethod `
  -Method Get `
  -Headers $headers `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies"

Si la requête aboutit, le serveur envoie la réponse au format JSON :

[
  {
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    }
  },
  {
    "00080005": {
      "vr": "CS",
      "Value": [
        "SPECIFIC_CHARACTER_SET"
      ]
    },
    "00080020": {
      "vr": "DA",
      "Value": [
        "STUDY_DATE"
      ]
    },
    "00080030": {
      "vr": "TM"
    },
    "00080050": {
      "vr": "SH",
      "Value": [
        "ACCESSION_NUMBER"
      ]
    },
    "00080090": {
      "vr": "PN"
    },
    "00100010": {
      "vr": "PN"
    },
    "00100020": {
      "vr": "LO",
      "Value": [
        "PATIENT_ID"
      ]
    },
    "00100030": {
      "vr": "DA"
    },
    "00100040": {
      "vr": "CS"
    },
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    },
    "00200010": {
      "vr": "SH"
    }
  }
]

Afficher les métadonnées des images de diapositives entières

Chaque étude contient plusieurs instances, chacune comportant un sous-ensemble des tuiles d'une image WSI. Pour afficher les métadonnées d'une instance dans l'étude, appelez la méthode dicomStores.searchForInstances :

curl

Pour afficher les métadonnées d'une instance dans l'étude, envoyez une requête GET et spécifiez les informations suivantes :

  • Nom de l'ensemble de données parent
  • Le nom du magasin DICOM
  • L'identifiant unique (UID) de l'instance dans l'étude
  • Un jeton d'accès

L'exemple suivant montre une requête GET utilisant curl.

curl -X GET \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/instances?StudyInstanceUID=STUDY_INSTANCE_UID"

Si la requête aboutit, le serveur renvoie la réponse au format JSON :

[
  {
    "00080005": {
      "vr": "CS",
      "Value": [
        "SPECIFIC_CHARACTER_SET"
      ]
    },
    "00080016": {
      "vr": "UI",
      "Value": [
        "SOP_CLASS_UID"
      ]
    },
    "00080018": {
      "vr": "UI",
      "Value": [
        "SOP_INSTANCE_UID"
      ]
    },
    "00080020": {
      "vr": "DA",
      "Value": [
        "STUDY_DATE"
      ]
    },
    "00080030": {
      "vr": "TM"
    },
    "00080050": {
      "vr": "SH",
      "Value": [
        "ACCESSION_NUMBER"
      ]
    },
    "00080060": {
      "vr": "CS",
      "Value": [
        "MODALITY"
      ]
    },
    "00080090": {
      "vr": "PN"
    },
    "00100010": {
      "vr": "PN"
    },
    "00100020": {
      "vr": "LO",
      "Value": [
        "PATIENT_ID"
      ]
    },
    "00100030": {
      "vr": "DA"
    },
    "00100040": {
      "vr": "CS"
    },
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    },
    "0020000E": {
      "vr": "UI",
      "Value": [
        "SERIES_INSTANCE_UID"
      ]
    },
    "00200010": {
      "vr": "SH"
    },
    "00200013": {
      "vr": "IS",
      "Value": [
        INSTANCE_NUMBER
      ]
    },
    "00280010": {
      "vr": "US",
      "Value": [
        ROWS
      ]
    },
    "00280011": {
      "vr": "US",
      "Value": [
        COLUMNS
      ]
    },
    "00280100": {
      "vr": "US",
      "Value": [
        BITS_ALLOCATED
      ]
    },
    "00400244": {
      "vr": "DA",
      "Value": [
        "PERFORMED_PROCEDURE_STEP_START_DATE"
      ]
    }
  },
...
]

PowerShell

Pour afficher les métadonnées de toutes les instances de l'étude, envoyez une requête GET et spécifiez les informations suivantes :

  • Nom de l'ensemble de données parent
  • Le nom du magasin DICOM
  • L'UID de l'instance dans l'étude
  • Un jeton d'accès

L'exemple suivant montre une requête GET utilisant Windows PowerShell.

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-RestMethod `
  -Method Get `
  -Headers $headers `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/instances?StudyInstanceUID=STUDY_INSTANCE_UID"

Si la requête aboutit, le serveur renvoie la réponse au format JSON :

[
  {
    "00080005": {
      "vr": "CS",
      "Value": [
        "SPECIFIC_CHARACTER_SET"
      ]
    },
    "00080016": {
      "vr": "UI",
      "Value": [
        "SOP_CLASS_UID"
      ]
    },
    "00080018": {
      "vr": "UI",
      "Value": [
        "SOP_INSTANCE_UID"
      ]
    },
    "00080020": {
      "vr": "DA",
      "Value": [
        "STUDY_DATE"
      ]
    },
    "00080030": {
      "vr": "TM"
    },
    "00080050": {
      "vr": "SH",
      "Value": [
        "ACCESSION_NUMBER"
      ]
    },
    "00080060": {
      "vr": "CS",
      "Value": [
        "MODALITY"
      ]
    },
    "00080090": {
      "vr": "PN"
    },
    "00100010": {
      "vr": "PN"
    },
    "00100020": {
      "vr": "LO",
      "Value": [
        "PATIENT_ID"
      ]
    },
    "00100030": {
      "vr": "DA"
    },
    "00100040": {
      "vr": "CS"
    },
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    },
    "0020000E": {
      "vr": "UI",
      "Value": [
        "SERIES_INSTANCE_UID"
      ]
    },
    "00200010": {
      "vr": "SH"
    },
    "00200013": {
      "vr": "IS",
      "Value": [
        INSTANCE_NUMBER
      ]
    },
    "00280010": {
      "vr": "US",
      "Value": [
        ROWS
      ]
    },
    "00280011": {
      "vr": "US",
      "Value": [
        COLUMNS
      ]
    },
    "00280100": {
      "vr": "US",
      "Value": [
        BITS_ALLOCATED
      ]
    },
    "00400244": {
      "vr": "DA",
      "Value": [
        "PERFORMED_PROCEDURE_STEP_START_DATE"
      ]
    }
  },
...
]

Afficher l'ensemble des tuiles des images de diapositives entières

Chaque instance contient généralement plusieurs cadres. Un cadre représente une tuile de l'image WSI à un niveau de zoom particulier dans la "pyramide" WSI. Pour récupérer un seule cadre au format JPEG, appelez la méthode frames.retrieveRendered :

curl

Pour récupérer un seul cadre au format JPEG, envoyez une requête GET et spécifiez les informations suivantes :

  • Nom de l'ensemble de données parent
  • Le nom du magasin DICOM
  • L'UID de l'étude
  • L'UID de la série
  • L'UID de l'instance
  • Un jeton d'accès

L'exemple suivant montre une requête GET utilisant curl.

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Accept: image/jpeg" \
    --output FILENAME \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID/frames/0/rendered"

Si la requête aboutit, le fichier JPEG est écrit sur votre ordinateur.

PowerShell

Pour récupérer un seul cadre au format JPEG, envoyez une requête GET et spécifiez les informations suivantes :

  • Nom de l'ensemble de données parent
  • Le nom du magasin DICOM
  • L'UID de l'étude
  • L'UID de la série
  • L'UID de l'instance
  • Un jeton d'accès

L'exemple suivant montre une requête GET utilisant Windows PowerShell.

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred"; "Accept" = "image/jpeg" }

Invoke-RestMethod `
  -Method Get `
  -Headers $headers `
  -OutFile FILENAME `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID/frames/0/rendered"

Si la requête aboutit, le fichier JPEG est écrit sur votre ordinateur.

Récupérer toutes les images de diapositives entières

Pour récupérer l'intégralité de l'instance, qui contient les WSI, utilisez la méthode instances.retrieveInstance :

curl

Pour récupérer une instance entière, envoyez une requête GET et spécifiez les informations suivantes :

  • Nom de l'ensemble de données parent
  • Le nom du magasin DICOM
  • L'UID de l'étude
  • L'UID de la série
  • L'UID de l'instance
  • Un jeton d'accès

L'exemple suivant montre une requête GET utilisant curl.

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Accept: application/dicom" \
    --output FILENAME \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID"

Si la requête aboutit, le fichier DICOM est écrit sur votre ordinateur.

PowerShell

Pour récupérer une instance entière, envoyez une requête GET et spécifiez les informations suivantes :

  • Nom de l'ensemble de données parent
  • Le nom du magasin DICOM
  • L'UID de l'étude
  • L'UID de la série
  • L'UID de l'instance
  • Un jeton d'accès

L'exemple suivant montre une requête GET utilisant Windows PowerShell.

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred"; "Accept" = "application/dicom" }

Invoke-RestMethod `
  -Method Get `
  -Headers $headers `
  -OutFile FILENAME `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID"

Si la requête aboutit, le fichier DICOM est écrit sur votre ordinateur.

Afficher une diapositive à l'aide d'une visionneuse d'images de diapositives entières

Les sections précédentes expliquaient comment afficher les métadonnées d'un fichier WSI et récupérer des tuiles individuelles. Pour afficher l'intégralité de l'image WSI, vous devez utiliser la visionneuse WSI fournie par DICOMweb.

Les visionneuses suivantes sont compatibles avec l'API Cloud Healthcare :

Afficher les fichiers WSI DSIOM convertis à l'aide de la visionneuse de WSI DICOMweb

Renseignez les sections suivantes pour utiliser la visionneuse de WSI DICOMweb pour afficher les fichiers WSI DICOM.

Télécharger la visionneuse

Téléchargez la visionneuse de WSI DICOMweb :

git clone https://github.com/GoogleCloudPlatform/dicomweb-wsi-viewer.git

Obtenir le code secret du client

Le code secret du client authentifie un utilisateur lorsqu'il accède à une application. Vous intégrez le code secret du client dans le code source de la visionneuse de WSI DICOM. Pour obtenir le code secret du client, procédez comme suit :

  1. Accédez à la page Identifiants dans Google Cloud Console.
    Accéder à la page "Identifiants"

  2. Cliquez sur Créer des identifiants, puis sélectionnez ID client OAuth.

  3. Sous Type d'application, sélectionnez Application Web.

  4. Ajoutez le nom de votre choix.

  5. Dans les champs Origines JavaScript autorisées et URI de redirection autorisés, saisissez http://localhost:8000.

  6. Cliquez sur Créer, puis sur OK dans la fenêtre Client OAuth qui s'affiche. Copiez l'ID client pour l'utiliser dans la section suivante.

Configurer le code secret du client dans la visionneuse

Effectuez la procédure suivante en utilisant l'ID client que vous avez obtenu à la section précédente :

  1. Dans le répertoire dicomweb-wsi-viewer, ouvrez le fichier viewer.js.

  2. Remplacez la ligne suivante afin qu'elle contienne votre ID client.

    const CLIENT_ID = 'INSERT-YOUR-CLIENT-ID-HERE'
    

    La ligne doit ressembler à l'exemple suivant :

    const CLIENT_ID = 'PROJECT_ID-VALUE.apps.googleusercontent.com';
    
  3. Enregistrez le fichier.

Si vous n'avez pas encore configuré l'écran d'autorisation OAuth de votre projet Google Cloud, procédez comme suit :

  1. Accédez à l'écran d'autorisation OAuth.
    Accédez à l'écran d'autorisation OAuth.

  2. Sous Adresse e-mail d'assistance, sélectionnez l'adresse e-mail que vous souhaitez afficher en tant que contact public. Celle-ci doit correspondre à votre adresse e-mail ou à un groupe Google dont vous êtes le propriétaire.

  3. Saisissez le nom de l'application que vous souhaitez afficher.

  4. Cliquez sur Ajouter un champ d'application. Dans la boîte de dialogue qui s'affiche, saisissez https://www.googleapis.com/auth/cloud-healthcare, puis cliquez sur Ajouter.

  5. Cliquez sur Save.

Pour modifier ultérieurement les informations affichées sur l'écran d'autorisation OAuth, comme le nom du produit ou l'adresse e-mail, répétez les étapes de configuration précédentes.

Si vous avez déjà configuré l'écran d'autorisation OAuth de votre projet Google Cloud, vous devez ajouter https://www.googleapis.com/auth/cloud-healthcare dans la boîte de dialogue Ajouter un champ d'application.

Exécuter la visionneuse de WSI DICOMweb

  1. Exécutez la commande suivante dans le répertoire dicomweb-wsi-viewer :

    python -m SimpleHTTPServer 8000
    
  2. Accédez à https://localhost:8000 sur la machine où vous avez exécuté la commande précédente.

  3. Dans l'interface utilisateur, cliquez sur Connexion/Autoriser pour accéder à l'écran d'autorisation OAuth et autoriser la visionneuse à accéder à votre projet Google Cloud et aux ressources de l'API Cloud Healthcare.