7.2. Co změnilo strojové učení

Modul image obsahuje hrstku starších detekčních metod – find_features() pro detekci obličejů pomocí Haarovy kaskády, find_eye() pro pevný vyhledávač zornic, find_hog() pro souhrny směru gradientu, cesty find_keypoints() a find_lbp() pro libovolné klíčové body. Všechny stále fungují; všechny byly nahrazeny pipeline strojového učení.

7.2.1. Klasické rozdělení: ručně navržené souhrny, naučená rozhodnutí

Klasická pipeline pro vidění byla dvoukroková záležitost. První krok převedl surové pixely na kompaktní sadu čísel zvolených tak, aby shrnuly, co bylo na obrázku – nikoli samotné hodnoty pixelů, ale kratší popis toho, které vzory se kde objevily. Druhý krok vzal tento souhrn a učinil rozhodnutí: obličej, nebo ne, tento objekt, nebo onen, stejný cíl, nebo jiný.

Rozdělení bylo důležité, protože oba kroky měly různé autory. První krok napsal člověk. Někdo se posadil a rozhodl, že rozdíl jasu mezi dvěma konkrétními obdélníky je dobrým souhrnem oblasti oka, že dominantní směr hrany v každé buňce mřížky je dobrým souhrnem obrysu stojící osoby, že světlý-nebo-tmavý vzor kolem každého pixelu je dobrým souhrnem lokální textury. Každá z těchto voleb byla ručně napsaný algoritmus – napsaný, odladěný a publikovaný. Výše uvedené starší metody byly všechny souhrny tohoto druhu, které se staly standardními nástroji:

  • find_features() shrnuje okno obrazu sečtením jasu uvnitř několika obdélníků a porovnáním součtů. Rozložení obdélníků byla zvolena proto, že lidské obličeje vykazují spolehlivé kontrasty světlého proti tmavému: obočí proti tvářím, oční důlky proti čelu, nos proti okolní kůži.

  • find_hog() shrnuje obraz procházením mřížky malých buněk a zaznamenáváním, který směr hrany v každé buňce dominuje. Mřížka byla zvolena proto, že obrys stojící osoby produkuje rozpoznatelný vzor směrů hran bez ohledu na oblečení nebo osvětlení.

  • find_lbp() shrnuje okolí každého pixelu zakódováním toho, které z okolních pixelů jsou jasnější a které tmavší. Kódování bylo zvoleno proto, že tyto vzory jasnější-než / tmavší-než zachycují texturu povrchu nezávisle na celkovém osvětlení.

  • find_keypoints() nachází v obraze rohové body a popisuje oblast kolem každého rohu způsobem, který zůstává stejný i při otočení rohu. Schéma rohů a rotace bylo zvoleno proto, že stejné rohy se znovu objeví, když je scéna pozorována z jiného úhlu.

Jakmile byl souhrn ručně napsán, malý učící krok nad ním mohl čísla zkombinovat do rozhodnutí. Algoritmus detekce obličejů přidal učící krok k souhrnu rozdílů obdélníků a trénoval jej na označených obrázcích obličejů a neobličejů, aby se naučil, které kombinace rozdílů signalizují obličej. Souhrn směrů hran byl přiveden do učícího kroku trénovaného na označených obrázcích osob a neosob. Deskriptory rohů byly přivedeny do kroku porovnávání, který se naučil, jakou váhu přidělit každému rohu. Každý z těchto druhých kroků je učící algoritmus – na moderní poměry malý, ale přesto učící algoritmus.

Rozhodující bylo rozdělení příspěvku. Člověk přispěl souhrnem. Stroj se naučil kombinaci. Přidání nového cíle znamenalo napsat nový souhrn.

7.2.2. Co změnily neuronové sítě

Neuronová síť toto rozdělení ruší. První vrstvy sítě dělají souhrnnou práci, kterou dříve dělaly ručně napsané algoritmy – detekují hrany, rohy, orientované pruhy, textury, přesně ty věci, na jejichž detekci byly výše uvedené starší metody každá vyladěna – ale nejsou napsány ručně. Jsou naučeny ze stejných trénovacích dat, ze kterých se učí krok rozhodování, v jediném trénovacím průchodu, který upravuje obě poloviny sítě najednou. Hlubší vrstvy provádějí kombinování, které dříve prováděl malý učící krok nad ručně napsanými souhrny, rovněž naučené, ve stejném průchodu.

Změna v tom, kdo co navrhuje, je úplná:

  • Člověk navrhuje vstup – zachycené snímky dané velikosti a formátu.

  • Člověk navrhuje výstup – rozložení výsledného tenzoru (jedno skóre na třídu pro klasifikaci, seznam rámečků pro detekci, mřížka klíčových bodů pro orientační body).

  • Člověk dodává označená trénovací data – dostatek příkladů cíle a dostatek příkladů necílů, aby měl trénovací proces z čeho se učit.

Vše mezi vstupem a výstupem je generováno trénovacím procesem. Neexistuje žádný samostatný krok psaní souhrnů. Rané vrstvy se ustálí na detektorech hran a textur ne proto, že je tak někdo napsal, ale proto, že detekce hran a textur je to, co způsobuje, že předpovědi sítě odpovídají štítkům. Hlubší vrstvy se ze stejného důvodu ustálí na detektorech tvarů a objektů. Obě poloviny jsou trénovány společně, což umožňuje, aby souhrny, které každá vrstva produkuje, byly přesně těmi souhrny, které potřebuje další vrstva – nikoli těmi obecnými, s nimiž se musela ručně napsaná pipeline spokojit.

7.2.3. Skládání s modulem image

Pipeline neuronových sítí stále zachycují přes stejné API senzoru, kreslí výsledky přes stejné primitivy draw_rectangle() a draw_circle() a zaměřují práci přes stejné ROI (x, y, w, h). Typická pipeline zachytí snímek, volitelně najde hrubý cíl klasickým detektorem jako find_blobs() a jeho ohraničující rámeček předá inferenci jako ROI, spustí inferenci a vrácené detekce anotuje zpět do původního snímku. Klasické primitivy jsou substrát; síť je nový krok uprostřed.