ИИ и машинско учење трансформишу медицинску слику, али обука ових модела захтева велике, адекватно анонимне сете података.У овом водичу ћете научити како да припремите ДИЦОМ датотеке за АИ истраживање користећи комплетан радни ток који комбинује анонимизацију бацх са ЈСОН метадане извозом за беспрекорно интегрисање у МЛ цеви.

Табела садржаја

Зашто АИ истраживање треба анонимне ДИЦОМ податке

Медицински образац ИИ модели за дијагнозу, сегментацију и откривање захтевају значајне информације о обуци. Ови подаци морају бити адекватно анонимни да се поштују ХИПАА, ГДПР, и институционалне политике. Поред тога, истраживачке сарадње често шире више институција, чинећи стандардизовану де-идентификацију неопходним.

Правилна припрема набора података укључује више него само уклањање имена пацијента. захтева систематску обраду свих идентификационих информација, конзистентну примену правила анонимности кроз хиљаде датотека и конверзију формата која чини податке приступачним МЛ оквирима.

Ризици од неправилне припреме датотеке

Коришћење делимично анонимних или неправилно структурираних сетова података ствара значајне проблеме. Непотпуна анонимизација може изложити информације о пацијенту, што доводи до регулаторних кршења и етичких прекршаја. Инконзистентна анонизација кроз сет подата може увести биасе или питања квалитета податак.

Ови ризици се ублажавају коришћењем аутоматских, конзистентних анонимних цеви и конвертовањем података у машински прихватљиве формати.

Потпуно припремање радног тока {#комплет-препарација-работни ток}

Потпуни радни ток се састоји од четири фазе. Прво, баццх анонимизира ДИЦОМ студије користећи конзистентне профиле. Друго, конвертирају анонимне метадате у ЈСОН за унос цеви. Треће, складиштење слика и метадата за приступ МЛ оквиру. Четврто, одржавање мапирање између анонимних и оригиналних ИД-а у сигурном складирању.

Хајде да имплементирамо сваку фазу са примерима кода.

Батцх анонимизација

Počnite anonimizovanjem vaše kolekcije DICOM sa doslednim profilom:

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

Претварање метада у ЈСОН

Након анонимности, конвертирајте метадане у ЈСОН за унос МЛ цеви:

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

Интегрисање са МЛ пипелинама

Експортирани ЈСОН се може наплатити у различите МЛ оквире и алате.

Преузимање у Питон са Пандасом

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

Потпуни пилинг скрипт

Ево комплетног Ц # скрипта који врши цео радни ток припреме:

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 je neophodan.Maping između anonimnih i originalnih identifikacija treba da bude pohranjen u bezbednom, pristupno kontrolisanom mestu odvojeno od anonimizovanih podataka.To omogućava re-identifikaciju ako je potrebno za kliničko praćenje dok se održava privatnost.

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

Валидирајте излазе узорка пре обраде целог сета података.Проверите анонимне датотеке како би се осигурало да профил ради као што је очекивано и да се квалитет слике чува.

Узимање у обзир подешавање података за велике сете подаци. организовање резултата по типу студије, модулу или другим релевантним критеријумима како би се олакшао избор подсета за различите задатке обуке.

Закључак {# закључак}

Припрема ДИЦОМ датотеке за ИИ и машинско учење захтева пажљиву пажњу на приватност, конзистентност и компатибилност формата. Користећи Аппосе.Медикал за .НЕТ, можете изградити аутоматске цеви који бацк анонимизирају студије са константним профилима, извозе метадане у ЈСОН за унос МЛ оквира, и одржавање ревизијских трагова за репродуктивност.

Овај радни ток осигурава да су подаци вашег истраживања адекватно деидентификовани, добро структурирани и спремни за следећу генерацију медицинске слике ИИ.

За више информација и примера, посетите Апсос.медицинска документацијаДа бисте пробали пуне капацитете АПИ, Добијте бесплатну привремени лиценцу.

More in this category