Розробка 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 рази перевищує вартість розробки. Отримайте консультацію: зв'яжіться з нами, щоб обговорити ваш проект. Розкажіть про свої дані — ми оцінимо можливість адаптації моделі.







