AWS HealthImaging
AWS HealthImaging คือบริการ cloud-native สำหรับจัดเก็บ, จัดการ และวิเคราะห์ medical images โดยเฉพาะ DICOM images ในระดับ petabyte scale บริการนี้ออกแบบมาเพื่อ healthcare และ life sciences โดยเฉพาะ รองรับ DICOM standard อย่างสมบูรณ์ มีการ compress images แบบ lossless ลดพื้นที่เก็บข้อมูลได้ 60-70% โดยไม่กระทบคุณภาพสำหรับการวินิจฉัย
AWS HealthImaging ช่วยให้โรงพยาบาล, ศูนย์รังสีวิทยา และบริษัทพัฒนา medical AI สามารถเข้าถึง medical images ได้ด้วย latency ต่ำมาก (sub-second) รองรับ HIPAA compliance และ integration กับ PACS/VNA ที่มีอยู่ เพื่อ migrate จาก on-premise ไปสู่ cloud อย่างราบรื่น
AWS Docs: https://docs.aws.amazon.com/healthimaging/latest/devguide/what-is-healthimaging.html
สถาปัตยกรรม
ฟีเจอร์หลัก
DICOM-Compliant Storage
รองรับ DICOM (Digital Imaging and Communications in Medicine) standard อย่างสมบูรณ์ สามารถ store DICOM datasets จาก modalities ต่างๆ เช่น CT, MRI, X-ray, Ultrasound, PET, Mammography และ Pathology images โดยไม่ต้องแปลงรูปแบบ
Sub-Second Image Retrieval
ดึง medical images ได้ด้วย latency ต่ำกว่า 1 วินาที แม้จะเป็น large CT scan หรือ whole slide pathology images ทำให้แพทย์เปิดดู images ได้รวดเร็ว ไม่ต้องรอนาน ต่างจาก traditional PACS ที่อาจใช้เวลาหลายวินาทีถึงหลายนาที
Lossless Compression (60-70% Storage Reduction)
ใช้ HTJ2K (High Throughput JPEG 2000) compression ที่ลดขนาดไฟล์ได้ 60-70% โดยไม่สูญเสียข้อมูล pixel ใดๆ ทำให้ค่าใช้จ่ายในการเก็บข้อมูลลดลงอย่างมีนัยสำคัญเมื่อเทียบกับการเก็บ uncompressed DICOM
Direct Integration with PACS/VNA
รองรับ DICOM DIMSE protocol สำหรับ store, retrieve และ query จาก PACS (Picture Archiving and Communication System) และ VNA (Vendor Neutral Archive) ที่มีอยู่ ทำให้ migrate ข้อมูลจาก on-premise ได้โดยไม่ต้องเปลี่ยน workflow ของ radiologist
Datastores
จัดระเบียบ medical images เป็น datastores ที่แบ่งแยกตามโรงพยาบาล, แผนก หรือ project ควบคุม access ด้วย IAM policies ระดับ datastore
Image Sets
จัดกลุ่ม DICOM instances ที่เกี่ยวข้องกันเป็น image sets (เทียบเท่า DICOM study) ทำให้ query และจัดการ images ได้ง่ายขึ้นตามบริบททางคลินิก
HL7 FHIR Compatible Metadata
เก็บ metadata ของ images ในรูปแบบที่ compatible กับ HL7 FHIR standard ทำให้ integrate กับ healthcare information systems อื่นๆ ได้ง่ายขึ้น
Python/JS SDK for Viewing
มี SDK สำหรับ Python และ JavaScript ที่รองรับ HTJ2K codec สำหรับ decode images ใน browser หรือ application โดยไม่ต้องดาวน์โหลด full DICOM file ก่อน
Pixel Data Streaming
ดึงเฉพาะส่วนของ pixel data ที่ต้องการ (เช่น เฉพาะ slice ที่ต้องการจาก CT volume) ลด bandwidth ที่ใช้และเพิ่ม responsiveness ของ viewer applications
Security (Encryption, Audit Logs)
เข้ารหัส data at rest ด้วย AWS KMS keys ที่คุณควบคุม, เข้ารหัส data in transit ด้วย TLS, บันทึกทุก API call ผ่าน AWS CloudTrail เพื่อ audit trail ที่สมบูรณ์
Compliance (HIPAA)
ผ่าน HIPAA eligibility, รองรับ Business Associate Agreement (BAA) กับ AWS ทำให้เก็บ Protected Health Information (PHI) ได้ตามกฎหมาย นอกจากนี้ยัง support SOC 2, ISO 27001 และ PCI DSS
การติดตั้งและการตั้งค่า
เปิดใช้งานผ่าน Console
- เข้า AWS Console > AWS HealthImaging
- สร้าง Datastore (เลือก KMS key สำหรับ encryption)
- Import DICOM files จาก S3 หรือผ่าน DICOM DIMSE
- Verify image sets ใน console
- Integrate กับ viewer หรือ ML pipeline ผ่าน API
ติดตั้ง SDK
pip install boto3
# สำหรับ HTJ2K decoding
pip install openjpeg
npm install @aws-sdk/client-medical-imaging
IAM Permissions ที่จำเป็น
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"medical-imaging:CreateDatastore",
"medical-imaging:GetDatastore",
"medical-imaging:StartDICOMImportJob",
"medical-imaging:GetDICOMImportJob",
"medical-imaging:GetImageSet",
"medical-imaging:GetImageFrame",
"medical-imaging:SearchImageSets",
"s3:GetObject",
"s3:ListBucket",
"kms:GenerateDataKey",
"kms:Decrypt"
],
"Resource": "*"
}
]
}
วิธีใช้งาน
สร้าง Datastore และ Import DICOM
import boto3
import json
healthimaging = boto3.client('medical-imaging', region_name='us-east-1')
# สร้าง datastore
datastore_response = healthimaging.create_datastore(
datastoreName='hospital-radiology',
clientToken='unique-token-001',
kmsKeyArn='arn:aws:kms:us-east-1:123456789:key/my-cmk',
tags={
'Department': 'Radiology',
'Hospital': 'My Hospital',
'Environment': 'Production'
}
)
datastore_id = datastore_response['datastoreId']
print(f"Datastore ID: {datastore_id}")
# Import DICOM files จาก S3
import_response = healthimaging.start_dicom_import_job(
jobName='initial-dicom-import',
datastoreId=datastore_id,
dataAccessRoleArn='arn:aws:iam::123456789:role/HealthImagingImportRole',
inputS3Uri='s3://my-dicom-bucket/input-studies/',
outputS3Uri='s3://my-dicom-bucket/import-output/'
)
import_job_id = import_response['jobId']
print(f"Import Job ID: {import_job_id}")
# ตรวจสอบสถานะ import
import_status = healthimaging.get_dicom_import_job(
datastoreId=datastore_id,
jobId=import_job_id
)
print(f"Import Status: {import_status['jobProperties']['jobStatus']}")
ค้นหา Image Sets
# ค้นหา image sets ตาม patient ID
search_response = healthimaging.search_image_sets(
datastoreId=datastore_id,
searchCriteria={
'filters': [
{
'values': [
{'DICOMPatientId': 'PATIENT_001'}
],
'operator': 'EQUAL'
}
]
},
maxResults=20
)
print("Image Sets found:")
for image_set in search_response['imageSetsMetadataSummaries']:
print(f"\nImage Set ID: {image_set['imageSetId']}")
print(f"Version: {image_set['version']}")
dicom_tags = image_set.get('DICOMTags', {})
print(f"Modality: {dicom_tags.get('DICOMSeriesModality', 'N/A')}")
print(f"Study Date: {dicom_tags.get('DICOMStudyDate', 'N/A')}")
print(f"Body Part: {dicom_tags.get('DICOMStudyBodyPartName', 'N/A')}")
# ค้นหาตามช่วงวันที่
date_search = healthimaging.search_image_sets(
datastoreId=datastore_id,
searchCriteria={
'filters': [
{
'values': [
{
'DICOMStudyDateAndTime': {
'DICOMStudyDate': '20240101',
'DICOMStudyTime': '000000.000000'
}
},
{
'DICOMStudyDateAndTime': {
'DICOMStudyDate': '20240131',
'DICOMStudyTime': '235959.999999'
}
}
],
'operator': 'BETWEEN'
}
]
}
)
ดึง Image Frames (Pixel Data)
# ดึง metadata ของ image set
image_set_metadata = healthimaging.get_image_set_metadata(
datastoreId=datastore_id,
imageSetId='IMAGE_SET_ID_HERE'
)
# Parse metadata
metadata = json.loads(
image_set_metadata['imageSetMetadataBlob'].read().decode('utf-8')
)
# ดึง image frames (pixel data)
# ต้องรู้ imageFrameId จาก metadata
for series in metadata.get('Series', {}).values():
for instance in series.get('Instances', {}).values():
for frame in instance.get('ImageFrames', []):
frame_id = frame['ID']
# ดึง pixel data ในรูปแบบ HTJ2K
frame_response = healthimaging.get_image_frame(
datastoreId=datastore_id,
imageSetId='IMAGE_SET_ID_HERE',
imageFrameInformation={
'imageFrameId': frame_id
}
)
# frame_response['imageFrameBlob'] คือ HTJ2K binary data
htj2k_data = frame_response['imageFrameBlob'].read()
# Decode ด้วย openjpeg หรือ library อื่น
# decoded_pixels = decode_htj2k(htj2k_data)
print(f"Retrieved frame {frame_id}: {len(htj2k_data)} bytes")
Integrate กับ ML Pipeline (SageMaker)
import boto3
import numpy as np
def prepare_images_for_ml(datastore_id, image_set_ids):
"""เตรียม medical images สำหรับ ML training"""
healthimaging = boto3.client('medical-imaging')
s3 = boto3.client('s3')
training_data = []
for image_set_id in image_set_ids:
# ดึง metadata
metadata_response = healthimaging.get_image_set_metadata(
datastoreId=datastore_id,
imageSetId=image_set_id
)
metadata = json.loads(metadata_response['imageSetMetadataBlob'].read())
# ดึงทุก frames
frames_data = []
for series in metadata.get('Series', {}).values():
for instance in series.get('Instances', {}).values():
for frame in instance.get('ImageFrames', []):
frame_response = healthimaging.get_image_frame(
datastoreId=datastore_id,
imageSetId=image_set_id,
imageFrameInformation={'imageFrameId': frame['ID']}
)
frames_data.append(frame_response['imageFrameBlob'].read())
training_data.append({
'image_set_id': image_set_id,
'frames': frames_data,
'metadata': metadata
})
return training_data
ราคา (ประมาณการในบาท)
| รายการ | ราคา USD | ราคา THB (1 USD = 35 บาท) |
|---|---|---|
| Storage | $0.008/GB/เดือน | ~0.28 บาท/GB/เดือน |
| Data import | $0.025/GB | ~0.88 บาท/GB |
| Image frame retrieval | $0.000009/frame | ~0.000315 บาท/frame |
| Metadata retrieval | $0.000001/request | ~0.000035 บาท/request |
ตัวอย่างค่าใช้จ่าย: โรงพยาบาลที่มี CT/MRI scans 500GB/เดือน
- Storage: 500 GB x $0.008 = $4/เดือน (~140 บาท/เดือน)
- Import: 500 GB x $0.025 = $12.50 (~437 บาท)
- Retrieval: 100,000 frames/เดือน x $0.000009 = $0.90/เดือน
- รวมประมาณ ~580 บาท/เดือน (ต่ำกว่า on-premise PACS มาก)
เหมาะสำหรับ
- โรงพยาบาลและศูนย์รังสีวิทยาที่ต้องการ cloud-based PACS แทน on-premise
- เครือข่ายโรงพยาบาลที่ต้องการ share medical images ข้าม sites อย่างรวดเร็ว
- บริษัทพัฒนา medical AI ที่ต้องการ scalable storage และ fast access สำหรับ training
- สถาบันวิจัยที่ทำงานกับ medical image datasets ขนาดใหญ่
- Teleradiology providers ที่ต้องการ access images จากหลายโรงพยาบาล
- องค์กรที่ต้องการ HIPAA-compliant medical image archiving
ใช้ร่วมกับ AWS Services
- Amazon S3 - import DICOM files และ export processed images
- Amazon SageMaker - train medical imaging AI models โดยตรงจาก HealthImaging
- AWS Lambda - serverless processing เมื่อมี images ใหม่ถูก import
- Amazon DynamoDB - เก็บ application-specific metadata และ annotations
- AWS PrivateLink - เข้าถึง HealthImaging จาก VPC โดยไม่ผ่าน internet
- Amazon CloudWatch - monitor API usage และ import job status
- AWS CloudTrail - audit log สำหรับ HIPAA compliance
- Amazon Rekognition - วิเคราะห์ non-DICOM medical images
Use Case ตัวอย่าง
1. เครือข่ายโรงพยาบาล Migrate จาก On-Premise PACS
เครือข่ายโรงพยาบาลเอกชน 15 สาขา ย้าย PACS system จาก on-premise ที่มีค่าบำรุงรักษาสูงมาก ไปยัง AWS HealthImaging โดยเก็บ CT, MRI, X-ray และ Ultrasound รวมกว่า 80 petabytes ระบบ compress ข้อมูลได้ 65% ทำให้ค่า storage ลดลงอย่างมาก แพทย์รังสีวิทยาทุกสาขาเข้าถึง images ได้ทันทีผ่าน web DICOM viewer ลด turn-around time การ read ภาพจาก 4 ชั่วโมงเหลือ 30 นาที
2. Medical AI Startup พัฒนา Chest X-Ray Analysis
บริษัท healthtech startup พัฒนา AI สำหรับวิเคราะห์ chest X-rays เพื่อตรวจจับ pneumonia, tuberculosis และ lung cancer ใช้ AWS HealthImaging เก็บ training dataset 2 ล้านภาพ ทีม ML ดึง pixel data จาก HealthImaging โดยตรงเข้า SageMaker Training Jobs ลด data preparation time จาก 3 วันเหลือ 4 ชั่วโมง ต่อ training run เนื่องจาก sub-second retrieval speed
3. Teleradiology Platform ให้บริการโรงพยาบาลชนบท
แพลตฟอร์ม teleradiology ที่ให้บริการโรงพยาบาลชุมชนใน 20 จังหวัดใช้ AWS HealthImaging เก็บ images จากโรงพยาบาลทั้งหมดในที่เดียว รังสีแพทย์ผู้เชี่ยวชาญในกรุงเทพสามารถ read ภาพจากโรงพยาบาลชุมชนได้ทันทีผ่าน zero-footprint DICOM viewer ลดเวลา report ผลจาก 2-3 วันเหลือ 2-4 ชั่วโมง ช่วยให้ผู้ป่วยในพื้นที่ห่างไกลได้รับการวินิจฉัยจากผู้เชี่ยวชาญได้รวดเร็ว