Cloud Healthcare API를 디지털 병리학에 사용

이 페이지에서는 Cloud Healthcare API를 사용하여 전체 슬라이드 이미지(WSI)를 저장, 분석, 관리하는 방법을 설명합니다.

개요

디지털 병리학은 전체 슬라이드 이미지(WSI)를 제작하기 위해 기존의 유리 슬라이드를 디지털화하여 저장, 처리, 관리가 가능하게 합니다.

WSI는 일반적으로 대용량 파일(최대 수 GB)이며, 다양한 파일 형식으로 제공되어 관리하기 어려울 수 있습니다. Cloud Healthcare API는 WSI 저장, 분석, 관리 프로세스를 간소화합니다.

DICOM을 사용하여 전체 슬라이드 이미지 저장

Cloud Healthcare API는 DICOM 이미지를 저장하기 위한 관리형 서비스를 제공합니다. 이 서비스는 WSI의 저장 및 검색을 지원합니다. Cloud Healthcare API의 DICOM에 대한 자세한 내용은 DICOM을 참조하세요.

DICOM을 사용하면 다음과 같은 이점이 있습니다.

  • 상호 운용성: DICOM은 디지털 병리학에서 다른 이미지 양식 및 다른 소프트웨어 공급자와 상호 운용이 가능합니다.
  • DICOMweb 및 DIMSE API: DICOM은 파일 형식 외에도 DICOMweb 및 DIMSE API를 정의하는 네트워킹 프로토콜입니다. DICOM 인스턴스를 검색 및 저장하는 데 사용되는 이러한 API는 광범위한 기능을 제공하며 이미지와 상호작용하는 프로세스를 간소화합니다.

전체 슬라이드 이미지를 DICOM으로 변환

대부분의 WSI 스캐너는 기본적으로 WSI에서 DICOM 파일을 생성하지 않습니다. 따라서 수동으로 WSI를 DICOM 파일로 변환해야 합니다.

다음 도구는 WSI를 DICOM으로 변환할 수 있습니다.

다음 섹션에서는 wsi2dcm 명령줄 도구를 사용하여 DICOM 파일을 생성하는 방법을 보여줍니다.

wsi2dcm 명령줄 도구를 사용하여 DICOM 파일 생성

다음 단계를 완료하기 전에 유효한 WSI 파일이 있는지 확인합니다. 샘플 데이터는 OpenSlideDigital Pathology Association 웹사이트에 나열된 기타 리소스에서 확인할 수 있습니다.

wsi2dcm 명령줄 도구를 실행합니다.

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

각 매개변수는 다음과 같습니다.

  • INPUT_WSI는 WSI 파일의 경로와 이름입니다.
  • PATH/TO/OUTPUT/FOLDER는 도구가 변환된 DICOM 파일을 출력하는 경로입니다.
  • WSI_DESCRIPTION는 변환된 DICOM 파일에 대한 선택에 관한 설명입니다.

도구를 실행하면 WSI에서 여러 DICOM 파일이 생성됩니다. DICOM 파일에는 서픽스 .dcm이 있습니다.

Cloud Healthcare API에 DICOM 파일 업로드

DICOM 저장소를 아직 생성하지 않았다면 지금 생성하세요.

다음 방법 중 하나를 사용하여 DICOM 저장소에 생성된 DICOM 파일을 업로드할 수 있습니다.

DICOM 파일 및 메타데이터 검색

DICOM 저장소에 DICOM 파일을 업로드한 후에 DICOM 이미지에 대한 메타데이터를 나열하고 볼 수 있습니다.

전체 슬라이드 이미지 나열

각 WSI는 DICOM 연구입니다. WSI를 나열하려면 dicomStores.searchForStudies 메서드를 호출하면 됩니다.

curl

DICOM 저장소에서 연구를 검색하려면 GET 요청을 수행하고 다음 정보를 지정합니다.

  • 상위 데이터세트의 이름
  • DICOM 저장소의 이름
  • 액세스 토큰

다음 샘플은 curl을 사용하는 GET 요청을 보여줍니다.

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

요청이 성공하면 서버가 JSON 형식으로 응답을 반환합니다.

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

PowerShell

DICOM 저장소에서 연구를 검색하려면 GET 요청을 수행하고 다음 정보를 지정합니다.

  • 상위 데이터세트의 이름
  • DICOM 저장소의 이름
  • 액세스 토큰

다음 샘플은 Windows PowerShell을 사용한 GET 요청을 보여줍니다.

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

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

요청이 성공하면 서버가 JSON 형식으로 응답을 가져옵니다.

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

전체 슬라이드 이미지 메타데이터 보기

각 연구에는 여러 인스턴스가 포함되며 각 인스턴스에는 WSI의 타일의 하위 집합이 포함됩니다. 연구에서 인스턴스의 인스턴스 메타데이터를 보려면 dicomStores.searchForInstances 메서드를 호출합니다.

curl

연구에서 인스턴스의 인스턴스 메타데이터를 보려면 GET 요청을 수행하고 다음 정보를 지정합니다.

  • 상위 데이터세트의 이름
  • DICOM 저장소의 이름
  • 연구 인스턴스 고유 식별자(UID)
  • 액세스 토큰

다음 샘플은 curl을 사용하는 GET 요청을 보여줍니다.

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

요청이 성공하면 서버가 JSON 형식으로 응답을 반환합니다.

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

PowerShell

연구에서 모든 인스턴스에 대한 인스턴스 메타데이터를 보려면 GET 요청을 수행하고 다음 정보를 지정합니다.

  • 상위 데이터세트의 이름
  • DICOM 저장소의 이름
  • 연구 인스턴스 UID
  • 액세스 토큰

다음 샘플은 Windows PowerShell을 사용한 GET 요청을 보여줍니다.

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

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

요청이 성공하면 서버가 JSON 형식으로 응답을 반환합니다.

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

전체 슬라이드 이미지 타일 보기

일반적으로 각 인스턴스에는 여러 프레임이 포함됩니다. 프레임은 WSI 'pyramid'에서 특정 확대/축소 수준으로 WSI의 한 타일을 나타냅니다. 단일 프레임을 JPEG 형식으로 검색하려면 frames.retrieveRendered 메서드를 호출합니다.

curl

JPEG 형식의 단일 프레임을 검색하려면 GET 요청을 수행하고 다음 정보를 지정합니다.

  • 상위 데이터세트의 이름
  • DICOM 저장소의 이름
  • 연구 UID
  • 시리즈 UID
  • 인스턴스 UID
  • 액세스 토큰

다음 샘플은 curl을 사용하는 GET 요청을 보여줍니다.

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

요청이 성공하면 JPEG 파일이 머신에 기록됩니다.

PowerShell

JPEG 형식의 단일 프레임을 검색하려면 GET 요청을 수행하고 다음 정보를 지정합니다.

  • 상위 데이터세트의 이름
  • DICOM 저장소의 이름
  • 연구 UID
  • 시리즈 UID
  • 인스턴스 UID
  • 액세스 토큰

다음 샘플은 Windows PowerShell을 사용한 GET 요청을 보여줍니다.

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

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

요청이 성공하면 JPEG 파일이 머신에 기록됩니다.

모든 슬라이드 이미지 검색

WSI가 포함된 전체 인스턴스를 검색하려면 instances.retrieveInstance 메서드를 사용합니다.

curl

전체 인스턴스를 검색하려면 GET 요청을 수행하고 다음 정보를 지정합니다.

  • 상위 데이터세트의 이름
  • DICOM 저장소의 이름
  • 연구 UID
  • 시리즈 UID
  • 인스턴스 UID
  • 액세스 토큰

다음 샘플은 curl을 사용하는 GET 요청을 보여줍니다.

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

요청이 성공하면 DICOM 파일이 머신에 기록됩니다.

PowerShell

전체 인스턴스를 검색하려면 GET 요청을 수행하고 다음 정보를 지정합니다.

  • 상위 데이터세트의 이름
  • DICOM 저장소의 이름
  • 연구 UID
  • 시리즈 UID
  • 인스턴스 UID
  • 액세스 토큰

다음 샘플은 Windows PowerShell을 사용한 GET 요청을 보여줍니다.

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

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

요청이 성공하면 DICOM 파일이 컴퓨터에 기록됩니다.

전체 슬라이드 이미지 뷰어를 사용하여 슬라이드 보기

이전 섹션에서는 WSI의 메타데이터를 보고 개별 타일을 검색하는 방법을 설명하였습니다. 전체 WSI를 보려면 DICOMweb에서 제공하는 WSI 뷰어를 사용해야 합니다.

다음 뷰어는 Cloud Healthcare API와 호환됩니다.

DICOMweb WSI 뷰어를 사용하여 변환된 WSI DICOM 파일 보기

DICOMweb WSI 뷰어를 사용하여 변환된 WSI DICOM 파일을 보려면 다음 섹션을 완료하세요.

뷰어 다운로드

DICOMweb WSI 뷰어를 다운로드합니다.

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

클라이언트 보안 비밀번호 가져오기

클라이언트 보안 비밀번호는 사용자가 애플리케이션에 액세스할 때 사용자를 인증합니다. DICOMweb WSI 뷰어의 소스 코드에 클라이언트 보안 비밀번호를 삽입합니다. 클라이언트 보안 비밀번호를 가져오려면 다음 단계를 완료하세요.

  1. Google Cloud Console에서 사용자 인증 정보 페이지로 이동합니다.
    사용자 인증 정보 페이지로 이동

  2. 사용자 인증 정보 만들기를 클릭하고 OAuth 클라이언트 ID를 선택합니다.

  3. 애플리케이션 유형 아래에서 웹 애플리케이션을 선택합니다.

  4. 원하는 이름을 추가합니다.

  5. 승인된 자바스크립트 원본승인된 리디렉션 URIhttp://localhost:8000을 입력합니다.

  6. 만들기를 클릭한 후 나타나는 OAuth 클라이언트 창에서 확인을 클릭합니다. 다음 섹션에서 사용할 클라이언트 ID를 복사합니다.

뷰어에서 클라이언트 보안 비밀번호 구성

이전 섹션에서 가져온 클라이언트 ID를 사용하여 다음 단계를 완료합니다.

  1. dicomweb-wsi-viewer 디렉터리에서 viewer.js 파일을 엽니다.

  2. 클라이언트 ID가 포함되도록 다음 줄을 바꿉니다.

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

    대신 다음 샘플과 같이 표시됩니다.

    const CLIENT_ID = 'PROJECT_ID-VALUE.apps.googleusercontent.com';
    
  3. 파일을 저장합니다.

Google Cloud 프로젝트의 OAuth 동의 화면을 아직 구성하지 않은 경우 다음 단계를 완료합니다.

  1. OAuth 동의 화면으로 이동합니다.
    OAuth 동의 화면으로 이동

  2. 지원 이메일 아래에서 공개 연락처로 표시할 이메일 주소를 선택합니다. 이 이메일 주소는 개발자의 이메일 주소 또는 개발자가 소유하는 Google 그룹이어야 합니다.

  3. 표시하려는 애플리케이션 이름을 입력합니다.

  4. 범위 추가를 클릭합니다. 표시되는 대화상자에서 https://www.googleapis.com/auth/cloud-healthcare를 입력한 다음 추가를 클릭합니다.

  5. 저장을 클릭합니다.

나중에 제품 이름 또는 이메일 주소와 같은 OAuth 동의 화면의 정보를 변경하려면 앞의 단계를 반복하여 동의 화면을 구성합니다.

Google Cloud 프로젝트의 OAuth 동의 화면을 이미 구성한 경우 범위 추가 대화상자에서 https://www.googleapis.com/auth/cloud-healthcare를 추가해야 합니다.

DICOMweb WSI 뷰어 실행

  1. dicomweb-wsi-viewer 디렉터리에서 다음 명령어를 실행합니다.

    python -m SimpleHTTPServer 8000
    
  2. 이전 명령어를 실행한 머신에서 https://localhost:8000로 이동합니다.

  3. UI에서 로그인/승인을 클릭하여 OAuth 동의 화면에 액세스하고 뷰어에 Google Cloud 프로젝트 및 Cloud Healthcare API 리소스 액세스 권한을 부여합니다.