Nopea tapa tunnistaa tekstiä. Lisäys. Takaisinlisäyksen matemaattinen komponentti. Mustavalkoisen kuvan saaminen

Monien animaatioiden avulla numeroiden tunnistusongelman ja perceptronimallin esimerkkiä käyttäen esitetään visuaalinen johdatus hermoverkon koulutusprosessiin.

Ensimmäinen video käsittelee komponenttien rakennetta hermoverkko, toinen - sen koulutus, kolmas - tämän prosessin algoritmi. Klassinen tehtävä, käsinkirjoitettujen numeroiden tunnistaminen, otettiin harjoitustehtäväksi.

Monikerroksista perceptronia tarkastellaan yksityiskohtaisesti - perusmallia (mutta jo melko monimutkaista) hermoverkkojen nykyaikaisten versioiden ymmärtämiseen.

1. Neuroverkkokomponentit

Ensimmäisen videon tarkoituksena on näyttää, mikä hermoverkko on. Numeroiden tunnistustehtävän esimerkin avulla visualisoidaan hermoverkkokomponenttien rakenne. Videossa on venäjänkielinen tekstitys.

Selostus numerontunnistuksen ongelmasta

Oletetaan, että sinulla on numero 3, joka on renderöity erittäin alhaisella 28 x 28 pikselin resoluutiolla. Aivosi tunnistavat tämän numeron helposti.

Näkökulmasta tietokone teknologia On hämmästyttävää, kuinka helposti aivot suorittavat tämän toimenpiteen, vaikka pikselien tarkka järjestys vaihtelee suuresti kuvista toiseen. Jokin näkökuoressamme päättää, että kaikki kolmikot edustavat samaa kokonaisuutta riippumatta siitä, miten ne on kuvattu. Siksi numeroiden tunnistamisen tehtävä tässä yhteydessä nähdään yksinkertaisena.

Mutta jos sinua pyydettäisiin kirjoittamaan ohjelma, joka ottaa syötteeksi minkä tahansa luvun kuvan 28x28 pikselin taulukon muodossa ja tulostaa itse "olemuksen" - numeron 0 - 9, tämä tehtävä ei enää vaikuttaisi yksinkertaiselta. .

Kuten nimestä voi päätellä, hermoverkon rakenne on jossain määrin lähellä aivojen hermoverkon rakennetta. Toistaiseksi kuvitellaan yksinkertaisuuden vuoksi, että neuronit ymmärretään matemaattisessa mielessä hermoverkoissa tiettynä säiliönä, joka sisältää luvun nollasta yhteen.

Hermosolujen aktivointi. Neuroverkkokerrokset

Koska ruudukkomme koostuu 28x28=784 pikselistä, olkoon 784 neuronia, jotka sisältävät eri numerot 0-1: mitä lähempänä pikseli on valkoinen väri, sitä lähempänä vastaava luku on yhtä. Kutsutaan näitä numeroita täyttäviksi verkkohermosolujen aktivaatioiksi. Voit ajatella tätä ikään kuin neuroni syttyy kuin hehkulamppu, kun se sisältää luvun lähellä 1 ja sammuu, kun se sisältää luvun lähellä 0.

Kuvatut 784 neuronia muodostavat hermoverkon ensimmäisen kerroksen. Viimeinen kerros sisältää 10 neuronia, joista jokainen vastaa yhtä kymmenestä numerosta. Näissä numeroissa aktivointi on myös luku nollan ja yhden välillä, mikä kuvastaa sitä, kuinka varma järjestelmä on siitä, että syöttökuva sisältää vastaavan numeron.

Siellä on myös pari keskikerrosta, joita kutsutaan piilotasoiksi, joihin pääsemme pian. Piilotettujen kerrosten ja niiden sisältämien hermosolujen lukumäärän valinta on mielivaltainen (valitsimme 2 kerrosta, joissa kussakin on 16 neuronia), mutta yleensä ne valitaan tietyistä hermoverkon ratkaisemaa ongelmaa koskevista ideoista.

Neuraaliverkon toimintaperiaate on, että aktivoituminen yhdessä kerroksessa määrittää aktivoitumisen seuraavassa. Kiihtyessään tietty neuroniryhmä saa aikaan toisen ryhmän virittymisen. Jos siirrät aktivointiarvot koulutetun hermoverkon ensimmäiseen kerrokseen kuvan kunkin pikselin kirkkauden mukaan, aktivointiketju hermoverkon yhdestä kerroksesta seuraavaan johtaa yhden ensisijaiseen aktivointiin. tunnistettua numeroa vastaavan viimeisen kerroksen neuroneista - hermoverkon valinta.

Piilotettujen kerrosten tarkoitus

Ennen kuin tutkimme matematiikkaa siitä, miten yksi kerros vaikuttaa seuraavaan, miten oppiminen tapahtuu ja kuinka hermoverkko ratkaisee numeroiden tunnistamisen ongelman, pohditaan, miksi tällainen kerrosrakenne voi toimia älykkäästi. Mitä välikerrokset tekevät tulo- ja lähtökerrosten välillä?

Muotoile kuvakerrosta

Numeroiden tunnistamisprosessissa kokoamme yhteen erilaisia ​​komponentteja. Esimerkiksi yhdeksän koostuu ympyrästä ylhäältä ja viivasta oikealla. Kuvassa kahdeksan on myös ympyrä ylhäällä, mutta oikealla olevan viivan sijaan sen alaosassa on ympyräpari. Ne neljä voidaan esittää kolmena tietyllä tavalla yhdistettynä linjana. Ja niin edelleen.

Ihanteellisessa tapauksessa odotamme jokaisen toisen kerroksen hermosolujen yhdistävän yhteen näistä komponenteista. Ja kun esimerkiksi syötät hermoverkkoon kuvan, jonka yläosassa on ympyrä, siellä on tietty neuroni, jonka aktivaatio tulee lähemmäksi yhtä. Siten siirtyminen toisesta piilokerroksesta lähtökerrokseen vastaa tietoa siitä, mikä komponenttijoukko vastaa mitäkin numeroa.

Rakenneyksiköiden kuvien kerros

Ympyräntunnistustehtävä voidaan jakaa myös osatehtäviin. Esimerkiksi erilaisten pienten reunojen tunnistaminen, joista se on muodostettu. Vastaavasti pitkä pystysuora viiva voidaan ajatella kuviona, joka yhdistää useita pienempiä kappaleita. Siten voimme toivoa, että jokainen hermoverkon ensimmäisen piilokerroksen neuroni suorittaa näiden pienten reunojen tunnistamisen.

Siten syöttökuva johtaa ensimmäisen piilokerroksen tiettyjen hermosolujen aktivoitumiseen, määrittäen tyypillisiä pieniä paloja, nämä neuronit puolestaan ​​aktivoivat suurempia muotoja, minkä seurauksena aktivoituvat tiettyyn hahmoon liittyvän ulostulokerroksen hermosolu.

Se, toimiiko hermoverkko tällä tavalla vai ei, on toinen kysymys, johon palaat, kun keskustelet verkon koulutusprosessista. Tämä voi kuitenkin toimia oppaana, eräänlaisena tavoitteena tällaiselle kerrokselliselle rakenteelle.

Toisaalta tällainen reunojen ja kuvioiden määrittely on hyödyllinen paitsi numeroiden tunnistamisessa, myös kuvien tunnistamisongelmassa yleensä.

Eikä vain numeroiden ja kuvien tunnistamiseen, vaan myös muihin älyllisiin tehtäviin, jotka voidaan jakaa abstraktiokerroksiksi. Esimerkiksi puheentunnistusta varten raakaääni erotetaan yksittäisiä ääniä, tavuja, sanoja, sitten lauseita, abstraktimpia ajatuksia jne.

Tunnistusalueen määrittäminen

Tarkemmin sanottuna kuvitellaan nyt, että ensimmäisen piilokerroksen yksittäisen neuronin tavoitteena on määrittää, sisältääkö kuva reunan kuvaan merkityllä alueella.

Ensimmäinen kysymys kuuluu: mitkä asetukset hermoverkolla tulisi olla, jotta se pystyisi havaitsemaan tämän kuvion tai minkä tahansa muun pikselikuvion.

Määritetään numeerinen paino w i jokaiselle neuronimme ja syöttökerroksen hermosolun väliselle yhteydelle. Sitten otetaan kaikki aktivoinnit ensimmäisestä kerroksesta ja lasketaan niiden painotettu summa näiden painojen mukaan.

Koska painojen määrä on sama kuin aktivointien määrä, ne voidaan myös kartoittaa samanlaiseen ruudukkoon. Merkitsemme positiivisia painotuksia vihreillä pikseleillä ja negatiivisia punaisilla pikseleillä. Pikselin kirkkaus vastaa painon itseisarvoa.

Jos nyt asetamme kaikki painot yhtä kuin nolla, lukuun ottamatta malliamme vastaavia pikseleitä, painotettu summa vähennetään meitä kiinnostavan alueen pikselien aktivointiarvojen summaksi.

Jos haluat määrittää, onko siellä reunaa, voit lisätä vihreän painosuorakulmion ympärille punaisia ​​painoreunoja, jotka vastaavat negatiivisia painoja. Tällöin tämän alueen painotettu summa on suurin, kun kuvan keskipikselit tässä osassa ovat kirkkaampia ja niitä ympäröivät pikselit tummempia.

Aktivoinnin skaalaus intervalliin

Laskemalla tällaisen painotetun summan voit saada minkä tahansa luvun laaja valikoima arvot. Jotta se osuu vaaditulle aktivointialueelle 0-1, on järkevää käyttää toimintoa, joka "pakkaa" koko alueen väliin .

Usein tähän skaalaukseen käytetään sigmoidista logistista funktiota. Sitä enemmän itseisarvo negatiivinen tulonumero, sitä lähempänä lähtösigmoidiarvo on nollaa. Mitä suurempi positiivinen syötenumero, sitä lähempänä funktion arvo on yhtä.

Siten neuronin laukeaminen on olennaisesti mitta siitä, kuinka positiivinen vastaava painotettu summa on. Estääksesi neuronin aktivoitumisen matalalla positiivisia lukuja, voit lisätä painotettuun summaan negatiivisen luvun - siirtymän (englanniksi bias), joka määrittää kuinka suuri painotetun summan on oltava, jotta neuroni aktivoituu.

Toistaiseksi keskustelu on ollut vain yhdestä neuronista. Jokainen ensimmäisen piilokerroksen neuroni on yhteydessä kaikkiin ensimmäisen kerroksen 784 pikselin neuroniin. Ja jokaisella näistä 784 yhteydestä on oma painonsa. Lisäksi jokaisella ensimmäisen piilokerroksen neuroneilla on siihen liittyvä siirto, joka lisätään painotettuun summaan ennen kuin sigmoidi "pakkaa" tämän arvon. Siten ensimmäiselle piilokerrokselle on 784x16 painot ja 16 vuoroa.

Muiden kerrosten väliset yhteydet sisältävät myös painot ja niihin liittyvät käännökset. Siten annetussa esimerkissä noin 13 tuhatta painotusta ja siirtymää, jotka määräävät hermoverkon käyttäytymisen, toimivat konfiguroitavina parametreina.

Neuroverkon kouluttaminen tunnistamaan numeroita tarkoittaa, että tietokone pakotetaan löytämään oikeat arvot kaikille näille numeroille, jotta se ratkaisee ongelman. Kuvittele, että säädät kaikkia painoja ja vaihdat käsin. Tämä on yksi tehokkaista argumenteista hermoverkon käsittelemiselle mustana laatikkona - on lähes mahdotonta seurata henkisesti kaikkien parametrien yhteistä käyttäytymistä.

Hermoverkon kuvaus lineaarialgebran avulla

Keskustellaan kompaktista tavasta esittää matemaattisesti hermoverkkoyhteyksiä. Yhdistetään kaikki ensimmäisen kerroksen aktivaatiot sarakevektoriksi. Yhdistämme kaikki painot matriisiksi, jonka jokainen rivi kuvaa yhden kerroksen hermosolujen välisiä yhteyksiä seuraavan kerroksen tiettyyn neuroniin (jos sinulla on vaikeuksia, katso kuvailemamme kurssi). Matriisin vektorilla kertomisen tuloksena saadaan vektori, joka vastaa ensimmäisen kerroksen aktivointien painotettuja summia. Lisätään matriisitulo siirtovektorilla ja kääritään se sigmoidifunktiolla arvovälien skaalaamiseksi. Tämän seurauksena saamme vastaavien aktivointien sarakkeen.

On selvää, että sarakkeiden ja matriisien sijasta, kuten lineaarisessa algebrassa on tapana, voidaan käyttää niiden lyhyitä merkintöjä. Tämä tekee vastaavan ohjelmakoodi sekä helpompaa että nopeampaa, koska kirjastot koneoppiminen optimoitu vektorilaskelmia varten.

Selvennys neuronien aktivoinnista

On aika selventää yksinkertaistamista, jolla aloitimme. Neuronit eivät vastaa vain aktivointilukuja, vaan aktivointitoimintoja, jotka ottavat arvot kaikista edellisen kerroksen neuroneista ja laskevat lähtöarvot välillä 0-1.

Itse asiassa koko hermoverkko on yksi suuri toiminto, joka on mukautettavissa koulutuksen avulla ja jossa on 13 tuhatta parametria, joka hyväksyy 784 syöttöarvoa ja tuottaa todennäköisyyden, että kuva vastaa yhtä kymmenestä tunnistukseen tarkoitetusta numerosta. Monimutkaisuudestaan ​​​​huolimatta se on kuitenkin yksinkertaisesti funktio, ja on tietyssä mielessä loogista, että se näyttää monimutkaiselta, koska jos se olisi yksinkertaisempi, tämä funktio ei pystyisi ratkaisemaan numeroiden tunnistamisongelmaa.

Lisäksi pohditaan, mitä aktivointitoimintoja käytetään tällä hetkellä hermoverkkojen ohjelmointiin.

Lisäys: hieman aktivointitoiminnoista. Sigmoidin ja ReLU:n vertailu

Tarkastellaanpa lyhyesti funktioita, joita käytetään aktivointiarvojen "pakkaukseen". Sigmoidifunktio on esimerkki, joka jäljittelee biologisia hermosoluja ja jota käytettiin hermoverkkojen varhaisessa työssä, mutta yksinkertaisempaa ReLU-toimintoa käytetään nykyään yleisemmin hermoverkkokoulutuksen helpottamiseksi.

ReLU-funktio seuraa biologista analogiaa, jonka mukaan hermosolut voivat olla aktiivisessa tilassa tai eivät. Jos tietty kynnys ylitetään, toiminto laukeaa, ja jos sitä ei ylitetä, hermosolu pysyy yksinkertaisesti passiivisena ja aktivointi on yhtä suuri kuin nolla.

Kävi ilmi, että syvässä monikerroksisissa verkoissa ReLU-funktio toimii erittäin hyvin ja usein vaikeammin laskettavaa sigmoidifunktiota ei kannata käyttää.

2. Neuroverkon kouluttaminen tunnistamaan numeroita

Herää kysymys: kuinka ensimmäisellä oppitunnilla kuvattu verkko löytää sopivat painot ja siirtymät vain vastaanotetun tiedon perusteella? Toinen oppitunti puhuu tästä.

SISÄÄN yleisnäkymä Algoritmi sisältää joukon harjoitustietoja, jotka edustavat käsinkirjoitettujen lukujen kuvapareja ja niiden abstrakteja matemaattisia esityksiä.

Ääriviivassa

Harjoittelun tuloksena hermoverkon tulisi erottaa numerot oikein aiemmin esittämättömistä testitiedoista. Vastaavasti voit käyttää hermoverkkokoulutuksen testinä oikean numerontunnistuksen tekojen lukumäärän suhdetta testinäytteen elementtien määrään.

Mistä harjoitustiedot ovat peräisin? Tarkasteltava ongelma on hyvin yleinen, ja sen ratkaisemiseksi luotiin suuri MNIST-tietokanta, joka koostui 60 tuhannesta leimatusta tiedosta ja 10 tuhannesta testikuvasta.

Kustannustoiminto

Käsitteellisesti hermoverkon harjoittamisen tehtävänä on löytää tietyn funktion minimi - kustannusfunktio. Kuvataan mikä se on.

Kuten muistat, jokainen seuraavan kerroksen neuroni on yhteydessä edellisen kerroksen neuroniin, ja näiden yhteyksien painot ja kokonaissiirtymä määräävät sen aktivointitoiminnon. Päästäksemme jostain alkuun, voimme alustaa kaikki nämä painot ja siirtymät satunnaisluvuilla.

Vastaavasti ensimmäisellä hetkellä kouluttamaton hermoverkko vastauksena kuvaan annettu numero Esimerkiksi kolminkertaisen kuvan tuloskerros tuottaa täysin satunnaisen vastauksen.

Neuroverkon kouluttamiseksi otamme käyttöön kustannusfunktion, joka ikään kuin kertoo tietokoneelle samanlaisen tuloksen sattuessa: "Ei, huono tietokone! Aktivointiarvon tulee olla nolla kaikille hermosoluille yhtä oikeaa yhtä lukuun ottamatta."

Kustannusfunktion asettaminen numeroiden tunnistukseen

Matemaattisesti tämä funktio edustaa lähtökerroksen todellisten aktivointiarvojen ja niiden ihannearvojen välisten erojen neliöityjen summaa. Esimerkiksi kolmion tapauksessa aktivaation tulisi olla nolla kaikille hermosoluille paitsi vastaavalle kolmiolle, jolle se on yhtä suuri kuin yksi.

Osoittautuu, että yhdelle kuvalle voimme määrittää yhden kustannusfunktion nykyisen arvon. Jos neuroverkko on koulutettu, tämä arvo on pieni, mieluiten nollaan, ja päinvastoin: mitä suurempi kustannusfunktion arvo on, sitä huonommin neuroverkko on koulutettu.

Siten, jotta myöhemmin voidaan määrittää, kuinka hyvin hermoverkko on koulutettu, on tarpeen määrittää kustannusfunktion keskiarvo kaikille koulutusjoukon kuville.

Tämä on melko vaikea tehtävä. Jos neuroverkkomme syötteenä on 784 pikseliä, lähtönä 10 arvoa ja niiden laskemiseen tarvitaan 13 tuhatta parametria, niin kustannusfunktio on näiden 13 tuhannen parametrin funktio, tuottaa yhden kustannusarvon, jonka haluamme minimoida. , ja samalla koko harjoitussarja toimii parametreina.

Kuinka muuttaa kaikkia näitä painoja ja siirtymiä niin, että hermoverkko oppii?

Gradientti laskeutuminen

Aluksi, sen sijaan, että esittäisimme funktiota, jolla on 13 tuhatta syötearvoa, aloitamme yhden muuttujan C(w) funktiolla. Kuten varmaan muistat kurssilta matemaattinen analyysi, jotta voit löytää funktion minimin, sinun on otettava derivaatta.

Funktion muoto voi kuitenkin olla hyvin monimutkainen, ja yksi joustava strategia on aloittaa jostain mielivaltaisesta pisteestä ja työstää funktion arvoa alaspäin. Toista tämä menettely jokaisessa seuraava kohta, voit vähitellen saavuttaa toiminnon paikallisen minimin, aivan kuten mäkeä alas vierivä pallo tekee.

Kuten yllä olevasta kuvasta näkyy, funktiolla voi olla useita paikallisia minimijä, ja mihin paikalliseen minimiin algoritmi päätyy, riippuu aloituspisteen valinnasta, eikä ole takeita siitä, että löydetty minimi on kustannusfunktion pienin mahdollinen arvo. Tämä on pidettävä mielessä. Lisäksi, jotta et "ylitä" paikallisen minimin arvoa, sinun on muutettava askelkokoa suhteessa funktion kaltevuuteen.

Jotta tämä tehtävä olisi hieman monimutkaisempi, yhden muuttujan funktion sijasta voit kuvitella kahden muuttujan funktion yhdellä lähtöarvolla. Vastaava toiminto eniten suunnan löytämiseksi nopea laskeutuminen edustaa negatiivista gradienttia -∇С. Gradientti lasketaan, otetaan askel suuntaan -∇С, toimenpide toistetaan, kunnes olemme minimissä.

Kuvattua ideaa kutsutaan gradienttilaskuksi, ja sen avulla voidaan löytää kahden muuttujan funktion lisäksi myös 13 tuhatta ja minkä tahansa muun muuttujien lukumäärän minimi. Kuvittele, että kaikki painot ja siirtymät muodostavat yhden suuren sarakevektorin w. Tälle vektorille voimme laskea saman kustannusfunktion gradienttivektorin ja siirtyä oikeaan suuntaan lisäämällä tuloksena olevaan vektoriin vektorin w. Ja niin toista tämä toimenpide, kunnes funktio C(w) saavuttaa minimin.

Gradient Descent -komponentit

Neuraaliverkostollemme askeleet kohti pienempää kustannusfunktion arvoa merkitsevät yhä vähemmän hermoverkon satunnaista käyttäytymistä vasteena opetusdataan. Tämän gradientin tehokkaan laskemisen algoritmia kutsutaan backpropagationiksi, ja sitä käsitellään yksityiskohtaisesti seuraavassa osassa.

varten gradienttilasku On tärkeää, että kustannusfunktion lähtöarvot vaihtelevat tasaisesti. Tästä syystä aktivointiarvoilla ei ole vain binääriarvoja 0 ja 1, vaan ne edustavat reaalilukuja ja ovat näiden arvojen välissä.

Jokainen gradienttikomponentti kertoo meille kaksi asiaa. Komponentin merkki osoittaa muutoksen suunnan ja itseisarvo– tämän komponentin vaikutuksesta lopputulokseen: jotkut painot vaikuttavat kustannusfunktioon enemmän kuin toiset.

Testataan oletuksia piilotettujen kerrosten tarkoituksesta

Keskustellaan siitä, kuinka hermoverkon kerrokset vastaavat odotuksiamme ensimmäiseltä oppitunnilta. Jos visualisoimme koulutetun hermoverkon ensimmäisen piilokerroksen neuronien painot, emme näe odotettuja lukuja, jotka vastaisivat lukujen pieniä aineosia. Näemme paljon vähemmän selkeitä kuvioita, jotka vastaavat sitä, kuinka hermoverkko minimoi kustannusfunktion.

Toisaalta herää kysymys, mitä odottaa, jos siirrät kuvan hermoverkkoon valkoista kohinaa? Voidaan olettaa, että neuroverkon ei pitäisi tuottaa mitään tietty määrä ja lähtökerroksen hermosoluja ei tule aktivoida tai jos ne aktivoituvat, niin tasaisesti. Sen sijaan hermoverkko vastaa satunnainen kuva antaa hyvin tarkan numeron.

Vaikka hermoverkko suorittaa numeroiden tunnistustoimintoja, sillä ei ole aavistustakaan siitä, miten ne kirjoitetaan. Itse asiassa tällaiset neuroverkot ovat melkoisia vanhaa tekniikkaa kehitetty 80-90-luvuilla. On kuitenkin erittäin hyödyllistä ymmärtää, kuinka tämäntyyppinen neuroverkko toimii, ennen kuin ymmärrät nykyisiä vaihtoehtoja, jotka voivat ratkaista useita mielenkiintoisia ongelmia. Mutta mitä enemmän tutkit, mitä hermoverkon piilotetut kerrokset tekevät, sitä vähemmän älykkäältä hermoverkko näyttää.

Strukturoidusta ja satunnaisesta datasta oppiminen

Tarkastellaanpa esimerkkiä modernista hermoverkosta tunnistamista varten erilaisia ​​esineitä todellista maailmaa.

Mitä tapahtuu, jos sekoitat tietokannan niin, että objektien nimet ja kuvat eivät enää täsmää? On selvää, että koska tiedot on merkitty satunnaisesti, testisarjan tunnistustarkkuus on tietysti huono. Harjoitussarjassa saat kuitenkin tunnistustarkkuuden samalla tasolla kuin jos tiedot olisi merkitty oikein.

Tämän huippuluokan hermoverkon miljoonat painot viritetään vastaamaan tarkasti dataa ja sen tokeneita. Vastaako kustannusfunktion minimointi mitään kuvakuvioita ja eroaako satunnaisesti merkityillä tiedoilla harjoittelusta väärin merkityillä tiedoilla tapahtuvasta harjoittelusta?

Jos koulutat hermoverkkoa tunnistusprosessissa satunnaisesti merkityillä tiedoilla, niin harjoitus tapahtuu hyvin hitaasti, kustannuskäyrä suhteessa otettujen askeleiden määrään käyttäytyy lähes lineaarisesti. Jos harjoitusta tapahtuu strukturoidulle datalle, kustannusfunktion arvo pienenee paljon pienemmässä määrässä iteraatioita.

3. Menetelmä takaisinlisäystä virheitä

Backpropagation on keskeinen hermoverkkojen koulutusalgoritmi. Keskustellaan ensin yleiskuvaus, mikä on menetelmä.

Neuronin aktivoinnin ohjaus

Algoritmin jokainen vaihe käyttää teoriassa kaikkia opetusjoukon esimerkkejä. Otetaan kuva kahdesta ja ollaan aivan harjoittelun alussa: painot ja siirrot konfiguroidaan satunnaisesti ja kuva vastaa jotakin tuloskerroksen aktivointien satunnaista kuviota.

Emme voi suoraan muuttaa viimeisen kerroksen aktivaatioita, mutta voimme vaikuttaa painoihin ja siirtymiin muuttaaksemme lähtökerroksen aktivointikuviota: pienentää kaikkien hermosolujen aktivaatioarvoja lukuun ottamatta vastaavaa kahta ja nostaa neuronien aktivointiarvoa. haluttu neuroni. Tässä tapauksessa mitä kauempana nykyinen arvo on halutusta arvosta, sitä enemmän tarvitaan lisäystä ja laskua.

Neuraaliverkon konfigurointivaihtoehdot

Keskitytään yhteen neuroniin, joka vastaa neuronin kaksi aktivaatiota lähtökerroksessa. Kuten muistamme, sen arvo on edellisen kerroksen neuronien aktivaatioiden painotettu summa plus siirtymä skaalausfunktioon (sigmoid tai ReLU) käärittynä.

Joten lisätäksemme tämän aktivoinnin arvoa, voimme:

  1. Lisää vaihtoa b.
  2. Lisää painoja w i .
  3. Muuta edellisen kerroksen aktivaatioita a i .

Painotetun summan kaavasta näet, että suurimman panoksen neuronin aktivoitumiseen antavat painot, jotka vastaavat yhteyksiä aktivoituimpiin hermosoluihin. Biologisia hermoverkkoja lähellä oleva strategia on lisätä painoja w i suhteessa edellisen kerroksen vastaavien neuronien aktivaatioiden suuruuteen a i. Osoittautuu, että aktivoiduimmat neuronit ovat yhteydessä siihen neuroniin, jonka haluamme aktivoida vain "vahvimmilla" yhteyksillä.

Toinen samanlainen lähestymistapa on muuttaa edellisen kerroksen a i neuronien aktivaatioita suhteessa painoihin w i . Emme voi muuttaa neuronien aktivaatiota, mutta voimme muuttaa vastaavia painoja ja siirtymiä ja siten vaikuttaa hermosolujen aktivaatioon.

Takaisin eteneminen

Toiseksi viimeistä neuronikerrosta voidaan pitää samalla tavalla kuin lähtökerrosta. Keräät tietoa siitä, kuinka tämän kerroksen neuronien aktivaatioiden pitäisi muuttua, jotta lähtökerroksen aktivaatiot muuttuisivat.

On tärkeää ymmärtää, että kaikki nämä toimet eivät tapahdu vain kahta vastaavan neuronin kanssa, vaan myös kaikkien lähtökerroksen neuronien kanssa, koska jokainen nykyisen kerroksen neuroni on kytketty kaikkiin edellisen kerroksen neuroniin.

Kun olet tehnyt yhteenvedon kaikki nämä tarvittavat muutokset toiseksi viimeiselle kerrokselle, ymmärrät kuinka toisen kerroksen lopusta pitäisi muuttua. Sitten toistat rekursiivisesti saman prosessin määrittääksesi kaikkien tasojen painojen ja poikkeamien ominaisuudet.

Klassinen kaltevuuslasku

Tämän seurauksena koko toiminta yhdellä kuvalla johtaa tarvittavien muutosten löytämiseen 13 tuhannessa painossa ja siirrossa. Toistamalla toiminnon kaikilla harjoitusjoukon esimerkeillä saat jokaiselle esimerkille muutosarvot, jotka voit sitten laskea keskiarvon kullekin parametrille erikseen.

Tämän keskiarvon laskemisen tulos edustaa kustannusfunktion negatiivisen gradientin sarakevektoria.

Stokastinen gradienttilasku

Koko harjoitussarjan huomioon ottaminen yhden askeleen laskemiseksi hidastaa kaltevuuden laskuprosessia. Siksi yleensä tehdään seuraavaa.

Harjoitusjoukon tiedot sekoitetaan satunnaisesti ja jaetaan alaryhmiin, esimerkiksi 100 merkittyä kuvaa. Seuraavaksi algoritmi laskee gradientin laskeutumisaskeleen yhdelle alaryhmälle.

Tämä ei ole täsmälleen todellinen gradientti kustannusfunktiolle, joka vaatii kaikki opetusjoukon tiedot, mutta koska tiedot valitaan satunnaisesti, se antaa hyvän likiarvon ja mikä tärkeintä, mahdollistaa merkittävän laskentanopeuden lisäämisen.

Jos piirrämme tällaisen modernisoidun kaltevuuslaskeuman oppimiskäyrän, se ei näytä yhtenäiseltä, määrätietoiselta laskeutumiselta mäkeä alas, vaan humalaisen mutkikkaalta liikeradalta, mutta tekee enemmän nopeita askeleita ja myös toiminnan vähimmäistaso.

Tätä lähestymistapaa kutsutaan stokastiseksi gradienttilaskuksi.

Lisäys. Matematiikka backpropagationin takana

Katsotaanpa nyt hieman muodollisemmin takaisinpropagointialgoritmin matemaattista taustaa.

Primitiivinen neuroverkkomalli

Aloitetaan tarkastelu äärimmäisen yksinkertaisella neuroverkolla, joka koostuu neljästä kerroksesta, jossa jokaisessa kerroksessa on vain yksi neuroni. Näin ollen verkossa on kolme painoa ja kolme vuoroa. Tarkastellaan kuinka herkkä funktio on näille muuttujille.

Aloitetaan kahden viimeisen neuronin välisestä yhteydestä. Merkitään viimeistä kerrosta L, toiseksi viimeistä kerrosta L-1 ja niissä olevien kyseisten hermosolujen aktivaatioita a (L) , a (L-1) .

Kustannustoiminto

Kuvitellaan, että koulutusesimerkin antaman viimeisen neuronin haluttu aktivointiarvo on y, esimerkiksi 0 tai 1. Kustannusfunktio on siis määritelty tälle esimerkille seuraavasti:

C 0 = (a (L) - y) 2.

Muista, että tämän viimeisen neuronin aktivointi saadaan painotetulla summalla tai pikemminkin painotetun summan skaalausfunktiolla:

a(L) = σ (w (L) a (L-1) + b (L)).

Lyhyyden vuoksi painotettu summa voidaan merkitä kirjaimella, jossa on sopiva alaindeksi, esimerkiksi z(L):

a(L) = σ (Z l)).

Tarkastellaan kuinka pienet muutokset painossa w (L) vaikuttavat kustannusfunktion arvoon. Tai matemaattinen kieli, mikä on kustannusfunktion derivaatta suhteessa painoon ∂C 0 /∂w (L) ?

Voidaan nähdä, että C 0:n muutos riippuu muutoksesta a (L), joka puolestaan ​​riippuu z (L) muutoksesta, joka riippuu w:stä (L). Samankaltaisten johdannaisten ottamista koskevan säännön mukaan haluttu arvo määräytyy seuraavien osittaisten johdannaisten tulolla:

∂C 0 /∂w (L) = ∂z (L) /∂w (L) ∂a (L) /∂z (L) ∂C 0 /∂a (L) .

Johdannaisten määritelmä

Lasketaan vastaavat johdannaiset:

∂C 0 /∂a (L) = 2(a (L) - y)

Eli derivaatta on verrannollinen nykyisen aktivointiarvon ja halutun arvon erotukseen.

Ketjun keskimääräinen derivaatta on yksinkertaisesti skaalausfunktion derivaatta:

∂a (L) /∂z (L) = σ"(z (L))

Ja lopuksi, viimeinen tekijä on painotetun summan johdannainen:

∂z (L) / ∂w (L) = a (L-1)

Siten vastaava muutos määräytyy sen mukaan, kuinka paljon edellinen neuroni on aktivoitunut. Tämä liittyy edellä mainittuun ajatukseen, että yhdessä palavat neuronit muodostavat vahvemman yhteyden.

Lopullinen lauseke:

∂C 0 /∂w (L) = 2(a (L) - y) σ"(z (L)) a (L-1)

Takaisin eteneminen

Muista, että määrätty derivaatta on vain opetusnäytteen C 0 erillisen esimerkin kustannuksia varten. Kustannusfunktiolle C, kuten muistamme, meidän on laskettava keskiarvo kaikista koulutusjoukon esimerkeistä:

∂C/∂w (L) = 1/n Σ ∂C k /∂w (L)

Saatu keskiarvo tietylle w(L):lle on yksi kustannusfunktion gradientin komponenteista. Vaihtojen huomioon ottaminen on identtinen yllä olevan painojen kanssa.

Saatuamme vastaavat derivaatat voimme jatkaa edellisten kerrosten tarkastelua.

Malli, jossa on useita neuroneja kerroksessa

Kuitenkin, kuinka tehdä siirtyminen yhden hermosolun sisältävistä kerroksista alun perin harkittuun hermoverkkoon. Kaikki näyttää samalta, lisätään vain ylimääräinen alaindeksi, joka heijastaa kerroksen sisällä olevan neuronin numeroa, ja painoilla on kaksoisalaindeksit, esimerkiksi jk, joka heijastaa kerroksen L neuronin j yhteyttä toiseen neuroniin k kerroksessa L-1.

Lopulliset johdannaiset antavat tarvittavat komponentit gradientin ∇C komponenttien määrittämiseksi.

Voit harjoitella kuvattua numeroiden tunnistustehtävää käyttämällä GitHubin koulutusvarastoa ja mainittua MNIST-numeroiden tunnistustietoaineistoa.

  • Opetusohjelma

Olen pitkään halunnut kirjoittaa yleisen artikkelin, joka sisältää kuvantunnistuksen perusteet, eräänlaisen oppaan perusmenetelmiä, kertoo milloin niitä tulee käyttää, mitä ongelmia ne ratkaisevat, mitä voi tehdä illalla polvillaan ja mitä on parempi olla ajattelematta ilman 20 hengen tiimiä.

Olen kirjoittanut joitain artikkeleita optisesta tunnistuksesta jo pitkään, joten ihmiset kirjoittavat minulle pari kertaa kuukaudessa erilaisia ​​ihmisiä kysymyksiä tästä aiheesta. Joskus tulee tunne, että asut heidän kanssaan erilaisia ​​maailmoja. Ymmärrät toisaalta, että henkilö on todennäköisesti jonkin aiheeseen liittyvä ammattilainen, mutta tietää optisista tunnistusmenetelmistä hyvin vähän. Ja ärsyttävintä on se, että hän yrittää soveltaa menetelmää läheiseltä tietoalueelta, joka on looginen, mutta ei täysin toimi kuvantunnistuksessa, mutta ei ymmärrä tätä ja loukkaantuu hyvin, jos alkaa kertoa hänelle jotain ihan perusasiat. Ja kun otetaan huomioon, että perusasioista kertominen vie paljon aikaa, jota usein ei ole saatavilla, siitä tulee vielä surullisempaa.

Tämä artikkeli on tarkoitettu siihen, että henkilö, joka ei ole koskaan työskennellyt kuvantunnistusmenetelmien kanssa, voi 10-15 minuutissa luoda päähänsä tietyn aihetta vastaavan peruskuvan maailmasta ja ymmärtää, mihin suuntaan kaivaa. Monet tässä kuvatuista tekniikoista soveltuvat tutka- ja äänenkäsittelyyn.
Aloitan parilla periaatteella, joita alamme aina kertoa potentiaaliselle asiakkaalle tai henkilölle, joka haluaa aloittaa optisen tunnistuksen:

  • Kun ratkaiset ongelman, lähde aina yksinkertaisimmasta. On paljon helpompaa laittaa oranssi tunniste henkilöön kuin seurata henkilöä korostamalla häntä sarjassa. On paljon helpompaa ottaa kamera korkeammalla resoluutiolla kuin kehittää superresoluutioinen algoritmi.
  • Ongelman tiukka muotoilu optisissa tunnistusmenetelmissä on suuruusluokkaa tärkeämpi kuin järjestelmäohjelmointiongelmissa: yksi turha sana voi lisätä 50% työstä teknisiin eritelmiin.
  • Tehtävissä ei ole tunnustusta universaaleja ratkaisuja. Et voi luoda algoritmia, joka yksinkertaisesti "tunnistaa minkä tahansa merkinnän". Kyltti kadulla ja tekstiarkki ovat pohjimmiltaan erilaisia ​​esineitä. On luultavasti mahdollista luoda yleinen algoritmi (tässä hyvä esimerkki Googlelta), mutta se vaatii paljon työtä suurelta tiimiltä ja koostuu kymmenistä erilaisista aliohjelmista.
  • OpenCV on raamattu, jolla on monia menetelmiä ja joka voi ratkaista 50% melkein kaikista ongelmista, mutta OpenCV on vain pieni osa siitä, mitä voidaan todella tehdä. Eräässä tutkimuksessa kirjoitettiin johtopäätökset: "Ongelmaa ei voida ratkaista OpenCV-menetelmillä, joten se on ratkaisematon." Yritä välttää tätä, älä ole laiska ja arvioi raittiisti nykyinen tehtävä tyhjästä joka kerta käyttämättä OpenCV-malleja.
On erittäin vaikeaa antaa yleispäteviä neuvoja tai kertoa, kuinka luoda jonkinlainen rakenne, jonka ympärille voit rakentaa ratkaisun mielivaltaisiin ongelmiin konenäkö. Tämän artikkelin tarkoituksena on jäsentää, mitä voidaan käyttää. Yritän jakaa olemassa olevat menetelmät kolmeen ryhmään. Ensimmäinen ryhmä on esisuodatus ja kuvan valmistelu. Toinen ryhmä on suodatustulosten looginen käsittely. Kolmas ryhmä ovat loogiseen käsittelyyn perustuvat päätöksentekoalgoritmit. Ryhmien väliset rajat ovat hyvin mielivaltaisia. Ongelman ratkaisemiseksi ei aina tarvitse käyttää menetelmiä kaikista ryhmistä, joskus kaksi ja joskus jopa yksi.

Tässä annettu menetelmien luettelo ei ole täydellinen. Suosittelen lisäämään kommentteihin kriittisiä menetelmiä, joita en ole kirjoittanut, ja liittämällä kuhunkin 2-3 oheissanaa.

Osa 1. Suodatus

Tähän ryhmään laitoin menetelmät, joiden avulla voit valita kuvista kiinnostavia alueita analysoimatta niitä. Useimmat näistä menetelmistä soveltavat jonkinlaista yksittäistä muunnosta kuvan kaikkiin kohtiin. Suodatustasolla ei tehdä kuva-analyysiä, mutta suodatettuja pisteitä voidaan pitää alueina, joilla on erityispiirteitä.
Binarisointi kynnyksen mukaan, histogrammin alueen valinta
Yksinkertaisin muunnos on kuvan binarisointi kynnyksen mukaan. RGB- ja harmaasävykuvissa kynnys on väriarvo. On ihanteellisia ongelmia, joissa tällainen muunnos riittää. Oletetaan, että haluat valita objektit automaattisesti valkoisella paperiarkilla:




Sen kynnyksen valinta, jolla binarisointi tapahtuu, määrää suurelta osin itse binarisointiprosessin. SISÄÄN tässä tapauksessa, kuva binaarisoitiin keskimääräisellä värillä. Tyypillisesti binarisointi suoritetaan käyttämällä algoritmia, joka valitsee mukautuvasti kynnyksen. Tällainen algoritmi voi olla odotuksen tai tilan valinta. Tai voit valita histogrammin suurimman huipun.

Binarisointi voi antaa erittäin mielenkiintoisia tuloksia histogrammien kanssa työskenneltäessä, myös tilanteessa, jossa emme harkitse kuvaa RGB-muodossa, vaan HSV-muodossa. Esimerkiksi segmenttivärit kiinnostavat. Tällä periaatteella voit rakentaa sekä tunnisteenilmaisimen että ihmisihotunnistimen.
Klassinen suodatus: Fourier, alipäästösuodatin, ylipäästösuodatin
Klassisia tutkasuodatus- ja signaalinkäsittelymenetelmiä voidaan soveltaa menestyksekkäästi erilaisiin kuvioiden tunnistustehtäviin. Perinteinen menetelmä tutkassa, jota ei melkein koskaan käytetä kuvissa puhdas muoto, on Fourier-muunnos (tarkemmin sanottuna FFT). Yksi harvoista poikkeuksista, joissa yksiulotteista Fourier-muunnosta käytetään, on kuvan pakkaus. Kuva-analyysiin yksiulotteinen muunnos ei yleensä riitä, sinun on käytettävä paljon resursseja vaativampaa kaksiulotteista muunnosa.

Harvat ihmiset todella laskevat sen, yleensä on paljon nopeampaa ja helpompaa käyttää kiinnostavan alueen konvoluutiota valmiilla suodattimella, joka on viritetty korkeille (HPF) tai matalille (LPF) taajuuksille. Tämä menetelmä ei tietenkään salli spektrianalyysiä, mutta sisään tietty tehtävä Videon käsittely ei yleensä vaadi analyysiä, vaan tuloksia.


Eniten yksinkertaisia ​​esimerkkejä suodattimet, jotka toteuttavat alleviivauksen matalat taajuudet(Gauss-suodatin) ja korkeat taajuudet(Gabor-suodatin).
Jokaiselle kuvapisteelle valitaan ikkuna ja kerrotaan samankokoisella suodattimella. Tällaisen konvoluution tulos on uusi pistearvo. Alipäästösuotimia ja ylipäästösuodattimia käytettäessä saadaan seuraavan tyyppisiä kuvia:



Aallot
Mutta entä jos käytämme jotain mielivaltaista ominaisfunktiota signaalin konvoluutioon? Sitten sitä kutsutaan nimellä "Wavelet-muunnos". Tämä aallokkojen määritelmä ei ole oikea, mutta perinteisesti aallokkoanalyysi on monissa ryhmissä mielivaltaisen kuvion etsimistä kuvasta käyttämällä konvoluutiota tämän kuvion mallilla. On setti klassisia toimintoja, jota käytetään wavelet-analyysissä. Näitä ovat Haar-aalto, Morlet-aalto, meksikolainen hattu-aalto jne. Haar primitiivit, joista oli useita aiempia artikkeleitani (,), liittyvät tällaisiin kaksiulotteisen avaruuden funktioihin.


Yllä on 4 esimerkkiä klassisista aalloista. 3-ulotteinen Haar-aalto, 2-ulotteinen Meyer-aalto, Meksikon Hat-aalto, Daubechies-aalto. Hyvä esimerkki Aallokkojen laajennetun tulkinnan käyttäminen on ongelma löytää häikäisy silmästä, jossa aallokko on itse häikäisy:

Klassisia waveletteja käytetään yleensä kuvan pakkaamiseen tai kuvan luokitukseen (kuvataan alla).
Korrelaatio
Tällaisen vapaan aallokeiden tulkinnan jälkeen on syytä mainita niiden taustalla oleva todellinen korrelaatio. Kuvia suodatettaessa tämä välttämätön työkalu. Klassinen sovellus korreloi videovirtaa siirtymien tai optisten virtojen löytämiseksi. Yksinkertaisin siirtoilmaisin on myös tietyssä mielessä erokorrelaattori. Siellä missä kuvat eivät korreloineet, siellä oli liikettä.

Suodatustoiminnot
Mielenkiintoinen suodattimien luokka on funktiosuodatus. Nämä ovat puhtaasti matemaattisia suodattimia, joiden avulla voit havaita yksinkertaisia matemaattinen funktio kuvassa (suora viiva, paraabeli, ympyrä). Muodostetaan kerääntyvä kuva, jossa jokaiselle alkuperäisen kuvan pisteelle piirretään sarja sen luovia funktioita. Klassisin muunnos on Hough-muunnos linjoille. Tässä muunnoksessa kullekin pisteelle (x;y) piirretään joukko pisteitä (a;b) suorasta y=ax+b, jolle yhtälö on tosi. Saat kauniita kuvia:


(ensimmäinen plus on sille, joka löytää ensimmäisenä saaliin kuvasta ja tästä määritelmästä ja selittää sen, toinen plus on sille, joka sanoo ensimmäisenä mitä tässä näytetään)
Hough-muunnoksen avulla voit löytää mitkä tahansa parametroitavat funktiot. Esimerkiksi piirit. On muokattu muunnos, jonka avulla voit etsiä mitä tahansa muotoja. Matemaatikot pitävät tästä muutoksesta kamalasti. Mutta kun kuvia käsitellään, se ei valitettavasti aina toimi. Erittäin hidas nopeus työ, erittäin korkea herkkyys binarisoinnin laadulle. Ihannetilanteissakin tyytyäni mieluummin muihin menetelmiin.
Hough-muunnoksen analogi suorille viivoille on Radon-muunnos. Se lasketaan FFT:llä, joka antaa suorituskyvyn lisäyksen tilanteessa, jossa pisteitä on paljon. Lisäksi sitä voidaan soveltaa ei-binarisoituun kuvaan.
Ääriviivojen suodatus
Erillinen suodatinluokka on reuna- ja ääriviivasuodatus. Ääriviivat ovat erittäin hyödyllisiä, kun haluamme siirtyä kuvan käsittelystä kuvan objektien käsittelyyn. Kun esine on melko monimutkainen, mutta hyvin erottuva, niin usein ainoa tapa sen kanssa työskenteleminen on sen ääriviivojen korostamista. On olemassa useita algoritmeja ongelman ratkaisemiseksi suodatuspiirit:

Useimmiten käytetään Canny, joka toimii hyvin ja jonka toteutus on OpenCV:ssä (Sobel on myös siellä, mutta se etsii ääriviivoja huonommin).



Muut suodattimet
Yllä on suodattimet, joiden muutokset auttavat ratkaisemaan 80-90% ongelmista. Mutta niiden lisäksi paikallisissa tehtävissä käytetään harvinaisempia suodattimia. Tällaisia ​​suodattimia on kymmeniä, en luettele niitä kaikkia. Mielenkiintoisia ovat iteratiiviset suodattimet (esimerkiksi aktiivinen ulkoasumalli) sekä harjanne- ja kaarevuusmuunnokset, jotka ovat fuusio klassisesta aallokesuodatuksesta ja radonmuunnoskentän analyysistä. Beamlet-muunnos toimii kauniisti aallokemuunnoksen rajalla ja looginen analyysi, jonka avulla voit valita ääriviivat:

Mutta nämä muutokset ovat hyvin erityisiä ja räätälöityjä harvinaisiin tehtäviin.

Osa 2. Suodatustulosten looginen käsittely

Suodatus tarjoaa joukon tietoja, jotka soveltuvat käsittelyyn. Mutta usein et voi vain ottaa ja käyttää näitä tietoja käsittelemättä niitä. Tässä osiossa on useita klassisia menetelmiä, joiden avulla voit siirtyä kuvasta objektien ominaisuuksiin tai itse objekteihin.
Morfologia
Siirtymä suodatuksesta logiikkaan on mielestäni matemaattisen morfologian menetelmät (, ,). Pohjimmiltaan nämä ovat yksinkertaisimpia operaatioita binäärikuvien kasvattamiseen ja syöpymiseen. Näiden menetelmien avulla voit poistaa kohinaa binäärikuvasta lisäämällä tai vähentämällä olemassa olevia elementtejä. On olemassa matemaattiseen morfologiaan perustuvia ääriviivaalgoritmeja, mutta yleensä käytetään jonkinlaisia ​​hybridialgoritmeja tai algoritmeja yhdistelmänä.
Ääriviiva-analyysi
Algoritmit rajojen saamiseksi on jo mainittu suodatusta käsittelevässä osiossa. Tuloksena olevat rajat muunnetaan yksinkertaisesti ääriviivoiksi. Canny-algoritmille tämä tapahtuu automaattisesti. Voit saada ääriviivan binäärialgoritmille esimerkiksi käyttämällä kovakuoriaisalgoritmia.
Ääriviiva on esineen ainutlaatuinen ominaisuus. Tämän avulla voit usein tunnistaa kohteen sen ääriviivojen perusteella. On olemassa tehokas matemaattinen laite, jonka avulla voit tehdä tämän. Laitetta kutsutaan ääriviivaanalyysiksi (,).

Rehellisesti sanottuna en ole koskaan voinut soveltaa ääriviiva-analyysiä todellisiin ongelmiin. Liian ihanteelliset olosuhteet vaaditaan. Joko rajaa ei ole tai melua on liikaa. Mutta jos sinun on tunnistettava jotain ihanteellisissa olosuhteissa, ääriviivaanalyysi on loistava vaihtoehto. Se toimii erittäin nopeasti, kaunis matematiikka ja selkeä logiikka.
Erikoispisteet
Yksittäiset pisteet ovat kohteen ainutlaatuisia ominaisuuksia, joiden avulla objektia voidaan verrata itseensä tai vastaaviin objektiluokkiin. On olemassa useita kymmeniä tapoja tunnistaa tällaiset kohdat. Jotkut menetelmät tunnistavat erityispisteitä viereisistä kehyksistä, jotkut pitkän ajan kuluttua ja valaistuksen muuttuessa, jotkut mahdollistavat erikoispisteiden löytämisen, jotka pysyvät sellaisina myös kohdetta käännettäessä. Aloitetaan menetelmillä, joiden avulla voimme löytää erikoispisteitä, jotka eivät ole niin vakaita, mutta jotka lasketaan nopeasti, ja sitten mennään yhä monimutkaisemmiksi:
Ensiluokkainen. Erikoispisteet, jotka ovat vakaita sekuntien ajan. Tällaisia ​​pisteitä käytetään ohjaamaan kohdetta vierekkäisten videokehysten välillä tai yhdistämään kuvia vierekkäisistä kameroista. Tällaisia ​​pisteitä ovat kuvan paikalliset maksimit, kuvan kulmat (paras ilmaisin on ehkä Charis-detektori), pisteet, joissa saavutetaan maksimaalinen hajonta, tietyt gradientit jne.
Toinen luokka. Erikoispisteet, jotka ovat vakaat valaistuksen vaihtuessa ja kohteen pienissä liikkeissä. Tällaisia ​​pisteitä käytetään ensisijaisesti koulutukseen ja objektityyppien myöhempään luokitteluun. Esimerkiksi jalankulkijoiden luokitin tai kasvojen luokitin on juuri tällaisille pisteille rakennetun järjestelmän tulos. Jotkut aiemmin mainituista aalloista voivat olla perustana tällaisille pisteille. Esimerkiksi Haar primitiivit, etsi kohokohtia, etsi muita erityisiä toimintoja. Näihin pisteisiin kuuluvat suuntagradienttien histogrammimenetelmällä (HOG) löydetyt pisteet.
Kolmas luokka. Vakaat pisteet. Tiedän vain kaksi menetelmää, jotka tarjoavat täydellisen vakauden, ja niiden muutoksista. Nämä ovat SURF ja SIFT. Niiden avulla voit löytää erikoispisteitä, vaikka käännät kuvaa. Tällaisten pisteiden laskeminen kestää kauemmin verrattuna muihin menetelmiin, mutta se riittää rajoitettu aika. Valitettavasti nämä menetelmät ovat patentoituja. Vaikka Venäjällä on mahdotonta patentoida algoritmeja, joten käytä sitä kotimarkkinoilla.

Osa 3. Koulutus

Tarinan kolmas osa on omistettu menetelmille, jotka eivät toimi suoraan kuvan kanssa, mutta joiden avulla voit tehdä päätöksiä. Pääosin erilaisia ​​menetelmiä koneoppiminen ja päätöksenteko. Äskettäin Yandyx julkaisi kurssin tästä aiheesta Habrissa, se on hyvin hyvä valikoima. Tässä se on tekstiversiona. Aiheen vakavaa tutkimista varten suosittelen niiden katsomista. Yritän tässä hahmotella useita päämenetelmiä, joita käytetään erityisesti hahmontunnistuksessa.
80 %:ssa tilanteista oppimisen ydin tunnistustehtävässä on seuraava:
On testinäyte, joka sisältää useita objektiluokkia. Olkoon se henkilön läsnäolo/poissaolo valokuvassa. Jokaiselle kuvalle on joukko ominaisuuksia, jotka on korostettu jollakin ominaisuudella, olipa kyseessä sitten Haar, HOG, SURF tai jokin aalloke. Oppimisalgoritmin tulee rakentaa malli, jonka mukaan se pystyy analysoimaan uutta kuvaa ja päättämään, mikä kohde kuvassa on.
Miten se on tehty? Jokainen testikuva on piste ominaisuusavaruudessa. Sen koordinaatit ovat kuvan kunkin ominaisuuden paino. Olkoot merkkimme: "Silmien läsnäolo", "Nenän läsnäolo", "Kahden käden läsnäolo", "Korvien läsnäolo" jne... Korostamme kaikkia näitä merkkejä käyttämällä olemassa olevia ilmaisimia, jotka on koulutettu ihmisen kaltaiset ruumiinosat Tällaisessa tilassa olevalle henkilölle oikea kohta olisi . Apinalle piste hevoselle. Luokittelija opetetaan esimerkkinäytteillä. Mutta kaikissa valokuvissa ei näkynyt käsiä, toisilla ei ollut silmiä, ja kolmannessa apinalla oli ihmisen nenä luokitteluvirheen vuoksi. Koulutettu ihmisluokittelija jakaa ominaisuustilan automaattisesti siten, että se sanoo: jos ensimmäinen piirre on alueella 0,5 Pohjimmiltaan luokittelijan tavoitteena on piirtää piirreavaruuteen alueita, jotka ovat ominaisia ​​luokitteluobjekteille. Tältä näyttää vastauksen peräkkäinen approksimaatio yhdelle luokittelijoista (AdaBoost) kaksiulotteisessa avaruudessa:


Luokittajia on paljon. Jokainen niistä toimii paremmin jossain tietyssä tehtävässä. Tehtävä valita luokittelu tiettyä tehtävää varten on suurelta osin taidetta. Tässä muutamia kauniita kuvia aiheesta.
Yksinkertainen kotelo, yksiulotteinen erottelu
Katsotaanpa esimerkkiä yksinkertaisimmasta luokittelutapauksesta, kun piirreavaruus on yksiulotteinen ja meidän on erotettava 2 luokkaa. Tilanne esiintyy useammin kuin uskotkaan: esimerkiksi silloin, kun sinun on erotettava kaksi signaalia tai verrattava kuviota näytteeseen. Otetaan esimerkki harjoittelusta. Tämä tuottaa kuvan, jossa X-akseli on samankaltaisuuden mitta ja Y-akseli on tapahtumien lukumäärä tällaisella mitalla. Kun haluttu kohde on samankaltainen kuin itse, saadaan vasen Gaussin. Kun se ei näytä siltä, ​​se on oikea. Arvo X=0,4 erottaa näytteet siten, että väärä päätös minimoi väärän päätöksen tekemisen todennäköisyyden. Tällaisen erottimen etsiminen on luokittelutehtävä.


Pieni huomautus. Kriteeri, joka minimoi virheen, ei aina ole optimaalinen. Seuraava kaavio on kaavio todellisesta iiriksen tunnistusjärjestelmästä. Tällaisessa järjestelmässä kriteeri valitaan minimoimaan luvattoman henkilön väärän pääsyn todennäköisyys laitokseen. Tätä todennäköisyyttä kutsutaan "tyypin I virheeksi", "väärän hälytyksen todennäköisyydeksi", "väärä positiiviseksi". Englanninkielisessä kirjallisuudessa "False Access Rate".
) AdaBusta on yksi yleisimmistä luokittelijoista. Esimerkiksi Haar-kaskadi on rakennettu sen päälle. Yleensä käytetään, kun tarvitaan binääriluokitusta, mutta mikään ei estä harjoittelua suuremmalle määrälle luokkia.
SVM ( , , , ) Yksi tehokkaimmista luokittelijoista, jolla on monia toteutuksia. Periaatteessa kohtaamissani oppimistehtävissä se toimi samalla tavalla kuin Adabusta. Sitä pidetään melko nopeana, mutta sen harjoittelu on Adabustaa vaikeampaa ja vaatii oikean ytimen valitsemista.

On myös hermoverkkoja ja regressiota. Mutta jotta voimme luokitella ne lyhyesti ja näyttää, kuinka ne eroavat toisistaan, tarvitsemme tätä paljon pidemmän artikkelin.
________________________________________________
Toivon, että pystyin antamaan nopean yleiskatsauksen käytetyistä menetelmistä sukeltamatta matematiikkaan ja kuvaukseen. Ehkä tämä auttaa jotakuta. Vaikka artikkeli on tietysti epätäydellinen, eikä siinä ole sanaakaan stereokuvien kanssa työskentelystä, LSM:stä Kalman-suodattimella eikä mukautuvasta Bayes-lähestymistavasta.
Jos pidät artikkelista, yritän tehdä toisen osan, jossa on valikoima esimerkkejä olemassa olevien ImageRecognition-ongelmien ratkaisemisesta.

Ja lopuksi

Mitä lukea?
1) Pidin joskus todella B. Yanen kirjasta "Digital Image Processing", joka on kirjoitettu yksinkertaisesti ja selkeästi, mutta samalla melkein kaikki matematiikka on annettu. Hyvä tutustua olemassa oleviin menetelmiin.
2) Genren klassikko on R. Gonzalez, R. Woods "Digital Image Processing". Jostain syystä se oli minulle vaikeampi kuin ensimmäinen. Paljon vähemmän matematiikkaa, mutta enemmän menetelmiä ja kuvia.
3) "Kuvankäsittely ja analyysi tietokonenäköongelmissa" - kirjoitettu fysiikan ja tekniikan laitoksella opetetun kurssin perusteella. Menetelmiä ja niiden yksityiskohtaisia ​​kuvauksia on monia. Mutta mielestäni kirjassa on kaksi suurta haittaa: kirja keskittyy vahvasti sen mukana tulevaan ohjelmistopakettiin, liian usein yksinkertaisen menetelmän kuvaus muuttuu matemaattiseksi viidakoksi, josta on vaikea poistua; johda menetelmän rakennekaavio. Mutta kirjoittajat ovat tehneet kätevän verkkosivuston, jossa melkein kaikki sisältö esitetään - wiki.technicalvision.ru Lisää tunnisteita

Tämä projekti ei väitä olevansa ensimmäinen paikka maailmassa, eikä sitä pidetä kilpailijana FineReader, mutta toivon, että ajatus hahmojen tunnistamisesta Euler-ominaisuudella on uusi.

Johdatus kuvan Euler-ominaisuuteen.

Perusideana on, että otat mustavalkoisen kuvan, ja jos oletetaan, että 0 on valkoinen pikseli ja 1 on musta pikseli, koko kuva on nollien ja ykkösten matriisi. Tässä tapauksessa mustavalkoinen kuva voidaan esittää 2 x 2 pikselin fragmenttien joukkona, kaikki mahdolliset yhdistelmät on esitetty kuvassa:

Jokaisessa kuvassa kuva1, kuva2,... näyttää algoritmin laskentavaiheen punaisen neliön, jonka sisällä on yksi fragmenteista F yllä olevasta kuvasta. Jokaisessa vaiheessa jokainen fragmentti summataan, jolloin saadaan kuva Alkuperäinen saamme joukon: , tästä lähtien sitä kutsutaan kuvan Euler-ominaispiirteeksi tai ominaisjoukoksi.


KOMMENTTI: käytännössä F0-arvoa (alkuperäiselle kuvalle tämä arvo on 8) ei käytetä, koska se on kuvan tausta. Siksi käytetään 15 arvoa alkaen F1:stä F15:een.

Kuvalle ominaisen Eulerin ominaisuudet.

  1. Ominaisuusjoukon arvo on ainutlaatuinen, toisin sanoen ei ole kahta kuvaa, joilla on sama Euler-ominaisuus.
  2. Ei ole olemassa algoritmia ominaisuusjoukon muuntamiseksi alkuperäiseen kuvaan, ainoa tapa on raaka voima.

Mikä on tekstintunnistusalgoritmi?

Kirjainten tunnistuksen ideana on, että laskemme etukäteen Euler-ominaisuuden kaikille kielen aakkosten merkeille ja tallennamme sen tietokantaan. Sitten laskemme Euler-ominaisuuden tunnistetun kuvan osille ja etsimme sen tietokannasta.

Tunnustuksen vaiheet:

  1. Kuva voi olla joko mustavalkoinen tai värillinen, joten ensimmäinen vaihe on kuvan approksimaatio eli mustavalkoisen saaminen siitä.
  2. Teemme pikseli pikseliltä läpi koko kuvan mustien pikselien löytämiseksi. Kun varjostettu pikseli havaitaan, rekursiivinen toiminto käynnistetään etsiäkseen kaikki löydetyn ja sitä seuraavat varjostetut pikselit. Seurauksena saamme kuvan katkelman, joka voi olla joko kokonainen hahmo tai sen osa tai "roska", joka tulee hävittää.
  3. Kun kuvan kaikki liittämättömät osat on löydetty, jokaiselle lasketaan Euler-ominaisuus.
  4. Seuraavaksi analysaattori käynnistyy ja jokaisen fragmentin läpi käymällä määrittää, onko sen Euler-ominaisuuden arvo tietokannassa. Jos löydämme arvon, katsomme, että se on tunnistettu fragmentti kuvasta, muuten jätämme sen lisätutkimukseen.
  5. Kuvan tunnistamattomat osat ovat heuristisen analyysin kohteena, eli yritän löytää tietokannasta sopivimman arvon Eulerin ominaisuuden arvon perusteella. Jos ei ollut mahdollista löytää, niin lähellä olevia fragmentteja yritetään "liimata yhteen" ja etsiä niille tulos tietokannasta. Mitä varten "liimaus" tehdään? Tosiasia on, että kaikki kirjaimet eivät koostu yhdestä jatkuvasta kuvasta, esimerkiksi "!" Huutomerkki sisältää 2 segmenttiä (tikku ja piste), joten ennen kuin etsit sitä tietokannasta, sinun on laskettava Euler-ominaisuuden kokonaisarvo molemmista osista. Jos edes vierekkäisillä segmenteillä liimauksen jälkeen ei löytynyt hyväksyttävää tulosta, pidämme fragmenttia roskana ja ohitamme sen.

Järjestelmän kokoonpano:

  1. Tietopohja- minun tai jonkun muun luoma tiedosto tai tiedostot, jotka sisältävät tunnusomaisia ​​merkistöjä ja joita tarvitaan tunnistamiseen.
  2. Ydin- sisältää perustoiminnot, jotka suorittavat tunnistusta
  3. Generaattori- moduuli tietokannan luomiseksi.

ClearType ja anti-aliasing.

Joten syötteenä meillä on tunnistettava kuva, ja tavoitteena on tehdä siitä mustavalkoinen, sopiva tunnistusprosessin käynnistämiseen. Vaikuttaa siltä, ​​​​että mikä voisi olla yksinkertaisempaa, laskemme kaikki valkoiset pikselit 0:ksi ja kaikki loput 1:ksi, mutta kaikki ei ole niin yksinkertaista. Kuvan teksti voi olla anti-aliasoitua tai ei-aliasoitua. Antialiasoidut merkit näyttävät sileiltä ja ilman kulmia, kun taas tasoittamattomat merkit näyttävät nykyaikaisilla näytöillä, joiden pikselit näkyvät ääriviivalla. LCD-näyttöjen (nestekidenäyttöjen) myötä luotiin ClearType (Windowsille) ja muun tyyppinen anti-aliasointi, joka hyödynsi näyttömatriisin ominaisuuksia. Tekstikuvan pikselit vaihtavat värejä, minkä jälkeen se näyttää paljon "pehmeämmältä". Nähdäksesi tasoituksen tuloksen, voit kirjoittaa jonkin kirjaimen (tai tekstin), esimerkiksi sisään mpaint, lähennä ja tekstistäsi on tullut jonkinlainen monivärinen mosaiikki.

Mikä hätänä? Miksi näemme tavallisen symbolin pienessä mittakaavassa? Pettääkö silmämme meitä? Tosiasia on, että LCD-näytön pikseli ei koostu yhdestä pikselistä, joka voi vastaanottaa halutun värin, vaan kolmesta 3 värin alipikselistä, jotka riittävät halutun värin saamiseksi. Siksi ClearTypen tavoitteena on saada visuaalisesti miellyttävin teksti käyttämällä LCD-näytön matriisin ominaisuutta, ja tämä saavutetaan käyttämällä alipikselitoistoa. Jokainen, jolla on "suurennuslasi", voi kokeilua varten suurentaa mitä tahansa kohtaa näytöllä, joka on päällä, ja nähdä matriisin alla olevan kuvan mukaisesti.

Kuvassa on 3x3 pikselin neliö LCD-matriisista.

Huomio! Tämä ominaisuus vaikeuttaa mustavalkokuvan saamista ja vaikuttaa suuresti tulokseen, koska sen avulla ei aina ole mahdollista saada samaa kuvaa, jonka Euler-ominaisuus on tallennettu tietokantaan. Siten kuvien ero pakottaa heuristiseen analyysiin, joka ei välttämättä aina onnistu.


Mustavalkoisen kuvan saaminen.

En ollut tyytyväinen Internetistä löydettyjen värin mustavalkoisten muunnosalgoritmien laatuun. Sovelluksensa jälkeen sublepixel-renderöityjen hahmojen kuvat muuttuivat leveydeltään erilaiseksi, kirjainriveihin ilmestyi katkoksia ja käsittämätöntä roskaa. Tämän seurauksena päätin saada mustavalkoisia kuvia analysoimalla pikselin kirkkautta. Kaikki pikselit kirkkaampia (arvoa suurempia) 130 yksikköä pidettiin mustina, loput valkoisina. Tämä menetelmä ei ole ihanteellinen ja johtaa silti epätyydyttävään tulokseen, jos tekstin kirkkaus muuttuu, mutta ainakin se sai tietokannan arvoja vastaavia kuvia. Toteutus näkyy LuminosityApproximator-luokassa.

Tietopohja.

Tietokannan täyttämisen alkuperäinen idea oli, että jokaiselle kielen kirjaimelle lasken tuloksena olevan symbolikuvan Euler-ominaisuuden 140 tietokoneelleni asennetulle kirjasimelle (C:\Windows\Fonts), lisään kaikki vaihtoehdot kirjasintyypeille (tavallinen, Rasvainen, Kursivointi) ja koot 8-32, mikä kattaa kaikki tai melkein kaikki kirjainten muunnelmat ja pohja tulee yleismaailmalliseksi, mutta valitettavasti tämä ei osoittautunut niin hyväksi kuin näyttää. Näillä ehdoilla sain tämän:

  1. Tietokantatiedosto osoittautui melko suureksi (noin 3 megatavua) venäjäksi ja englanniksi. Huolimatta siitä, että Eulerin ominaisuus on tallennettu yksinkertaisena 15 numeron pituisena merkkijonona ja itse tiedosto on pakattu arkisto (DeflateStream), joka sitten puretaan muistiin.
  2. Minulla kestää noin 10 sekuntia tietokannan sarjoittamiseen. Samaan aikaan ominaisuusjoukkojen vertailun aika kärsi. GetHashCode(:n) laskemiseen ei löytynyt funktiota, joten jouduin vertailemaan vähän kerrallaan. Ja verrattuna 3–5 kirjasimen tietokantaan, tekstianalyysiin kuluva aika 140 kirjasimen tietokannan kanssa lisääntyi 30–50 kertaa. Samanaikaisesti samoja ominaisuusjoukkoja ei tallenneta tietokantaan huolimatta siitä, että jotkut eri fonttien merkit voivat näyttää samalta ja olla samanlaisia, vaikka kirjasimia on esimerkiksi 20 ja 21.

Siksi minun piti luoda pieni tietokanta, joka menee Core-moduulin sisään ja mahdollistaa toimivuuden tarkistamisen. Tietokannan täyttämisessä on erittäin vakava ongelma. Kaikki fontit eivät näytä pieniä merkkejä oikein. Oletetaan, että merkki "e", kun se renderöidään fontilla 8, jonka nimi on "Franklin Gothic Medium", on:

Ja se muistuttaa vähän alkuperäistä. Lisäksi, jos lisäät sen tietokantaan, niin tämä huonontaa suuresti heuristiikan tuloksia, koska tämän kaltaisten symbolien analyysi on harhaanjohtavaa. D Tämä symboli hankittiin eri fonteilla eri kirjaimille. Itse tietokannan täyttöprosessia on ohjattava siten, että henkilö tarkistaa jokaisen symbolin kuvan kirjaimen noudattamisen ennen tietokantaan tallentamista. Mutta valitettavasti minulla ei ole niin paljon energiaa ja aikaa.

Merkkihakualgoritmi.

Sanon heti, että alun perin aliarvioin tämän ongelman haussa ja unohdin, että symbolit voivat koostua useista osista. Minusta tuntui, että pikseli pikseliltä kulkemisen aikana kohtasin symbolin, löydän sen osat, jos sellaisia ​​​​on, yhdistän ne ja analysoin niitä. Tyypillinen passi näyttäisi tältä: Etsin kirjaimen "H" (tietokannasta) ja katson, että kaikki ylimmän pisteen alapuolella ja alimman pisteen yläpuolella olevat merkit kuuluvat nykyiselle riville ja ne tulisi aliasoida yhdessä:

Mutta tämä on ihanteellinen tilanne tunnistuksen aikana, jouduin käsittelemään repeytyneitä kuvia, joissa kaiken lisäksi voi olla valtava määrä roskaa tekstin vieressä:


Tämä sana "kyllä" yrittää selittää analyysin monimutkaisuuden. Oletetaan, että tämä on täydellinen merkkijono, mutta b13 ja i6 ovat roskien fragmentteja approksimoinnin seurauksena. Merkistä "y" puuttuu piste, eikä mikään merkeistä ole tietokannassa, jotta voitaisiin varmuudella sanoa, että kyseessä on tekstirivi "c":stä "i"-riville. Ja viivan korkeus on meille erittäin tärkeä, koska liimaamista varten meidän on tiedettävä, kuinka lähelle palaset tulee "liimata yhteen" ja analysoida. Loppujen lopuksi voi olla tilanne, jossa alamme vahingossa liimata yhteen merkkejä kahdesta merkkijonosta ja tällaisen tunnistuksen tulokset ovat kaukana ihanteellisista.

Heuristiikka kuva-analyysissä.


Mitä heuristiikka on kuvantunnistuksessa?
Tämä on prosessi, jolla ominaisuusjoukko, jota ei ole tietokannassa, tunnistetaan oikeaksi aakkosten kirjaimeksi. Mietin pitkään analyysin suorittamista, ja lopulta menestynein algoritmi osoittautui seuraavaksi:

  1. Löydän tietokannasta kaikki ominaisuusjoukot, joilla on eniten arvoja F-fragmentit vastaa tunnistettua kuvaa.
  2. Seuraavaksi valitsen vain ne tunnusjoukot, joissa fragmentin epäyhtenäisiin F-arvoihin perustuvan tunnistettavan kuvan kanssa ero on enintään +- 1 yksikkö: -1< F < 1. И это все подсчитывается для каждой буквы алфавита.
  3. Sitten löydän symbolin, jolla on eniten esiintymiä. Se on heuristisen analyysin tulos.
Tämä algoritmi ei anna parhaita tuloksia pienillä merkkikuvilla (fonttikoko 7 - 12) . Mutta se voi johtua siitä, että tietokanta sisältää tunnusjoukot samanlaisille eri symbolien kuville.

Esimerkki C#:n käytöstä.

Esimerkki kuvantunnistuksen alusta. Tulosmuuttuja sisältää seuraavan tekstin:

var-tunnistin = new TextRecognizer(container); var report = tunnistaja.Tunnista(kuva); // Raaka teksti. var tulos = report.RawText(); // Luettelo kaikista fragmenteista ja kunkin tunnistustila. var fragments = report.Symbols;

Demo-projekti.

Teoksen visuaalista esittelyä varten kirjoitin WPF sovellus. Se on käynnistetty projektista nimeltä " Qocr.Application.Wpf". Alla on esimerkki ikkunasta, jossa on tunnistustulos:

Tarvitset kuvan tunnistamiseen:

  • Puristimet "Uusi kuva" valitsee kuvan tunnistettavaksi
  • Käyttämällä " Mustavalkoinen"Näet, mikä kuva analysoidaan. Jos näet erittäin huonolaatuisen kuvan, älä odota hyviä tuloksia. Tulosten parantamiseksi voit yrittää kirjoittaa värikuvan mustavalkomuuntimeen itse.
  • Kielen valinta "Kieli".
  • Napsautukset tunnistavat "Tunnistaa".
Kaikki kuvaosat tulee merkitä oranssilla tai vihreällä kehyksellä.
Esimerkki englanninkielisestä tekstintunnistuksesta: