Cloud Healthcare API を使用して医療画像を匿名化する

Last reviewed 2023-03-28 UTC

このチュートリアルでは、Cloud Healthcare API の DICOM 匿名化オペレーションを使用して、(Digital Imaging and Communications in Medicine(DICOM))データから個人を特定できる情報(PII)と保護対象保健情報(PHI)を取り除く方法について説明します。DICOM データを匿名化することで、患者のプライバシーを確保でき、医療データを研究、データ共有、ML に使用するための準備ができます。

このチュートリアルと付属のコンセプト ドキュメント(Cloud Healthcare API による医療画像の匿名化)は、研究者、データ サイエンティスト、IT チーム、医療機関、ライフ サイエンス機関を対象としています。このチュートリアルでは、Cloud Healthcare API を使用して医療画像データを匿名化する一般的な 2 つのユースケースを説明します。コンセプト ドキュメントでは、DICOM データの匿名化の根拠と、その大まかな手順について説明します。

このチュートリアルでは、Linux についての基本的な知識があることを前提としています。Google Cloud と DICOM 標準に関する基本的な知識があると、さらに理解しやすくなります。このチュートリアルのコマンドはすべて、Linux ターミナルで実行します。

目標

  • Cloud Healthcare API の DICOM 匿名化オペレーションを使用して、DICOM ストアの DICOM インスタンスで PII と PHI を削除または変更します。
  • 1 回の Cloud Healthcare API 呼び出しで、PII と PHI のメタデータと焼き付けテキストを削除または変更します。
  • curl コマンドライン ツールまたは Google Cloud CLI を使用して、DICOM 匿名化 Cloud Healthcare API 呼び出しを実行します。

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

このチュートリアルでは、DICOM イメージがすでに DICOM ストアにインポートされていることを前提としています。Google Cloud での DICOM ストアの作成については、DICOM ストアの作成と管理をご覧ください。DICOM データを DICOM ストアにインポートする方法については、Cloud Storage を使用した DICOM データのインポートとエクスポートをご覧ください。

このチュートリアルでのその他の前提条件は次のとおりです。

  • MyProj というプロジェクトで作業している。
  • MyProj の Google Cloud リージョン us-central1dataset1 というデータセットを作成している。
  • dataset1 に DICOM ストア dicomstore1 を作成している。

リソースの名前が異なる場合は、このドキュメントに記載されているコマンドを適宜変更する必要があります。

  1. Google Cloud コンソールで [プロジェクト セレクタ] ページに移動します。
    プロジェクトの選択ページに移動
  2. Google Cloud プロジェクト MyProj を選択します。
  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Cloud Healthcare API を有効にします。

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. シェルで gcloud components update コマンドを実行して、Cloud Healthcare API 関連の機能を含む最新バージョンの gcloud CLI がインストールされていることを確認します。

IAM サービス アカウントを作成する

Healthcare Dataset 管理者ロールには、このチュートリアルで必要な権限がすべて含まれています。

  1. サービス アカウントを作成します

  2. Healthcare Dataset 管理者ロールをサービス アカウントに割り当てます

  3. サービス アカウントの JSON キーを作成してダウンロードします

  4. サービス アカウント キーを有効にします。

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

    次のような出力が表示されます。

    Activated service account credentials for: [key-name@project-name.iam.gserviceaccount.com]
    
    • key-name は、サービス アカウント キーに割り当てた名前です。
    • project-name は Google Cloud プロジェクトの名前です。

医療画像ビューアの使用

このチュートリアルでは、Mach7 診断ビューアを医療画像ビューアとして使用します。ビューアのデモ版は Mach7 のウェブサイトでリクエストできます。

このビューア使用するには、次の手順でユーザー アカウントに Healthcare DICOM 閲覧者ロールを割り当てます。

  1. Google Cloud コンソールの管理者として [IAM] ページに移動します。

    [IAM] ページに移動

  2. [追加] をクリックします。

  3. [新しいプリンシパル] フィールドに、ユーザー アカウントまたは Gmail アドレスを入力します。

  4. [ロールを選択] プルダウン リストで [Cloud Healthcare] を選択します。

  5. [Cloud Healthcare] の上にポインタを置いて [Healthcare DICOM 閲覧者] ロールを選択します。

  6. [保存] をクリックします。

ビューアを本番環境で使用するには、完全版を入手する必要があります。

OAuth 2.0 アクセス トークンの取得

Cloud Healthcare API を使用してデータを取り込むには OAuth 2.0 アクセス トークンが必要です。このトークンは、このチュートリアルにあるコマンドによって取得されます。このチュートリアルでは、Cloud Healthcare API リクエストのいくつかの例で curl コマンドライン ツールが使用されています。これらの例では、gcloud auth print-access-token コマンドを使用して OAuth 2.0 署名なしトークンを取得し、このトークンをリクエストの認証ヘッダーに組み込みます。このコマンドの詳細については、gcloud auth application-default print-access-token をご覧ください。

このチュートリアルでは、DICOM データから個人を特定できる情報を削除する最も一般的な 2 つのユースケースについて説明します。両方のケースで curl コマンドライン ツールまたは Google Cloud CLI を使用します。Cloud Healthcare API を使用した DICOM データの匿名化、構成オプション、サンプルの curl および Windows PowerShell コマンドの詳細については、DICOM データの匿名化をご覧ください。

環境変数を設定する

この手順は両方のユースケースに適用されます。

  • 画像が保存されている DICOM ストアの場所と属性に基づいて、環境変数をエクスポートします。

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

ユースケース I: すべてのメタデータを削除し、焼き付きテキストをすべて秘匿化する

このユースケースでは、すべてのメタデータ(有効な DICOM リソースに必要な最小限のデータを除く)を削除し、DICOM 画像の焼き付きテキストをすべて秘匿化することで、DICOM ストアと DICOM データを含むデータセットを匿名化する方法を示します。次の機能を実行できます。

  • POST リクエストを作成し、宛先データセットの名前とアクセス トークンを指定する。
  • すべてのメタデータを削除し、有効な DICOM リソースを保持するために必要な最小限の keepList タグのセットを作成する。
  • image.text_redaction_modeREDACT_ALL_TEXT に設定した DeidentifyConfig オブジェクトを作成して DICOM イメージの機密焼き付きテキストをすべて秘匿化する。

次に示すように、これらの機能はすべて 1 つの curl コマンドで実行できます。

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"

また、タグ名がわからない場合やタグ名を指定しない場合でも、MINIMAL_KEEP_LIST_PROFILE タグフィルタ プロファイルを使用して同じ匿名化オペレーションを実行できます。次の例をご覧ください。

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"

ここまでのすべてのコマンドでは、リクエストが成功すると、サーバーは次のように JSON 形式のレスポンスを返します。

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

レスポンスにはオペレーション名が含まれています。このオペレーション名を 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"

リクエストが成功すると、サーバーは JSON 形式のレスポンスを返します。匿名化プロセスが完了すると、レスポンスには "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"
  }
}

Google Cloud CLI を使用して Google Cloud で、匿名化 API を含む Cloud Healthcare API のすべてのバージョンを実行することもできます。使用可能なすべてのコマンドのリストについては、Cloud Healthcare API gcloud のドキュメントを参照するか、次のコマンドを実行してください。

gcloud healthcare --help

次の例は、gcloud CLI を使用して、DICOM ストアと DICOM データを含むデータセットを匿名化し、すべてのメタデータを削除して、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

リクエストが成功すると、サーバーは次のようなレスポンスを返します。

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

オペレーションのステータスを確認するには、次のコマンドを実行します。

gcloud healthcare operations describe --dataset $SOURCE_DATASET_ID OPERATION_NAME

リクエストが成功すると、サーバーは次のようなレスポンスを返します。匿名化プロセスが完了すると、レスポンスには "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'

ユースケース II: メタデータの変更と焼き付けテキストの秘匿化

このユースケースでは、DICOM ストアと DICOM データを含むデータセットを匿名化するため、filterProfile タグ フィルタリング メソッドを使用して一部のメタデータを削除し、他のメタデータを変更して、画像に関連付けられている機密焼き付けテキストを秘匿化する方法を示します。目標は、PERSON_NAME 値を秘匿化し、PHONE_NUMBER 値をアスタリスクに置き換え、DATEDATE_OF_BIRTH を元の値の前後 100 日間の範囲の日付値に変更することです。

このユースケースでは、指定される暗号鍵 U2FsdGVkX19bS2oZsdbK9X5zi2utBn22uY+I2Vo0zOU= は、次のコマンドを使用して生成された AES 暗号化 256 ビットの Base64 エンコード鍵です。プロンプトが表示されたら、コマンドに空のパスワードを指定します。

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

次の機能を実行できます。

  • POST リクエストを作成し、宛先データセットの名前とアクセス トークンを指定する。
  • 適切な情報タイプとプリミティブ変換の組み合わせを指定した DEIDENTIFY_TAG_CONTENT フィルタ プロファイルを使用して、DICOM タグの一部のメタデータを削除し、その他のメタデータを変更する。
  • image.text_redaction_mode を REDACT_SENSITIVE_TEXT に設定して、DICOM イメージの焼き付きテキストを秘匿化する。

次に示すように、これらの機能はすべて 1 つの curl コマンドで実行できます。

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"

リクエストが成功すると、サーバーは次のような JSON 形式のレスポンスを返します。

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

レスポンスにはオペレーション名が含まれています。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"

リクエストが成功すると、サーバーは 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"
  }
}

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

個々のリソースの削除

  • 宛先データセットを削除します。必要に応じて、--location パラメータを追加し、データセットのリージョンを指定します。

    gcloud healthcare datasets delete $DESTINATION_DATASET_ID
    

次のステップ