Kirja äratundmine. Kiire viis teksti äratundmiseks

Michael Nilssoni raamatud "Närvivõrgud ja süvaõpe".


Jagasin tõlke mitmeks Habré artikliks, et seda oleks lihtsam lugeda:
1. osa) Sissejuhatus närvivõrkudesse
2. osa) Konstruktsioon ja kallakuga laskumine
Osa 3) Numbrituvastuse võrgu rakendamine
4. osa) Natuke süvaõppest

Sissejuhatus

Inimese visuaalne süsteem on üks hämmastavamaid maailmas. Meie aju igas poolkeras on visuaalne ajukoor, mis sisaldab 140 miljonit neuronit, mille vahel on kümneid miljardeid ühendusi, kuid sellist ajukoort pole ühte, neid on mitu ja koos moodustavad nad meie peas tõelise superarvuti, kõige parem. evolutsiooni käigus kohandatud meie maailma visuaalse komponendi tajumiseks. Kuid visuaalsete mustrite äratundmise raskus muutub ilmseks, kui proovite kirjutada programmi näiteks käsitsi kirjutatud numbrite äratundmiseks.

Lihtne intuitsioon - "9-l on silmus ülaosas ja vertikaalne saba all" pole nii lihtne algoritmiliselt rakendada. Närvivõrgud kasutavad näiteid, järeldavad mõningaid reegleid ja õpivad neist. Veelgi enam, mida rohkem näiteid võrku näitame, seda rohkem õpib see käsitsi kirjutatud numbreid tundma, mistõttu klassifitseeritakse need suurema täpsusega. Kirjutame programmi 74 koodireal, mis tuvastab käsitsi kirjutatud numbrid >99% täpsusega. Nii et lähme!

Perceptron

Mis on närvivõrk? Alustuseks selgitan tehisneuroni mudelit. Pertseptroni töötas välja 1950. aastal Frank Rosenblatt ja täna kasutame üht tema peamist mudelit – sigmoidset pertseptronit. Kuidas see siis töötab? Persepron võtab sisendiks vektori ja tagastab mõne väljundi väärtuse.



Rosenblatt pakkus välja lihtsa reegli väljundväärtuse arvutamiseks. Ta tutvustas mõistet "olulisus", seejärel iga sisendväärtuse "kaalu". Meie puhul sõltub see sellest, kas see on teatud läviväärtusest suurem või väiksem.



Ja see on kõik, mida me vajame! Kaalude vektorit muutes saate täiesti erinevaid otsustusmudeleid. Nüüd pöördume tagasi närvivõrgu juurde.



Seega näeme, et võrk koosneb mitmest neuronikihist. Esimest kihti nimetatakse sisendkihiks või retseptoriteks (), järgmine kiht on peidetud () ja viimane on väljundkiht (). Tingimus on üsna tülikas, asendame selle vektorite skalaarkorrutisega. Järgmiseks paneme , nimetame seda pertseptroni nihkeks või ja liigutame seda vasakule küljele. Saame:


Õppimisprobleem

Et näha, kuidas õppimine võib toimida, oletame, et muudame võrgus veidi kaalu või kallutatust. Soovime, et see väike kaalumuutus põhjustaks vastava väikese muutuse võrgu väljundis. Skemaatiliselt näeb see välja selline:



Kui see oleks võimalik, siis saaksime raskustega manipuleerida meile soodsas suunas ja järk-järgult võrgustikku treenida, kuid probleem on selles, et teatud neuroni kaalu muutumisel võib selle väljund täielikult 0-lt 1-le "keerata". See võib kaasa tuua suure prognoosivea kogu võrgu jaoks, kuid sellest probleemist on võimalik mööda hiilida.

Sigmoidne neuron

Me saame sellest probleemist üle saada uut tüüpi tehisneuronite kasutuselevõtuga, mida nimetatakse sigmoidseteks neuroniteks. Sigmoidsed neuronid on sarnased pertseptronitega, kuid on modifitseeritud nii, et väikesed muutused nende kaalus ja kallutuses põhjustavad nende väljundis vaid väikese muutuse. Sigmoidne neuroni struktuur on sarnane, kuid nüüd saab ta vastu võtta sisendit ja väljundit väljundina, kus



Näib, et need on täiesti erinevad juhtumid, kuid ma kinnitan teile, et pertseptronil ja sigmoidne neuronil on palju ühist. Oletame, et siis ja seetõttu . Tõsi on ka vastupidi, kui , siis ja . Ilmselgelt on meil sigmoidse neuroniga töötades sujuvam pertseptron. Ja tõepoolest:


Närvivõrgu arhitektuur

Närvivõrgu sisend- ja väljundkihtide kujundamine on üsna lihtne. Näiteks oletame, et proovime kindlaks teha, kas käsitsi kirjutatud "9" on pildil või mitte. Loomulik viis võrgu kujundamiseks on kodeerida kujutise pikslite intensiivsused sisendneuronitesse. Kui pildil on suurus , siis on meil sisendneuron. Väljundkihil on üks neuron, mis sisaldab väljundväärtust, kui see on suurem kui 0,5, siis on pildil “9”, muidu mitte. Kuigi sisend- ja väljundkihtide kujundamine on üsna lihtne ülesanne, on peidetud kihi arhitektuuri valimine kunst. Teadlased on välja töötanud mitmesuguseid peidetud kihtide kujundamise heuristikat, näiteks selliseid, mis aitavad kompenseerida peidetud kihtide arvu võrgu koolituse ajal.


Seni oleme kasutanud närvivõrke, milles ühe kihi väljundit kasutatakse järgmise signaalina, selliseid võrke nimetatakse otsesteks närvivõrkudeks või edasisaatvateks võrkudeks (). Siiski on ka teisi närvivõrkude mudeleid, milles tagasisideahelad on võimalikud. Neid mudeleid nimetatakse korduvateks närvivõrkudeks (). Korduvad närvivõrgud on olnud vähem mõjukad kui edasisuunalised võrgud, osaliselt seetõttu, et korduvate võrkude koolitusalgoritmid on (vähemalt siiani) vähem tõhusad. Kuid korduvad võrgud on endiselt äärmiselt huvitavad. Need on meie aju toimimisele palju lähemal kui edastusvõrgud. Ja on võimalik, et korduvad võrgud suudavad lahendada olulisi probleeme, mida saab suurte raskustega lahendada otsejuurdepääsuvõrkude abil.


Tänaseks on see kõik, järgmises artiklis räägin laskumisest gradiendist ja meie tulevase võrgu treenimisest. Täname tähelepanu eest!

Kujutise tuvastamise probleem on üks levinumaid ANN-i abil edukalt lahendatud probleeme. Siin on võimalikud mitmesugused probleemivormingud. Üks lihtsamaid võimalusi on fikseeritud märkide komplekti tuvastamine.

Näide 3.11. Kirja äratundmine. MatLabi süsteem pakub spetsiaalset funktsiooni

>> = prprob;

See funktsioon tagastab kaks binaarmaatriksit: tähestiku maatriksis (suurus 35x26) kodeerib iga veerg ühte tähte ja sihtmaatriks (suurus 26x26) on diagonaalne ja seda kasutatakse veeru tuvastamiseks.

Iga tähestiku veerg vastab 7x5 maatriksile, mis on tähe kahendkujutis.

Järgmine funktsioon kuvab kõik tähestiku veerud tähtedena (funktsioon tuleb paigutada MatLabi töökataloogi):

funktsioon plotletters (tähestik)

fprintf("plotletters joonistab esimesed 25 tähte\n");

Suurus (tähestik);

error("joonikirjad vajavad 35 numbri pikkuseid veerge");

MM=värvikaart(hall);

MM=MM(lõpp:-1:1,:);

imagesc(reshape(tähestik(:,j),5,7)");

Funktsiooni täitmise tulemus on näidatud joonisel fig. 3.12:

>> joonistähed (tähestik);

Joonis 3.12.Binaarne tähestiku kodeerimine.

Sihtmaatriksi struktuuri põhjal peaks närvivõrgus olema 26 väljundneuronit. Määrame peidetud kihis olevate neuronite arvuks 10.

>> net = newff(minmax(tähestik),,("logsig" "logsig"),"traingdx");

>> P = tähestik; T = sihtmärgid;

Määrame epohhide arvu ja alustame õppeprotsessi:

>> net.trainParam.epochs = 1000;

>> = rong(net,P,T);

Õppimiskõver on näidatud joonisel fig. 3.13.

Joonis 3.13.Vea muutmine koolitusprotsessi käigus

Treenitud võrgu kvaliteedi kontrollimiseks kaaluge mürarikaste tähtede kujutisi (joonis 3.14):

>> mürarikasP = tähestik+randn(suurus(tähestik)) * 0,2;

>> plotletters (noisyP);

Järgmine käsk käivitab võrgu mürarikkal sisendikomplektil:

>> A2 = sim(võrk,mürakasP);

Maatriks A2 sisaldab siin erinevaid numbreid vahemikus . Funktsiooni kasutamine võistlema Saate valida igas veerus maksimaalse elemendi, seejärel määrata sellele väärtuse 1 ja lähtestada ülejäänud veeru elemendid nulli.

Joonis 3.14.Tähtede kujutised müra juuresolekul

>>j=1:26 puhul

A3 = konkureeri(A2(:,j));

vastus(j) = leia(konkur(A3) == 1);

Seejärel saate käskude abil visuaalselt hinnata võrgu vastuseid mürarikastele sisendvektoritele:

>> NetLetters=alphabet(:,answer);

>> plotletters (NetLetters);

Joonisel fig. Joonis 3.15 näitab tuvastamise lõpptulemust.

Joonis 3.15.Närvivõrgu tuvastamise tulemus

Ilmselgelt on mõned tähed valesti tuvastatud. See võib olla kas võrgu halva väljaõppe või liiga kõrge mürataseme tagajärg või sisemise kihi neuronite arvu vale valik.

Olgu meie ees ekraan, mis on jagatud kaheteistkümneks lahtriks, 4 x 3. Lahtrid peegeldavad pildielementide diskreetsust. Pildi teravustamisel lahter kas valgustatakse või mitte. "Valgustus" määratleb selle ergastuse suuruse ühe väärtuse, "mitte-säritus" - null. Seega määrab täht O rakkude valgustuse, mis on määratud joonisel 2.1. Ekraani valgustab täht A, nagu on näidatud joonisel 2.2.

Mida tuleb teha, et mõni meie projekteeritav seade saaks aru, mis tähega on tegu?

Ilmselgelt tuleb kõik O-tähega valgustatud ekraanielementide ergastavad signaalid saata pistikusse, mis teostab I-ahelat. Pistiku väljundis on üks signaal, nagu on näidatud joonisel 2.1 genereeritakse siis ja ainult siis, kui kõik ekraani lahtrid, millele kujutis asetatakse, on valgustatud tähega O. Ühe signaali olemasolu konjunktori väljundis määrab vastuse: "See on täht O."


Riis. 2.1.


"O" tähe õpetamine Riis.

2.2.

A-tähe õpetamine

Sama tuleb teha ka tähega A.

Sel juhul tähed üksteist "segama", kuna vastavate ekraanilahtrite valgustus ei lange osaliselt kokku ja konjunktsiooni ühiku väärtus määratakse ainult ühe jaoks.

Mis siis, kui paneksid ekraanile K-tähe? Siis ei anna ükski kahest konjunktorist ühte väärtust, kuna vastavate ekraanielementide valgustus ei lange kokku. Süsteemile K-tähe “õpetamiseks” peate sisse viima teise konjunktori ja tegema samad konstruktsioonid nagu ülal.

Seega võib öelda, et oleme üles ehitanud süsteemi kahe “õigesti” antud tähe äratundmiseks.

Mida aga teha, kui ekraanil olevad tähed on väriseva käega kirjutatud? Seejärel peame võimaldama mõne ekraani naaberlahtri alternatiivset valgustamist ja arvestama sellega disjunktsioonioperatsiooni VÕI abil. Teatavasti genereeritakse selle toimingu tulemusena üks signaal, kui sisendis on vähemalt üks üksik signaal.

Vaatleme O-tähe äratundmise võimalust, võimaldades lahtrite (1,1), (1,3), (4,1), (4,3) valgustamise võimalust. Siis saab eelnevalt konstrueeritud predikaat järgmisel kujul:

Samamoodi lubame tähe A puhul lahtreid (4,1) ja (4,3) valgustada:


Riis. 2.3.

Tähtede "O" ja "A" ühine õpetamine

Kombineerides mõlemad predikaadid, saame diagrammi joonisel 2.3. Seega oleme õppimiseks ja äratundmiseks rakendanud vooluringitehnilist lähenemist, mis põhineb Boole'i ​​funktsioonide kasutamisel ja toimimisel. 0, 1.

tõeväärtuslikud muutujad

Tähtede äratundmiseks koolitatud loogilise närvivõrgu ehitamine

Astume nüüd selle sammu, selle ülemineku, mis määrab loomuliku teostuse geniaalse lihtsuse, mis on loodud puudulike andmete, ebausaldusväärsuse, "müra", suure kiiruse, suure töökindluse ja ühtsuse nõude jaoks. Sest me ei kujuta ette kolju sisse peidetud elektroonilist vooluringi.

See tähendab, et peame eemalduma täpselt määratletud Boole'i ​​muutujatest (0, 1, "jah - ei", "valge - must" jne) teabe ebakindluse, usaldusväärsuse või muude hinnangute suunas - reaalsete muutujate poole.

Kuid siis on vaja Boole'i ​​algebrast eemalduda, kuna reaalsete muutujate konjunktsiooni ja disjunktsiooni mõisteid ei ole määratletud. Siin tulebki appi loomuliku teostuse põhimõtete analüüs ja rakendamine - meie ajus kehastunud närvivõrgu põhimõtted.

Teisendame saadud treenitud vooluringi närvivõrguks (joonis 2.4).

Ekraani iga rakk on retseptorneuron, mis valgustuse tulemusena omandab teatud ergastuse, võttes väärtuse nulli ja ühe vahel. Ekraani asendavad retseptorid moodustavad sisendi või retseptori kiht närvivõrgud. Asendame iga konjunktori ja disjunktori ühe neuronimudeliga kogu võrgu jaoks. Tutvustame võrgu väljundkihti, mis meie näites koosneb kahest neuronist, mille ergastus määrab ära tuvastamise tulemuse. Nimetagem väljundkihi neuroneid tähtede nimedega - O ja A.

Retseptorid, nagu ekraan, erutuvad väljastpoolt. Kuid teised neuronid, mis imiteerivad erutuse levikut ajus, rakendavad ülekandefunktsioon(automaatjuhtimise teooria mõttes) või aktiveerimisfunktsioon(närvivõrgu teooria mõttes). See funktsioon teisendab neuroni sisendis olevad signaalid, võttes arvesse nende sisendite kaalu (jätame nende kaalumise praegu edasi), selle neuroni ergastuse väärtuseks, mis edastatakse edasi võrgu kaudu vastavalt ühendustele neuronitest ja jõudes ühe või mitme väljundkihi neuronini.


Riis. 2.4.

Närvivõrk tähtede "O" ja "A" äratundmiseks Kuna aju tööd simuleeritakse loogilisel tasemel, aktiveerimise funktsioon aktiveerimisfunktsioon valik on üsna lihtne. Niisiis, meie näites piisab järgmise valimisest

i-nda neuroni ergastusväärtuse leidmiseks:

Esialgu leiame

Siis panime

Tähtede äratundmise harjutus. Erinevad raskusastmed. Kirjale kantakse müraga mask. Mõnikord peate olema kiire taibuline, et elimineerimise teel aru saada, mis täht ülesandes oli.

Õpetage lapsi lugema ja vene tähestiku tähti. Mis tähte näidatakse? Valige paremalt õige vastus.

Milline täht on peidetud? Online mäng varase lapsepõlve arendamiseks. Vene tähestiku tähtede äratundmine

Sageli hakatakse vene tähestiku tähti õpetama järjekorras, nagu need on aabitsas kirjutatud. Tegelikult tuleks tähti õpetada kasutussageduse järjekorras. Annan teile väikese vihje – klaviatuuri keskel olevaid tähti kasutatakse sagedamini kui äärealadel olevaid tähti. Seetõttu peate kõigepealt pähe õppima A, P, R, O... ja jätma sellised nagu Y, X, F, Shch suupisteks...

Mis on parem - õpetada last lugema tähti või silpe?

Paljud õpetajad õpetavad kohe silpides. Soovitan teil sellest väikesest probleemist mööda hiilida ja silpide õppimise asemel võrgumänge mängida. Nii õpib ja mängib laps korraga. Õigemini, talle tundub, et ta mängib ja samal ajal tahes-tahtmata kordab vajalikke helisid.

Võrgumängude eeliseks on see, et kui hääldate mõnda tähte valesti, kordab simulaator kannatlikult õiget vastust, kuni see teile meelde tuleb.

Kas ABC-raamatud aitavad teil tähti õppida? Miks paberipraimereid ikka veel õppepraktikas kasutatakse

Traditsiooniliselt kasutatakse tähtede õpetamiseks paber-ABC-raamatuid. Nende eelised on vaieldamatud. Kui kukutate paberversiooni põrandale, ei pea te muretsema, et seade puruneb. Praimereid saab avada konkreetsel lehel ja paigutada nähtavale kohale. Seda kõike elektroonikaseadmetes ei leidu.

Programmeeritavatel lugemistreeningu simulaatoritel on aga ka teatud eelised, näiteks oskavad nad erinevalt paberist kolleegidest rääkida. Seetõttu saame soovitada nii paber- kui ka elektroonilisi allikaid.

Kas veebiharjutused aitavad teil tähti meeles pidada?

Elektrooniliste ja võrgumängude kasutamisel on põhirõhk sellel, et inimene kordab tahtmatult sama teavet mitu korda. Mida sagedamini kordamine toimub, seda kindlamalt sisestatakse teave teadvusse ja ajju. Seetõttu on veebiharjutused väga kasulikuks lisandiks traditsioonilistele kuubikutele ja paberraamatutele.

Millises vanuses tuleks laps hariduskeskustesse saata?

Laagerdumiskiirus on erinev. Tavaliselt. Tüdrukud kuni teatud vanuseni on poistest arengus ees. Tüdrukud hakkavad rääkima varem, nad on rohkem sotsiaalselt orienteeritud ja õppimisvõimelisemad. poisid, vastupidi, on sageli väga autistlikud – kes kõnnivad omapäi. Sellest võime järeldada, et tüdrukud õpivad lugema veidi varem kui poisid. Kuid see on ainult väline diagramm. Iga laps on individuaalne ja tema õppimisvalmidust saab praktikas testida. Kas teie lapsele meeldib tundides käia? kas midagi jääb talle meelde pärast seda, kui ta on selle ära õppinud?

Võib-olla proovige ise õppida, eriti kuna bussiga sõitmine võtab aega ja keegi ei mõista teie last paremini kui ema ja isa.

Mida teha, kui teie laps ei mäleta tähti

Õppimine on raske. Ja see ei sõltu sellest, kas tegemist on täiskasvanu või lapsega. Seda on väga-väga raske õppida. Lisaks õpivad lapsed ainult mängu kaudu. Teine tõsiasi on see, et millegi õppimiseks tuleb seda mitu korda harjutada või korrata. Seetõttu pole üllatav, et lapsed mäletavad tähti väga halvasti.

Eraldi on rühm lapsi, kes hakkavad rääkima hilja ja ajavad samal ajal segamini mitte ainult tähti, vaid ka helisid. selliste kuttidega peate tähti kokku joonistama, kasutama selleks kõiki võimalikke materjale, teravilju, tikke, veerisid, pliiatseid - kõike, mis on käepärast. Joonistage see ja paluge oma lapsel seda korrata.

Saate teha graafilisi dikteerimisi, mängida joonistamist ja kordamist.

Mida teha, kui teie laps ajab tähed segamini, näiteks D ja T

Kui laps ajab tähed segamini, tähendab see, et sõnade lugemise juurde on liiga vara minna. Mine tagasi ja korda tähti. Lapsed ajavad sageli segamini häälelisi ja hääletuid tähti või sarnaseid kirjapilte, näiteks P ja R. Kordamise praktika võib aidata. Näiteks saab tähti kokku voolida, tähti saab teha kehast, näiteks asetades käed külgedele, et kujutada T-tähte.

Kuidas õpetada last tähti pähe õppima, kui ta seda ei taha

kordamine on õppimise ema. Korda tähti sõnades, tähti silpides, proovi tähti ära arvata. Laske lapsel kiri kirjutada ja proovige ära arvata. Või võite teha vastupidist – proovige moodustada riisiteradest kiri ja teie poeg või tütar arvab, mis kirjaga tegu on. Liiva sisse saab kirjutada pulgaga.

Miks ta ei oska tähti õigesti hääldada? Kuidas õpetada last selgelt ja selgelt tähti hääldama?

Lüngad võivad olla füsioloogilisel tasemel. Inimene ei kuule ennast õigesti. või tundub talle, et ta räägib õigesti. Seda on väga lihtne kontrollida – lihtsalt salvestage vestlus diktofoni ja kuulake, kuidas laps loeb.

See võib olla ka lihtsalt treenituse puudumine. Erinevad inimesed vajavad erineva arvu kordi, et teavet korrata, enne kui see meelde jääb, ja lapsed pole erand. Seda tuleb korrata mitu korda ja erinevates olukordades, enne kui ta hakkab tähti ja helisid õigesti hääldama.

Samuti tuleb märkida, et peate lapsi armastama ja nendega perioodiliselt töötama. Ärge käivitage protsesse.

Kuidas õpetada oma lapsele kooliks valmistumiseks tähestikku

Lastega tuleb mänguliselt töötada. Täpselt nii, nagu sellel saidil öeldud. Teine koolituse saladus on see, et peate õppima väikeste portsjonitena. Lapsed ei suuda säilitada tähelepanu kauem kui 5 minutit. Seetõttu on lihtsalt mõttetu pikemalt õppida.

Milliste tähtedega tuleks alustada tähestiku meeldejätmist?

Peate alustama tähtede meeldejätmist tavaliselt kasutatavate tähtedega. Teine saladus on meeles pidada tähti, millest koosneb lapse nimi, ema ja isa nimi, nendele sõnadele saate lisada venna ja õe, vanavanemate nimed. Need on mu lemmiknimed.

Muide, kui õpid puutetüüpi, siis esimene sõna, millega pead tippimistreeningut alustama, on jälle sinu ees- ja perekonnanimi.

Kas teie laps peab inglise tähestiku tähed pähe õppima?

Inglise tähestiku tundmine ei tee paha. Nad ei õpi koolis tähestikku, vaid hakkavad kohe lugema, jättes tähestiku vanemate otsustada. Samuti väärib märkimist, et suured ja väikesed ingliskeelsed tähed näevad erinevad välja ja neid tuleb meeles pidada. Kui teie laps hakkas rääkima hilja, on tõenäoliselt ladina tähtede meeldejätmine tema jaoks probleem.

Kas last on võimalik kohe sõnadega lugema õpetada?

Kirjalik vene keel näeb erinevalt inglise või prantsuse keelest välja sama nagu vene keel, nii et pidage meeles sõnu

Kuidas koolieelikule numbreid meeles pidada

Joonista numbreid, loe pulgakesi, kõndides loenda punaseid ja valgeid autosid, loe, kas tänaval kõnnib rohkem mehi või naisi. Muutke kõik mängudeks.

Proovige teksti ise tähthaaval lugeda – see mitte ainult ei võta kaua aega, vaid erineb ka sellest, kuidas me tegelikult räägime. Täiskasvanud ei kirjuta – välja arvatud juhul, kui see sõna on võõras või võõrkeelne. Seejärel, et seda kuulda, loevad nad seda aeglaselt ja hääldavad sõnu hoolikalt.

Miks koolieelik unustab tähed? Lugemise õpetamine mängude kaudu

Miks laps unustab tähed, kuigi õppis need eile ära?

Tavaliselt jäävad lapsele mõned tähed kergesti meelde, teised aga mitte nii väga. Täiskasvanu roll on tähele panna, mis tema hoolealusel ei õnnestu, ja anda lisaülesandeid.

Teine oluline asi on regulaarsus. Kuna lapse jaoks on kogu õppimine ausalt öeldes tuupimine ja kordamine, peaks õppeprotsess olema selline, et teavet korratakse teatud ajavahemike järel.

Ebbinghaus (loe selle kohta lähemalt Vikipeediast) uuris, kui kiiresti ununeb inimese jaoks mõttetu info ja jõudis järeldusele, et 40% infost ununeb esimese paarikümne minutiga. Ja kui on võimatu täpselt öelda, mida konkreetne täht tähendab, siis on see samaväärne tõsiasjaga, et täht on täiesti võõras. Peab olema üheselt mõistetav 100% äratundmine.

Korda, korda, korda

Näiteks koolitate ladusid (silp, tähekombinatsioon) PEAL, ja laps õppis enam-vähem kombinatsiooni ära tundma ja lugema. Lisage ülesannetele silp AGA ja paluge neil sõnu lugeda, aidates neil lugeda tähti, mis on lapsele veel võõrad. Laps saab aga ise silpide peal klõpsata ja arvuti lugemist kuulata.

See projekt ei pretendeeri maailmas esikohale ja seda ei peeta konkurendiks FineReader, kuid loodan, et idee mustrituvastusest Euleri tunnuse abil on uus.

Sissejuhatus kujutise Euleri tunnusesse.

Põhiidee seisneb selles, et teete mustvalge pildi ja eeldades, et 0 on valge piksel ja 1 on must piksel, on kogu pilt nullide ja ühtede maatriks. Sel juhul saab mustvalget pilti esitada fragmentide kogumina, mille mõõtmed on 2 x 2 pikslit, kõik võimalikud kombinatsioonid on toodud joonisel:

Igal pildil pilt1, pilt2,... näitab algoritmis loendamise sammu punast ruutu, mille sees on üks fragmentidest Fülaltoodud pildilt. Igas etapis summeeritakse iga fragment, mille tulemuseks on pilt Originaal saame hulga: , edaspidi nimetatakse seda kujutise Euleri tunnuseks või karakteristikuks.


KOMMENTAAR: praktikas F0 väärtust (originaalpildi puhul on see väärtus 8) ei kasutata, kuna see on pildi taust. Seetõttu kasutatakse 15 väärtust, alates F1 kuni F15.

Kujutisele iseloomulikud Euleri omadused.

  1. Karakteristikute kogumi väärtus on kordumatu, teisisõnu ei ole kahte sama Euleri tunnusega pilti.
  2. Puudub algoritm, mille abil konverteerida karakteristikku algkujutiseks, ainus viis on toore jõud.

Mis on tekstituvastusalgoritm?

Tähetuvastuse idee seisneb selles, et me arvutame eelnevalt välja Euleri karakteristiku kõigi keele tähestiku märkide jaoks ja salvestame selle teadmistebaasi. Seejärel arvutame tuvastatud kujutise osadele Euleri karakteristiku ja otsime selle teadmistebaasist.

Äratundmise etapid:

  1. Pilt võib olla kas must-valge või värviline, seega esimene etapp on pildi lähendamine, st mustvalge saamine sellest.
  2. Mustade pikslite leidmiseks läbime kogu pildi piksli haaval. Varjutatud piksli tuvastamisel käivitatakse rekursiivne toiming, et otsida kõiki leitud piksleid ja järgnevaid varjutatud piksleid. Selle tulemusena saame pildi killukese, mis võib olla kas terve tegelane või selle osa või “prügi”, mis tuleks ära visata.
  3. Pärast kõigi kujutise ühendamata osade leidmist arvutatakse igaühe jaoks Euleri karakteristik.
  4. Järgmisena hakkab tööle analüsaator ja iga fragmenti läbides teeb kindlaks, kas selle Euleri tunnuse väärtus on teadmistebaasis. Kui leiame väärtuse, leiame, et see on pildi äratuntav fragment, vastasel juhul jätame selle edasiseks uurimiseks.
  5. Kujutise tundmatud osad alluvad heuristilisele analüüsile ehk püüan Euleri tunnuse väärtusest lähtudes teadmistebaasist leida sobivaima väärtuse. Kui leida ei õnnestunud, siis üritatakse lähedalasuvad killud “kokku liimida” ja otsida nende jaoks teadmistebaasist tulemus. Milleks "liimimine" tehakse? Fakt on see, et kõik tähed ei koosne ühest pidevast kujutisest, näiteks "!" Hüüumärk sisaldab 2 segmenti (pulk ja punkt), nii et enne selle otsimist teadmistebaasist tuleb mõlemast osast välja arvutada Euleri tunnuse koguväärtus. Kui isegi pärast külgnevate segmentidega liimimist ei leitud vastuvõetavat tulemust, käsitleme fragmenti prügina ja jätame selle vahele.

Süsteemi koostis:

  1. Teadmistepagas- minu või kellegi teise loodud fail või failid, mis sisaldavad iseloomulikke märgikomplekte ja on vajalikud tuvastamiseks.
  2. Tuum- sisaldab tuvastamist teostavaid põhifunktsioone
  3. Generaator- teadmistebaasi loomise moodul.

ClearType ja antialiasing.

Seega on meil sisendiks äratuntav pilt ja eesmärk on muuta see mustvalgeks, mis sobiks äratundmisprotsessi käivitamiseks. Näib, et mis saaks olla lihtsam, loeme kõik valged pikslid 0-ks ja kõik ülejäänud 1-ks, kuid kõik pole nii lihtne. Pildil olev tekst võib olla antialiase või ilma varjunimeta. Antialiased märgid näevad välja siledad ja ilma nurkadeta, silumata märgid näevad aga välja tänapäevastel monitoridel, mille pikslid on pikslitel nähtavad. LCD (vedelkristall) ekraanide tulekuga loodi ClearType (Windowsi jaoks) ja muud tüüpi antialiasing, mis kasutas ära monitori maatriksi funktsioone. Tekstipildi pikslid muudavad värve, misjärel tundub see palju “pehmem”. Silumise tulemuse nägemiseks võite sisestada mõne tähe (või teksti), näiteks sisse mpaint, suumige sisse ja teie tekst on muutunud mingiks mitmevärviliseks mosaiigiks.

Mis viga? Miks me näeme tavalist sümbolit väikeses skaalas? Kas meie silmad petavad meid? Fakt on see, et LCD-ekraani piksel ei koosne ühest pikslist, mis suudab soovitud värvi vastu võtta, vaid kolmest 3 värvi alampikslist, millest piisab soovitud värvi saamiseks. Seetõttu on ClearType'i eesmärk saada LCD monitori maatriksi funktsiooni kasutades visuaalselt kõige meeldivamat teksti ja see saavutatakse alampikslite renderdamise abil. Igaüks, kellel on suurendusklaas, saab katse eesmärgil suurendada ekraani mis tahes kohta, mis on sisse lülitatud ja näha maatriksit nagu alloleval pildil.

Joonisel on kujutatud LCD-maatriksi 3x3 pikslist ruutu.

Tähelepanu! See funktsioon raskendab mustvalge pildi saamist ja mõjutab oluliselt tulemust, kuna see ei võimalda alati saada sama pilti, mille Euleri tunnus on salvestatud teadmistebaasi. Seega sunnib piltide erinevus heuristilise analüüsi, mis ei pruugi alati õnnestuda.


Mustvalge pildi saamine.

Ma ei olnud rahul Internetist leitud värvimust-valgeks teisendusalgoritmide kvaliteediga. Pärast nende rakendamist muutusid sublepiksliga renderdamisele allutatud tegelaste kujutised erineva laiusega, tekkisid täheridade katkestused ja arusaamatu prügi. Selle tulemusena otsustasin piksli heledust analüüsides saada mustvalgeid pilte. Kõik pikslid heledamad (väärtusest suuremad) 130 ühikut loeti mustaks, ülejäänud olid valged. See meetod ei ole ideaalne ja annab siiski ebarahuldava tulemuse, kui teksti heledus muutub, kuid vähemalt sai see teadmusbaasi väärtustele sarnaseid pilte. Teostust saab näha LuminosityApproximator klassis.

Teadmistepagas.

Teadmistebaasi täitmise esialgne idee oli see, et iga keele tähe jaoks arvutan välja Euleri karakteristiku saadud sümboli kujutisele 140 fondi jaoks, mis on minu arvutisse installitud (C:\Windows\Fonts), lisan kõik fonditüüpide valikud (tavaline, Paksuke, Kaldkiri) ja suurused vahemikus 8 kuni 32, kattes sellega kõik või peaaegu kõik tähtede variatsioonid ja alus muutub universaalseks, kuid kahjuks ei osutunud see nii heaks, kui tundub. Nende tingimustega sain järgmise:

  1. Teadmistebaasi fail osutus vene ja inglise keele jaoks üsna mahukaks (umbes 3 megabaiti). Hoolimata asjaolust, et Euleri tunnus on salvestatud lihtsa 15-kohalise stringina ja fail ise on tihendatud arhiiv (DeflateStream), mis seejärel mällu lahti pakitakse.
  2. Mul kulub teadmistebaasi deserialiseerimiseks umbes 10 sekundit. Samal ajal kannatas tunnuskogumite võrdlemise aeg. Funktsiooni GetHashCode() arvutamiseks ei õnnestunud leida, seega tuli võrrelda natuke biti kaupa. Ja võrreldes 3–5 fondiga teadmistebaasiga, suurenes 140 fondiga andmebaasiga tekstianalüüsi aeg 30–50 korda. Samal ajal ei salvestata teadmistebaasi samu tunnuste komplekte, hoolimata asjaolust, et mõned eri fontides olevad märgid võivad välja näha ühesugused ja olla sarnased, isegi fonte on näiteks 20 ja 21.

Seetõttu pidin looma väikese teadmistebaasi, mis läheb Core mooduli sisse ja võimaldab funktsionaalsust kontrollida. Andmebaasi täitmisel on väga tõsine probleem. Kõik fondid ei kuva väikseid tähemärke õigesti. Oletame, et tähemärk "e", kui see on renderdatud 8. suuruses kirjas nimega "Franklin Gothic Medium", on järgmine:

Ja originaaliga on sellel vähe sarnasust. Veelgi enam, kui lisate selle teadmistebaasi, siis see halvendab oluliselt heuristika tulemusi, kuna sellele sarnaste sümbolite analüüs on eksitav. D See sümbol saadi erinevate tähtede jaoks erinevates fontides. Teadmistebaasi täitmise protsessi tuleb kontrollida nii, et inimene kontrollib enne teadmistebaasi salvestamist iga sümboli kujutise vastavust kirjale. Kuid kahjuks pole mul nii palju energiat ja aega.

Tähemärkide otsimise algoritm.

Ütlen kohe, et algselt alahindasin seda probleemi otsinguga ja unustasin, et sümbolid võivad koosneda mitmest osast. Mulle tundus, et piksel-pikslite lõikes kohtan sümbolit, leian selle osad, kui neid on, kombineerin neid ja analüüsin. Tüüpiline läbimine näeks välja selline: otsin üles tähe "H" (teadmistebaasist) ja leian, et kõik ülemise punkti all ja alumise punkti kohal olevad märgid kuuluvad praegusele reale ja need tuleks koos varjunimega nimetada:

Aga see on ideaalne olukord äratundmise ajal, pidin leppima rebenenud piltidega, millel võis lisaks kõigele olla teksti kõrval tohutu hulk prügi:


See sõna "jah" pilt püüab selgitada analüüsi keerukust. Eeldame, et see on täielik string, kuid b13 ja i6 on lähendamise tulemusena prügi fragmendid. Märgil "y" on puudu punkt ja ükski märk ei ole teadmistebaasis, et kindlalt väita, et tegemist on tekstireaga, mis ulatuvad "c"-st kuni "i"-ni. Ja joone kõrgus on meie jaoks väga oluline, kuna liimimiseks peame teadma, kui lähedale tuleb killud kokku liimida ja analüüsida. Võib ju tekkida olukord, kus hakkame kogemata kahest stringist tähemärke kokku liimima ja sellise äratundmise tulemused pole kaugeltki ideaalsed.

Heuristika pildianalüüsis.


Mis on heuristika pildituvastuses?
See on protsess, mille käigus tuvastatakse teadmistebaasis puuduv tunnuste kogum õige tähestiku tähena. Mõtlesin kaua, kuidas analüüsi teha ja lõpuks osutus kõige edukamaks algoritmiks järgmine:

  1. Leian teadmistebaasist kõik tunnushulgad, millel on suurim arv väärtusi F fragmendid sobib tuvastatud kujutisega.
  2. Järgmisena valin ainult need iseloomulikud komplektid, milles fragmendi ebavõrdsetel F väärtustel põhineva äratuntava kujutise korral ei ole erinevus suurem kui +- 1 ühik: -1< F < 1. И это все подсчитывается для каждой буквы алфавита.
  3. Seejärel leian sümboli, millel on kõige rohkem esinemisi. Pidades seda heuristilise analüüsi tulemuseks.
See algoritm ei anna parimaid tulemusi väikeste tähemärkidega piltide puhul (fondi suurus 7–12) . Kuid see võib olla tingitud asjaolust, et teadmistebaas sisaldab erinevate sümbolite sarnaste kujutiste iseloomulikke kogumeid.

Kasutamise näide C#-s.

Näide pildituvastuse pildi algusest. Tulemusmuutuja sisaldab teksti:

var tuvastaja = new TextRecognizer(container); var report = tunnustaja.Tuvasta(pilt); // Toortekst. var tulemus = report.RawText(); // Kõigi fragmentide loend ja nende tuvastamise olek. var fragmendid = report.Symbols;

Demoprojekt.

Töö visuaalseks demonstreerimiseks kirjutasin WPF rakendus. See käivitati projektist nimega " Qocr.Application.Wpf". Tuvastamistulemusega akna näide on allpool:

Pildi äratundmiseks vajate:

  • Pressid "Uus pilt" valib tuvastamiseks pildi
  • Kasutades " Must ja valge"Saab näha, millist pilti analüüsitakse. Kui näete ülimalt madala kvaliteediga pilti, siis ei ole head tulemust oodata. Tulemuste parandamiseks võib proovida ise mustvalgesse konverterisse värvilist pilti kirjutada.
  • Keele valimine "Keel".
  • Klikid tunnevad ära "Tunnu ära".
Kõik pildifragmendid tuleks tähistada oranži või rohelise raamiga.
Ingliskeelse tekstituvastuse näide: