← Отчёты
12.07.2026 · исследовательский спайк · не продакшн

Локальная реконструкция геометрии сканов

Как мы будем дорисовывать то, чего в скане нет — и что для этого нужно собрать. Три яруса, шесть инструментов, двадцать реальных сканов.

Главный вывод. Самая большая опасность — не в том, что мы чего-то не умеем дорисовать. Она в том, что общепринятый дефолт инструментов молча рисует несуществующую анатомию: на нашем скане он дорисовал 2913 мм² фальшивого нёба. Это доказано делом — и снимается одной строкой кода.

Вердикт по ярусам

ЯрусВердиктПочему
1
микро-дыра на зубе
СТОИТ.
Классика, без ML
Заплатка физически не может испортить скан — она только добавляет вершины. Замерено: сдвиг исходной геометрии ровно 0.000 мм. 0.2 секунды на скан.
2
десна у линии среза
НЕ РЕШАЕТСЯ
заделкой дыр
У A-01 замкнутых дыр ноль. Недостающая десна лежит ЗА открытой кромкой — контура для интерполяции нет. «Умный» дефолт тут начинает выдумывать челюсть.
3
крупная утрата
НЕ СТРОИТЬ.
Кейса не существует
A-09 — не «пол-челюсти». У него все 14 зубов и самая большая площадь из 20 сканов. Он рваный, а не обрезанный. Утраты такого класса в наших данных нет ни одной.

0 · Перепись неполноты по всем 20 боевым сканам

признакмедианахудшийкто
замкнутых дыр117A-09 нижняя
площадь дыр0.30 мм²85.6 мм²A-09 нижняя
длина открытой кромки2724 верш.4296A-09 верхняя
баланс зубной поверхности Л/П~90 %30.1 %A-09 верхняя
зубов на месте1414у ВСЕХ 20 сканов

Ни у одного скана нет отсутствующего зуба. Ни у одного нет утраченной половины челюсти. Ярус 3 в том виде, как он поставлен, не имеет ни одного представителя в наших данных.

1 · Ярус 1 — дыра на зубе

A-05 верхняя: 4 дыры, все касаются зуба (0.50 / 1.58 / 2.24 / 6.21 мм²). Сегодня прод их не трогает. Новая политика требует дорисовывать — с пометкой.

несущий факт

Заплаточные методы не могут сдвинуть скан — по построению. Они лишь добавляют вершины к существующим. Замерено на всех: сдвиг исходных вершин 0.000 мм, сдвиг зубной поверхности 0.000 мм. Это не «мы аккуратно настроили» — это структурная гарантия.

Противоположность — пересборочные методы (Poisson): они перестраивают всю поверхность, сдвигают скан на 0.220 мм и уничтожают вершины вместе с цветом и метками зубов. Для модели, по которой меряют и ставят находки, это дисквалификация.

A-05: дыра на зубе до и после заплатки
Ярус 1. Слева — сквозная дыра на зубе. В центре и справа — заплатка (бирюзовым помечено дорисованное). Исходные вершины скана не сдвинуты ни на микрон.

Таблица кандидатов · A-05 верхняя · CPU, 4 ядра

инструментлицензияоффлайнCPUвремя сдвиг сканавершины / меткивыдумано за кромкойкачество заплаты
прод (гейт зуба вкл)своё✅✅2.7 с 0.000 ммсохранены0дыры оставлены открытыми
прод (гейт снят)своё✅✅2.9 с 0.000 ммсохраненытолько дыра56 складок
libigl harmonic / biharmonicMPL-2✅✅3.0–3.3 с 0.000 ммсохраненытолько дыраскладок больше
MeshFix, кромка защищенаGPL-3✅✅ 0.2 с0.000 мм все 134 360 — 1:15.3 мм²8 складок
MeshFix, дефолт (nbe=0)GPL-3✅✅11 с 0.000 мм1:12340 мм², вылет 9 мм1233 складки
Poisson (Open3D)MIT✅✅102 с 0.220 ммУНИЧТОЖЕНЫ131 мм²гладко

Что из этого следует

  1. Лучший результат даёт MeshFix — но он GPL-3 и в проприетарный продукт не встраивается. Его качество идёт не от магии, а от триангуляции Лиепы (min-weight + refine) — это опубликованный алгоритм. Реализовать его самим (~150–200 строк, лицензия чистая): это снимает 56 складок нашей концентрической заплатки до 8.
  2. Разглаживание складок не лечит — проверено: 56 → 71, стало хуже. Корень в топологии заплаты, а не в гладкости. Менять надо триангуляцию, а не докручивать сглаживание.
  3. libigl сам по себе не спасает: на узких заплатах гармоническая мембрана гонит кольца друг сквозь друга. libigl — хороший финишер поверх хорошей триангуляции, не замена ей.

2 · Ярус 2 — десна у линии среза

Замер, который закрывает вопрос: у A-01 верхней — 0 замкнутых дыр при открытой кромке в 2669 вершин. Недостающая десна не является дырой: она лежит за кромкой, там, где сканер не достал. У заделки дыр там нет контура для интерполяции. Ни MeshFix, ни Poisson, ни libigl эту задачу не решают — они её физически не видят.

A-01: что делает 'затянуть все границы'
Ярус 2. Слева — честный скан. В центре и справа — что делает дефолт «затянуть все границы»: красным помечено выдуманное. Инструмент натянул мембрану через нёбо и нарисовал челюсть, которой нет.
методчто произошло на A-01 верхней
MeshFix, дефолт nbe=0затянул внешнюю кромку: 2913 мм² выдуманной поверхности, вылет до 14 мм. Нарисовал фальшивое нёбо.
Poisson131.5 мм² (2.69 % площади) за пределами скана, вылет 1.24 мм — «пузыри» экстраполяции.
MeshFix с защитой кромки0 новых вершин, 0 выдумано. Честно ничего не сделал — потому что делать нечего.
Это главная ловушка инструментария. nbe=0 («затянуть все границы») — дефолт, который стоит первым в любом туториале. На челюсти он означает «нарисуй несуществующую анатомию». Одна строка — защита самой длинной граничной петли — отделяет честный инструмент от генератора фальшивых челюстей.

Так достраивать десну или нет?

Честный ответ: достроить десну «правдоподобно» = выдумать её. Данных за кромкой нет и взяться им неоткуда. Три варианта, по убыванию честности:

  1. Не достраивать. Закрывать основанием — то, что прод уже делает: гладкое каменное основание, которое не притворяется десной. Это и есть индустриальный стандарт (exocad Model Creator, 3Shape — все делают параметрическую базу, не анатомию). дефолт
  2. Достраивать помеченным слоем — короткая экстраполяция кромки с пометкой «доработано» и кнопкой возврата. Риск: врач может принять это за реальную ткань.
  3. Learned-достройка десны — не существует. Вся дентал-линия ML достраивает ЗУБЫ; десну индустрия делает параметрикой. Единственная работа (Tian, 2022) — без кода, без весов, без данных.

3 · Ярус 3 / A-09 — кейс оказался не тем, чем считался

Бриф исходит из того, что у A-09 утрачена половина челюсти. Замер этого не подтверждает.

A-09 верхняяA-01 верхняя (норма)
зубов на месте1414
площадь поверхности5277 мм² — максимум из 204637 мм²
зубных вершин (сырые метки)88 27060 891
замкнутых дыр7 (+17 на нижней)0
открытая кромка4296 (в 1.6× длиннее)2669

У A-09 больше геометрии и больше размеченных зубных вершин, чем у здорового скана. Ничего не утрачено. Он рваный и дырявый, а не обрезанный.

A-09: геометрия не утрачена
A-09. В центре — чистая геометрия без меток: коронки на месте с обеих сторон. Синим справа — сторона, где наш собственный пайплайн срезал зубную поверхность в 3.3 раза.
честно, про наш хвост

Перекос зубной поверхности 3.3× возникает после нашего собственного пайплайна — его создаёт наш trim / apron_trim / demote_flap_teeth. В сырых метках перекос всего 1.66×, и почти не размечен только зуб 23 (493 вершины). Это наш дефект, а не дефект сканера — и он важнее любой дорисовки.

Что делать с Ярусом 3

Не строить реконструкцию. Строить детектор неполноты, который вешает плашку «скан неполный — рекомендуется пересканирование». Порог берётся из переписи и лежит в пустом промежутке:

Порог откалиброван на одном выбросе и одном сканере. Это заготовка, а не закон.

Если кейс крупной утраты всё же появится

путьоффлайн / CPUриск канонавердикт
Второй / старый скан того же пациента
регистрация Open3D по палатальным складкам
✅ / ✅управляемый: скан мог устареть Единственный честный путь. Это не генерация, а реальные данные пациента. Гейты: невязка в перекрытии, совпадение номеров зубов, подтверждение врача. Слой помечается «данные из скана от <дата>», не «реконструкция».
Зеркальная реконструкция✅ / ✅ высокий: переносит зубы сохранной стороны Только как беззубая подложка по решению врача. При односторонней агенезии (4–5 % населения) или после экстракции зеркало сфабрикует зуб, которого нет.
Генеративные меши (MeshDiffusion / PVD / LION)❌ GPU обязателен критический: мультимодальность Отклонить. «Несколько правдоподобных вариантов» — буквально машина выдумывания зубов. Валидировано лишь на утратах 5–20 %, не на половине дуги.
SSM (статистическая модель формы)✅ / ✅ средний, измеримый Тёмная лошадка, и она реальна: детерминированный результат + мера неуверенности. Но готовой открытой SSM верхней челюсти по IOS не существует. R&D-трек, не фича. Умеет работать детектором «зуб есть / зуба нет».

4 · Данные — главный гейт, и он закрыт

🔴 Teeth3DS: обучать нельзя. Подтверждено первоисточником.
Лицензия скачана и прочитана прямо с OSF (license.txt, osf.io/xctdy) — CC BY-NC-ND 4.0. NC запрещает обучение в интересах коммерческого продукта прямо; позиция самого Creative Commons («Using CC-licensed Works for AI Training», 2025) это подтверждает. Единственный путь — письменный запрос коммерческой лицензии у правообладателей (CRNS Sfax / Udini / Inria). Публичной оферты нет.

Открытых IOS-датасетов с коммерчески пригодной лицензией не существует вообще. Проверены все: Teeth3DS+ (NC-ND), 3Shape FDI-16 (NC-SA), ортодонтический Tsinghua (DUA запрещает коммерцию), Open-Full-Jaw (NC-SA, к тому же КТ-кость), MedShapeNet (наследует NC-ND). Зеркала лицензию не отмывают.

Единственная чистая стратегия — свои данные

Self-supervised «вырежи и восстанови» на своих полных сканах. Прямой прецедент: J Dent 2025 обучил достройку IOS на 314 сканах, симулируя дефекты удалением 5–20 % точек. Ground truth = наш же исходный меш. Лицензионно чисто на 100 %.

Качественный полный скан = полная дуга 7→7 без обрезки, десна захвачена апикально с запасом ≥5–8 мм (именно этот запас и есть ground truth для дорисовки края), нёбо для верхней, связный меш, сырой экспорт без постобработки сканера.

🔴 юридический гейт — требует заключения юриста, не нашего решения

Интраоральный скан — это биометрические персональные данные (GDPR ст. 9 — подтверждено профильной юр-работой J Forensic Leg Med 2023; 152-ФЗ ст. 11). По 3D-облаку зубов и нёбных складок человек идентифицируется — удаление ФИО из файла НЕ делает скан анонимным. Чтобы Игорь мог копить сканы для обучения, нужна отдельная форма согласия с явно названной целью «разработка и обучение ПО / ИИ».

5 · Канон честности — как гарантировать технически

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

  1. Инвариант «только добавление». Реконструкция имеет право лишь ДОБАВЛЯТЬ вершины. Ассерт: assert V_out[:n] == V_in. Любой метод, который пересобирает меш (Poisson), падает на нём автоматически. Это и есть «оригинал нетронут» — не обещание, а проверяемое равенство.
  2. Маска synthetic — флаг на вершину. Вьювер её красит («доработано»), кнопка возврата = выбросить грани с synthetic-вершинами; оригинал восстанавливается ровно, потому что инвариант 1 его сохранил. Сейчас такой маски в коде нет вообще — дорисованное неотличимо от сканированного. Эту дыру надо закрыть первой.
  3. Защита кромки. Самая длинная граничная петля не заделывается никогда. Без этой строки инструмент рисует 2913 мм² фальшивой челюсти.
  4. Инвариант числа зубов. Множество FDI present до реконструкции обязано совпасть с посчитанным после. Это механически запрещает «создать или убрать зуб».
  5. Находки — только с оригинала. Диагностика структурно стоит ДО слоя реконструкции и физически не видит дорисованную геометрию.
  6. Запрет измерений по синтетике. Инструмент измерения отказывается работать на synthetic-вершинах.

Инварианты 1, 3 и 4 — это ассерты в CI на всех 20 сканах. Дешёвые, и ловят регресс молча.

6 · Что делать, по приоритету

  1. Маска synthetic + кнопка возврата + инварианты 1/3/4. Без этого нельзя включать никакую дорисовку. Фундамент обоих ярусов.
  2. Ярус 1: заделка по Лиепе с чистой лицензией вместо концентрической заплатки. 56 складок → 8. Гейт зуба снимается, заплата помечается synthetic. 0.2 с на скан.
  3. Детектор неполноты → плашка «пересканировать». Единственное, что реально нужно A-09.
  4. Разобраться, почему наш пайплайн срезает 3.3× зубной поверхности на A-09.
  5. Сегментация (fine-tune) остаётся приоритетом №1 над всей реконструкцией. Прежний вывод проекта этим спайком подтверждён: A-09, который выглядел кейсом реконструкции, оказался кейсом разметки. Дорисовка лечит вид, fine-tune лечит смысл.
  6. Ярус 2 learned и Ярус 3 генеративный — не открывать. Строить не на чем.

Оговорки честности