AI와 기계 학습은 의료 이미지를 변환하지만, 이러한 모델을 훈련하는 것은 크고 적절하게 익명화 된 데이터 세트가 필요합니다.이 가이드에서는 완전한 작업 흐름을 사용하여 AI 연구를위한 DICOM 데이터 시트를 ** 준비하는 방법을 배울 것입니다.

테이블 콘텐츠

왜 AI 연구가 익명 DICOM 데이터를 필요로 하는가

진단, 분할 및 탐지에 대한 의료 이미지 AI 모델은 상당한 훈련 데이터가 필요합니다.이 데이터는 HIPAA, GDPR 및 기관 정책을 준수하기 위해 적절하게 익명화되어야 합니다.

적절한 데이터 세트 준비는 단순히 환자의 이름을 제거하는 것보다 더 많은 것을 포함합니다.이것은 모든 식별 정보의 체계적인 처리, 수천 개의 파일에 대한 익명화 규칙의 일관된 적용, 그리고 ML 프레임에 데이터를 접근 할 수있는 형식 변환을 필요로한다.

부적절한 데이터 세트 준비의 위험

부분적으로 익명 또는 부적절하게 구조화 된 데이터 세트를 사용하면 상당한 문제를 일으킬 수 있습니다. 불완전한 익명이 환자 정보를 노출하여 규제 위반 및 윤리적 침해로 이어집니다. 데이터세트에 대한 불일치한 애니메이션은 비아스 또는 데이터 품질 문제가 발생합니다. 무조건 된 메타데이터는 모델 훈련을위한 필터링, 쿼리 및 사전 처리 데이터를 어렵게 만듭니다..

이러한 위험은 자동화되고 일관된 익명화 파이프라인을 사용하고 데이터를 기계 친화적 인 형식으로 변환함으로써 완화됩니다.

완전한 준비 작업 흐름(Complete Preparation Workflow)

전체 작업 흐름은 4 단계로 구성되어 있습니다. 첫째, 일관된 프로파일을 사용하여 DICOM 연구를 익명화하는 배치. 두 번째, 파이프 라인 섭취를 위해 JSON에 익명의 메타 데이터를 변환합니다. 셋째는 ML 프레임에 액세스 할 수있는 이미지와 메탈 데이터가 저장됩니다.

각 단계를 코드 예제로 실행하자.

배치 익명화

일관된 프로필으로 DICOM 컬렉션을 익명화함으로써 시작하십시오 :

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;

public class DicomDatasetPreparation
{
    private readonly string _inputFolder;
    private readonly string _outputFolder;
    private readonly string _mappingFile;
    private readonly Anonymizer _anonymizer;
    private readonly List<string> _mappings = new();

    public DicomDatasetPreparation(string inputFolder, string outputFolder)
    {
        _inputFolder = inputFolder;
        _outputFolder = outputFolder;
        _mappingFile = Path.Combine(outputFolder, "id_mapping.csv");

        Directory.CreateDirectory(outputFolder);

        // Create anonymizer with research-appropriate profile
        ConfidentialityProfile profile = ConfidentialityProfile.CreateDefault(
            ConfidentialityProfileOptions.BasicProfile |
            ConfidentialityProfileOptions.RetainPatientChars
        );
        _anonymizer = new Anonymizer(profile);

        _mappings.Add("OriginalFile,AnonymizedFile,Timestamp");
    }

    public async Task ProcessDatasetAsync()
    {
        string[] dicomFiles = Directory.GetFiles(_inputFolder, "*.dcm", SearchOption.AllDirectories);
        Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.");

        int processed = 0;
        int failed = 0;

        foreach (string filePath in dicomFiles)
        {
            try
            {
                string relativePath = Path.GetRelativePath(_inputFolder, filePath);
                string outputPath = Path.Combine(_outputFolder, "images", relativePath);

                Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);

                DicomFile dcm = DicomFile.Open(filePath);
                DicomFile anonymizedDcm = _anonymizer.Anonymize(dcm);
                anonymizedDcm.Save(outputPath);

                // Record mapping for audit trail
                _mappings.Add($"\"{relativePath}\",\"{outputPath}\",\"{DateTime.UtcNow:O}\"");

                processed++;
                if (processed % 100 == 0)
                {
                    Console.WriteLine($"Progress: {processed}/{dicomFiles.Length}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error processing {filePath}: {ex.Message}");
                failed++;
            }
        }

        // Save mapping file
        await File.WriteAllLinesAsync(_mappingFile, _mappings);

        Console.WriteLine($"\nAnonymization complete:");
        Console.WriteLine($"  Processed: {processed}");
        Console.WriteLine($"  Failed: {failed}");
        Console.WriteLine($"  Mapping file: {_mappingFile}");
    }
}

메타 데이터를 JSON으로 변환

익명화 후, ML 파이프 라인 섭취를 위해 JSON로 메타 데이터를 변환합니다.

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;

public class MetadataExporter
{
    public async Task ExportMetadataToJsonAsync(string dicomFolder, string jsonOutputPath)
    {
        string[] dicomFiles = Directory.GetFiles(dicomFolder, "*.dcm", SearchOption.AllDirectories);
        List<Dataset> datasets = new();

        Console.WriteLine($"Extracting metadata from {dicomFiles.Length} files...");

        foreach (string filePath in dicomFiles)
        {
            try
            {
                DicomFile dcm = DicomFile.Open(filePath);
                datasets.Add(dcm.Dataset);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Skipping {filePath}: {ex.Message}");
            }
        }

        // Serialize all datasets to JSON array
        string jsonArray = DicomJsonSerializer.Serialize(datasets.ToArray(), writeIndented: true);
        await File.WriteAllTextAsync(jsonOutputPath, jsonArray);

        Console.WriteLine($"Exported {datasets.Count} datasets to {jsonOutputPath}");
    }

    public async Task ExportMetadataPerFileAsync(string dicomFolder, string jsonOutputFolder)
    {
        Directory.CreateDirectory(jsonOutputFolder);
        string[] dicomFiles = Directory.GetFiles(dicomFolder, "*.dcm", SearchOption.AllDirectories);

        foreach (string filePath in dicomFiles)
        {
            try
            {
                DicomFile dcm = DicomFile.Open(filePath);
                string json = DicomJsonSerializer.Serialize(dcm, writeIndented: true);

                string jsonFileName = Path.GetFileNameWithoutExtension(filePath) + ".json";
                string jsonPath = Path.Combine(jsonOutputFolder, jsonFileName);
                await File.WriteAllTextAsync(jsonPath, json);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error exporting {filePath}: {ex.Message}");
            }
        }

        Console.WriteLine($"Individual JSON files saved to {jsonOutputFolder}");
    }
}

ML 파이플린과 통합

수출 된 JSON은 다양한 ML 프레임 워크 및 도구로 충전 될 수 있습니다.

Pandas를 사용하여 Python에 업로드

import json
import pandas as pd

# Load the JSON array
with open('dicom_metadata.json', 'r') as f:
    dicom_data = json.load(f)

# Flatten nested structure for analysis
def extract_values(record):
    result = {}
    for tag, data in record.items():
        if 'Value' in data and data['Value']:
            value = data['Value'][0]
            if isinstance(value, dict) and 'Alphabetic' in value:
                result[tag] = value['Alphabetic']
            else:
                result[tag] = value
    return result

flat_data = [extract_values(record) for record in dicom_data]
df = pd.DataFrame(flat_data)

print(df.head())
print(f"Dataset shape: {df.shape}")

Elasticsearch에 대한 리뷰 보기

from elasticsearch import Elasticsearch, helpers

es = Elasticsearch(['http://localhost:9200'])

with open('dicom_metadata.json', 'r') as f:
    dicom_data = json.load(f)

def generate_actions(data):
    for i, record in enumerate(data):
        yield {
            '_index': 'dicom_studies',
            '_id': i,
            '_source': record
        }

helpers.bulk(es, generate_actions(dicom_data))
print(f"Indexed {len(dicom_data)} records to Elasticsearch")

전체 파이프 라인 스크립트

다음은 전체 준비 작업 흐름을 수행하는 완전한 C# 스크립트입니다 :

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;
using Aspose.Medical.Dicom.Serialization;

class Program
{
    static async Task Main(string[] args)
    {
        string inputFolder = args.Length > 0 ? args[0] : @"C:\DicomSource";
        string outputFolder = args.Length > 1 ? args[1] : @"C:\DicomPrepared";

        Console.WriteLine("=== DICOM Dataset Preparation for AI ===\n");

        // Step 1: Anonymize
        Console.WriteLine("Step 1: Anonymizing DICOM files...");
        var prep = new DicomDatasetPreparation(inputFolder, outputFolder);
        await prep.ProcessDatasetAsync();

        // Step 2: Export metadata to JSON
        Console.WriteLine("\nStep 2: Exporting metadata to JSON...");
        var exporter = new MetadataExporter();
        string anonymizedFolder = Path.Combine(outputFolder, "images");
        string jsonOutput = Path.Combine(outputFolder, "metadata.json");
        await exporter.ExportMetadataToJsonAsync(anonymizedFolder, jsonOutput);

        Console.WriteLine("\n=== Dataset Preparation Complete ===");
        Console.WriteLine($"Anonymized images: {Path.Combine(outputFolder, "images")}");
        Console.WriteLine($"Metadata JSON: {jsonOutput}");
        Console.WriteLine($"ID Mapping: {Path.Combine(outputFolder, "id_mapping.csv")}");
    }
}

최고의 연습(Best Practices)

Secure ID mapping storage는 필수적입니다.匿名 및 원래 식별자 사이의 맵링은 익명의 데이터와 별도로 안전하고 액세스 통제된 위치에 저장되어야 합니다.이것은 개인 정보 보호를 유지하면서 임상 추적을 위해 필요한 경우 다시 확인할 수 있습니다.

** 재생 가능성을 위해 모든 작업을 로그인하십시오. 어떤 파일이 처리되었는지, 언제, 어떤 프로필과 발생한 오류를 기록합니다.이 문서는 연구 재현 가능성 및 검토 요구 사항에 중요한 문서입니다.

**전체 데이터 세트를 처리하기 전에 샘플 출력을 확인하십시오. 프로필이 예상대로 작동하고 이미지 품질이 보존되는지 확인하기 위해 포트-검색 익명 파일.

**대규모 데이터 세트에 대한 데이터 분할을 고려하십시오.학습 유형, 형식 또는 다른 관련 기준에 따라 결과를 조직하여 다양한 훈련 작업을위한 하위세트 선택을 촉진합니다.

결론을 내리며

AI 및 기계 학습을위한 DICOM 데이터 세트를 준비하는 것은 개인 정보 보호, 일관성 및 형식 호환성에주의를 기울여야합니다. .NET의 Aspose.Medical을 사용하면 일정한 프로파일을 가진 연구를 익명화하는 자동 파이프를 구축 할 수 있으며, ML 프레임 워크 섭취를 위해 JSON에 메타 데이터를 수출하고 재생 가능성을 위한 감사 경로를 유지할 수 있습니다.

이 작업 흐름은 귀하의 연구 데이터가 적절하게 인식되지 않고, 잘 구조화되며, 다음 세대의 의료 이미지 인공지능에 대비할 준비가되어 있습니다.

더 많은 정보와 예제는 다음을 방문하십시오. ASPOSE - 의학 문서전체 API 능력을 시도하려면, 무료 임시 라이센스를 받으십시오..

More in this category