Два брифа: функциональный фикс сегментации + исследовательский спайк по достройке модели.
Проблема. Лоскут проходил между всех прежних заборов: правила по десне его не касаются (он «зуб»), воротник дуги не достаёт (лежит внутри дуги), а правило отщепенцев щадит — он прирос к коронке (1.38 мм при пороге 1.5).
Решение. Снимаем компоненту, только если она плоский лист и набрала ≥2 независимых признака «не-зуб». Совпадение нескольких, не одного.
| признак | что меряет | порог |
|---|---|---|
detached | расстояние до объёмных тел зубов | > 1.0 мм |
hanging | доля периметра на открытой границе (висит на узком шве) | ≥ 0.30 |
above | доля вершин выше локального окклюзионного потолка | ≥ 0.15 |
oversized | грани / грани крупнейшей коронки | ≥ 0.50 |
Худший исход правила — оставить лоскут, а не потерять коронку.
Первая версия помечала «на проверку врачу» любой плоский класс без объёмного тела — и подняла тревогу на пяти валидных пациентах. Разбор показал: это реальные дистальные моляры (17, 26, 27, 36, 37), снятые с краю — видна жевательная площадка, стенок нет, поэтому они геометрически плоские. «Плоский» ≠ «не зуб».
Разделяет их не плоскость, а два замера — с чистым зазором с обеих сторон:
| реальные краевые моляры (7 шт.) | хлопья слизистости A-09 upper | |
|---|---|---|
above (выше коронок) | 0.00 у всех | 0.59 / 0.99 |
detach до коронок | 0.00 … 9.14 мм | 12.10 / 16.56 мм |
Порог 10.0 мм лежит в пустом промежутке между классами, а не подогнан к кейсу.
Класс без объёмного тела, набравший ≥2 сигнала, попадает в indeterminate_fdi, скан
получает ai_unreliable=1. Флаг ставится только вверх — снять может лишь человек.
Находки не переписаны: present_fdi на A-09 upper остался прежним (13 зубов,
включая 24 и 25). Зуб помечен как ненадёжный, но не объявлен отсутствующим.
| кейс | present до→после | снято | помечено врачу |
|---|---|---|---|
| A-01…A-08, A-10 18 сканов | 14→14 каждый | 0 | 0 |
| A-09 upper | 13→13 | 2 (78 и 16 граней — микромусор) | 24, 25 |
| A-09 lower | 14→14 | 2 (7100 и 1652 граней) | 0 |
Снятое на A-09 lower — ровно те «2 вторичные зубные компоненты», что оставались честным хвостом
предыдущего отчёта. Сработало: 7100 граней → detached + oversized;
1652 грани → above + hanging.
1. L1 уже закрыт — и не тем, что предполагалось. Дыр на наших сканах почти нет
(медиана 0.30 мм²), после заполнения их остаётся ноль. Цоколь упирался не в дыры, а в рваную
кромку — её вылечил trim_beyond_arch.
2. «Дорисовать челюсть» — это не hole-filling. Недостающая десна лежит за открытой внешней кромкой (1824–4296 рёбер на скан), а не в замкнутых дырах. Классика туда не достаёт по определению: нет контура для интерполяции.
3. L2 не нужен в том виде, в каком существует. Дентал-модели дополняют зубы — ровно то, что наш канон честности запрещает. Десну learned-методы почти не дополняют.
| метрика | значение |
|---|---|
| всего дыр | 43 |
| кромкой целиком в десне | 29 |
| кромка касается зуба | 14 |
| медиана площади дыры | 0.30 мм² |
| сумма площадей всех дыр | 155.5 мм² |
| сканов вообще без дыр | 6 из 20 |
| остаточных дыр после заполнения | 0 |
Суммарная площадь всех дыр на всём корпусе — полтора квадратных сантиметра. Упиралось не в них.
Реализовал без новых зависимостей — котангенс-лапласиан, Δ²f = 0 на патче с закреплённой кромкой
(то же, что libigl.harmonic(k=2)).
| скан | двугранный p95: текущий → biharmonic | средний сдвиг вершин |
|---|---|---|
| A-01 lower (1 дыра, 0.01 мм²) | 41.7° → 35.0° | 0.030 мм |
| A-05 upper (4 дыры, все у зубов) | 50.7° → 25.2° | 0.634 мм (max 0.845) |
Гладкость biharmonic действительно улучшает. Но на A-01 сдвиг 0.03 мм при дыре 0.01 мм² — косметика ниже порога видимости; на A-05 выигрыш куплен сдвигом зубной поверхности на 0.6–0.85 мм. Это запрещено: по такой поверхности нельзя ни мерить, ни ставить находку.
Вся дентал-линия learned-completion (MEM4TEETH, MPGLNet, TUCNet) дополняет зубы. Наш канон: дорисовка зубов и находок — запрещена; дорисовка мягких тканей — косметика при маркировке. Получается симметрично наоборот:
L2 умеет ровно то, что нам делать нельзя (зубы), и не умеет того, что нам можно (десну).
Это не «пока рано» — это несовпадение задач. Отсутствие работ по learned-дополнению десны не случайно: десна закрывается детерминированно, и индустрия (exocad, 3Shape, Shining3D) так и делает — локальное закрытие + параметрическая база, пришитая к кромке. Наш цоколь — тот же паттерн.
Прежний вывод проекта — «слабую сегментацию реальных сканов лечит только fine-tune» — остаётся в силе и важнее любой дорисовки. Дорисовка лечит вид, fine-tune лечит смысл.
hole-filling, libigl) не устанавливались — biharmonic
написан на наличном scipy; численно та же дискретизация, но «именно libigl» не проверялся.obj (20/20 md5) и хранимые метки не тронуты. Находки в БД не переписывались
(0 расхождений с бэкапом). Демо/Teeth3DS-кейсы не задеты. e2e-регрессия 6/6 PASS.
Отчёты: result-dental-flap-as-tooth-2026-07-09.md,
result-dental-jaw-completion-research-2026-07-09.md.
Данные: audit.json, hole_census.json.