АТ і машинне навчання перетворюють медичну зображення, але підготовка цих моделей вимагає великих, адекватно анонімних наборів даних. У цьому керівництві ви дізнаєтеся, як підготувати набори даних DICOM для досліджень аТ** за допомогою повноцінного робочого потоку, який поєднує анонімізацію комплекту з експортом метаданів JSON для безперервної інтеграції в трубопроводи ML.

Таблиця контенту

Чому AI Research потребує анонімних даних DICOM

Медичні зображення AI моделі для діагностики, сегментації та виявлення вимагають значних навчальних даних. Ці дані повинні бути адекватно анонімними, щоб відповідати HIPAA, GDPR та інституційній політиці. Крім того, науково-дослідні співробітництва часто обертаються на кілька установ, що робить стандартизовану де-ідентифікацію необхідною.

Правильна підготовка набору даних включає в себе більше, ніж просто видалення імен пацієнта. вона вимагає систематичного обробки всієї ідентифікаційної інформації, постійного застосування правил анонімності по тисячам файлів, а також конвертації форматів, що робить дані доступними для ML-фремів.

Ризики недобросовісної підготовки даних

Використання частково анонімних або неправильно структурованих наборів даних створює значні проблеми. Недосконалий анонімізація може експонувати інформацію про пацієнта, що призводить до регулярних порушень і етичних порушеннях. Безконзистентна анонимність через набір даних може вводити недоліки або проблеми з якістю даних.Неструктувані метадані роблять важко фільтрувати, запитувати і попередньо обробляти дані для модельного навчання.

Ці ризики зменшуються шляхом використання автоматизованих, послідовних трубопроводів анонімності та конвертації даних в машинно-приятливі формати.

Повний підготовчий робочий потік

Повний робочий потік складається з чотирьох етапів. По-перше, комплект анонімно аналізує дослідження DICOM за допомогою постійних профілів. Друге, конвертувати анонімізовані метадати в JSON для введення трубопроводу. Третій, зберігати зображення і метаданти для доступу до МЛ рамки.

Розглянемо кожну стадію з прикладом коду.

Анонімізація бач

Почнемо з анонімності вашої колекції 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

Після анонімності конвертуйте метаданни в JSON для введення трубопроводу ML:

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}");
    }
}

Інтеграція з трубопроводами МЛ

Експортований JSON можна завантажити в різні рамки і інструменти ML.

Завантажити в Python з Pandas

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")}");
    }
}

«Найкращі практики»

Зберігання пам’яті між анонімними та оригінальними ідентифікаторами повинно зберігатися в безпечному, контрольованому доступом місці окремо від анонимних даних.Це дозволяє повторну ідентификацію, якщо це необхідно для клінічного відстеження при збереженні конфіденційності.

Зареєструйте всі операції для репродуктивності. записуйте, які файли були оброблені, коли, з яким профілем, і будь-які помилки зіткнулися.

Відтверджуйте вихід зразка перед обробкою цілих наборів даних. спот-перевірте анонімні файли, щоб переконатися, що профіль працює, як очікувалося, і що якість зображення зберігається.

Зверніть увагу на розділення даних для великих наборів даних. організовуйте результати за типом дослідження, формою навчання або іншими відповідними критеріями для полегшення підрозділу вибору для різних тренувальних завдань.

Завершення (завтрачення)

Підготовка даних DICOM для інтелектуальної та машинного навчання вимагає уваги до конфіденційності, послідовності та форматної сумісності. За допомогою Aspose.Medical для .NET, можна побудувати автоматизовані трубопроводи, які об’єднують анонімні дослідження з постійними профілями, експортують метадані до JSON для введення в ML рамки, а також підтримують аудитні шляхи для розповсюдження.

Цей робочий потік гарантує, що ваші дані досліджень належним чином деідентифіковані, добре структуровані і готові до наступного покоління медичного зображення.

Для отримання додаткової інформації та прикладів, відвідайте Докладніше: Медична документаціяДля того, щоб випробувати всі можливості API, Отримайте безкоштовну тимчасову ліцензію.

More in this category