Szakdolgozat Petri Zsolt 2020 [625810]

Debreceni Egyetem
Informatikai Kar

Komputergrafika és Képfeldolgozás Tanszék
Koponya röntgen elemzése
Témavezető :
Dr. Szeghalmy Szilvia
adjunktus
Szerző :
Petri Zsolt József
Mérnökinformatik us
Nappali tagozat
Debrecen, 2020

2

Tartalom jegyzék
1. Bevezető ………………………….. ………………………….. ………………………….. ………………………….. ………. 3
1.1. Dolgozat felépítése ………………………….. ………………………….. ………………………….. ……………… 4
2. Kefalometriai elemzés ………………………….. ………………………….. ………………………….. ………………… 5
3. Objektum detektálásra és osztályozásra szolgáló modellek áttekintése ………………………….. …….. 9
3.1. CNN (Convolutional Neural Network): ………………………….. ………………………….. ……………….. 9
3.2. R-CNN ………………………….. ………………………….. ………………………….. ………………………….. …. 11
3.3. Fast R -CNN ………………………….. ………………………….. ………………………….. ……………………….. 12
3.4. Faster R -CNN ………………………….. ………………………….. ………………………….. ……………………. 13
3.5. R-FCN ………………………….. ………………………….. ………………………….. ………………………….. ….. 14
3.6. SSD ………………………….. ………………………….. ………………………….. ………………………….. ……… 17
4. Alkalmazott modell részletes ismertetése (Faster R -CNN Inception V2) ………………………….. …… 19
4.1. Faster R -CNN ………………………….. ………………………….. ………………………….. ……………………. 19
4.2. Inception V2 ………………………….. ………………………….. ………………………….. …………………….. 21
5. Program bemutatása ………………………….. ………………………….. ………………………….. ………………… 22
5.1. Programkörnyezet előkészítése: ………………………….. ………………………….. ……………………… 24
5.1.1. TensorFlow Object Detection API telepítése ………………………….. ………………………….. 24
5.1.2. A Protobufs fájlok átfordítása .py fájlokká ………………………….. ………………………….. …. 25
5.1.3. Szükséges környezeti változók hozzáadása ………………………….. ………………………….. … 26
5.2. Képek annotálása ………………………….. ………………………….. ………………………….. ……………… 26
5.3. TFRekordok generálása: ………………………….. ………………………….. ………………………….. …….. 30
5.4. Tanulás konfigurálása: ………………………….. ………………………….. ………………………….. ……….. 31
5.5. Modell betanítása ………………………….. ………………………….. ………………………….. …………….. 32
5.6. Pontok detektálása és kirajzolása ………………………….. ………………………….. ……………………. 33
5.7. Eredmények ………………………….. ………………………….. ………………………….. …………………….. 37
6. Összefoglaló ………………………….. ………………………….. ………………………….. ………………………….. .. 39
Irodalomjegyzék ………………………….. ………………………….. ………………………….. ………………………….. …. 42

3

1. Bevezető
Már több évtizede zajlik egy folyamat, melynek célja az, hogy az időigényes, monoton orvosi
feladatokat számítógépes alkalmazások váltsák ki. Az utóbbi években ez a folyamat új
lendületet kapott a mélytanuló eljárások fejlődése nyomán . A fejlődése elősegített e az orvosi
jellegű információk hatékonyabb, automatizált feldolgozását vagy akár a gyorsabb diagnózis
felállítását. Ez a tudomány egyenesen arányosan fejlődött a számitástechnika fejlődésével, és
számos figyelemreméltó eredményeket értek el a segítségével. A dolgozatom keretin belül az
orvostudomány koponyaröntgen számítógépes elemzés té makörének egy részét szeretném
körbejárni. A koponyaröntgen elemzés végrehajtásához az elkészített programnak bizonyos
pontokat automatikusan fel kell tudnia ismernie a képen . Az ehhez szükséges elméleti és
gyakorlati tudást szeretném bemutatni.
A témaválasztásom azért esett a koponyaröntgen elemzésre, mert szerettem volna betekintést
nyerni az objektum detektálási módszerekbe . Érdekesnek és hasznosnak találtam ennek a
technológiá nak az elsajátítását , ugyanis egyre szélesebb körben találkozhatunk vele a
mindennapokba n. A témaválasztásomat az is indokolja még, hogy az objektumfelismerő
alkalmazások legnép szerűbb programozási nyelve jelenleg a Python , amely egy egyr e
népszerűbb, fellendülőben lévő programozási nyelv , ezért fontosnak tartottam ennek a
programozási nyelvnek az elsajátítását. Szerettem volna mélyebben belelátni az
objektumfelismerés módszereibe. Motivált az is, hogy a szakorvosok számára valós gyakorlat i
haszna is lehet a koponyapontok detektálás ának a röntgenképeken. A szakdolgozati
témaválasztásom szakterületét illetően egyé rtelműen befolyásolt az érdeklődés a programozás
iránt, és inspirált a tanulmányaim során megszerzett ismeretanyag.
Természetesen nem törekedhettem a teljességre. Részben a téma terjedelme és nagysága,
részben pedig a jelenlegi tapasztalatom és tudásom behatárolta a bemutatás terjedelmét. Mégis
remélem, hogy ez a dolgozat az érdeklődő olvasó számára egyfajta összefoglalást,
iránymuta tást adhat.

4
1.1. Dolgozat felépítése
A következő fejez etében ismertetem a kafelometriai elemzés alapjait, ami a koponyaméréstan
eszköze . Bemutatom a koponyaméréstan alkalmazási területeit, illetve a dolgozatomban
felhasznált pontok és szögek kiszámítási módját is.
Ezt követően néhány objektum detektálásra és osztályozásra szolgáló modellt szeretnék
bemutatni , melyek segítségével detektálhatunk objektumokat a képeken vagy osztályozhatjuk
azokat. Ebben a fejezetben a következő modelleket ismertetem : convolutional n eural network
(CNN), region -based convolutional neural network (R -CNN), fast region -based convolutional
neural network (Fast R -CNN), Faster Region -based convolutional neural network (Faster R –
CNN), region -based fully connected neural network (R -FCN) és a s ingle -shot detector (SSD).
Fontosnak tarto ttam azonban, hogy átfogó képet alkossak a det ektálási modellekről és
viszonylag könnyen érthető en leírjam a működésük et.
Negyedik fejezetben részletezem a dolgozathoz mellékelt programban felhasznált detektálási
modell elméleti alapjait, a Faster R -CNN és az Inception V2 modulját. A program megírása
során ezt a modellt találtam elég egyszerűnek és hatékonynak is, ezért szerettem volna
részletesebben külön fejezetben bemutatni.
Az ötödik és egyben legtartalmasabb fejezet alkotja a dolgozathoz elkészült program gyakorlati
megvalósítását, továbbá az elért eredményeket is tartalmazza. Szerettem volna úgy bemutatni
ezt a részt, hogy mindenki számára érthető maradjon és akár hasznára is váljon az olvasónak.
Végül az utolsó fejezetben összegeztem a dol gozat célját, módszereket, eredményeket és
próbált am e gy átfogó képet alkotni a dolgozatomról.

5
2. Kefalometriai elemzés
A dolgozatom ezen részében ismertetni szeretném a kefalometriai elemzés alapjait, annak
érdekében, hogy érthetőbb legyen a dolgozathoz elkészült program felhasználási területe. Az
elkészít ett program azonosítja a koponya egyes pontjait, és a szakorvosok segítségükkel
különböző kefalometiriai elemzéseket -analíziseket tudnak végezni.
Ha a koponyán szeretnénk méréseket, arányokat számolni segítségül hívhatjuk k efalometriát,
amit koponyamérést annak is nevezünk. Több orvosi területen is használják a k efalometriai
méréseket, de a legelterjedtebb felhasználási módját a fogszabályzásban találhatjuk meg. A
mérések elvégzéséhez röntgenfelvételt készítenek szemből, vagy oldalirányból. A
röntgenfelvéte leket lehetőleg mindig ugyanúgy készítik (ugyanaz a szög, irány stb), annak
érdekében, hogy a mérések könnyen összehasonlíthatóak legyenek egymással. A k efalometriai
elemzés alkalmas kezelési tervek készítésére, fogszabál yzó kezelések eredményei
vizsgálatá hoz vagy akár plasztikai műtétek eredményei ellenőrzésére is [W12].
A kézi megközelítés a legrégibb és legszélesebb körben alkalmazott módszer. Egy átlátszó lapot
helyeznek a röntgenfelvétel fölé, és a lapon pontokat jelö lnek meg (2 -1 ábra). Ezen pontok
egymáshoz viszonyított távolságát és szögeit mérik meg.

2-1. ábra. A: Hagyományos kefalometriai mérés kivitelezése pauszpapír segítségével, B: Digitális
teleröntgenen végezhető szoftveres kefalometriai mérés. [C12]

6
A kefalometriai elemzés elvégzéséhez szükségünk van rögzített referenciapontok felvételére a
koponyaröntgen felvételeken. Később ezekhez a referenciapontokhoz tudjuk viszonyítani a
képle teket. A referenciapontok elhelyezése unalmas és időigényes fela dat, amely tapasztalt
fogszabályozó orvosok esetén is kör ülbelül 10 –15 percig is eltarthat.
A dolgozatban teleröntgen felvételek álltak rendelkezésemre , és ezek en detektál tam a pontokat
és elemez tem azokat . A teleröntgen felvétel egy olyan típusú röntgenf elvételt képvisel, amely
során a sugárforrás és a röntgenfilm is a szájüregen kívül helyezkedik el. A röntgenképen a
teljes koponyáról készül felvétel, és a röntgensugár viszonylag nagy távols ágból érkezik a
röntgenfilmre többi röntgenfelvétel típushoz kép est. Ezeket a felvételeket két nagy típusra
sorolhatjuk annak függvényében, hogy a röntgensugár milyen irányból éri a koponyát:
oldalirányú és frontális [C12] . Számomra az oldalirányú telerönt genfelvételek lesznek az
érdekesek, mivel ilyen felvételek állta k rendelkezésemre.
Kezdetben csak analóg képkészítés (2-1. ábra A) létezett, azonban a technológia fejlődésével
elérhetővé vált a digitális felvételkészítés is. Mivel a digitális felvételkész ítésnek (2-1. ábra)
számos előnye van napjainkban egyre jobban e lterjedt a használata. Előnyök közé sorolhatj uk
a számottevően kisebb sugárterhelést, gyors felvételkészítést, könnyebb kezelhetőséget és
tárolást.
A megfelelő diagnosztikai mérésekhez 19 refe renciapontot határozhatunk meg a koponyán . A
szakorvosok által m eghatározott pontok közé egyeneseket húzhatunk (2-2 ábra) .

2-1. táblázat. Referenciapontok által bezárt szögek osztályozása [W14]

7
A mellékelt táblázatban (2 -1 táblázat) láthatjuk, hogy az egyenesek által bezárt szögek alapján
milyen kefalometriai eredményeket kaphatunk, és besorolhatjuk őket három különböző
kategóriá ba. A „ type 1 ” jelenti a normális küszöbértékeket (referenciát) , a „type 2 ” és „ type 3 ”
a normálistól eltérő étéket jelöl. Az egyenesek által bezárt szögeket nyolc különböző szempont
szerint osztályozhatjuk (2 -1. táblázat): ANB, SNB, SNA, ODI, APDI, FHI, F MA és MW.
Az osztályozáshoz szükséges szögeket az alábbi módon kaphatjuk meg [W14]:
• ANB: a z 5 számmal jelölt referenciapont, 2 -es referenci apont és a 6 -os számmal jelölt
referenciapont közötti szög alkotja (2-2. ábra).
• SNB: a z 1 számmal jelölt referenciapont, a 2-es referenci apont és a 6 -os számmal jelölt
referencia pont közötti szög ből kapjuk meg (2-2 ábra).
• SNA: az 1 számmal jelölt referenciap ont, a 2-es referenciapont és a 5 -os számmal jelölt
referencia pont közötti szög ( 2-2 ábra).
• FHI: két változó hányadosából kapjuk meg: PFH = 1-es pont és 10 -es pont távolsága
és AFH = 2-es pont és 8 -as pont távolsága. Tehát: 𝐹𝐻𝐼 = 𝑃𝐹𝐻
𝐴𝐹𝐻
• FMA : a 1,2-es egyenesek által bezárt szög és 10,9 -ess egyenesek által bezárt szög
• MW: a 12-es és 11 -es pont közötti távolság adja meg, amit az alábbi egyenlet alapján
kaphatjuk meg: √(𝑥_12 − 𝑥_11)2+(𝑦_12 − 𝑦_11)2 , ha x_12 > x_11 , akkor pozitív
az MW , különben negatív.

8

2-2. ábra. Referenciapontok a koponyán és az elemzéshez szükséges egyenesek és szögek [W14]
• ODI: az 5-ös és 6 -os pont közötti egyenes és a 8 -as és 10 -es pont közötti egyenes által
bezárt szög, illetve a 17 -es és 18 -as pont közötti egyenes és 4-es és 3-es pont közötti
egyenes által bezárt szögek számtani összege.
• APDI: itt meghatározhatunk három változót: p, q és v az ADPI értéket pedig a három
változó összege adja. Tehát: 𝐴𝐷𝑃𝐼 =𝑝+𝑞+𝑣
o p = a 3,4-es pontok közötti egyenes és 2 ,7-es egyenesek által bezárt szög
o q = a 2,7-es egyenesek által bezárt szög és 5,6 -os egyenesek által bezárt szög
o v = a 4,3-as egyenesek által bezárt szög és 17,8 -as egyenesek által bezárt szög
Példá ul az 𝐴𝐷𝑃𝐼 = 79° ha (88° + (−6°) + (−3°) = 79°) ami a normális
tartományba esik (2 -1. táblázat)

9
3. Objektum detektálás ra és osztályozásra szolgáló
modellek áttekintése
Az objektumok detektálása és osztályozása egy olyan feladat a számítógépes látásban , amely
magában foglalja egy vagy több objektum jelenlétének észlelését , helyének és típusának
azonosítását egy adott képen [C1]. A Deep Learning fejlődésének köszönhetően , minden évben
új algoritmusok , modellek jelennek meg, melyek gyakran felülmúlják az előzőket. Manapság
rengeteg előre betanított objektumdetektál ómodell létezik, p éldául a YOLO, RCNN, Fast
RCNN, Faster RCNN, R -FCN, SSD , hogy csak az ismertebbek közül említsek néhányat, ezért
viszonylag kis erőfeszítéssel készíthetünk olya n programokat, me lyek képesek bizonyos
objektumokat megtalálni a képeken vagy videókon. A következőkben néhány ilyen modellt
szeretnék röviden bemutatni [C1].
3.1. CNN (Convolutional Neural Network) :
A konvolúciós neurális hálózatok (Convolutional Neural Networ k, röviden CNN va gy
ConvNets ) ma már az alapvető építőelemét képezik a számítógépes látás i feladatok jelentős
részének . A CNN egy olyan kép és videófeldolgozásra kifejlesztett mélytanuló hálózat, amely
több képfeldolgozási területre is jelentő s hatással volt. Az utóbbi évt izedben széles körben
elterjedté vált a használata.

3-1. ábra. CNN felépítése [C2]

10

A CNN alapvetően arra alkalmas, hogy egy képet (illetve az azon szereplő objektumot)
osztály okba sorolja , viszont arra nem, hogy az objektumok helyét is meghatározza a képen . A
CNN három féle fő rétegből tevődik össze ( 3-1. ábra) : konvolúciós réteg, mintavételezési réteg
és a t eljesen kapcsolt réteg.
A konvolúciós és az összevonási vagy más néven mintavételezési (pooling) réte gek együttesen
felelnek azért, hogy a képből egy olyan jellemzővektort (tulajdonságvektort) állítsunk elő, mely
alapján a végrehajtható a képen szereplő objektum osztály okba sorolása. A konvolúciós réteg
elnevezés a bemeneti réteg különböző szűrőkkel törté nő konvolválásából ered. Ezt az eljárást
úgy képzelhetjük el, mintha egy kisebb kép, jellemzően egy 3 ×3-as, 5 ×5-ös vagy 7 ×7-es
„lebegne” végig a bemeneti kép fele tt. Minden egyes pontban a kiskép és az éppen alá eső
képpontokat felhasználva kapjuk meg az e redményt, mely egy skalár: a skaláris szorzata a kép
adott részének, és a szűrőnek [C2]. Az összes lehetséges helyen kiszámolva a konvolúciót
megkapunk egy tulajd onságtérképet. A tulajdonságtérképeket egymásra illesztjük , akárcsak az
RGB csatornákat. Példá ul egy 32 ×32×3-as kép, 6 d arab 5×5-ös szűrő kimenete 28 ×28×6
kiterjedésű . A konvolúciós hálózatokban egy réteg bemenetét az előző réteg kimente adja (3-2.
ábra).

3-2. ábra. Konvolúciós hálózat [C2]
A konvolú ció egy lineáris művelet , viszont a tulajdonságtérképen érdemes alkalmaz ni
valamilyen nemlinearitás műveletet is, ami növeli a modell leíróerejét. A CNN ezt egy RELU
elnevezésű mellékréteggel teszi meg. Az összevonási réteg (Pooling Layer), a
tulajdonságté rkép méretének csökkentésére hivatott. A választott mintavételező eljárást minden
tulajdonságtérképre külön -külön hajtjuk végre . A paraméterek számának csökkentése mellett a
cél lehet a szélsőértéke és a fontosnak tűnő paraméterek megtartása , de ez választ ás kérdése .
Továbbá a szomszédos pontok átlagértékükkel történő helyettesítése szintén népszerű módszer.

11
Teljesen kapcsolt rétegben (fully connected, FC) a bemeneti térfogat minden eleme össze van
kötve a z FC réteg minden neuronjával, mint egy klasszikus többrétegű hálózatban (MLP -ben).
Tipikusan utolsó rétegként szokás használni a CNN -ben: a konvolúciós rétegek a jellemzők
kinyerését végzik, addig az FC rétegek pedig az osztályozást.
Végül megemlíteném a regularizáció folyamatát . Az objektumok felismerésé hez gyakran van
szükség komplex modellekre, de fontos megtalálni az egyensúlyt. Ha növeljük a hálózat
komplexitását és a szabad paraméterekhez képest túl kevés a tanítóadat, akkor hálózat
általánosító képessége egy idő után nem javul, sőt el is kezd romlan i. Ennek megakadályozására
több módszer is alkalmazható, például: a háló méretének csökkentése, korai leállítás, a súlyok
L1 vagy L2 normájú regularizációja vagy a dropo ut módszer [C2].
3.2. R-CNN
Az R -CNN (Region -based Convolutional Neural Network) a CNN egy t ovábbfejl esztése, ez
már az objektum felismerésén túl annak helyzetét is képes megadni a képen. Ezen felül egy
képen több objektumot is képes detektálni. Nevé hez illően az R-CNN régiókra bontja a képet
és ezekre a kisebb régiókra alkalmazza a CNN hálózatot [C3].
Működése három egyszerű lépésből áll:
• Első lépésben az R -CNN régiókat jelöl ki a képen egy „szelektív keresés” algoritmus
segítségével (3-3. ábra legalsó réteg e). A régiók mérete eltérő lehet, ezért a további
lépés előtt a konvolúciós hálózat által várt mére tre hozzuk azokat.
• Minden ilyen régióra futtatunk egy konvolúciós neurális hálózatot (3-3. ábra).
• A konvolúciós neurális hálózat eredményeit átadja egy SVM osztályozónak, ami
osztályozza a régiót és ha egy objektum beleesik a régióba egy keretet h úz az
objektum köré. (3-3. ábra)

12

3-3. ábra. R -CNN rendszer [W11]
Összefoglalva, elsőnek javaslunk régiókat, aztán kinyerjük a jellemzőket, végül osztályozzuk
ezen régiókat a jellemzők alapján. Lényegében kép részletek osztályozásból alakítottunk ki egy
objektum detektálási modellt [ W11 ].
A legnagyobb probléma ezzel a mód szerrel a sebesség. Mivel az összes kijelölt régióra
alkalmazni kell a CNN hálózatot , nagyon időigényessé válik a detektálás. Sajnos a modell
kezdetleges mivoltából adódóan viszonylag lassú a tanulási és detektálási ideje is a PASCAL
VOC képadatbázison . Ezt a problémát próbálta kiküszöbölni a Fast R -CNN, amit a
következőkben fogok taglalni.
3.3. Fast R -CNN
Az R -CNN közvetlen leszármazottja a Fast -R-CNN volt. A Fast R -CNN sok szempontból
hasonlított az elődjéhez, de a detektálási sebességét két fő kiegészítéssel javította [C4]:
• A különböző régiók helyett az egész képre alkalmazzuk a CNN hálózatot és csak ezt
követően alkalmazzuk a z ajánlott régiókra bon tást. Ezzel elérjük, hogy a CNN -t nem
kell régiónként futtatnunk, amely képektől függően több ezer futtatást is jelenthet, elég
egyszer , így jelentősen növelhető a sebesség (3-4. ábra) .

13
• Kicseréljük a korábban használt SVM osztályozókat egy softmax rétegre. A softmax
réteg egy mélytanuló osztályozást tesz lehetővé, ami kiegészíti a neurális hálózat
ahelyett, hogy egy új modellt hozzon létre (3-4. ábra) .
Amint az ábrán láthatjuk ( 3-4. ábra) most nem az eredeti kép alapján generálunk régió
javaslatokat, hanem a képre alkalmazott konvolúciós neurális hálózat alapján. Ennek
eredményeként csak egy etlen CNN -t kell betanítanunk a teljes képre.

3-4. ábra. Fast R -CNN rendszer felépítése [W11]
Most csak egy neurális hálóz atunk van a tanitásra, szemben egy neurális hálóval és sok SVM –
el szemben . A Fast R -CNN sokkal jobban teljesített a sebesség szempontjából a PASCAL VOC
képadatbázison . A tanulmány szerzőinek a mérése szerint a tanitási idő tizedannyi és a
detektálási idő akár huszadannyi időt vesz igénybe, mint az R -CNN modell a PASCAL VOC
adatbázi son. A következő fejezetben a Fast R -CNN javítását szeretném ismertetni. A
dolgozathoz szük séges programhoz is ezt a modellt használtam fel, nevezetesen a Faster R –
CNN.
3.4. Faster R -CNN
A Faster R -CNN jelenleg a legelterjedtebb módja a deep learning alapú objektum
detektálásnak. Ha már megértettük a CNN, R -CNN és a Fast R -CNN működését nem lesz nehéz
dolgunk a Faster R -CNN megértésével sem. A Faster R -CNN fő előrelépése az volt, hogy a
lassú s zelektív keresési algoritmust helyettesítsük egy gyors neurá lis hálózattal [C5].

14
Ebben a módszerben először alkalmaz unk egyetlen CNN -t a képre, akárcsak a Fast R -CNN –
ben, és létrehozunk egy tulajdonságtérképet. Pontosabban, lecserélte a szelektív keresési
algoritmust egy regionális javaslathálózatra, RPN -re. Ezt a modellt egy külön fejezetben
részletesen is taglalni fogom a későbbiekben. A következő fejezetben a r égióalapú teljes
konvolúciós hálót fogom bemutatni.
3.5. R-FCN
Emlékezzünk, hogyan javult a Fast R -CNN az eredeti észlelési sebességén azáltal, hogy
egyetlen CNN számítást végzett az összes régiójavaslat között. Hasonló gondolkozás motiválta
az R-FCN megalkotá sát is: sebesség növelése a megosztott számítás ok maximalizálásával . Az
R-FCN, vagy régió alapú teljes konvolúciós hálózat, a számítások 100% -át osztja meg minden
egyes kimeneten. Teljesen konvolúciós jellegéből adódóan egyedülálló probléma merült fel a
modell tervezésében [C6].
Egyrészt, amikor egy objektumot osztályozunk s zeretnénk , ha invariáns lenne az eljárásunk az
objektum helyére : független ül attól, hogy a macska hol jelenik meg a képen, osztályozza azt
macskaként. Másrészről az objektum észleléseko r meg akarjuk tudni a hely ét: ha a macska a
bal felső sarokban van , akkor a bal felső sarokba szeretnénk köré keretet rajzolni .
Tehát, ha megpróbáljuk megosztani a konvolúciós számítások 100% -át kompromisszumot kell
találni a két cél kitűzése során. Az R -FCN megoldása a pozíció -érzékeny pontszámtérkép.
Minden pozíció -érzékeny pontszámtérkép egy relatív helyzetét képviseli egy -egy
objektumo sztálynak. Például egy pontszámtérkép akkor aktiválódhat, ha a macsk át a jobb felső
részen észleli. Egy másik pontszám térkép pedig akkor aktiválódhat, ha az autó bal alsó részét
látja. Amint aktiválódott egy ilyen pontszámtérkép megadja a pontot [C7].
Alap vetően ezek a pontozási térképek konvolúciós jellegű térképek, amelyeket arra képeztek,
hogy felismerjék az egyes obje ktumok bizonyos részeit.

15

3-5. ábra. R -FCN Rendszer felépítése [C7]

Az R -FCN működése hét lépésből áll:
• A bemeneti képen futtat egyetlen CNN -t az egész képre , akárcsak a Fast R -CNN .
• Hozzáad egy teljes konvolú ciós réteget a z említett „ pozíció -érzékeny pontszámtérkép ”
pontszámbankjának létrehozásához. Itt 𝑘2(𝐶+1) pontszámtérképnek kell lennie, ahol
𝑘2 képviseli az objektum felosztására szolgáló relatív pozíciók számát és a C + 1
képviseli az osztályok s zámát plusz a hátteret (1 -5. ábra).
• Futtat egy teljes konvolúciós régiójavaslati hálózatot (RPN -t) az érdekelt régiók
létrehozása érdekében , ezeket RoIk-nak nevezzük .
• Minden RoI -t megosztja ugyanazokra a 𝑘2 tárolókra vagy alrégiókra mint a
pontszámtérk épet.
• Minden tárolóra ellenőrzi a pontszámbankot, hogy észlelje megegyezik -e az aktuális
pozíció valamely objektum pozíciójával. Például , ha a bal felső tárolónál vagyunk,
megfogjuk a pontszámtérképet , ami megfelel egy objektum bal felső sarkának és
átlago ljuk ezeket az értékeket a RoI régióban. Ezt a folyamatot minden osztályra
megismételjük.
• Miután minden 𝑘2 tároló rendelkezik objektum -egyezési értékkel osztály onként ,
átlagoljuk a tárolókat, annak érdekében, hogy egyetlen értéket kapjunk meg minden
osztályra.
• Osztályozzuk a RoI -t egy softmax algoritmussal a fennmaradó C + 1 dimenziós vektor
felett (3-5. ábra) .

16
A magyarázat és ábra ellenére is kissé zavaros lehet a modell bonyolult működése. Az R -FCN
működése sokkal érthetőbbé válik, ha vizualizálni is tudjuk, ezért szeretnék egy példát is
bemutatni [C7], ahol a gyakorlatban detektálunk a modell segítségével egy gyereket (3-6. ábra) .

3-6. ábra.R -FCN megjelenítése (k × k = 3 × 3) személy kategória [C7]
Egysz erűen fogalmazva: az R -FCN megvizsgálja az egyes régiók javaslatát, felos ztja azokat
alrégiókra, és iterál az alrégiók között feltéve a kérdést: „úgy néz ki, mint egy csecsemő kép
bal felső sarka? ”, „úgy néz ki, mint egy gyerek kép középpontja? ” stb. Ezt i smétli az összes
lehetséges osztálynál. Ha elegendő alrégióból azt kapjuk , hogy „igen, ez a rész megegyezik egy
gyerek kép részével” (3-6. ábra) akkor a RoI gyerekként osztályozza minden osztály fölött a
softmax elvégzése után.

3-7. ábra. Megjelenítés, ha egy Ro i nem fed i át megfelelően az objektumot [C7]
Ezzel az összeállítással az R -FCN képes egyidejűleg címezni a helyvarianciát különféle
objektumrégiók javaslásával és a helybéli invarianci át azáltal, hogy m inden régiójavaslatnál
hivatkozik ugyanannak a pontszámbanknak a pontszámtérképéhez. A pontszámtérképeknek
meg kell tanulniuk, ha egy macska van a képen macskának osztályozza attól függetlenül, a
macska megjelenési helyétől a képen. A legjobb az egészben, hogy teljesen konvolúciós, azaz
az összes számítást megosztja az egész hálózattal.
Eredményként sokkal gyorsabb lesz az R -FCN a Faster R -CNN -hez képest hasonló pontosságot
elérve , hátrányaként említeném a sokkal komplexebb a működés ét.

17
3.6. SSD
Az utolsó modell , amit be szeretnék mutatni a Single -Shot Detector (SSD). Az R-FCN -hez
hasonlóan ez is óriási sebességnövekedést eredményez a Faster R -CNN -hez képest, de ezt
jelentősen eltérő módon teszi.
Az eddig ismertetett modellek két külön lépésben hajtották végre a régiójavaslatot és a régiók
osztályozását. Először egy region ális javaslathálózatot használtak az érdekelt régiók
létrehozására , aztán az osztályozáshoz egy pozícióérzékeny konvolúciós réteget vagy egy
teljesen -összekapcsolt réteget. Az SSD ezt a két lépés t egyszerre végzi, ezért „single -shot” az
elnevezése. Egyidej űleg megjósolja a határoló dobozokat és az osztályt , amivel feldolgozza a
képet [C8].
Az SSD a következő lépéseket hajtja végre:
• A képet konvolúciós rétegek sorozatán viszi át, így többféle tulaj donságtérképet állít elő
különböző méretekben (például 10 ×10, aztán 6 ×6, aztán 3 ×3 stb.)
• Minden egyes területre minden hozzátartozó tulajdonságtérképhez egy 3 ×3-as
konvolúciós szűrőt használ, hogy értékelje egy kisebb részét az alapértelmezett határoló
dobozoknak. Ezek az alapértelmezett határolódobozok alapvetően m egegyeznek a
Faster R -CNN határolódobozaival.
• Minden doboz egyidejűleg megjósolja a határoló doboz eltolását és az osztály
valószínűségeit .
• Tanítás közben párosítja az alapvető igazságdobozokat a becsült dobozokkal az IoU
[W10] alapján . A legjobban megbecs ült doboz és a z olyan doboz ok, amelyeknek az IoU
igazsága nagyobb mint 0 ,5 pozitívnak lesz nek annotálva.
Az előzőleg tárgyalt modelleknél a regionális javaslathálózat biztosította, hogy mindent , amit
megpróbáltunk osztályozni minimális valószínűséggel egy objektum. Az SSD -nél azonban
kihagyjuk ezt a szűrési lépést. A kép minden egyes pozícióját osztályozzuk és határoló
dobozokat rajzolunk, több különböző alakzat és különböző méret felhasználásáva l. Ennek
eredményeként sokkal több határolódobozt generálunk , mint a többi modellné l és szinte
mindegyik negatív példa ezek közül.

18

3-8. ábra. SSD architektúra [C8]
Ez egy egyensúlyhiányt okoz, kijavításához az SSD két dolgot tesz. Először is egy „non –
maximum suppression ”-t használ [C9] az erősen egymást átfedő dobozok egyetlen dobozzá
csoportosításához (3-8. ábra ). Más szavakkal , ha négy doboz hasonló alakú, méretű és ugyanazt
a kutyát tartalmaz za, a legmagasabb valószínűségű doboz t megtartja és a többit pedig elvet i.
Másodszor a modell egy „ hard negative mining ” elnevezésű technikát [C10] használ, hogy
egyensúlyozza az osztályokat tanulás közben. A „hard negative mining” a negatív példák közül
csak legnagyobb tanulási veszteséggel bírókat használja fel a tanulás minden egyes
ismétlésekor. Az SSD a negatív és pozitív 3:1 arányát tartja fenn.

3-9. ábra. SSD működés közben [C8]
Mint fentebb említettem, vannak olyan „extra funkciós rétegek ” a végén, amelyek
méretarányosan csökkennek. Ezek a változó méretű tulajdonságtérképek segítenek különböző
méretű objektumok eltalálásában (3-9. ábra) . A kisebb tulajdonságtérképeken (p éldául 4 ×4-es)
mindegy ik cella lefedi a kép nagyobb részét, lehetővé t éve számukra a nagyobb tárgyak
felismerését is. A régiójavaslat és az osztályozás egyidejűleg történik: adott p objektum osztály,
minden határoló doboz egy (4 + p) dimenziós vektorhoz van társítva, amely négy dobozeltolás

19
koordinátáját és p osztály valószí nűségét adja eredményül. Az utolsó lépésben újból használjuk
a „softmax ”-t az objektum osztályozására.
Végül azt mondhatjuk, hogy az SSD nem különbözik annyira az előző modellektől. Egyszerűen
kihagyja a régiójavaslati lépést, helyette figyelembe vesz mind en egyes határolódobozt minden
részén a képnek az osztályozással egyidejűleg. Mivel az SSD mindent egy lövésben csinál, a z
eddigi modell ek közül a leggyorsabb, és még mindig viszonylag jó pontossággal dol gozik
[W1] .
4. Alkalmazott modell részletes ismertetése (Faster
R-CNN Inception V2 )
A Faster R -CNN modellt szerettem volna részletesebben bemutatni, mivel a dolgozathoz
szükséges programot is ennek a modellnek a segítségével hoztam létre. Ahogyan korábban
említettem ennek a modellnek is a konvolúciós neurális hálózat az őse [C5]. A Faster R -CNN
használatával és az „ Inception V2 ” modul optimalizációjával viszonylag jó sebességet tudunk
elérni magas pontosság mellett. Elsőként a Faste r R-CNN -t fogom részletezni, második részben
pedig az Inception V2 modulról ejtek néhán y szót.
4.1. Faster R -CNN
A Faster R -CNN bevezeti a regionális javaslathálózatot (RPN -t), mely a CNN által kinyert
jellemzők alapján , előre meghatározott régiókról becsüli meg, hogy érdekes régió -e [C5]. Az
RPN a CNN utolsó konvolúciós rétege után helyez kedik el (4-2 ábra) .
Három fő lépésből áll a regionális javaslathálózat működése:
• CNN utolsó rétegét egy 3×3 méretű csúszó ablakkal alacsonyabb dimenzióra (256-d-re)
csökkenti (4 -1. ábra).
• Az abl ak minden lehetséges pozíciója esetén több lehetséges régiót generál k rögzített
arányú rögzítődoboz alapján (alapértelmezett határolódobozok alapján).
• Minden egyes régiójavaslat az ob jektum pontszá mát és 4k koordinát át tartalmaz az adott
régióra vonatkozóan, melyből ismert a dobozok középpontja, magassága és szélessége
(4-1. ábra) is . Az objektum pontszám a soft -max valószínűség ét képviseli, és

20
meghatározásra kerül, hogy a doboz átadja -e vagy sem a régió javaslatát . A döntést egy
bizonyos küszöbérték befolyásolja (ha az objektum pontszámértéke meghalad egy
bizonyos értéket) [C11] .

4-1. ábra. RPN felépítése [C11]
Más szavakkal, megvizsgáljuk az utolsó tulajdonságtérképünk minden helyét, és körülbelül k
különböző mezőt vesszünk figyelembe: magas doboz, széles doboz, nagy doboz st b. Mindegyik
doboz esetében megkapjuk , hogy szerinte tartalmaz -e egy objektumot, és a doboz koordinátái t.
Amint megvannak a régió kra vonatkozó javaslataink, továbbiakban Fast R -CNN -ként működik
tovább. Tehát, a Faster R -CNN -t megkapjuk az RPN és Fast R -CNN ötvözetéből.

21

4-2. ábra. Faster R-CNN felépítése [C11]
4.2. Inception V2
Az Inception V2 modul ok célja a konvolúciós hálózat bonyolultságának redukálása , melyet a
hálózat mélységének csökkentésével ér el, igaz, cs erében a hálózat szélessége növekedni fog .
Három különböző típusú modullal rende lkezik: A, B és C (4-3. ábra). Az A modul az 5×5-ös
konvolúció helyett, több 3×3-as konvolúció t, és kis méretű, dimenziócsökkentésre használt
1×1-es maszkokat alkalmazva éri el közel ugyanazt a hatást , amely csökkenti az
erőforrásigényt .
A B modul (4-3. ábra) az n × n méretű szűrő t bontja fel 1 × n és n × 1 méretű konvolúci ókra.
Ez a módszer 33% -kal olcsóbbnak bizonyult, mint az egyszeri 3×3 -as konvolúció. A szélesség
növekedésé vel pedig jobban járunk, mint a mélyebb hálózattal, mert kevesebb a ve szteség . Ez
a kibővített modul az ábrán látható C modul (4 -3. ábra).

22

4-3. ábra. Inception V2 moduljai [C11]
5. Program bemutatása
A program e lkészítéséhez Windows 10 operációs rendszert, Python 3.6.8 programozási nyelvet
és a Tensorflow 1.15 keretrendszert választottam , ugyanis a feladathoz ez t a programnyelv et és
könyvtárat találtam a legalkalmasabbnak.
A TensorFlow a Google által fejlesztett mesterséges intelligenci a egy programkönyvtára . Ezen
programkönyvtár segítségével például fejleszthetünk konvolúciós mély neurális hálóz atokat
(Convolutional Deep Neural Networks ). A TensorFlow rendkívül rugalmas és egyre bővülő
algoritmusok megvalósítására alkalmas p éldául használhatjuk a számítógépes látásban,
megjelenítésben, robotikában, beszédfelismerésben és orvosi felhasználásban is.
A TensorFlow számos bevált detektálási modellt kínál . Ezen modelleket a TensorFlow github
[W1] oldalról érhetjük el (5-5-1. ábra ). Láthatjuk a modell detektálási sebességét (Speed [ms]),
és detektálás pontosságát (COCO mAP ), hogy megkönnyítse a modellre eső választásunkat .
Például a SSD-MobileNet modell architektúrája lehetővé teszi a gyorsabb detektálást, viszont
alacsonyabb pontosságot biztosít . Mivel számomra nem volt fontos a detektálás sebessége, azaz
nem élő videóképen kell ett detektáljam a koponya pontjait, így egy olyan modellt választottam ,
ami pontosabb eredményt ígér, viszont alacsonyabb detektálási sebessége t eredményez.

23

5-1. ábra. A tensorflow oldaláról letölthető, objektumfelismeréshez betaníto tt modellek listája
Végül a Faster -RCNN -Inception -V2 modellre esett a választásom, ami viszonylag jó sebességet
és pontosságot is képes biztosítani , egyszerűbb műk ödés mellett .
Ahhoz, hogy a program képes legyen felismerni pontokat a koponya röntgen képeken , a
konvolúciós neurális hálózatot be kell tanítanunk a rendelkezésünkre álló képadatbázison.
Számos ilyen képadatbázis letölthető az internetről, viszont jelen esetben egy saját
képadatbázist kellett létrehoznom.
Ha elérhető az eszközünkön Nvidia videókár tya CUDA magokkal, akkor ajánlott a
TensorFlow -GPU használata. A TensorFlow -GPU használatával elérhe tővé válik extra
számítási teljesítmény az osztályozó betanítása alatt. Általánosságba n elmondható, hogy a
TensorFlow -GPU jelentősen csökkenti a modell taní tásához szükséges időt a „ sima ”
TensorFlow -val összevetve , még egy gyengébb teljesítményű kártyával is elé rhető , hogy
nyolcadára csökkenjen a szükséges betanulási idő. Esetemben nem volt elérhető a videókártyás
gyorsítás, ezért csak egy Intel i5 -6260U proc esszor állt rendelkezésre a tanulási folyamathoz.

24
5.1. Programkörnyezet előkészítése:
A detektáló programunk elkészítéséhez első lépésben elő kell készítenünk a megfelelő
környezetet program számára. Ez a környezet elsősorban a Python programozási nyelv és
Object Detection API telepítéséből, illetve az API működéséhez szükséges csomagok
telepítéséből áll. Végül a megfelelő környezeti változók at hozzá kell adnunk a Windows
operációs rendszerhez. Ebben a fejezetben ezeket a lépéseket szeretném bemutatni kicsit
részletesebben.
5.1.1. TensorFlow Object Detection API telepítése
A TensorFlow objektum detektálási API -ja kifejleszt ésének célja az objektum detektálási
modellek implementálásának megkönnyítése , ezen felül arra is lehetőséget ad, hogy új
modelleket tanítsunk be a segítségével .
Az objektum detektálási API használatához első körbe n le kell töltenünk a TensorFlow
modellek github oldaláról [ W2]. Megfelelő működéséhez szük ség van még néhány függőséget
kielégíteni . A függőségek kielégítését elvégezhetjük a pip csomagkez elő segítségével, am ely a
Python programozási nyelv alapértelmezett csomagkezelője . Ezzel a csomagkezelővel
telepíthetünk a Python programozási nyelvhez különböző kiegészítő csomagokat.
Az alábbi Python csomagokat szükséges feltelepíteni az objektum detekt áló API működéséhez :
• Cython [W3]: a Python programozási nyelv legnagyobb hátránya a lassúság, ez
javítható a Cython csomag használatával, a mivel a Python kódunkat szinte C program
sebességűre gyorsíthatjuk. Használatával a gyengén típusos Python nyelvben is
használhatunk előre deklarált típusokat, ami lehetőv é teszi a fordító számára , hogy egy
nagyon hatékony C kódot generáljon a Python kódunkból.
• Contextlib2 [W4]: lehetővé teszi a Python standard könyvtárában megtalálható
Contextlib modul használatát korá bbi Python verziók esetén is. Ennek a könyvtár
segítségével az erőforrásokat is hatékonyabban kezelhetjük (például a fájlkezelést).
• Pillow [W5]: hozzáadja a képfeldolgozási képességeket a Python interpreterhez. A
modul használatával megnyithatunk, módosíth atunk, vagy lementhetünk képeket a
Python program kódunkon belül. Számos képformátumot támogat , ezen felül l ehetőség

25
van új fájldekódolók létrehozására is, így kibővíthetjük a hozzáférhető fájlformátumok
támogatását.
• Lxml [W6]: lehetővé teszi a html és xml fájlok hatékony feldolgozását, ezt úgy éri el,
hogy C könyvtárakat használ fel ötvözve a Python programozási nyelv egyszerűségével,
felhasználva a korábban említett Cython csomagot.
• Jupyter [W7]: segítségével egyszerűen ellenőrizhetjük, hogy az objektum det ektáló
API-t megfelelően telepítettük fel. Lehetőséget nyit a Jupiter Notebook webes
alkalmazás használatához.
• Matplotlib [W8]: egy átfogó csomag statikus, animált vagy akár interaktív ábrák
készítéséhez a Python nyelvben. Például a keresett pontokat kiraj zolhatjuk a
koponyaröntgen képekre.
5.1.2. A Protobufs fájlok átfordítása .py fájlokká
A következő lépés a Protobuf fájlok fordítása. A TensorFlow programkönyvtár ezeket a fájlokat
a modell és a tanulás i paramétere k a konfigurálására használ ja. Az objektum detekt áló API
„.proto ” fájlokat használ. Ezeket a fájlokat „.py” fájlok ká kell átfordítani, az objektum detektáló
API megfelelő működése érdekében.
A Google biztosít egy Protobuf Buffers elnevezésű programot, ami elvégzi ezt a feladatot
számunkra. Ezt a program ot letölthe tjük a Protocol Buffers github honlap járól. A letöltést
követően ki kell csomagolni a models/research elérési útvonalú mappába . Ezt a mappát a
korábban letöltött és kicsomagolt Object Detection API könyvtárszerkezetében találhatjuk meg .
Ezt a pr ogramot minden „.proto ” fájlra le kell futtatni . Ennek a folyamatnak a felgyorsítása
érdekében elkészítettem a „use_protobuf.py” elnevezésű rövid kis szkriptet , amely elvégzi ezt
a feladatot (5-2 ábra). Parancssori argumentumként adhatjuk meg az elérési út vonalakat.

5-2. ábra. use_protobuf.py elnevezésű protobuf fájlokat ford ító szkript

26
5.1.3. Szükséges környezeti változók hozzáadása
Létrehozzuk egy PYTHONPATH elnevezésű környezeti változót, ami a \models,
\models \research, és \models \research \slim elérés i útvonalú könyvtárakra mutat. A környezeti
változók beállítását a „set PYTHONPATH” parancs használatával hajthatjuk végre, megadva
argumentumként a korábban említett elérési útvonalakat. Ellenőrizni is tudjuk a környezeti
változók megfelelő beállítását az „echo %PYTHONPATH%” parancs kiadásával. Ha
visszakapjuk a beállított elérési útvonalakat, sikeres volt a környezeti változók hozzáadása.
Végezetül kiadjuk a „python setup.py build” és „python setup.py install” paranc sokat (mindezt
a \models \research mappában ), ezzel befejeztük az Objektum Detektáló API telepítését.
5.2. Képek annotálása
Ebben az alfejezetben a képek annotálásának módját szeretném bemutatni, ami alapján tanulni
fog a programunk . A tanulás folyamán pedig egy modellt épít fel, amely segítségével detektálni
tudja az általunk keresett pontokat. . Ehhez két új könyvtárat hoztam létre: egy „training” és egy
„test” elnevezésű al könyv tárat a \models \research \object_detection \images könyvtáron belül. A
megfelelő haté konyság érdekében a „training ” könyvtárba helye ztem a képe k 80%-át, míg a
„test” könyvtárba a maradék , azaz a képek 20%-át. Tehát 150 képet használtam fel a tanításhoz ,
és 30 képet a tes ztelés hez.
Némi problémát okozott a képek formátuma. Mivel a képek .bmp formátumba voltak
elérhetőek, rá kel lett jönnöm, hogy a tanulási program nem kezeli megfelelően a bmp
formátumú k épeket és a tanulás inicializálásánál hiba léphet fel . Feltételezéseim szerint , a
tanulási folyamat inicializálása során a bmp képek mérete miatt memória túlcsordulás jö tt létre.
A probléma legegyszerűbb kiküszöbölésére a képek jpg formátumba történő konvert álását
találtam. A képek konvertálásához az ingyenesen elérhető XnConvert [W8] elnevezésű
programot használtam (5-4 ábra) , am ivel egyszerűen átkonvertálhatjuk képeinket akár
csoportosan is, azaz nem kell minden képet egyenként konvertálni .
A következő képeken ( 5-3. ábra) láthatjuk az XnConvert programot [W8] használat közben, és
az általam alkalmazott beállításait ( 5-4. ábra). Konvertálás után a képek átlagos mérete 13 Mb –
ról lecsökkent 500 Kb -ra. Ez a hatalmas méret csökkenés jelentő sen megkönnyítette a munka
további részét.

27
A képek konvertál ása után a következő részben részletezni fogom a képek annotál ásának
megvalósítását a gyakorlatban . A ké pek annotálása az egyik legfontosabb lépés az objektum
detektáló programunk számára , mivel ezek alapján tud majd a későbbiekben tanulni a
programunk.

5-3. ábra. XnConvert konvertáló program felhasználói fel ülete

28

5-4. ábra. XnConvert konvertáló program beállításai
A képek annotálását egy „ LabelImg ” elnevezésű programmal [W9] tudjuk elvégezni, grafikus
felületen, bekeretezve és elnevezve azt a szakorvosok számára érdekes ponto k helyét (5-5.
ábra) , amelyeket később szeretnénk, hogy felismerjen a programunk.

5-5. ábra. LabelImg program működés közben

29
Ez a program megfigyeléseim szerint egy xml fájlt fog generálni minde n képhez, melyek
tartalmazzák a kép elérési útvonalát, a kép nevét, felbontását és az általunk érdekesnek tartott
területek koordinátáit . Eze ket a területeket négy változó (5-6. ábra) határozza meg : xmin, ymin,
xmax és ymax , amelyek egy négyszöget alkotnak az ábrán látható módon (5 -6. ábra) . Itt
láthatjuk, hogy két pont koordinátáját tárolj uk el az xml fájlba (a négyszög bal felső és jobb
alsó pontját.

5-6. ábra. Annotá lt terület
A dolgozatom keretein belül , a szakorvosok számára érdekes pontokat két szakorvos határozta
meg manuálisan . Eze k a pontok txt fájlok formájában álltak rendelkezésemre , minden ilyen fájl
19 pontot tartalmaz. Később iekben ezeket a pontoka t szeretnénk automatikusan felismertetni a
program unk segítségével . Egy adott képhez tartozó txt fájl tartalmazza soronként egy -egy
konkrét pont adatait pixel koordinátá i szerint (szélesség, magasság) , így a 19 sor meghatározza
az összes keresett pontot .
A képek manuális annotálás át a „LabelImg ” program mal nagyon időigényesnek és
pontatlan nak tartottam a meglehetősen nagy mennyiségű kép és a 19 detektálni k ívánt pont
miatt . Arra a megoldásra jutottam, hogy a „LabelImg ” program által generált xml fájl alapján
készítek egy Python programot („coordinate_to_xm l.py”), ami automatikusan elvégzi a képek
annotálását.
Ez a program beolvassa a koordinátákat tartalmazó txt fájlok at és egy olyan xml fájlt generál,
akárcsak a korábban említett „ LabelImg ” program. Mivel a txt fájlokban kon krét pontok álltak
rendelkezés emre, de az annotáláshoz négyszögeket szükséges meghatározni, a pontok alapján
számítottam ki a megfelelő négyszögeke t (1. kódrészlet).
Az alábbi programrészben láthatjuk, hogyan számítottam ki konkrét pontokból ( x – szélesség,
y – magasság) négyszögeket. xmin és ymin változókat úgy kaptam meg, hogy x és y-ból
kivontam 50 -et, míg xmax és ymax -nál hozzáadtam. Így egy 100×100 pixel méretű négyzetet
kaptam.

30

1. kódrészlet. négyszögek kiszámítása
5.3. TFRekordok generálása:
A következő lé pésben a képannotáció során generált xml fájlokból TFRecod fájlokat készítünk ,
ez lesz az objektum detektáló program bemenete. Hogy ezt végrehajtsuk szükség van két
programra: „ xml_to_csv .py” és „ generate_tfrecord .py”. Ha a z elsőként említett programot
lefuttatjuk , akkor a korábban generált xml fájlokat összefoglalja egyetlen cvs fájlba
táblázatszerűen . A második program pedig elkészíti a „cvs” fájlból a tfrekord fájlokat.
A „generate_tfrecord .py” scripten belül meg kell adnunk, hogy egyes elnevezett pontok hoz
milyen számértéket adjon vissza a program (2. kódrészlet) . Jelen esetben a szöveges számozást
használtam, amelyek esetén egyszerűen a tényleges szám ot adtam vissza.

2. kódrészlet. annotált nevek számmá alakítása
Mindkét k épeket tartalmazó könyvtárunkra („training”, „test”) alkalmazn unk kell a
„generate_tfrecord .py” programot megadva számára parancssori argumentumként a c sv fájlunk
elérési útvonalát ( –csv_input=), a képek elérési útvonalát (–image_dir=) és a kimeneti
TFRe kord fájlnevét ( –output_ path=). Ha ezt mindkét könyvtárunkra alkalmaz tuk végeztünk a
TFrekord fájlok generálásával és létrejött a „training.record” és a „test.record” fájlunk.

31
5.4. Tanulás konfigurálása:
A tanulás konfigurálása előtt egy úgynevezett címketérké pet hozunk l étre (3. kódrészlet) . Ez a
címket érkép megmutatja a tanuló program számára az objektumokat, amelyeket az osztályok
nevei és az azonos ítószámai határoznak meg.

3. kódrészlet. Címketérkép
A „training” könyvtáran bel ül létrehoztam egy „labelmap .pbtxt ” fájlt, amiben a képen látható
módon helyeztem el az adatokat . Fontos, hogy egy névhez ugyanaz az azonosítószám társuljon,
mint a korábban generált TFRecord fájlok esetében (3. kódrészlet).
Miután ezzel is végezt ünk, a kö vetkező lépés létrehoz ni a tanulás számára használt
konfigurációs fájlt. Ebben a konfigurációs fájlban határozzuk meg, hogy a programunk milyen
modellt és milyen paramétereket használjon a tanuláshoz.
Mivel a választott modellem, melyet használni fogok a Faster R -CNN Inception V2 modell,
egy már létező konfigurációs mintával kezdtem el a konfigur álását. Ezt a mintát
(„faster_rcnn_inception_v2_pets.config ”) megtalálhatjuk a z Object Detetion API „sam ple”
alkönyvtár ába. Első lépésként átmásol juk a „training” k önyvtárba, és itt kezd jük el
megszerkeszteni. Ebben a konfigurációs fájlban az alábbi dolgokat módosítottam :
• Detektálni kívánt osztályok számát: az én feladatomban 19 -re változtattam
• Faster -RCNN -Inception -V2-COCO modell elérési útvonalát
• 123-adik sorban: a train.record elérési útvonalát

32
• 135-ödik sorban: a test.recod elérési útvonalát
• 125 és 137 -edik sorban: a labelmap.pbtxt útvonalát
• És végül a „test” könyvtában lévő képek számát a 130 -adik s orban
5.5. Modell betanítása
Ha mindent összeállítottunk és bekonfigur áltunk megfelelően , megkezdődhet a tanulási
folyamat, melynek folyamán elkészül egy modell , amit az objektumok detektálására
használhatunk fel a képe ken. Ehhez a folyamathoz a „train.py” nevezetű programot futtatjuk le
(5-7. ábra) , parancssori argumentumké nt megadva a „train” könyvtárunkat és a modell sablont,
melyet az előző lépésben konfiguráltunk be.

5-7. ábra. Tanulási folyama t
Ha mindent jól állítottunk be a TensorFlow inicializálni fogja a tanulási folya matot. Ez az
inicializálás körülbelül 30 másodpercet vesz igénybe, ezt követően a képen (5-7. ábra ) látható
módon elindul a tanulási folyamat.
A tanulás minden lépésében jelen tést kapunk a veszteségről (5-7. ábra) . Ez a veszteség minél
alacsonyabb annál ta nultabb, „okosabb” modellt kapunk eredményül. Az okosabb modell azt
jelenti, hogy pontosabban fogja felismerni a szakorvosok által érdekesnek talált pontokat . Ez a
tanulási folyamat az én számítógépemmel több napot is igénybe vett, míg elérte a 30 ezer
tanulási lépést.

33
Egy úgynevezett „tensorboard” program segítségével grafikus statisztikát is láthatunk a
veszteség alakulásáról. Ezt parancssorból tudjuk elindít ani a „ tensorboard –logdir=training ”
parancs kiadásával. Itt láthatjuk webes felületen a vesztesé g alakulását a tanulási lépések
függvényében (5-8. ábra).

5-8. ábra. Tanulási veszteség alakulása . x tengely : tanulási lépések száma, y tengely : veszteség
alakulása
5.6. Pontok detektálása és kirajzolása
Amint a t anulás i folyamat elérte a megfelelő fejlettségi szintet, és eléggé lecsökkent a tanulási
veszteség (8. ábra) , a tanult modellből egy következtetési gráfot tudunk meghatározni . Ezt a
következtetési gráfot fogjuk felhasználni, a modell futtatásához. Ennek az elvégzéséhez, a
„training” könyvtárban meg kell keresnünk a legmagasabb elmentett lépésszámú modell fájlt
(„model.ckpt -XXX”).
Ahhoz, hogy kinyerjük a következtetési gráfot, „export_inference_graph.py ” elnevezésű
Python programot használtam fel, parancssor i argumentumként megadva a bekonfigurált
modell mintát, a legmagasabb lépésszámú tanult modell fájlt és a kimeneti könyvtárat, ahova
el szeretnénk menteni a következtetési gráfot, ebben az esetben az „ inference_graph ”
könyvtár at.
A pontok detektálásához az „Object_detection_image .py” programot használtam fel. Itt a
programkódban megadtam annak a következtetési gráf nak a könyvtárát , amit használni
szeretnénk a detektáláshoz, és a képfájl nevét , amin szeretnénk felismertetni a pontokat. A
program lefutása utá n a kimeneten egy „DETECTED.jpg ” képfájlt fogunk kapni, amin a
felismert pontok négyzet ekkel lesz nek megjelölve, a pont elnevezésével és pontosságával
százalékban (5-9. ábra).

34

5-9. ábra. Detektált területek
A pontosság érdekében én pontokat szerettem volna kinyerni, nem négyzeteket, a detektáló
programból ki kellett nyerjem a detektált négyszögek koordinátáit. Ehhez a
„\object_detection \utils\visualization_utils.py ” elérési útvonalú programkódban hajtottam
végre módisításokat, amit felhasznál az objektum detektáló programunk, így miután lefuttattuk
az objektum detektáló kódunkat, létre fog hozni egy „Box_coordinates .txt” szöveges fájlt .
Ebben a szöveges fájlban kiment ésre került a detektált területek elnevezés ei az első 19 sorban,
és az ezt követő 19 sorban pedig a négyszögek koordinátáit normalizál t formátumban .
A képek és a szakorvosok által meghatározott pontok mellé egy „angle.py” programot (5-12.
ábra) is mellékeltek . Ez a program analizálni képes a dete ktált pontokat és eredményeket

35
biztosít a szakorvosok számára. A jelenleg i formában kinyert koordinátáink at viszont még nem
képes feldolgozni ez a program . Ennek az az oka, hogy n em olyan formában nyertük ki a
koordinátákat, ahogyan azt a szakorvosok is me ghatározták .
Annak érdekében, hogy az általam kinyert koordinátá kat is a szakorvosok által meghatározott
formátumba tudjam átalakítani, elkészítettem a „Boxes_to_pixel_points.py” elnevez ésű
programot, ami elvégzi ezt a feladatot . Az említett program felha sználásával a normalizált
koordinátákat átalakítottam pixeles koordinátákká. A következő lépésben kiszámítottam a
négyszögek középpontjait, annak érdekében, hogy a pontok pontosan a detektált négyzetek
középpontjában helyezkedjenek el.

5-10. ábra. Detektált terület átlója
A négyzet középpontját a detektált terület két pont közötti átló felezőpontjával határozható meg
(5-10. ábra) . Tekintve, hogy a bal felső ( xmin , ymin ) és a jobb alsó pont ( xmax , ymax )
koordin átája ismert, a középpont koordinátái triviálisan számíthatók:

𝑥= 𝑥𝑚𝑖𝑛 +𝑥𝑚𝑎𝑥
2,

𝑦=𝑦𝑚𝑖𝑛 +𝑦𝑚𝑎𝑥
2.

A detektált terület középpontja kiszámítása után, de a fájlba mentése előtt a kimentett pontok
sorrendjét rendezni is kellett oly an formában, hogy később felhasználható legyen az „angle.py”
program számára. Előzőleg nem csak a detektált pontok koordinátáit, hanem a detektált
négyszögek elnevezéseit is kimentettem a „box_coordinates.txt ” fájlba , annak érdekében, hogy
ezen elnevezések alap ján rendezni lehessen a detektált pontokat a megfelelő sorrendbe .
Végezetül a normalizált koordináták at átalakítot tam pixeles formátumba , és megfelelő
sorrendbe kerültek kimentésre a z „Object_points .txt” szöveges fájlba . Ez már felhasználható a

36
detektált p ontok ra vetített egyenesek egymáshoz viszonyított szögei mérésére elkészített
„angle.py” program számára .
A detektált pontok láthatóvá tételének érdekében készítettem egy „draw_points.py ” elnevezésű
Python programot. Ez a program beolvassa a z „Object_point s.txt” fájl tartalmát soronként és a
koordinátákat felhasználva felrajzo lja, és beszám ozza a kopony án a detektált pontokat ( 5-11.
ábra).

5-11. ábra. Detektált pontok számozva
Végezetül , hogy megkapjuk a pont okra állított egyenesek által bezárt szög eket lefuttatjuk az
„angle.py” elnevezésű programot . Ez a program analizálja a koponya pontjait, meghúzza a
referenciaegyeneseket és az egyenesek segítségével referencia szögeket számol, ami alapján
kiértékeli a sza korvosok számára érdekes eredményeket (5 -12. ábra).

37

5-12. ábra. Referenciaszögek eredményei
5.7. Eredmények
A következőkben az elért eredményeket szeretném ismertetni. Az általam detektált
koponyapontok és a szako rvosok által megjelölt pontok eltérése alapján vetettem össze az
eredmén yeket. Annak érdekében, hogy mérni tudjam a pontok közötti eltéréseket szüksége snek
találtam létrehozni egy „results.py” elnevezésű eredmény -kiértékelő programot.
A kiértékelő program a következő lépéseket hajtja végre:
a) Megnyitja a detektált koordin átákat tartalmazó „Object_points.txt” fájlt és a parancssori
argumentumként megadott általunk tetszőlegesen választott koordinátákat tartalmazó
szöveges fájlt (az aktuális koponyához tartozó szakorvosok által megadott pontokat).
b) Soronként beolvassa a koordinátákat mindkét szöveges fájlból és kiszámítja a két pont
közötti távolságot képpontban a 𝑡á𝑣𝑜𝑙𝑠 á𝑔= √(𝑥2−𝑥1)2+(𝑦2−𝑦1)2 képlet
segítségével.
c) A megkapott távolságokat az ak tuális képre összeadja és elosztja a pontok számá val
ezzel megkapva az átlagos eltérési távolságot képpontban. A képfájl nevét és az

38
eredményül kapott átlagos eltérés i távolságot kimenti az „avarage_distances.txt” fájlba
kettősponttal elválasztva, hogy kés őbb könnyen felhasználható legyen Excel számára.
A kiértékelés folyamata közben felmerült egy olyan probléma, h ogy a detektáló program nem
minden esetben ismerte fel az összes keresett pontot , ez hibát okozott a kiértékelő programban.
A program működési el ve szerint soronként ugyanazt a z elnevezésű pontot hasonlította össze
egymással. Amennyiben egy pont kiesett a detektált pontok közül, az összehasonlítás egy sorral
elcsúszott egymáshoz képest (detektált pont – szakorvos által megjelölt pont) , tehát nem
ugyanazon pontokat has onlította össze , és így hibás eredményeket kaptam.
A hiba kiküszöbölésére a következő megoldásra jutottam: a detektáló programban a
koordináták mentésekor , egy hiányzó pont észrevételekor a koordináta helyére egy „ None ”
mezőt mentettem a pont átugrása hel yett. Végezetül a kiértékelő programban is átírtam, ha egy
mezőt „ None ” értékként olvas be, akkor csökkenti egyel a „detected_points ” változót, és ezt a
sort kihagyja a kiértékelésből . A javítások bevezetésével kevesebb detektált pont e setén is
elvégezhető az eredmények kiérté kelésére a program.
Annak érdekében, hogy automatikusan nagyobb mennyiségű képen is egyszerűen elvégezhető
legyen a kiértékelés, készítettem egy egyszerű batch szkriptet (4. kódrészlet). Ez a rövid script
automatiku san elvégzi az összes műveletet amire szükségünk van a kiértékeléshez.
Pontosabban megadjuk, az ellenőrizni kívánt képhalmazt, amelyre futtatni szeretnénk a
kiértékelést, és a script lefuttatja egyenként a képekre a detektálást, a koordináták kim entését
és ponttá alakítását, és végül a kiértékelő program ot futtatja az átlagos eltérési távolság
kinyerése érdekében.

4. kódrészlet. Kiértékelés automatizálása („result.bat”)
Lefuttattam a kiértékelő programot a tanulási f olyamat al att nem használt koponyaképeken . Az
eredménye ket betöltöttem Excelbe és készítettem egy grafikont segítségével ( 5-13. ábra),
látható, hogy általánosságban 10 és 30 képpont közzé tehető az eltérések átlagos száma egy
képen belül , míg a 100 képre v ett átlag 15.1 képpont , 3.55 szórással . Minden pont a grafikonon
egy képet jelöl .

39

5-13. ábra. Átlagos tévedés képpontban . x tengely : képek darabszáma, y tengely : átlagos eltérés
6. Összefoglal ó
A szakdolgozatom elsődleges célja néhány népszerűbb objektum detektálási módszer
bemutatása , illetve is mertetni az általam használt megoldást a koponyaröntgen pontok
detektálására . Ezekkel a mód szerekkel különböző objektumokat lehet automatikusan detektálni
a koponyaröntgen képeken . A módszer implementálásához a Google által fejlesztett
TensorFlow keretrendszer t és Python programozási nyelve t használtam fel . Végül
összeve tettem az általam detektált pontokat a szakorvosok által bejelölt pontokkal.
Az elkészült program, amely segítségév el automatikusan det ektálni tudjuk a koponya bizonyos
pontjait a koponyaméréstan tudománya számára lehet hasznos . A szak orvosok mu nkáját
gyorsíthatja fel a pontok automatikus detektálása . Gyorsabb diagnózis felállítását vagy a
kezelés ek eredményeinek egysz erűbb ellenőrzés ét lehetővé téve . Ennek megfelelően ennek a
tudománynak az alapjait szerettem volna elsőnek átadni a második fejezet keretein belül .
A harmadik fejezet az objektum detektáláshoz felhasználható modell ekről szól fejlődési
sorrendben. Láthattuk , hogy a kezdetekben megjelenő CNN neurális háló már osztályozni tudta
a számunkra érdekes objektumokat a képen, de lassú volt és egy képen egyidejűleg csak egy
képet volt képes felismerni. A CNN után ismertettem az R -CNN modellt, mely még mindig
lassú vol t, viszont egy képen egyszerre több felismerni kívánt objektumot is képes volt
detektálni. Ez a modell CNN hálózatokat használ fel úgy, hogy a képeket régiókra bontja, és a
régiókra alkalmazza a CNN hálózatokat . Itt már láthattuk, hogy óriási a fejlődés a
technológiában , de a sebesség még korlátozó tényező volt. A sebesség jav ításának a céljával

40
jött létre a következő modell , amit bemutattam, a Fast -R-CNN, mint láthatjuk a nevével is
tükrözi, hogy ez nagyon hasonló az R -CNN modellhez képest , azzal a külö nbséggel, hogy itt
elsőnek alkalmazz uk a CNN hálózatot az egész képre és csak ezt követően történik meg a
régiókra bontás. Ez jelentős sebességjavulást eredményezett. A követ kező fejlődési lépés a
Faster R -CNN modell volt, ami szintén javított a sebességen mé g a Fast R -CNN -hez képest is,
erről a modellről részletesebben később ejtettem szót a negyedik fejezetben. Az ezt követő
fejlődés a modellek terén az R -FCN volt, ami szint én régióalapú, de már nem CNN hálózatot
használ, hanem teljes konvolúciós hálózatot, ami megosztja a számításokat a teljes hálózattal,
ezzel is jelentős sebességnövekedést elérve. Végül egy eltérő alapokra épülő modell következett
a Single Shot Detector (S SD). Ez a modell már élő mozgóképen is megfelelő sebességgel képes
detektálni az obje ktumokat, cserébe itt a legbonyolultabb a működés. Az SSD előnye, hogy
nem két külön lépésben hajtja végre a régiójavaslatot és a régióosztályozást, hanem mindezt
egy lépésben teszi.
Az említett modellek bemutatása után következett egy részletesebb leírás az általam is
alkalmazott Faster R -CNN modell ről és az Iception V2 modull ról. Megismerhettük a Faster R –
CNN működését, és azt is láthattuk, hogy nem csak egy új abb, hatékonyabb modell segítségével
tehetjük gyorsabbá a detektálást, hanem modulok használatáv al is. Például az általam
alkalmazott Inception V2 modul úgy ér el teljesítmény növekedést, hogy a konvolúciós hálózat
mélységét csökkenti bizonyos módszerekkel.
Az elméleti tudás megismerése után szerettem volna a gyakorlati megvalósítást is prezentálni
az olvasók számára. Lépésről lépésre ismertettem, h ogy a gyakorlatban hogyan valósítottam
meg a program fejlesztését . Láthattuk, hogy azért esett a Faster R -CNN modellre a választás,
mert elég pontos és gyors, cserébe viszonylag egyszerű a működése is. Ezt követte a
programkörnyezet előkészítése, ami a Ten sorFlow objektum detektáló API, különböző
pythonhoz szánt csomagok telepítéséből, és a szükséges környezeti változók beállításával
valósult meg. A programkörnyezet felépítése után elkezdődhetett a képek ann otálása
(címkézése). Itt megadtuk, hogy a kép m ely részei fontosak számunkra, hogy a későbbiekben
ezen részek alapján tanuljon a program. Az elkészült címkézett képek xml formátumba lettek
elmentve. Ezeket az xml fájlokat átalakítottam TFrekord fájlokká, é s végül a TFrekordokat csv
fájlokká, amit fel tud unk használni a tanulás során. A következő lépés a tanulási folyamat
bekonfigurálása volt . Ennek első lépése a címketérkép létrehozása, és végül egy modell mintát
alakítottam át úgy, hogy a saját képadatbázi somat használja. Ezzel elkezdődhetett a
leghos szabb folyamat a tanulás. A tanulás egy gyengébb számítógépemen több napot is igénybe

41
vehet. Minél tovább hagytam a modellt tanulni egyre pontosabb an és több pontot ismert fel a
program. Végül a betanított mode llt felhasználva képesek lettünk detektálni a kere sett pontokat
a röntgenfelvételeken, hogy ezt láthatóvá is tegyük , egy másik program segítségével
kirajzolhattuk a detektált pontokat, így már szemmel láthatók lettek az elért eredmények .
Az elért eredmén yek elemzését a hatodik fejezetben láthatjuk, itt szükséges volt egy újabb
program létrehozása, ami segítségével össze tudtam hasonlítani az általam detektált pontokat a
szakorvosok által manuálisan bejelölt pontokkal. A tesztek alapján elmondható, hogy a program
viszonylag stabilan felismerni a koponyaröntgen kiértékeléséhez szükséges pontokat. A tesztet
100 képre futtatta m és átlagosan 15 képpont eltérést észlelhettünk 3,55-ös szórással.
Elmondhat ó, hogy a különböző szakorvos ok által manuálisan bejel ölt pontok k özött is
jelentkezhet ekkora eltérés.

42
Irodalomjegyzék
Könyvek, cikkek, tanulmányok

[C1] Jason Brownlee . Deep Learning for Computer Vision: Image Classification, Object
Detection, and Face Recognition in Python. Machine Learning Mastery, 2019.
[C2] Fei-Fei Li & Andrej Karpathy & Justin Johnson: Lecture 7: Convolutional Neural
Networks. 2016
http://cs231n.stanford.edu/2017/syllabus
[C3] Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik: Region -based
Convolutional Networks for Accurate Obje ct Detection and Segmentation. IEEE
Transactions on Pattern Analysis and Machine Intelligence, 2015
[C4] Ross Girshick : Fast R -CNN . Microsoft Research , 2015
[C5] Shaoqing Ren , Kaiming He , Ross Girshick , Jian Sun : Faster R -CNN: Towards Real
Time Object Detection with Region Proposal Networks . Microsoft Research , 2015
[C6] Leonardo Araujo dos Santos : Artificial Inteligence . 2018
[C7] Jifeng Dai, Yi Li, Kaiming He, Jian Sun : R-FCN: Object Detection via Region -based
Fully Convolutional Networks. NIPS, 2016
[C8] Wei Liu, Dragomir Anguel ov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng –
Yang Fu, Alexander C. Berg: SSD: Single Shot MultiBo x Detector. ECCV, 2016
[C9] Jan Hosang, Rodrigo Benenson, Bernt Schiele: Learning non -maximum suppression.
Max Planck Institut für Informatik Saarbrücke n, Germany 2017
[C10] Shaohua Wan, Zhijun Chen, Tao Zhang, Bo Zhang, Kong -kat Wong: Bootstrapping
Face Detection with Hard Negative Examples. xiaomi.com, 2016
[C11] Derry Alamsyah, Muhammad Fachrurrozi: Faster R -CNN with Inception V2 for
Fingertip Detection in Homogen ous Background Image. IOP Publishing Ltd, 2019
[C12] Dr. Dobai Adrienn : Kefalometriai vizsgálatok Cone -Beam CT adatállományon
arcrekonstrukciós műtétek tervezéséhez. Semmelweis Egyetem Klinikai
Orvostudományok Doktori Iskola 2018

Internetes adatgyűjtés

[W1] Tensor Flow detection model zoo
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/det
ection_model_zoo.md
[Letöltve: 20 20. január ]

43
[W2] TensorFlow Object Detection API
https://github.c om/tensorflow/models
[Letöltve: 20 20. január ]
[W3] Cython kiegészitő pythonhoz
https://cython.org/
[Letöltve: 20 20. február ]
[W4] Contextlib2 kiegészitő pythonhoz
https://pypi.org/project/contextlib2/
[Letöltve: 2020. február]
[W5] Pillow kiegészitő pythonhoz
https://p illow.readthedocs.io/en/stable/
[Letöltve: 2020. február]
[W6] Lxml kiegészitő pythonhoz
https://lxml.de/
[Letöltve: 2020. február]
[W7] Jupyter kiegészitő pythonhoz
https://jupyter.org/
[Letöltve: 2020. február]
[W8] XnConvert képkonvertáló program
https://www.xnview.co m/en/xnconvert/
[Letöltve: 2020.március]
[W9] LabelImg annotáló program
https://github.com/tzutalin/labelImg
[Letöltve: 2020.március]
[W10] IoU: Jaccard index
https://en.wikipedia.org/wiki/Jaccard_index
[Letöltve: 2020. április]
[W11] Fei-Fei Li & Justin Johnson & Serena Yeung: Lecture 11 – 1 May 10, 2017
http://cs231n.stanford.edu/sl ides/2017/cs231n_2017_lecture11.pdf
[Letöltve: 2020. április]
[W12] Koponyaméréstan Wikipedia
https://hu.wikipedia.org/wiki/Koponyam%C3%A9r%C3%A9stan
[Letöltve: 2020. április]
[W13] Vipdental Tel eröntgen

Teleröntgen


[Letöltve: 2020. április]
[W14] Grand Challenges in Dental X -ray Image Analysis: Challenge #1: Automated Detection
and Analysis for Diagnosis in Cephalometric X -ray Image. ISBI 2015
http://www -o.ntust.edu.tw/~cweiwang/ISBI2015/challenge1/
[Letöltve: 2020. április]

Similar Posts