7.2. Mit változtatott meg a gépi tanulás

Az image modul néhány örökölt észlelési módszert hordoz – find_features() a Haar-kaszkád arcészleléshez, find_eye() a rögzített pupillakeresőhöz, find_hog() a gradiensirány-összefoglalókhoz, valamint a find_keypoints() és find_lbp() útvonalak tetszőleges kulcspontokhoz. Mindegyik továbbra is működik; mindegyiket felváltotta a gépi tanulási folyamat.

7.2.1. A klasszikus felosztás: kézzel tervezett összefoglalók, tanult döntések

A klasszikus látórendszer kétlépéses dolog volt. Az első lépés a nyers képpontokat egy tömör számhalmazzá alakította, amelyet úgy választottak meg, hogy összefoglalja, mi volt a képen – nem maguk a képpontértékek, hanem egy rövidebb leírás arról, hogy mely minták hol jelentek meg. A második lépés ezt az összefoglalót vette, és döntést hozott: arc vagy nem, ez vagy az az objektum, ugyanaz a cél vagy másik.

A felosztás azért volt fontos, mert a két lépésnek más volt a szerzője. Az első lépést ember írta. Valaki leült, és eldöntötte, hogy két konkrét téglalap közötti fényerőkülönbség jó összefoglaló egy szemterületről, hogy a rács minden cellájában uralkodó éliránya jó összefoglaló egy álló személy körvonaláról, hogy az egyes képpontok körüli világos-vagy-sötét minta jó összefoglaló a helyi textúráról. Mindegyik döntés egy kézzel megírt algoritmus volt – megírva, hibakeresve és publikálva. A fenti örökölt módszerek mind ilyen jellegű összefoglalók voltak, amelyek standard eszközökké váltak:

  • find_features() a kép egy ablakát úgy foglalja össze, hogy összeadja a fényerőt több téglalapon belül, és összehasonlítja az összegeket. A téglalap-elrendezéseket azért választották, mert az emberi arcok megbízható világos-sötét kontrasztokat mutatnak: szemöldök az arcokkal szemben, szemüregek a homlokkal szemben, orr a környező bőrrel szemben.

  • find_hog() egy képet úgy foglal össze, hogy végighalad egy kis cellákból álló rácson, és feljegyzi, hogy melyik élirány uralkodik az egyes cellákban. A rácsot azért választották, mert egy álló személy körvonala a ruházattól vagy a megvilágítástól függetlenül felismerhető élirány-mintát hoz létre.

  • find_lbp() minden képpont környezetét úgy foglalja össze, hogy kódolja, melyik körülötte lévő képpont világosabb és melyik sötétebb. A kódolást azért választották, mert ezek a világosabb / sötétebb minták az általános megvilágítástól függetlenül ragadják meg egy felület textúráját.

  • find_keypoints() sarokpontokat keres a képen, és úgy írja le az egyes sarkok körüli területet, hogy az ugyanaz maradjon, amikor a sarkot elforgatják. A sarok-és-forgatás sémát azért választották, mert ugyanazok a sarkok újra megjelennek, amikor egy jelenetet más szögből nézünk.

Miután egy összefoglalót kézzel megírtak, egy kis tanulási lépés a tetején a számokat döntéssé tudta kombinálni. Az arcészlelő algoritmus egy tanulási lépést illesztett a téglalap-különbség összefoglalóhoz, címkézett arc és nem-arc képeken betanítva, hogy megtanulja, mely különbségkombinációk jeleznek arcot. Az élirány-összefoglaló egy olyan tanulási lépésbe táplálódott, amelyet címkézett személy és nem-személy képeken tanítottak be. A sarokleírók egy illesztési lépésbe táplálódtak, amely megtanulta, mekkora súlyt adjon az egyes sarkoknak. Ezek a második lépések mindegyike tanulási algoritmus – a modern mércével mérve kicsi, de tanulási algoritmus.

A hozzájárulás felosztása volt a lényeg. Az ember járult hozzá az összefoglalóval. A gép megtanulta a kombinációt. Egy új cél hozzáadása egy új összefoglaló megírását jelentette.

7.2.2. Mit változtattak meg a neurális hálózatok

Egy neurális hálózat eltörli a felosztást. A hálózat első rétegei végzik el azt az összefoglaló munkát, amelyet korábban a kézzel megírt algoritmusok végeztek – élek, sarkok, irányított sávok, textúrák észlelését, pontosan azokat a dolgokat, amelyek észlelésére a fent felsorolt örökölt módszerek mindegyikét hangolták – de ezeket nem kézzel írják meg. Ezeket megtanulják ugyanabból a betanítási adatból, amelyből a döntési lépést is megtanulják, egyetlen betanítási menetben, amely a hálózat mindkét felét egyszerre állítja be. A mélyebb rétegek végzik a kombinálást, amelyet korábban a kézzel megírt összefoglalók tetején lévő kis tanulási lépés végzett, szintén megtanulva, ugyanabban a menetben.

A változás abban, hogy ki tervez mit, teljes:

  • Az ember tervezi a bemenetet – adott méretű és formátumú rögzített képkockákat.

  • Az ember tervezi a kimenetet – az eredménytenzor elrendezését (osztályonként egy pontszám az osztályozáshoz, dobozok listája az észleléshez, kulcspontok rácsa a tereppontokhoz).

  • Az ember biztosítja a címkézett betanítási adatot – elegendő példát a célból és elegendő példát a nem-célokból ahhoz, hogy a betanítási folyamatnak legyen miből tanulnia.

Minden, ami a bemenet és a kimenet között van, a betanítási folyamat által generált. Nincs külön összefoglaló-író lépés. A korai rétegek nem azért alakulnak él- és textúraészlelőkké, mert valaki úgy írta meg őket, hanem mert az él- és textúraészlelés az, ami a hálózat előrejelzéseit a címkékkel egyezővé teszi. A mélyebb rétegek ugyanezen okból alakulnak alakzat- és objektumészlelőkké. Mindkét felet együtt tanítják be, ami lehetővé teszi, hogy az egyes rétegek által előállított összefoglalók pontosan azok az összefoglalók legyenek, amelyekre a következő rétegnek szüksége van – nem pedig azok az általánosak, amelyekkel egy kézzel megírt folyamatnak be kellett érnie.

7.2.3. Összeállítás az image modullal

A neurális hálózati folyamatok továbbra is ugyanazokon az érzékelő API-kon keresztül rögzítenek, ugyanazokon a draw_rectangle() és draw_circle() primitíveken keresztül rajzolják ki az eredményeket, és ugyanazokkal a (x, y, w, h) ROI-kkal szűkítik a munkát. Egy tipikus folyamat rögzít egy képkockát, opcionálisan egy klasszikus észlelővel, például find_blobs() segítségével talál egy durva célt, és annak határoló dobozát ROI-ként átadja a következtetésnek, lefuttatja a következtetést, majd a visszakapott észleléseket visszajegyzi az eredeti képkockára. A klasszikus primitívek az alapréteg; a hálózat az új lépés középen.