Nopea tapa tunnistaa tekstiä. Vaihtoehdot neuroverkon perustamiseen. Klassinen suodatus: Fourier, alipäästösuodatin, ylipäästösuodatin

Se esitetään lukuisten animaatioiden avulla numeroiden tunnistusongelman ja perceptronimallin esimerkkiä käyttäen visuaalinen esittely neuroverkon koulutusprosessissa.

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ää, mitä hermoverkko on. Numeroiden tunnistustehtävän esimerkin avulla visualisoidaan hermoverkkokomponenttien rakenne. Videossa on venäjänkielinen tekstitys.

Selostus numeroiden tunnistamisen 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ärjestely vaihtelee suuresti kuvista toiseen. Jokin visuaalisessa aivokuoressamme 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.

Neuronien aktivointi. Neuraaliverkon kerrokset

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äviä verkkohermosolujen aktivaatioita. 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 toisen ryhmän virittymään. 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ökerroksen 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 kuvakerros

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 meille 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 älyllisiä tehtäviä, joka 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 yhden 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 pikselimallin.

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 nollaan lukuun ottamatta pikseleitä, jotka vastaavat malliamme, painotettu summa laskee kiinnostuksen kohteena olevan alueen pikselien aktivointiarvojen summaan.

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ämän painotetun summan voit saada minkä tahansa luvun laajalla arvoalueella. 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. Miten enemmän arvoa positiivinen syötenumero, sitä lähempänä funktion arvo on yhtä.

Siten neuronin laukeaminen on olennaisesti mitta siitä, kuinka positiivinen vastaava painotettu summa on. Jotta hermosolu ei aktivoitu pienillä positiivisilla luvuilla, voit lisätä painotettuun summaan jonkin 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 menetelmästä matemaattinen esitys neuroverkkoyhteydet. 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 koneoppimiskirjastot on 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 ohjelmoinnissa.

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

Tarkastellaanpa lyhyesti funktioita, joita käytetään aktivointiarvojen "pakkaukseen". Sigmoiditoiminto on esimerkki, joka jäljittelee biologisia hermosoluja ja jota on käytetty varhaisia ​​töitä hermoverkoista, mutta nyt käytetään useammin yksinkertaisempaa ReLU-toimintoa, joka helpottaa hermoverkon kouluttamista.

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 monimutkaisempaa sigmoidifunktiota ei kannata käyttää laskemiseen.

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. testikuvia.

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 alkuhetkellä kouluttamaton hermoverkko vasteena tietyn luvun kuvaan, esimerkiksi kuvan kolmesta, tuottaa lähtökerros täysin satunnaisen vastauksen.

Neuroverkon kouluttamiseksi otamme käyttöön kustannusfunktion, joka ikään kuin ilmoittaa tietokoneelle vastaavan 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 neliöityjen erojen summaa todellisia arvoja lähtökerroksen aktivointi ja niiden ideaaliset arvot. Esimerkiksi kolmion tapauksessa aktivaation tulisi olla nolla kaikille hermosoluille paitsi vastaavalle kolmiolle, jolle se on yhtä suuri kuin yksi.

Osoittautuu, että yhdelle kuvalle voidaan määrittää yksi kustannusfunktion nykyinen arvo. 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 Parametrit ovat koko harjoitussarja.

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. Toistamalla tämä toimenpide jokaisessa seuraavassa pisteessä 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 minimejä ja mihin paikalliseen minimiin algoritmi päätyy, riippuu aloituspisteen valinnasta, eikä ole takeita siitä, että löydetty minimi on minimi mahdollinen merkitys kustannustoiminnot. 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 funktio nopeimman laskeutumissuunnan löytämiseksi on negatiivinen gradientti -∇C. 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

Neuroverkollemme 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.

Gradientin laskeutumisen kannalta on tärkeää, että kustannusfunktion lähtöarvot muuttuvat tasaisesti. Tästä syystä aktivointiarvoilla ei ole vain binääriarvoja 0 ja 1, vaan ne edustavat todellisia lukuja ja ovat näiden arvojen välillä.

Jokainen gradienttikomponentti kertoo meille kaksi asiaa. Komponentin etumerkki ilmaisee muutoksen suunnan ja absoluuttinen arvo ilmaisee komponentin vaikutuksen 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 valkoisesta kohinasta neuroverkkoon? Voidaan olettaa, että hermoverkon ei pitäisi tuottaa mitään tiettyä numeroa ja lähtökerroksen neuronien ei pitäisi aktivoitua tai jos ne aktivoituvat, niin tasaisesti. Sen sijaan hermoverkko vastaa satunnaiseen kuvaan hyvin tietyllä numerolla.

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ää.

Oppiminen strukturoidusta ja satunnaisesta tiedosta

Tarkastellaanpa esimerkkiä modernista hermoverkosta erilaisten esineiden tunnistamiseksi todellisessa maailmassa.

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. Takaisinlisäysmenetelmä

Backpropagation on keskeinen hermoverkkojen koulutusalgoritmi. Keskustellaan ensin yleisesti, mistä menetelmä koostuu.

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 a i suuruuteen. 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 viimeistä kerrosta varten, 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 piirretään tällaisen modernisoidun kaltevuuslaskeuksen oppimiskäyrä, se ei näytä yhtenäiseltä, tarkoituksenmukaiselta laskeutumiselta mäeltä, vaan humalaisen mutkikkaalta liikeradalta, joka ottaa nopeampia askeleita ja saavuttaa myös minimitoiminnon.

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:

Co = (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 mikä on matematiikan kielellä 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ä korreloi edellä mainitun ajatuksen kanssa, 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ä selvä johdannainen on vain kustannuksia varten erillinen esimerkki koulutusnäyte C 0 . 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. Siirtojen huomioiminen 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 neuronin 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.

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 fragmentin, 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 aliasoimattomat merkit näyttävät nykyaikaiset näytöt näkyviä pikseleitä pitkin ääriviivaa. 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 pienessä mittakaavassa tavallinen symboli? Pettääkö silmämme meitä? Pointti on, että pikseli LCD-näyttö ei koostu yhdestä pikselistä, joka voi vastaanottaa halutun värin, vaan 3 alipikselistä 3 väriä, jotka riittävät saamaan haluttu väri. 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 tekee mustaksi tulemisen vaikeaksi valkoinen kuva ja vaikuttaa suuresti tulokseen, koska aina ei 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 mustavalkoisen 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 kirkkaammat pikselit katsottiin mustiksi ( suurempi kuin arvo) 130 yksikköä, loput ovat valkoisia. 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älle 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. Niitä on erittäin vakava ongelma pohjaa täytettäessä. Kaikki fontit eivät näytä merkkejä pieni koko oikein. Oletetaan, että merkki "e", kun se renderöidään fontilla 8, jonka nimi on "Franklin Gothic Medium", tulee olemaan:

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.

Hahmon hakualgoritmi.

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 tunnistamisen aikana, jouduin käsittelemään repeytyneitä kuvia, joita kaiken muun lisäksi saattoi olla suuri määrä roskat tekstin vieressä:


Tämä kuva sanasta "kyllä" yrittää selittää analyysin monimutkaisuuden. Oletetaan, että näin on täysi rivi, 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 suurin luku arvot 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 suurin luku tapahtumia. 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 tunnistamisen alkamisesta kuvia. 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 Heikkolaatuinen kuvan, älä odota hyviä tuloksia. Tulosten parantamiseksi voit yrittää itse kirjoittaa värikuvan muuntimen mustavalkoiseksi.
  • Kielen valinta "Kieli".
  • Napsautukset tunnistavat "Tunnistaa".
Kaikki kuvaosat tulee merkitä oranssilla tai vihreällä kehyksellä.
Esimerkki englanninkielisestä tekstintunnistuksesta:

  • Opastus

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ä elät heidän kanssaan eri maailmoissa. Yhtäältä ymmärrät, että henkilö on todennäköisimmin ammattilainen aiheeseen liittyvässä, mutta menetelmissä optinen tunnistus tietää 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 mahdollinen asiakas, tai henkilö, joka haluaa alkaa harjoittaa optista tunnistusta:

  • Kun ratkaiset ongelman, lähde aina yksinkertaisimmasta. On paljon helpompaa laittaa oranssi tunniste henkilöön kuin seurata henkilöä korostamalla häntä peräkkäin. Kameran ottaminen on paljon helpompaa korkea resoluutio 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 kaikki merkinnät". 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 rikkoa sen olemassa olevia menetelmiä 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

Laitoin tähän ryhmään menetelmiä, 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. varten RGB-kuvat 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 juuri koskaan käytetä puhtaassa muodossa olevissa kuvissa, on Fourier-muunnos (tarkemmin 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 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, joka 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. Aallokeanalyysissä käytetään klassisia funktioita. 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 aallokeiden vapaan 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 yksinkertaisen matemaattisen funktion kuvassa (viiva, paraabeli, ympyrä). Kertyvä kuva rakennetaan, jossa jokaiselle pisteelle alkuperäinen kuva monia sen luovia funktioita piirretään. 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ötä, erittäin yliherkkyys binarisoinnin laatuun. 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, usein ainoa tapa työskennellä sen kanssa on valita sen ääriviivat. 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 hän näyttää huonommaltaääriviivat).



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 ja loogisen analyysin rajalla, jolloin voit korostaa ääriviivoja:

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ä, jonka avulla voit siirtyä kuvasta objektien ominaisuuksiin tai itse esineisiin.
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. Siellä on voimakas matemaattiset laitteet, jolloin voit tehdä tämän. Laitetta kutsutaan ääriviivaanalyysiksi (,).

Rehellisesti sanottuna en ole koskaan voinut soveltaa ääriviivaanalyysiä todellisia ongelmia. 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 korostavat yksittäisiä pisteitä vierekkäisissä kehyksissä, jotkin pitkän ajan kuluttua ja valaistuksen muuttuessa, osa mahdollistaa 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 viereisistä 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 vakaita 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, niin kotimarkkinoilla Käytä sitä.

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:
Saatavilla testinäyte, jolla on 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 on rakennettava malli, jotta se voi analysoida uuden kuvan ja päättää, mikä objekti 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 ​​luokittelukohteille. 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 objekti on samankaltainen kuin itse, saadaan vasen Gaussin. Kun se ei näytä siltä - 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 siten, että se minimoi todennäköisyyden luvattoman henkilön väärälle pääsylle laitokseen. Tätä todennäköisyyttä kutsutaan "tyypin I virheeksi", "väärän hälytyksen todennäköisyydeksi", "vääräksi 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öskentelemisestä, 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