هوش مصنوعی و یادگیری ماشین، تصویر پزشکی را تغییر می دهند، اما آموزش این مدل ها نیاز به مجموعه های داده های بزرگ و به درستی ناشناس دارد.در این راهنمای، شما یاد خواهید گرفت که چگونه با استفاده از یک جریان کار کامل که ترکیبی از نامگذاری بسته با صادرات متادان JSON برای یکپارچه سازی بی سیم در لوله های ML است، برنامه های دیکوم را آماده کنید.

جدول محتوا

چرا تحقیقات هوش مصنوعی نیاز به داده های DICOM ناشناس دارد

مدل های هوش مصنوعی تصویری پزشکی برای تشخیص، تقسیم و تشخیص نیاز به داده های آموزشی قابل توجهی دارند. این داده ها باید به درستی ناشناس شوند تا مطابق با HIPAA، GDPR و سیاست های نهادی باشند. علاوه بر این، همکاری های تحقیقاتی اغلب چندین موسسه را گسترش می دهند، به طوری که استاندارد سازی شناسایی ضروری است.

آماده سازی مناسب مجموعه داده ها شامل بیشتر از حذف نام بیماران است.این نیاز به پردازش سیستماتیک از تمام اطلاعات شناسایی، استفاده مداوم از قوانین ناشناس سازی در سراسر هزاران فایل، و تبدیل فرمت است که داده های دسترسی به چارچوب های ML.

خطرات آماده سازی داده های نامناسب (Risk of improper dataset preparation)

استفاده از مجموعه های داده به طور جزئی ناشناس یا نامناسب ساختار مشکلات قابل توجهی ایجاد می کند. ناخودآگاه ناقص می تواند اطلاعات بیمار را در معرض قرار دهد، منجر به نقض مقررات و اختلالات اخلاقی می شود. عدم انطباق ناشناخته در سراسر یک مجموعه داده ممکن است مشکلات بیس یا کیفیت داده ها را وارد کنید. متادیت های غیر ساختاری دشوار است برای فیلتر کردن، درخواست و داده های پیش پردازش برای آموزش مدل.

این خطرات با استفاده از لوله های ناشناس سازی اتوماتیک و منسجم و تبدیل داده ها به فرمت های سازگار با ماشین کاهش می یابد.

فرآیند آماده سازی کامل (Complete Preparation Workflow)

جریان کامل کار از چهار مرحله تشکیل شده است.اول، مجموعه ای از مطالعات DICOM را با استفاده از پروفایل های پایدار ناشناس می کند.دوم، تبدیل متادیت های ناخودآگاه به JSON برای جذب خط لوله.ثالث، ذخیره تصاویر و متدیت ها برای دسترسی به چارچوب ML.

بیایید هر مرحله را با نمونه های کد اجرا کنیم.

بایگانی برچسب ها: Batch Anonymous

شروع با ناشناس کردن مجموعه 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}");
    }
}

یکپارچه سازی با لوله های ML

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

بهترین شیوه ها – Best Practices

آموزش نقشه برداری اطلاعات امن ضروری است.مخازن بین شناسه های ناشناس و اصلی باید در یک مکان امن و کنترل دسترسی جدا از داده های نامعلوم ذخیره شود.این امکان شناسایی مجدد در صورت لزوم برای ردیابی بالینی در حالی که حفظ حریم خصوصی را فراهم می کند.

سرمایه گذاری تمام عملیات برای بازتاب پذیری ثبت کنید که کدام فایل ها پردازش شده اند، چه زمانی، با کدام پروفایل، و هر گونه خطا روبرو شده است.این مستندات برای نیازهای بازسازی تحقیق و حسابرسی حیاتی هستند.

پایه های نمونه را تایید کنید قبل از پردازش مجموعه کامل داده ها، فایل های ناشناس را بررسی کنید تا اطمینان حاصل شود که پروفایل به همان اندازه که انتظار می رود کار می کند و کیفیت تصویر حفظ می شود.

تقسیم داده ها را در نظر بگیرید برای مجموعه های داده های بزرگ سازماندهی خروجی با توجه به نوع مطالعه، حالت و یا سایر معیارهای مربوطه برای تسهیل انتخاب زیر مجموعه برای وظایف آموزشی مختلف.

نتیجه گیری #تصمیم گیری

آماده سازی مجموعه های داده DICOM برای هوش مصنوعی و یادگیری ماشین نیاز به توجه دقیق به حریم خصوصی، هماهنگی و سازگاری فرمت دارد.با استفاده از Aspose.Medical برای .NET، شما می توانید لوله های اتوماتیک را بسازید که مطالعات را با پروفایل های پایدار ناشناس می کنند، متادیت ها را به JSON برای جذب چارچوب ML صادر می کند و مسیرهای بازرسی را برای بازتاب پذیری حفظ می کنید.

این جریان کار اطمینان حاصل می کند که داده های تحقیقاتی شما به درستی شناسایی نشده، به خوبی ساختار یافته و برای نسل بعدی تصویربرداری پزشکی آماده است.

برای اطلاعات بیشتر و نمونه ها، به بایگانی برچسب ها: مستندات پزشکیبرای آزمایش تمام قابلیت های API، یک مجوز موقت رایگان دریافت کنید.

More in this category