Jaké jsou záludnosti při vývoji aplikace pro navrhování rovnátek podle 3D modelů čelistí?
Pro našeho klienta z oblasti ortodoncie vyvíjíme aplikaci, která pomůže správně vymodelovat rovnátka podle aktuálního postavení zubů pacientů.
Pro našeho klienta z oblasti ortodoncie vyvíjíme aplikaci, která pomůže správně vymodelovat rovnátka podle aktuálního postavení zubů pacientů. Jaké challenge jsme museli při vývoji pro iPadOS, MacOS i Windows vyřešit?
Vyvinout aplikaci pro ortodontisty, která bude mít svůj algoritmus k označení jednotlivých zubů na 3D modelu dásní, není úplně snadné. Chtěli jsme, aby aplikace byla přesná a hlavně urychlovala ortodontistům práci.
Co je hlavní gró aplikace?
Pro správnou funkci rovnátek je potřeba zajistit plynulý pohyb všech zubů z původního stavu čelisti až do úplného srovnání chrupu pacienta. Aplikace vytvoří timeline posunu zubů na základě jejich zadefinované velikosti v jednotlivých krocích od ortodontisty. Ten by měl posun zubů nastavit dostatečně velký, aby léčba netrvala příliš dlouho a pacient ušetřil peníze, ale zároveň jemný, aby čelist netrpěla přílišnými změnami.
Největší challenge - oddělit modely zubů
Každý model čelisti se skládá z jednolité části zahrnující všechny zuby i dáseň dohromady. Základní krok, který je potřeba vyřešit, je oddělit modely zubů, aby s nimi mohl zubní specialista pracovat a navrhnout jejich optimální pohyby k léčbě svého pacienta.
Jako triviální řešení problému se nabízí nechat uživatele bod po bodu označit všechny zuby. To je celkem jednoduché na implementaci, ale velmi nepohodlné na používání. Jak jistě každý ví, dospělý člověk má 32 zubů a vzhledem k poměrně detailnímu modelu z 3D skeneru, by bylo takové označování časově velmi náročné. Uživatelsky přívětivější se proto jeví vytvoření algoritmu, který sám zub najde a označí. Uživatel by pouze napomohl zadáním několika bodů.
Jaké postupy jsme zkoušeli?
1. Označení distálních a mesiálních bodů
První způsob, který jsme zkoušeli, bylo označit krajní body zubu, tzv. distální a mesiální bod. Tyto body sloužily jako protilehlé body kružnice, podle které se označil zbytek zubu. Již toto malé zlepšení značně zjednodušilo fázi označování zubů. Do skutečně pohodlného používání mělo však stále daleko. Přestože obvod zubů bývá zpravidla kulatý, není to ideální kruh a tak většinu bodů bylo potřeba stále ručně poupravit.
Při bližším pohledu na sken čelisti je vždy velmi patrná ostrá rýha na hranici mezi zubem a dásní. Toho lze využít k přesnějšímu umístění bodů. Nejprve je však potřeba najít tyto hranice a přenést je do struktury, se kterou bude moci program pracovat.
- ### Hledání konvexních a konkávních bodů
Každý bod 3D modelu jsme ohodnotili podle algoritmu, který počítá průměrnou vzdálenost všech sousedních bodů vůči ploše ve zkoumaném bodu a se stejným normálovým vektorem jako normálový vektor onoho bodu. Tato vzdálenost měla zachovanou orientaci (tedy byla kladná, když byl bod nad plochou a záporná, když pod plochou), takže pokud měl bod kladné ohodnocení, byl součástí konvexního úseku plochy 3D modelu a při záporném konkávního. Čím vyšší ohodnocení, tím ostřejší změna v ploše.
- ### Kombinace s body z kružnice
Nyní jsme mohli zkombinovat výběr bodů podle kružnice se zarovnáním k bodům s nejvyšším konvexním ohodnocením. Algoritmus začal trasoval body z definovaného distálního a mesiálního bodu. Z tohoto bodu vybral množinu sousedních bodů, ze kterých určil ten, který měl nejlepší ohodnocení a vzdaloval se co nejméně od vedoucí kružnice. Mezi těmito body našel spojitý kus a celý cyklus se opakoval dokud se nalezené cesty s distálního a mesiálního bodu nepropojili. Tím se také obvod uzavřel.
Funkční, ale…
Tato metoda konečně umožnila dostatečně rychlý výběr zubů pro uživatele, nebyla výpočetně náročná a případná chybná označení se snadno opravila. Algoritmus byl však velmi závislý na správném umístění počátečních bodů zubu. Pokud již jeden z nich ležel mimo konvexní hranici, či se hranice výrazně odchylovala od vedoucí kružnice, algoritmus nebyl schopný cestu hranice zubu najít a pro výběr se tak použil pouze výběr bodů po vedoucí kružnici. Takový případ naštěstí nenastával často a algoritmus byl tedy dostatečně účinný pro výběr zubů.
Přestože zpočátku algortimus nacházel zuby poměrně úspěšně, s přibývajícími dostupnými skeny čelistí se bohužel jeho chybovost postupně zvyšovala. Ani úprava a ladění konstant pro upřednostňování výběru podle konvexní oblasti nebo podle vedoucí křivky nedokázala úspěšnost nijak dramaticky zvýšit a tak bylo potřeba vymyslet jiný způsob, jak detekovat zub v 3D modelu.
2. Výběr pomocí plochy
Když jsme usoudili, že výběr pomocí ohraničení cesty na 3D modelu nedosahuje požadované úspěšnosti, rozhodli jsme se vyzkoušet výběr pomocí plochy. Uživatel v tomto případě zvolí pouze jeden bod, prostředek zubu. Algoritmus následně začne expandovat a vybírá body do množiny. Jestli jej vybere, určí podle ohodnocení z předchozího postupu. Pomocí toho se expanze vždy zastaví kolem hranice zubu a dásně. Není tak potřeba žádná vedoucí kružnice, protože výběr nastává vždy uvnitř zubu. Oblasti s konvexním ohodnocením ovšem v žádném případě neoznačují pouze hranici mezi zubem a dásní, obsahují také rýhy a nerovnosti na samotném zubu.
- ### Jak zamezit rychlému zastavení expanze
V prvních krocích tak může nastat, že se expanze zastaví příliš rychle, pokud by počáteční bod byl vložen do místa, kde je zub velmi nerovný. Pro zamezení tohoto případu je kolem počátečního bodu oblast, kde se přeskočí kontrola s ohodnocením a každý bod je automaticky vybrán. Uživatel velikost této oblasti vidí znázorněním poloprůhledné koule a má možnost upravit její velikost pomocí posuvníku. Díky tomu, že lidé mají většinou přibližně stejně velké zuby, bylo možné velikosti těchto oblastí předdefinovat podle typu aktuálně vybíraného zubu.
- ### Jak naopak zastavit expanzi včas
V posledních krocích se naopak může stát, že hraniční oblast zubu nebude v některých bodech příliš výrazná a nebudou mít dostatečné ohodnocení, aby expanzi, a tedy výběr zubu, zastavila. Pro tento případ má uživatel 3 předdefinované hodnoty, které mu pomohou určit práh, kdy bude bod zahrnut do vybrané expanze a kdy nikoli. Pokud by i přesto zvolený práh nestačil, expanze je omezena do pevné vzdálenosti 1 cm od počátku. Uživatel během každého výběru vidí barevný náhled, která oblast vyhovuje, je vybraná a která ne. Stejně tak vidí, jak se úprava těchto dvou hodnot projeví.
3. Zahlazení výběru
Konečným krokem je zahlazení výběru. Jak již bylo řečeno, oblast ohodnocení není nijak perfektní. Ve výběru tak může vzniknout mnoho míst bez vybraných bodů (děr ve výběru) a hraniční oblast se může vyskytovat několik bodů od skutečné hranice zubu a dásně. Pro odstranění děr tak vybíráme cestu z aktuálně nalezené hranice a upravíme ji tak, aby její 2D projekce představovala konvexní polygon. A nakonec jsou body této cesty zarovnány k nejbližšímu bodu s maximálním ohodnocením.
Po aplikování všech těchto dodatečných akcí již výsledná cesta velmi věrně obepisuje hranici mezi zubem a dásní. Díky snadnému a pochopitelnému nastavení dvou hodnot od uživatele je úspěšnost tohoto nového způsobu mnohonásobně vyšší, než byla v první verzi s kružnicí. Vhodné výchozí hodnoty zároveň vedou k úspěšnému výsledku již bez potřeby úpravy a použití tohoto způsobu je tak pro uživatele rychlejší.
Závěrem… stálo to za to
Problém hledání hranice zubu a dásně je jedním z mnoha problémů, který v naší aplikaci řešíme. Nelze však říct, že pokud bychom začali rovnou s druhým postupem, který se ve finále ukázal jako vhodnější, byl by vývoj efektivnější. Mnoho řešení staví na předchozích zkušenostech a nebylo tomu jinak ani v našem případě.