DicomConfig를 사용하여 DICOM 데이터 익명화하기

이 페이지에서는 v1 DicomConfig 구성을 사용하여 다음 수준에서 DICOM 인스턴스의 민감한 정보를 익명화하는 방법을 설명합니다.

이 페이지에서는 DICOM 저장소 수준에서 데이터를 익명화할 때 필터를 적용하는 방법도 설명합니다.

익명화 개요

데이터 세트 수준 익명화

데이터 세트 수준에서 DICOM 데이터를 익명화하려면 datasets.deidentify 작업을 호출합니다. 익명화 API 호출에는 다음과 같은 구성요소가 있습니다.

  • 소스 데이터 세트: 민감한 정보가 있는 인스턴스가 하나 이상 있는 DICOM 저장소가 포함된 데이터 세트입니다. deidentify 작업을 호출하면 데이터 세트의 모든 DICOM 저장소에 있는 모든 인스턴스가 익명화됩니다.
  • 대상 데이터 세트: 익명화는 원본 데이터 세트 또는 해당 데이터에 영향을 주지 않습니다. 대신 원본 데이터의 익명화된 복사본이 대상 데이터 세트라고 하는 새 데이터 세트에 기록됩니다.
  • 익명화할 대상: 데이터 세트 처리 방법을 지정하는 구성 매개변수입니다. DICOM 이미지에서 인스턴스 메타데이터(태그 키워드 사용) 또는 번인 텍스트를 익명화하도록 DICOM 익명화를 구성할 수 있습니다.DeidentifyConfig 객체를 만들고 다음 작업을 수행합니다.
    • 요청 본문의 config 필드 설정
    • Cloud Storage에 JSON 형식으로 저장하고 요청 본문의 gcsConfigUri 필드를 사용하여 버킷의 파일 위치 지정

이 가이드의 샘플 대부분은 데이터 세트 수준에서 DICOM 데이터를 익명화하는 방법을 보여줍니다.

DICOM 저장소 수준 익명화

DICOM 저장소 수준에서 DICOM 데이터를 익명화하면 어떤 데이터가 익명화되는지 보다 세부적으로 제어할 수 있습니다. 예를 들어 여러 DICOM 저장소가 있는 데이터 세트가 있는 경우 저장소에 있는 데이터 유형에 따라 각 DICOM 저장소를 익명화할 수 있습니다.

DICOM 저장소에서 DICOM 데이터를 익명화하려면 dicomStores.deidentify 메서드를 호출합니다. 익명화 API 호출에는 다음과 같은 구성요소가 있습니다.

  • 소스 DICOM 저장소: 민감한 정보가 있는 인스턴스가 하나 이상 포함된 DICOM 저장소입니다. deidentify 작업을 호출하면 DICOM 저장소의 모든 인스턴스가 익명화됩니다.
  • 대상 DICOM 저장소: 익명화는 원래 DICOM 저장소 또는 데이터에 영향을 주지 않습니다. 대신 원본 데이터의 익명화된 복사본이 대상 DICOM 저장소에 기록됩니다. 대상 DICOM 저장소가 이미 있어야 합니다.
  • 익명화할 대상: DICOM 저장소를 처리하는 방법을 지정하는 구성 매개변수입니다. 이러한 매개변수를 DeidentifyConfig 객체에서 지정하고 다음 중 하나를 수행하여 전달하여 DICOM 이미지에서 DICOM 인스턴스 메타데이터(태그 키워드 사용) 또는 번인 텍스트를 익명화하도록 DICOM 익명화를 구성할 수 있습니다.
    • 요청 본문의 config 필드 설정
    • Cloud Storage에 JSON 형식으로 저장하고 요청 본문의 gcsConfigUri 필드를 사용하여 버킷의 파일 위치 지정

DICOM 저장소 수준에서 DICOM 데이터를 익명화하는 방법의 예시는 DICOM 저장소 수준에서 데이터 익명화를 참조하세요.

필터

필터 파일을 구성하고 dicomStores.deidentify 요청에 파일을 지정하면 DICOM 저장소의 데이터 하위 집합을 익명화할 수 있습니다. 예시는 DICOM 저장소의 하위 집합 익명화를 참조하세요.

샘플 개요

이 가이드의 샘플은 단일 DICOM 인스턴스를 사용하지만 여러 인스턴스를 익명화할 수도 있습니다.

다음 각 섹션에서는 다양한 방법을 사용하여 DICOM 데이터를 익명화하는 방법을 설명합니다. 익명화된 이미지의 출력은 각 샘플에 제공됩니다. 각 샘플은 다음과 같은 원본 이미지를 입력으로 사용합니다.

xray_original

각 익명화 작업의 출력 이미지를 이 원본 이미지와 비교하여 작업의 효과를 확인할 수 있습니다.

DICOM 태그 익명화

DICOM 메타데이터의 태그 키워드를 기준으로 DICOM 인스턴스를 익명화할 수 있습니다. DicomConfig 객체에서는 다음과 같은 태그 필터링 메서드를 사용할 수 있습니다.

  • keepList: 유지할 태그의 목록입니다. 다른 모든 태그는 삭제됩니다.
  • removeList: 삭제할 태그의 목록입니다. 다른 모든 태그는 유지됩니다.
  • filterProfile: 유지하거나 삭제할 태그를 결정하는 데 사용되는 태그 필터링 프로필입니다.

이 섹션의 각 샘플에는 DICOM 인스턴스에서 변경된 메타데이터의 출력이 제공됩니다. 다음은 각 샘플의 입력으로 사용되는 인스턴스의 원본 메타데이터입니다.

[
  {
    "00020002":{"vr":"UI","Value":["1.2.840.10008.5.1.4.1.1.7"]},
     "00020003":{"vr":"UI","Value":["1.2.276.0.7230010.3.1.4.8323329.78.1539083058.523695"]},
     "00020010":{"vr":"UI","Value":["1.2.840.10008.1.2.4.50"]},
     "00020012":{"vr":"UI","Value":["1.2.276.0.7230010.3.0.3.6.1"]},
     "00020013":{"vr":"SH","Value":["OFFIS_DCMTK_361"]},
     "00080005":{"vr":"CS","Value":["ISO_IR 100"]},
     "00080016":{"vr":"UI","Value":["1.2.840.10008.5.1.4.1.1.7"]},
     "00080018":{"vr":"UI","Value":["1.2.276.0.7230010.3.1.4.8323329.78.1539083058.523695"]},
     "00080020":{"vr":"DA","Value":["20110909"]},
     "00080030":{"vr":"TM","Value":["110032"]},
     "00080050":{"vr":"SH"},
     "00080064":{"vr":"CS","Value":["WSD"]},
     "00080070":{"vr":"LO","Value":["Manufacturer"]},
     "00080090":{"vr":"PN","Value":[{"Alphabetic":"John Doe"}]},
     "00081090":{"vr":"LO","Value":["ABC1"]},
     "00100010":{"vr":"PN","Value":[{"Alphabetic":"Ann Johnson"}]},
     "00100020":{"vr":"LO","Value":["S1214223-1"]},
     "00100030":{"vr":"DA","Value":["19880812"]},
     "00100040":{"vr":"CS","Value":["F"]},
     "0020000D":{"vr":"UI","Value":["2.25.70541616638819138568043293671559322355"]},
     "0020000E":{"vr":"UI","Value":["1.2.276.0.7230010.3.1.3.8323329.78.1531234558.523694"]},
     "00200010":{"vr":"SH"},
     "00200011":{"vr":"IS"},
     "00200013":{"vr":"IS"},
     "00200020":{"vr":"CS"},
     "00280002":{"vr":"US","Value":[3]},
     "00280004":{"vr":"CS","Value":["YBR_FULL_422"]},
     "00280006":{"vr":"US","Value":[0]},
     "00280010":{"vr":"US","Value":[1024]},
     "00280011":{"vr":"US","Value":[1024]},
     "00280100":{"vr":"US","Value":[8]},
     "00280101":{"vr":"US","Value":[8]},
     "00280102":{"vr":"US","Value":[7]},
     "00280103":{"vr":"US","Value":[0]},
     "00282110":{"vr":"CS","Value":["01"]},
     "00282114":{"vr":"CS","Value":["ISO_10918_1"]}
  }
]

keeplist 태그를 사용한 익명화

DicomConfig 객체에 keeplist 태그를 지정하면 기본적으로 다음 태그가 추가됩니다.

  • StudyInstanceUID
  • SeriesInstanceUID
  • SOPInstanceUID
  • TransferSyntaxUID
  • MediaStorageSOPInstanceUID
  • MediaStorageSOPClassUID
  • PixelData
  • Rows
  • Columns
  • SamplesPerPixel
  • BitsAllocated
  • BitsStored
  • Highbit
  • PhotometricInterpretation
  • PixelRepresentation
  • NumberOfFrames
  • PlanarConfiguration
  • PixelAspectRatio
  • SmallestImagePixelValue
  • LargestImagePixelValue
  • RedPaletteColorLookupTableDescriptor
  • GreenPaletteColorLookupTableDescriptor
  • BluePaletteColorLookupTableDescriptor
  • RedPaletteColorLookupTableData
  • GreenPaletteColorLookupTableData
  • BluePaletteColorLookupTableData
  • ICCProfile
  • ColorSpace
  • WindowCenter
  • WindowWidth
  • VOILUTFunction

deidentify 작업은 이전 태그를 수정하지 않습니다. 그러나 일부 태그의 값이 다시 생성되므로 확정적 변환을 통해 다른 값으로 바뀝니다. 자세한 내용은 DICOM 표준의 UID 옵션 유지를 참조하세요. 이전 태그의 원래 값을 보존하려면 SkipIdRedaction 옵션을 사용합니다.

keeplist 태그가 제공되지 않으면 데이터 세트의 DICOM 태그가 수정되지 않습니다.

다음 샘플은 DICOM 저장소 및 DICOM 데이터가 포함된 데이터 세트를 익명화하고 일부 태그는 변경하지 않은 상태로 유지하는 방법을 보여줍니다.

Cloud Healthcare API에 이미지를 제출하면 이미지가 다음과 같이 표시됩니다. 이미지 상단 모서리에 표시되는 메타데이터가 수정되었지만 이미지 하단에 있는 번인 보호 상태 정보(PHI)는 유지됩니다. 번인 텍스트도 삭제하려면 이미지에서 번인 텍스트 수정을 참조하세요.

dicom_keeplist

REST

  1. 데이터 세트를 익명화합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • SOURCE_DATASET_ID: 익명화할 데이터가 포함된 데이터 세트의 ID
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID

    JSON 요청 본문:

    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "keepList": {
            "tags": [
              "PatientID"
            ]
          }
        }
      }
    }
    

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    cat > request.json << 'EOF'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "keepList": {
            "tags": [
              "PatientID"
            ]
          }
        }
      }
    }
    EOF

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify"

    PowerShell

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    @'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "keepList": {
            "tags": [
              "PatientID"
            ]
          }
        }
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

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

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify" | Select-Object -Expand Content
    출력은 다음과 같습니다. 응답에는 장기 실행 작업의 식별자가 포함됩니다. 메서드 호출을 완료하는 데 상당한 시간이 걸릴 수 있는 장기 실행 작업은 반환됩니다. OPERATION_ID의 값을 확인합니다. 다음 단계에서 이 값이 필요합니다.

  2. projects.locations.datasets.operations.get 메서드를 사용하여 장기 실행 작업의 상태를 가져옵니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • DATASET_ID: 데이터 세트 ID
    • LOCATION: 데이터 세트 위치
    • OPERATION_ID: 장기 실행 작업에서 반환된 ID

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력은 다음과 같습니다. 응답에 "done": true가 포함되었으면 장기 실행 작업이 완료된 것입니다.
  3. 익명화가 성공하면 익명화된 인스턴스의 메타데이터를 검색하여 어떻게 변경되었는지 확인할 수 있습니다. 익명화된 인스턴스에는 새로운 연구 UID, 시리즈 UID, 인스턴스 UID가 있으므로 먼저 새 데이터 세트에서 익명화된 인스턴스를 검색해야 합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • SOURCE_DATASET_LOCATION: 소스 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

    다음 표는 연구 UID, 시리즈 UID, 인스턴스 UID가 어떻게 변경되었는지 보여줍니다.
      원본 인스턴스 메타데이터 익명화된 인스턴스 메타데이터
    연구 UID(0020000D) 2.25.70541616638819138568043293671559322355 1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763
    시리즈 UID(0020000E) 1.2.276.0.7230010.3.1.3.8323329.78.1531234558.523694 1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710
    인스턴스 UID(00080018) 1.2.276.0.7230010.3.1.4.8323329.78.1539083058.523695 1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029
  4. 새 값을 사용하여 인스턴스의 메타데이터를 검색합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력에 새 메타데이터가 포함됩니다. 새 메타데이터를 원본 메타데이터와 비교하여 변환의 효과를 확인할 수 있습니다.

Go

import (
	"context"
	"fmt"
	"io"
	"time"

	healthcare "google.golang.org/api/healthcare/v1"
)

// deidentifyDataset creates a new dataset containing de-identified data from the source dataset.
func deidentifyDataset(w io.Writer, projectID, location, sourceDatasetID, destinationDatasetID string) error {
	ctx := context.Background()

	healthcareService, err := healthcare.NewService(ctx)
	if err != nil {
		return fmt.Errorf("healthcare.NewService: %w", err)
	}

	datasetsService := healthcareService.Projects.Locations.Datasets

	parent := fmt.Sprintf("projects/%s/locations/%s", projectID, location)

	req := &healthcare.DeidentifyDatasetRequest{
		DestinationDataset: fmt.Sprintf("%s/datasets/%s", parent, destinationDatasetID),
		Config: &healthcare.DeidentifyConfig{
			Dicom: &healthcare.DicomConfig{
				KeepList: &healthcare.TagFilterList{
					Tags: []string{
						"PatientID",
					},
				},
			},
		},
	}

	sourceName := fmt.Sprintf("%s/datasets/%s", parent, sourceDatasetID)
	resp, err := datasetsService.Deidentify(sourceName, req).Do()
	if err != nil {
		return fmt.Errorf("Deidentify: %w", err)
	}

	// Wait for the deidentification operation to finish.
	operationService := healthcareService.Projects.Locations.Datasets.Operations
	for {
		op, err := operationService.Get(resp.Name).Do()
		if err != nil {
			return fmt.Errorf("operationService.Get: %w", err)
		}
		if !op.Done {
			time.Sleep(1 * time.Second)
			continue
		}
		if op.Error != nil {
			return fmt.Errorf("deidentify operation error: %v", *op.Error)
		}
		fmt.Fprintf(w, "Created de-identified dataset %s from %s\n", resp.Name, sourceName)
		return nil
	}
}

Java

import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.healthcare.v1.CloudHealthcare;
import com.google.api.services.healthcare.v1.CloudHealthcare.Projects.Locations.Datasets;
import com.google.api.services.healthcare.v1.CloudHealthcareScopes;
import com.google.api.services.healthcare.v1.model.DeidentifyConfig;
import com.google.api.services.healthcare.v1.model.DeidentifyDatasetRequest;
import com.google.api.services.healthcare.v1.model.DicomConfig;
import com.google.api.services.healthcare.v1.model.Operation;
import com.google.api.services.healthcare.v1.model.TagFilterList;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;

public class DatasetDeIdentify {
  private static final String DATASET_NAME = "projects/%s/locations/%s/datasets/%s";
  private static final JsonFactory JSON_FACTORY = new GsonFactory();
  private static final NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  public static void datasetDeIdentify(String srcDatasetName, String destDatasetName)
      throws IOException {
    // String srcDatasetName =
    //     String.format(DATASET_NAME, "your-project-id", "your-region-id", "your-src-dataset-id");
    // String destDatasetName =
    //    String.format(DATASET_NAME, "your-project-id", "your-region-id", "your-dest-dataset-id");

    // Initialize the client, which will be used to interact with the service.
    CloudHealthcare client = createClient();

    // Configure what information needs to be De-Identified.
    // For more information on de-identifying using tags, please see the following:
    // https://cloud.google.com/healthcare/docs/how-tos/dicom-deidentify#de-identification_using_tags
    TagFilterList tags = new TagFilterList().setTags(Arrays.asList("PatientID"));
    DicomConfig dicomConfig = new DicomConfig().setKeepList(tags);
    DeidentifyConfig config = new DeidentifyConfig().setDicom(dicomConfig);

    // Create the de-identify request and configure any parameters.
    DeidentifyDatasetRequest deidentifyRequest =
        new DeidentifyDatasetRequest().setDestinationDataset(destDatasetName).setConfig(config);
    Datasets.Deidentify request =
        client.projects().locations().datasets().deidentify(srcDatasetName, deidentifyRequest);

    // Execute the request, wait for the operation to complete, and process the results.
    try {
      Operation operation = request.execute();
      while (operation.getDone() == null || !operation.getDone()) {
        // Update the status of the operation with another request.
        Thread.sleep(500); // Pause for 500ms between requests.
        operation =
            client
                .projects()
                .locations()
                .datasets()
                .operations()
                .get(operation.getName())
                .execute();
      }
      System.out.println(
          "De-identified Dataset created. Response content: " + operation.getResponse());
    } catch (Exception ex) {
      System.out.printf("Error during request execution: %s", ex.toString());
      ex.printStackTrace(System.out);
    }
  }

  private static CloudHealthcare createClient() throws IOException {
    // Use Application Default Credentials (ADC) to authenticate the requests
    // For more information see https://cloud.google.com/docs/authentication/production
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    // Create a HttpRequestInitializer, which will provide a baseline configuration to all requests.
    HttpRequestInitializer requestInitializer =
        request -> {
          new HttpCredentialsAdapter(credential).initialize(request);
          request.setConnectTimeout(60000); // 1 minute connect timeout
          request.setReadTimeout(60000); // 1 minute read timeout
        };

    // Build the client for interacting with the service.
    return new CloudHealthcare.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer)
        .setApplicationName("your-application-name")
        .build();
  }
}

Node.js

const google = require('@googleapis/healthcare');
const healthcare = google.healthcare({
  version: 'v1',
  auth: new google.auth.GoogleAuth({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  }),
});

const deidentifyDataset = async () => {
  // TODO(developer): uncomment these lines before running the sample
  // const cloudRegion = 'us-central1';
  // const projectId = 'adjective-noun-123';
  // const sourceDatasetId = 'my-source-dataset';
  // const destinationDatasetId = 'my-destination-dataset';
  // const keeplistTags = 'PatientID'
  const sourceDataset = `projects/${projectId}/locations/${cloudRegion}/datasets/${sourceDatasetId}`;
  const destinationDataset = `projects/${projectId}/locations/${cloudRegion}/datasets/${destinationDatasetId}`;
  const request = {
    sourceDataset: sourceDataset,
    destinationDataset: destinationDataset,
    resource: {
      config: {
        dicom: {
          keepList: {
            tags: [keeplistTags],
          },
        },
      },
    },
  };

  await healthcare.projects.locations.datasets.deidentify(request);
  console.log(
    `De-identified data written from dataset ${sourceDatasetId} to dataset ${destinationDatasetId}`
  );
};

deidentifyDataset();

Python

# Imports the Dict type for runtime type hints.
from typing import Dict

def deidentify_dataset(
    project_id: str,
    location: str,
    dataset_id: str,
    destination_dataset_id: str,
) -> Dict[str, str]:
    """Uses a DICOM tag keeplist to create a new dataset containing de-identified DICOM data from the source dataset.

    See
    https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/datasets
    before running the sample.
    See https://googleapis.github.io/google-api-python-client/docs/dyn/healthcare_v1.projects.locations.datasets.html#deidentify
    for the Python API reference.

    Args:
      project_id: The project ID or project number of the Google Cloud project you want
          to use.
      location: The name of the dataset's location.
      dataset_id: The ID of the source dataset containing the DICOM store to de-identify.
      destination_dataset_id: The ID of the dataset where de-identified DICOM data
        is written.

    Returns:
      A dictionary representing a long-running operation that results from
      calling the 'DeidentifyDataset' method. Use the
      'google.longrunning.Operation'
      API to poll the operation status.
    """
    # Imports the Python built-in time module.
    import time

    # Imports the Google API Discovery Service.
    from googleapiclient import discovery

    # Imports HttpError from the Google Python API client errors module.
    from googleapiclient.errors import HttpError

    api_version = "v1"
    service_name = "healthcare"
    # Returns an authorized API client by discovering the Healthcare API
    # and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
    client = discovery.build(service_name, api_version)

    # TODO(developer): Uncomment these lines and replace with your values.
    # project_id = 'my-project'
    # location = 'us-central1'
    # dataset_id = 'my-source-dataset'
    # destination_dataset_id = 'my-destination-dataset'
    source_dataset = "projects/{}/locations/{}/datasets/{}".format(
        project_id, location, dataset_id
    )
    destination_dataset = "projects/{}/locations/{}/datasets/{}".format(
        project_id, location, destination_dataset_id
    )

    body = {
        "destinationDataset": destination_dataset,
        "config": {
            "dicom": {
                "keepList": {
                    "tags": [
                        "Columns",
                        "NumberOfFrames",
                        "PixelRepresentation",
                        "MediaStorageSOPClassUID",
                        "MediaStorageSOPInstanceUID",
                        "Rows",
                        "SamplesPerPixel",
                        "BitsAllocated",
                        "HighBit",
                        "PhotometricInterpretation",
                        "BitsStored",
                        "PatientID",
                        "TransferSyntaxUID",
                        "SOPInstanceUID",
                        "StudyInstanceUID",
                        "SeriesInstanceUID",
                        "PixelData",
                    ]
                }
            }
        },
    }

    request = (
        client.projects()
        .locations()
        .datasets()
        .deidentify(sourceDataset=source_dataset, body=body)
    )

    # Set a start time for operation completion.
    start_time = time.time()
    # TODO(developer): Increase the max_time if de-identifying many resources.
    max_time = 600

    try:
        operation = request.execute()
        while not operation.get("done", False):
            # Poll until the operation finishes.
            print("Waiting for operation to finish...")
            if time.time() - start_time > max_time:
                raise RuntimeError("Timed out waiting for operation to finish.")
            operation = (
                client.projects()
                .locations()
                .datasets()
                .operations()
                .get(name=operation["name"])
                .execute()
            )
            # Wait 5 seconds between each poll to the operation.
            time.sleep(5)

        if operation.get("error"):
            raise TimeoutError(f"De-identify operation failed: {operation['error']}")
        else:
            print(f"De-identified data to dataset: {destination_dataset_id}")
            print(
                f"Resources succeeded: {operation.get('metadata').get('counter').get('success')}"
            )
            print(
                f"Resources failed: {operation.get('metadata').get('counter').get('failure')}"
            )
            return operation

    except HttpError as err:
        # A common error is when the destination dataset already exists.
        if err.resp.status == 409:
            raise RuntimeError(
                f"Destination dataset with ID {destination_dataset_id} already exists."
            )
        else:
            raise err

removelist 태그를 사용한 익명화

DicomConfig 객체에서 removelist를 지정할 수 있습니다. deidentify 작업은 목록에 지정된 태그만 수정합니다. removelist 태그를 제공하지 않으면 익명화 작업이 일반적으로 수행되지만, 대상 데이터 세트의 DICOM 태그가 수정되지 않습니다.

removelist를 지정하면 오버레이 데이터에 PHI가 포함될 수 있으므로 기본적으로 OverlayData 태그가 추가됩니다.

기본적으로 keeplist에 추가된 태그는 removelist에 추가할 수 없습니다.

다음 샘플은 removelist에서 모든 태그를 삭제하여 DICOM 저장소 및 DICOM 데이터가 포함된 데이터 세트를 익명화하는 방법을 보여줍니다. removelist에 없는 태그는 변경되지 않습니다.

Cloud Healthcare API에 이미지를 제출하면 이미지가 다음과 같이 표시됩니다. 삭제 목록에 제공된 태그 외에 PatientBirthDate만 이미지에서 삭제됩니다. 이미지에 표시되는 메타데이터에 해당하는 삭제 목록의 유일한 태그이기 때문입니다.

이미지 상단의 PatientBirthDate는 removelist의 구성에 따라 수정되었지만 이미지 하단의 번인 PHI는 그대로 유지됩니다. 번인 텍스트도 삭제하려면 이미지에서 번인 텍스트 수정을 참조하세요.

dicom_removelist

REST

  1. 데이터 세트를 익명화합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • SOURCE_DATASET_ID: 익명화할 데이터가 포함된 데이터 세트의 ID
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID

    JSON 요청 본문:

    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "removeList": {
            "tags": [
              "PatientBirthName",
              "PatientBirthDate",
              "PatientAge",
              "PatientSize",
              "PatientWeight",
              "PatientAddress",
              "PatientMotherBirthName"
            ]
          }
        }
      }
    }
    

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    cat > request.json << 'EOF'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "removeList": {
            "tags": [
              "PatientBirthName",
              "PatientBirthDate",
              "PatientAge",
              "PatientSize",
              "PatientWeight",
              "PatientAddress",
              "PatientMotherBirthName"
            ]
          }
        }
      }
    }
    EOF

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify"

    PowerShell

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    @'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "removeList": {
            "tags": [
              "PatientBirthName",
              "PatientBirthDate",
              "PatientAge",
              "PatientSize",
              "PatientWeight",
              "PatientAddress",
              "PatientMotherBirthName"
            ]
          }
        }
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

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

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify" | Select-Object -Expand Content
    출력은 다음과 같습니다. 응답에는 장기 실행 작업의 식별자가 포함됩니다. 메서드 호출을 완료하는 데 상당한 시간이 걸릴 수 있는 장기 실행 작업은 반환됩니다. OPERATION_ID의 값을 확인합니다. 다음 단계에서 이 값이 필요합니다.

  2. projects.locations.datasets.operations.get 메서드를 사용하여 장기 실행 작업의 상태를 가져옵니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • DATASET_ID: 데이터 세트 ID
    • LOCATION: 데이터 세트 위치
    • OPERATION_ID: 장기 실행 작업에서 반환된 ID

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력은 다음과 같습니다. 응답에 "done": true가 포함되었으면 장기 실행 작업이 완료된 것입니다.
  3. 익명화가 성공하면 익명화된 인스턴스의 메타데이터를 검색하여 어떻게 변경되었는지 확인할 수 있습니다. 익명화된 인스턴스에는 새로운 연구 UID, 시리즈 UID, 인스턴스 UID가 있으므로 먼저 새 데이터 세트에서 익명화된 인스턴스를 검색해야 합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • SOURCE_DATASET_LOCATION: 소스 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

    다음 표는 연구 UID, 시리즈 UID, 인스턴스 UID가 어떻게 변경되었는지 보여줍니다.
      원본 인스턴스 메타데이터 익명화된 인스턴스 메타데이터
    연구 UID(0020000D) 2.25.70541616638819138568043293671559322355 1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763
    시리즈 UID(0020000E) 1.2.276.0.7230010.3.1.3.8323329.78.1531234558.523694 1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710
    인스턴스 UID(00080018) 1.2.276.0.7230010.3.1.4.8323329.78.1539083058.523695 1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029
  4. 새 값을 사용하여 인스턴스의 메타데이터를 검색합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력에 새 메타데이터가 포함됩니다. 새 메타데이터를 원본 메타데이터와 비교하여 변환의 효과를 확인할 수 있습니다.

태그 필터 프로필을 사용한 익명화

유지하거나 삭제할 태그를 지정하는 대신 DicomConfig 객체에서 TagFilterProfile을 구성할 수 있습니다. 태그 필터 프로필은 유지, 삭제 또는 변환할 태그를 결정하는 사전 정의된 프로필입니다. 사용 가능한 프로필은 TagFilterProfile 문서를 참조하세요.

다음 샘플은 태그 필터 프로필 ATTRIBUTE_CONFIDENTIALITY_BASIC_PROFILE을 사용하여 DICOM 저장소 및 DICOM 데이터가 포함된 데이터 세트를 익명화하는 방법을 보여줍니다. 이 태그 필터 프로필은 DICOM 표준의 속성 비밀유지 기본 프로필에 따라 태그를 삭제합니다. Cloud Healthcare API는 속성 비밀유지 기본 프로필을 완전히 준수하지 않습니다. 예를 들어 Cloud Healthcare API는 태그 작업을 선택할 때 정보 객체 정의(IOD) 제한을 확인하지 않습니다.

ATTRIBUTE_CONFIDENTIALITY_BASIC_PROFILE 태그 필터 프로필을 사용하여 Cloud Healthcare API에 이미지를 제출하면 이미지가 다음과 같이 표시됩니다. 이미지의 상단 모서리에 표시된 메타데이터가 수정되었지만 이미지 하단에 있는 번인 PHI는 그대로 유지됩니다. 번인 텍스트도 삭제하려면 이미지에서 번인 텍스트 수정을 참조하세요.

dicom_attribute_confidentiality_basic_profile

REST

  1. 데이터 세트를 익명화합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • SOURCE_DATASET_ID: 익명화할 데이터가 포함된 데이터 세트의 ID
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID

    JSON 요청 본문:

    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "ATTRIBUTE_CONFIDENTIALITY_BASIC_PROFILE"
        }
      }
    }
    

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    cat > request.json << 'EOF'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "ATTRIBUTE_CONFIDENTIALITY_BASIC_PROFILE"
        }
      }
    }
    EOF

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify"

    PowerShell

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    @'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "ATTRIBUTE_CONFIDENTIALITY_BASIC_PROFILE"
        }
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

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

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify" | Select-Object -Expand Content
    출력은 다음과 같습니다. 응답에는 장기 실행 작업의 식별자가 포함됩니다. 메서드 호출을 완료하는 데 상당한 시간이 걸릴 수 있는 장기 실행 작업은 반환됩니다. OPERATION_ID의 값을 확인합니다. 다음 단계에서 이 값이 필요합니다.

  2. projects.locations.datasets.operations.get 메서드를 사용하여 장기 실행 작업의 상태를 가져옵니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • DATASET_ID: 데이터 세트 ID
    • LOCATION: 데이터 세트 위치
    • OPERATION_ID: 장기 실행 작업에서 반환된 ID

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력은 다음과 같습니다. 응답에 "done": true가 포함되었으면 장기 실행 작업이 완료된 것입니다.
  3. 익명화가 성공하면 익명화된 인스턴스의 메타데이터를 검색하여 어떻게 변경되었는지 확인할 수 있습니다. 익명화된 인스턴스에는 새로운 연구 UID, 시리즈 UID, 인스턴스 UID가 있으므로 먼저 새 데이터 세트에서 익명화된 인스턴스를 검색해야 합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • SOURCE_DATASET_LOCATION: 소스 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

    다음 표는 연구 UID, 시리즈 UID, 인스턴스 UID가 어떻게 변경되었는지 보여줍니다.
      원본 인스턴스 메타데이터 익명화된 인스턴스 메타데이터
    연구 UID(0020000D) 2.25.70541616638819138568043293671559322355 1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763
    시리즈 UID(0020000E) 1.2.276.0.7230010.3.1.3.8323329.78.1531234558.523694 1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710
    인스턴스 UID(00080018) 1.2.276.0.7230010.3.1.4.8323329.78.1539083058.523695 1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029
  4. 새 값을 사용하여 인스턴스의 메타데이터를 검색합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력에 새 메타데이터가 포함됩니다. 새 메타데이터를 원본 메타데이터와 비교하여 변환의 효과를 확인할 수 있습니다.

Google Cloud Console에서 데이터 익명화

Google Cloud 콘솔에서 데이터를 익명화하려면 다음 단계를 완료합니다.

  1. Google Cloud 콘솔에서 데이터 세트 페이지로 이동합니다.

    데이터 세트 페이지로 이동

  2. 익명화할 데이터 세트의 작업 목록에서 익명화를 선택합니다.

    익명화 데이터 세트 페이지가 표시됩니다.

  3. 대상 데이터 세트 설정을 선택하고 익명화된 데이터를 저장할 새 데이터 세트의 이름을 입력합니다.

  4. DICOM 태그 익명화를 선택하여 데이터를 익명화할 프로필을 선택합니다. 데이터는 다음과 같이 익명화될 수 있습니다.

  5. DICOM 번인 텍스트 수정을 선택하여 익명화 중 이미지 수정 수행 방식을 구성합니다. 다음과 같이 이미지 수정을 구성할 수 있습니다.

  6. 익명화를 클릭하여 데이터 세트의 데이터를 익명화합니다.

이미지에서 번인 텍스트 수정

Cloud Healthcare API는 이미지에서 민감한 번인 텍스트를 수정할 수 있습니다. API는 PHI와 같은 민감한 정보를 감지한 다음 불투명한 직사각형을 사용하여 알아보기 어렵게 만듭니다. API는 제공된 것과 동일한 DICOM 이미지를 동일한 형식으로 반환하지만 기준에 따라 민감한 정보가 포함된 것으로 식별된 모든 텍스트는 수정됩니다.

ImageConfig 객체 내에 TextRedactionMode 옵션을 지정하여 이미지에서 번인 텍스트를 수정할 수 있습니다. 가능한 값은 TextRedactionMode 문서를 참조하세요.

이미지에서 모든 번인 텍스트 수정

다음 샘플은 데이터 세트의 DICOM 이미지에서 모든 번인 텍스트를 수정하는 방법을 보여줍니다. TextRedactionMode 필드에 REDACT_ALL_TEXT를 지정하면 됩니다.

REDACT_ALL_TEXT 옵션을 사용하여 Cloud Healthcare API에 이미지를 제출하면 이미지가 다음과 같이 표시됩니다. 이미지 하단에 있는 번인 텍스트는 삭제되지만 이미지의 상단 모서리에 있는 메타데이터는 그대로 유지됩니다. 메타데이터도 삭제하려면 DICOM 태그 익명화를 참조하세요.

xray_redact_all_text

REST

  1. 데이터 세트를 익명화합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • SOURCE_DATASET_ID: 익명화할 데이터가 포함된 데이터 세트의 ID
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID

    JSON 요청 본문:

    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {},
        "image": {
          "textRedactionMode": "REDACT_ALL_TEXT"
        }
      }
    }
    

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    cat > request.json << 'EOF'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {},
        "image": {
          "textRedactionMode": "REDACT_ALL_TEXT"
        }
      }
    }
    EOF

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify"

    PowerShell

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    @'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {},
        "image": {
          "textRedactionMode": "REDACT_ALL_TEXT"
        }
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

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

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify" | Select-Object -Expand Content
    출력은 다음과 같습니다. 응답에는 장기 실행 작업의 식별자가 포함됩니다. 메서드 호출을 완료하는 데 상당한 시간이 걸릴 수 있는 장기 실행 작업은 반환됩니다. OPERATION_ID의 값을 확인합니다. 다음 단계에서 이 값이 필요합니다.

  2. projects.locations.datasets.operations.get 메서드를 사용하여 장기 실행 작업의 상태를 가져옵니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • DATASET_ID: 데이터 세트 ID
    • LOCATION: 데이터 세트 위치
    • OPERATION_ID: 장기 실행 작업에서 반환된 ID

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력은 다음과 같습니다. 응답에 "done": true가 포함되었으면 장기 실행 작업이 완료된 것입니다.
  3. 익명화가 성공하면 익명화된 인스턴스의 메타데이터를 검색하여 어떻게 변경되었는지 확인할 수 있습니다. 익명화된 인스턴스에는 새로운 연구 UID, 시리즈 UID, 인스턴스 UID가 있으므로 먼저 새 데이터 세트에서 익명화된 인스턴스를 검색해야 합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • SOURCE_DATASET_LOCATION: 소스 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

    다음 표는 연구 UID, 시리즈 UID, 인스턴스 UID가 어떻게 변경되었는지 보여줍니다.
      원본 인스턴스 메타데이터 익명화된 인스턴스 메타데이터
    연구 UID(0020000D) 2.25.70541616638819138568043293671559322355 1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763
    시리즈 UID(0020000E) 1.2.276.0.7230010.3.1.3.8323329.78.1531234558.523694 1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710
    인스턴스 UID(00080018) 1.2.276.0.7230010.3.1.4.8323329.78.1539083058.523695 1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029

이미지에서 민감한 번인 텍스트만 수정

다음 샘플에서는 데이터 세트의 DICOM 이미지에서 민감한 번인 텍스트를 수정하는 방법을 보여줍니다. TextRedactionMode 필드에 REDACT_SENSITIVE_TEXT를 지정하면 됩니다.

기본 DICOM infoType에 지정된 infoType은 REDACT_SENSITIVE_TEXT가 지정될 때 수정됩니다. 의료 기록 번호(MRN)와 같은 환자 식별자에 대한 추가 커스텀 infoType도 적용되며 환자 식별자가 수정됩니다.

다음 이미지는 환자의 수정되지 않은 x-레이를 보여줍니다.

xray2_unredacted

REDACT_SENSITIVE_TEXT 옵션을 사용하여 Cloud Healthcare API에 이미지를 제출하면 이미지가 다음과 같이 표시됩니다.

xray2_redact_sensitive_text

다음과 같은 상황을 확인할 수 있습니다.

  • 이미지 왼쪽 하단의 PERSON_NAME이 수정되었습니다.
  • 이미지 왼쪽 하단의 DATE이 수정되었습니다.

기본 DICOM infoType에 따라 민감한 텍스트로 간주되지 않으므로 환자 성별이 수정되지 않았습니다.

REST

  1. 데이터 세트를 익명화합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • SOURCE_DATASET_ID: 익명화할 데이터가 포함된 데이터 세트의 ID
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID

    JSON 요청 본문:

    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {},
        "image": {
          "textRedactionMode": "REDACT_SENSITIVE_TEXT"
        }
      }
    }
    

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    cat > request.json << 'EOF'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {},
        "image": {
          "textRedactionMode": "REDACT_SENSITIVE_TEXT"
        }
      }
    }
    EOF

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify"

    PowerShell

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    @'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {},
        "image": {
          "textRedactionMode": "REDACT_SENSITIVE_TEXT"
        }
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

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

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify" | Select-Object -Expand Content
    출력은 다음과 같습니다. 응답에는 장기 실행 작업의 식별자가 포함됩니다. 메서드 호출을 완료하는 데 상당한 시간이 걸릴 수 있는 장기 실행 작업은 반환됩니다. OPERATION_ID의 값을 확인합니다. 다음 단계에서 이 값이 필요합니다.

  2. projects.locations.datasets.operations.get 메서드를 사용하여 장기 실행 작업의 상태를 가져옵니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • DATASET_ID: 데이터 세트 ID
    • LOCATION: 데이터 세트 위치
    • OPERATION_ID: 장기 실행 작업에서 반환된 ID

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력은 다음과 같습니다. 응답에 "done": true가 포함되었으면 장기 실행 작업이 완료된 것입니다.
  3. 익명화가 성공하면 익명화된 인스턴스의 메타데이터를 검색하여 어떻게 변경되었는지 확인할 수 있습니다. 익명화된 인스턴스에는 새로운 연구 UID, 시리즈 UID, 인스턴스 UID가 있으므로 먼저 새 데이터 세트에서 익명화된 인스턴스를 검색해야 합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • SOURCE_DATASET_LOCATION: 소스 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

    다음 표는 연구 UID, 시리즈 UID, 인스턴스 UID가 어떻게 변경되었는지 보여줍니다.
      원본 인스턴스 메타데이터 익명화된 인스턴스 메타데이터
    연구 UID(0020000D) 2.25.70541616638819138568043293671559322355 1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763
    시리즈 UID(0020000E) 1.2.276.0.7230010.3.1.3.8323329.78.1531234558.523694 1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710
    인스턴스 UID(00080018) 1.2.276.0.7230010.3.1.4.8323329.78.1539083058.523695 1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029

태그 익명화 및 번인 텍스트 수정 결합

태그를 사용한 익명화와 이미지의 번인 텍스트 수정을 결합하여 DICOM 인스턴스를 보다 세부적으로 익명화할 수 있습니다. 예를 들어 TextRedactionMode 필드의 REDACT_ALL_TEXTTagFilterProfile 필드의 DEIDENTIFY_TAG_CONTENTS와 결합하여 다음을 수행할 수 있습니다.

  • REDACT_ALL_TEXT: 이미지의 모든 번인 텍스트를 수정합니다.
  • DEIDENTIFY_TAG_CONTENTS: 태그 콘텐츠를 검사하고 민감한 텍스트를 변환합니다. DEIDENTIFY_TAG_CONTENTS 동작에 대한 자세한 내용은 기본 구성을 참조하세요.

REDACT_ALL_TEXTDEIDENTIFY_TAG_CONTENTS 옵션을 사용하여 Cloud Healthcare API에 이미지를 제출하면 이미지가 다음과 같이 표시됩니다. 다음 변경사항을 관찰합니다.

  • 이미지의 왼쪽 상단과 오른쪽 상단에 있는 이름은 CryptoHashConfig를 사용하여 변환되었습니다.
  • 이미지의 왼쪽 상단과 오른쪽 상단의 날짜는 DateShiftConfig를 사용하여 변환되었습니다.
  • 이미지 하단의 번인 텍스트가 수정됨

xray_redact_all_text_deidentify_tag_contents

REST

  1. 데이터 세트를 익명화합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • SOURCE_DATASET_ID: 익명화할 데이터가 포함된 데이터 세트의 ID
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID

    JSON 요청 본문:

    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        },
        "image": {
          "textRedactionMode": "REDACT_ALL_TEXT"
        }
      }
    }
    

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    cat > request.json << 'EOF'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        },
        "image": {
          "textRedactionMode": "REDACT_ALL_TEXT"
        }
      }
    }
    EOF

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify"

    PowerShell

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    @'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        },
        "image": {
          "textRedactionMode": "REDACT_ALL_TEXT"
        }
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

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

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify" | Select-Object -Expand Content
    출력은 다음과 같습니다. 응답에는 장기 실행 작업의 식별자가 포함됩니다. 메서드 호출을 완료하는 데 상당한 시간이 걸릴 수 있는 장기 실행 작업은 반환됩니다. OPERATION_ID의 값을 확인합니다. 다음 단계에서 이 값이 필요합니다.

  2. projects.locations.datasets.operations.get 메서드를 사용하여 장기 실행 작업의 상태를 가져옵니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • DATASET_ID: 데이터 세트 ID
    • LOCATION: 데이터 세트 위치
    • OPERATION_ID: 장기 실행 작업에서 반환된 ID

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력은 다음과 같습니다. 응답에 "done": true가 포함되었으면 장기 실행 작업이 완료된 것입니다.
  3. 익명화가 성공하면 익명화된 인스턴스의 메타데이터를 검색하여 어떻게 변경되었는지 확인할 수 있습니다. 익명화된 인스턴스에는 새로운 연구 UID, 시리즈 UID, 인스턴스 UID가 있으므로 먼저 새 데이터 세트에서 익명화된 인스턴스를 검색해야 합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • SOURCE_DATASET_LOCATION: 소스 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

  4. 새 값을 사용하여 인스턴스의 메타데이터를 검색합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력에 새 메타데이터가 포함됩니다. 새 메타데이터를 원본 메타데이터와 비교하여 변환의 효과를 확인할 수 있습니다.

DICOM 태그와 함께 infoType 및 기본 변환 사용

Cloud Healthcare API는 정보 유형(infoType)을 사용하여 태그에서 익명화를 수행할 때 스캔하는 데이터를 정의할 수 있습니다. infoType은 환자 이름, 이메일 주소, 전화번호, 신분증 또는 신용카드 번호와 같은 민감한 정보 유형입니다.

기본 변환은 입력 값 변환을 위해 사용되는 규칙입니다. 각 태그의 infoType에 기본 변환을 적용하여 DICOM 태그를 익명화하는 방법을 맞춤설정할 수 있습니다. 예를 들어 환자의 성을 익명화하고 LAST_NAME infoType을 CharacterMaskConfig 기본 변환으로 지정하여 일련의 별표로 바꿀 수 있습니다.

기본 DICOM infoType

메타데이터를 익명화할 때 사용되는 기본 DICOM infoType은 다음과 같습니다.

  • AGE
  • CREDIT_CARD_NUMBER
  • DATE
  • EMAIL_ADDRESS
  • IP_ADDRESS
  • LOCATION
  • MAC_ADDRESS
  • PASSPORT
  • PERSON_NAME
  • PHONE_NUMBER
  • SWIFT_CODE
  • US_DRIVERS_LICENSE_NUMBER
  • US_SOCIAL_SECURITY_NUMBER
  • US_VEHICLE_IDENTIFICATION_NUMBER
  • US_INDIVIDUAL_TAXPAYER_IDENTIFICATION_NUMBER

REDACT_SENSITIVE_TEXT를 사용하여 이미지의 민감한 텍스트를 익명화하는 경우 Cloud Healthcare API는 위의 infoType을 사용하지만 의료 기록 번호(MRN)와 같은 환자 식별자에 대한 추가 커스텀 infoType도 이미지의 민감한 텍스트에 적용됩니다.

기본 변환 옵션

Cloud Healthcare API 기본 변환 옵션은 다음과 같습니다.

  • RedactConfig: 값을 삭제하여 수정합니다.
  • CharacterMaskConfig: 입력 문자를 지정된 고정 문자로 대체하여 문자열 전체 또는 일부를 마스킹합니다.
  • DateShiftConfig: 동일한 컨텍스트에 대해 일관적인 옵션으로 무작위 일 수만큼 날짜를 이동합니다.
  • CryptoHashConfig: SHA-256을 사용하여 입력 값을 지정된 데이터 암호화 키를 사용하여 생성된 해시된 출력 문자열의 base64 인코딩 표현으로 바꿉니다.
  • ReplaceWithInfoTypeConfig: 해당 infoType의 이름으로 입력 값을 대체합니다.

TextConfig에서 구성 지정

InfoType 및 기본 변환은 TextConfig 내부의 객체인 InfoTypeTransformation 내에 지정됩니다. InfoType은 쉼표로 구분된 값으로 infoTypes 배열에 입력됩니다.

infoType 지정은 선택사항입니다. infoType을 하나 이상 지정하지 않으면 변환이 Cloud Healthcare API에 있는 기본 DICOM infoType에 적용됩니다.

InfoTypeTransformation에 infoType을 지정하는 경우 기본 변환을 하나 이상 지정해야 합니다.

InfoTypeTransformationDEIDENTIFY_TAG_CONTENTS 프로필에만 적용할 수 있습니다. InfoTypeTransformationTagFilterProfile에 표시된 다른 프로필에 적용할 수 없습니다.

다음 섹션에서는 InfoTypeTransformation에서 사용 가능한 기본 변환을 infoType과 함께 사용하여 DICOM 태그를 익명화하는 방식을 맞춤설정하는 방법을 보여줍니다. 이 샘플은 샘플 개요에 제공된 샘플 이미지와 DICOM 태그 익명화에 제공된 샘플 메타데이터를 사용합니다.

기본 구성

기본적으로 TextConfig 객체에 구성을 제공하지 않고 DEIDENTIFY_TAG_CONTENTS 프로필을 설정하면 Cloud Healthcare API는 기본 DICOM infoType을 사용하여 민감한 정보를 대체합니다. 하지만 아래와 같이 DATEPERSON_NAME infoType의 동작은 서로 다릅니다.

  • DateShiftConfigDATE infoType으로 분류된 텍스트에 적용됩니다. DateShiftConfig는 100일 차등 날짜 이동 기법을 사용합니다.
  • CryptoHashConfigPERSON_NAME infoType으로 분류된 텍스트에 적용됩니다. CryptoHashConfig는 암호화 해싱을 사용하여 서로게이트 값을 생성하여 토큰화를 수행합니다.

다음 동작도 적용됩니다.

  • 값이 90 이상인 환자 연령은 90으로 변환됩니다.
  • DICOM 형식 제한으로 인해 변환을 적용할 수 없는 경우 태그의 값 표현(VR)에 해당하는 자리 표시자 값이 제공됩니다.
  • Cloud Healthcare API의 기본 DICOM infoType 중 하나에 해당하는 다른 값은 infoType으로 바뀝니다. 예를 들어 PatientComments 태그에 'Ann Johnson went to Anytown Hospital' 문자열이 포함되어 있으면 'Anytown'은 LOCATION infoType으로 바뀝니다.

다음 샘플은 DICOM 저장소 및 DICOM 데이터가 포함된 데이터 세트에서 DEIDENTIFY_TAG_CONTENTS 기본 프로필을 사용한 출력을 보여줍니다. 이 기본 출력을 infoType 조합으로 다양한 기본 변환을 사용할 때 출력과 비교할 수 있습니다. 샘플은 단일 DICOM 인스턴스를 사용하지만 여러 인스턴스를 익명화할 수 있습니다.

DEIDENTIFY_TAG_CONTENTS 프로필을 사용하여 Cloud Healthcare API에 이미지를 제출하면 이미지가 다음과 같이 표시됩니다. 다음 변경사항을 관찰합니다.

  • 이미지의 왼쪽 상단과 오른쪽 상단에 있는 이름은 CryptoHashConfig를 사용하여 변환되었습니다.
  • 이미지의 왼쪽 상단과 오른쪽 상단의 날짜는 DateShiftConfig를 사용하여 변환되었습니다.

dicom_infotype_default

REST

  1. 데이터 세트를 익명화합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • SOURCE_DATASET_ID: 익명화할 데이터가 포함된 데이터 세트의 ID
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID

    JSON 요청 본문:

    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        }
      }
    }
    

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    cat > request.json << 'EOF'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        }
      }
    }
    EOF

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify"

    PowerShell

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    @'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        }
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

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

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify" | Select-Object -Expand Content
    출력은 다음과 같습니다. 응답에는 장기 실행 작업의 식별자가 포함됩니다. 메서드 호출을 완료하는 데 상당한 시간이 걸릴 수 있는 장기 실행 작업은 반환됩니다. OPERATION_ID의 값을 확인합니다. 다음 단계에서 이 값이 필요합니다.

  2. projects.locations.datasets.operations.get 메서드를 사용하여 장기 실행 작업의 상태를 가져옵니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • DATASET_ID: 데이터 세트 ID
    • LOCATION: 데이터 세트 위치
    • OPERATION_ID: 장기 실행 작업에서 반환된 ID

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력은 다음과 같습니다. 응답에 "done": true가 포함되었으면 장기 실행 작업이 완료된 것입니다.
  3. 익명화가 성공하면 익명화된 인스턴스의 메타데이터를 검색하여 어떻게 변경되었는지 확인할 수 있습니다. 익명화된 인스턴스에는 새로운 연구 UID, 시리즈 UID, 인스턴스 UID가 있으므로 먼저 새 데이터 세트에서 익명화된 인스턴스를 검색해야 합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • SOURCE_DATASET_LOCATION: 소스 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

  4. 새 값을 사용하여 인스턴스의 메타데이터를 검색합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력에 새 메타데이터가 포함됩니다. 새 메타데이터를 원본 메타데이터와 비교하여 변환의 효과를 확인할 수 있습니다.

RedactConfig

redactConfig를 지정하면 지정된 값을 완전히 삭제하는 방식으로 값이 수정됩니다. redactConfig 메시지는 인수가 없으며 지정하면 변환이 사용 설정됩니다.

다음 샘플은 기본 구성에서 확장되지만 이제 redactConfig 변환을 통해 PERSON_NAME infoType 설정을 포함합니다. 이 요청을 전송하면 DICOM 인스턴스의 모든 이름이 수정됩니다.

redactConfig 변환을 사용하여 Cloud Healthcare API에 이미지를 제출하면 이미지가 다음과 같이 표시됩니다.

dicom_redactconfig

REST

  1. 데이터 세트를 익명화합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • SOURCE_DATASET_ID: 익명화할 데이터가 포함된 데이터 세트의 ID
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID

    JSON 요청 본문:

    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        },
        "text": {
          "transformations": [
            {
              "infoTypes": [
                "PERSON_NAME"
              ],
              "redactConfig": {}
            }
          ]
        }
      }
    }
    

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    cat > request.json << 'EOF'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        },
        "text": {
          "transformations": [
            {
              "infoTypes": [
                "PERSON_NAME"
              ],
              "redactConfig": {}
            }
          ]
        }
      }
    }
    EOF

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify"

    PowerShell

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    @'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        },
        "text": {
          "transformations": [
            {
              "infoTypes": [
                "PERSON_NAME"
              ],
              "redactConfig": {}
            }
          ]
        }
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

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

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify" | Select-Object -Expand Content
    출력은 다음과 같습니다. 응답에는 장기 실행 작업의 식별자가 포함됩니다. 메서드 호출을 완료하는 데 상당한 시간이 걸릴 수 있는 장기 실행 작업은 반환됩니다. OPERATION_ID의 값을 확인합니다. 다음 단계에서 이 값이 필요합니다.

  2. projects.locations.datasets.operations.get 메서드를 사용하여 장기 실행 작업의 상태를 가져옵니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • DATASET_ID: 데이터 세트 ID
    • LOCATION: 데이터 세트 위치
    • OPERATION_ID: 장기 실행 작업에서 반환된 ID

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력은 다음과 같습니다. 응답에 "done": true가 포함되었으면 장기 실행 작업이 완료된 것입니다.
  3. 익명화가 성공하면 익명화된 인스턴스의 메타데이터를 검색하여 어떻게 변경되었는지 확인할 수 있습니다. 익명화된 인스턴스에는 새로운 연구 UID, 시리즈 UID, 인스턴스 UID가 있으므로 먼저 새 데이터 세트에서 익명화된 인스턴스를 검색해야 합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • SOURCE_DATASET_LOCATION: 소스 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

  4. 새 값을 사용하여 인스턴스의 메타데이터를 검색합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/studies/1.3.6.1.4.1.11129.5.1.201854290391432893460946240745559593763/series/1.3.6.1.4.1.11129.5.1.303327499491957026103380014864616068710/instances/1.3.6.1.4.1.11129.5.1.97415866390999888717168863957686758029/metadata" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력에 새 메타데이터가 포함됩니다. 새 메타데이터를 원본 메타데이터와 비교하여 변환의 효과를 확인할 수 있습니다.

출력에 ReferringPhysicianName(00080090) 및 PatientName(00100010)의 값이 삭제된 것을 보여줍니다. 이는 이러한 값을 암호화 해싱을 사용하여 변환한 기본 구성의 샘플과 대조됩니다.

CharacterMaskConfig

characterMaskConfig를 지정하면 지정된 infoType에 해당하는 문자열을 지정된 고정 문자로 대체합니다. 예를 들어 환자 이름을 수정하거나 암호화 해싱을 사용하여 변환하지 않고 이름을 일련의 별표(*)로 바꿀 수 있습니다. 고정 문자를 maskingCharacter 필드에 값으로 지정할 수 있습니다.

다음 샘플은 기본 구성에서 확장되지만 이제 characterMaskConfig 변환을 통해 LAST_NAME infoType 설정을 포함합니다. 고정 문자가 제공되지 않으므로 기본적으로 마스킹에 별표가 사용됩니다.

샘플은 단일 DICOM 인스턴스를 사용하지만 여러 인스턴스를 익명화할 수 있습니다.

characterMaskConfig 변환을 사용하여 Cloud Healthcare API에 이미지를 제출하면 이미지가 다음과 같이 표시됩니다.

dicom_charactermaskconfig

REST

  1. 데이터 세트를 익명화합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • SOURCE_DATASET_ID: 익명화할 데이터가 포함된 데이터 세트의 ID
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID

    JSON 요청 본문:

    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        },
        "text": {
          "transformations": [
            {
              "infoTypes": [
                "PERSON_NAME"
              ],
              "characterMaskConfig": {
                "maskingCharacter": ""
              }
            }
          ]
        }
      }
    }
    

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    cat > request.json << 'EOF'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        },
        "text": {
          "transformations": [
            {
              "infoTypes": [
                "PERSON_NAME"
              ],
              "characterMaskConfig": {
                "maskingCharacter": ""
              }
            }
          ]
        }
      }
    }
    EOF

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify"

    PowerShell

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    @'
    {
      "destinationDataset": "projects/PROJECT_ID/locations/LOCATION/datasets/DESTINATION_DATASET_ID",
      "config": {
        "dicom": {
          "filterProfile": "DEIDENTIFY_TAG_CONTENTS"
        },
        "text": {
          "transformations": [
            {
              "infoTypes": [
                "PERSON_NAME"
              ],
              "characterMaskConfig": {
                "maskingCharacter": ""
              }
            }
          ]
        }
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

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

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/SOURCE_DATASET_ID:deidentify" | Select-Object -Expand Content
    출력은 다음과 같습니다. 응답에는 장기 실행 작업의 식별자가 포함됩니다. 메서드 호출을 완료하는 데 상당한 시간이 걸릴 수 있는 장기 실행 작업은 반환됩니다. OPERATION_ID의 값을 확인합니다. 다음 단계에서 이 값이 필요합니다.

  2. projects.locations.datasets.operations.get 메서드를 사용하여 장기 실행 작업의 상태를 가져옵니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • DATASET_ID: 데이터 세트 ID
    • LOCATION: 데이터 세트 위치
    • OPERATION_ID: 장기 실행 작업에서 반환된 ID

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력은 다음과 같습니다. 응답에 "done": true가 포함되었으면 장기 실행 작업이 완료된 것입니다.
  3. 익명화가 성공하면 익명화된 인스턴스의 메타데이터를 검색하여 어떻게 변경되었는지 확인할 수 있습니다. 익명화된 인스턴스에는 새로운 연구 UID, 시리즈 UID, 인스턴스 UID가 있으므로 먼저 새 데이터 세트에서 익명화된 인스턴스를 검색해야 합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • SOURCE_DATASET_LOCATION: 소스 데이터 세트 위치
    • DESTINATION_DATASET_ID: 익명화된 데이터가 작성되는 대상 데이터 세트의 ID
    • DESTINATION_DICOM_STORE_ID: 대상 데이터 세트의 DICOM 저장소 ID. 이는 소스 데이터 세트의 DICOM 저장소 ID와 동일합니다.

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances"

    PowerShell

    다음 명령어를 실행합니다.

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

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/SOURCE_DATASET_LOCATION/datasets/DESTINATION_DATASET_ID/dicomStores/DESTINATION_DICOM_STORE_ID/dicomWeb/instances" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    다음과 비슷한 JSON 응답이 표시됩니다.