Masarykova univerzita Fakulta informatiky

Akcelerácia automatickej anonymizácie modalít

Diplomová práca

Matej Minárik

Brno, jar 2017

Masarykova univerzita Fakulta informatiky

Akcelerácia automatickej anonymizácie modalít

Diplomová práca

Matej Minárik

Brno, jar 2017

Na tomto mieste sa v tlačenej práci nachádza oficiálne podpísané zadanie práce a prehlásenie autora školského diela.

Prehlásenie

Prehlasujem, že táto diplomová práca je mojím pôvodným autorským dielom, ktoré som vypracoval samostatne. Všetky zdroje, pramene a literatúru, ktoré som pri vypracovaní používal alebo z nich čerpal, v práci riadne citujem s uvedením úplného odkazu na príslušný zdroj.

Matej Minárik

Vedúci práce: RNDr. Miloš Liška, Ph.D.

i

Poďakovanie

Rád by som poďakoval môjmu vedúcemu práce RNDr. Milošovi Liš- kovi, Ph.D. za jeho odbornú pomoc, ochotu a trpezlivosť pri vedení mojej diplomovej práce. Zároveň ďakujem mojej manželke, rodine a kamarátom za podporu pri štúdiach a tvorbu potrebného zázemia. V neposlednom rade ďakujem kolegom z Laboratória pokročilých sieťo- vých technológii za pomoc pri problémoch a poskytnutie užitočných rád.

iii Zhrnutie

Táto práca si kladie za cieľ detekovať v medicínskych modalitách, v obraze sa nachádzajú osobné údaje pacienta a vedieť ich odlíšiť od ostatných textových dát, ktoré sú vykreslené v obraze. Tento proces sa odohráva na videu prenášaného z medicínskych prenosov zákrokov pre výučbové účely. V takýchto prípadoch je potreba, aby pacient zostal anonymný. Práca popisuje metódu vyhľadávania osobných údajov pacientov pomocou Optical Character Recognition (OCR) a ich sémantickú ana- lýzu a začlenenie tohto procesu do prenosu videa, ktorý prebieha v reálnom čase s nízkym oneskorením. Okrem toho práca obsahuje aj evaluáciu tohto procesu.

iv Kľúčové slová

Tesseract OCR, OCR, anonymizácia, medicínske modality, OpenCV

v

Obsah

1 Úvod 1 1.1 Motivácia ...... 1

2 OCR 5 2.1 GOCR ...... 5 2.2 SwiftOCR ...... 5 2.3 Asprise a ABBYY FineReader ...... 6 2.4 Ocrad ...... 6 2.5 OCR ...... 6 2.6 Vyhodnotenie ...... 7

3 Tesseract OCR 9 3.1 Príprava obrazu pre tesseract ...... 9 3.1.1 Škálovanie obrazu ...... 9 3.1.2 Binarizácia ...... 10 3.1.3 Odstránenie šumu ...... 10 3.1.4 Rotácia ...... 11 3.1.5 Odstránenie okrajov ...... 12 3.2 Fungovanie tesseractu ...... 12 3.3 Vytvorenie jazyka pre tesseract ...... 14 3.3.1 Vytvorenie textových vstupov ...... 15 3.3.2 Zostavenie jazyka ...... 17

4 Akcelerácia spracovania 21 4.1 Paralelizácia Tesseractu ...... 21 4.2 Oddelenie rozpoznania od spracovania snímky ...... 24

5 Klasifikácia snímky 27 5.1 Ukladanie a načítanie histogramu ...... 30

6 Sémantické spracovanie 33 6.1 Rozpoznávanie dátumov a rodných čísiel ...... 33 6.2 Rozpoznávanie mien ...... 35 6.3 Chyby pri identifikácii osobných údajov ...... 36

7 Implementácia anonymizácie 39

vii 8 Vyhodnotenie spracovania 41

9 Záver 45

Bibliografia 47

A Obsah priloženého CD 49

B Užívateľské nastavenia 51

C Ukážky modalít 55

viii Zoznam tabuliek

2.1 1. tabuľka vlastností OCR knižníc 8 2.2 2. tabuľka vlastností OCR knižníc 8 6.1 Tabuľka hodnôt vymazania písmena 35 6.2 Tabuľka hodnôt pridania písmena 35 6.3 Tabuľka hodnôt porovnania typov 35 8.1 Meranie času spracovania jednej snímky 42 8.2 Meranie času pixelizácie 42 8.3 Meranie času rozpoznania jednej snímky 43 8.4 Meranie času predspracovania a sémantického spracovania pri vyhľadávaní osobných údajov na snímke 43 8.5 Meranie času vytvorenia histogramov a ich porovnania 43

ix

Zoznam obrázkov

3.1 Ukážka problému s binarizáciou 10 3.2 Ukážka problému s použitím unsharp filtra 11 3.3 Flowcharty rozpoznania snímky Tesseractom 13 3.4 Diagram postupu vytvorenia jazyka pre Tesseract 18 4.1 Znázornenie interakcií medzi vláknami 21 4.2 Obrázky rôznych rozdelení snímky 22 4.3 Diagram funkcií jedného z Tesseractových vlákien 23 4.4 Diagram spracovania snímky jednotlivými vláknami 25 5.1 Nájdenie znakov pomocou SIFT algoritmu na dvoch podobných snímkach 27 7.1 Ukážka anonymizácie celého obrazu 39 7.2 Ukážka anonymizácie osobných údajov 40 C.1 Anonymizovaná angiografia 55 C.2 Anonymizovaná optická koherentná tomografia 56 C.3 Anonymizovaná angiografia 57

xi

1 Úvod

V dnešnej prepojenej dobe je potreba súkromia veľmi podstatná. Jed- nou z najvýznamnejších oblastí, v ktorej je dôležité udržať si časť súkro- mia, je zdravotníctvo. Nikto nechce, aby informácie o jeho zdravotnom stave boli dostupné zamestnávateľom, bankám, poisťovniam, alebo dokonca širšej verejnosti. V rámci Európskej únie existuje Európska charta práv pacientov [1], ktorá obsahuje v jednom svojom bode:

Každý jednotlivec má právo na zachovanie dôverného prí- stupu k svojim osobným informáciám, vrátane informácií týkajúcich sa jeho zdravotného stavu a možných diagnos- tických alebo liečebných metód, ako aj na ochranu svojho súkromia pri výkone diagnostických vyšetrení, prehliadke u odborného lekára a lekárskom ošetrení alebo chirurgic- kom zákroku vo všeobecnosti.

1.1 Motivácia

V tejto dobe sa čím ďalej, tým viac používajú pri výučbe videá. Pri výučbe študentov medicíny je táto metóda vhodná z dôvodu, že s pacientom je prítomný len ošetrujúci lekár a študenti majú pritom možnosť vidieť všetko čo je dôležité. Ďalším krokom od videa je priamy prenos. Ten umožňuje študentom nielen vidieť ako sa má pri zákroku postupovať, ale môžu sa vyšetrujúceho doktora spýtať na niektoré súvislosti, ktoré pri videu nemuseli byť povedané alebo znázornené. Rovnako ako pri výučbe sa priamy prenos môže využiť na lekárskych konferenciách, kde sú namiesto študentov prítomní doktori a riešia komplikovanejšie medicínske zákroky. Účastníci tejto konferencie si môžu nielen ozrejmiť daný postup zákroku, ale aj pridať vlastný názor riešenia danej situácie. Hlavnými požiadavkami priameho prenosu používaného pre tieto účely sú kvalita prenosu vo vysokom rozlíšení a prítomnosť čo najniž- šej latencie. Na trhu je aktuálne množstvo softwarov poskytujúcich možnosť priameho prenosu. Bežný komerčný software, ako napríklad Skype, sa k tomuto účelu nehodí z dôvodu, že nezaručuje dostatočnú

1 1. Úvod kvalitu prenosu. Združenie CESNET 1[2] pre tieto účely vyvíja soft- ware UltraGrid2 [3], ktorý je bežne nasadzovaný pre potreby prenosov živých zákrokov, hlavne vo fakultných nemocniciach v Českej repub- like. Mojou úlohou bolo implementovať modul do UltraGridu. V rámci týchto prenosov sa bežne prenáša video z kamery, ktorá sníma dianie na operačnej sále a záznam obrazu z rôznych medicín- skych modalít, ktoré majú doktori k dispozícii. Pod pojmom modality v kontexte tejto práce rozumieme rôzne medicínske prístroje využí- vané napríklad pri angiografii, optickej koherentnej tomografii a iných. Ukážky niektorých modalít som pridal do prílohy. Väčšina modalít, ktoré ukazujú informácie o pacientovi, ukazujú aj informácie, ktoré pa- cienta spájajú priamo s konkrétnou osobou, ako napríklad rodné číslo, celé meno alebo dátum narodenia. Tieto informácie sú dôležité pre doktora, ktorý pracuje s pacientom, aby si bol istý, že má správne infor- mácie o prítomnom pacientovi. Pri štúdijnych a výukových metódach sa vždy pracuje s anonymizovaným pacientom. Do obrazu z modalít sú pacientove osobné údaje priamo vykresľo- vané príslušným zariadením. Tieto zariadenia sú zvyčajne uzavreté systémy, preto nie je možné osobné údaje jednoducho nezobrazovať. Jedným z cieľov mojej práce je dokázať detekovať, kde v obraze sa osobné údaje pacienta nachádzajú a vedieť ich odlíšiť od ostatných textových dát, ktoré sú v obraze modalít vykreslené. Vzhľadom na fakt, že realizujeme prenosy vo vysokom rozlíšení a s nízkou latenciou, stanovili sme si výkonnostné ciele. Ultragrid s mojím modulom musí stíhať prenášať video s rozlíšením full HD a s frekvenciou 60 snímok za sekundu. Pre zachovanie interakcie pri priamych prenosoch musí byť celkové oneskorenie menšie ako 150 ms. Celkové oneskorenie je súčet dĺžky spracovania snímky všetkými modulmi. Pri návrhu toho modulu som sa najskôr zoznámil s UltraGridom a zistil, akým spôsobom pracuje s modulmi. Bližší popis jeho fungovania neuvádzam s ohľadom na cieľ a rozsah práce. Pre vyhľadanie osobných údajov pacienta som sa rozhodol použiť Optical Character Recognition (OCR). Na základe toho som urobil rešerš. Z možných variantov som

1. CESNET je združením vysokých škôl a Akadémie vied Českej republiky, ktoré prevádzkuje a rozvíja národnú e-infraštruktúru pre vedu, výzkum a vzdelávanie za- hrňujúc počítačovú sieť, výpočetné gridy, dátové úložiská, prostredie pre spoluprácu a ponúka širokú škálu služieb. 2. UltraGrid je softvare pre prenos videa vo vysokom rozlíšení s nízkou latenciou. 2 1. Úvod

si zvolil Tesseract OCR. Bližšie dôvody môjho výberu opisujem v kapitole 2. Samotný Tesseract a jeho fungovanie približujem v kapitole 3. Potom, čo som vybral najvhodnejšiu knižnicu, som otestoval, ako rýchlo a presne dokáže rozpoznávať text zo snímok. Z dôvodu, že rýchlosť rozpoznania bola príliš pomalá, som musel vymyslieť spôsob, ako výpočet paralelizovať. Opis paralelizácie obsahuje časť s názvom 4.1. So zreteľom na to, že rozpoznávanie textu na snímkach nie je dosta- točne výkonné pre beh v reálnom čase, je nutné paralelizovať rozpoz- návanie textu v snímkach vzhľadom k dalšiemu spracovaniu snímky v UltraGride. Túto paralelizáciu som bližšie opísal v sekcii 4.2. V kapitole 5 opisujem spôsob, akým som riešil klasifikovanie snímok. Následne som pridal sémantické spracovanie, rozpoznávanie, či text obsahuje osobný údaj alebo nie. Spôsob, akým som to vyriešil, som uviedol v kapitole 6. Funkciu, ktorú som použil pre anonymizovanie ukážky anonymizovaných modalít, som opísal v kapiole 7. Na záver som vyhodnotil výkon vlastnej implementácie v kapitole 8.

3

2 OCR

OCR je „Optical Character Recognition“ (optické znakové rozozná- vanie) alebo „Optical Character Reader“ (optický znakový čítač). Je to mechanická alebo elektronická premena obrazu tlačeného alebo písaného textu do strojovo spracovateľného textu, či už z naskeno- vaného obrázku, fotografie, dokumentu alebo ľubovoľnej fotografie obsahujúcej nielen text (napr.fotografia bilboardu). V mojej práci som potreboval vyhľadať v obraze modalít textové osobné údaje. Na tento účel som sa rozhodol použiť OCR. Cieľom mojej práce nebolo primárne zaujímať sa vývojom OCR. Vzhľadom na tento fakt som použil už existujúcu knižnicu, ktorá poskytuje funkci- onalitu OCR. Existuje viacero takýchto knižníc, nie všetky sú vhodné pre potreby mojej práce. Od knižnice, ktorú použijem požadujem, aby bola bez licenčných a iných poplatkov a bola vhodná pre prog- ramovací jazyk C/C++. Podmienkou bolo tiež, aby ju bolo možné nasadiť na operačnom systéme . Vhodné by bolo, ak by ju bolo možné nasadiť aj na operačné systémy OS X a Windows, ale toto nie je tvrdá podmienka. Ďalšími kritériami pre výber bol aktívny vývoj a jej vhodnosť na rozpoznávanie medicínskych modalít. V tejto kapitole popisujem systémy, ktoré som pre potreby OCR zvažoval.

2.1 GOCR

GOCR[4] je OCR software vyvíjaný pod verejnou GNU licenciou. Po- sledný vývoj bol v roku 2013. Podľa ich webstránky používajú knižnicu libgocr, ktorej vývoj bol ukončený v roku 2006. Táto knižnica bola na- hradená frameworkom Conjecture. Je to modulárny, rozšírovateľný voľne šíriteľný framework. Posledná zmena v ňom bola urobená v roku 2007, z tohto dôvodu som GOCR a Conjecture zamietol použiť.

2.2 SwiftOCR

SwiftOCR[5] je OCR knižnica napísaná v jazyku Swift. Je šírená pod licenciou Apache, verzia 2.0. Na rozoznávanie obrazu využíva ne- urónovú sieť. Chváli sa lepším a rýchlejším rozoznávaním a menšou

5 2. OCR záťažou systému oproti knižnici Tesseract OCR, pre výber ktorej som sa nakoniec rozhodol. Nespĺňa podmienku, aby podporovala jazyk C/C++, z toho dôvodu by musela byť knižnica obalená wraperom a jej funkcie by sa museli volať nepriamo. Významnejší problém pred- stavoval fakt, že SwiftOCR zatiaľ podporuje len operačné systémy iOS a OS X. Zároveň je optimalizovná pre jednoriadkové alfanumerické kódy. Z týchto dôvodov som SwiftOCR zamietol.

2.3 Asprise a ABBYY FineReader

Asprise[6] je knižnica OCR a rozpoznávač čiarových kódov SDK. Pod- poruje viacero rôznych programovacích jazykov, ako napríklad Java, C, C/C++. Táto knižnica je dostupná pre operačné systémy Linux, Windows aj OS X. Nevýhodou je poplatok za vývojarsku licenciu. Bez tohto nedostatku by bola jedným z najlepších kandidátov. Podobnou komerčnou aplikáciou je ABBYY FineReader[7], spĺňa všetky ostatné kritéria, okrem dostupnosti bez licenčných poplatkov. Na základe toho som obidve vyradil z užšieho výberu.

2.4 Ocrad

GNU Ocrad[8] je OCR program a knižnica založená na metóde vý- beru charakteristických znakov. Obsahuje analýzu rozloženia, ktorá umožňuje oddeliť stĺpce alebo bloky normálne nájdené v tlačených dokumentoch. Funguje na týchto operačných systémoch: GNU, Linux, FreeBSD, NetBSD, OpenBSD a OS X. Posledná verzia bola vydaná v roku 2015. Najnovšie porovnanie Ocrad a Tesseract OCR knižníc pochádza z roku 2010[9]. V tomto porovnávaní je knižnica Tesseract OCR zrovnateľne presná alebo aj presnejšia ako knižnica Ocrad OCR. Z tohto dôvodu som si Ocrad OCR nezvolil .

2.5 Tesseract OCR

Tesseract OCR je opticko-znakovo-rozoznávací engine s otvoreným zdrojovým kódom, rozšírený pod licenciou Apache 2.0. Dá sa využiť priamo alebo programovo s použitím API. Je vyvíjaný pre všetky

6 2. OCR

operačné systémy, ktoré som špecifikoval na začiatku tejto kapitoly. Je písaný v programovacom jazyku C++. Dokáže rozpoznať viac ako 100 jazykov a zároveň umožňuje vytvoriť vlastný jazyk. Jeho vývoj je stále aktívny a je podporovaný spoločnosťou Google. Tesserac OCR som vyhodnotil ako najlepšiu knižnicu pre rozpoznávanie textu v obrázkoch.

2.6 Vyhodnotenie

Zo všetkých spomenutých knižníc považujem za najvhodnejšiu pre potreby mojej práce knižnicu Tesserac OCR. Ostatné buď nespĺňali požiadavky, ktoré som si zvolil, alebo ich vývoj bol zastavený. Moje kritériá hodnotenia a úspešnosť jednotlivých knižníc som zaznamenal v nasledujúcich tabuľkách: 2.1 a 2.2.

7 2. OCR

knižnica bez poplatkov podporuje multiplatformné C/C++ nasadenie GOCR    Asprise    SwiftOCR    ABBYY Fi-    neReader Ocrad    Tesseract    OCR

Tabuľka 2.1: 1. tabuľka vlastností OCR knižníc knižnica podporované jazyky posledný vývoj GOCR pravdepodobne len 2013 angličtina Asprise 20+ 2017 SwiftOCR pravdepodobne len 2017 angličtina, dokáže sa učiť na rôzne fonty ABBYY FineReader 192 2017 Ocrad latinská abeceda 2015 Tesseract OCR 100+ a možnosť vytvo- 2017 riť vlastný

Tabuľka 2.2: 2. tabuľka vlastností OCR knižníc

8 3 Tesseract OCR

Tesseract OCR bol vyvíjaný od roku 1985 do 1994 spoločnosťou He- wlett Packard. V roku 1996 prebehlo portovanie na platformu Win- dows a v roku 1998 čiastočná migrácia z jazyka C do C++. Od tej doby bol kód prepísaný tak, že ho je možné skompilovať C++ kompilátorom. Nasledujúcu dekádu na ňom bolo robené veľmi málo. V roku 2005 bol vydaný ako open source spoločnosťou Hewlett Packard a University of Nevada, Las Vegas (UNLV). Od roku 2006 je jeho vývoj sponzorovaný spoločnosťou Google. Tesseract sa môže použiť priamo z príkazového riadka, alebo s po- užitím API. Na obrázkoch dokáže rozpoznať text napísaný tlačeným aj písaným písmom, aj text na naskenovaných dokumentoch. Podporuje veľké množstvo jazykov. Umožňuje si vytvárať vlastné jazyky, ktoré sa dajú personalizovať na rozpoznávanie špecifických fontov a slov.

3.1 Príprava obrazu pre tesseract

Pre zlepšenie presnosti rozoznávania tvorcovia Tesseractu doporučujú päť rôznych predspracovaní obrazu.

3.1.1 Škálovanie obrazu

Prvou z nich, ktorú som použil aj v mojej práci, je škálovanie ob- razu. Presnosť rozpoznávania klesá pri veľkosti písma 10pt a rozlíšení 300dpi (približná výška malého písmena "x"pri tejto veľkosti písma je 20 pixelov), výrazne klesá pri veľkosti písma 8pt a rozlíšení 300dpi. Väčšina textu z medicínskych prístrojov je dostatočne veľká, zväčšenie mierne pomohlo v presnosti rozpoznávania. V mojom module som implementoval rozťahovanie obrazu. Obraz si v základe zväčšujem na dvojnásobok veľkosti v obidvoch smeroch rovnomerne. Táto hod- nota zväčšovania sa dá odovzdať programu cez príkaz riadku ako parameter.

9 3. Tesseract OCR

3.1.2 Binarizácia Druhou úpravou, ktorú odporučujú je binarizácia, prevod obrazu do čiernej a bielej. Táto úprava je vhodná pre naskenovanú stránku doku- mentu, ktorá má dostatočný kontrast. Napriek tomu pri medicínskych modalitách, o ktorých môj modul nemá žiadne predchádzajúce in- formácie, je veľmi náročné určiť hranicu, od akej svetlosti bude pixel biely a od akej čierny. Tento problém je znázornený na obrázkoch 3.1. Naľavo je obraz zo staršieho prístroja, napravo z novšieho. Obrázok 3.1a sú nemodifikované zábery z prístrojov. Na obrázku 3.1b sútie isté zábery, len binarizované. Obidva boli binarizované s rovnakou hranicou. Pri novšom prístroji táto úprava pomohla. Všetky mená sú ostrejšie. Pri staršom úprava zničila všetky informácie, ktoré na zábere boli. Vzhľadom k tomuto problému v mojom module používam len prevod snímky do odtieňov šedej a nie úplnu binarizáciu.

(a) Nebinarizované modality

(b) Binarizované modality

Obr. 3.1: Ukážka problému s binarizáciou

3.1.3 Odstránenie šumu Treťou úpravou je odstránenie šumu. Pre dosiahnutie tohoto efektu som použil unsharp filter. Táto úprava pri ručnom testovaní mierne po-

10 3. Tesseract OCR

mohla rozoznávaniu textu. Pri automatizácii tohoto procesu a použití na rôzne zašumené a ostré obrazy nevzniklo požadované zlepšenie, dokonca sa kvalita rozpoznávania ešte zhoršila. Na obrázkoch 3.2 som ukázal časti snímok pred (3.2a) a po (3.2b) použití filtra. Na obrázku je zreteľné, že po použití filtra narástla zrnitosť a došlo k miernemu narušeniu okrajov znakov. Ďalším problémom bol nárast počtu roz- poznaných textov na miestach, kde žiaden text nebol. Pravdepodobne to bolo spôsobené príliš veľkou zrnitosťou v oblastiach, kde boli zábery napríklad z angiografie.

(a) Výrezy modalít bez použitia unsharp filtra

(b) Výrezy modalít s použitím unsharp fil- tra

Obr. 3.2: Ukážka problému s použitím unsharp filtra

3.1.4 Rotácia Štvrtou odporúčanou úpravou je rotácia. Najlepšie rozpoznanie textu prebehne, keď je text vodorovný (v prípade niektorých jazykov zvislý).

11 3. Tesseract OCR

V našom prípade je táto úprava zbytočná vzhľadom na fakt, že každý text z prístrojov bude vodorovný, lebo bol generovaný počítačom. V modalitách sa občas objavia aj zvislé texty, zvyčajne popisy alebo logá, ale všetky osobné údaje sú vždy zapísané vodorovne.

3.1.5 Odstránenie okrajov Poslednou doporučenou úpravou je odstránenie okrajov. Táto úprava sa týka viac-menej skenovaných dokumentov a artefaktov vzniknu- tých pri nepresnom skenovaní. V modalitách sa takéto fragmenty nevyskytujú a detekovanie týchto fragmentov a ich odstraňovanie by bolo zbytočné zaťaženie systému.

3.2 Fungovanie tesseractu

Existujú dva spôsoby, akými sa dá rozpoznať text na snímke. Spôsob (a) využíva pri rozpoznávaní snímky Result iterátor a spôsob (b) fun- kciu GetComponentImages. Sú znázornené na obrázkoch 3.3. Obidva spôsoby začínajú inicializáciou enginu a nastavením snímky, ktorá sa má rozpoznať. Pri inicializácii sa zároveň nastaví jazyk, ktorý má Tesseract používať pri rozpoznávaní. Jazyk v tomto prípade je súbor, ktorý obsahuje naučené informá- cie o jednotlivých znakoch, spôsobe ich rozpoznávania a o štruktúre jazyka, ktoré dokáže rozpoznať. Tesseract poskytuje širokú škálu už pripravených rozpoznávacích jazykov pre rôzne svetové jazyky. Umož- ňuje aj vytvoriť si vlastný jazyk pre rozpoznávanie špeciálnych jazykov, alebo pri použití vlastných šepciálnych fontov. Za účelom zlepšenia rozpoznávania som vytvoril vlastný jazyk. Tento proces opisujem v podkapitole 3.3. Spôsob (b), znázornený na obrázku 3.3b, po inicializácii nastaví snímku, ktorá sa má rozpoznať. V tomto kroku sa Tesseractu nastavia aj informácie o veľkosti snímky. Potom vyhľadá na snímke oblasti, ktoré obsahujú text. Následne nastaví každú oblasť pre rozpoznanie, rozpozná ju a získa z nej informácie o texte a istotu, s akou je text správne rozpoznaný. Spôsob (a), znázornený na obrázku 3.3a, nastaví snímku a celú ju rozpozná. Potom získa result iterátor, ktorý ukazuje na vnútornú štruktúru rozpoznania v Tesseract engine. Následne

12 3. Tesseract OCR jednoducho v cykle sa získa text, istota, s akou je tento text rozpoznaný správne a umiestnenie textu. V obidvoch spôsoboch sa dá nastaviť, aká veľká časť textu má byť rozpoznaná. Rozpoznávať sa dajú bloky textu, odstavce, celé riadky, slová alebo jednotlivé znaky. V mojej implementácii rozpoznávam slová. Je to hlavne z dôvodu, že modality obsahujú aj ďalšie textové dáta a tie potrebujeme odlíšiť sémantickou analýzou od pacientových osobných údajov. V prípade, ak by sme rozpoznávali riadky alebo bloky, tak by to nefungovalo správne, lebo text v modalitách nemá taký charakter a okrem toho by sa ťažšie vyhľadávali osobné údaje pacientov v týchto celkoch.

(a) Flowchart rozpoznania (b) Flowchart rozpoznania snímky Tes- snímky Tesseractom s použitím seractom s použitím GetComponentI- Result iterátoru mages

Obr. 3.3: Flowcharty rozpoznania snímky Tesseractom

13 3. Tesseract OCR

Pomocou Tesseractu sa dajú získať: informácie o texte, ktorý roz- poznal; dôveryhodnosť textu, s akou predpokladá, že je daný rozpoz- naný text správne; pozícia a veľkosť textu v rozpoznávanom obrázku. Rozpoznaný text používam pri identifikácií toho, či je to osobný údaj. Pomocou dôveryhodnosti textu predbežne eliminujem oblasti, ktoré majú menšiu dôveryhodnosť ako 50. V prípade, ak daný text prehlá- sim za osobný údaj, anonymizujem oblasť pomocou získanej pozície a veľkosti oblasti. Spôsob (b) má v súčasnej verzii problém správne identifikovať umiestnenie textu. Pri niektorých modalitách určí viacero oblastí za- hŕňajúcich skoro celú snímku. V prípade, keď sa pred vyhľadaním oblastí zavolá metóda recognize, ktorá rozpozná snímku, oblasti vy- hľadá správne. Vzhľadom na nepraktickosť rozpoznávania každého slova dvakrát, som sa rozhodol použiť metódu s result iterátorom.

3.3 Vytvorenie jazyka pre tesseract

Ako som uviedol v kapitole 3.2, rozhodol som sa vytvoriť jazyk pre Tesseract, aby som zlepšil rozpoznávanie. Predvytvorené jazyky sú vytvárané pre všeobecné použitie. Na základe toho som sa rozhodol vyskúšať vytvoriť jazyk špeciálne určený pre rozpoznávanie textu v medicínskych modalitách. Jazyk obsahuje: informácie o tvare znakov; slovník so slovami, ktoré sú v danom jazyku; ďalšie údaje pre roz- poznávanie textu v obraze. V našom prípade môžeme pripraviť jazyk na rozpoznávanie bezpätkového písma a vytvoriť slovník obsahujúci mená potenciálnych pacientov. Na stránkach Tesseractu je uvedený návod na vytvorenie takéhoto jazyka. Na vytvorenie môžeme použiť už existujúci jazyk, vymeniť požadovanú časť a znovu ho zložiť dohromady. Ďalším variantom je všetky časti vytvoriť samostatne a vytvoriť ho z týchto častí. Pri vytváraní jazyka sú potrebné dva rôzne textové vstupy. Jeden je text, na ktorom sa Tesseract učí rozpoznávať znaky, slová a celkový text. Druhý je text, z ktorého sa vytvoria slovníky pre Tesseract. Slovníky v jazyku slúžia na rôzne účely. Pri zostrojovaní jazyka som použil tieto štyri: word-dawg, freq-dawg, punc-dawg a number-dawg.

∙ Word-dawg obsahuje všetky slová, ktoré jazyk obsahuje.

14 3. Tesseract OCR

∙ Freq-dawg obsahuje najčastejšie sa vyskytujúce slová v jazyku.

∙ Punc-dawg je slovník, ktorý obsahuje interpunkčný vzor nájdený okolo slov. Slová sú nahradené jednou medzerou.

∙ Number-dawg obsahuje vzory výrazov, ktoré obsahujú čísla. Číslice sú zamenené za medzeru. Napríklad dátum by vyzeral takto: __.__.____, ak by sa za _ nahradili medzery.

Slovníky Word-dawg a Freq-dawg slúžia pre určenie toho, či sa dané rozpoznané slovo nachádza v jazyku, alebo nastala pri rozpoz- naní chyba. V takom prípade, je treba znížiť pravdepodobnosť správ- neho rozpoznania. Pri Punc-dawg a Number-dawg Tesseract funguje na podobnom princípe ako pri Word-dawg a Freq-dawg. Nekontro- luje len slová, ale aj rozmiestnenie interpunkčných znakov vo vete a tvar slov, ktoré obsahujú čísla (napríklad dátum, desatinné čísla alebo rôzne menné prípony a predpony). Na začiatku som skúšal robiť tento proces manuálne. Po pár poku- soch a častých opakovaniach som sa rozhodol vytvoriť skript, ktorý bude vykonávať všetky operácie v správnom poradí so správnymi argumentami. Vo výsledku som vytvoril 3 skripty: 1 vytvorí samotný jazyk a 2 slúžia na spracovanie textového vstupu pre jazyk.

3.3.1 Vytvorenie textových vstupov Pre textové vstupy a hlavne pre vytvorenie slovníkov Word-dawg a Freq-dawg som chcel použiť reálne mená, ktoré sa používajú v Českej republike. Z tohto dôvodu som zo stránky Ministerstva vnútra Českej republiky[10] stiahol zoznamy mien a priezvisk. Z týchto zoznamov som potreboval vytvoriť 3 texty. Prvý, má obsahovať slová, na ktorých sa bude Tesseract učiť. Druhý text má zahŕňať všetky výskyty mien a bude použitý na vytvorenie slovníka Word-dawg. Posledný text, ktorý som potreboval vytvoriť, bol text, ktorý mal obsahovať najčastej- šie sa vyskytujúce mená pre slovník Freq-dawg. Hodnotu 1000 som zvolil ako hranicu toho, čo považujem za často sa vyskytujúce meno. S prihliadnutím na to, meno považujem za časté práve vtedy, ak v Českej republike existuje aspoň 1000 ľudí s rovnakým menom alebo priezviskom.

15 3. Tesseract OCR

Za týmto účelom som vytvoril 2 skripty. Jeden slúži na spracovanie všetkých slov. Vytvorí text pre slovník a text, na ktorom sa Tesseract bude učiť rozpoznávať. Druhý skript je podmnožinou prvého. Robí rovnaké úpravy ako prvý s tým rozdielom, že nevytvára text pre učenie. Spracovávam ním najčastejšie používané mená. Na základe toho budem ďalej opisovať len prvý skript. Prvý skript ako svoje argumenty berie textové súbory, ktoré ob- sahujú mená, s ktorými má pracovať. V prvom kroku spojí všetky texty zo súborov. Následne nahradí všetky medzery za znaky nových riadkov. Tým zaistím to, že keď sa meno v pôvodnom prípade skladá z viacerých slov, každé slovo bude na vlastnom riadku. V ďalších krokoch odstránim diakritiku a spojím ju s pôvodným textom (s neod- stránenou diakritikou). Takto získam aj zápis mien bez diakritiky. Je to dôležité, lebo niektoré medicínske modality používajúce len anglickú abecedu obsahujú mená pacientov bez diakritiky. Následne pokra- čujem odstránením všetkých duplikátov a zoradením všetkých mien. Odstránim aj slová, ktoré sú kratšie ako 2 písmená. Tým zredukujem mená, ktoré by si pravdepodobne Tesseract pri rozpoznávaní pomýlil s náhodným šumom. Po týchto úpravách už mám všetky výskyty mien, ktoré chcem rozpoznávať. Ďalej je potrebné upraviť ich kapitalizáciu do jednotného tvaru mien – dať ich do klasického tvaru, v akom sa zapisujú, t.j. prvé písmeno veľké a všetky ostatné malé. Tým mám vytvorený slovník mien, ktoré použijem pri zostavovaní jazyka pre Tesseract. Pri učení nového jazyka pre Tesseract je potrebné mať text, na kto- rom sa bude Tesseract učiť rozpoznávať slová. Podľa oficiálnej wiki by tento text mal obsahovať každé písmeno aspoň 10-krát. Pri výni- močných znakoch stačí 5 výskytov. Preto tento skript, okrem slovníka obsahujúceho všetky mená, vytvorí tiež text, na ktorom sa bude Tes- seract učiť. Tento text pozostáva z 200 náhodných mien z každého začiatočného písmena, dohromady 5200 mien. Zároveň pridám aj 500 náhodných dátumov a k nim odpovedajúcich rodných čísel. Pri gene- rácii dátumov nekontrolujem či daný dátum môže existovať, práve naopak, generujem aj dátumy ako napríklad 75.47.1958. Zvyšujem tým počet číslic, na ktorých sa Tesserac bude môcť učiť. Pri učení sa Tesseract nezameriava na postupnosť znakov za sebou, len na ich tvar. Ten sa môže mierne meniť v závislosti na susedoch, preto je dobré, aby sa Tesseract naučil čo najviac rôznych kombinácií. Na záver ešte

16 3. Tesseract OCR

mená, dátumy a rodné čísla v tomto texte náhodne poprehadzujem a vymením všetky nové riadky za medzery. Tieto úpravy sú dané požiadavkou na formát tohto textu, ktorý je uvedený v návode. Poža- duje, aby bol text usporiadaný do prirodzených viet, ktoré nemusia dávať význam, ale diakritické znaky sú na správnom mieste. V mojom prípade nevytváram vety, ale ani nepožadujem od môjho jazyka, aby rozpoznával vety. Požadujem, aby slová boli aj vedľa seba, nie len pod sebou. Tým som vytvoril text, ktorý použijem pri učení Tesseracu.

3.3.2 Zostavenie jazyka Návod pre tvorbu jazyka na stránkach Tesseractu je pomerne dlhý, preto som pre prehľadnosť vytvoril obrázok 3.4. Vytvára sa pomocou volania rôznych programov dostupných v balíku Tesseract/training. Všetky programy sú volané z príkazového riadku a volané so špeci- fickými parametrami. Tento diagram obsahuje len názvy programov a nie ich plnú parametrizáciu. Na mojom obrázku som vyznačil aké súbory dané programy požadujú a aké produkujú. Niektoré názvy súborov sú neúplné alebo zovšeobecnené, ale pre vysvetlenie postupu tvorby jazyka sú dostatočné. Šípka vedúca z procesu k súboru značí, že proces vytvorí tento súbor. Šípka zo súboru do procesu značí, že proces berie súbor ako argument. Skript, ktorý som vytvoril pre zjednodušenie tohto procesu, pri- jíma aspoň 5 argumentov. Prvý argument je cesta k fontom, druhý je cesta k adresáru langdata, ktorý sa dá stiahnuť zo stránok Tesseractu. Tretí argument je meno jazyka, tradične sa používajú 3 písmenové mená. Štvrtý argument je počet fontov, ktoré chceme použiť pri učení Tesseractu. Pri zvyšných argumentoch skript očakáva názvy fontov. Následne opíšem príkazy v poradí, v akom sú usporiadané v mojom skripte.

text2image Novší program, ktorý vytvorí obrázky umelo naskenova- ného dokumentu a súbor obsahujúci presnú pozíciu a veľkosť každého písmena v tomto súbore. Túto dvojicu súborov môžeme vytvoriť aj manuálne alebo s použitím iných pomocných programov určených pre túto činnosť. Ako vstup požaduje textový súbor obsahujúci text, na ktorom sa bude Tesseract učiť, odkaz na adresár, v ktorom sú uložené fonty a

17 3. Tesseract OCR

Obr. 3.4: Diagram postupu vytvorenia jazyka pre Tesseract názov fontu, v akom má vytvoriť umelý dokument. Umožňuje nastaviť aj možnosti, ako napríklad expozíciu a veľkosť fontu. Zároveň dokáže vypísať možné fonty, ktoré môže použiť. V mojom skripte vytváram pre každý zadaný font 6 rôznych kombinácií expozície a veľkosti fontu.

Tesseract Pomocou nástroja Tesseract sa naučí rozpoznávať znaky v obrázku. Nato, aby vedel, kde v obrázku sa dané znaky nachádzajú, je potrebné dať mu súbor s týmito informáciami. Obidva tieto súbory boli vytvorené programom text2image. Je nutné spustiť program s argumentom box.train alebo box.train.stderr, aby poznal moju požiadavku na to, aby sa učil a nerozpoznával text s

18 3. Tesseract OCR

už existujúcim jazykom. Po naučení vytvorí pre každú dvojicu súbor s príponou .tr. Tento súbor obsahuje črty každého znaku použitého v učiacom texte.

unicharset_extractor Dátový súbor unicharset obsahuje informácie o každom znaku, ktorý bude s daným jazykom vedieť Tesseract rozo- znať. Unicharset_extractor vytvorí tento súbor zo všetkých súborov file.box.

set_unicharset_properties Nastaví súboru unicharset dodatočné vlast- nosti, predovšetkým veľkosti získané z fontov. Ako parameter, okrem vstupného unicharsetu, prijíma cestu k adresáru langdata, ktorý sa dá stiahnuť zo stránok Tesseractu.

shapeclustering Tento program sa v mojom skripte nepoužíva. Vy- užíva sa len pri Indických jazykoch alebo pri jazykoch, ktorých zá- kladné znaky sú zložené z dvoch alebo viacerých neoddelených prí- vlastkov. Vytvorí tabuľku vzorov tvarov zo zhlukov tvarov a zapíše ju do súboru shapetable. V prípade, keď sa tento program nepoužije, súbor shapetable vytvorí program mftraining.

mftraining Vytvorí tvarové prototypy znakov a uloží ich do súboru inttemp. Následne vypočíta počet predpokladaných vlastností kaž- dého znaku a uloží ich do súboru pffmtable. Ako argumenty prijíma unicharset všetky súbory vytvorené Tes- seractom s príponou .tr a súbor font_properties. Font_properties je súbor, ktorý obsahuje informácie o použitom fonte, ako napríklad či je písmo hrubé, kurzíva alebo serif. Je možné si vytvoriť tento súbor manuálne, ale tvorcovia Tesseractu vytvorili základný súbor, ktorý obsahuje okolo 3000 fontov a je súčasťou zložky langdata.

cntraining Vytvorí jeden dátový súbor normproto, ktorý obsahuje znakové normalizačné citlivostné prototypy. K akému účelu tento súbor slúži som na stránkach Tesseractu nezistil. Uvádzajú len infor- máciu o jeho nutnosti pre zostavenie jazyka. Argumentmi potrebnými pre jeho zostavenie sú všetky súbory vytvorené Tesseractom s prípo- nou .tr.

19 3. Tesseract OCR wordlist2dawg Je program na transformáciu textových súborov vo formáte wordlist na súbor vo formáte Direct Acyclic Word Graph (DAWG), priamy acyklický slovný graf[11]. Wordlist formát je textový súbor vo formáte UTF-8 s jedným slovom na každom riadku. Existuje tiež program dawg2wordlist, ktorý vytvorí súbor vo formáte wordlist z DAWG súboru. Používa sa na tvorbu slovníkov pre jazyk Tesseractu, ktorý ich má skoro všetky uložené ako DAWG súbor. Je to veľmi vhodný spôsob uloženia slovníka. Čas vyhľadania jedného prvku je O(m), kde m je dĺžka hľadaného prvku. V mojom skripte som použil 4 slovníky, ktoré som opísal v časti 3.3. combine_tessdata Na záver program combine_tessdata zloží všetky vytvorené súbory do jazyka Tesseractu. Po vytvorení je potrebné ma- nuálne premiestniť jazyk do adresára, v ktorom Tesseract hľadá jazyky.

20 4 Akcelerácia spracovania

V úvode mojej práce som spomínal potrebu vyriešiť paralelizáciu rozpoznávania snímku pomocou Tesseractu a oddelenie behu roz- poznávacieho vlákna Tesseractu od spracovania snímky v UltraGride. Dôvodom paralelizácie spracovania snímky Tesseractom bolo urých- liť celkové rozpoznanie snímky. Oddelenie rozpoznávacieho vlákna od hlavného bolo nutné z dôvodu, že aj sparalelizované rozpozná- vanie snímky Tesseractom je príliš pomalé, aby prebiehalo v rámci spracovania jednej snímky.

Obr. 4.1: Znázornenie interakcií medzi vláknami

Na obrázku 4.1 je znázornené, ako si jednotlivé vlákna predávajú medzi sebou dáta. Bližšie túto interakciu opíšem v jednotlivých pod- kapitolách.

4.1 Paralelizácia Tesseractu

Spôsob, akým sa pomocou Tesseract enginu dá rozpoznať text na snímke, som už opísal v kapitole 3. Vzhľadom na fakt, že najviac času pri rozpoznávaní zaberá samotné rozpoznanie snímky, bolo treba paralelizovať túto časť. Najvhodnejší spôsob pre paralelizáciu bolo rozdeliť snímku na menšie časti a nechať každé vlákno rozpoznať jednu časť. Pri roz- deľovaní týchto častí môže nastať situácia, keď je slovo rozdelené ako na obrázku 4.2a. V tomto prípade, Tesseract nedokáže rozpoznať správne pôvodný text. Aby som predišiel nesprávnemu rozdeleniu

21 4. Akcelerácia spracovania slova, snímku rozdeľujem na rovnomerné vodorovné oblasti. Uvá- dzam príklad rozdelenia snímky na 4 vodorovné oblasti: 4.2b. Aby som predišiel rozrezaniu slova vodorovne, zväčšil som každú oblasť o okraj s konštantnou veľkosťou. V prípade 4 oblastí, zväčšené oblasti budú vyzerať ako na obrázkoch 4.2c. Tieto okraje môžu spôsobiť ná- sobné rozpoznanie textu, ktorý sa kvôli okrajom nachádza v dvoch rôznych oblastiach. Násobné rozpoznanie nie je problém, ak sa po- tvrdí, že sa má oblasť anonymizovať v obidvoch prípadoch, urobí sa tak 2x. Dochádza k mierne zbytočnému plytvaniu výkonu v prípade, kedy sa slovo rozpozná viacnásobne. Pravdepodobnosť, že táto situ- ácia nastane práve na osobnom údaji nie je príliš vysoká. Vzhľadom k uvedenému som neimplementoval žiadnu funkciu na hľadanie a elimináciu násobných rozpoznaní.

(a) Rozdelenie snímky na ob- (b) Rozdelenie snímky na vo- lasti dorovné oblasti

(c) Rozdelenie snímky na vodorovné oblasti a okraje

Obr. 4.2: Obrázky rôznych rozdelení snímky

22 4. Akcelerácia spracovania

Obr. 4.3: Diagram funkcií jedného z Tesseractových vlákien

23 4. Akcelerácia spracovania

Na obrázku 4.3 je znázornený postup jedného z vlákien v obrázku 4.1 nazvaného Tesseract threads. Tieto vlákna sú navrhnuté tak, aby mohli bežať viaceré súčasne. Obsahujú skoro celý postup rozpoznania snímky, ako bolo opísané v časti 3.2 a znázornené na obrázku 3.3a. Chý- bajúce funkcie sú vykonávané v iných vláknach. Napríklad funkcia inicializácie sa volá v hlavnom vlákne pri spustení programu.Funkcia nastavenia snímky (vyobrazená na obrázku 4.1) sa volá v rozpoznáva- com vlákne nazvanom Recognizing thread. Každé vlákno pracuje s vlastným Tesseract enginom. Tak, ako je z obrázka vidieť, toto vlákno pracuje v nekonečnom cykle, ktorý sa preruší pri ukončení programu. Nepracuje nepretržite, ale pracuje len keď je zavolané z rozpoznávacieho vlákna. To nastane, až keď sa nastaví správna snímka do Tesseract enginu všetkých vlákien. Po zavolaní si každé vlákno vypočíta oblasť, ktorú bude rozpoznávať. Po nastavení tejto oblasti do Tesseract enginu rozpoznanie prebieha rov- nako ako bolo opísané. Jediná odlišnosť je ukladanie informácií o texte, dôveryhodnosti textu a jeho pozícii do premennej word. Štruktúru word používam v celom programe pre prácu s týmito premennými. Na záver každé vlákno uloží nájdené štruktúry word do premennej dostupnej z rozpoznávacieho vlákna a zahlási, že skončilo. Keď skončí aj posledné z týchto vlákien, rozpoznávacie vlákno pokračuje v spra- covaní.

4.2 Oddelenie rozpoznania od spracovania snímky

Pri oddelení rozpoznávacieho vlákna Tesseractu od spracovania snímky v UltraGride som použil len jedno nové vlákno, ktoré dostáva snímky z hlavného vlákna prostredníctvom fronty, ako je možné vidieť na obrázku 4.1. Na obrázku 4.4 je ukázané aké funkcie vykonávajú jednotlivé vlákna. Ako je vidieť, musel som vyriešiť, čo sa má urobiť so snímkou v hlavnom vlákne v prípade, keď príde na spracovanie nová neznáma snímka. Čakanie na rozpoznanie snímky je neefektívne, lebo zdržanie je rovnako veľké ako v prípade, keď rozpoznávanie vykonávalo hlavné vlákno. Na základe toho som vybral dve možnosti, ktoré môže môj modul vykonať. Prvá je jednoduchá, snímka sa pošle neanonymizo- vaná. Toto riešenie nie je najvhodnejšie v situáciách, v ktorých má

24 4. Akcelerácia spracovania

Obr. 4.4: Diagram spracovania snímky jednotlivými vláknami

každý pacient zostať anonymný. Systém, ktorý som navrhol, sa do- káže naučiť rozpoznávať všetky modality. Keď mám všetky modality klasifikované a rozpoznané, tak snímky spracovávam len vo vlákne Main thread z obr. 4.4, ktoré beží v reálnom čase. Vzhľadom na to som vytvoril druhú možnosť – anonymizovať celý snímok. V kapitole 8 sú uvedené namerané časy anonymizovania pár malých oblastí a anonymizácia celej snímky. Anonymizácia celej snímky je výkonnostne náročnejšia. Zároveň na testovanom počítači nebola dostatočne rýchla pre video vo vysokom rozlíšení s frekvenciou 60 snímok za sekundu. Táto anonymizácia celej snímky sa realizuje práve v čase, keď prebieha rozpoznávanie snímky, ktoré je tiež náročné na výkon. V snahe predísť takýmto situáciám je možné pred prenosom za- pnúť UltraGrid s mojím modulom a pustiť cez neho všetky modality, ktoré sa budú počas prenosu používať. Tým sa zaistí, že počas pre- nosu nenastane situácia, keď bude musieť môj modul rozpoznávať novú snímku. Pri častých alebo pravidelných prenosoch tým vzniká zbytočná práca. Na základe toho som sa rozhodol pridať do môjho modulu možnosť uloženia rozpoznaných snímok. Ukladám ich do JSON súborov [12] tak, aby boli ľudsky čitateľné. Týmto spôsobom je možné tieto súbory ručne upravovať. To je užitočné v prípadoch, keď Tesseract nesprávne rozpozná text, ktorý sa má anonymizovať, alebo keď sa rozpozná meno doktora a tiež sa anonymizuje. Na zjed-

25 4. Akcelerácia spracovania nodušenie týchto úprav som pridal aj možnosť ukladať rozpoznanú snímku pre lepšiu kontrolu miest, ktoré majú byť anonymizované. Tieto snímky majú slúžiť len ako dočasné pomôcky a nie sú určené na skladovanie, lebo obsahujú informácie, ktoré sa snažíme anonymizo- vať. Vychádzam z predpokladu, že s týmito obrázkami budú pracovať len oprávnené osoby.

26 5 Klasifikácia snímky

V úvode práce som načrtol problém klasifikovania snímok. Dve snímky, ktoré sú podobné, majú byť rozpoznané ako rovnaké a snímky, ktoré sú viac odlišné, rozpoznať ako rôzne. Existuje viacero možných metód pre túto činnosť. Scale Invariant Feature Transform (SIFT)[13] je algoritmus, ktorý rozpozná a popíše lokálne znaky snímky. Podobne funguje aj algorit- mus Speeded-Up Robust Features (SURF)[14]. V našom prípade sa ukázalo, že tieto dva algoritmy nefungujú vždy najlepšie. Na obrázku 5.1 je vidieť dve snímky z jedného prístroja s rozdielnym zobrazením nástrojov a s iným pacientom. Pomocou metódy SIFT sa rozpoznalo len málo spoločných znakov nato, aby mohli byť považované za rov- naké. Aj keď bežnému človeku by sa mohli javiť ako rovnaké. Vzhľa- dom na tento fakt tieto dva algoritmy nie sú vhodnými kandidátmi pre použitie v tejto úlohe.

Obr. 5.1: Nájdenie znakov pomocou SIFT algoritmu na dvoch podob- ných snímkach

Ďalšie metódy, ktoré by sa dali použiť sú založené na neurónových sieťach. Tieto metódy dokážu byť veľmi presné a rýchle. Nevýhoda týchto metód spočíva v učení. Nato, aby sa neurónová sieť dostatočne naučila, je potreba tisícky rôznych snímok. Toto je nielen náročné za- bezpečiť, ale tieto snímky obsahujú osobné údaje, takže by bol problém aj s ukladaním snímok pre učenie. Dostať sa k dostatočnému počtu snímok nie je jediný problém vyskytujúci sa pri týchto metódach. V

27 5. Klasifikácia snímky prípade, keď systém dostane novú modalitu, na ktorú nie je naučený, nie je isté, že ju rozpozná správne. S ohľadom na tieto problémy som nepoužil metódy založené na neurónových sieťach. Metóda, ktorú som si nakoniec vybral a aj použil, je porovnávanie histogramov. Histogram obrázku je typ histogramu, ktorý reprezentuje tónovú (farebnú) distribúciu v obrázku. Histogram je relatívne odolný voči transformáciám, ako napríklad zväčšovanie, zmenšovanie alebo rotácia. Pre výpočet a porovnávanie histogramu používam knižnicu s náz- vom OpenCV [15]. Histogram počítam z každej zložky RGB snímky. Pre každú farbu rozlišujem 256 rozdielnych hodnôt. Výsledné zložky skombinujem do jedného histogramu obsahujúceho 762 hodnôt a na záver celý histogram znormalizujem, preto veľkosť pôvodnej snímky nemá na výsledný histogram výrazný vplyv. Výsledný histogram je uložený v pamäti počítača ako matica floatov s rozmermi 256x3. Pre porovnávanie histogramov existuje v knižnici OpenCV fun- kcia, ktorá berie ako argument okrem dvoch histogramov aj metódu, pomocou ktorej má porovnať dva histogramy. Existujú 4 rôzne me- tódy na porovnanie histogramov. Prvá je korelačná metóda, druhá je metóda Chi-Square, tretia je intersection a štvrtá je Bhattacharyya vzdialenosť. V nasledujúcich rovniciach platí H1 a H2 sú jednotlivé histogramy, d(H1, H2) je metrika porovnania týchto dvoch histogramov a N je celkový počet histogramových košov.

Korelačná metóda je vyjadrená rovnicou 5.1, kde platí rovnica 5.2. Táto metóda vracia hodnotu < 0.0, 1.0 >. V prípade porovnania dvoch rovnakých obrázkov vráti hodnotu 1.0. Túto metódu som zvolil pre porovnávanie histogramov v mojom module. Ak je hodnota porov- nania dvoch histogramov menšia ako 0.97, tak prehlásim snímky, z ktorých tieto dva histogramy vznikli, za rozdielne.

Metóda Chi-Square je vyjadrená rovnicou 5.3. Porovnanie dvoch identických obrázkov vráti hodnotu 0.0. Je náročnejšie určiť hranicu, kedy ešte chybu akceptujeme a kedy už snímku prehlásime za ne- rozpoznanú. Zároveň je viac náchylnejšia na väčšie lokálne zmeny v histograme. Napríklad keď sa na snímke objaví žltá ikona, pri čom

28 5. Klasifikácia snímky

na predchádzajúcej snímke nebola, táto metóda vráti pri porovnaní histogramov veľký rozdiel.

Intersection metóda je vyjadrená rovnicou 5.4. Rovnako ako v pred- chádzajúcej metóde, aj v tejto je náročnejšie určiť hranicu akceptovania snímok ako podobných.

Metóda Bhattacharyyovej vzdialenosti je metóda vyjadrená rovni- cou 5.5. Pri porovnaní identických histogramov vráti hodnotu 0.0. Nezvolil som ju, lebo korelačná metóda lepšie reagovala na zmeny histogramu.

∑I(H1(I) − H¯1)(H2(I) − H¯2) d(H1, H2) = (5.1) p2 2 2 ∑I(H1(I) − H¯1) ∑I(H2(I) − H¯2)

¯ 1 Hk = ∑ HK(J) (5.2) N J

2 (H1(I) − H2(I)) d(H1, H2) = ∑ (5.3) I H1(I)

d(H1, H2) = ∑ min(H1(I), H2(I)) (5.4) I s 1 q 2 2 d(H1, H2) = 1 − H1(I) · H2(I) (5.5) p2 2 ∑ H¯1H¯2N I Ako malú optimalizáciu pri vyhľadávaní, či novo vypočítaný his- togram je podobný už uloženému histogramu, začíname porovnávať histogramy od posledného uloženého po prvý uložený. Vychádzame z predpokladu, že snímky prichádzajúce za sebou si budú podobné, takže po tom, čo sa snímka rozpozná, všetky snímky, ktoré prídu a budú podobné naposledy rozpoznanej snímke, sa budú porovnávať len s jedným histogramom. Jedno porovnanie dvoch histogramov je veľmi rýchle, ako je uvedené v kapitole 8, preto má táto optimalizácia len malý dopad na celkovú rýchlosť.

29 5. Klasifikácia snímky 5.1 Ukladanie a načítanie histogramu

Ako uvádzam v podkapitole 4.2, rozhodol som sa ukladať histogramy a informácie o miestach, ktoré treba anonymizovať na snímkach s podobným histogramom. Po celý čas fungovania môjho modulu je každý histogram uložený ako openCV matica reálnych čísel. Pre potrebu textového uloženia je tento formát nevhodný. Zaberá príliš veľa miesta v súbore, tým ho viac zneprehľadňuje a zaroveň čas na načítanie a zápis sa tým tiež predĺži. Na základe toho som použil na skrátenie zápisu histogramu integer coding a potom vlastnú metódu na zakódovanie do textovej podoby. Metóda integer coding spočíva v tom, že sa reálne čísla vynásobia konštantným celým väčším číslom a následne sa zaokrúhlia na celé číslo. Dekódovanie prebieha opačne, celé čísla sa delia rovnakým väč- ším číslom, akým boli reálne čísla násobené. Touto metódou sa stratí časť presnosti histogramu, ale z dôvodu, že histogramy nemusia byť identické, ale môžu byť mierne odlišné, strata presnosti, ak nie je príliš veľká je v poriadku. Experimentálne som zistil, že pri konštante, kto- rou násobím 10000 a veľkosti obrazu 1280x1047, nedochádza k strate presnosti. Pri porovnávaní originálneho histogramu a histogramu, ktorý bol spracovaný integer codingom s konštantou 1000, som na- meral 99.998% vzájomnú zhodu. Chyba, ktorá nastane zavedením s použitím konštanty 1000, je maximálne 0.01%. Túto chybu v situácii, kedy považujem snímky za rovnaké, ak sa líšia menej ako 3%, môžeme považovať za zanedbateľnú. Metóda pre kódovanie do textovej podoby zmení každú hodnotu histogramu na sekvenciu písmen. Všetky sekvencie písmen končia malým písmenom, ostatné písmená sú veľké. Vďaka tomu sa dá určiť, kde končí jedna sekvencia a kde začína ďalšia bez toho, aby sa musel použiť oddeľovací znak. Na záver tieto sekvencie zjednotím do jedného reťazca. Pre zovšeobecnenie sa na začiatok vloží rozmer matice his- togramu, z ktorej bol reťazec vyrobený, v našom prípade to je 256x3. Výsledný reťazec môže vyzerať napríklad “256x3LObAPbDObPi...... IbMbXbdfxjcFm”. Pri načítaní dekódovanie funguje presne opačne ako pri kódovaní. Každé písmeno v sekvencii má hodnotu rovnú vzdialenosti od písmena “a” v anglickej abecede, napríklad “a” má hodnotu 0 a “d”

30 5. Klasifikácia snímky

má hodnotu 3. Táto hodnota je vynásobená číslom 25 umocneným na pozíciu v sekvencii číslovanej od 0. Kapitalizácia písmena nemá vplyv na jeho hodnotu. Na ukážku uvádzam pár príkladov: sekvencia LOb = 986, jednotlivé znaky v nej majú nasledovné hodnoty L = 11 * 250, O = 14 * 251, b = 1 * 252 a v súčte 11 + 350 + 625 = 986. Podobne aj pri sekvenciiAPb = 1000; A = 0 * 250, P = 15 * 251, b = 1 * 252v súčte 0 + 375 + 625 = 100

31

6 Sémantické spracovanie

Dôležitou časťou mojej práce bolo vybrať z rozpoznaného textu ten, ktorý má byť anonymizovaný. Tesseractom rozpoznaný text nemusí byť rozpoznaný vždy správne. Vzhľadom na to nie je jednoduché určiť, ktorý text je osobný údaj. To, či je daný text meno, rodné číslo alebo dátum, sa určuje rôznym spôsobom. Na základe toho som použil inú metódu na rozpoznanie mien ako metódu určenú na rozpozna- nie osobných údajov obsahujúcich čísla, ktoré majú oproti menám relatívne pevnú podobu. V predchádzajúcich kapitolách som opísal, že z Tesseractu získam: informácie o texte; pravdepodobnosť s akou je daný text správne rozpoznaný zo snímky; informácie o pozícii textu na snímke a jeho veľkosti. Predprípravou určovania toho, čo reprezentuje daný text, je úp- rava bielych znakov. Pri rozpoznávaní Tesseract občas vráti viacero medzier a na koniec každého textu pridá znak nového riadku. Z tohto dôvodu je potrebné upraviť všetky texty tak, aby neobsahovali znaky tabulátorov ani nových riadkov a aby neobsahovali viacero medzier za sebou. Takýmto spôsobom zjednotím všetky rozpoznané texty na jeden formát. Jednotlivé metódy rozpoznávania bližšie popíšem v nasledujúcich podkapitolách.

6.1 Rozpoznávanie dátumov a rodných čísiel

Pri rozpoznávaní toho, či je daný text dátum alebo rodné číslo, som po- užil Levenshteinovu vzdialenosť voči regulárnemu výrazu. Levensh- teinova vzdialenosť [16] je metrika merania vzdialenosti medzi dvomi reťazcami. Umožňuje 3 rôzne operácie: vloženie, vymazanie a zámenu jedného znaku. V mojom module som použil modifikovaný algorit- mus z článku The String-to-String Correction Problem [17]. V tomto článku je algoritmus pomenovaný ako AGLORITHM X. Pomocou re- gulárnych výrazov sa dajú jednoducho popísať osobné údaje, ktoré potrebujem vyhľadať. Levenshteinova vzdialenosť slúži len k tomu, aby som dokázal určiť to, či daný rozpoznávaný text zodpovedá regu- lárnemu výrazu, teda osobným údajom pacienta a to aj v prípade, že rozpoznávaný text obsahuje chyby.

33 6. Sémantické spracovanie

Môj zjednodušený regulárny výraz, oproti ktorému počítam Le- venshteinovu vzdialenosť, môže obsahovať znaky \d, \D, \a, \A, \s a \p. Znaky \d a \D reprezentujú čísla. Veľké \D značí, že sa vo výraze musí vyskytovať číslo. Malé \d značí, že sa vo výraze na tomto mieste môže vyskytovať číslo. Znaky \a, \A reprezentujú písmená a význam kapitalizácie je rovnaký ako pri číslach. \s reprezentuje biele znaky a \p reprezentuje interpunkčné znaky. Matematicky zapísaná mnou upravená Levenshteinova vzdiale- nosť medzi textom a a mojím zjednodušeným regulárnym výrazom b

(s dĺžkou |a| a |b|) je daná lev_rega,b(|a|, |b|) kde: lev_rega,b(i, j) = levtrans(a),b(i, j) kde: a je rozpoznávaný text; b je regulárny výraz; trans(a) trans- formuje text do hodnoty regulárneho výrazu podľa typu znaku. Rozli- šujem 4 základné typy: písmeno, číslo, medzera a interpunkčný znak. Čísla sa transformujú na znak \d, písmená sa transformujú na znak \a, medzery sa transformujú na znak \s a interpunkčné znaky sa trans- formujú na znak \p. Ponúkam ukážku fungovania tejto funkcie: text „Jar.55 13“ sa transformuje na „\a\a\a\p\d\d\s\d\d“. Transformá- cia textu do regulárneho výrazu mi umožňuje pracovať s chybami v rozpoznávanom texte bez toho, aby som ich musel popisovať v rámci regulárneho výrazu pre príslušný osobný údaj pacienta.

 max(i, j) ak min(i, j) = 0,     levc,b(i − 1, j) + w1(ci) levc,b(i, j) =  min levc,b(i, j − 1) + w2(bj) inak,      levc,b(i − 1, j − 1) + w3(ci, bj)

kde: w1(ci) je funkcia, ktorá vráti hodnotu ceny za preskočenie transformovaného znaku ci; w2(bj) je funkcia, ktorá vráti hodnotu ceny za preskočenie typu regulárneho výrazu bj; w3(ci, bj) je funkcia, ktorá vráti hodnotu ceny za zámenu transformovaného znaku ci a regulárneho výrazu bj. Jednotlivé hodnoty s ktorými pracujem sú uvedené v tabuľkách 6.1, 6.2 a 6.3. Pre identifikáciu dátumov používam regulárny výraz v tvare: „\D\d\p\D\d\p\D\D\d\d“ a pre rodné čísla regulárny výraz vy- zerá takto: „\D\D\D\D\D\D\p\D\D\d\d“. Pri rozpoznaní dá-

34 6. Sémantické spracovanie

\D \A \p \s \d \a 3 3 2 1 0 0

Tabuľka 6.1: Tabuľka hodnôt vymazania písmena \d \a \p \s 3 3 2 1

Tabuľka 6.2: Tabuľka hodnôt pridania písmena letter type/regex -> \d,\D \a,\A \p \s \d 0 2 2 3 \a 2 0 2 3 \p 2 2 0 2 \s 3 3 2 0

Tabuľka 6.3: Tabuľka hodnôt porovnania typov

tumu skontrolujem, či rok dátumu nie je aktuálny rok. Takto rozlíšim medzi dátumom zákroku a dátumom narodenia pacienta.

6.2 Rozpoznávanie mien

Metóda použitá pri rozpoznávaní dátumov a rodných čísel by pri roz- poznávaní mien dokázala rozhodnúť iba či je text zložený z písmen. Pre rozpoznanie toho, či je daný text meno, je potrebné vyhľadávanie v slovníku. Takýto slovník obsahujúci všetky mená som už vytvoril pre zostavenie jazyka Tesseractu. Na jeho využitie sa ponúkalo niekoľko možností. Prvá bola implementovať vlastnú štruktúru a jej funkci- onalitu a naplniť ju súborom mien. Druhou možnosťou bolo použiť jednu z voľne dostupných knižníc s funkcionalitou slovníka. A treťou možnosťou bolo použiť Tesseract engine a jednu z jeho funkcií, ktorá vráti informáciu o tom, či je daný text slovom v aktuálne používanom jazyku Tesseractu. Rozhodol som sa pre tretiu možnosť. Dôvodom výberu bola jej implementácia, ktorá bola najjednoduchšia a ako jediná nespôsobí duplikáciu slovníka v pamäti. V rámci toho, že Tesseract využíva štruktúru DAWG, rýchlosť vyhľadávania je veľmi vysoká. V

35 6. Sémantické spracovanie prípade, ak text obsahuje meno a je ukončené čiarkou, bodkou alebo iným interpunkčným znakom, text je považovaný za súčasť jazyka – za meno. Niektoré rozpoznané mená majú nesprávne rozpoznané začia- točné písmeno. Namiesto veľkého písmena Tesseract rozpozná malé. Časté znaky, pri ktorých sa to stáva sú: o,s, alebo c. Slovník v Tesseracte rozlišuje medzi veľkými a malými písmenami. Ak by som upravil slov- ník tak, aby obsahoval aj mená začínajúce malým písmenom, došlo by k zbytočnému zdvojnásobeniu veľkosti slovníka. Vzhľadom na to pred každým vyhľadaním v slovníku upravím vyhľadávaný text do vzoru mena s veľkým začiatočným písmenom nasledovaným malými. Pri rozpoznávaní niektorých modalít Tesseract vrátil ako jedno slovo meno spojené s priezviskom. V tomto prípade zle rozpoznal medzeru alebo čiarku spojenú s medzerou. Na základe toho som metódu na identifikáciu mien upravil. V prípade, ak text nie jemeno a obsahuje aspoň 8 znakov, vyskúša všetky možnosti jeho rozdelenia na dve časti o minimálnej dĺžke 4 znaky. Ak pri jednom rozdelení obidve časti rozpozná ako súčasť jazyka, prehlásim aj takýto text za meno. Dĺžky textu 8 a 4 znaky som zvolil, aby som predišiel zlej identifikácii textov, ktoré nie sú mená. Ak by som požadoval, aby časti textu mali aspoň 5 znakov, prestala by táto metóda fungovať pre niektoré kratšie krstné mená, ako napríklad Petr. Pri požadovaní minimálnej dĺžky pre jednu rozdelenú časť menej ako 4 znaky začne metóda nesprávne identifikovať slová, ktoré nie sú mená tak, ako keby nimi boli. Je to spôsobené veľkým množstvom krátkych a nezvyčajných mien nachádzajúcich sa v Českej republike.

6.3 Chyby pri identifikácii osobných údajov

V tejto podkapitole uvediem časté chyby, ktoré nastávajú pri rozpoz- návaní a identifikácii. Následne navrhnem rôzne spôsoby, ako týmto chybám predísť. Niektoré chyby rozpoznania sa nemusia prejaviť ako chyby. Na- príklad v prípade, kde sa nesprávne rozpozná meno a Tesseract ho vráti mierne pozmenené. Môže nastať situácia, že aj pozmenený text je meno. Toto meno je iné ako je v modalite, ale je uložené v slovníku. V takýchto prípadoch proces prebehne rovnako, ako keby bolo meno

36 6. Sémantické spracovanie

správne rozoznané. Táto situácia môže nastať vďaka tomu, že slovník obsahuje veľké množstvo rôznych mien. Veľký počet mien v slovníku ale spôsobuje chyby pri správnom rozpoznaní. Napríklad meno Rao sa v niektorých medicínskych mo- dalitách vyskytuje ako skratka. To spôsobí anonymizáciu tohto slova aj v prípade, kedy by sa nejednalo o meno. Chyba pri identifikácii dátumu nastane, keď je mesiac v dátume zapísaný slovne. Takýmto zápisom býva zvyčajne zapísaný aktuálny deň, preto jeho nesprávna identifikácia nespôsobuje prehliadnutie pacientovho dátumu narodenia. Pri slovných skratkovitých zápisoch mesiacov vzniká ďalšia chyba. Mesiace január, júl a jún v skrátenom anglickom zápise spôsobia, že sa tieto časti textu identifikujú ako mená. Rozpoznávanie slov Tesse- ractom v tejto oblasti nepomáha. Najčastejšie takýto dátum rozpozná rozdelený na jednotlivé zložky. Riešení týchto problémov je viacero, ale každé obsahuje svoje ne- gatíva. Pre výber najlepšieho riešenia je podľa môjho názoru potreba dlhodobejšieho testovania a diskusia so študentami doktorandského štúdia a ľuďmi, ktorí budú tento systém používať. Napríklad riešením identifikácie slov vyskytujúcich sa v slovníku ale v modalite nereprezentujúcich meno môže byť ich vymazanie zo slovníka. V tomto prípade je potrebné presne vedieť, ktoré slová sa budú v modalitách vyskytovať, ktoré mená musia byť zo slovníka odstránené, ako postupovať v prípade, keď pacient bude mať jedno z takýchto vymazaných mien. Druhým riešením je vytvorenie databázy slov, ktoré sa nemajú anonymizovať. Týmto riešením sa dá napríklad zabrániť aj anonymizácii mena doktora. Nevýhodou tohto prístupu je potreba upravovať túto databázu pre každý prenos. Riešením zlej identifikácie dátumov s mesiacom zapísaným slovne môže byť pridanie regulárnych výrazov na vyhľadávanie konkrétnych formátov zápisu dátumov. Pre prípady, v ktorých sú jednotlivé časti dátumu rozpoznané samostatne je riešením funkcia, ktorá rozhodne, či sú časti textu dostatočne blízko seba. Pri takomto riešení sa výrazne zvýši možnosť nesprávnej identifikácie častí, ktoré nie sú dátumami. Pri mojich testovacích prípadoch tieto chyby neboli tak časté, aby si vyžadovali okamžité riešenie. Súčasné riešenie spočíva v manuálnej kontrole a oprave zle rozpoznaných chýb v uloženom súbore vytvo-

37 6. Sémantické spracovanie renom pri príprave. Tento súbor sa dá následne využiť aj pre ďalšie prenosy rovnakých medicínskych modalít.

38 7 Implementácia anonymizácie

Anonymizáciu som implementoval pomocou jednoduchej pixelizácie. V Ultragride som vytvoril osobitný modul Pixelization, ktorému sa zadá: pozícia, od ktorej má začať; veľkosť oblasti, ktorá má byť pixeli- zovaná; veľkosť jedného nového pixelu v tejto oblasti. V module, ktorý vyhľadáva a anonymizuje osobné údaje pacientov, som využil hlavnú funkcionalitu pixelizovacieho modulu. Po úspešnom vyhľadaní oblastí, ktoré obsahujú osobný údaj pa- cienta, sú tieto oblasti uložené spolu s histogramom snímky. Po prí- chode novej snímky, ktorá sa určí ako už rozpoznaná, sa tieto oblasti získajú a na každú sa zavolá funkcia pixelizácie. Ak nový pixel presa- huje za okraj snímky, tak nie je spracovaný. Funkcia pixelizácie vypočíta priemernú farbu nového pixelu a nastaví ju všetkým pixelom v tejto oblasti. Z dôvodu, že v OpenCV neexistuje pre túto operáciu funkcionalita, výpočet sa vykonáva na procesore.

Obr. 7.1: Ukážka anonymizácie celého obrazu

39 7. Implementácia anonymizácie

Obr. 7.2: Ukážka anonymizácie osobných údajov

Na obrázku 7.1 je anonymizovaný celý obraz. Nové pixely sú 20- krát väčšie ako pôvodné. Obrázok 7.2 má anonymizované len miesta, ktoré obsahujú osobné údaje. Tieto miesta sú v ľavom hornom rohu.

40 8 Vyhodnotenie spracovania

V tejto kapitole budem popisovať namerané rýchlosti jednotlivých častí môjho modulu. Všetky testy výkonu som robil na počítači s procesorom Intel i7-3770 s frekvenciou 3.4 GHz, s grafickou kartou Nvidia GTX 960 a operačným systémom Ubuntu 16.4 LTS 64-bit. Časy v mojom module som meral pomocou funkcie chrono::steady_clock::now(). Táto funkcia vracia monotónny reálny čas. Z toho dôvodu sú uvedené časy rovnaké ako ich pociťuje užívateľ. Knihovňa chrono je súčasťou štandardu C++11 a implementuje najp- resnejší spôsob merania na danom zariadení. Pre meranie časov som pridal užívateľské nastavenie s názvom debug_info, ktoré umožňuje v mojom module vypisovať informácie o aktivitách a o časoch. Hlavným cieľom mojej práce bolo zaručiť, aby UltraGrid s mojím modulom dokázal spracovávať video vo vysokom rozlíšení s frekven- ciou 60 snímok za sekundu. Z toho vyplýva, že spracovanie jednej snímky nesmie trvať dlhšie ako 16.6 ms. Na základe toho začnem celkovou rýchlosťou spracovania jednej snímky. Tu rozlíšim 3 prípady. Prvý je spracovanie už rozpoznanej snímky, druhý je spracovanie nerozpoznanej snímky s anonymizáciou celého obrazu a posledný je spracovanie nerozpoznaného obrazu bez anonymizácie. Z tabuľky 8.1 je zreteľné, že variant anonymizácie celej snímky je veľmi pomalý a na tomto prístroji by neumožnil prenos podľa požiadaviek. Pri meraní času samotnej pixelizácie zaznamenanom v tabuľke 8.2, je evidentné, že pixelizovanie celej snímky je približne rovnaké ako čas na spracovanie celej snímky. Následne som meral čas, za ktorý sa rozpozná text na snímke. Tesseract rozpozná text na rôznych snímkach za iný čas. Ak je na snímke viac textu alebo potenciálneho textu, spracovanie zaberie viac času. Nezrovnalosti medzi týmito časmi spôsobili veľké smerodajné odchýlky znázornené v tabuľke 8.3. Pre porovnanie uvádzam, ako sa zvyšuje rýchlosť s použitím viacerých vlákien. Toto meranie bolo tvorené pri škálovaní snímok na dvojnásobnú veľkosť. Najviac času v celom procese vyhľadávania osobných údajov na snímke zaberie samotné rozpoznanie snímky pomocou Tesseractu. V porovnaní so samotným rozpoznaním predspracovanie aj sémantické

41 8. Vyhodnotenie spracovania

priemerný čas smerodajná počet [ms] odchýlka meraní [ms] rozpoznaná snímka 8.9 0.1 23 nerozpoznaná 26.3 2.6 23 snímka a anony- mizácia celej snímky nerozpoznaná 9.0 0.1 23 snímka bez ano- nymizácie celej snímky

Tabuľka 8.1: Meranie času spracovania jednej snímky

priemerný čas smerodajná počet [ms] odchýlka meraní [ms] 4 malé oblasti 0.1 0.01 102 7 malých oblastí 0.2 0.01 148 celá snímka 18.2 3.1 152

Tabuľka 8.2: Meranie času pixelizácie spracovanie zaberie veľmi malý čas. V tabuľke 8.4 sú uvedené časy predspracovania a sémantického spracovania. Častou operáciou je vytvorenie nového histogramu a jeho porov- nanie. Časy týchto operácií sú v tabuľke 8.5. V tejto tabuľke je uvedené porovnanie jednej dvojice histogramov. Pri vyhľadaní už rozpoznanej snímky s podobným histogramom môže prebehnúť niekoľko porov- naní. Počet maximálnych porovnaní závisí na počte rozpoznaných snímok, ten spravidla nebude väčší ako 20. Celkový čas spracovania jednej snímky je 9.0 ± 0.2 ms, okrem času pri anonymizácii celej snímky (1080p), kedy spracovanie trvá 26.3 ± 2.6 ms. Doba, za ktorú sa rozpozná snímka a začne sa anonymizovať, je závislá na počte textov na snímke, ale priemerný čas tejto operácie je 1.39 ± 0.53 sekundy s použitím 8 vlákien.

42 8. Vyhodnotenie spracovania

počet vlákien priemerný čas smerodajná počet [s] odchýlka meraní [s] 1 3.37 1.56 30 2 2.21 0.98 30 4 1.44 0.48 30 8 1.38 0.53 30

Tabuľka 8.3: Meranie času rozpoznania jednej snímky

priemerný čas smerodajná počet [ms] odchýlka meraní [ms] predspracovanie 11.2 5.4 19 sémantické spracovanie 1.3 0.4 20

Tabuľka 8.4: Meranie času predspracovania a sémantického spracova- nia pri vyhľadávaní osobných údajov na snímke

priemerný čas smerodajná počet [ms] odchýlka meraní [ms] vytvorenie histogramu 0.6 0.06 50 porovnanie jednej dvoj- 0.01 0.004 50 ice histogramov

Tabuľka 8.5: Meranie času vytvorenia histogramov a ich porovnania

43

9 Záver

Cieľom mojej práce bolo navrhnúť a vytvoriť modul pre program Ul- traGrid, ktorý bude vyhľadávať na snímkach z medicínskych modalít osobné informácie pacienta a anonymizovať ich. UltraGrid s mojím modulom mal dokázať spracovať video vo vysokom rozlíšení s frek- venciou 60 snímok za sekundu. Cieľ mojej práce som splnil. Vytvoril som modul v jazyku C++, ktorý využíva knižnicu Tesseract OCR a knižnicu OpenCV. Knižnicu Tesseract OCR som použil na rozpoznanie textu na spracovávanej snímke. Knižnicu OpenCV som aplikoval na spracovávanie snímok a ich klasifikáciu. Pre zlepšenie rozpoznávania textu som vytvoril vlastný jazyk pre Tesseract so slovníkom, ktorý obsahuje všetky mená vyskytujúce sa v Českej republike. Na dosiahnutie lepšej rýchlosti rozpoznávania som ho paralelizoval. Aj rýchlosť paralelizovaného roz- poznávania bola násobne pomalšia ako bolo zadané v požiadavkách na túto prácu, preto som oddelil rozpoznávanie snímky od jeho spra- covania. Pridal som možnosť anonymizovať celú snímku v prípade, že ešte nie je rozpoznaná. Vytvoril som dve metódy na identifikáciu osobných údajov. Prvú pre rodné čísla a dátumy, druhú pre mená. Na testovacích snímkach funguje vyhľadávanie textu na snímkach dostatočne. Pre anonymizovanie už rozpoznaných osobných údajov som vytvoril funkciu pre ich pixelizáciu. Pixelizácia pri anonymizo- vaní celej snímky na testovanom počítači mala problém dosiahnuť požadovanú rýchlosť spracovania. V texte tejto práce som opísal dôvod, pre ktorý som si zvolil kniž- nicu Tesseract. Vysvetlil som spôsob, ako pripraviť obraz na rozpozná- vanie a ako sa pomocou Tesseractu dá rozpoznať text v obrázku. Vy- svetlil som, na čo slúži jazyk v programe Tesseract a ako som vytvoril vlastný. Pokračoval som popisom rozdelenia programu do viacerých vlákien a rozdelenie funkcionality medzi nimi. V nasledujúcej kapitole som priblížil, akým spôsobom klasifikujem jednotlivé snímky a ako ich porovnávam. Spôsob, akým identifikujem, či je rozpoznaný text osobný údaj, som opísal v prílohe B užívateľké nastavenia. V predpo- slednej kapitole som uviedol rýchlosti jednotlivých častí programu. Pri rozpoznávaní niektorých modalít dochádza občas k nespráv- nemu rozpoznaniu. Tieto chyby sú spôsobené nedostatočným kontras-

45 9. Záver tom textu, zašumením pozadia alebo iným vplyvom. Vzhľadom na to by som odporúčal v situáciach, kde je požadovaná úplná anonymizá- cia všetkých osobných údajov pacienta, použiť možnosť uložiť uloženia a načítania informácií o miestach, ktoré sa majú anonymizovať v už rozpoznaných snímkach a manuálnu kontrolu týchto informácií. Ďalšie pokračovanie tejto práce predstavuje implementáciu niekto- rých z možností na zlepšenie identifikácie rozpoznaného textu, ktoré som spomenul v časti 6.3. Metóda zlepšenia bude závisieť na diskusii so študentmi doktorandského štúdia a ďalšími osobami, ktoré plánujú môj modul využívať. Ďalšia možnosť na rozšírenie môjho modulu je pridať detekciu ľudských tvárí a častí tela. Týmto spôsobom by sa dali anonymizovať časti pacienta, ktoré pre daný zákrok nie sú dôležité. V tomto prípade by bolo treba rozlišovať tváre pacientov od tvárí doktorov, ktorí zvy- čajne majú na tvárach rúška. Zároveň by bolo vhodné pokúsiť sa aj o anonymizáciu jednotlivých časti tela, ktoré sa v priebehu zákroku môžu mimovoľne odokryť.

46 Bibliografia

1. Európska charta práv pacientov [online]. Ministerstvo zdravotníctva Slo- venskej republiky, 2008 [cit. 2017-20-04]. Dostupné z: http://www. health.gov.sk/Clanok?europska-charta-prav-pacientov. 2. CESNET [online]. CESNET, 1996—2016 [cit. 2017-16-03]. Dostupné z: https://www.cesnet.cz. 3. UltraGrid [online]. CESNET [cit. 2017-20-04]. Dostupné z: http://www. ultragrid.cz. 4. GOCR [online] [cit. 2017-08-05]. Dostupné z: http://jocr.sourceforge. net. 5. SwiftOCR [online] [cit. 2017-08-05]. Dostupné z: https : / / github . com/garnele007/SwiftOCR. 6. Asprise [online] [cit. 2017-08-05]. Dostupné z: https://asprise.com/ royalty- free- library/ocr- api- for- java- csharp- vb.net. html. 7. ABBYY FineReader [online] [cit. 2017-08-05]. Dostupné z: http://www. abbyy.cz/finereader/vt-lp/?utm_source=google&utm_medium= cpc&utm_campaign=cz_fr_brand&utm_content=offer&network= g & placement = &position = 1t1 & adid = 188920406544 & match = b & ;utm_term=abbyy%20finereader&gclid=CMaKyszv4tMCFRO3Gwod77ULag. 8. Ocrad [online] [cit. 2017-08-05]. Dostupné z: https://www.gnu.org/ software/ocrad/. 9. Linux OCR Software Comparison [online] [cit. 2017-16-05]. Dostupné z: https://www.splitbrain.org/blog/2010-06/15-linux_ocr_ software_comparison. 10. Četnost jmen a příjmení [online] [cit. 2017-06-05]. Dostupné z: http:// www.mvcr.cz/clanek/cetnost-jmen-a-prijmeni-722752.aspx. 11. BALÍK, Miroslav. Implementation of directed acyclic word graph. Kybernetika. 2002, roč. 38, č. 1, s. [91]–103. Dostupné tiež z: http: //www.kybernetika.cz/content/2002/1/91. 12. Introducing JSON [online] [cit. 2017-14-05]. Dostupné z: http://www. json.org.

47 BIBLIOGRAFIA

13. LINDEBERG, T. Scale Invariant Feature Transform. Scholarpedia. 2012, roč. 7, č. 5, s. 10491. Dostupné z DOI: 10.4249/scholarpedia.10491. revision #153939. 14. BAYA, Herbert; ESSA, Andreas; TUYTELAARSB, Tinne; VAN GO- OLA, Luc. Speeded-up robust features (SURF). Computer vision and image understanding. 2008, roč. 110, č. 3, s. 346–359. 15. OpenCV [online] [cit. 2017-20-04]. Dostupné z: http://opencv.org. 16. Levenshtein distance [online] [cit. 2017-15-05]. Dostupné z: https://en. wikipedia.org/wiki/Levenshtein_distance. 17. WAGNER, Robert A.; FISCHER, Michael J. The String-to-String Correc- tion Problem. J. ACM. 1974, roč. 21, č. 1, s. 168–173. ISSN 0004-5411. Dostupné z DOI: 10.1145/321796.321811. 18. HOLUB, Petr et al. High-definition multimedia for multiparty low- latency interactive communication. Future Generation Computer Sys- tems. 2006, roč. 22. ISSN 0167-739X. Dostupné tiež z: http://www. sciencedirect.com/science?_ob=PublicationURL&_cdi=5638& _pubType=J&_auth=y&_acct=C000045159&_version=1&_urlVersion= 0&_userid=835458&md5=f14f010cf9ac3bc15aaf6b72778d6b94. 19. MORI, Shunji; NISHIDA, Hirobumi; YAMADA, Hiromitsu. Optical Character Recognition. 1st. New York, NY, USA: John Wiley & Sons, Inc., 1999. ISBN 0471308196. 20. OCRopus [online] [cit. 2017-15-05]. Dostupné z: https://github.com/ tmbdev/ocropy.

48 A Obsah priloženého CD

Súčasťou práce je aj priložené CD, ktoré obsahuje:

∙ UltraGrid

∙ skripty a súbory použité pre tvorbu jazyka Tesseractu

Môj modul „anonymize“ sa nachádza v priečinku UltraGrid/src/capture_filter/, je rozdelený do 4 súborov pre lepšiu orientáciu.

49

B Užívateľské nastavenia

Pre lepšie ovládanie môjho modulu som implementoval možnosť nastaviť niektoré parametre prostredníctvom príkazovacieho riadka. UltraGrid sa z príkazovacieho riadka spúšťa pomocou príkazu „./uv [nastavenia] adresa(y)“. Jedno z týchto nastavení je –capture- filter . Môj modul je jedným z týchto filtrov nazvaný „anonymize“. Nastavenia sa nastavujú pomocou „anonymize[:nastavenie=hodnota]“ Hodnoty, ktoré sú zadané viackrát sa ignorujú a použije sa po- sledná zadaná hodnota. Jedinou výnimkou je debug_info.

save hodnota - boolean, prednastavená hodnota false. Ak je táto hodnota true pri ukončení UltraGridu, môj modul uloží všetky histo- gramy a informácie o oblastiach, ktoré sa majú anonymizovať. Súbor sa ukladá na adresu v save_path. Ak súbor už existuje, môj modul ho prepíše.

load hodnota - boolean, prednastavená hodnota false. Ak je táto hod- nota true pri štarte UltraGridu, tak načíta informácie o histogramoch a oblastiach, ktoré sa majú anonymizovať. Adresa k súboru, z ktorého sa číta, je uložená v load_path.

pixelization_size hodnota - int, prednastavená hodnota 20. Táto hodnota určuje aký veľký bude jeden pixel pixelizovanej oblasti. V prípade, ak táto hodnota je 1, tak výsledná pixelizovaná oblasť bude rovnaká ako pred pixelizáciou.

scale_size hodnota - float, prednastavená hodnota 2,0. Hodnota, ktorá určuje koľkonásobne sa má snímka zväčšiť pred rozpoznávaním Tesseractu. Pri hodnote 1 sa rozpoznáva originálna snímka. Pri hodnote 2 sú strany rozpoznávanej snímky dvojnásobné.

shrink_size hodnota - float, prednastavená hodnota 2,0. Hodnota, ktorá určuje koľkonásobne sa má snímka zmenšiť pred výpočtom histogramu. Pri hodnote 1, histogram sa vypočíta z origi-

51 B. Užívateľské nastavenia nálnej snímky, pri hodnote 2 sa histogram vypočíta zo snímky, ktorej strany sú polovičné oproti originálnej snímke. save_path hodnota - string, prednastavená hodnota „./tesseract_anonimize.json“. Nastavenie pre cestu k súboru, do ktorého sa majú uložiť informá- cie o anonymizácii. load_path hodnota - string, prednastavená hodnota „./tesseract_anonimize.json“. Nastavenie pre cestu k súboru, z ktorého sa majú načítať dáta pre anonymizáciu. image_path hodnota - string, prednastavená hodnota „/“. Hodnota určujúca cestu do adresára, do ktorého sa majú ukladať uložené rozpoznané snímmky. Viz. save_new_screen_as_image . B recognizing_threads hodnota - int, prednastavená hodnota 8. Nastavenie, ktoré umožní zmeniť počet vlákien, ktoré budú rozo- znávať jednotlivé boxy. debug_info hodnota - int, prednastavená hodnota žiadna. Hodnotu je možné zadať viackrát. Každá zadaná hodnota sa uloží do poľa. Na štandardný výstup sa vypíšu všetky správy, ktorých typ bol zadaný. Typy možných výpisov:

1 - frame time čas, ktorý trvá spracovať celú snímku.

2 - histogram time čas, ktorý trvá vypočítať histogram a porovnať ho so všetkými uloženými histogramami.

3 - time pixelate čas, ktorý trvá pixelizácia snímky.

4 - time frame preprocess čas, ktorý trvá predspracovanie snímky.

5 - time Tesseract OCR čas, ktorý trvá Tesseractu rozpoznanie snímky.

52 B. Užívateľské nastavenia

6 - time semantic analysis čas, ktorý trvá sémantická analýza.

7 - time transform frame to RGB format čas, ktorý zaberie trans- formácia snímky na RGB formát.

8 - histogram comparation hodnoty porovnania histogramov.

9 - order of action some výpis dôležitých funkcií v poradí v akom sú vykonávané.

10 - order of action more výpis viacerých funkcií, obsahujú všetky ako v predchádzajúcom prípade, plus výpis niektorých ďalších fun- kcií.

screen_compare hodnota - float, prednastavená hodnota 0,97. Hodnota, ktorá sa použije pri porovnávaní histogramov. V prípade, ak je táto hodnota 1,0, histogramy musia byť identické, aby sa prehlásili za rovnaké. Ak by bola 0, všetky histogramy sa prehlásia za rovnaké.

recognize_new_screen hodnota - bool, prednastavená hodnota true. Toto nastavenie určuje, či sa nové nerozpoznané snímky majú roz- poznávať. Bolo pridané za účelom znížiť zaťaženie procesora pri pre- nosoch, v ktorých sú všetky zdroje známe a pridáva sa video z kamery. Pri spracovaní snímok z kamery sa zbytočne rozpoznávajú snímky, ktoré nepotrebujú žiadnu anonymizáciu a môže sa stať, že Tesseract nesprávne rozpozná časť snímky a bude ho chcieť anonymizovať.

save_new_screen_as_image hodnota - bool, prednastavená hodnota false. Toto nastavenie pridáva možnosť uložiť neanonymizovanú snímku, ktorá bola rozpoznaná. Vhodný na použitie s nastavením save. V ulo- ženom súbore s informáciami o anonymizácii sú aj informácie o názve snímky, z ktorej boli informácie získané. Uložená snímka môže po- môcť manuálnej kontrole a úprave uložených informácií. Snímky sa ukladajú na adresu uloženú v image_path. Názvy snímok sa generujú automaticky screen_#, kde # je číslo rozpoznanej snímky.

53 B. Užívateľské nastavenia error_message hodnota - bool, prednastavená hodnota true. Hod- nota určuje či sa majú na štandardný výstup vypisovať chybové hlášky. Ak je nastavená na false, chyby, ktoré nastali pred načítaním tohto nastavenia sa stále vypíšu, ale chybové hlášky po tomto nastavení už vypísané nebudú. tesseract_language_name hodnota - string, prednastavená hodnota „uga“. Nastaví skratku jazyka pre Tesseract, ktorý sa má pri rozpozná- vaní použiť. anonymize_unrecognized hodnota - bool, prednastavená hodnota true. Hodnota, ktorá určí či má môj modul anonymizovať celú snímku v prípade, že ešte nie je rozpoznaná.

54 C Ukážky modalít

Obr. C.1: Anonymizovaná angiografia

55 C. Ukážky modalít

Obr. C.2: Anonymizovaná optická koherentná tomografia

56 C. Ukážky modalít

Obr. C.3: Anonymizovaná angiografia

57