ЛЦТ 2026 · задача 04 · Департамент здравоохранения Москвы

Проверка снимков денситометрии за доли секунды

Kostik смотрит каждый снимок DXA сразу после исследования и говорит: годен или брак, какое нарушение и почему — прямо на снимке. Работает локально: снимки не покидают больницу.

Настоящий снимок поясницы и атлас Kostik: позвонки Th12–L5, ось и найденный посторонний предмет
0,31 сна снимок, без видеокарты
0,85ROC-AUC · посторонние предметы
листайте

01 · Задача

Постановка задачи

ЛЦТ 2026, задача 04 Департамента здравоохранения Москвы: сервис ИИ, который оценивает качество исследований плотности костей. Врач должен узнать о браке, пока пациент ещё в кабинете, а не через неделю, когда снимок уже не переснять.

IN

Вход

DICOM-снимки исследования без разметки: поясничный отдел и проксимальные отделы бёдер.

OUT

Выход

Строка на снимок: область, класс качества 0/1, тип нарушения, статус и время — CSV/XLSX по разделу 2.5 ТЗ.

3 мин

Условия

Контейнер и API пакетной обработки, до 3 минут на исследование, воспроизводимо, без падений, без передачи снимков наружу. Метрики — F1 и ROC-AUC с 95 % ДИ.

02 · Денситометрия

Что это и почему важна укладка

Денситометрия (DXA, двухэнергетическая рентгеновская абсорбциометрия) измеряет минеральную плотность кости двумя пучками рентгена малой энергии. По ней диагностируют остеопороз и следят за лечением. Считают плотность позвонков L1–L4 и шейки бедра — поэтому число зависит от того, как лёг пациент.

01

Поворот и наклон

Ось позвоночника отклонена больше 5° или бедро ротировано — плотность считается по косой проекции и «плывёт».

02

Неполный охват

В кадр не попали гребни подвздошных костей или Th12 — нельзя найти L1–L4 и сравнить с прошлым исследованием.

03

Посторонний предмет

Застёжка, пуговица, украшение в зоне измерения завышают плотность — диагноз может быть пропущен.

03 · Снимки

Как устроены данные

Обучающий набор организатора — 100 исследований с одного аппарата. Дальше настоящие обезличенные снимки из него: слева исходный, справа атлас, который построил Kostik. Файлы лежат на стенде ltz2026.ru, в репозитории их нет.

~300×290 px, 8 битGE Lunar Prodigy Advance; ширина 300 px — поясница, 280 px — бедро
нет масштаба в ммв DICOM нет размера пикселя и области тела — поля «3 см и 2 см» по ТЗ только косвенно
Поясница — годен: слева исходный снимок, справа атлас Kostik
годенПоясница — годенTh12–L5 и гребни подвздошных костей в кадре, ось в норме.
Посторонний предмет — брак: слева исходный снимок, справа атлас Kostik
бракПосторонний предмет — бракЯркое пятно у позвоночника: сервис обводит его рамкой и пишет измерение.
Наклон оси — брак: слева исходный снимок, справа атлас Kostik
бракНаклон оси — бракОсь позвоночника отклонена на 6,5° при допуске 5°.
Неполный охват — брак: слева исходный снимок, справа атлас Kostik
бракНеполный охват — бракСправа не видна подвздошная кость: нижние позвонки не оценить.
Левое бедро — годно: слева исходный снимок, справа атлас Kostik
годенЛевое бедро — годноВертел, шейка и поля вокруг зоны интереса в норме.
Правое бедро — годно: слева исходный снимок, справа атлас Kostik
годенПравое бедро — годноСторона определяется по массе таза относительно диафиза.

499 файлов
→ 252 снимка

247 точных копий: исследование — поясница и одно-два бедра. Дубли схлопываем до любой оценки, иначе она «подглядывает».

04 · Путь

Роудмап: как мы двигались

Две недели, 15–29 сентября. Зелёным — что сработало, красным — что не сработало и было честно отброшено.

Этап 01 / 0715.09.2026

ТЗ и стенд в первый же день

2 удачи1 отброшено
  • рабочий сервис на домене с первого дня: чтение DICOM, область, вердикт, атлас, голос
  • версия 0.1 — правила для поясницы
  • пороги подобраны на тех же данных, что и оценка: цифры завышены
~/ltz2026 — день 1v0.1
$ git init ltz2026 && cd ltz2026 $ tools/trac_cli.py epic-add «Стенд» $ infra/app/deploy.sh [deploy] сборка образа… ok [deploy] прогон «Для теста.zip»: 3 снимка [deploy] готово: https://ltz2026.ru/
стенд онлайн с первого дня
Этап 02 / 0716–21.09.2026

Разбираем данные

3 удачи2 отброшено
  • из 499 файлов уникальных только 252 — без схлопывания дублей оценка «подглядывает»
  • в DICOM нет масштаба в мм и области тела — всё определяем по изображению
  • каталог нарушений, диаграмма Ганта, роудмап
  • минималистичный редизайн откатили: карточки понятнее ссылок
  • данных мало для обучения экспертных моделей: 252 уникальных снимка, брака бедра всего 41 (по полям — 7), поясницы 32 из 99
252файлов → 252 уникальных снимка

247 точных копий убираем до любой оценки — иначе она «подглядывает»

Этап 03 / 0725.09.2026

Устойчивость

2 удачи
  • архив МРТ из интернета: было 135 из 135 технических ошибок → понятный отказ «это не DXA»
  • декодеры сжатых DICOM (JPEG Lossless, JPEG-LS, JPEG 2000)
МРТ_позвоночника.dcmмодальность MR — это не DXA
КТ_грудной_клетки.dcmмодальность CT — не денситометрия
рентген_кисти.jpgобычная картинка, не DICOM
скриншот_программы.pngописание надписей, отказ с причиной
сжатый_JPEG-LS.dcmдекодер есть — файл прочитан
технических ошибок при загрузке0
Этап 04 / 0726.09.2026

Честная оценка — главный поворот

2 удачи1 отброшено
  • кросс-валидация 5×50 по исследованиям, 95 % ДИ: F1 итога 0,58 [0,46–0,74]
  • посторонние предметы: ROC-AUC 0,55 → 0,85 — контраст пятна вместо порога яркости
  • бедро: широкий поиск признаков и признаки нейросетей (ResNet-50, DINOv2) — сигнал не вырос, ≤ 0,64
порог яркости 0,55 контраст пятна 0,85
ROC-AUC: посторонние предметы0,85
Этап 05 / 0727.09.2026

Бедро и упаковка

4 удачи1 отброшено
  • бедро оценивается: ExtraTrees по 47 признакам формы, ROC-AUC 0,66
  • итоговая фитнес-функция по п. 8.4 ТЗ: 0,570
  • приложение 1.0-Beta: .exe, .msi, .deb; стенд на ltz2026.ru
  • 3D-модель исследования: красиво, но уводило от снимков — убрали, результаты только на снимках
  • деревья на одних фолдах: ExtraTrees, бустинг, каскадный лес gcForest и каскад Viola–Jones — простой ExtraTrees не хуже, его и взяли
.exe.msi.debWindows · Windows · Linux
0,66ROC-AUC бедра: ExtraTrees, 47 признаков
Этап 06 / 0728.09.2026

Проверка гипотез

2 удачи1 отброшено
  • .deb для Ubuntu 22.04–26.04 и Python 3.10–3.14
  • переименование в Kostik
  • RAD-DINO для бедра: +0,01 ROC-AUC внутри доверительного интервала — не взяли, лишняя сложность
0,500,550,600,650,700,75
ДИ 0,62–0,69
наша модель 0,66
признаки ResNet-50 / DINOv2
≤ 0,64
слабее нашей — отбросили
признаки формы + RAD-DINO
0,67
+0,01 внутри ДИ — лишняя сложность
Этап 07 / 0729.09.2026

Сдача

3 удачи
  • презентация по шаблону ЛЦТ, документация PDF, видео
  • чтение надписей на чужих картинках (OCR), дообучение на правках врачей плагинами
  • приложение без тормозов: окно, движок и анализ — три процесса
  • презентация по шаблону ЛЦТ
  • документация PDF с оглавлением
  • видео и страница /video/
  • приложение .exe · .msi · .deb
  • стенд ltz2026.ru и репозиторий
  • страница проекта на GitHub Pages
СДАНО

Было → сейчас

былосейчас (0.5.4)
Посторонние предметы · ROC-AUCпорог яркости → локальный контраст пятна
0,550,85
Посторонние предметы · F1версия 0.1 → 0.5.4
0,130,62
Поясница, итог · F1правила по ориентирам, полный набор
0,450,62
Бедро, брак · ROC-AUC«не оценено» → ExtraTrees, кросс-валидация
0,5 · наугад0,66
00,250,50,751

Что сработало

  • стенд с первого дня — каждая идея сразу видна команде
  • разбор данных до моделей: дубли и нет масштаба
  • правила по анатомии там, где примеров мало

Что не сработало

  • признаки больших нейросетей для бедра — сигнала нет
  • оценка на тех же данных — цифры завышены
  • 3D-вид — уводил внимание от снимка
  • данных мало для обучения экспертных моделей — потолок бедра около 0,66

Аналитика пути

  • 93 коммита; 63 из них (68 %) — в последние три дня: упаковка, приложение, сдача
  • главный прирост качества — 26.09, после честной кросс-валидации
  • узкое место — бедро: 150 снимков, ротация и поля без масштаба

05 · Алгоритмы

Что мы пробовали

22 подходов за две недели — от порога Оцу и логистической регрессии до каскадов деревьев, ResNet-50, DINOv2 и RAD-DINO. У каждого честная кросс-валидация по исследованиям, результат и ссылки на скрипт, который можно запустить. Данных мало (150 бёдер, 41 брак), поэтому потолок у всех методов один — около 0,66.

Потолок бедра: ROC-AUC разных алгоритмов

на одних и тех же фолдах по исследованиям, 150 снимков
Логистическая регрессия · ориентиры0,6
PCA по миниатюрам0,56
ResNet-50 · DINOv20,64
RAD-DINO0,641
Каскадный лес gcForest0,65
Каскад Viola–Jones0,66
ExtraTrees · 47 признаков0,66
RAD-DINO + формы (не встроена)0,672
наша модель 0,66
0,50 — угадывание0,600,70
Правила и признакивзяли

Правила по яркости и геометрии

Порог Оцу выделяет кость, область определяем по ширине кадра, сторону бедра — по массе таза, позвонки — по межпозвонковым щелям.

0,45F1 поясницы в версии 0.1
Правила и признакивзяли

Детектор посторонних предметов: контраст пятна

Вместо порога яркости — локальный контраст пятна против фона. Главная победа по позвоночнику.

0,55 → 0,85ROC-AUC предметов
Правила и признакиотбросили

Другие меры оси позвоночника

Три другие меры оси не отделили сколиоз от наклона. Порог 5° оставили по ТЗ: кросс-валидация выбирает те же значения.

F1 0,30наклон оси
Правила и признакиотбросили

Логистическая регрессия · признаки ориентиров

Признаки положения диафиза, вертелов, шейки и таза. Честная кросс-валидация: на уровне «пометить все бёдра бракованными».

0,60–0,61ROC-AUC бедра, F1 ≈ 0,38–0,40
Правила и признакиотбросили

PCA по миниатюрам снимка

Внешний вид бедра как набор главных компонент — хуже ориентиров.

0,53–0,59ROC-AUC бедра
Правила и признакиотбросили

Широкий поиск признаков укладки

47 признаков, в том числе «кость обрезана краем кадра», отбор лучших без подглядывания. Ручными признаками бедро в этих данных не вытянуть.

≈ 0,6ROC-AUC бедра
Деревьявзяли

ExtraTrees · 47 признаков

Лес из 200 случайных деревьев по форме кости, краям кадра и ориентирам атласа; три модели: брак, укладка, поля. Веса — в npz, предсказание на numpy.

0,66ROC-AUC бедра [0,62–0,69], F1 0,47
Деревьяотбросили

Градиентный бустинг

Деревья строятся по очереди, каждое исправляет ошибки предыдущих. Чуть лучше по укладке, но разница — шум (≈ 0,03 на 249 снимках).

0,63ROC-AUC укладки
Деревьяотбросили

Каскадный лес (gcForest)

Уровни лесов: каждый следующий получает признаки и ответы предыдущего. Считался 6 минут и дал тот же результат, что простой лес.

0,65ROC-AUC бедра
Деревьяотбросили

Отсеивающий каскад Viola–Jones

Первая ступень с полнотой ≥ 95 % отбрасывает явно годные снимки, вторая решает по остальным. Не лучше ExtraTrees и медленнее.

0,66ROC-AUC бедра
Деревьяотбросили

Случайный лес и одно дерево

Простые деревья и обычный случайный лес взяли для сравнения: ExtraTrees не хуже и быстрее в обучении.

≤ 0,66ROC-AUC бедра
Деревьявзяли

Подбор настроек ExtraTrees

Сетка: размер листа, глубина, доля признаков, веса классов — против переобучения. Подтвердил нынешние настройки.

0,66ничего лучше не нашлось
Нейросети и синтетикаотбросили

ResNet-50 (ImageNet): признаки сети + логистика

Эмбеддинги общей сети, PCA только на обучающих фолдах. Бедро — уровень угадывания; позвоночник и предметы хуже наших правил.

0,64бедро; позвоночник 0,68 против 0,75
Нейросети и синтетикаотбросили

DINOv2: «фундаментальные» признаки

Самообучаемая модель зрения. По бёдрам то же, что ResNet-50; предметы 0,77 против 0,85 у детектора контраста.

0,64ROC-AUC бедра, F1 0,39
Нейросети и синтетикаотбросили

RAD-DINO (Microsoft, обучена на рентгене)

Последняя сильная ставка для бёдер. Отдельно 0,641; вместе с формами 0,672 — прирост в пределах доверительного интервала, а цена — PyTorch и ~1 с на снимок.

0,641 → 0,672ROC-AUC бедра, не встроена
Деревьяотбросили

Сдвиг порога

Ловить 78 % брака вместо 61 %: сервис помечает 103 бедра из 150, F1 остаётся ≈ 0,45. Нынешний порог сбалансирован.

F1 ≈ 0,45порог не помогает
Нейросети и синтетикав планах

Детектор точек (CNN / U-Net) по разметке врача

Головка, вертелы, позвонки, Th12 на 100–150 снимках. С нуля на 150 снимках — переобучение, поэтому ждём разметку. Самый перспективный путь.

планпосле 29.09
Нейросети и синтетикав планах

Синтетические ошибки укладки

Портить нормальные бёдра (обрезка, сдвиг, наклон диафиза) и учить на них. Не реализовано; ротацию из 2D-снимка так не подделать.

планне делали
Голос, надписи, дообучениевзяли

Калибровка вероятностей и фитнес-функция

Для позвоночника обучается только калибровка оценки правила; итоговая метрика по п. 8.4 ТЗ; кривые Brier по объёму данных.

0,57фитнес 0.5.4 [0,48–0,64]
Голос, надписи, дообучениевзяли

Дообучение на правках врачей (плагины)

Правки вердикта → обучающие данные; ворота качества не пускают модель, ставшую хуже; откат версий.

ворота 0,02допуск на шум
Голос, надписи, дообучениевзяли

RapidOCR (PP-OCRv5) — надписи на чужих картинках

Читает кириллицу на скриншотах и КТ, чтобы отказ был с объяснением, а не с ошибкой.

офлайнмодель ~8 МБ
Голос, надписи, дообучениевзяли

Голос: Piper и Whisper

Озвучка пояснений (Piper) и голосовые вопросы к атласу (Whisper), всё локально.

офлайнбез сети

Все скрипты лежат в scripts/, обзор методов — в карте алгоритмов scikit-learn, руководство по обучению — TRAINING.md.

06 · Решение

Как работает Kostik

DICOM, папка, zip→чтение и схлопывание дублей→область: поясница или бедро→проверка по ТЗ→атлас, граф, текст→таблица CSV/XLSX

Поясница — правила по анатомии

Позвонки Th12–L5 по межпозвонковым щелям, гребни подвздошных костей, ось столба, посторонние предметы по локальному контрасту пятна. Каждое решение — измерение, норма и вердикт.

Бедро — обученная модель

ExtraTrees по 47 признакам формы кости, краёв кадра и ориентиров атласа; инференс на numpy без видеокарты. Вердикт бедра — подсказка для проверки.

Объяснимость

Атлас с разметкой поверх снимка, переключатель «атлас ⇄ чистый снимок», граф «измерение → норма → вердикт», пояснение текстом и голосом.

Где работает

Веб-стенд, Docker без сети, API и MCP для ИИ-ассистентов, приложение для Windows и Linux. Дообучение на правках врачей — плагинами с воротами качества.

git clone https://github.com/j0k/ltz2026 && cd ltz2026./build.sh                               # образ Docker, интернет нужен только здесь./run.sh <папка или архив.zip> <выход>   # results.csv, results.xlsx, overlays.zip

07 · Результаты

Где мы сегодня — версия 0.5.4

0,31 сна снимок, 2 ядра CPU; допуск ТЗ — 3 минуты на исследование
252 / 252снимка набора без ошибок, повторный прогон — побайтно тот же
175чужих файлов из интернета — ни одного падения, каждому понятный отказ
0,57итоговая фитнес-функция по п. 8.4 ТЗ, 95 % ДИ [0,48–0,64]
КритерийF1 (кросс-валидация, 95 % ДИ)ROC-AUCУровень
Поясница, итог0,58 [0,46–0,74]0,75работает
Посторонние предметы0,550,85можно доверять
Охват0,690,88можно доверять
Наклон оси0,300,75сколиоз похож на наклон
Бедро, брак0,470,66 [0,62–0,69]подсказка для проверки

Кросс-валидация 5×50 по исследованиям, дубли в одной группе, пороги подбираются только на обучающей части. Подробно — в README и TRAINING.md.

08 · Развитие

Что дальше

01

Пилот

1–2 отделения денситометрии: проверка каждого снимка в день исследования.

02

Разметка врачей

Спорные вердикты правятся в пульте — это данные для дообучения, оно уже встроено.

03

Бедро и Th12

Разметка малого вертела и уровней позвонков, масштаб в мм от аппарата.

04

Интеграция

PACS и ЕРИС, отчёт о качестве по отделениям и лаборантам.

05

Разработка вместе с врачами

Следующий шаг: несколько подходов с практикующими врачами и ИИ. Записываем, как врач разбирает снимок — голос и движения, — ИИ раскладывает записи на понятные правила и признаки, врач проверяет, и мы делаем новый подход.

  1. Голосврач вслух объясняет, что видит и почему считает снимок браком
  2. Движениякурсор, обводка зон, порядок просмотра снимка — записываются
  3. Анализ ИИрасшифровка речи, связь слов с движениями, вывод правил и признаков
  4. Проверка врачомврач правит выводы — и начинается следующий подход

09 · О команде

Команда«КвантовыйСкачок»

Двое участников и ИИ-агент как инструмент разработки. Решение сделали за две недели хакатона.

Юрий Коноплёв

Руководитель проекта и продукт: постановка, приоритеты, приёмка каждой версии. Telegram @bimodaling

Алексей Чуркин

Стенд, Telegram-бот, проверка сервиса на чужих данных, обратная связь по продукту и презентации. Telegram @lesha_cfc

Что нас объединяет

Нам обоим интересно всё, что связано со спортом. Здоровье костей и суставов там не абстракция: травмы, нагрузки и восстановление начинаются с точной картины, а хорошая картина — с хорошего снимка.

Как работали

Код, тесты и документацию писали вместе с ИИ-агентом Claude; трекер задач, стенд и автопуш в GitHub обновлялись с первого дня.