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.