ИИ и машинното обучение преобразуват медицинската картина, но обучението на тези модели изисква големи, адекватно анонимни набори от данни. В този ръководство ще научите как да подготвите DICOM наборите за AI изследвания с помощта на пълен работен поток, който съчетава анонимизирането на комплекта с износа на JSON метаданни за безжична интеграция в МЛ тръбопроводи.

Таблица на съдържанието

Защо 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 за инжектиране на МЛ тръбопровода:

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

Най-добрите практики – най-добрата практика

Secure ID mapping storage е от съществено значение.Maping между анонимни и оригинални идентификатори трябва да се съхранява в безопасно, достъп-контролирано място отделно от анонимизираните данни.Това позволява повторно идентифициране, ако е необходимо за клинично проследяване, като същевременно запазва поверителността.

Запишете всички операции за възпроизвеждаемост. записване на кои файлове са били обработвани, кога, с който профил, и всякакви грешки. Тази документация е от решаващо значение за изискванията за репродуктивност на научните изследвания и одита.

Validate sample outputs преди обработка на целият набор от данни. Spot-check анонимни файлове, за да се гарантира, че профилът работи както се очаква и че качеството на изображението е запазено.

Внимавайте за разделяне на данни за големи набори от данни.Организирайте резултата според вида на обучението, режима или други подходящи критерии, за да се улесни подборът на подсистемите за различни тренировъчни задачи.

Заключението е заключение

Използването на Aspose.Medical за .NET, можете да изградите автоматизирани тръби, които комбинират анонимни проучвания с последователни профили, експортиране на метаданни до JSON за ML рамкова инжекция и поддържане на одитни пътеки за възпроизвеждане.

Този работен поток гарантира, че вашите данни за научни изследвания са правилно деидентифицирани, добре структурирани и готови за следващото поколение медицинско изобразително изкуство.

За повече информация и примери, посетете Апсос.медицинска документацияЗа да изпробвате пълните възможности на API, Получете безплатна временна лиценза.

More in this category