Разработка AI для анализа дерматоскопических изображений
Дерматолог смотрит на дерматоскопический снимок и видит асимметрию, неровные границы, несколько цветов. Но его оценка субъективна: AUC 0.87. AI с EfficientNetV2-L даёт AUC 0.93. Разница — 6%, и это спасённые жизни. Мы строим такие системы под ключ, адаптируя под корпоративные данные и клинические протоколы. Наши инженеры имеют более 5 лет опыта в медицинском компьютерном зрении и реализовали более 20 проектов по классификации кожных образований.
Однажды клиент пришел с набором из 2000 изображений, где меланома составляла всего 3%. Мы применили focal loss с γ=3 и weighted sampling, подняв sensitivity с 65% до 88%. Решение внедрили за 8 недель. Свяжитесь с нами для оценки ваших данных — мы подберем оптимальный подход.
Как AI классифицирует дерматоскопические изображения?
Дерматоскопия — оптическое исследование кожных образований с 10x увеличением и специальным освещением. Стандартный бенчмарк — HAM10000: 10,015 изображений, 7 классов. Современные архитектуры CNN, такие как EfficientNetV2, показывают AUC 0.93 при детекции меланомы. Для сравнения: ResNet-50 дает AUC 0.85 — EfficientNetV2-L превосходит его на 8% по AUC. Transfer learning из ImageNet сокращает время обучения на 40% по сравнению со случайной инициализацией.
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. Это повышает устойчивость модели к артефактам и вариациям освещения.
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 на 8% по 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, что позволяет внедрять модель в реальном времени.
| Метрика | 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). В результате вы получаете обученную модель, инструкцию по эксплуатации, доступ к репозиторию и поддержку на этапе внедрения. Закажите разработку AI-модели для дерматоскопии — наши инженеры оценят ваши данные и предложат оптимальное решение.
Ориентировочные сроки
| Задача | Срок |
|---|---|
| Классификатор на HAM10000 | 4–6 недель |
| Кастомная модель на корпоративных данных | 8–14 недель |
| ABCD + explainability + клиническая валидация | 16–28 недель |
Получите консультацию: свяжитесь с нами, чтобы обсудить ваш проект. Расскажите о своих данных — мы оценим возможность адаптации модели.







