Recunoasterea Autenticitatii Semnaturii Dinamice
Recunoașterea autenticității semnăturii dinamice
folosind rețele neuronale
Lucrare de disertație
Cuprins
Lista figurilor
Lista tabelelor
Lista acronimelor
INTRODUCERE
1. SEMNĂTURA OLOGRAFĂ DINAMICĂ
1.1. Istoric
1.2. Semnatură dinamică versus semnătură digitală
1.3. Importanța bazei de date de achiziție
1.3.2. Dispozitivul de achiziție
1.3.3. Extragerea invarianților
2. MACHINE LEARNING
2.1. Ce este Machine Learning?
2.2. Contribuția lui Andrew Ng
2.3. Gradientul descrescător
2.4. Ecuații matriceale
2.5. Regresia liniară și regresia logistică
2.6. Overfitting
3. REȚELE NEURONALE
3.1. Caracteristicile rețelelor neuronale 41
3.1.1. Modelul neuronului
3.1.2. Reprezentarea unei rețele neuronale
3.2. Algoritmul de învățare
3.2.1. Învățare supervizată
3.2.2. Învățare nesupervizată
3.2.2.1. Algoritmul K –means
3.2.2.2. Generalizarea
3.3. Backpropagation – predicția retrogradă
3.4. Pașii pentru antrenarea rețelei
4. APLICAȚIA PRACTICĂ
4.1. Algoritmi folosiți anterior
4.2. Folosirea rețelei neuronale
4.3. Rezultatele obținute
Concluzii
Bibliografie
Anexa 1 – Funcția de antrenare și testare a rețelei neuronale
Anexa 2 – Funcția de testare a semnăturilor false
Anexa 3 – Funcția pentru testarea Cross Validation
Anexa 4 – Funcția pentru predicție One Vs All și funcția Sigmoid
Anexa 5 – Functia pentru interfața grafică
Anexa 6 – Funcția pentru gradientul descrescător
Lista figurilor
Figura 1.1. Transmiterea informațiilor captate de senzori [10] 20
Figura 1.2. Dispozitiv de achiziție a semnăturii [12] 21
Figura 1.3. Schema modulului de procesare [12] 22
Figura 2.1. Rezultatele rețelei neuronale utilizată de Google varianta 1 [13] 25
Figura 2.2. Rezultatele rețelei neuronale utilizată de Google varianta 2 [13] 25
Figura 2.3. Rezultatele rețelei neuronale utilizată de Google varianta 3 [13] 26
Figura 2.4. O extensie de rețea de 5 layere a creierului și portalul de lumea exterioară [16] 27
Figura 2.5. Clusterul format de variabile [26] 30
Figura 2.6. Reprezentarea ipotezei (funcției de transfer) 30
Figura 2.7. Găsirea minimului cu gradientul descrescător [22] 31
Figura 2.8. Găsirea minimului cu gradientul descrescator- reprezentare 3D [22] 32
Figura 2.9. Găsirea unui minim local cu gradientul descrescător – reprezentare 3D [22] 32
Figura 2.10. Reprezentarea funcției logistice (sigmoid) 35
Figura 2.11. Grafice reprezentative modelului liniar [26] 36
Figura 2.12. Grafice reprezentative modelului logistic [26] 36
Figura 2.13. Percepția pixelilor [26] 38
Figura 2.14. Alcătuirea clusterilor pentru variabilele de intrare pixel1 și pixel2 [26] 39
Figura 2.15. Clasificarea imaginilor [26] 39
Figura 3.1. Neuronul [26] 42
Figura 3.2. Schema de principiu a unei rețele formată dintr-un singur neuron [25] 43
Figura 3.3. Modelul neuronului – unitatea logistică [26] 44
Figura 3.4. Funcția SAU [26] 45
Figura 3.5. Reprezentarea unei rețele neuronale [26] 46
Figura 3.6. Reprezentarea unei rețele neuronale cu ieșiri multiple [26] 46
Figura 3.7. Reprezentarea unei rețele neuronale cu mai multe ieșiri [13] 48
Figura 3.8. Reprezentarea activărilor unei rețele neuronale [26] 50
Figura 4.1. Semnalele AX1, AX2, AY1,AY2, ONSX, ONSY 54
Figura 4.2. Componentele semnăturilor 54
Figura 4.3. Arhitectura rețelei pentru baza de antrenare 57
Figura 4.4. Reprezentarea histogramei unei semnături 59
Figura 4.5. Comportamentul rețelei la mărirea bazei de semnături 61
Figura 4.6. Interfața grafică în cazul unui utilizator acceptat de sistem 62
Figura 4.7. Interfața grafică în cazul unui utilizator respins de sistem 62
Lista tabelelor
Tabelul 1.1. Conținutul fișierului de tip pix*.csv [12] 21
Tabelul 2.1. Exemple de variabile de intrare și ieșire pentru predicția prețului unei case 29
Tabelul 4.1. Rezultatele rețelei neuronale 60
Tabelul 4.2. Rezultate Cross Validation 61
Tabelul 4.3. Recunoașterea semnăturilor crescând numărul de parametri 63
Lista acronimelor
SRVS (Signature Recognition and Verification System) – Sistem de recunoaștere și verificare de semnături
MEMS (Micro-Electro-Mechanical Systems) – Sisteme micro-electromecanice
MLP (Multi Layer Perceptron) – Perceptron multistrat
ONS (Optical Navigation Sensor) – Senzor de navigație optică
DSR (Digital Signature Recognition) – Recunoaștere de semnături digitale
GPU (Graphics Processing Units) – Unități grafice de procesare
PDB (Protein Data Bank) – Banca de date proteice
SRA (Signature Recognition Algorithm) – Algoritm de recunoaștere de semnături
MEP (Minimizarea Erorii Patratice) – Minimizarea erorii pătratice
ML (Machine Learning) – Învățarea mașinilor
INTRODUCERE
Semnătura este un atribut biometric important al unei persoane, ce poate fi folosit în a autentifica identitatea umană. Un număr important de tehnici biometrice au fost propuse pentru identificarea personală în trecut, precum recunoaṣterea vocii, a feței, a amprentelor, a irisului ṣi a retinei. Recunoaṣterea vocii ṣi verificarea semnăturii sunt cele mai cunoscute metode.
Pentru că semnătura continuă să joace un rol foarte important în tranzacțiile financiare, comerciale ṣi legale, autentificarea extrem de sigură devine din ce în ce mai importantă. Recunoaṣterea semnăturii este considerată cea mai importantă ṣi naturală metodă de autentificare a identitații unei persoane. De aceea, semnătura unei persoane se consideră a fi ‘sigiliul de aprobare’ ṣi rămâne mijlocul de autentificare preferat.
Senzorii MEMS integrați în pix captează accelerații a căror natură este multiplă ṣi inseparabilă la nivelul senzorului: proiecții variabile ale accelerației gravitaționale datorate variației înclinării planului axelor de referință din senzor, accelerația liniară cauzată de mișcările necesare producerii simbolurilor ce alcătuiesc semnătura,componenta normală a accelerației liniare de natură centripetă, accelerații de natură vibrațională ṣi accelerații coriolis, rezultate ca efect al expunerii simultane a masei inerțiale a senzorului atât la microvibrații cât și la accelerații de natură centripetă. Accelerațiile sunt convertite de senzorii MEMS în semnale electrice analogice și transmise modulului electronic de achiziție [12].
Amprenta biocinetică conține structuri informaționale individualizate, specifice persoanei care generază semnătura. Dinamica complexă, captată din perspectiva senzorilor de acceleratie, prezintă totodată o variabilitate intraindividuală cauzată de gradul de consecvență cu care sunt realizate semnăturile cât și de context. Ceea ce e specific metodei de recunoaṣtere a semnaturii dinamice se rezumă la metrica de analiză, care se bazează pe distanțele rezultate prin compararea variațiilor locale și globale a semnalelor asociate semnăturilor și nu pe comparații de valori absolute măsurate [12].
Spre deosebire de o parolă, PIN, sau PKI, date de identificare ce pot fi uitate, pierdute, furate sau făcute publice, valorile parametrilor captați pentru semnătura olografă sunt unici pentru fiecare individ în parte ṣi sunt imposibil de duplicat virtual.
Sistemele de recunoaștere și verificare a semnăturilor , SRVS (Signature Recognition and Verification System) este un sistem capabil să realizeze eficient alăturarea dintre două task-uri individuale,dar strâns legate una de alta: identificarea persoanei careia îi aparține semnătura și decizia dacă semnătura e originală sau falsificată. În funcție de cerințe, SRVS-urile sunt des clasificate în două clase majore: SVRS-uri on-line și SVRS-uri off-line. Vom avea nevoie de informație despre modul în care a fost prelevată semnatura, despre viteza cu care s-a scris și masurări ale forței cu care s-a apăsat, achiziționate cu periferice speciale.
Semnătura unei persoane poate fi prelucrată precum o imagine ṣi recunoscută prin computer vision sau prin rețele neuronale, fiind necesară dezvoltarea unor algoritmi rapizi. Se extrag trăsături geometrice din imagini, iar pe baza parametrilor extraṣi cu diverse tehnici de procesare a imaginilor e implementată recunoaṣterea semnăturilor. În lucrarea de față, nu prelucrăm imaginile semnăturilor, ci folosim pentru înregistrarea electronică a semăturilor în baza de date familia de senzori MEMS (Micro-electro-mechanical systems) [1], în scopul recunoaṣterii semnăturii dimanice. Spre deosebire de analiza imaginii semnăturii prezentată mai sus, semnătura dinamică reprezintă ansamblul acțiunilor și reacțiunilor cinetice transmise dispozitivului de scriere, ceea ce definește amprenta biocinetică a respectivei semnături și implicit a persoanei [12].
Parametrii extrași din semnătura dinamică olografă vor fi antrenați cu o rețea neuronală, în scopul recunoașterii autenticității utilizatorului. Față de algoritmii folosiți până în prezent, se remarcă o rapiditate a algoritmului, dar și performanțe mai bune.
Deși nu există o definiție general acceptată a rețelelor neuronale artificiale, majoritatea cercetătorilor sunt de acord că acestea reprezintă ansambluri de elemente de procesare simple, interconectate prin canale de comunicații prin care se propagă informație numerică. Din perspectivă istorică, multe dintre ideile vehiculate în acest context sunt motivate de dorința de a construi sisteme capabile să rezolve cu succes sarcini uzuale pentru creierul uman, precum înțelegerea vorbirii sau recunoașterea formelor. În cazul lucrării de față, vom recunoaște semnături.
Rețele neuronale MLP (Multi Layer Perceptron) sunt printre cei mai utilizați clasificatori în aplicațiile de recunoaștere de pattern-uri. În ciuda avantajelor, prezintă limitări serioase ce fac imposibilă folosirea lor. Una din limitări este mărimea rețelei neuronale, e foarte greu să antrenăm rețele mari.O a doua limitare ar fi legată de datele de antrenare; trebuie să știm cu câte clase de date avem de-a face (cunostințe a priori). Din nefericire, când vine vorba de SRVS-uri utile, nu cunoaștem a priori exact câte clase de utilizatori sau câte clase de semnături avem disponibile. Așadar, în lucrarea prezentată se va folosi o rețea cu un singur strat ascuns, care va calcula ponderile pentru o bază de date de 290 de semnături.
SEMNĂTURA OLOGRAFĂ DINAMICĂ
Istoric
Primul sistem de recunoaṣtere de semnături digitale a fost realizat în 1965. Cercetările au continuat până în anii 1970 concentrându-se asupra trăsăturilor statice ṣi geometrice (aṣa cum semnătura arată), în loc să se focuseze pe cele dinamice (așa cum semnătura e facută). Interesul pentru caracteristicile dinamice ale unei semnături s-a pronunțat atunci când sistemele de achiziție s-au îmbunătățit, scop atins odată cu apariția tehnologiei touch sensitive . În 1977 s-a oferit un brevet pentru un ‘personal identification apparatus’ ce putea achiziționa informații despre presiunea dinamică [2].
Unul din primele sisteme în care s-a implementat verificarea cu semnatură dinamică a fost descrisă în U.S. Pat. Nos. Sept. 15, 1970 [3] de către Johnson et al. Acest brevet divulgă un pix cu vârf din piatră prețioasă ṣi un circuit electronic pentru analiza semnăturii dinamice. Mai mult de atât, vârful pixului avea montați traductori ce recepționau presiunea. Într-o primă variantă de realizare relativ simplă a vârfului de pix, era prevăzut un singur traductor pentru măsurarea verticală în jos (axa z) a presiunii. În timpul funcționării, semnale generate stocate sunt folosite ca semnatură de referință ṣi apoi comparate cu semnalele generate în timpul unei semnături ulterior stocată pentru a evalua identitatea scriitorului.
În 1991, laboratoarele Sandia National au produs lucrarea Evaluarea Performanțelor Device-urilor de Identificare Biometrică (A Performance Evaluation of Biometric Identification Devices) [4], raport ce evaluează relativa performanță a device-urilor multiple, incluzând semnătura dinamică. În 1999 New York, Raportul Testelor Biometrice (Report of Biometrics In-House Test) [5], un pilot operațional sponsorizat de către Agenția de Protecție a Mediului (Environmenologiei touch sensitive . În 1977 s-a oferit un brevet pentru un ‘personal identification apparatus’ ce putea achiziționa informații despre presiunea dinamică [2].
Unul din primele sisteme în care s-a implementat verificarea cu semnatură dinamică a fost descrisă în U.S. Pat. Nos. Sept. 15, 1970 [3] de către Johnson et al. Acest brevet divulgă un pix cu vârf din piatră prețioasă ṣi un circuit electronic pentru analiza semnăturii dinamice. Mai mult de atât, vârful pixului avea montați traductori ce recepționau presiunea. Într-o primă variantă de realizare relativ simplă a vârfului de pix, era prevăzut un singur traductor pentru măsurarea verticală în jos (axa z) a presiunii. În timpul funcționării, semnale generate stocate sunt folosite ca semnatură de referință ṣi apoi comparate cu semnalele generate în timpul unei semnături ulterior stocată pentru a evalua identitatea scriitorului.
În 1991, laboratoarele Sandia National au produs lucrarea Evaluarea Performanțelor Device-urilor de Identificare Biometrică (A Performance Evaluation of Biometric Identification Devices) [4], raport ce evaluează relativa performanță a device-urilor multiple, incluzând semnătura dinamică. În 1999 New York, Raportul Testelor Biometrice (Report of Biometrics In-House Test) [5], un pilot operațional sponsorizat de către Agenția de Protecție a Mediului (Environmental Protection Agency), a evaluat interoperbilitatea hardware-ului de recunoaṣterea semnăturilor a driver-elor ṣi sistemelor de operare existente ṣi a găsit numeroase probleme. Chiar dacă aceste teste reprezintă evaluări guvernamentale recente, informația nu poate fi considerată conclusivă din cauza vârstei testelor.
În ultimii ani, au fost propuse câteva SRV-uri on-line (Parizeu și Plamondon, 1990; Brault și Plamondon, 1993; Lee et al., 1996), dar și off-line (Qi și Hunt,1994; Yedekcoglu et al., 1995; Han si Sethi, 1996; Droughard et al.,1996; Bjaj și Chaudhuty,1997; Huang și Yan 1997). În categoria off-line Qi și Hunt au propus un sistem SRVS bazat pe invarianți globali de rețea, împreună cu un clasificator simplu bazat pe distanța euclidiană. Yedekcoglu et al. a dezvoltat o tehnică bazată pe template-uri grosiere ce pot fi folosite ca o fază inițială a unui SRVS pentru a respinge cât mai multe semnături ce sunt complet nepotrivite cu cele de referință. În 1999, Ramesh și Murty au propus un sistem off-line de verificare de semnături ce constă în 4 subsisteme bazate pe invarianți geometrici, reprezentări de moment, caracteristicile anvelopei și trăsături wavelet.
În 1996, Han și Sethi au propus un sistem de recunoaștere de semnături bazat pe invarianți geometrici și topologici. Apoi, Droughard et al. au folosit funcția densitate de probabilitate împreună cu o rețea neuronală antrenată cu propagare înapoi (backpropagation). Mai tarziu, Baiaj și Chaudhury au folosit rețele neuronale multiple oferite de trei seturi de trăsături globale, incluzând momentele de proiecție. Tot în 1997, Huang și Yan au folosit caracteristici geometrice în combinație cu un clasificator cu rețele neuronale, în care rezultatele experimentale s-au bazat pe un număr mic de semnături [24].
Pentru ca un SVRS să fie funcțional în aplicații practice, trebuie să aibă abilitatea de a adăuga sau a șterge ușor din baza de date a fiecărui utilizator. În această lucrare, pentru fiecare utilizator vom avea un clasificator individual de implementat, așadar rețeaua neuronală va fi antrenată de fiecare dată când se vor adăuga noi semnături în baza de date.
Semnatură dinamică versus semnătură digitală
Cu foarte mulți ani înainte s-au făcut eforturi considerabile pentru a dezvolta sisteme care să identifice sigur ṣi eficient identitatea unei persoane. Astfel de investigații au produs sisteme care evaluează automat amprente, suprafețele irisului ṣi eṣantioanele vocale. O altă arie în care s-au făcut investigații semnificative este analiza dinamică a semnăturii.
Analiza dinamică a semnăturii olografe se referă la evaluarea în timp real a mișcării mâinii subiectului în timpul procesului semnăturii. Această analiză e contrastată de analiza semnăturii care abia compară apariția finală a semnăturii propriu-zisă cu o probă de scris cumulată precedent, cu toate ca aceasta are un uz practic, ea nu are nivelul de securitate oferit de analiza dinamică a semnăturii dinamice . Un falsificator poate imita rezultatul vizibil al semnăturii ṣi poate produce o copie realizată mai lent, dar identică cu semnătura subiectului.
Aṣadar, semnătura dinamică este o modalitate biometrică care foloseṣte, în scopul recunoaṣterii individului, caracteristici comportamentale ṣi anatomice pe care acesta le deține atunci când semnează. Nu trebuie să se confunde dispozitivele ṣi sistemele cu care achiziționăm semnăturile digitale cu echipamentele folosite pentru prelevarea semnăturilor electronice, pentru că cele din urmă captează doar o imagine grafică ṣi sunt folosite în locuri unde vânzătorii le înregistrează pentru a autoriza tranzacții.
Unii algoritmi de recunoaṣtere a semnăturii dinamice au încorporate o funcție de învățare a schimbărilor naturale ṣi a drifturilor ce se modelează într-o semnătură a unui individ, pe măsură ce timpul trece. Trăsăturile extrase dintr-o semnătură dinamică sunt aproape imposibil de replicat. Spre deosebire de o imagine grafică a unei semnături electronice ce poate fi falsificată (de către o persoană specializată, o manipulare computațională sau de către un fotocopiator), aceste caracteristici dinamice sunt complexe ṣi unice fiecărui stil de scris al unui individ. În ciuda acestui avantaj major, cu trecerea timpului trăsăturile prezintă o variabilitate intra-clasă, adică semnaturile pot varia de la un set de semnături la altul, îngreunând procesul de recunoaṣtere. Cu ajutorul unor probe statice de scris putem depăṣi aceste limitări, potrivit ultimelor cercetări în domeniu.
Majoritatea trăsăturilor folosite nu sunt statice sau geometrice, sunt caracteristici dinamice: viteză, acelerație, sincronizare, presiune ṣi direcție, toate analizate pe axele x,y ṣi z, adică 3D. Forțele sunt măsurate în cele două direcții ortogonale ( axa x ṣi axa y) ṣi pe verticală în jos (axa z), măsurarea presiunii fiind realizată cu traductoare montate în pix sau folosind un pad sensibil la forța de apăsare.
În timpul execuției unei semnături, măsurătorile sunt efectuate proporțional cu presiunea exercitată de către subiect. Aceste semnale pot varia pe masură ce pixul este miṣcat în timpul unor curbe sau pauze ale semnăturii. Dacă acestă informație e stocată, ea poate fi comparată cu datele obținute dintr-o semnătură preluată anterior ṣi se poate determina dacă semnalele sunt similare ṣi dacă se potrivesc în anumite limite definite. Experimentele au arătat ca este foarte dificil ca o persoană să imite variațiile de presiune ale altei persoane. Este de apreciat faptul că un falsificator ce are grijă în a efectua o copie a semnăturii, nu va utiliza aceeiaṣi viteză ṣi aceeiaṣi miṣcare secvențială ca subiectul original. În consecință, se poate crede că analiza dinamică a semnăturii oferă o abordare excelentă în a identifica personalul autorizat [10].
Importanța bazei de date de achiziție
Deoarece un sistem biometric de autentificare presupune asigurarea protecției identității unei persoane, soluția utilizată în protejarea informațiilor este autentificarea bazată pe semnătură olografă dinamică. Această soluție a fost gasită pentru că semnătura este o caracteristică unică fiecărei persoane, ca ṣi ADN-ul. Tocmai de aceea, semnătura a fost admisă ca mijloc de autentificare de către toate culturile și civilizațiile din trecut, servind și ca probă juridică. Sistemele de autentificare prin semnătură nu sunt bazate pe ceea ce o persoană posedă (parolă, cod PIN, token), ci pe baza a ceea ce "este” [9].
Foarte utilă pentru evaluarea performanțelor sistemelor de autentificare bazate pe semnătură olografă dinamică este colectarea bazelor de date de semnături, adică alcătuirea unei baze de date de test cu semnături trebuie să corespundă unui mediu real de utilizare a sistemului. Baza de date de semnături trebuie să fie cât mai cuprinzătoare, cu un număr mare de subiecți care semnează și un număr suficient de mare de semnături pe care le oferă aceștia. De asemenea, ar fi util pentru testarea sistemului de autentificare ca semnăturile să aibă o complexitate sporită.
Evaluarea performanțelor sistemelor de autentificare a fost posibilă datorită diverselor baze de semnături olografe dinamice culese de-a lungul timpului. S-au utilizat diverse metode sau algoritmi în procesul de autentificare: Dynamic Time Wrapping, algoritmul lui Levenshtein, HMM (Hidden Markov models) ṣi rețele neuronale. Această lucrare presupune folosirea rețelelor neuronale cu scopul de a realiza ṣi evalua procesul de autentificare a aproximativ 300 de semnături olografe dinamice dintr-o bază de date deținută de Softwin Group. Modul de captare a parametrilor semnăturii olografe este prezentat în figura 1.1 [10].
Anumite baze de semnături au fost utilizate în evaluări internaționale în verificarea mai multor tipuri de sisteme de autentificare bazate pe semnătură dinamică. Obiectivul a fost să permită cercetătorilor și celor care lucrau în domeniu să compare sistematic performanța a diferite sisteme de verificare a semnăturii pe baze de date de referință comune și reguli de evaluare comparativă de asemenea comune [11].
Figura 1.1. Transmiterea informațiilor captate de senzori [10]
Dispozitivul de achiziție
În general, semnăturile dinamice sunt captate de către dispozitive electronice speciale (pixuri inteligente, tablete grafice), care extrag proprietățile dinamice ale unei semnături (accelerații, presiune, etc.) în plus față de forma grafică extrasă din orice semnătură digitală.
În această lucrare se utilizează dispozitivul de autentificare din figura 1.2 care reprezintă „rezultatul cercetărilor în domeniul biometriei realizate de către departamentul R&D Softwin. Dispozitivul de autentificare este un pix inteligent care captează mișcările naturale ale mâinii persoanei care semnează, pe baza unor senzori de accelerație de tip MEMS, precum și traiectoria realizată de mâna pixului pe hârtia de pattern, pe baza unui senzor de navigație optică” [10].
Figura 1.2. Dispozitiv de achiziție a semnăturii [12]
„Semnăturile achiziționate se stochează sub forma de fișiere în format csv. Numele fișierelor este de forma: pix[SignatureId].csv, așa cum este descris în tabelul 1.1 ” [12].
Tabelul 1.1. Conținutul fișierului de tip pix*.csv [12]
Extragerea invarianților
Operația de extragere a invarianților se realizează doar asupra informației utile extrase din semnalele primare sau combinații ale acestora. Extragerea informației utile se realizează filtrând trece bandă semnalele primare achiziționate de la pix [12].
„Un sistem biometric bazat pe semnătura olografă dinamică poate fi reprezentat printr-o schemă ce cuprinde două scenarii principale: înregistrare și autentificare. În contextul procesului de verificare a semnăturii dinamice, o persoană trebuie inițial să își înregistreze un set de semnături în sistem. Acestea vor fi comparate, cu ajutorul unor algoritmi de comparare a două șiruri, cu semnătura dată pentru autentificare. Răspunsul sistemului biometric va fi rezultatul unor metode de combinare a rezultatelor obținute de la algoritmii de comparare.
Pentru a calcula similaritatea între două semnături S1 și S2 se va efectua o procesare a acestora în cadrul căreia vom defini componente și vom extrage un șir de invarianți – pentru fiecare componentă – prin codificarea semnalului conform unui alfabet de invarianți. Un invariant este o mărime extrasă dintr-un semnal (sau dintr-un ansamblu de semnale) care reprezintă o semnatură olografă dinamică” [12], așa cum este prezentat în figura 1.3.
Figura 1.3. Schema modulului de procesare [12]
MACHINE LEARNING
2.1. Ce este Machine Learning?
Machine learning (ML) este considerată tehnica computerelor de a învăța din setul de date, fără a fi în mod explicit programat. În ultimul deceniu, machine learning ne-a oferit aplicații de filtrare a spam-urilor, recunoaștere optică a subiectelor, mașini care se conduc singure, recunoașterea vorbirii, un motor eficient de browsing pe internet, îmbunătățiri în domeniul genomului uman. Tehnica machine learning este atât de des întâlnită în ziua de azi încât e folosită de zeci de ori pe zi fără ca noi să conștientizăm acest lucru.
În 1959, Arthur Samuel definea machine learning drept un câmp de studiu care oferă computerelor abilitatea de a învăța fără a fi în mod explicit programate. În 1998, Tom Mitchell vedea problema acestei învățări astfel: un program învață dintr-o experiență E cu respect pentru un anume task T și cu o anume performanță P, dacă performanța pentru T masurată cu P se îmbunătățește cu experiența E. Spre exemplu: task-ul T ar putea fi reprezentat de clasificarea mail-urilor drept spam sau non spam, experiența E ar consta în a observa când cineva le clasifică drept spam-uri, performanta P s-ar reprezenta prin numărul de mail-uri corect clasificate drept spam sau non spam [13].
Recunoașterea unui obiect tridimensional dintr-un anumit unghi și în anumite condiții de iluminare a unei scene implică o dificultate mai mare de scriere a codului, acesta poate fi extrem de complicat. Un alt exemplu greu de programat ar fi calculul probabilității unei tranzactii de credit frauduloasă .Codul pentru acest exemplu trebuie să se poată schimba în funcție de caz, deoarece frauda este în continuă mișcare.
În loc să scriem un program pentru fiecare task în parte, colectăm exemple de date care specifică ieșirea corectă pentru fiecare intrare. Algoritmii de ML preiau aceste exemple, le clasifică și le prelucrează astfel încât să se obțină un rezultat optim. Programul astfel produs de algoritmul de învățare poate arăta foarte diferit față de unul tipic scris de la tastatură; poate conține milioane de numere. Dacă este realizat corect, acesta funcționează pentru cazurile cu care l-am antrenat, dar și pentru noi intrări. Dacă datele se schimbă, și programul poate fi modificat prin antrenarea noilor date. Astfel, obținem reducerea costului computațional față de costul pe care l-am plăti unei persoane ce poate realiza programul cu task-urile specifice.
Algoritmii de ML pot recunoaște pattern-uri (obiecte din scene reale, fețe sau expresii faciale, cuvinte rostite), anomalii (secvențe neobișnuite ale tranzacțiilor unui credit card, pattern-uri neobișnuite ale unui senzor de instalație nucleară), predicții (prețul acțiunilor viitoare sau ratele de schimb valutar, ce filme i-ar placea unei persoane, etc).
2.2. Contribuția lui Andrew Ng
Google Brain a fost de 10 ori mai mare decât celelalte rețele neuronale dinaintea ei, cu peste 1 milion de neuroni simulați și cu peste 1 bilion de conexiuni simulate [14].
Fondatorul proiectului, Andrew Ng, acum director la Laboratorul de Inteligență Artificială al Universității Standford din California a trecut la realizarea unui sistem de învățare profundă de 10 ori mai mare chiar față de Google Brain.
Jitendra Malik, cercetător în recunoaștere de imagini digitale la Universitatea Berkeley din California, a fost sceptic cu privire la aceste rețele de deep-learning, pentru că primele programe nu erau mai performante decât cele simple: “Rețelele neuronale au fost întotdeauna o artă delicată de gestionat. Este implicată un fel de magie neagră”, spunea cercetătorul. Și asta pentru că rețelele au nevoie de un stream bogat de exemple pentru a învăța – exact cum un bebeluș are nevoie de multă informație despre lume. Și pentru că în anii ’80 – ’90 informația digitală era greu de stocat și de procesat, aplicațiile ce foloseau rețelele erau rare.
După anii 2000, atunci când a început explozia de date digitale și putere computațională, oamenii de știintă au fost convinși că rețelele nuronale vor sparge recorduri în acuratețea rezultatelor. Așa a și fost, mai întâi pentru recunoașterea vorbirii. Marea realizare ce a captat atenția pe piața smartphone-lor a fost asistentul digital activat pe voce, Siri, ce are la bază algoritmul de deep learning.
Atunci când Google a adoptat recunoașterea vorbirii bazată pe algoritmul deep learning pe sistemele de operare Android, a realizat o reducere a cuvintelor eronate cu 25%, pas ce se putea realiza în 10 ani de zile, pentru a ne face o imagine a ce înseamnă progres în această arie, reprezentative fiind figurile 2.1, 2.2 și 2.3.
Andrew Ng a convins Google să îi dea acordul de a folosi datele și serverele sale pentru proiectul Google Brain. Abilitatea de a recunoaște pisici a fost convingatoare, o demonstrație a învățării nesupervizate – cel mai dificil task de învățare, deoarece imaginile de intrare nu au nicio informație explicativă, cum ar fi numele, titlul sau categoria [23].
Figura 2.1. Rezultatele rețelei neuronale utilizată de Google varianta 1 [13]
Figura 2.2. Rezultatele rețelei neuronale utilizată de Google varianta 2 [13]
Figura 2.3. Rezultatele rețelei neuronale utilizată de Google varianta 3 [13]
Dezavantajul a fost inaccesibilitatea la o bază de date așa de mare. Puțini cercetători aveau ustensilele necesare de a lucra cu deep learning. Așadar, la Stanford, Ng a dezvoltat rețele mari și ieftine folosind GPU-uri (Graphics Processing Units), chip-uri foarte rapide dezvoltate pentru jocuri pe computer: “Folosind un hardware de 100 000 de dolari, putem realiza o rețea cu 11 bilioane de conexiuni cu 64 de GPU-uri ”, spunea Ng.
Se va caștiga teren și în domeniul computer-vision, unde oamenii de știință erau încă sceptici (printre care și Malik). Așadar, la renumita competiție ImageNet, echipele antrenează programele pe un set de date format dintr-un milion de imagini care au fost manual împărțite pe categorii. Sunt 5 variante de categorii posibile pentru fiecare imagine. Dacă raspunsul corect nu se regăsea în una din cele 5 variante, se considera drept eroare. Câștigătorii competiției de până atunci au avut rate de eroare de 25%. În 2012, laboratorul lui Hinton a fost primul competitor care a folosit deep learning. Au avut rata de eroare de doar 15%.
Tehnica depășise orice așteptări. Câștigul i-a adus lui Hinton un job part-time la Google, iar compania a folosit programul pentru a-și updata soft-ul de căutare de poze Google+ din mai 2013.
Malik a fost impresionat de rezultate, spunând: “În știință trebuie să fii guvernat de dovezi empirice, iar aceasta a fost cu siguranță o dovadă”. Aceste rețele de învățare s-au dovedit folositoare pentru multe scopuri științifice. Hinton spunea “Rețelele sunt foarte bune în a găsi trăsături în setul de date”.
În 2012, compania de farmaceutice Merk a oferit un premiu de 20 000 de dolari pentru cel mai bun program ce putea prezice administrarea de medicamente. Task-ul era de a alege dintr-o bază de date de intrare formată din 30 000 de molecule, fiecare interacționând cu câte 15 molecule target. Au imbunătățit sistemul cu 15%.
Cercetătorii Institutului de Tehnologie Cambridge din Massachusetts folosesc ML pentru a analiza în imagini 3D contribuția creierului la procesul de învățare. Aceste imagini identifică conexiunile dintre neuroni. Tehnica ML se pare a fi cel mai bun mod de automatizare. Momentan se lucrează la un program de învățare ce mapează neuronii dintr-o mare parte a retinei, apoi oferă rezultatele voluntarilor unui joc online numit EyeWire [14].
Fotoreceptorii sunt celule ce pot transforma lumina în neuro-semnale. Celulele bipolare primesc intrări de la fotoreceptori, iar în schimbul lor oferă semnale pentru celulele amacrine, celule ce ajută la îmbogățirea complexității rețelei neuronale conectându-se la diferite celule bipolare (au două ramuri distribuite în direcții opuse). Celulele care reprezintă layer-ul de ieșire al rețelei neuronale sunt ganglionii, care transmit semnalele nervului optic și, mai apoi, creierului [15].
Figura 2.4. O extensie de rețea de 5 layere a creierului și portalul de lumea exterioară [16]
Wiliam Stafford Noble, un om de știință al Universității din Washington în Seattle, a folosit învățarea cu rețele pentru un program care poate prezice structura proteinei rezultante doar uitându-se la lanțul de aminoacizi și verificând dacă diferite porțiuni vor forma o spirală sau o buclă, sau dacă va fi ușor pentru un solvent să interacționeze cu o structură de substanță. Noble a testat programul pe un set modest de date, dar va testa în curând pe un depozit global ce conține 100 000 de structuri numit PDB – Protein Data Bank.
Pentru acești oameni de știință, algoritmii de ML le aduc mult profit. Iar dacă aceștia sunt “hrăniți” cu mai multe date, devin din ce în ce mai buni. Nu sunt singurii algoritmi cu rezultate bune, dar sunt cei mai buni și cei mai simpli, de aceea sunt foarte promițători în viitor.
Nu toți cercetătorii sunt consemnați la această idee. Oren Etzioni, director al Institutului Allen de Inteligență Artificială din Seattle, spune că nu va folosi creierul drept inspirație: “Este la fel ca atunci când am inventat zborul; proiectele cele mai de success pentru aeronave nu au fost modelate după biologia păsărilor”. Scopul lui constă în invenția unui computer care să poată trece teste de știință doar având scanate cărți de școală generală. Pentru a trece testele, acesta trebuia să citească și să înțeleagă textul și diagramele. Cum va face asta, nu a decis încă, dar rețelele neuronale și deep-learning nu sunt în topul listei lui.
Gradientul descrescător
În ML, task-urile pot fi de câteva tipuri: învățarea supervizată (supervised learning), algoritm ce prelucrează variabilele de intrare și ieșirile etichetate, scopul fiind obținerea unei reguli generale care să mapeze intrările către ieșiri. Filtrarea de spam-uri este un exemplu potrivit pentru învățarea supervizată.
Învățarea nesupervizată (unsupervised learning) nu prelucrează datele deja împărțite pe categorii, ci formează clustere cu acestea în care grupează intrările similare, densitățile și proiecțiile estimate ale datelor n-dimensionale ce se pot vizualiza. Un exemplu: unui program i se dă o lista de documente, iar acesta trebuie să le caute pe cele cu subiect comun.
Un al treilea tip de învățare se numește reinforcement learning și presupune interacțiunea computerului cu un mediu dinamic în care trebuie să îndeplinească un task (să conducă un vehicul) fară a i se explica dacă și-a atins sau nu scopul pe parcurs.
Pornind de la un caz foarte simplu, se consideră că se dorește cumpărarea unei case și se vrea să se știe care va fi prețul acesteia peste o lună, făcând o predicție după analizarea pieței de imobiliare. Așadar, va trebui să se țină cont de niște variabile numite trăsături multiple, după cum se prezintă în tabelul 2.1.
Tabelul 2.1. Exemple de variabile de intrare și ieșire pentru predicția prețului unei case
Variabilele sunt:
numărul de variabile;
variabilele de intrare al exemplului de antrenare; ( = [111 2 15 1])
valoarea variabilei in exemplul dat;
variabilele de ieșire (target).
Variabilele pot lua valorile:
4;
= ;
15;
Pentru a prezice o valoare a prețului unei case, se folosește algoritmul de învățare supervizat, ceea ce înseamnă că având setul de date de mai sus, putem estima pe baza variabilelor de intrare, ieșirea optimă. Folosim pentru acest exemplu învățarea supervizată deoarece algoritmul de învățare nesupervizat nu folosește informațiile date despre setul de date (se știe dacă o valoare este număr de dormitoare sau de etaje, de exemplu).
În figura 2.5 se poate vedea reprezentat setul de date pentru o singură variabilă și anume suprafața în (pe axa x ) și prețul caselor (pe axa y), adică variabila de intrare și respectiv cea de ieșire.
Figura 2.5. Clusterul format de variabile [26]
Pentru a estima prețul unei case în funcție de o variabilă, trebuie să caracterizăm clusterul de puncte astfel format cât mai bine. Pentru a face asta, avem nevoie de o ipoteză, .
Figura 2.6. Reprezentarea ipotezei (funcției de transfer)
Ipoteza pentru o regresie liniară cu o variabilă (suprafața casei) se exprimă astfel:
Pentru cazul cu 4 variabile vom avea ipoteza:
Pentru variabile multiple vom avea ipoteza :
Iar funcția de cost va fi egală cu:
Pentru a minimiza funtia de cost , se folosește principiul gradientului descrescător [17].
Figura 2.7. Găsirea minimului cu gradientul descrescător [22]
Se începe cu un set de ponderi inițiale care se schimbă simultan până când funcția de cost ajunge la minim.
Un exemplu pentru cazul simplu cu o singură variabilă (suprafața casei) este prezentat în figura de mai jos. Se modifică și până când se găsește un minim global,ca în figura 2.8 (a se observa și minimul local din figura 2.9).
Figura 2.8. Găsirea minimului cu gradientul descrescator- reprezentare 3D [22]
Figura 2.9. Găsirea unui minim local cu gradientul descrescător – reprezentare 3D [22]
Atunci când se crește numărul de variabile, adică , căutarea de minim a funcției de cost se face de asemenea cu updatarea simultană a ponderilor după relația:
pentru ,
unde este rata de învățare. Valoarea lui trebuie aleasă astfel încât coborârea pantei ipotezei să nu se facă nici prea rapid, dar nici prea lent. De asemenea, nu e nevoie ca această valoare sa fie scăzută la fiecare iterație, deoarece algoritmul scade automat această valoare din ce în ce mai puțin [26].
Funcția de cost va fi:
unde .
Pentru găsirea minimului trebuie să se rezolve ecuația de mai jos pentru fiecare j:
Scalarea trăsăturilor ajută algoritmul să fie mai rapid. Pentru a asigura buna funcționare a gradului de coborâre a pantei, funcția de cost trebuie să scadă pe măsură ce se mărește numărul de iterații. De asemenea, dacă valoarea lui este prea mică, funcția de cost converge la minim foarte încet, respectiv dacă valoarea sa este prea mare, poate să nu mai ajungă la minim deloc [26].
Ecuații matriceale
Pentru exemple (), (), …, () și trăsături se consideră:
Pentru că aplicarea gradului de coborâre a pantei ipotezei (funcției de transfer) presupune alegerea unui potrivit, trebuie să aplicăm algoritmului multe iterații și pentru că valoarea lui trebuie să fie foarte mare (), se poate opta pentru a ajunge la minimul funcției de cost cu ecuațiile matriceale. Dezavantajul acestei metode este ca trebuie să calculăm , matrice care poate fi neinversabilă [26].
Ecuația pentru găsirea valorilor poredrilor este:
Se poate obține o matrice neinversabilă dacă :
există trăsături redundante (liniar dependente între ele);
există prea multe trăsături (în acest caz se folosește regularizarea).
Regresia liniară și regresia logistică
Regresia logistică modelează relația dintre o mulțime de variabile independente (categoriale, continue) și o variabilă dependentă dihotomică (nominală, binară/multiplă), . O astfel de variabilă dependentă apare, de regulă, atunci când reprezintă apartenența la două clase, categorii – prezență/absență, da/nu etc.
Ecuația de regresie obținută, de un tip diferit de celelalte regresii discutate, oferă informații despre:
• importanța variabilelor în diferențierea claselor,
• clasificarea unei observații într-o clasă.
În asemenea cazuri, regresia liniară clasică nu oferă un model adecvat.
Presupunem că valorile y (variabilă binară) sunt codificate 0/1, valoarea 1 exprimând în general apariția unui anumit eveniment, astfel încât ceea ce se caută este o estimare a probabilității de producere a respectivului eveniment în funcție de valorile variabilelor independente.
Spre deosebire de exemplul cu casele, sunt multe situații când avem de-a face cu o variabilă de ieșire binară. În cazul de față, întrebarea este dacă semnătura de test este sau nu originală. Variabilele de intrare insă, vor avea valori discrete, nu continue. Această regulă care ghicește valoarea binară a ieșirii dintr-un set de variabile de intrare, se numește clasificare și constituie un subiect important în statistici și în machine learning.
Predicția dacă o semnătură e sau nu originală ține de probabilități, așadar avem nevoie de un model stohastic, adică probabilități cuprinse între 0 și 1.
O soluție evidentă în a găsi un model al probabilității ar fi ca funcția să fie liniară raportată la . Dar problema este că se dorește ca funcția p(x) să ia valori cuprinse între 0 și 1, iar o funcție liniară e nemarginită. Așadar, cel mai potrivit model este modelul regresiei logistice : unde e probabilitatea ca o semnătură să fie originală, iar p-1 să nu fie . Modelul de regresie logistică prezintă soluția :
Pentru a optimiza corect algoritmul trebuie să optimizăm . Date fiind valorile , codul trebuie să calculeze funcția de cost și apoi , pentru fiecare Această cerință e îndeplinită foarte bine de către gradul de coborâre al pantei (gradient descent) ce updatează valorile , deși sunt disponibili și alți algoritmi mai complecși care pot calcula minimul funcției de cost (panta conjugată, BFGS,L-BFGS). Dezavantajul acestor algoritmi este complexitatea sporită, cu toate că de multe ori aceștia sunt mult mai rapizi decât gradul de coborâre al pantei funcției de transfer .
Clasificarea multiclasă a fost menționată în exemplul inițial pentru prezicerea prețurilor caselor, unde aveam ca ieșiri mai multe valori discrete. Lucrarea de față presupune însă o clasificare diferită: clasificarea binară ().
Diferența majoră între regresia liniară și cea logistică este forma ipotezei logistice care se transformă în ecuația de mai jos :
Figura 2.10. Reprezentarea funcției logistice (sigmoid)
Aceste două tipuri de regresie funcționează bine pentru multe probleme, dar când sunt folosite în diverse aplicații de machine learning, apare fenomenul de overfitting ce afectează rezultatele oferind o performanță slabă.
Overfitting
După cum se poate observa în figurile 2.11 și 2.12, pentru modelul linear dar și pentru modelul logistic, primul exemplu nu caracterizează bine setul de date; fenomenul se numește underfitting (bias mare). Al doilea exemplu caracterizează bine setul de date, dar nu suficient. Ultimul exemplu descrie foarte bine setul de date, dar curba ce descrie graficul, deși parcurge toate variabilele de intrare, are inflexiuni și nu e utilă pentru modelul funcției de transfer, având un grad polinomial mare.
Figura 2.11. Grafice reprezentative modelului liniar [26]
Figura 2.12. Grafice reprezentative modelului logistic [26]
Dacă există prea multe trăsături (grad polinomial mare), ipoteza astfel învățată s-ar potrivi foarte bine setului de date de antrenare ( ), dar nu va putea generaliza pentru noile exemple de variabile de intrare.
Problema overfitting-ului s-ar putea rezolva dacă :
S-ar diminua numărul trăsăturilor, alegându-le pe cele mai importante manual sau folosind un algoritm de selecție al lor.
Prin regularizare: se păstrează toate trăsăturile, dar se reduce valoarea parametrului .
Așadar, algoritmul funcționează bine atunci când există multe trăsături, fiecare dintre ele având o contribuție la predicția ieșirii y, dar și când micșorăm parametrii , pentru că se obține o funcție a ipotezei mai simplă și o predispunere la overfitting mai mică.
Se adaugă un termen de regularizare la formula funcției de cost, unde este parametrul de regularizare ce controlează gradul de micșorare a parametrilor , păstrând proprietatea funcției de cost de a modela setul de date:
Se obține o curbă mai netedă cu inflexiuni mai line, care să se potrivească la fel de bine setului de date.
Dacă alegem prea mare, rezultatul va fi fenomenul de underfitting, iar ipoteza va lua forma unei drepte paralele cu OX.
Până acum, au fost prezentate regresia liniară și logistică, ajungând la concluzia că putem avea rezultate bune, mai ales dacă folosim regularizarea. Ne punem intrebarea: de ce mai avem nevoie de rețele neuronale? Pentru a înțelege importanța lor, se va oferi un exemplu comun de computer vision. De exemplu, se dorește analiza unei imagini folosind ML și trebuie luată decizia dacă imaginea conține sau nu o mașină. Când ochiul uman se uită la imagine, creierul poate depista cu ușurință și să ia decizia imagine cu mașină/ imagine fără mașină. Însă computerul vede o grilă cu intensitățile pixelilor pentru fiecare bloc din imagine, ca în figura Fig.3.3:
Figura 2.13. Percepția pixelilor [26]
Așadar, problema de computer vision se rezumă la a analiza valorile acestor pixeli și la a lua decizia corectă. Concret, pentru a face acest lucru posibil, se folosește ML adunând mai multe imagini, culegând astfel setul de date de antrenare (imagini cu mașini și fără masini), apoi aplicând algoritmului un clasificator pentru datele de antrenare. După ce a fost realizată antrenarea rețelei, se testează algoritmul cu o nouă imagine și se ia decizia în funcție de pragul de decizie stabilit în etapa de antrenare.
Cum se ia decizia? Alegând două valori de pixeli diferiți din fiecare imagine de antrenare și alcătuind setul de date prezentat în figura de mai jos. Similar se procedează și pentru imaginile ce nu conțin mașini.
Figura 2.14. Alcătuirea clusterilor pentru variabilele de intrare pixel1 și pixel2 [26]
După ce se mapează ambele seturi de date, avem nevoie de o functie neliniară, care să separe cele două seturi din spațiul trăsăturilor. Dacă avem imagini în nuanțe de gri cu dimensiuni relativ mici, de 50×50 pixeli, atunci numărul de trăsături ar fi (pentru imagini color, ). Calculând toate trăsăturile , am avea de prelucrat un număr al lor de 3 milioane pentru un singur exemplu de antrenare. Pentru o singură imagine, acest procedeu este foarte costisitor. Așadar, regresia logistică ca și model aplicat, în acest caz nu e o soluție potrivită din cauza complexității avansate. De aceea avem nevoie de rețelele neuronale [21].
Figura 2.15. Clasificarea imaginilor [26]
3. REȚELE NEURONALE
Caracteristicile rețelelor neuronale
Rețelele neuronale artificiale reprezintă ansambluri de elemente de procesare simple (de regulă, adaptive), puternic interconectate și operând în paralel, care urmăresc să interacționeze cu mediul înconjurător într-un mod asemănător creierelor biologice.
Următoarele aspecte sunt comune atât rețelelor neuronale artificiale cât și celor biologice:
– reprezentarea și procesarea informației în forma analogică (care permite desfășurarea în paralel a mai multor procese în mod asincron);
– abilitatea de a efectua operațiuni de natură statistică asupra datelor de lucru (operațiuni de mediere, de regulă condiționată);
– corecție de erori și degradare graduală a performanțelor la apariția acestora;
– capacitate de adaptare la un mediu în continuă schimbare.
Rețelele neuronale artificiale s-au impus ca instrumente puternice de analiză a unor volume mari de date experimentale, generate de procese fizice ghidate de legi necunoscute, pentru care aceste sisteme pot oferi modele adecvate. Această tehnologie nu își propune ca obiectiv principal obținerea unor circuite motivate anatomic, ci funcțional, astfel încât să beneficiem de metode de procesare eficiente complementare celor tradiționale, disponibile sub formă de algoritmi de calcul și componente hard și soft.
De altfel, o rețea neurală reprezintă un sistem de procesare paralel care deține o capacitate naturală de a acumula experiență și de a o folosi. Se aseamănă cu creierul natural sub două aspecte:
1. Cunoștințele sunt dobândite în urma unui proces de învățare.
2. Cunoștințele sunt stocate în valorile interconexiunilor dintre neuroni (denumite ponderi, sau sinapse).
Interesul pentru sinteza unor rețele neuronale artificiale este motivat de performanțele creierelor naturale, care oferă dovada concretă că modul de calcul paralel dublat de toleranța la erori este nu numai posibil, dar și rapid și eficient. Astfel, din punct de vedere ingineresc, neurobiologia poate fi privită ca o “pepinieră” de idei noi, posibil de utilizat pentru rezolvarea unor probleme prea complicate pentru metodele tradiționale. Un exemplu concret de întrepătrundere a abordării strict tehnice cu cea biologică îl constituie implementarea așa-numitelor circuite integrate “neuromorfice”, bazate pe modelele retinei sau ale urechii interne.
Modelul neuronului
Un neuron are un set de intrări , unde indicele ia valori de la 1 la , indicând sursa semnalului de intrare. Fiecare intrare este ponderată prin intermediul unor ponderi sinaptice, înainte de a intra în corpul principal al elementului de procesare. Această pondere se notează cu , astfel că, o intrare a neuronului va fi multiplicată cu ponderea . Dacă , atunci ponderea se numește pondere excitatoare, iar dacă , ponderea se numește inhibatoare.
Figura 3.1. Neuronul [26]
Figura 3.2. Schema de principiu a unei rețele formată dintr-un singur neuron [25]
Funcția de transfer a modelului de bază este descrisă de relația:
iar condiția de activare este:
unde indexul i reprezintă neuronul în discuție iar j reprezintă intrările de la alți neuroni.
Acest model a fost prezentat în 1943 de către Warren McCulloch și Pitts. Este modelul unui singur neuron idealizat. Este un model foarte simplu, fără învățare și fără adaptare și s-a constituit blocul de bază pentru celelalte modele elaborate ulterior.
Fiecare intrare primește un stimul care este ponderat (înmulțit) cu o valoare . Toate intrările ponderate sunt sumate, și, dacă această sumă egalizează o valoare de activare (), este generat un răspuns, prin intermediul unei funcții neliniare h. Ieșirea este exprimată prin:
În acest model termenii și ponderile sunt considerate ca ajunse la valoarea lor finală. Dacă ponderile sunt constante, atunci faza de învățare a luat sfârșit.
Figura 3.3. Modelul neuronului – unitatea logistică [26]
În plus, un neuron are un prag de activare (sau de excitare) precum și o valoare de prag care trebuie atinsă sau depășită pentru ca neuronul să producă semnal. De asemenea, neuronul are o funcție de activare (ipoteza) și un semnal de ieșire (ieșirea funcției neliniare ). Semnalul de ieșire constituie intrarea către un alt neuron.
În imaginea de mai sus, sunt prezente trei variabile de intrare din vectorul , plus valoarea bias-ului . Vectorul este vectorul de ponderi, iar funcția este funcția sigmoid specifică regresiei logistice ṣi egală cu valoarea de mai jos:
unde z=
Drept exemplu se poate considera un neuron care poate calcula funcția logistică SAU, având în vedere că :
Figura 3.4. Funcția SAU [26]
Atunci când un neuron face parte dintr-o rețea neuronală, el este referit ca un nod. Pentru noduri într-o rețea, în descriere se va introduce un nou indice , necesar pentru a distinge un neuron. Intrările, ponderile, pragurile de activare, funcția neliniară, etc.
Rețelele neuronale artificiale sunt constituite din numeroși neuroni artificiali interconectați între ei. Neuronii constituenți sunt de obicei organizați în mulțimi distincte numite straturi (layers). Există cazuri de rețele neuronale particulare, având o topologie specială, când neuronii nu sunt organizați pe straturi bine definite, ci pe anumite submulțimi.
Reprezentarea unei rețele neuronale
O rețea neuronală clasică constă dintr-o secvență de straturi de neuroni, cu conexiuni totale sau aleatore între neuronii conținuți în straturi succesive. Întotdeauna vom avea pentru o rețea neuronală, cel puțin două straturi de neuroni, ce au rolul de a comunica cu mediul exterior:
– un strat de intrare : care are rolul de a prelua datele de intrare cu termen bias = ± 1, sau fără termen bias. Vectorul sau va fi numit vector de intrare al rețelei neuronale.
– un strat de ieșire: unde se obțin rezultatele , furnizate de rețeaua neuronală, ca răspuns la vectorul de intrare prezentat la stratul de intrare și al propagării acestor date de la stratul de intrare către stratul de ieșire. Vectorul se numește vector de ieșire al rețelei neuronale.
Toate celelalte straturi ale rețelei neuronale, dacă există, diferite de stratul de intrare și de stratul de ieșire vor fi denumite straturi ascunse (hidden layers), după cum se poate observa în figura de mai jos:
Figura 3.5. Reprezentarea unei rețele neuronale [26]
Vom considera în cele ce urmează rețele neuronale directe (feed-forward), la care propagarea informațiilor se face de la stratul de intrare către stratul de ieșire, fără a exista conexiuni între neuroni dintr-un același strat sau către neuronii situați într-un strat predecesor.
Rețelele neuronale care conțin legături sinaptice între neuroni conținuți în același strat sau între neuronii unui strat oarecare și neuronii unui strat predecesor se numesc rețele neuronale recurente (feedback). Iar pentru a fi posibilă crearea legăturilor multiple între neuroni, avem nevoie de mai multe ieṣiri.
Figura 3.6. Reprezentarea unei rețele neuronale cu ieșiri multiple [26]
Algoritmul de învățare
Pentru a putea implementa o problemă folosind calculul neuronal, respectiv pentru a construi o rețea neuronală relativ la acea problemă, vom avea de parcurs două etape principale:
a) Învățare(Antrenare).
b) Generalizare.
Reprezintă procesul de modificare a tăriilor sinaptice ca răspuns la vectorul de intrare prezentat la stratul de intrare al rețelei neuronale (uneori și a vectorului țintă prezentat la stratul de ieșire al rețelei neuronale), în scopul configurării rețelei neuronale pentru a executa acțiunea dorită.mModificarea tăriilor sinaptice în procesul de învățare se poate efectua în două moduri: supervizat și nesupervizat.
Învățare supervizată
Modificarea tăriilor sinaptice este făcută pe baza comparației dintre vectorul de ieșire obținut la stratul de ieșire și vectorul țintă, ce reprezintă rezultatul dorit a se obține la stratul de ieșire, când la stratul de intrare s-a prezentat vectorul de intrare , din mulțimea de antrenament. Vectorul țintă este furnizat de un profesor (antrenor), de unde și denumirea de învățare supervizată. Învățarea supervizată presupune prezentarea de către un antrenor a unor perechi de datede formă, ce alcătuiesc o mulțime de date, numită mulțime de antrenament. Diferența dintre răspunsul obținut , și răspunsul dorit este folosită pentru a modifica tăriile sinaptice, pe baza unui algoritm specific, numit lege de învățare.
Un caz particular al învățării supervizate îl reprezintă învățarea întărită (reinforcement), unde un profesor semnalează doar faptul dacă răspunsul generat de rețeaua neuronală este corect sau nu, fără să știm care este mărimea rețelei.
Învățare nesupervizată
Sunt situații când nu putem defini scopul procesului de învățare sub forma unor rezultate dorite sau a unor rezultate corecte. Singura informație disponibilă constă din modul de corelare a datelor de intrare. Scopul acestui tip de învățare este ca rețeaua neuronală să creeze categorii din aceste corelații, producând date de ieșire corespunzătoare categoriei datei de intrare.
Figura 3.7. Reprezentarea unei rețele neuronale cu mai multe ieșiri [13]
Dacă pentru învățarea supervizată, setul de date de antrenare era format din și presupunea găsirea lui cu ajutorul unui prag de decizie pentru a separa exemplele, învățarea nesupervizată este diferită. Acest tip de învățare are ca set de date de antrenare : {}, date care nu sunt împărțite pe categorii (label-uri). Așadar, se oferă algoritmului niște date la întâmplare (random), fără să se cunoască tipul lor sau ce anume reprezintă exact, și se așteaptă ca acesta să găsească o structură a lor, să le clusterizeze. Cel mai folosit tip de unsupervised learning este algoritmul de clustering, în practică fiind des întâlnit în segmentarea pieței economice, în analiza rețelelor de socializare, organizarea clusterilor în computing sau pentru înțelegerea datelor astronomice.
Algoritmul K –means
K – means este un algoritm popular ce ajută la împărțirea datelor de antrenare în clusteri într-un mod coerent. Având un set de date neetichetat și dorindu-se împărțirea lui, primul pas este găsirea a 2 puncte numite centroizii clusterilor setului de date, care să caracterizeze cât mai bine celelalte puncte din fiecare cluster. Se plimbă prin setul de date, alegând acele valori care sunt foarte apropiate, astfel încât dispersia lor să fie cât mai mică. Se va muta poziția centroizilor până când se pot alege numărul de cluster doriți sau potriviți setului de date.
Pe scurt, la intrarea algoritmului o să fie considerat numărul de clusteri, k, și setul de antrenare {}, unde , . Se inițializează random centroizii celor k clustere , după care se repetă pentru fiecare exemplu. Apoi se setează câte o variabilă drept indexul centroidului cel mai apropiat de [22].
Deoarece baza de date de semnături este etichetată, cunoaștem tipul de trăsături și sunt împărțite pe categorii, în această lucrare nu se va folosi metoda nesupervizată.
Generalizarea
După ce rețeaua neuronală a fost învățată pe baza unui număr suficient de exemple, ea va fi capabilă să inducă o relație completă de interpolare sau extrapolare a exemplelor învățate.
Generalizarea reprezintă faza de răspuns a rețelei neuronale, când prezentându-i-se vectori de intrare noi sau din mulțimea de antrenament, vectorul de ieșire va fi cel așteptat, cu o posibilă eroare foarte mică. Calitatea răspunsurilor în faza de generalizare reprezintă țelul fazei de învățare – trebuie sa învățăm rețeaua neuronală până când va generaliza suficient de bine.
Backpropagation – predicția retrogradă
Atunci când vorbim despre clasificarea rețelelor pentru un set de date de antrenare cu valori de intrare, , unde este numărul de nivele (layers), iar reprezintă numărul de unități al unui layer, fără a lua în considerare bias-ul.
Clasificarea binară presupune că avem o singură unitate de ieșire, (sau ), iar și Pentru clasificarea multiclasă avem n ieșiri, precum în figura Fig.3.8. de mai sus, iar vectorul și
Se recomandă clasificarea multiclasă pentru
Pentru regresia logistică, funcția de cost avea forma:
Pentru rețele neuronale se va generaliza relatia de mai sus , ajungându-se la forma:
Minimizarea funcției de cost presupune calculul , dar și calcul derivatei parțiale .
Pentru un sigur set de exemple, se va folosi predicția antegradă (foreward propagation):
unde si sunt activarile pentru bias.
Figura 3.8. Reprezentarea activărilor unei rețele neuronale [26]
Pentru calculul derivatelor parțiale se va folosi predicția retrogradă (algoritmul backpropagation), deoarece se vor calcula erorile în sens invers, de la ultimul layer până la primul. Eroarea de activare a nodului în layer-ul se va numi . Așadar, pentru același exemplu de mai sus, unde aveam erorile vor fi egale cu:
unde și
Se observa ca nu avem , pentru că primul layer nu conține decât exemplele de antrenare și trăsăturile lor, deci nu există o eroare ce trebuie calculată.
Cu alte cuvinte, am calculat , derivata parțială a funcției de cost, care este egală cu:
Mai exact, predicția retrogradă anulează termenul din formula funcției de cost [26].
Pașii pentru antrenarea rețelei
Inițializarea ponderilor ;
Se implementează predictia antegradă pentru a obține pentru fiecare ;
Se implementează codul pentru calculul funcției de cost cu ajutorul formulei :
Pentru a calcula derivatele parțiale se va folosi algoritmul predicției retrograde.
Se folosește gradient descent pentru a compara derivata parțială calculată cu valoarea numerică de asemenea calculată pentru funcția de cost. Apoi, se caută minimul funcției de cost cu parametri vectoriali [26].
APLICAȚIA PRACTICĂ
Algoritmi folosiți anterior
Autentificarea unui subiect într-un sistem oarecare pe bază de semnătură e posibilă dacă semnătura dată la intrarea sistemului este extrem de similară cu semnătura din baza de date a persoanelor autorizate. Ideea de bază este să găsim soluția optimă pentru a calcula și găsi similaritatea dintre cele două semnături, cu grad mare de precizie și într-un timp cât mai scurt.
Până în prezent, s-au oferit ca soluții calcule de distanțe între invarianții acestor semnături, mărimi extrase din semnalele de accelerație preluate de senzorii MEMS A/B și din semnalele captate de senzorul optic ONS. Aceste șiruri de invarianți vor fi comparate, cu ajutorul unor algoritmi de comparare a două șiruri, cu semnătura dată pentru autentificare. Răspunsul sistemului biometric va fi rezultatul unor metode de combinare a rezultatelor obținute de la algorimtii de comparare.
Au fost propuși algoritmi precum Levenshtein [12], care presupune următorii pași:
se definesc una sau mai multe componenete (combinații între unul sau mai multe semnale captate de pixul electronic- ca în figura 4.1).
se extrage câte un șir de invarianți – pentru fiecare componentă – prin codificarea semnalului conform unui alfabet de invarianți (cu 3 sau 9 simboli).
Extragerea invarianților se realizează doar asupra informației utile extrase din semnalele primare (AX1, AX2, AY1, AY2, ONSX, ONSY) sau din combinații ale acestora. Extragerea informației utile se realizează filtrând trece bandă semnalele primare achiziționate de la pix.
Figura 4.1. Semnalele AX1, AX2, AY1,AY2, ONSX, ONSY
se obțin șirurile de invarianți, pentru fiecare componentă, în cadrul modulului SRA (Signature Recognition Algorithm):
Figura 4.2. Componentele semnăturilor
4. se calculează similaritatea dintre șirurile de invarianți pentru fiecare componentă în parte utilizând algoritmul Levenshtein cu costuri unitare în urma căruia va rezulta o distanță intermediară, numită distanța Levenshtein.
în final, se vor combina distanțele intermediare obținute (de exemplu prin mediere) rezultând o distanță D ce reprezintă gradul de similarite între semnătura S1 și S2.
Suntem interesați să aflăm cât de asemănătoare sunt cele două șiruri, sau, altfel spus, cât de mare este distanța între cele două șiruri. Vom avea nevoie de extensiile de cod, calculate pe baza șirurilor de invarianți cu ajutorul unui alphabet de simboluri. Acest calcul se face pentru fiecare componentă în parte.
Folosind algoritmul Levenshtein, supunem sistemul de autentificare la un efort sporit de calcul computațional. De asemenea, nu oferă flexibilitatea de a spune cu siguranțăă două semnături aparțin sau nu aceluiași utilizator, trebuie setat un prag. Dezavantajul major îl reprezintă timpul mare acordat testării algoritmului pe o bază de date mai mare.
Folosirea rețelei neuronale
În lucrarea de față, am folosit Perceptronul Multistrat (abreviat MLP în limba engleză), o alternativă constituită din mai multe elemente neliniare (neuroni), cunoscută și des utilizată.
Tehnica de învățare folosită este învățarea supervizată, deoarece am avut la dispoziție un set de antrenare ce conține date de intrare etichetate (componente alcătuite din semnalele date de pixul electronic) și răspunsuri corecte (utilizatorii autorizați la accesul în sistemul de autentificare). Toate bazele de date de semnături au fost oferite de către Softwin Group [10].
Baza de date de antrenare pentru semnăturile originale este formată din:
7 semnături prelevate de la fiecare utilizator;
numărul utilizatorilor este egal cu 29, așadar sunt 203 de semnături antrenate;
fiecare semnatură are ca parametri (trăsături) cele 13 componente;
fiecare componentă este formată cu ajutorul invarianților extrași din semnătură, ca în Fig.4.2.
un invariant conține informație utilă extrasă din semnalele primare (AX1, AX2, AY1, AY2, ONSX, ONSY) sau din combinații ale acestora.
Baza de testare pentru semnăturile originale este formată din:
restul de câte 3 semnături prelevate de la fiecare utilizator;
numărul utilizatorilor este egal cu 29, așadar sunt 87 de semnături originale testate;
Algoritmul pentru antrenarea și testarea recunoașterii semnăturilor este realizat în SignatureRecognition.m (vezi Anexa 1).
Baza de date pentru semnaturile imitate – rețeaua nu a fost antrenată pentru această bază de date, ci doar testată. Ea conține:
câte 10 semnături pentru 21 de utilizatori, adică 210 semnături imitate testate cu algoritmul falseAcceptance.m (vezi Anexa 2).
Vom urmări o optimizare a arhitecturii neuronale, deci o alegere a numărului optim de unități neuronale și parametri antrenabili pentru care se obține cea mai bună performanță. Deși la prima vedere, creșterea nelimitată a numărului de neuroni ar trebui să conducă la creșterea monotonă a performanțelor, în realitate, lucrurile nu stau deloc așa. Aceasta deoarece în cazul nostru ne interesează performanțele de generalizare a rețelei și nu cele de memorizare. Dacă numărul de parametri antrenabili este prea mic, rețeaua nu este capabilă să extragă esențialul din datele furnizate pe parcursul antrenării. Dacă acesta este prea mare, rețeaua se transformă într-un memorizator al datelor prezentate în timpul antrenării și pierde în performanța de generalizare.
Arhitectura perceptronului multistrat este prezentată în figura 4.3: elementele de intrare (semnăturile), construite prin concatenarea celor 13 componente ale semnăturii, stratul ascuns, și stratul de ieșire, definit prin aceea că ieșirile neuronilor de pe acest strat sunt totodată și ieșiri ale rețelei. Perceptronii multistrat au ca și element caracteristic existența a unul sau mai multe straturi ascunse. În cazul nostru, am folosit un singur strat ascuns. Această denumire provine din lipsa accesabilității la ieșirile neuronilor de pe acest start.
Din acest motiv, pentru acești neuroni nu se poate calcula direct o eroare locală, și de aici dificultatea de a aplica direct mecanismele de antrenare bazate pe descreșterea gradientului, mecanisme ce s-au dovedit eficiente în cazul perceptronilor (dispozitive adaptive liniare), dispozitivele liniare adaptive fiind dispozitive cu un singur strat, și anume stratul de ieșire.
Figura 4.3. Arhitectura rețelei pentru baza de antrenare
Inovația fundamentală introdusă de algoritmul BKP [25] – propagarea inversă a erorii, este aceea că se asociază o eroare locală fiecarui neuron de pe stratul ascuns și se oferă o modalitate de calcul a acestei erori prin propagarea inversă a informației de eroare dinspre stratul de ieșire spre cel de intrare.
Odată cunoscută eroarea la nivelul fiecarui neuron, regăsim situația perceptronului cu un singur strat, antrenarea (actualizarea ponderilor) rezultând prin aplicarea principiului gradientului descrescător.
În cazul perceptronilor multistrat, suprafața erorii prezintă minime locale multiple, deci convergența către soluția optimă nu este garantată (spre deosebire de cazul perceptronului simplu). Convergența către un minim local sau altul este determinată de poziția vectorului pondere global, și din acest motiv, pentru a nimeri minimul global, se efectuează mai multe încercări de antrenare (vezi Tabelul.4.1).
Tehnica de antrenare folosită este asemănătoare cu cea pentru a găsi dreapta care aproximează cel mai bine o mulțime dată de puncte – problema regresiei (vezi Cap. 2.5. Regresia liniară și regresia logistică). Această tehnică este o generalizare a metodei minimizarea erorii patratice (MEP).
Algoritmul de propagare înapoi cere ca funcțiile de răspuns să fie derivabile. Deci, se poate folosi funcția sigmoidală, spre deosebire de funcția treaptă sau funcția liniară folosită în cazul perceptronului simplu. O funcție de răspuns (ipoteza ) liniară definește un neuron de ieșire liniar.
Alegerea unei valori adecvate pentru rata de antrenare, , are un efect semnificativ asupra performanțelor rețelei. În mod obisnuit, se consideră , dar este posibil ca acest interval să fie prea larg. De regulă, alegând pentru o valoare mai mică, de exemplu în intervalul [0,05 0,25] se asigură obținerea unei soluții, deși rețeaua va necesita pentru antrenare un număr mare de iterații.
Am urmărit modificarea parametrului de învățare în sensul creșterii acestuia pe măsura ce eroarea rețelei descrește în timpul învățării. Aceasta conduce, în general, la creșterea vitezei de convergență. Însă, am constatat că există riscul ca rețeaua să sară prea departe de valoarea de minim reală a funcției de cost, pentru inadecvat de mare. Pentru a evita acest lucru am folosit tehnica regularizării funcției de cost. Aceasta presupune adăugarea unui termen de regularizare, , pentru corecția ponderilor. El este proporțional cu precedenta modificare a ponderii și determină ca aceasta variație să se facă în aceeiași direcție cu cea a corecției precedente.
S-a observat că rețeaua tinde să urmeze fundul “văilor” în loc să treacă rapid dintr-o parte în alta a acestora. Astfel, metoda regularizării permite o tratare corectă a variațiilor bruște ale suprafeței eroare. Ar fi fost necesar să se facă pași foarte mici, ceea ce determină un progres lent al instruirii, dar adăugarea unui termen suplimentar în regula de corecție permite ca pașii efectivi ai modificării vectorilor ponderi să fie mai mari, fără să depășească punctele de minim.
Am ales rata de învățare egală cu 0,1 astfel încât să nu provoace oscilații.
Procesul de antrenare se oprește când rețeaua atinge un minim local sau un minim global al funcției de cost. Dacă se ajunge la un minim local, e posibil ca eroarea asociată ieșirilor să fie nepermis de mare. Această problemă s-ar fi rezolvat schimbând rata de învățare, a ponderilor inițiale sau a numărului de unități ascunse.
Am întâmpinat această problemă, deoarece vectorii de intrare nu au fost formați corect, calculând niște ponderi ce duceau la rezultate slabe (recunoașterea semnăturilor era realizată corect doar în proporție de 50%).
Intrările rețelei au fost construite inițial pentru antrenare în felul următor:
am construit câte o matrice pentru fiecare componentă, în total fiind 13 componente, au rezultat 13 matrici;
matrice avea pe linie șirul de invarianți ai fiecărei semnături, în total fiind 203 de semnături antrenate;
deoarece șirurile de invarianți nu au avut lungimi egale, am bordat matricile cu zerouri, lucru ce a condus la performanțele relativ slabe ale rețelei.
Așadar, construirea matricilor de intrare nefiind potrivită rețelei noastre, ponderile au fost calculate în faza de antrenare, rezultând la testare o recunoaștere slabă, de 50% din cele 87 de semnături.
Pentru ca matricea de intrare să fie construită, aveam nevoie de vectori de lungime egală. După cum am explicat, bordarea cu zerouri nu a fost soluția potrivită, așa că am construit pentru fiecare componentă a unei semnături o histogramă, cu bini începând de la 0 la 38.
Am „concentrat” astfel valorile unor șiruri de lungimi variabile în histograme de marimi identice pentru fiecare componentă în parte. Apoi am concatenat cele 13 histograme corespunzătoare celor 13 componente pe o singură linie a matricei de intrare. Având câte o semnătură pe linie, matricea noastră de intrare va conține 203 linii la antrenare, și 87 de linii la testare.
O reprezentare a histogramei unei semnaturi cu cele 13 componente pe linii (neconcatenate) este prezentată în Fig.4.4:
Figura 4.4. Reprezentarea histogramei unei semnături
Fiecare valoare e reprezentată de o culoare. Valoarea minimă are atribuită culoarea albastru închis. Iar pe măsură ce ea crește, ajunge la o valoare maximă reprezentată prin roșu închis.
Rezultatele obținute
Pentru baza de date de antrenare a semnăturilor originale menționată mai sus, la testare s-au obținut următoarele rezultate, în funcție de adăugarea mai multor subiecți rețelei neuronale:
Tabelul 4.1. Rezultatele rețelei neuronale
Se poate observa că pentru o bază de date de 290 de semnături originale, rețeaua a putut autentifica 88,5 % dintre utilizatorii autorizați, ceea ce înseamnă că raportul dintre numărul de semnături originale respinse incorect de către sistem ca fiind imitații și numărul total de semnături originiale folosite, FRR este egal cu 11,5%.
Graficul valorilor din Tabel.4.1 este :
Figura 4.5. Comportamentul rețelei la mărirea bazei de semnături
Am testat și tehnica Cross Validation prezentată, tehnică ce presupune modificarea dimensiunii setului de antrenare și al celui de testare. Inițial am antrenat rețeaua cu primele 7 semnături de la fiecare utilizator și am testat-o cu restul de 3 semnături. Schimbând acest interval al numărului de semnături, de exemplu testez cu primele 2 semnături și antrenez cu restul de 8 semnături ale fiecarui utilizator, am observat că pentru cele 290 de semnături rețeaua poate oferi rezultate mai bune decât cele inițiale (FRR=3.5% în loc de 11,5%).
Dacă fiecare utilizator are înregistrate în baza de date câte 10 semnături, , atunci putem observa îmbunătățirea preciziei:
Tabelul 4.2. Rezultate Cross Validation
Găsirea similarităților dintre semnături se poate face foarte ușor și rapid, folosind interfața grafică RecunoastereaSemnaturiiGUI.m (vezi Anexa 5). Se pot adăuga subiecți în baza de date oricând, fiind totuși necesară antrenarea bazei de date nou adăugate.
Figura 4.6. Interfața grafică în cazul unui utilizator acceptat de sistem
În Fig.4.6, se poate observa cazul în care un utilizator este autentificat cu succes în cadrul rețelei neuronale artificiale; histogramele semnăturii prezintă valori extrem de apropiate. Selectarea semnăturii care vrea să se testeze se poate realiza foarte ușor din casetele ce conțin semnăturile originale sau imitațiile, iar răspunsul apare instantaneu. Avantajul major al acestei rețele este rapiditatea, ușurința în folosire și precizia foarte bună a recunoașterii semnăturilor.
În figura 4.7 este prezentat cazul unei semnături respinse de sistem (autentificare nereușită), în stînga fiind semnătura aleasă, iar în dreapta semnătura care se apropie cel mai mult de pattern-ul semnăturii testate. De asemenea, se poate observa faptul că cele două histograme nu corespund.
Figura 4.7. Interfața grafică în cazul unui utilizator respins de sistem
Pentru baza de date de semnături imitate (210 semnături), rețeaua a putut detecta corect falsificatorii în procent de 93,81%, ceea ce înseamnă că raportul dintre numărul de imitații acceptate incorect de către sistem ca fiind originale și numărul total de imitații folosite, FAR este egal cu 6.19%.
Cu cât avem mai multe trăsături ale semnăturilor, adică mai multe componente ale semnăturilor în procesul de recunoaștere, cu atât rețeaua este mai performantă. Tabelul 4.3 de mai jos demostrează acest lucru:
Tabelul 4.3. Recunoașterea semnăturilor crescând numărul de parametri
Concluzii
Semnătura olografă reprezintă, așadar, un instrument biometric capabil de a individualiza fiecare utilizator al unui sistem de autentificare. Am evidențiat faptul că parametri extrași din mărimile dinamice achiziționate cu ajutorul pixului electronic pot face fiecare semnătură imposibil de imitat. Pentru a se recunoaște autorul semnăturii, rețelele neuronale s-au dovedit a fi foarte folositoare, autentificarea fiind realizată cu o precizie destul de ridicată pentru baza de semnături achiziționată și folosită.
Pentru a obține rezultate mai bune, contează foarte mult ce trasături, adică ce parametri ai semnăturilor folosim. Acești parametri depind de calitatea prelevării semnalelor cu pixul electronic, dacă metoda de achiziție a fost realizată corect. Dacă se dorește îmbunătățirea performanțelor rețelei, ar trebui adaugate mai multe componente ale semnăturii, considerând rezultatele obținute.
De asemenea, se poate obseva următorul lucru: cu cât baza de date se marește, performanțele rețelei scad. Trebuie îmbunătățită topologia rețelei adaugând alte straturi ascunse, adică mai multe noduri de rețea, și implicit o ecuație de grad polinomial mai mare a dreptei de regresie, cea cu care luăm decizia.
Așadar, pe măsură ce baza de date de semnături se va mări, va trebui implementată o topologie a rețelei neuronale care să poată caracteriza cât mai bine setul nou de date, astfel încât să ajungă la un rezultat bun pentru numărul actual de utilizatori, chiar dacă pentru mai puțini useri rezultatele ar fi mai slabe. Cu alte cuvinte, trebuie proiectată o rețea care să corespundă cerințelor și nevoilor impuse de sistemul celui care il deține. Pentru o bază de date de aproximativ 300 de semnături, rezultatele sunt bune.
Dacă folosim și tehnica Cross Validation, rezultatele sunt chiar foarte bune. Ulterior, dacă se dorește folosirea rețelelor neuronale pentru o bază de date a sute de subiecți, se poate implementa o rețea cu mai multe staturi ascunse, se poate înlocui metoda gradientului cu o metodă aleatoare de optimizare, pe baza unor strategii de evoluție (Evolution Strategies sau Simulated Annealing), se pot adauga mai mulți parametri semnăturilor olografe (adică se poate crește numărul de componente >13) sau se pot preleva mai mult de 10 semnături de la fiecare utilizator, pentru a stabili un pattern cât mai individual.
Bibliografie
[1] PRIME Faraday Partnership Wolfson School of Mechanical and Manufacturing Engineering Loughborough University, "An Introduction to MEMS", Loughborough, Leics LE11 3TU, Cap.2.Micro-electromechanical Systems, pg.1-16, 2002.
[2] CERN Courier, The first capacitative touch screens at CERN, 2010.
[3] Sargur N. Srihari, "Computational Methods for Handwritten Questioned Document Examination", Cap2.2.Methods, pg. 7-14, 2010.
[4] James P. Holmes, Larry J. Wright, Russell L. Maxwell "A performance Evaluation of Biometric Identification Devices", Scandia National Laboratories, 1991.
[5] Louka Dlagnekov, Serge Belongie, "Recognizing Cars", Department of Computer Science and Engineering University of California, San Diego, 2006.
[6] S.Srihari. K. M. Kalera. and A. XU, "Offline Signature Verification and Identification Using Distance Statistics", International Journal of Pattern Recognition And Artificial Intelligence ,vol. 18, no. 7, pp. 1339–1360, 2004.
[7] Prashanth CR,KB Raja,KR Venugopal, LM Patnaik, "Standard Scores Correlation based Offline signature verification system", International Conference on advances in computing, control and telecommunication Technologies, 2009.
[8] Rafael C. Gonzalez, Richard E. Woods, "Digital Image Processing", Pearson Education, Inc., 2008.
[9] H. Gamboa*, A. L. N. Fred, A. K. Jain, "Webbiometrics: User Verification Via Web Interaction", 2009.
[10] Șt. Diaconescu, A. Dinescu, "Tehnologii biometrice. Partea a II-a – Recunoașterea semnăturii dinamice", Editura Politehnica Press, București, 2013.
[11] Dit-Yan Yeung, Hong Chang, Yimin Xiong, Susan George, Ramanujan Kashi, Takashi Matsumoto, Gerhard Rigoll, "SVC2004" First International Signature Verification Competition, 2004.
[12] Șt. Diaconescu, A. Dinescu, "Tehnologii biometrice. Recunoașterea semnăturii dinamice", Îndrumar de laborator, Editura Politehnica Press, București, 2013.
[13] Richard Socher, Cliff Lin, Andrew Y. Ng, Christopher Manning, "Proceedings of the Twenty-Eighth International Conference on Machine Learning", 2011.
[14] Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton, "ImageNet Classification with Deep Convolutional Neural Networks", 2012.
[15] [Interactiv][Citat 15 08 2014] http://blog.eyewire.org/eyewires-first-scientific-discovery-and-nature-paper/
[16] Helga Kolb, Ralph Nelson, Eduardo Fernandez, Bryan Jones, Webvision, "The Organization of the Retina and Visual System", 2013.
[17] Leon Bottou, "Stochastic Gradient Descent Tricks", Microsoft Research, Redmond, WA, 2012.
[18] Lucrarea nr. 10, "Regresia logistică", SPSS, Universitatea Alexandru Ioan Cuza din Iași, 2010.
[19] Cosma Shalizi, "Advanced Data Analysis from an Elementary Point of View", Cap12.Logistic Regresion, 2012.
[20] Nicoleta Liviana Tudor, "Procesarea Semnalelor în Rețele Neuronale Liniare", Universitatea de Petrol-Gaze Ploiești, 2011.
[21] Louka Dlagnekov, Serge Belongie, "Recognizing Cars", Department of Computer Science and Engineering University of California, San Diego, 2006.
[22] Adam Coates and Andrew Y. Ng, "Neural Networks: Tricks of the Trade", Reloaded, Springer LNCS, 2012.
[23] Quoc V. Le, Marc'Aurelio Ranzato, Rajat Monga, Matthieu Devin, Kai Chen, Greg S. Corrado, Jeffrey Dean and Andrew Y. Ng, "Proceedings of the Twenty-Ninth International Conference on Machine Learning", 2012.
[24] [Interactiv][Citat 27 07 2014] http://www.epa.gov/cdx/cromerrr/propose/biometric_dmr-rpt.pdf),%E2%80%9D
[25] Radu Dogaru, Ovidiu Grigore, "Sisteme Neurale și Logica Fuzzy", 2009.
[26] [Interactiv][Citat 18 08 2014] https://class.coursera.org/ml-006/lecture
Anexa 1 – Funcția de antrenare și testare a rețelei neuronale
close all
clear all
[NUMERIC,TXT,RAW]=xlsread('sra1_invariants.csv');
%incarc lista de semnaturi
[NUMERIC2,TXT2,RAW2]=xlsread('lista_semnaturi.csv');
componenta=[];
countComponent=0;
countPixName=0;
pragAntrenare=7;
countPix=0;
countPixAntrenare=0;
countPixTestare=0;
y=1;
yantrenare=[];
ytestare=[];
componentaAntrenare = [];
componentaTestare = [];
filename=[];
histogramaComponente=[];
vect=[];ybackup=[];ybackupID=[];
mkdir([pwd '\histogramaComponente' '\' num2str(y)])
mkdir([pwd '\componente' '\' num2str(y)])
mkdir([pwd '\pozecomponente' '\' num2str(y)])
%generez vector cu extensiile pixurilor
for i=2:length(RAW2)
vect=[vect RAW2{i,1}];
end
for i=1:length(TXT)
if mod(i,28)~=0 % excludem liniile cu spatiu din 28 in 28
if (strcmp(TXT{i,1}(1:8),'Filename')==1)
countPixName=countPixName+1;
filename(countPixName,:)=(TXT{i,1}(11:21));
%extrag pozitia primului numar diferit de 0 din numele
%fisierului
[z splitstr] = regexp(char(filename(countPixName,:)), '[1-9]');
%extrag extensia fisierului pix0000179 => 179
ybackup1=str2num(char(filename(countPixName,z(1):end)));
%caut in vectorul de extensii pozitia extensiei
ind=strfind(vect,ybackup1);
%extrag real ID din lista de semnaturi
ybackup=[ybackup;RAW2{ind+1,3}];
end
if (strcmp(TXT{i,1}(1:9),'Component')==1)
countComponent=countComponent+1;
% if countComponent<=12
if countComponent==1
componenta=hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38);
histogramaComponente=componenta;
else
componenta=[componenta hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)]; histogramaComponente=[histogramaComponente;hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)];
end
% end
end
if countComponent==13
countPix=countPix+1;
%extrag toate ID-urile
ybackupID=[ybackupID;y];
if countPix<=pragAntrenare;
countPixAntrenare=countPixAntrenare+1;
componentaAntrenare=[componentaAntrenare;componenta];
yantrenare=[yantrenare;y];
elseif countPix<11
countPixTestare=countPixTestare+1;
ytestare=[ytestare;y];
componentaTestare=[componentaTestare;componenta];
end
str=sprintf('%s%d%s%s','histogramaComponente\',y,'\',filename(countPixName,:));
save(str,'histogramaComponente')
str=sprintf('%s%d%s%s','componente\',y,'\',filename(countPixName,:));
save(str,'componenta')
% str=sprintf('%s%d%s%s%s','pozecomponente\',y,'\',filename(countPixName,:),'.jpeg');
% saveas(imagesc(histogramaComponente),str)
histogramaComponente=[];
componenta=[];
countComponent=0;
if countPix==10
countPix=0;
y=y+1;
mkdir([pwd '\histogramaComponente' '\' num2str(y)])
mkdir([pwd '\componente' '\' num2str(y)])
mkdir([pwd '\pozecomponente' '\' num2str(y)])
end
end
end
end
save ybackup ybackup;
save ybackupID ybackupID;
save ytestare ytestare;
save yantrenare yantrenare;
lambda = 0.1;
nriesiri=29;
% %antrenare
[all_theta] = oneVsAll(double(componentaAntrenare), yantrenare, nriesiri, lambda);
pred = predictOneVsAll(all_theta, double(componentaAntrenare));
fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == yantrenare)) * 100);
rez=mean(double(pred) == yantrenare) * 100;
save theta all_theta
% %testare
load theta
pred2 = predictOneVsAll(all_theta, double(componentaTestare));
fprintf('\nTesting Set Accuracy: %f\n', mean(double(pred2 == ytestare)) * 100);
rez2=mean(double(pred2 == ytestare)) * 100;
Anexa 2 – Funcția de testare a semnăturilor false
close all
clear all
[NUMERIC,TXT,RAW]=xlsread('sra1_invariants_forgeries.csv');
[NUMERIC2,TXT2,RAW2]=xlsread('lista_semnaturi.csv');
componenta=[];
countComponent=0;
countPixName=0;
pragAntrenare=7;
countPix=0;
countPixAntrenare=0;
countPixTestare=0;
load ybackup;
load ybackupID;
S=[ybackup ybackupID];
yantrenare=[];
ytestare=[];
componentaAntrenare = [];
componentaTestare = [];
filename=[];
y=1;
histogramaComponente=[];
vect=[];ybackupForgery=[];ybackupIDForgery=[];
mkdir([pwd '\histogramaComponenteFalse' '\' num2str(y)]);
mkdir([pwd '\componenteFalse' '\' num2str(y)]);
mkdir([pwd '\pozecomponenteFalse' '\' num2str(y)]);
for i=2:length(RAW2)
vect=[vect RAW2{i,1}];
end
for i=1:length(TXT)
if mod(i,28)~=0 % excludem liniile cu spatiu din 28 in 28
if (strcmp(TXT{i,1}(1:8),'Filename')==1)
countPixName=countPixName+1;
filename(countPixName,:)=(TXT{i,1}(11:21));
[z splitstr] = regexp(char(filename(countPixName,:)), '[1-9]');
ybackup1=str2num(char(filename(countPixName,z:end)));
ind=strfind(vect,ybackup1);
%extrag din lista de semnaturi REAL ID-ul
ybackupForgery=[ybackupForgery;RAW2{ind+1,3}];
% caut pozitia acestuia in semnaturile antrenate
y=find(ybackup==RAW2{ind+1,3});
% extrag ID-ul semnaturii folosit la antrenare
y=ybackupID(y(1));
end
if (strcmp(TXT{i,1}(1:9),'Component')==1)
countComponent=countComponent+1;
if countComponent==1
componenta=hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38);
histogramaComponente=componenta;
else
componenta=[componenta hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)];
histogramaComponente=[histogramaComponente;hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)];
end
end
if countComponent==13
ybackupIDForgery=[ybackupIDForgery;y];
ytestare=[ytestare;y];
componentaTestare=[componentaTestare;componenta];
mkdir([pwd '\histogramaComponenteFalse' '\' num2str(y)]);
mkdir([pwd '\componenteFalse' '\' num2str(y)]);
mkdir([pwd '\pozecomponenteFalse' '\' num2str(y)]);
str=sprintf('%s%d%s%s','histogramaComponenteFalse\',y,'\',filename(countPixName,:));
save(str,'histogramaComponente');
str=sprintf('%s%d%s%s','componenteFalse\',y,'\',filename(countPixName,:));
save(str,'componenta');
str=sprintf('%s%d%s%s%s','pozecomponenteFalse\',y,'\',filename(countPixName,:),'.jpeg');
saveas(imagesc(histogramaComponente),str)
histogramaComponente=[];
componenta=[];
countComponent=0;
end
end
end
save ybackupForgery ybackupForgery;
save ybackupIDForgery ybackupIDForgery;
save ytestareForgery ytestare;
lambda = 0.1;
nriesiri=15;
% %testare
load theta
pred2 = predictOneVsAll(all_theta, double(componentaTestare));
fprintf('\nTesting Set Accuracy: %f\n', mean(double(pred2 == ytestare)) * 100);
rez2=mean(double(pred2 == ytestare)) * 100;
save pred2 pred2
Anexa 3 – Funcția pentru testarea Cross Validation
function CrossvalidationTesting(lowlimit,highlimit)
[NUMERIC,TXT,RAW]=xlsread('sra1_invariants.csv');
%incarc lista de semnaturi
[NUMERIC2,TXT2,RAW2]=xlsread('lista_semnaturi.csv');
componenta=[];
countComponent=0;
countPixName=0;
pragAntrenare=7;
countPix=0;
countPixAntrenare=0;
countPixTestare=0;
y=1;
yantrenare=[];
ytestare=[];
componentaAntrenare = [];
componentaTestare = [];
filename=[];
histogramaComponente=[];
vect=[];ybackup=[];ybackupID=[];
mkdir([pwd '\histogramaComponente' '\' num2str(y)])
mkdir([pwd '\componente' '\' num2str(y)])
mkdir([pwd '\pozecomponente' '\' num2str(y)])
%generez vector cu extensiile pixurilor
for i=2:length(RAW2)
vect=[vect RAW2{i,1}];
end
for i=1:length(TXT)
if mod(i,28)~=0 % excludem liniile cu spatiu din 28 in 28
if (strcmp(TXT{i,1}(1:8),'Filename')==1)
countPixName=countPixName+1;
filename(countPixName,:)=(TXT{i,1}(11:21));
%extrag pozitia primului numar diferit de 0 din numele
%fisierului
[z splitstr] = regexp(char(filename(countPixName,:)), '[1-9]');
%extrag extensia fisierului pix0000179 => 179
ybackup1=str2num(char(filename(countPixName,z:end)));
%caut in vectorul de extensii pozitia extensiei
ind=strfind(vect,ybackup1);
%extrag real ID din lista de semnaturi
ybackup=[ybackup;RAW2{ind+1,3}];
end
if (strcmp(TXT{i,1}(1:9),'Component')==1)
countComponent=countComponent+1;
if countComponent==1
componenta=hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38);
histogramaComponente=componenta;
else
componenta=[componenta hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)];
histogramaComponente=[histogramaComponente;hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)];
end
end
if countComponent==13
countPix=countPix+1;
%extrag toate ID-urile
ybackupID=[ybackupID;y];
if (countPix<=lowlimit || countPix>highlimit)
countPixAntrenare=countPixAntrenare+1;
componentaAntrenare=[componentaAntrenare;componenta];
yantrenare=[yantrenare;y];
elseif countPix<11
countPixTestare=countPixTestare+1;
ytestare=[ytestare;y];
componentaTestare=[componentaTestare;componenta];
end
str=sprintf('%s%d%s%s','histogramaComponente\',y,'\',filename(countPixName,:));
save(str,'histogramaComponente')
str=sprintf('%s%d%s%s','componente\',y,'\',filename(countPixName,:));
save(str,'componenta')
histogramaComponente=[];
componenta=[];
countComponent=0;
if countPix==10
countPix=0;
y=y+1;
mkdir([pwd '\histogramaComponente' '\' num2str(y)])
mkdir([pwd '\componente' '\' num2str(y)])
mkdir([pwd '\pozecomponente' '\' num2str(y)])
end
end
end
end
save ybackup ybackup;
save ybackupID ybackupID;
save ytestare ytestare;
save yantrenare yantrenare;
lambda = 0.1;
nriesiri=29;
% %antrenare
[all_theta] = oneVsAll(double(componentaAntrenare), yantrenare, nriesiri, lambda);
pred = predictOneVsAll(all_theta, double(componentaAntrenare));
fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == yantrenare)) * 100);
rez=mean(double(pred) == yantrenare) * 100;
save theta all_theta
% %testare
load theta
pred2 = predictOneVsAll(all_theta, double(componentaTestare));
fprintf('\nTesting Set Accuracy: %f\n', mean(double(pred2 == ytestare)) * 100);
rez2=mean(double(pred2 == ytestare)) * 100;
end
Anexa 4 – Funcția pentru predicție One Vs All și funcția Sigmoid
function p = predictOneVsAll(all_theta, X)
m = size(X, 1);
num_labels = size(all_theta, 1);
p = zeros(size(X, 1), 1);
X = [ones(m, 1) X];
[temp p] = max(sigmoid(X*all_theta'), [], 2);% sigmoid=fct de transfer,h
end
function g = sigmoid(z)
g = 1.0 ./ (1.0 + exp(-z));
end
Anexa 5 – Functia pentru interfața grafică
function varargout = RecunoastereaSemnaturiiGUI(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, …
'gui_Singleton', gui_Singleton, …
'gui_OpeningFcn', @RecunoastereaSemnaturiiGUI_OpeningFcn, …
'gui_OutputFcn', @RecunoastereaSemnaturiiGUI_OutputFcn, …
'gui_LayoutFcn', [] , …
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function RecunoastereaSemnaturiiGUI_OpeningFcn(hObject, eventdata, handles, varargin)
global mem mem2
handles.output = hObject;
files=dir(['componente\']);
men={};
k=0;
for i=3:length(files)
if isdir([pwd '\componente\' files(i).name])==1
files2=dir([pwd '\componente\' files(i).name '\' '*.mat']);
for j=1:length(files2)
k=k+1;
men{k}=sprintf('%d%s%s%s',k,': ',files(i).name,files2(j).name);
mem{k}=sprintf('%s%s',files(i).name,files2(j).name);
end
end
end
set(handles.popupmenu1,'string',men)
files=dir(['componenteFalse\']);
men={};
k=0;
for i=3:length(files)
if isdir([pwd '\componenteFalse\' files(i).name])==1
files2=dir([pwd '\componenteFalse\' files(i).name '\' '*.mat']);
for j=1:length(files2)
k=k+1;
men{k}=sprintf('%d%s%s%s',k,': ',files(i).name,files2(j).name);
mem2{k}=sprintf('%s%s',files(i).name,files2(j).name);
end
end
end
set(handles.popupmenu2,'string',men)
guidata(hObject, handles);
% – Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
global mem
A=[];
val=get(handles.popupmenu1,'value');
file=mem{val};
ind=strfind(file,'pix');
folder=file(1:ind-1)
file=file(ind:end)
load(['histogramaComponente\' folder '\' file])
load(['componente\' folder '\' file])
imagesc(histogramaComponente,'Parent',handles.axes1);
title(handles.axes1,'Semnatura aleasa');
xlabel(handles.axes1,'Histograma');
ylabel(handles.axes1,'Componente');
str=sprintf('%s%s','Utilizator: ',folder);
set(handles.text3,'String',str);
load theta
pred = predictOneVsAll(all_theta, double(componenta));
[pwd '\histogramaComponente\' num2str(pred)]
file2=dir([pwd '\histogramaComponente\' num2str(pred) '\' '*.mat']);
a=ceil(rand(1)*10);
load(['histogramaComponente\' num2str(pred) '\' file2(a).name]);
imagesc(histogramaComponente,'Parent',handles.axes2);
title(handles.axes2,'Semnatura recunoscuta');
xlabel(handles.axes2,'Histograma');
ylabel(handles.axes2,'Componente');
str=sprintf('%s%d','Utilizator: ',pred);
set(handles.text4,'String',str);
if( str2num(folder)==pred)
set(handles.text5,'String','Acceptat','Foreground', [0 0 1])
else set(handles.text5,'String','Respins','Foreground', [1 0 0])
end
A=csvread([pwd '\semnaturi originale\' strrep(file,'.mat','.csv')],13,0);
noiseLength = 600;
onsx = A(:,7); len = length(onsx);
onsx = onsx(noiseLength + 1: len – noiseLength);
onsy = A(:,8);
onsy = onsy(noiseLength + 1 : len – noiseLength);
for i = 2 : length(onsx);
onsx(i) = onsx(i) + onsx(i – 1);
onsy(i) = onsy(i) + onsy(i – 1);
end
Fs = 1000;
filter_length = 31;
Ft3 = 10;
w_ons = 2 * Ft3 / Fs;
h_ons = fir1(filter_length – 1, w_ons, boxcar(filter_length));
onsx = filter(h_ons, 1, onsx); %––– filtrare ONS –––
onsy = filter(h_ons, 1, onsy); %––– filtrare ONS –––
plot(handles.axes4,-onsy, -onsx, 'blue');
title(handles.axes4,'Reprezentarea grafica a semnaturii');
xlabel(handles.axes4,'X');
ylabel(handles.axes4,'y');
A=csvread([pwd '\semnaturi originale\' strrep(file2(a).name,'.mat','.csv')],13,0);
onsx = A(:,7); len = length(onsx);
onsx = onsx(noiseLength + 1: len – noiseLength);
onsy = A(:,8);
onsy = onsy(noiseLength + 1 : len – noiseLength);
for i = 2 : length(onsx);
onsx(i) = onsx(i) + onsx(i – 1);
onsy(i) = onsy(i) + onsy(i – 1);
end
w_ons = 2 * Ft3 / Fs;
h_ons = fir1(filter_length – 1, w_ons, boxcar(filter_length));
onsx = filter(h_ons, 1, onsx); %––– filtrare ONS –––
onsy = filter(h_ons, 1, onsy); %––– filtrare ONS –––
plot(handles.axes3,-onsy, -onsx, 'blue');
title(handles.axes3,'Reprezentarea grafica a semnaturii');
xlabel(handles.axes3,'X');
ylabel(handles.axes3,'y');
% – Executes on selection change in popupmenu2.
function popupmenu2_Callback(hObject, eventdata, handles)
global mem2
val=get(handles.popupmenu2,'value');
file=mem2{val};
ind=strfind(file,'pix');
folder=file(1:ind-1);
file=file(ind:end);
load(['histogramaComponenteFalse\' folder '\' file])
load(['componenteFalse\' folder '\' file])
imagesc(histogramaComponente,'Parent',handles.axes1);
title(handles.axes1,'Semnatura aleasa');
xlabel(handles.axes1,'Histograma');
ylabel(handles.axes1,'Componente');
str=sprintf('%s%s','Utilizator: ',folder);
set(handles.text3,'String',str);
load theta
pred = predictOneVsAll(all_theta, double(componenta))
file2=dir([pwd '\histogramaComponente\' num2str(pred) '\' '*.mat'])
a=ceil(rand(1)*10);
load(['histogramaComponente\' num2str(pred) '\' file2(a).name]);
imagesc(histogramaComponente,'Parent',handles.axes2);
title(handles.axes2,'Semnatura recunoscuta');
xlabel(handles.axes2,'Histograma');
ylabel(handles.axes2,'Componente');
str=sprintf('%s%d','Utilizator: ',pred);
set(handles.text4,'String',str);
if( str2num(folder)==pred)
set(handles.text5,'String','Acceptat','Foreground', [0 0 1])
else set(handles.text5,'String','Respins','Foreground', [1 0 0])
end
A=csvread([pwd '\semnaturi originale\' strrep(file,'.mat','.csv')],13,0);
noiseLength = 600;
onsx = A(:,7); len = length(onsx);
onsx = onsx(noiseLength + 1: len – noiseLength);
onsy = A(:,8);
onsy = onsy(noiseLength + 1 : len – noiseLength);
for i = 2 : length(onsx);
onsx(i) = onsx(i) + onsx(i – 1);
onsy(i) = onsy(i) + onsy(i – 1);
end
Fs = 1000;
filter_length = 31;
Ft3 = 10;
w_ons = 2 * Ft3 / Fs;
windowsStart = 100;
windowsLength = 600;
h_ons = fir1(filter_length – 1, w_ons, boxcar(filter_length));
onsx = filter(h_ons, 1, onsx); %––– filtrare ONS –––
onsy = filter(h_ons, 1, onsy); %––– filtrare ONS –––
plot(handles.axes4,-onsy, -onsx, 'blue');
title(handles.axes4,'Reprezentarea grafica a semnaturii');
xlabel(handles.axes4,'X');
ylabel(handles.axes4,'y');
A=csvread([pwd '\semnaturi originale\' strrep(file2(a).name,'.mat','.csv')],13,0);
onsx = A(:,7); len = length(onsx);
onsx = onsx(noiseLength + 1: len – noiseLength);
onsy = A(:,8);
onsy = onsy(noiseLength + 1 : len – noiseLength);
for i = 2 : length(onsx);
onsx(i) = onsx(i) + onsx(i – 1);
onsy(i) = onsy(i) + onsy(i – 1);
end
w_ons = 2 * Ft3 / Fs;
h_ons = fir1(filter_length – 1, w_ons, boxcar(filter_length));
onsx = filter(h_ons, 1, onsx); %––– filtrare ONS –––
onsy = filter(h_ons, 1, onsy); %––– filtrare ONS –––
plot(handles.axes3,-onsy, -onsx, 'blue');
title(handles.axes3,'Reprezentarea grafica a semnaturii');
xlabel(handles.axes3,'X');
ylabel(handles.axes3,'y');
Anexa 6 – Funcția pentru gradientul descrescător
function [J, grad] = lrCostFunction(theta, X, y, lambda)
m = length(y);
J = 0;
grad = zeros(size(theta));
one_mat = ones(size(y));
J = mean(-y.*log(sigmoid(X*theta))-(one_mat-y).*log(one_mat-sigmoid(X*theta)));
J = J + (lambda*sum(theta(2:end).^2))/(2*m);
grad = (1/m)*(X')*(sigmoid(X*theta)-y);
grad(2:end) = grad(2:end) + (lambda/m)*theta(2:end); % Regularized gradient
end
Bibliografie
[1] PRIME Faraday Partnership Wolfson School of Mechanical and Manufacturing Engineering Loughborough University, "An Introduction to MEMS", Loughborough, Leics LE11 3TU, Cap.2.Micro-electromechanical Systems, pg.1-16, 2002.
[2] CERN Courier, The first capacitative touch screens at CERN, 2010.
[3] Sargur N. Srihari, "Computational Methods for Handwritten Questioned Document Examination", Cap2.2.Methods, pg. 7-14, 2010.
[4] James P. Holmes, Larry J. Wright, Russell L. Maxwell "A performance Evaluation of Biometric Identification Devices", Scandia National Laboratories, 1991.
[5] Louka Dlagnekov, Serge Belongie, "Recognizing Cars", Department of Computer Science and Engineering University of California, San Diego, 2006.
[6] S.Srihari. K. M. Kalera. and A. XU, "Offline Signature Verification and Identification Using Distance Statistics", International Journal of Pattern Recognition And Artificial Intelligence ,vol. 18, no. 7, pp. 1339–1360, 2004.
[7] Prashanth CR,KB Raja,KR Venugopal, LM Patnaik, "Standard Scores Correlation based Offline signature verification system", International Conference on advances in computing, control and telecommunication Technologies, 2009.
[8] Rafael C. Gonzalez, Richard E. Woods, "Digital Image Processing", Pearson Education, Inc., 2008.
[9] H. Gamboa*, A. L. N. Fred, A. K. Jain, "Webbiometrics: User Verification Via Web Interaction", 2009.
[10] Șt. Diaconescu, A. Dinescu, "Tehnologii biometrice. Partea a II-a – Recunoașterea semnăturii dinamice", Editura Politehnica Press, București, 2013.
[11] Dit-Yan Yeung, Hong Chang, Yimin Xiong, Susan George, Ramanujan Kashi, Takashi Matsumoto, Gerhard Rigoll, "SVC2004" First International Signature Verification Competition, 2004.
[12] Șt. Diaconescu, A. Dinescu, "Tehnologii biometrice. Recunoașterea semnăturii dinamice", Îndrumar de laborator, Editura Politehnica Press, București, 2013.
[13] Richard Socher, Cliff Lin, Andrew Y. Ng, Christopher Manning, "Proceedings of the Twenty-Eighth International Conference on Machine Learning", 2011.
[14] Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton, "ImageNet Classification with Deep Convolutional Neural Networks", 2012.
[15] [Interactiv][Citat 15 08 2014] http://blog.eyewire.org/eyewires-first-scientific-discovery-and-nature-paper/
[16] Helga Kolb, Ralph Nelson, Eduardo Fernandez, Bryan Jones, Webvision, "The Organization of the Retina and Visual System", 2013.
[17] Leon Bottou, "Stochastic Gradient Descent Tricks", Microsoft Research, Redmond, WA, 2012.
[18] Lucrarea nr. 10, "Regresia logistică", SPSS, Universitatea Alexandru Ioan Cuza din Iași, 2010.
[19] Cosma Shalizi, "Advanced Data Analysis from an Elementary Point of View", Cap12.Logistic Regresion, 2012.
[20] Nicoleta Liviana Tudor, "Procesarea Semnalelor în Rețele Neuronale Liniare", Universitatea de Petrol-Gaze Ploiești, 2011.
[21] Louka Dlagnekov, Serge Belongie, "Recognizing Cars", Department of Computer Science and Engineering University of California, San Diego, 2006.
[22] Adam Coates and Andrew Y. Ng, "Neural Networks: Tricks of the Trade", Reloaded, Springer LNCS, 2012.
[23] Quoc V. Le, Marc'Aurelio Ranzato, Rajat Monga, Matthieu Devin, Kai Chen, Greg S. Corrado, Jeffrey Dean and Andrew Y. Ng, "Proceedings of the Twenty-Ninth International Conference on Machine Learning", 2012.
[24] [Interactiv][Citat 27 07 2014] http://www.epa.gov/cdx/cromerrr/propose/biometric_dmr-rpt.pdf),%E2%80%9D
[25] Radu Dogaru, Ovidiu Grigore, "Sisteme Neurale și Logica Fuzzy", 2009.
[26] [Interactiv][Citat 18 08 2014] https://class.coursera.org/ml-006/lecture
Anexa 1 – Funcția de antrenare și testare a rețelei neuronale
close all
clear all
[NUMERIC,TXT,RAW]=xlsread('sra1_invariants.csv');
%incarc lista de semnaturi
[NUMERIC2,TXT2,RAW2]=xlsread('lista_semnaturi.csv');
componenta=[];
countComponent=0;
countPixName=0;
pragAntrenare=7;
countPix=0;
countPixAntrenare=0;
countPixTestare=0;
y=1;
yantrenare=[];
ytestare=[];
componentaAntrenare = [];
componentaTestare = [];
filename=[];
histogramaComponente=[];
vect=[];ybackup=[];ybackupID=[];
mkdir([pwd '\histogramaComponente' '\' num2str(y)])
mkdir([pwd '\componente' '\' num2str(y)])
mkdir([pwd '\pozecomponente' '\' num2str(y)])
%generez vector cu extensiile pixurilor
for i=2:length(RAW2)
vect=[vect RAW2{i,1}];
end
for i=1:length(TXT)
if mod(i,28)~=0 % excludem liniile cu spatiu din 28 in 28
if (strcmp(TXT{i,1}(1:8),'Filename')==1)
countPixName=countPixName+1;
filename(countPixName,:)=(TXT{i,1}(11:21));
%extrag pozitia primului numar diferit de 0 din numele
%fisierului
[z splitstr] = regexp(char(filename(countPixName,:)), '[1-9]');
%extrag extensia fisierului pix0000179 => 179
ybackup1=str2num(char(filename(countPixName,z(1):end)));
%caut in vectorul de extensii pozitia extensiei
ind=strfind(vect,ybackup1);
%extrag real ID din lista de semnaturi
ybackup=[ybackup;RAW2{ind+1,3}];
end
if (strcmp(TXT{i,1}(1:9),'Component')==1)
countComponent=countComponent+1;
% if countComponent<=12
if countComponent==1
componenta=hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38);
histogramaComponente=componenta;
else
componenta=[componenta hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)]; histogramaComponente=[histogramaComponente;hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)];
end
% end
end
if countComponent==13
countPix=countPix+1;
%extrag toate ID-urile
ybackupID=[ybackupID;y];
if countPix<=pragAntrenare;
countPixAntrenare=countPixAntrenare+1;
componentaAntrenare=[componentaAntrenare;componenta];
yantrenare=[yantrenare;y];
elseif countPix<11
countPixTestare=countPixTestare+1;
ytestare=[ytestare;y];
componentaTestare=[componentaTestare;componenta];
end
str=sprintf('%s%d%s%s','histogramaComponente\',y,'\',filename(countPixName,:));
save(str,'histogramaComponente')
str=sprintf('%s%d%s%s','componente\',y,'\',filename(countPixName,:));
save(str,'componenta')
% str=sprintf('%s%d%s%s%s','pozecomponente\',y,'\',filename(countPixName,:),'.jpeg');
% saveas(imagesc(histogramaComponente),str)
histogramaComponente=[];
componenta=[];
countComponent=0;
if countPix==10
countPix=0;
y=y+1;
mkdir([pwd '\histogramaComponente' '\' num2str(y)])
mkdir([pwd '\componente' '\' num2str(y)])
mkdir([pwd '\pozecomponente' '\' num2str(y)])
end
end
end
end
save ybackup ybackup;
save ybackupID ybackupID;
save ytestare ytestare;
save yantrenare yantrenare;
lambda = 0.1;
nriesiri=29;
% %antrenare
[all_theta] = oneVsAll(double(componentaAntrenare), yantrenare, nriesiri, lambda);
pred = predictOneVsAll(all_theta, double(componentaAntrenare));
fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == yantrenare)) * 100);
rez=mean(double(pred) == yantrenare) * 100;
save theta all_theta
% %testare
load theta
pred2 = predictOneVsAll(all_theta, double(componentaTestare));
fprintf('\nTesting Set Accuracy: %f\n', mean(double(pred2 == ytestare)) * 100);
rez2=mean(double(pred2 == ytestare)) * 100;
Anexa 2 – Funcția de testare a semnăturilor false
close all
clear all
[NUMERIC,TXT,RAW]=xlsread('sra1_invariants_forgeries.csv');
[NUMERIC2,TXT2,RAW2]=xlsread('lista_semnaturi.csv');
componenta=[];
countComponent=0;
countPixName=0;
pragAntrenare=7;
countPix=0;
countPixAntrenare=0;
countPixTestare=0;
load ybackup;
load ybackupID;
S=[ybackup ybackupID];
yantrenare=[];
ytestare=[];
componentaAntrenare = [];
componentaTestare = [];
filename=[];
y=1;
histogramaComponente=[];
vect=[];ybackupForgery=[];ybackupIDForgery=[];
mkdir([pwd '\histogramaComponenteFalse' '\' num2str(y)]);
mkdir([pwd '\componenteFalse' '\' num2str(y)]);
mkdir([pwd '\pozecomponenteFalse' '\' num2str(y)]);
for i=2:length(RAW2)
vect=[vect RAW2{i,1}];
end
for i=1:length(TXT)
if mod(i,28)~=0 % excludem liniile cu spatiu din 28 in 28
if (strcmp(TXT{i,1}(1:8),'Filename')==1)
countPixName=countPixName+1;
filename(countPixName,:)=(TXT{i,1}(11:21));
[z splitstr] = regexp(char(filename(countPixName,:)), '[1-9]');
ybackup1=str2num(char(filename(countPixName,z:end)));
ind=strfind(vect,ybackup1);
%extrag din lista de semnaturi REAL ID-ul
ybackupForgery=[ybackupForgery;RAW2{ind+1,3}];
% caut pozitia acestuia in semnaturile antrenate
y=find(ybackup==RAW2{ind+1,3});
% extrag ID-ul semnaturii folosit la antrenare
y=ybackupID(y(1));
end
if (strcmp(TXT{i,1}(1:9),'Component')==1)
countComponent=countComponent+1;
if countComponent==1
componenta=hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38);
histogramaComponente=componenta;
else
componenta=[componenta hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)];
histogramaComponente=[histogramaComponente;hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)];
end
end
if countComponent==13
ybackupIDForgery=[ybackupIDForgery;y];
ytestare=[ytestare;y];
componentaTestare=[componentaTestare;componenta];
mkdir([pwd '\histogramaComponenteFalse' '\' num2str(y)]);
mkdir([pwd '\componenteFalse' '\' num2str(y)]);
mkdir([pwd '\pozecomponenteFalse' '\' num2str(y)]);
str=sprintf('%s%d%s%s','histogramaComponenteFalse\',y,'\',filename(countPixName,:));
save(str,'histogramaComponente');
str=sprintf('%s%d%s%s','componenteFalse\',y,'\',filename(countPixName,:));
save(str,'componenta');
str=sprintf('%s%d%s%s%s','pozecomponenteFalse\',y,'\',filename(countPixName,:),'.jpeg');
saveas(imagesc(histogramaComponente),str)
histogramaComponente=[];
componenta=[];
countComponent=0;
end
end
end
save ybackupForgery ybackupForgery;
save ybackupIDForgery ybackupIDForgery;
save ytestareForgery ytestare;
lambda = 0.1;
nriesiri=15;
% %testare
load theta
pred2 = predictOneVsAll(all_theta, double(componentaTestare));
fprintf('\nTesting Set Accuracy: %f\n', mean(double(pred2 == ytestare)) * 100);
rez2=mean(double(pred2 == ytestare)) * 100;
save pred2 pred2
Anexa 3 – Funcția pentru testarea Cross Validation
function CrossvalidationTesting(lowlimit,highlimit)
[NUMERIC,TXT,RAW]=xlsread('sra1_invariants.csv');
%incarc lista de semnaturi
[NUMERIC2,TXT2,RAW2]=xlsread('lista_semnaturi.csv');
componenta=[];
countComponent=0;
countPixName=0;
pragAntrenare=7;
countPix=0;
countPixAntrenare=0;
countPixTestare=0;
y=1;
yantrenare=[];
ytestare=[];
componentaAntrenare = [];
componentaTestare = [];
filename=[];
histogramaComponente=[];
vect=[];ybackup=[];ybackupID=[];
mkdir([pwd '\histogramaComponente' '\' num2str(y)])
mkdir([pwd '\componente' '\' num2str(y)])
mkdir([pwd '\pozecomponente' '\' num2str(y)])
%generez vector cu extensiile pixurilor
for i=2:length(RAW2)
vect=[vect RAW2{i,1}];
end
for i=1:length(TXT)
if mod(i,28)~=0 % excludem liniile cu spatiu din 28 in 28
if (strcmp(TXT{i,1}(1:8),'Filename')==1)
countPixName=countPixName+1;
filename(countPixName,:)=(TXT{i,1}(11:21));
%extrag pozitia primului numar diferit de 0 din numele
%fisierului
[z splitstr] = regexp(char(filename(countPixName,:)), '[1-9]');
%extrag extensia fisierului pix0000179 => 179
ybackup1=str2num(char(filename(countPixName,z:end)));
%caut in vectorul de extensii pozitia extensiei
ind=strfind(vect,ybackup1);
%extrag real ID din lista de semnaturi
ybackup=[ybackup;RAW2{ind+1,3}];
end
if (strcmp(TXT{i,1}(1:9),'Component')==1)
countComponent=countComponent+1;
if countComponent==1
componenta=hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38);
histogramaComponente=componenta;
else
componenta=[componenta hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)];
histogramaComponente=[histogramaComponente;hist(mod(str2num(TXT{i,1}(30:end)),39),0:1:38)];
end
end
if countComponent==13
countPix=countPix+1;
%extrag toate ID-urile
ybackupID=[ybackupID;y];
if (countPix<=lowlimit || countPix>highlimit)
countPixAntrenare=countPixAntrenare+1;
componentaAntrenare=[componentaAntrenare;componenta];
yantrenare=[yantrenare;y];
elseif countPix<11
countPixTestare=countPixTestare+1;
ytestare=[ytestare;y];
componentaTestare=[componentaTestare;componenta];
end
str=sprintf('%s%d%s%s','histogramaComponente\',y,'\',filename(countPixName,:));
save(str,'histogramaComponente')
str=sprintf('%s%d%s%s','componente\',y,'\',filename(countPixName,:));
save(str,'componenta')
histogramaComponente=[];
componenta=[];
countComponent=0;
if countPix==10
countPix=0;
y=y+1;
mkdir([pwd '\histogramaComponente' '\' num2str(y)])
mkdir([pwd '\componente' '\' num2str(y)])
mkdir([pwd '\pozecomponente' '\' num2str(y)])
end
end
end
end
save ybackup ybackup;
save ybackupID ybackupID;
save ytestare ytestare;
save yantrenare yantrenare;
lambda = 0.1;
nriesiri=29;
% %antrenare
[all_theta] = oneVsAll(double(componentaAntrenare), yantrenare, nriesiri, lambda);
pred = predictOneVsAll(all_theta, double(componentaAntrenare));
fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == yantrenare)) * 100);
rez=mean(double(pred) == yantrenare) * 100;
save theta all_theta
% %testare
load theta
pred2 = predictOneVsAll(all_theta, double(componentaTestare));
fprintf('\nTesting Set Accuracy: %f\n', mean(double(pred2 == ytestare)) * 100);
rez2=mean(double(pred2 == ytestare)) * 100;
end
Anexa 4 – Funcția pentru predicție One Vs All și funcția Sigmoid
function p = predictOneVsAll(all_theta, X)
m = size(X, 1);
num_labels = size(all_theta, 1);
p = zeros(size(X, 1), 1);
X = [ones(m, 1) X];
[temp p] = max(sigmoid(X*all_theta'), [], 2);% sigmoid=fct de transfer,h
end
function g = sigmoid(z)
g = 1.0 ./ (1.0 + exp(-z));
end
Anexa 5 – Functia pentru interfața grafică
function varargout = RecunoastereaSemnaturiiGUI(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, …
'gui_Singleton', gui_Singleton, …
'gui_OpeningFcn', @RecunoastereaSemnaturiiGUI_OpeningFcn, …
'gui_OutputFcn', @RecunoastereaSemnaturiiGUI_OutputFcn, …
'gui_LayoutFcn', [] , …
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function RecunoastereaSemnaturiiGUI_OpeningFcn(hObject, eventdata, handles, varargin)
global mem mem2
handles.output = hObject;
files=dir(['componente\']);
men={};
k=0;
for i=3:length(files)
if isdir([pwd '\componente\' files(i).name])==1
files2=dir([pwd '\componente\' files(i).name '\' '*.mat']);
for j=1:length(files2)
k=k+1;
men{k}=sprintf('%d%s%s%s',k,': ',files(i).name,files2(j).name);
mem{k}=sprintf('%s%s',files(i).name,files2(j).name);
end
end
end
set(handles.popupmenu1,'string',men)
files=dir(['componenteFalse\']);
men={};
k=0;
for i=3:length(files)
if isdir([pwd '\componenteFalse\' files(i).name])==1
files2=dir([pwd '\componenteFalse\' files(i).name '\' '*.mat']);
for j=1:length(files2)
k=k+1;
men{k}=sprintf('%d%s%s%s',k,': ',files(i).name,files2(j).name);
mem2{k}=sprintf('%s%s',files(i).name,files2(j).name);
end
end
end
set(handles.popupmenu2,'string',men)
guidata(hObject, handles);
% – Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
global mem
A=[];
val=get(handles.popupmenu1,'value');
file=mem{val};
ind=strfind(file,'pix');
folder=file(1:ind-1)
file=file(ind:end)
load(['histogramaComponente\' folder '\' file])
load(['componente\' folder '\' file])
imagesc(histogramaComponente,'Parent',handles.axes1);
title(handles.axes1,'Semnatura aleasa');
xlabel(handles.axes1,'Histograma');
ylabel(handles.axes1,'Componente');
str=sprintf('%s%s','Utilizator: ',folder);
set(handles.text3,'String',str);
load theta
pred = predictOneVsAll(all_theta, double(componenta));
[pwd '\histogramaComponente\' num2str(pred)]
file2=dir([pwd '\histogramaComponente\' num2str(pred) '\' '*.mat']);
a=ceil(rand(1)*10);
load(['histogramaComponente\' num2str(pred) '\' file2(a).name]);
imagesc(histogramaComponente,'Parent',handles.axes2);
title(handles.axes2,'Semnatura recunoscuta');
xlabel(handles.axes2,'Histograma');
ylabel(handles.axes2,'Componente');
str=sprintf('%s%d','Utilizator: ',pred);
set(handles.text4,'String',str);
if( str2num(folder)==pred)
set(handles.text5,'String','Acceptat','Foreground', [0 0 1])
else set(handles.text5,'String','Respins','Foreground', [1 0 0])
end
A=csvread([pwd '\semnaturi originale\' strrep(file,'.mat','.csv')],13,0);
noiseLength = 600;
onsx = A(:,7); len = length(onsx);
onsx = onsx(noiseLength + 1: len – noiseLength);
onsy = A(:,8);
onsy = onsy(noiseLength + 1 : len – noiseLength);
for i = 2 : length(onsx);
onsx(i) = onsx(i) + onsx(i – 1);
onsy(i) = onsy(i) + onsy(i – 1);
end
Fs = 1000;
filter_length = 31;
Ft3 = 10;
w_ons = 2 * Ft3 / Fs;
h_ons = fir1(filter_length – 1, w_ons, boxcar(filter_length));
onsx = filter(h_ons, 1, onsx); %––– filtrare ONS –––
onsy = filter(h_ons, 1, onsy); %––– filtrare ONS –––
plot(handles.axes4,-onsy, -onsx, 'blue');
title(handles.axes4,'Reprezentarea grafica a semnaturii');
xlabel(handles.axes4,'X');
ylabel(handles.axes4,'y');
A=csvread([pwd '\semnaturi originale\' strrep(file2(a).name,'.mat','.csv')],13,0);
onsx = A(:,7); len = length(onsx);
onsx = onsx(noiseLength + 1: len – noiseLength);
onsy = A(:,8);
onsy = onsy(noiseLength + 1 : len – noiseLength);
for i = 2 : length(onsx);
onsx(i) = onsx(i) + onsx(i – 1);
onsy(i) = onsy(i) + onsy(i – 1);
end
w_ons = 2 * Ft3 / Fs;
h_ons = fir1(filter_length – 1, w_ons, boxcar(filter_length));
onsx = filter(h_ons, 1, onsx); %––– filtrare ONS –––
onsy = filter(h_ons, 1, onsy); %––– filtrare ONS –––
plot(handles.axes3,-onsy, -onsx, 'blue');
title(handles.axes3,'Reprezentarea grafica a semnaturii');
xlabel(handles.axes3,'X');
ylabel(handles.axes3,'y');
% – Executes on selection change in popupmenu2.
function popupmenu2_Callback(hObject, eventdata, handles)
global mem2
val=get(handles.popupmenu2,'value');
file=mem2{val};
ind=strfind(file,'pix');
folder=file(1:ind-1);
file=file(ind:end);
load(['histogramaComponenteFalse\' folder '\' file])
load(['componenteFalse\' folder '\' file])
imagesc(histogramaComponente,'Parent',handles.axes1);
title(handles.axes1,'Semnatura aleasa');
xlabel(handles.axes1,'Histograma');
ylabel(handles.axes1,'Componente');
str=sprintf('%s%s','Utilizator: ',folder);
set(handles.text3,'String',str);
load theta
pred = predictOneVsAll(all_theta, double(componenta))
file2=dir([pwd '\histogramaComponente\' num2str(pred) '\' '*.mat'])
a=ceil(rand(1)*10);
load(['histogramaComponente\' num2str(pred) '\' file2(a).name]);
imagesc(histogramaComponente,'Parent',handles.axes2);
title(handles.axes2,'Semnatura recunoscuta');
xlabel(handles.axes2,'Histograma');
ylabel(handles.axes2,'Componente');
str=sprintf('%s%d','Utilizator: ',pred);
set(handles.text4,'String',str);
if( str2num(folder)==pred)
set(handles.text5,'String','Acceptat','Foreground', [0 0 1])
else set(handles.text5,'String','Respins','Foreground', [1 0 0])
end
A=csvread([pwd '\semnaturi originale\' strrep(file,'.mat','.csv')],13,0);
noiseLength = 600;
onsx = A(:,7); len = length(onsx);
onsx = onsx(noiseLength + 1: len – noiseLength);
onsy = A(:,8);
onsy = onsy(noiseLength + 1 : len – noiseLength);
for i = 2 : length(onsx);
onsx(i) = onsx(i) + onsx(i – 1);
onsy(i) = onsy(i) + onsy(i – 1);
end
Fs = 1000;
filter_length = 31;
Ft3 = 10;
w_ons = 2 * Ft3 / Fs;
windowsStart = 100;
windowsLength = 600;
h_ons = fir1(filter_length – 1, w_ons, boxcar(filter_length));
onsx = filter(h_ons, 1, onsx); %––– filtrare ONS –––
onsy = filter(h_ons, 1, onsy); %––– filtrare ONS –––
plot(handles.axes4,-onsy, -onsx, 'blue');
title(handles.axes4,'Reprezentarea grafica a semnaturii');
xlabel(handles.axes4,'X');
ylabel(handles.axes4,'y');
A=csvread([pwd '\semnaturi originale\' strrep(file2(a).name,'.mat','.csv')],13,0);
onsx = A(:,7); len = length(onsx);
onsx = onsx(noiseLength + 1: len – noiseLength);
onsy = A(:,8);
onsy = onsy(noiseLength + 1 : len – noiseLength);
for i = 2 : length(onsx);
onsx(i) = onsx(i) + onsx(i – 1);
onsy(i) = onsy(i) + onsy(i – 1);
end
w_ons = 2 * Ft3 / Fs;
h_ons = fir1(filter_length – 1, w_ons, boxcar(filter_length));
onsx = filter(h_ons, 1, onsx); %––– filtrare ONS –––
onsy = filter(h_ons, 1, onsy); %––– filtrare ONS –––
plot(handles.axes3,-onsy, -onsx, 'blue');
title(handles.axes3,'Reprezentarea grafica a semnaturii');
xlabel(handles.axes3,'X');
ylabel(handles.axes3,'y');
Anexa 6 – Funcția pentru gradientul descrescător
function [J, grad] = lrCostFunction(theta, X, y, lambda)
m = length(y);
J = 0;
grad = zeros(size(theta));
one_mat = ones(size(y));
J = mean(-y.*log(sigmoid(X*theta))-(one_mat-y).*log(one_mat-sigmoid(X*theta)));
J = J + (lambda*sum(theta(2:end).^2))/(2*m);
grad = (1/m)*(X')*(sigmoid(X*theta)-y);
grad(2:end) = grad(2:end) + (lambda/m)*theta(2:end); % Regularized gradient
end
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Recunoasterea Autenticitatii Semnaturii Dinamice (ID: 123446)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
