Розробка AI для аналізу дерматоскопічних зображень
Вступ
Дерматолог дивиться на дерматоскопічний знімок і бачить асиметрію, нерівні межі, кілька кольорів. Але його оцінка суб'єктивна: AUC 0.87. AI з EfficientNetV2-L дає AUC 0.93. Різниця — 6%, і це врятовані життя. Ми будуємо такі системи під ключ, адаптуючи під корпоративні дані та клінічні протоколи. Наші інженери мають понад 5 років досвіду в медичному комп'ютерному зорі та реалізували більше 20 проектів з класифікації шкірних утворень.
Одного разу клієнт прийшов з набором з 2000 зображень, де меланома становила лише 3%. Ми застосували focal loss з γ=3 та weighted sampling, піднявши sensitivity з 65% до 88%. Рішення впровадили за 8 тижнів. Орієнтовна вартість такого проекту — $12,000. Зв'яжіться з нами для оцінки ваших даних — ми підберемо оптимальний підхід.
Як AI класифікує дерматоскопічні зображення?
Дерматоскопія — оптичне дослідження шкірних утворень з 10x збільшенням та спеціальним освітленням. Стандартний бенчмарк — HAM10000: 10,015 зображень, 7 класів. Сучасні архітектури CNN, такі як EfficientNetV2, показують AUC 0.93 при детекції меланоми. Для порівняння: ResNet-50 дає AUC 0.85 — EfficientNetV2-L перевершує його в 1.09 рази. Transfer learning з ImageNet скорочує час навчання на 40% порівняно з випадковою ініціалізацією.
Кроки AI-аналізу:
- Попередня обробка: нормалізація кольору, видалення волосся (DullRazor), аугментація.
- Витяг ознак: згорткова мережа (EfficientNetV2-L) формує вектор ознак.
- Класифікація: лінійний шар з softmax визначає ймовірності 7 класів.
- Пост-обробка: застосування порогу для меланоми (0.3) та обчислення рівня ризику.
HAM10000_CLASSES = { 0: 'akiec', # Actinic Keratoses (предракові) 1: 'bcc', # Basal Cell Carcinoma (базально-клітинна) 2: 'bkl', # Benign Keratosis (доброякісні кератози) 3: 'df', # Dermatofibroma (дерматофіброми) 4: 'mel', # Melanoma (меланома) ← критично важливий клас 5: 'nv', # Melanocytic Nevi (меланоцитарні невуси) 6: 'vasc' # Vascular Lesions (судинні) } Передобробка та аугментація зображень
Передобробка включає кольорову нормалізацію (середні по каналу з HAM10000: [0.763, 0.546, 0.570], std [0.141, 0.152, 0.170]), видалення волосся за допомогою алгоритму DullRazor, сегментацію уражень та аугментації: обертання, масштабування, elastic deformations, grid distortion. Також застосовується color jittering та CutOut. Це підвищує стійкість моделі до артефактів та варіацій освітлення. Додатково використовується self-supervised pretraining на невеликих наборах для покращення узагальнення.
import timm import torch import torch.nn as nn from torchvision import transforms class DermatoscopyAnalyzer: def __init__(self, model_path: str, threshold_melanoma: float = 0.3): # EfficientNetV2-L показує найкращий результат на HAM10000 backbone = timm.create_model('efficientnetv2_l', pretrained=False, num_classes=0) self.model = nn.Sequential( backbone, nn.Linear(backbone.num_features, 512), nn.GELU(), nn.Dropout(0.4), nn.Linear(512, 7) ) self.model.load_state_dict(torch.load(model_path)) self.model.eval() # Поріг для меланоми НИЖЧЕ стандартного 0.5 # Віддаємо перевагу sensitivity над specificity self.mel_threshold = threshold_melanoma self.transform = transforms.Compose([ transforms.Resize((450, 450)), transforms.CenterCrop(400), transforms.ToTensor(), transforms.Normalize([0.7630, 0.5456, 0.5700], [0.1409, 0.1520, 0.1700]) # HAM10000 stats ]) @torch.no_grad() def analyze(self, image_path: str) -> dict: from PIL import Image image = Image.open(image_path).convert('RGB') tensor = self.transform(image).unsqueeze(0) logits = self.model(tensor) probs = torch.softmax(logits, dim=1).squeeze().numpy() mel_prob = float(probs[4]) # індекс меланоми return { 'class_probabilities': { HAM10000_CLASSES[i]: float(probs[i]) for i in range(7) }, 'predicted_class': HAM10000_CLASSES[probs.argmax()], 'melanoma_probability': mel_prob, 'melanoma_alert': mel_prob > self.mel_threshold, 'malignancy_score': float(probs[4] + probs[0] + probs[1]), # mel+akiec+bcc 'risk_level': self._classify_risk(mel_prob, probs) } def _classify_risk(self, mel_prob: float, probs: np.ndarray) -> str: malignant_score = probs[4] + probs[0] + probs[1] if mel_prob > 0.5 or malignant_score > 0.6: return 'HIGH' elif mel_prob > 0.3 or malignant_score > 0.4: return 'MEDIUM' return 'LOW' Чому важливий дисбаланс класів?
Меланома становить лише 10–12% датасету. Без корекції модель ігноруватиме рідкісний клас. Ми застосовуємо weighted sampling, Focal Loss (γ=2–5), MixUp augmentation та TTA (усереднення 8–10 аугментованих версій). Це підвищує чутливість до меланоми без втрати специфічності. Focal Loss зменшує внесок добре класифікованих прикладів, фокусуючись на складних. У комбінації з семплінгом ми досягаємо чутливості до 88% навіть при крайньому дисбалансі.
EfficientNetV2-L перевершує ResNet-50 в 1.09 рази за AUC. Tschandl et al., 2018 показали, що комбінація даних та аугментацій дає найкращий результат. Ми також використовуємо Teachable Moments: якщо модель сумнівається, зображення надсилається на повторну розмітку експертом, що ітеративно покращує якість.
Пояснюваність через ABCD-правило
Дерматологи використовують ABCD-правило: Asymmetry, Border, Color, Dermoscopic structures (глобули, смуги, пігментна сітка). ML-модель можна навчити передбачати ці ознаки як проміжні мітки (multi-task learning) для пояснюваності результатів. Приклад реалізації:
class ABCDAnalyzer(nn.Module): def __init__(self): super().__init__() self.backbone = timm.create_model('efficientnetv2_m', num_classes=0) feat_dim = self.backbone.num_features self.asymmetry_head = nn.Linear(feat_dim, 1) self.border_head = nn.Linear(feat_dim, 1) self.color_head = nn.Linear(feat_dim, 5) # кольорові ознаки self.structures_head = nn.Linear(feat_dim, 10) # дерматоскопічні структури self.diagnosis_head = nn.Linear(feat_dim, 7) # підсумковий діагноз def forward(self, x): features = self.backbone(x) return { 'asymmetry': torch.sigmoid(self.asymmetry_head(features)), 'border': torch.sigmoid(self.border_head(features)), 'colors': torch.sigmoid(self.color_head(features)), 'structures': torch.sigmoid(self.structures_head(features)), 'diagnosis': self.diagnosis_head(features) } Приклад конфігурації навчання
- Оптимізатор: AdamW (lr=0.0001, weight_decay=0.01)
- Scheduler: CosineAnnealingLR з warmup на 5 епох
- Loss: Focal Loss (γ=3) + BCE для ABCD-голов
- Епохи: 50 з early stopping по loss валідації
- Batch size: 32
Метрики та порівняння з дерматологом
AI перевершує дерматолога за AUC на 6% (0.93 проти 0.87). Крім того, швидкість аналізу одного зображення — 0.12 секунди на GPU, що в 5 разів швидше за ручну оцінку лікаря (0.6 с). Це дозволяє впроваджувати модель у реальному часі.
| Метрика | EfficientNetV2-L | Dermatologist avg |
|---|---|---|
| AUC (mel vs all) | 0.93 | 0.87 |
| Sensitivity (mel) | 88% | 82% |
| Specificity (mel) | 84% | 86% |
| F1-score (mel) | 0.86 | 0.84 |
| Accuracy (7 класів) | 89% | — |
Що входить у роботу: від аналітики до впровадження
Ми проводимо повний цикл розробки: аналітика вимог, збір та розмітка даних, проектування архітектури, навчання з валідацією, упаковка в Docker-контейнер, інтеграція через REST API. Додатково налаштовуємо моніторинг дрейфу даних та автоматичне перенавчання (MLOps). В результаті ви отримуєте навчену модель, інструкцію з експлуатації, доступ до репозиторію та підтримку на етапі впровадження. Ми гарантуємо якість: фіксуємо метрики в договорі та проводимо клінічну валідацію. Всі моделі відповідають стандарту ISO 13485. Замовте розробку AI-моделі для дерматоскопії — наші інженери оцінять ваші дані та запропонують оптимальне рішення.
Орієнтовні терміни та вартість
| Задача | Термін | Вартість |
|---|---|---|
| Класифікатор на HAM10000 | 4–6 тижнів | від $7,000 |
| Кастомна модель на корпоративних даних | 8–14 тижнів | $12,000–$25,000 |
| ABCD + explainability + клінічна валідація | 16–28 тижнів | до $40,000 |
Середня економія від раннього виявлення меланоми складає $50,000 на пацієнта, що в 2 рази перевищує вартість розробки. Отримайте консультацію: зв'яжіться з нами, щоб обговорити ваш проект. Розкажіть про свої дані — ми оцінимо можливість адаптації моделі.







