Kérdőív feldolgozó rendszer #4: Beüzemelés & négyzetek és válaszok felismerése

EmguCV használata a projektben

Legkönnyebben: NuGet-tel le lehet tölteni, bár a frissítés dátuma alapján, nem egy friss változat, közel fél évvel le van maradva a hivatalos kiadástól. (Changelog-ok alapján nekem ez is megfelel.)
NuGet-tel: Install-Package EmguCV, az alábbi package-ek lesznek még hozzáadva a projekthez: ZedGraph és OpenTK. Az EmguCV részéről pedig három fájl:Emgu.CV.UI.dll, Emgu.CV.UI.GL.dll, Emgu.CV.World.dll.

Add Reference-féle importálásnál pedig a fent már említett három fájlt beimportáljuk, illetve célszerű a ZedGraph-ot is mellékelni.

Képfelismerés

A programozás a Visual Studio 2015-ben, C# nyelvben történt. A példaprogram jelenleg felismeri a négyzeteket, kigyomlálja azokat, amelyeket esetleg kétszer ismert fel. (Például ha vastag a vonal vagy rossz minőségű a kép.)  A kód nagy része a hivatalos példából származik, de jónéhány változtatást eszközöltem rajta.

A program bal oldali képdobozában az eredeti, feldolgozásra váró kép jelenik meg. Ezután az Elemzés gombra kattintva megjelennek a program által talált négyzetek a jobb oldali dobozban.

Jobb oldali TextBoxban pedig az algoritmusom munkája látszik, megnézi, hogy a négyzetek közül melyek vannak bejelölve, illetve kiírja a négyzetek középpontjainak a koordinátáit. Amennyiben be van jelölve egy opció, akkor a válaszhoz tartozó négyzetet nem látja a képfelismerő, ahogy az a következő példán is látszik:

 

Továbbá már az érvénytelen választ (itt: egynél több van bejelölve) is képes kezelni. A válaszok kezelése (mi van bejelölve és mi nincs) lista segítségével van megvalósítva.

A négyzetfelismerést kipróbáltam létező kérdőíven is, mely kiváló eredményt hozott.

EREDETIKEP_KERDOIV

 

Kérdőív feldolgozó rendszer #3: Követelményrendszer & hibás válaszok

Tervezett főbb funkciók listája (2016. december)

Szakdolgozat II befejezésére:

  • App:
    Kérdőív válaszok felismerése
    Kérdőív szöveges részeinek felismerése és kivágása (személyes adatok, szöveges mezők)
    Kivágott szöveges részek rendezése
    Adatok mentése adatbázisba (képeknek a fájlneve)
    Sql szerver konfigurálhatóság
    Több fajta adatbázis támogatása
    Képek tárolóból beolvasása
    Alapvető OCR-funkciók implementálása
  • SQL szerver:
    Segítség a letöltéshez és/vagy a csomag tartalmaz egy telepítőt
    Silent telepítés
    Alapvető hibaelhárítás (tudok-e csatlakozni, jó-e az user/pass)
  • Kimutatást készítő modul
    Diagram, kis leírás (sablonozható)
  • Kézírást felvivő modul
    Login/névbeállító ablak, hogy látható legyen ki fért hozzá az adatokhoz
    Egyszerű egy ablakos alkalmazás, melyben megjelenik a kivágott kép
    Kép nagyítható, kicsinyíthető, fekete-fehérre váltható
    Szövegbeviteli mező a válaszhoz

 

Opcionális funkciók

  • Azure integráció (storage elérés, nem VM-ben való futtatás esetén)
  • Active Directory támogatás
  • .NET Core támogatás – Linuxon futtatás

Javítások kitöltés közben, hibakezelés
Sokakkal előfordult – velem is -, hogy kitöltés közben elkalandozott, vagy félrecsúszott a keze és rossz opciót jelölt be. Mivel a programot fel kell készíteni az összes lehetséges helyzetre, így erre is. Az általam látott kérdőívek többségénél az volt látható, hogy a véletlenül bejelölt választ egyszerűen csak lesatírozták, aztán a jót pedig nyilvánvalóan x-szel jelölték. Emiatt nekem az fordult meg a fejemben, hogy ha egy sorban az x adható válasz helyett x+n választ adtak, akkor össze kell hasonlítani a bejelölt válaszokat, az alábbi módon:

negyzetek
Algoritmus megtalálja a négyzeteket, azokat kivágja, majd összehasonlítja a kettőt, amelyikben több nem fehér (vagy háttérszín) pixel van, az lesz a kérdésre adott válasz.

Hibakezelés fontos dolog lesz, hiszen a hiányosan kitöltött kérdőíveket fel kell ismerni, nem akadhat be a program, hogy keresi az adott kérdésre a választ, de ahhoz vagy nem töltöttek ki semmit, vagy mindent kitöltöttek. Például amennyiben közel az összes választ bejelölte valaki, de csak egyet kellett volna, akkor azt a válaszát érvénytelennek jelöljük és ugrunk tovább a többire.

Kimutatásnál jól jöhet, hogy melyik kérdésre hány feldolgozható, érvénytelen és üres válasz érkezett, ezzel a kérdésekről is készülne visszajelzés, amelyek alapján talán lehetne azokon is javítani.

Kérdőív feldolgozó rendszer #2: Programcsomagom & Azure

Programcsomag elképzelése

Az általam választott projekt nem csak egy kérdőív felismerést tartalmaz, hanem egy egész programcsomagot.

A programcsomag tervezett tartalma:

  • Kérdőív-felismerő app (röviden: app)
  • SQL szerver, konfigurációs panellel
  • Kimutatást készítő modul
  • Kézírást felvivő modul

Kérdőív felismerő app:
A fő alkalmazás, elindítható külön is, illetve a programcsomag részeként is. A különbség ezek között, hogy ha az egész csomagot használják, akkor projektekbe szervezhetjük a különböző kérdőívek feldolgozását, az információk (SQL címe, táblák nevei, általános beállítások) mentésre kerülnek, így az app nem kér információkat a feldolgozáshoz, ha elkülönítve van futtatva, akkor nyilván kér.

SQL szerver konfigurációs panellel:
Terveim közt szerepel, hogy az adatbázisokból legalább kétfajtát támogatok (MySQL/PostgreSQL, MSSQL), mert a MSSQL rendszerigénye a többihez viszonyítva kicsit magasnak tűnik, az esély nagy rá, hogy a programcsomag nem egy i7|16GB ram|GTX1080 kategóriájú gépen lesz futtatva, illetve a rendszerigényt szeretném alacsonyan tartani. Egynél több adatbázisrendszert pedig egyszerű támogatni, mivel nem beleégetni szeretném az adatbáziskezeléses parancsokat, hanem egy interface-t létrehozni, majd arra osztályokat. Azure támogatása sincs kizárva, de erről majd egy későbbi bejegyzésben.

Kimutatást készítő modul:
Itt egyszerű dolgokra kell gondolni, diagram, táblázat. Természetesen törekedve arra, hogy lehetőleg vektor-grafikusan lehessen menteni a képeket a kimutatásokról.

Kézírást felvivő modul:
Habár jónéhány OCR elérhető, első körben a „manuális felismerést” szeretném majd implementálni, ami annyit takarna, hogy az app kivágja azokat a részeket, ahol szövegnek kellene lennie és van is. Ennek megvalósítása aránylag egyszerűnek tűnik, a lap szélessége*0,75 hosszú vonalakat keresek, vagy ha sikerült az egész lapot beazonosítanom, akkor kivágom az előre (sablonként) megadott részt. Névfelismerésre szintén ezt használni, további részletek ebből is egy külön bejegyzésben lesznek kifejtve.

 

Azure – „yay or nay?”

Azure használata egy nagyon kellemes döntés lenne, semmilyen új gépet nem kellene beilleszteni a hivatali ökoszisztémába, nem kellene semmit változtatni a benti hálózati topológián. Ugyanakkor két erőteljes kérdés felmerül ezzel kapcsolatban:

1. Megéri-e?
Erre a kérdésre még nem lehet egyértelmű választ adni, hiszen nem ismert az appom sebessége, hogy milyen teljesítményű virtuális gép kellene hozzá, illetve mennyi az egy kérdőívre fordítandó keret. Viszont kényelmesnek nagyon kényelmes lenne, VM felállít, bekonfigurál, képek (kérdőívek) feltöltése, majd egyszer csak jön egy üzenet, hogy készen van, adatbázis kimentés és VM leáll.

2. Szabad-e?
Kérdőívek személyes adatokat is tartalmaznak, melyek alapján tisztán beazonosítható a kitöltő, válaszai alapján akár a politikai hovatartozása is, ezért ezek érzékeny adatnak minősülnek, melyeket elvileg csak szabályozott körülmények között szabad kiadni. Erről meg fogom kérdezni a hivatalt, hogy mi az álláspont, a felhőben való feldolgozás adatkiadásnak minősül-e a jelenleg hatályos jogszabályok alapján. Szerencsére az Azure azzal is hirdeti magát, hogy törvényi előírásoknak megfelelően lehet adatokat tárolni, amennyiben az itthoni jog teret ad ennek és az Azure-ban ez nem jelentkezik többletköltségként, akkor megfontolandó egy Azure kompatibilitást is felvenni a tervezett feature listára.

Kérdőív feldolgozó rendszer #1: Miért .NET & EmguCV

Miért a .Net, ha nincs „natív” képfelismerő?

Habár egyesek szerint van C#-nál jobb nyelv képfelismerő/feldolgozó alkalmazást írni, én a személyes (és munkahelyi) preferenciáim miatt inkább .Net vonalon képzelem el a programot. Mivel .NET Core használatával már Linux is célozható platformként, így amennyiben rendelkezésre áll egy megfelelő OpenCV wrappert vagy egy megfelelő képfelismerő alkalmazás, akkor multiplatformmá alakítható lehet az alkalmazás.

Továbbá, amennyiben iOS, Android, Windows Phone 10 eszközökön is elfogadható sebességgel fut a kérdőívek feldolgozása, akkor a Xamarin segítségével aránylag egyszerűen multiplatformosíthatóvá válik.

De természetesen ebben az esetben hatalmas időt is felemészthetne a QA, tehát ez a része nincs tervben, esetleg csak működő demo szintjén, összehasonlításban érdekes lenne, hogy a különböző operációs rendszerű telefonok miként viselkednek, illetve mennyivel lett gyorsabbak az újabb telefonok.

 

Miért az EmguCV?

A projekt kezdetekor én abban a hitben éltem, hogy van millió fajta képfelismerő C#/.NET-hez. Mint kicsit később kiderült tévedtem, jelentősen kevesebb van mint gondoltam. Néhányat már valamennyire ismertem, példának okáért a Matlab Image Processing Toolbox-ot, aminek a tudásán csak az ára tesz túl. Ugyanakkor, ha ezt használnám, akkor az ágyúval lőni bolhára eset állna fent: egyszerűen túl sokat tud, nekem pedig nem lesz annyira sokrétű az alkalmazásom, hogy a tudása tizedét is kihasználjam.

Open-source vizekre próbáltam evezni, már a (jellemzően) kedvezőbb licenszfeltételek miatt. Találtam is egy egészen korrektnek tűnő BSD licenszes segédletet: OpenCV.

Azonban ez csak C++-os library. De szerencsére, elég sok nyelven készül hozzá wrapper szerencsére C#-hoz is, ez lenne az EmguCV. Üröm, az örömben, hogy licenszfeltétele nem olyan engedékeny. Viszont támogatja az UWP-től kezdve a Xamarin-os appfejlesztést is, így ha esetleg multiplatformosítani akarnám az alkalmazást, akkor relatíve egyszerűen megtehetem.

 

Mi is az EmguCV?

Emgu CV is a cross platform .Net wrapper to the OpenCV image processing library. Allowing OpenCV functions to be called from .NET compatible languages such as C#, VB, VC++, IronPython etc. The wrapper can be compiled in Mono and run on Windows, Linux, Mac OS X, iPhone, iPad and Android devices.

Nos funkciók tekintetében ez az „image processing library” jött be leginkább, alább le is írom miért.

Kezdeném az OpenCL támogatással, ami eléggé meggyorsíthatja a képek feldolgozásának sebességét, ezt tesztek széleskörűen igazolják, persze kérdéses, hogy mennyit lehet majd az én programomban ebből kimérni. (Lesz majd összehasonlítás.) Egyetlen egy hátulütőről olvastam ezzel kapcsolatban, hogy figyeljek a grafikus meghajtókra, mert AMD kártyákon előfordultak lassulások, hibás eredmények.

Folytatva a sort, a CUDA támogatás is erősen plusz pont, de ez függ a programom használati helyétől, sajnos ezt az aspektust nem fogom tudni valószínűleg tesztelni, mivel otthoni számítógépemben Radeon van, munkahelyi GT210-es pedig annyira gyenge, hogy összehasonlítási alapnak rettenetes.

Tesseract OCR-t a listába belevenni kicsit fals dolog, mivel ez egy Google által szponzorált opensource library karakterfelismeréshez, amiről legtöbben elégedetten beszélnek, ugyanakkor része az EmguCV-s „csomagnak”, pluszban ez így lerövidítette az időt, amit OCR-ek keresésével kellett töltenem.

Szerencsére cross-platform, így linuxon futtatás is szóbajöhet, bár személy szerint engem jobban érdekelne ennél, hogy Apple A8-A10 processzoron milyen sebességű a képfeldolgozás, illetve ugyanez Androidos/Windows Phone-os telefonokon az Adreno IGP-vel.