Mit jelent a számítógépes látás
A számítógépes látás azt a tudományterületet jelöli, amely azzal foglalkozik, hogyan lehet a számítógépeket megtanítani digitális képek magas szintű értelmezésére. Ez tágabb feladat, mint elsőre gondolnánk, mert a "megértés" sokféle dolgot takarhat. Ide tartozik egy objektum megtalálása a képen, vagyis az objektumdetektálás, egy esemény felismerése a képen, egy kép szöveges leírása, vagy akár egy jelenet háromdimenziós rekonstrukciója. Az emberi arcokhoz és alakokhoz kapcsolódóan külön feladatosztály is kialakult, ilyen az életkor és az érzelem becslése, az arcfelismerés és az azonosítás, illetve a testtartás háromdimenziós becslése.
A számítógépes látás egyik legegyszerűbb feladata a képosztályozás, amikor a rendszernek egyetlen címkét kell hozzárendelnie egy egész képhez. A terület ma a mesterséges intelligencia egyik ágának számít, és a legtöbb feladatot manapság neurális hálókkal oldják meg. Ezen belül külön altípus alakult ki a képi adatokra, ezt konvolúciós neurális hálónak nevezik, és ezzel a következő lecke foglalkozik részletesen.
Fontos azonban tudni, hogy mielőtt egy képet átadnánk egy neurális hálónak, sok esetben érdemes algoritmikus technikákkal előkészíteni azt. Ez a lecke ezekről az előfeldolgozási lépésekről, illetve az OpenCV könyvtárról szól, amely a terület egyik legelterjedtebb eszköze.
A kép mint számtömb
A gép szempontjából egy digitális kép nem más, mint számok rendezett tömbje. Pythonban ezt kényelmesen NumPy tömbökkel lehet reprezentálni. Egy 320x200 pixel méretű szürkeárnyalatos kép egy 200x320 méretű tömbben tárolódik, ahol minden érték egyetlen pixel fényességét jelöli. Egy ugyanekkora színes kép ezzel szemben egy 200x320x3 méretű tömb lesz, mivel minden pixelhez három érték tartozik, a piros, a zöld és a kék színcsatorna intenzitása.
Ez a felismerés, hogy a kép valójában egy nagy, strukturált számhalmaz, az alapja mindannak, amit a számítógépes látás algoritmusai csinálnak. Egy szűrő alkalmazása, egy transzformáció végrehajtása vagy egy neurális háló bemenetének előkészítése végső soron mindig ezeken a számtömbökön végzett matematikai műveletekre vezethető vissza.
Érdemes megjegyezni egy gyakori buktatót is. Az OpenCV hagyományosan BGR sorrendben, azaz kék-zöld-piros sorrendben tárolja a színcsatornákat, míg a legtöbb más Python eszköz a megszokott RGB, vagyis piros-zöld-kék sorrendet használja. Ha ezt nem vesszük figyelembe, a betöltött kép hibás színekkel jelenik meg, ezért a képet be kell konvertálni a megfelelő színtérbe, mielőtt tovább dolgoznánk vele.
Az OpenCV könyvtár
A képfeldolgozásra több Python könyvtár is elérhető. Az imageio egyszerű, különböző képformátumok olvasására és írására alkalmas, és ffmpeg integrációval videókeretek képekké alakítására is használható. A Pillow, más néven PIL ennél kicsit többet tud, támogat képmanipulációs műveleteket is, mint a torzítás vagy a paletta állítása. A dlib egy C++ könyvtár, amely számos gépi tanulási algoritmust implementál, köztük néhány számítógépes látáshoz kötődőt, és jól használható olyan összetettebb feladatokhoz, mint az arc és az arcpontok detektálása.
Ezek közül azonban az OpenCV számít a terület de facto szabványának. Egy C++ nyelven írt, rendkívül gazdag algoritmuskészlettel rendelkező könyvtárról van szó, amely kényelmes Python felülettel is rendelkezik. Ennek a leckének nem célja, hogy teljeskörűen megtanítsa az OpenCV használatát, inkább arra ad ízelítőt, milyen típusú feladatokra érdemes bevetni, és nagyjából hogyan.
Az OpenCV segítségével a képek betöltése egyszerű, egyetlen függvényhívással megtörténik, az eredmény pedig közvetlenül egy NumPy tömb, amelyet aztán a fentebb említett BGR-RGB konverzió után meg is tudunk jeleníteni. Ugyanez a konverziós függvény használható más színtér átalakításokra is, például a kép szürkeárnyalatossá alakítására, vagy a HSV, azaz árnyalat-telítettség-fényesség színtérbe való konvertálásra. Az OpenCV videók kereten kénti beolvasására is alkalmas, ami különösen hasznos, ha mozgás vagy időbeli változás elemzése a cél.
Alapvető képfeldolgozási műveletek
Mielőtt egy képet átadnánk egy neurális hálónak, gyakran érdemes néhány előfeldolgozási lépést elvégezni rajta. Az OpenCV számos ilyen műveletet kínál beépítve.
- Átméretezés. A kép mérete a legtöbb neurális háló architektúrájánál rögzített bemeneti méretet igényel, ezért a képeket gyakran egységes méretre kell hozni interpolációs eljárásokkal.
- Simítás, azaz elmosás. A medián szűrő vagy a Gauss szűrő csökkenti a képzaj hatását, és segít kiemelni a fontosabb szerkezeti elemeket.
- Fényerő és kontraszt módosítása. Ezek a beállítások közvetlenül a NumPy tömb értékeinek manipulálásával is elvégezhetők, mivel minden pixel csak egy szám.
- Küszöbölés, azaz thresholding. Ez a kép pixeleit egy megadott küszöbérték alapján fekete-fehérré alakítja, és sok esetben megbízhatóbb eredményt ad, mint a puszta fényerő vagy kontraszt állítása.
- Geometriai transzformációk. Az affin transzformáció forgatást, átméretezést és nyírást tud egyszerre végrehajtani úgy, hogy a párhuzamos vonalak párhuzamosak maradnak. A perspektivikus transzformáció ennél rugalmasabb, és jól használható, ha egy ferde szögből fotózott dokumentumot szeretnénk kiegyenesíteni, mintha felülnézetből fotóztuk volna.
- Optikai áramlás elemzése. Ez a technika azt vizsgálja, hogyan mozognak az egyes pixelek egymást követő videókeretek között, ezáltal segít megérteni a mozgást a képen belül.
Ide tartozik még az élkeresés is, amelynek egyik legismertebb algoritmusa a Canny él-detektor. Ez a módszer a kép fényességének hirtelen változásait keresi meg, és ezekből rajzolja ki az objektumok körvonalait. Az élkeresés és a hozzá kapcsolódó jellemzőkinyerési technikák azért fontosak, mert sok esetben ezek az élek és sarokpontok azok az információk, amelyek alapján egy algoritmus vagy egy neurális háló felismeri, hogy milyen objektumról van szó a képen.
Tipikus számítógépes látás feladatok
Az itt bemutatott technikák önmagukban is elegendőek lehetnek bizonyos feladatokhoz, más esetben egy neurális hálós lépés előkészítéseként szolgálnak. A terület legjellemzőbb feladattípusai a következők.
- Osztályozás. A rendszer egyetlen címkét rendel hozzá egy teljes képhez, például eldönti, hogy kutya vagy macska látható-e rajta.
- Objektumdetektálás. A rendszer nemcsak azonosítja az objektumokat, hanem azok pontos helyét is megjelöli a képen, jellemzően egy körülöttük húzott téglalappal.
- Szegmentálás. Ez a legrészletesebb feladat, ahol a rendszer minden egyes pixelhez hozzárendel egy osztálycímkét, így pontosan kirajzolódik az objektumok kontúrja is, nem csak a hozzávetőleges helye.
Az OpenCV segítségével egészen látványos, gyakorlatias problémákat is meg lehet oldani pusztán klasszikus algoritmusokkal, neurális háló nélkül. Ilyen például egy Braille könyvről készült fénykép előfeldolgozása, ahol küszöböléssel, jellemzőkinyeréssel és perspektivikus transzformációval választhatók szét az egyes Braille jelek a további osztályozás előtt. Hasonlóan jó példa a mozgásérzékelés videóban, egymást követő képkockák egyszerű kivonásával, hiszen ha a kamera fix helyzetben van, a képkockák közötti pixelenkénti különbség alacsony marad addig, amíg valódi mozgás nem történik a képen.
Miért érdemes a klasszikus módszereket is ismerni
Könnyű azt gondolni, hogy a modern gépi látás minden problémáját a mély tanulás oldja meg, a gyakorlatban azonban rengeteg olyan feladat van, amelyet önmagában, neurális háló nélkül is meg lehet oldani klasszikus képfeldolgozási technikákkal. A mozgásérzékelés, az ujjhegy nyomon követése, vagy egy dokumentum kiegyenesítése mind olyan feladat, ahol egy jól megválasztott algoritmus gyorsabb, olcsóbb és megbízhatóbb lehet, mint egy nagy neurális modell betanítása.
Ezért érdemes ismerni az alapvető képfeldolgozási technikákat, és tudni, mire képes egy olyan könyvtár, mint az OpenCV. A gyakorlatban a legtöbb valós számítógépes látás rendszer hibrid megoldás, ahol a klasszikus algoritmusok előkészítik az adatot, a neurális háló pedig a magas szintű felismerést végzi.
Gyakorlati kód
Aki szeretné saját maga is kipróbálni a leckében bemutatott műveleteket, például a kép betöltését, a színtér konverziót, a küszöbölést vagy az optikai áramlás számítását, annak érdemes megnézni az eredeti angol nyelvű Jupyter notebookot. OpenCV.ipynb a GitHubon.
Forrás
Ez a lecke a Microsoft nyílt forráskódú, MIT licenc alatt elérhető "AI For Beginners" tananyagának magyar adaptációja. Eredeti angol lecke. GitHub. Felhasznált magyar gépi fordítás. GitHub.
Workshop
AI Transformation Day
Egésznapos, vezetőknek szóló program. Feltérképezzük, hol tart a szervezet, mi az első reális lépés, és milyen belső feltételek szükségesek a sikerhez. A nap végén konkrét, prioritizált cselekvési lista.
Érdekel a program →