FUNDAȚIA PENTRU CULTURĂ ȘI ÎNVĂȚĂMÂNT IOAN SLAVICI [603927]

FUNDAȚIA PENTRU CULTURĂ ȘI ÎNVĂȚĂMÂNT “IOAN SLAVICI”
TIMIȘOARA
UNIVERSITATEA “IOAN SLAVICI” TIMIȘOARA
FACULTATEA DE INGINERIE
DOMENIUL CALCULATOARE ȘI TEHNOLOGIA INFORMAȚIEI
FORMA DE ÎNVĂȚĂMÂNT – ZI

PROIECT DE DIPLOMĂ

COORDONATOR ȘTIINȚIFIC
Prof. Univ. Dr. Ing. Ec. TITUS SLAVICI

ABSOLVENT: [anonimizat]
2020

2
FUNDAȚIA PENTRU CULTURĂ ȘI Î NVĂȚĂMÂNT “IOAN SLAVICI”
TIMIȘOARA
UNIVERSITATEA “IOAN SLAVICI” TIMIȘOARA
FACULTATEA DE INGINERIE
DOMENIUL CALCULATOARE ȘI TEHNOLOGIA INFORMAȚIEI
FORMA DE ÎNVĂȚĂMÂNT – ZI

DETERMINATOR DE PLANTE

COORDONATOR ȘTIINȚIFIC
Prof. Univ. Dr. Ing. Ec. TITUS SLAVICI

ABSOLVENT: [anonimizat]
2020

3
Cuprins
1. Introducere ………………………….. ………………………….. ………………………….. …………………….. 6
2. Fundamentare teoretică ………………………….. ………………………….. ………………………….. ……. 8
2.1. Perceptronul ………………………….. ………………………….. ………………………….. ……………. 8
2.2. Perceptronul multistrat ………………………….. ………………………….. …………………………. 9
2.3. Funcții de activare ………………………….. ………………………….. ………………………….. …. 10
2.3.1. Funcția sigmoidă unipolară (logistică) ………………………….. ………………………….. 10
2.3.2. Funcția sigmoidă bipolară ………………………….. ………………………….. ………………… 11
2.3.3. Funcția tangentă hiperbolică ………………………….. ………………………….. ……………. 12
2.3.4. ReLU (Rectified Linear Unit) ………………………….. ………………………….. ………….. 12
2.4. Rețele neuronale convoluționale ………………………….. ………………………….. …………… 13
2.5. Straturile unei rețele neuronale convoluționale ………………………….. ……………………. 13
2.5.1. Stratul convoluțional ………………………….. ………………………….. ………………………. 13
2.5.2. Stratul de agregare ………………………….. ………………………….. …………………………. 15
2.5.3. Stratul/straturile finale complet conectate ………………………….. ……………………… 16
2.6. Algoritmul Adam ………………………….. ………………………….. ………………………….. ……. 17
2.7. Arhitecturi RNC de referință ………………………….. ………………………….. ………………… 18
2.7.1. AlexNet (2012) ………………………….. ………………………….. ………………………….. …. 18
2.7.2. VGGNet (2014) ………………………….. ………………………….. ………………………….. … 19
2.8. Tehnologii ………………………….. ………………………….. ………………………….. ………………. 21
2.8.1. Python ………………………….. ………………………….. ………………………….. ……………… 21
3. Proiectare și implementare ………………………….. ………………………….. ………………………….. 22
3.1. Structura rețelei ………………………….. ………………………….. ………………………….. ……… 22
3.2. Structura proiectului ………………………….. ………………………….. ………………………….. . 25
3.3. Încărcarea datelor ………………………….. ………………………….. ………………………….. ….. 26
3.3.1. Importul pachetelor necesare ………………………….. ………………………….. …………… 27
3.3.2. Plasarea argumentelor în linia de comandă ………………………….. …………………….. 28
3.3.3. Încărcarea imaginilor și a etichetelor ………………………….. ………………………….. … 29
3.4. Separarea setului de date în antrenare și testare ………………………….. ………………….. 30
3.5. Augmentarea datelor ………………………….. ………………………….. ………………………….. . 31
3.6. ConvNet ………………………….. ………………………….. ………………………….. ……………….. 31
3.7. Evaluarea modelului ………………………….. ………………………….. ………………………….. . 32
3.8. Etichetarea ………………………….. ………………………….. ………………………….. ……………. 32
4. Rezultate ………………………….. ………………………….. ………………………….. ……………………… 35
5. Concluzii ………………………….. ………………………….. ………………………….. ……………………… 42
Bibliografie

4
Listă de figuri
Figura 2.1 . Arhitectura perceptronului [ 1] ………………………….. ………………………….. …………….. 8
Figura 2.2 . Arhitectura perceptronului multistrat [ 2] ………………………….. ………………………….. . 9
Figura 2.3 . Funcția sigmoidă unipolară [ 3] ………………………….. ………………………….. ………….. 11
Figura 2.4 . Funcția sigmoidă bipolară [ 1] ………………………….. ………………………….. ……………. 11
Figura 2.5 . Funcția tangentă hiperbolică [ 1] ………………………….. ………………………….. ………… 12
Figura 2.6 . Funcția ReLU [ 3] ………………………….. ………………………….. ………………………….. … 12
Figura 2.7 . Rețele neuronale [3] ………………………….. ………………………….. …………………………. 13
Figura 2.8 . Exemplu de convoluție a doua matrici pătratice A (4×4) și B (2×2) [ 2] …………… 14
Figura 2.9 . Rezultatul operației de pooling și aplicarea funcției MAX [ 3] ………………………… 16
Figura 2.10 . Arhitectura rețelei AlexNet [ 3] ………………………….. ………………………….. ………… 19
Figura 2.11 . Macroarhitectura VGG 16 [ 3] ………………………….. ………………………….. ………….. 20
Figura 3.1. Structura arbore ………………………….. ………………………….. ………………………….. …… 26
Figura 3.2. Încărcarea datelor ………………………….. ………………………….. ………………………….. … 29
Figura 3.3. Separarea setului de date în antrenare și testare ………………………….. ………………… 30
Figura 3.4. Plantă determinată ………………………….. ………………………….. ………………………….. .. 11
Figura 4.1. Imagini – Mușetel [12] ………………………….. ………………………….. ……………………… 35
Figura 4.2. Imagini – Păpădiel [13] ………………………….. ………………………….. …………………… 125
Figura 4.3. Imagini – Trandafir [14] ………………………….. ………………………….. ………………….. 135
Figura 4. 4. Evoluția preciziei și a pierderilor pentru prima retea neuronala …………………….. 377
Figura 4. 5. Captură realizată în timpul antrenării primei rețele neuronale ………………………… 38
Figura 4. 6. Captură realizată în timpul antrenării celei de -a doua rețele neuronale …………….. 39
Figura 4. 7. Evoluția preciziei și a pierderilor pentru cea de -a retea neuronala …………………… 40
Figura 4. 8. Rezultatele clasificării utilizând fun cția sigmoidă ………………………….. …………….. 40
Figura 4. 9. Rezultatele clasificării utlizând funcția ReLU ………………………….. ………………….. 41

5

Listă de tabele

Tabelul 4.1 Rezultatele clasificării rețelei neuronale cu ReLU ca funcție de activare ………. 388
Tabelul 4.2 Rezultatele clasificării rețelei neuronale cu funcție de activare sigmoidă ………… 40

6
Capitolul 1
Introducere

Identificarea automată a imaginii plantelor este o soluție promițătoare pentru reducerea
decalajului taxonomic botanic, care primește o atenție deosebită atât în comunitatea botanică,
cât și în cea informatică . Pe măsură ce tehnologia avansează, au fost propuse modele complexe
pentru identificarea automată a plantelor.
Odată cu creșterea popularit ății smartphone -urilor și apariția aplicațiilor mobile s -au
achiziționat milioane de fotografii ale plantelor. Îmbunătățirea performanței modelelor de
identificare a plantelor bazate pe mobil atrage atenția sporită din partea cercetătorilor și
inginerilor.
În zilele noastre, s -au desfășurat multe eforturi în extragerea caracteristicilor locale ale
frunzelor, florilor sau fructelor. Majoritatea cercetătorilor folosesc variații ale caracteristicilor
frunzelor ca instrument comparat iv pentru studierea plantelor .
Unii cercetători se concentrează asupra florilor studiin d culoarea, forma și textura acestora .
Studiile privind identificarea plantelor după fructe sunt relativ rare .
Clasificarea plantelor are un rol important în multe aplic ații, precum cele de identificare
automată a plantelor bazată pe dispozitive mobile , esențială pentru supravegherea ecologică,
monitorizarea plantelor, popularizarea științei ecologice , etc. Acest domeniu a atras multe studii
în ultimul timp și reprezintă o provocare.
În acest context, rețelele neuronale au cunoscut un real succes, fiind facilitate de o gamă variată
și masivă de date disponibile, dar și de o dezvoltare tehnologică incontestabilă, care a facut
posibilă o viteză foar te mare de antrenare a ac estora într-o gamă largă de aplicații aparținând
mai multor domenii .
Am ales să lucrez cu o rețea neuronală convoluțională, deoarece prezintă un nivel de
recunoaștere (acuratețe) foarte ridicat, uneori depășindu -l pe cel uman, sunt relativ ușor de
antrenat față de, spre exemplu, rețelele neuronale perceptron multistrat (MLP), dar și pentru că
are capacitatea de a extrage caracteristicile topologice dintr -un set de date, având nevoie de o
preprocesare minimă.
Lucrarea de faț ă are ca scop dezvoltarea unui pro gram de determinare a plantelor pe baza unui
set de imagini, folosind o rețea neuronală convoluțională. Rezultatele acestei tehnici au fost
comparate cu cele obținute prin schimbarea funcției de activare la nivelul straturilor rețelei.
Pentru realizarea ac estui proiect, au fost realizați următorii pași:

7
 Folosirea unui set de date ce conține imagini corespunzătoare celor trei clase alese ,
necesar antrenării rețelei neuronale, aceasta fiind o metodă de învățare supervizată.
 Preprocesarea imaginilor înainte de a fi direcționate către rețeaua neuronală, acestea
suferind operații de redimensionare și filtrare.
 Implementarea unei metode pentru recunoașterea plantelor dintr -o imagine, chiar dacă
aceasta conține un grup de plante .
 Crearea unei Rețele Neuronale Convo luționale (CNN) pentru realizarea corectă a
clasificării imaginilor în cele trei clase de care dispunem.

8
Capitolul 2
Fundamentare teoretică
Acest capitol conține informațiile teoretice necesare pentru a înțelege soluția propusă pentru
determinarea plantelor . Pentru început, sunt prezentate fundamente ce stau la baza rețelelor
neuronale convoluționale, cum ar fi algoritmii de optimizare, funcți ile de activare, dar și
structura straturilor unei astfel de rețele.
Sunt descrise, de asemenea, metodele de clasificare a imaginii într -una din cele trei clase
predefinite, dar și tehnologiile folosite.
2.1. Perceptronul
Modelul perceptronului, propus de Frank Rosenblatt în anul 1958 este unul mai general decât
neuronul McCulloch -Pitts, acesta depășind unele limitări ale neuronului MP, prin introducerea
conceptului de ponderi pentru intrări și un mecanism de învățare al acestora. Spre deosebire de
alți alg oritmi de clasificare, perceptronul a fost modelat după funcționarea neuronilor din
creierul uman, având o capacitate deosebită de a învăța și rezolva probleme complexe.

Figura 2.1 Arhitectura perceptronului [1]
Perceptronul calculează suma ponderată a n valori numerice pentru o intrare 𝑥𝑖: [1]
𝑦=𝑤 ∙ 𝑥 + 𝑏=∑𝑤𝑖∙𝑥𝑖 + 𝑏; 𝑖=1,𝑛 (2.1)

[1] Performance Analysis of Various Activation Functions in Generalized MLP Architectures of Neural Networks,
http://www.cscjournals.org/manuscript/Journals/IJAE/Vo lume1/Issue4/IJAE -26.pdf

9
Asupra funcției de ieșire se aplică o funcție neliniară, de exemplu funcția semn: [ 1]
𝑠𝑖𝑔𝑛 (𝑦) ={−1,𝑝𝑒𝑛𝑡𝑟𝑢 𝑦<0;
0,𝑝𝑒𝑛𝑡𝑟𝑢 𝑦=0;
+1,𝑝𝑒𝑛𝑡𝑟𝑢 𝑦>0. (2.2)
Termenul liber b poartă denumirea de bias (offset) și reprezintă valoarea de prag de activare a
neuronului, fiind utilizat pentru a regla ieșirea neuronului, împreună cu suma ponderilor
intrărilor. El are rolul de a translata funcția de activare în funcție de proce sul de antrenare,
oferind astfel flexibilitate rețelei neuronale.
2.2. Perceptronul multistrat
Un perceptron multistrat (MLP – Multilayer perceptron) reprezintă o clasă de rețea neuronală
avansată. Acesta conține cel puțin trei straturi de noduri: un stra t de intrare, un strat ascuns și
un strat de ieșire. Cu excepția nodurilor de intrare, fiecare nod este un neuron care utilizează o
funcție de activare neliniară. În funcție de numărul straturilor ascunse, se poate vorbi despre
două tipuri de rețele: „reț ea neuronală adâncă” („deep neural network”) și „rețea neuronală
superficială” („shallow neural netowrk”).

Figura 2.2 Arhitectura perceptronului multistrat [2]

[2] Rețele neuronale convoluționale, Big Data și Deep Learning în analiza automată de imagini,
https://w ww.researchgate.net/publication/332129835_Retele_neuronale_convolutionale_Big_Data_si_Deep_Lea
rning_in_analiza_automata_de_imagini

10
Perceptronul multistrat este o rețea de tipul „feed forward”, întrucât conexiunile între straturi
se fac exclusiv de la intr are spre ieșire, valorile din starturile avansate nefiind influențate de
valorile din straturile anterioare, neexistând legături între neuronii aceluiași strat. Și aici este
necesară aplicarea unor funcții de activare (continue), cu rolul de a facilita ant renarea rețelei.
Sunt utilizate funcțiile sigmoidă și tangentă hiperbolică, acestea fiind descrise într -un
subcapitol viitor. Numărul ieșirilor reprezintă numărul prestabilit de clase pentru setul de date
inițial. Algoritmul „backpropagation” („retroprop agarea erorii”) , recunoscut în utilizarea
rețelelor neuronale, este folosit pentru a învăța ponderile unei rețele pe mai multe nivele, făcând
parte din categoria metodelor de învățare supervizată. [2]
Metoda „backpropagation” poate fi prezentată ca un proces incremental prin care se urmărește
diminuarea erorii dintre valorile ieșirilor din rețea și valorile actuale ale acelor ieșiri. Deși foarte
populară, ideea propagării erorilor în sens invers legăturilor sinaptice a fost privită inițial cu
reticiență , întrucât, biologic, acest lucru este foarte improbabil. Pentru ajustarea ponderilor este
utilizată metoda gradientului, în cadrul căreia, ponderile sunt ajustate la fiecare pas pentru ca
gradientul erorii să fie descrescător. [ 2]
Deoarece în cazul multor straturi ascunse, algoritmul prezintă limitări serioase, în practică se
utilizează adesea un singur strat de neuroni ascunși. Pentru mai multe straturi ascunse, funcția
sigmoidă de activare determină la derivare o saturare accelerată, ducând la efectul „v anishing
gradient” („dispariția gradientului”), nefăcând posibilă antrenarea ulterioară a ponderilor. [2]
2.3 Funcții de activare
Funcțiile de activare sunt utilizate în nodurile fiecărui strat al unei rețele neuronale pentru a
rezolva diferite prob leme legate de neliniaritate. [3 ]
2.3.1 Funcția sigmoidă unipolară (logistică)
Această funcție este deosebit de avanatajoasă în cazul algoritmilor de învățare ai rețelelor
backpropagation. În cadrul acestora, rețelele sunt parcuse înapoi, de la ieșiri la intrăr i,
realizându -se o estimare a erorii, care se face între ieșirile rețelei și ieșirile din setul de date de
intrare.

[2] Rețele neuronale convoluționale, Big Data și Deep Learning în analiza automată de imagini,
https://www.researchgate.net/publication/332129835_Retele_neuronale_convolutionale_Big_Data_si_Deep_Le a
rning_in_analiza_automata_de_imagini
[3] Performance Analysis of Various Activation Functions in Generalized MLP Architectures of Neural Networks,
http://www.c scjournals.org/manuscript/Journals/IJAE/Volume1/Issue4/IJAE -26.pdf

11
Această funcție este cunoscută pentru faptul că reduce considerabil capacitatea computațională
necesară pentru antrenare. Semnificația termenului „sigmoid” este „în forma de S”, iar forma
logistică a hărților de pe intervalul (−∞,+∞) se mapează pe intervalul (0,1), după cum se
poate observa și din graficul funcției. [ 3]

Figura 2.3 . Funcția sigmoidă unipolară [3]
𝑓(𝑥) = 1
1+𝑒−𝑥 (2.3)
2.3.2. Funcția sigmoidă bipolară
Aceasta este asemănătoare cu funcția sigmoidă unipolară, utilizarea ei fiind recomandată în
special pentru realizarea aplicațiilor ale căror valori de ieșire se află în intervalul [−1,1].
𝑓(𝑥)= 1 − 𝑒−𝑥
1 + 𝑒−𝑥 (2.4)

Figura 2.4 . Funcția sigmoidă bipolară [ 1]

[1] Performance Analysis of Various Activation Functions in Generalized MLP Architectures of Neural
Networks, http://www.cscjournals.org/manuscript/Journals/IJAE/Volume1/Issue4/IJAE -26.pdf
[3] Performance Analysis of Various Activation Functions in Generalized MLP Archite ctures of Neural
Networks, http://www.cscjournals.org/manuscript/Journals/IJAE/Volume1/Issue4/IJAE -26.pdf
[4] CS231n: Convolutional Neural Networks for Visual Recognition, https://cs231n.github.io/convolutional –
networks/

12
2.3.3 . Funcția tangentă hiperbolică
Această funcție este definită ca raportul di ntre funcția sinus și cosinus și extinsă ca raportul
dintre jumătatea diferenței și jumătatea sumei a două funcții exponențiale în punctele x și -x,
după cum urmează: [ 1]

Figura 2.5 . Funcția tangentă hiperbolică [1]
tanh (𝑥)=sinℎ(𝑥)
cosh (𝑥)=𝑒𝑥 − 𝑒−𝑥
𝑒𝑥+𝑒−𝑥 (2.5)

2.3.4. ReLU (Rectified Linear Unit)
Funcția ReLU accelerează semnificativ convergența descendenței gradientului stochastic, în
comparație cu funcțiile sigmoid/tanh, acest lucru fiind datorat formei sale liniare, nesaturabile.
Aceasta este și ușor de implementat, comparativ cu neuronii tanh/sigmoid care implică operații
costisitoare (exponențiale), ReLU poate fi implementată prin simpla limitare a unei matrice de
activări la zero.
𝑓(𝑥) = 𝑚𝑎𝑥 (0,𝑥) (2.6)

Figura 2.6 . Funcția ReLU [3]

[1] Performance Analysis of Various Activation Functions in Generalized MLP Architectures of Neural
Networks, http://www.cscjournals.org/manuscript/Journals/IJAE/Volume1/Issue4/IJAE -26.pdf
[3] Performance Analysis of Various Activation Functions in Generalized MLP Architectures of Neural
Networks, http://www.cscjournals.org/manuscript/Journals/IJAE/Vo lume1/Issue4/IJAE -26.pdf

13
2.4. Rețele neuronale convoluționale
Rețelele neuronale convoluționale reprezintă o categorie a rețelelor neuronale, utilizate cu
succes în situații de identificare de obiecte și persoane, dar și de clasificare. O rețea neuronală
convoluțională are 3 straturi: de intrare, de ieșire și unul sau mai multe straturi ascunse, peste
fiecare dintre acestea aplicându -se diferite filtre. Neuronii fiecărui strat sunt dispuși în 3
dimensiuni, și anume: lățime, înălțime și adâncime. O rețea ne uronală are două mari părți.
Partea convoluțională, formată din straturi de tip Convolution și Pooling, extrage informații de
bază din setul de date de intrare. În cazul nostru, deoarece vorbim despre clasificarea imaginilor,
în primul strat putem efectua operații la nivel de pixel, iar mai apoi, în al doilea strat, se poate
învața detectarea unor forme simple sau a unor contururi. A doua parte a rețelei conține unul
sau mai multe straturi complet conectate, practic o rețea MLP (perceptron multistrat) și es te
folosită pentru a clasifica caracteristici de nivel înalt, determinând probabilitățile ca imaginea
să aparțină unei categorii.

a. b.
Figura 2.7. Rețele neuronale:
a – rețea neuronală clasică cu 3 straturi ; b – rețea neuroanală convoluțională . [3]

2.5. Straturile unei rețele neuronale convoluționale
2.5.1. Stratul convoluțional
Aceste straturi sunt responsabile de realizarea convoluției dintre imaginea de intrare și un filtru
de învățare, care poate fi reprezentat de o matrice pătratică de dimensiuni mici.
De exemplu, un filtru care se poate aplica pe primul strat al unei rețele neuronale poate avea
dimensiunea 5x5x3 (5 pixeli lățime și înălțime și 3, adâncimea imaginii, canalele de culoare).
În timpul operației de convoluție, se glisează fiecare filtru pe lățimea și înălțimea datelor de
intrare și se calculează produsele punctuale între intrările filtrului și intrarea în orice poziție .

[3] Performance Analysis of Various Activation Functions in Generalized MLP Architectures of Neural
Networks, http://www.cscjournals.org/manuscript/Journals/IJAE/Vo lume1/Issue4/IJAE -26.pdf

14
Pe măsura glisării filtrului pe dimensiunile datelor d e intrare (lățime și înălțime), se vor realiza
așa numitele feature maps (harta de trăsături), care reprezintă o hartă de activare bidimensională
ce conține răspunsurile filtrul ui respectiv la fiecare poziție din spațiu. Astfel, rețeaua va învăța
filtre care sunt activate de un anumit tip de caracteristică vizuală, precum o margine a unei
orientări, o pată de culoare sau, în cele din urmă, un model întreg.
Convoluția 2 -D a două funcții a și b pe multimea numerelor întregi Z este dată de relația:
(𝑎∗𝑏)[𝑖,𝑗]=∑∑ 𝑎[𝑚,𝑛] ∙𝑏[𝑖−𝑚,𝑗−𝑛] (2.7)
Elementele matricei C se obțin prin adunarea produselor din aceleași poziții din matricea de
convoluție B și regiunea din matricea inițială A, prin glisarea matricii B peste matricea A, atât
pe orizontală, cât și pe verticală, cu pasul s (stride) = 1. [2]
În urma aplicării operației de convoluție, se observă o reducere a dimenisunii matricii de ieșire
C. Dacă notăm cu a, b, și c dimensiunile matricilor A, B si C, atunci dimensiunea matricei de
convoluție (filtru sau nucleu/kernel) poate fi dată de relația:
𝑐=𝑎−𝑏+1 (2.8)
Un exemplu al aplicării operației de convoluție 2 -D a două matrici pătratice este ilustrat în
figura de mai jos:

Figura 2.8 . Exemplu de convoluție a două matrici pătratice A (4×4) și B (2×2), rezultând
matricea pătrată C (3×3) [2]
Dacă nu se dorește reducerea dimensiunii matricii de convoluție C, se utilizează metoda zero –
padding, ceea ce presupune adăugarea la matricea inițială a mai multor linii și coloane de
valoare 0 în jurul acesteia și aplicarea filtrului pe matricea obținută. Dacă p reprezintă numărul
elementelor de valoare 0 adăugate pe fiecare direcție, atunci are loc următoarea relație: [ 2]
𝑐=𝑎−𝑏+2𝑝+1 (2.9)

[2] Rețele neuronale convoluționale, Big Data și Deep Learning în analiza automată de imagini,
https://w ww.researchgate.net/publication/332129835_Retele_neuronale_convolutionale_Big_Data_si_Deep_Lea
rning_in_analiza_automata_de_imagini

15
Pentru ca dimensiunea spațială a matricei de ieșire să nu se modifice, trebuie să aibă loc
egalitatea a=c. În acest caz, p devine:
p=(b−1)/2 (2.10)
Relația de mai sus este valabilă pentru cazul în care pasul de avansare pe orizontală și verticală
atunci când are loc glisarea matricei B peste matricea A este s (stride) = 1.
Imaginile digitale sunt reprezentate ca matrici spațiale 2 -D, la care se adaugă și adâncimea de
culoare, care este egală cu 3, în cazul imaginilor color RGB. Pe o intrare care este reprezentată
ca un volum 3 -D, 𝐻𝑖 × 𝑊𝑖 ×3 va trebui aplicat un filtru de volum 3 -D: 𝐻𝑓 ×𝑊𝑓 × 3, însă
rezultatul acestei operații de convoluție va fi 2 -D (𝐻0 × 𝑊0). Așadar, dacă aplicăm un număr
de K filtre, vom obține un rezultat de tipul unui volum -3D: 𝐻𝑜 × 𝑊𝑜 × 𝐾, unde a treia
dimens iune este dată de numărul filtrelor aplicate. [ 2]
Prin aplicarea a K filtre de convoluție cu dimensiunile 𝐻𝑓 ×𝑊𝑓 × 𝐾 asupra unei imagini
inițiale care are un număr C de canale de culoare și dimensiunile 𝐻𝑖 × 𝑊𝑖 × 𝐶, se va obține
o ieșire cu dime nsiunile 𝐻𝑜 × 𝑊𝑜 × 𝐾, unde dimensiunile ieșirii sunt următoarele:
𝐻𝑜=(𝐻𝑖 − 𝐻𝑓 + 2𝑝) / 𝑠 + 1 (2.11)
𝑊𝑜=(𝑊𝑖 − 𝑊𝑓 + 2𝑝) / 𝑠 + 1 (2.12)
Următorii para metri sunt recunoscuți drept hiperparametrii stratului convoluțional:
dimensiunile volumui de intrare ( 𝐻𝑖 × 𝑊𝑖 × 𝐶), dimensiunile filtrului ( 𝐻𝑓 ×𝑊𝑓 × 𝐾), pasul
aplicării acestuia, s, precum și „grosimea” de padding p aplicată la capetele dimensiu nilor
spațiale ale intrării. [ 2]
Un strat convoluțional complet conține și o funcție de activare a neuronului, aplicată asupra
rezultatului obținut în urma operației de convoluție, cea mai folosită fiind cea de tip ReLU
(Rectified Linear Unit).
2.5.2 Strat ul de agregare
Straturile de pooling au rolul de a reduce progresiv dimensiunea spațială a hărții de trăsături cu
o statistică a fiecărei zone din aceasta, cu scopul de a reduce numărul parametrilor și a calculului
computațional din rețea și de a evita supraantrenarea (overfitting). Straturile de agregare
funcționează independent pentru fiecare strat din adâncimea rețelei, aceasta fiind
redimensionată prin funcția MAX, care este cea mai utilizată în aplicații, scopul ei fiind de a
înlocui v aloarea dintr -o zona bine definită cu maximul acestei regiuni.

[2] Rețele neuronale convoluționale, Big Data și Deep Learning în analiza automată de imagini,
https://www.researchgate.net/publication/332129835_Retele_neuronale_convolutionale_Big_Data_si_Deep_Lea
rning_in_analiza_automata_de_imagini

16
Rezultatul final îl reprezintă o hartă de trăsături ma i mică, dar care rămâne în continuare
relevantă din punct de vedere al statisticii, informația obținută fiind cea mai semnificativă. [ 3]
Cea mai utilizată implementare este un strat de pooling cu filtre de dimensiunea 2×2, aplicate
cu un pas de 2, fiecare dintre aceste straturi eliminând 75% din activări, fiecare aplicare a
funcției MAX luând, în acest caz, un număr maxim de 4 eșantioane. [ 3]
Prin glisarea „filtrului de agregare” cu dimensiunea 𝑓𝑝 peste matricea de intrare (care
reprezintă ieșirea statu rilor convoluționale, și anume, harta caracteristicilor, de dimensiune 𝑛𝑐),
cu pasul 𝑠𝑝 și mărimea padding -ului 𝑝𝑝 se obține dimensiunea ieșirii 𝑛𝑝:
𝑛𝑝=(𝑛−𝑓𝑝+2𝑝𝑝)/𝑠𝑝+1 (2.13)
În cazul rețelelor neuronale convoluționale, nu există padding ( 𝑝=0), și adesea 𝑠=𝑓, iar
pentru 𝑓=2, 𝑛𝑝 = 𝑛/2, rezultând o dimensiune spațială înjumătățită. [ 3]
În afara funcției MAX, straturile de pooling pot îndeplini și alte funcții, cum ar fi „average
pooling” sau „L2 -norm pooling”. De -a lungul timpului, funcția „average pooling” a fost cea
mai folosită, însă, în practică, aplicarea operației MAX a dat cele mai bune rezultate. [ 3]

Figura 2.9 . Volumul de intrare cu dimensiunile [224x224x64] este supus operației de
pooling cu un filtru cu dimensiunea 2, pasul 2, rezultând un volum de ieșire
[112x112x64], adâncimea volumului este păstrată. În figura din partea dreaptă, este
aplicată funcția MAX, cu pasul 2. [3]
2.5.3 . Stratul/straturile finale complet conectate
În cadrul acestor straturi este realizată clasificarea propriu -zisă. Pentru generarea
clasificatorului final, este folosit un „strat de aplatizare” (flatten layer) care nu aduce modificări
rezultatului final, ci are rolul de a transforma ieșirea 3 -D genera tă la sfârșitul părții
convoluționale, prin translatare 1 -D, într -un vector de caracteristici, care va fi folosit ca intrare
pentru clasificatorul final.

[2] Rețele neuronale convoluționale, Big Data și Deep Learning în analiza automată de imagini,
https://www.researchgate.net/publication/332129835_Retele_neuronale_convolutionale_Big_Data_si_Deep_Le a
rning_in_analiza_automata_de_imagini
[3] Performance Analysis of Various Activation Functions in Generalized MLP Architectures of Neural Networks,
http://www.c scjournals.org/manuscript/Journals/IJAE/Volume1/Issue4/IJAE -26.pdf

17
La ieșirea acestor straturi se aplică funcția softmax, la final rezultând vectorul de probabilități,
fiecare element al acestuia reprezentând probabilitatea ca o imagine de intrare să apar țină la
fiecare clasă.
Antrenarea rețelelor neuronale convoluționale se face pe datele de intrare, care sunt supuse unor
anumite reguli, cum ar fi: extinderea setului inițial de date (data augmentation), normalizarea
inițială sau dropout -ul. Acestea sunt aplicate pentru a evita overfitting -ul.
2.6. Algoritmul Adam
Adam este un algoritm de optimizare care poate fi utilizat în locul metodei clasice de
descendență a gradientului stochastic, pentru a actualiza în mod iterativ ponderile intrărilor
bazate pe dat ele de antrenare. Acest algoritm poate fi implementat cu ușurință, este eficient din
punct de vedere al calculului, are cerințe de memorie reduse, este invariabil la redimensionarea
în diagonală a gradienților și poate fi utilizat cu succes în probleme com plexe, cu un volum
mare de date și o multitudine de parametri. Numele algoritmului este derivat din „adaptive
moment estimation” (estimarea momentului adaptiv). Adam folosește adaptări ale primului și
celui de -al doilea gradient în vederea adaptării ratei de învățare pentru fiecare pondere a rețelei
neuronale. [ 4]
Algoritmul actualizează mediile mobile exponențiale ale gradientului ( 𝑚𝑡) și ale gradientului
pătrat ( 𝑣𝑡), în timp ce hiperparametrii 𝛽1,𝛽2∈ [0,1) controlează ratele de descompunere
exponențiale ale acestor mișcări medii. Mediile mobile în sine sunt estimări ale primului
moment (media) și ale celui de -al doilea moment brut (variația necentrată) a gradientului: [ 4]

𝑚𝑡=𝛽1∙𝑚𝑡−1+ (1−𝛽1) ∙ 𝑔𝑡 (2.14)
𝑣𝑡=𝛽2∙𝑣𝑡−1 + (1−𝛽2) ∙𝑔𝑡2 (2.15)

În continuare, dorim să aflăm cum 𝐸[𝑣𝑡], care reprezintă valoarea așteptată a mediei mobile
exponențiale, la timpul t, se corelează cu valorile reale ale celui de -al doilea moment (varianta
necentrată), pentru a putea corecta diferența dintre cele două. Analog, dorim ca această relație
să se re pete și în cazul primului moment:

𝐸[𝑚𝑡]=𝐸[𝑔𝑡] (2.16)
𝐸[𝑣𝑡]=𝐸[𝑔𝑡2] (2.17)

[4] Adam: A meth od for stochastic optimization, https://arxiv.org/pdf/1412.6980.pdf

18
Cu toate acestea, mediile sunt inițializate ca vectori de 0, ceea ce duce la estimări ale
momentului care tind spre 0, în special în timpul perioadelor inițiale și mai ales când ratele de
descompunere sunt mici ( 𝛽≅1). Corecția bias -ului poate fi ajustată cu ușurință, ceea ce duce
la valorile finale pentru primul, respect al doilea moment:
𝑚𝑡𝑓=𝑚𝑡
1−𝛽1𝑡 (2.18)
𝑣𝑡𝑓=𝑣𝑡
1−𝛽2𝑡 (2.19)
Ultima operație poate fi considerată o optimizare a acestui algorit m, prin mărirea gradului de
învățare individual al fiecărui parametru, cu ajutorul acestor medii mobile. Pentru a actualiza
ponderea, algoritmul Adam folosește următoarea relație:
𝜃𝑡=𝜃𝑡−1−𝛼 ∙𝑚𝑡𝑓
√𝑣𝑡𝑓 + 𝜖 (2.20)

2.7. Arhitecturi RNC de referință
Vom prezenta în continuare în mod comparativ două dintre cele mai importante arhitecturi ale
rețelelor neuronale convoluționale, cu similitudinile și diferențele lor.
2.7.1 . AlexNet (2012)
Această arhitectură a fost dezvoltată de Alex Krizhevsky, câștigând competiția ImageNet
ILSVRC 2012, aducând în prim plan multe elemente de noutate față de arhitecturile clasice
dezvoltate până atunci și reușind să rămână un model de referință în cadrul arhitectur ilor RNC,
chiar și în ziua de astăzi.
Arhitectura rețelei AlexNet este compusă din opt straturi: cinci straturi convoluționale și trei
straturi complet conectate. Setul de date de intrare pentru acest tip de arhitectură este reprezentat
de imagini RGB de dimensiune constantă, și anume 224×224.
Unul din principalele elemente de noutate care a avut un impact semnificativ asupra datelor de
ieșire îl reprezintă folosirea funcției de activare ReLU pentru neuronii din straturile
convoluționale. Astfel, aceasta a înlocuit funcția tanh, un standard pentru vremurile respective.
Principalul avantaj al acesteia în timpul antrenării este faptul că a putut ajunge la o eroare de
25% pe setul de date CIFAR -10, de șase ori mai repede decât o rețea neuronală convoluțională
care folosește tanh. [ 5]

[5] AlexNet: The Architecture that Challenged CNNs, https://towardsdatascience.com/alexnet -the-architecture –
that-challenged -cnns-e406d5297951

19
AlexNet permite antrenarea multi -GPU, jumătate din neuronii modelului aflându -se pe GPU 1,
iar cealaltă jumătate, pe GPU 2. GPU 1 are nuclee independente de culoare, în timp ce GPU 2
conține, în mare parte, nuclee specifice de culoare. Datorită acestui fapt, setul de date de intrare,
poate fi mai mare, iar timpul de antrenare mai redus. [ 4]

Figura 2.10 . Arhitectura rețelei AlexNet [3]
Întrucât AlexNet are aproximati v 60 de milioane de parametri, diverse măsuri au fost
implementate pentru evitarea overfitting -ului. A fost propusă o nouă tehnică de „dropout”,
care presupune setarea pe zero a unor neuroni de pe straturile ascunse, cu o probabilitate
predeterminată (de e xemplu, 50%). Astfel, la fiecare iterație se folosesc parametri diferiți ai
modelului, ceea ce obligă fiecare neuron să aibă caracteristici mai robuste care pot fi utilizate
cu alți neuroni aleatori.
2.7.2. VGGNet (2014)
VGGNet este una dintre arhitecturile câștigătoare ale competiției ILSVRC (Image Large -Scale
Visual Recognition Challenge) în anul 2014, dezvoltată de Simonyan și Zisserman, membri ai
grupului Visual Geometry Group, de aici provenind și numele rețelei. Competiția ILSVRC este
recunoscută pentru plentitudinea datelor, oferind un set de date de antrenare cu 1,2 milioane de
imagini, un set de validare de 50 de mii de imagini și un set de date testare de 150 de mii
de imagini. VGGNet a mizat pe ideea unor rețele mult mai adânci cu fi ltre mult mai mici,
mărind numărul de straturi de la opt, precum în cazul AlexNet, la 16 (VGG16) sau 19 (VGG19).
Acestea sunt formate din 13, respectiv 16 straturi convoluționale, iar ultimele trei sunt complet
conectate.

[3] Performance Analysis of Various Activation Functions in Generalized MLP Architectures of Neural Networks,
http://www.cscjournals.org/manuscript/Journals/IJAE/Vo lume1/Issue4/IJAE -26.pdf

20

Figura 2.11. Macroarhitectura VGG 16 Sursa [3]
Asemenea arhitecturii AlexNet, setul de date pentru VGGNet este reprezentat de imagini RGB
de dimensiune fixă, 224×224, iar singura preprocesare pe care o suferă datele este
normalizarea prin scăderea din valorile pixelilor pentru fiecare canal a valorilor medii obținute
pe setul de date inițial. Straturile convoluționale prezintă filtre cu câmpuri receptoare foarte
mici 3×3, iar mărimea padding -ului și pasul utilizat sunt eg ale cu 1.
Sunt prezente diferențe și în cazul funcției de activare, care deși este aceeași, ReLU, ea este
aplicată în toate straturile, nu numai în cele convoluționale, ci și în cele complet conectate.
Metoda de antrenare esre similară cu cea utilizată pe ntru AexNet, diferența constând în faptul
că imaginile de intrare sunt decupate din imagini multiscală. Ca algoritm pentru învățare, este
utilizată funcția de regresie logistică, împreună cu metoda gradientului pe mini loturi (bazată
pe „backpropagation’). Deși are o adâncime mai mare (mai multe straturi) în comparație cu
AlexNet, VGGNet are nevoie de mai puține epoci pentru a converge, acest lucru datorându -se
în mare parte dimensiunii mici ale filtrelor de convoluție. [ 3]
Cele două variante de VGGNet: 1 6, respectiv 19 produc rezultate similare din punct de vedere
al acurateții, observându -se faptul că deși numărul de straturi a crescut, nu a mai avut loc o
creștere a acesteia. Cu toate acestea, VGG.Net rămâne una dintre cele mai utilizate arhitecturi
pentru clasificarea imaginilor, configurația ponderilor pentru cele două variante ale acesteia
fiind pusă la dispoziția publicului, de aici și utilizarea ei în numeroase aplicații care au ca scop
extragerea caracteristicilor din imagini.

[3] Performance Analysis of Various Activation Functions in Generalized MLP Architectures of Neural Networks,
http://www.cscjournals.org/manuscript/Journals/IJAE/Vo lume1/Issue4/IJAE -26.pdf

21
2.8. Tehnologii
2.8.1. Python
Python este un limbaj de programare de nivel înalt, lansat pentru prima dată în 1991. Se bazează
pe o filosofie care încurajează lizibilitatea codului și o sintaxă care permite programatorilor să
scrie mai puține linii de cod într -un mod eficient și rapid. Python suportă mai multe paradigme
de programare: orientată pe obiecte, programare funcțională sau procedurală și conține o suită
consistentă de biblioteci standard cum ar fi: biblioteci pentru i nterfața grafică, conectare la baza
de date, manipularea expresiilor regulate sau pentru teste unitare. [ 6]
Python folosește delimitarea prin indentare, eliminând astfel acoladele clasice din foarte multe
limaje de programare (C, Java, C#). Acest lucru asi gură un cod lizibil și compact.
Datorită facilităților de programare orientate pe obiect, cât si celor de scripting, Python este
utilizat cu succes în mai multe domenii, dintre care amintim: inteligență artificială,
automatizare (datorită părții de script ing), dezvoltarea aplicațiilor Desktop și Web (cu ajutorul
framework -urilor), embedded (programarea senzorilor cu ajutorul plăcuțelor Raspberry Pi),
analiză științifică a datelor, statistică. Variabilele python nu necesită declarare explicită pentru
a aloc a spațiu în memorie. Declararea se întamplă automat când variabilei i se atribuie o valoare.
În python există cinci tipuri standard de date:
 numere ;
 șiruri de caractere ;
 listă;
 tuplu;
 dicționar .
Aceste tipuri de date sunt destul de comune și sunt specifice multor limbaje de programare de
nivel înalt. Dicționarele python asociază unei chei unice, o valoare. O cheie poate fi aproape
orice tip, dar de obicei se folosesc numere sau șiruri de caractere. Pe de altă parte, valorile pot
fi orice obiect python [ 6].
Avantajele folosirii acestui limbaj sunt:
 lizibilitatea codului ;
 flexibilitate ;
 sintaxa simplă ;
 susține utilizarea a numeroase biblioteci ;
 limbaj multi -paradigmă .

[6] Python Software Foundation. Python Language Reference, version 2.7. Disponibilă la http://www.python.org .

22
Capitolul 3
Proiectare și implementare

Limbajul de programare folosit pentru realizarea proiectului este Python 3.7 datorit ă
facilit ăților pe care acesta le ofer ă în construirea unor algoritmi comlec și. Codul int uitiv și ușor
de citit împreun ă cu m ultitudinea de libr ării și module permite dezvoltatorului de software s ă
prototipeze și să implementeze rapid și eficient proiecte de M achine Learning .
Ca și mediu integrat de dezvoltare, am utilizat “Anaconda Individual Edition”.
3.1. Structura rețelei neuronale
Rețelele neuronale convolutive (CNN) sunt proiectate să funcționeze peste intensitățile
pixelilor bruți ale imaginilor și folosesc filtre care pot fi utilizate pentru clasificarea imaginilor
cu o precizie ridicată.
Modelul prezentat este o variantă redusă a VGGNet pe care am numit -o „SmallVGGNet”.
Modelele de tip VGGNet au două caracteristici comune:
 se folosesc doar 3 × 3 convo luții;
 straturile de convoluție sunt stivuite unul peste altul în arhitectura rețelei înainte de
aplicarea unei operațiuni de colectare distructivă ;
Implementare SmallVGGNet:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import BatchNormalization
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.layers import MaxPooling2D
from tensorflow.keras.layers import Activation
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Dense
from tensorflow.keras import backend as K

După cum se poate vedea din importuri, tot ce este necesar pentru SmallVGGNet provine de la
libraria Keras.
Începem apoi să definim clasa SmallVGGNet și metoda de constructie:

class SmallVGGNet :
@staticmethod
def build(width, height, depth, classes):
# se initializeaza modelul
model = Sequential()

23
inputShape = (height, width, depth)
chanDim = -1

# se foloseste "channels first", se updateaza forma inputului
# si dimensiunile canalelor
if K.image_data_format() == "channels_first" :
inputShape = (depth, height, width)
chanDim = 1

Clasa și metoda build sunt definit e.
Pentru construire sunt necesari patru parametri:
– lățimea imaginilor de intrare;
– înălțimea imaginilor;
– adâncimea ;
– numărul de clase.
Adâncimea poate fi considerată și numărul de canale. Imaginile noastre sunt în spațiul color
RGB, astfel încât vom trece la o adâncime de 3 atunci când apelăm la metoda de construire.
Se inițializeză u n model secvențial.
Este determinată comanda canalului. Keras acceptă comanda "canale_last" (adică TensorFlow)
și "canale_first" (adică Theano). Liniile ce urmeaza permit modelului să accepte orice tip de
backend.
Urmează să adăugăm câteva straturi în rețe a:

# CONV => RELU => POOL
model.add(Conv2D( 32, (3, 3), padding="same",
input_shape =inputShape))
model.add(Activation( "relu"))
model.add(BatchNormalization( axis=chanDim))
model.add(MaxPooling2D( pool_size =(2, 2)))
model.add(Dropout( 0.25))

Primele straturi (CONV => RELU => POOL) sunt adăugate de acest bloc.
Primul strat CONV are 32 filtre de dimensiune 3×3.
Este important de specificat inputShape pentru primul strat, deoarece toate dimensiunile
ulterioare ale stratului vor fi calculate utilizând o abordare de tip trickle -down .
Vom folosi funcția de activare ReLU (Rectified Linear Unit) în această arhitectură de rețea.
Există o serie de metode de a ctivare, fiecare avand propriile caracteristici.
Normalizarea lotului, MaxPooling și Dropout sunt de asemenea aplicate.

24
Normalizarea lotului este utilizată pentru a normaliza activările unui volum de intrare dat
înainte de a -l trece la următorul strat din rețea. S -a dovedit a fi foarte eficient la reducerea
numărului de epoci necesare pentru instruirea unei re țele neuronale convolu ționale, precum și
la stabilizarea instruirii în sine.
Straturile POOL au o funcție primară de a reduce progresiv dimensiunea s pațială (adică lățimea
și înălțimea) volumului de intrare la un strat. Este comună introducerea straturilor POOL între
straturile CONV consecutive într -o arhitectură convolu țională.
Dropout este un concept interesant care nu trebuie trecut cu vederea. În e fortul de a forța rețeaua
să fie mai robustă, putem aplica dropout , procesul de deconectare a neuronilor aleatori între
straturi. Acest proces a dovedit că reduce supra -montarea, crește precizia și permite rețelei să
se generalizeze mai bine pentru imagini necunoscute. După cum se notează parametrul, 25%
din conexiunile nodului sunt deconectate aleatoriu (abandonate) între straturi în timpul fiecărei
iterații de antrenament.
Continuând, ajungem la următorul bloc de straturi (CONV => RELU) * 2 => POOL:
# (CONV => RELU) * 2 => POOL
model.add(Conv2D( 64, (3, 3), padding="same"))
model.add(Activation( "relu"))
model.add(BatchNormalization( axis=chanDim))
model.add(Conv2D( 64, (3, 3), padding="same"))
model.add(Activation ("relu"))
model.add(BatchNormalization( axis=chanDim))
model.add(MaxPooling2D( pool_size =(2, 2)))
model.add(Dropout( 0.25))

Se observa că dimensiunile filtrului rămân aceleași (3×3, care este comun pentru rețelele de tip
VGG); cu toat e acestea, crește numărul total de filtre învățate de la 32 la 64.
Aceasta este urmată de un set de straturi (CONV => RELU => POOL) * 3:
# (CONV => RELU) * 3 => POOL
model.add(Conv2D( 128, (3, 3), padding="same"))
model.add(Activation( "relu"))
model.add(BatchNormalization( axis=chanDim))
model.add(Conv2D( 128, (3, 3), padding="same"))
model.add(Activation( "relu"))
model.add(BatchNormalization( axis=chanDim))
model.add(Conv2D( 128, (3, 3), padding="same"))
model.add(Activation( "relu"))
model.add(BatchNormalization( axis=chanDim))
model.add(MaxPooling2D( pool_size =(2, 2)))
model.add(Dropout( 0.25))

25
Din nou, se observ ă cum toate straturile CONV învață pe filt ru de 3×3, dar numărul total de
filtre învățate de straturile CONV s -a dublat de la 64 la 128. Creșterea numărului total de filtre
de învățare arată cât de adânc se merge într -o rețea neuronal ă convolu țională (și pe măsură ce
volumul de intrare devine mai mi c și mai mic ).
Și în final avem un set de straturi FC => RELU:

# FC => RELU layers
model.add(Flatten())
model.add(Dense( 512))
model.add(Activation( "relu"))
model.add(BatchNormalization())
model.add(Dropout( 0.5))

# clasificator softmax
model.add(Dense(classes))
model.add(Activation( "softmax" ))

# se returneaza arhitectura retelei neuronale
return model

Straturile complet conectate sunt notate de Dense în Keras. Stratul final este complet conectat
cu cele trei ieșiri (deoarece avem trei clase în setul nostru de date). Stratul softmax returnează
probabilitățile de clasă pentru fiecare etichetă.
Acum că SmallVGGNet este implementat, se poate scrie scriptu l care va fi folosit pentru a
antrena în setul de date Flori .
Setul de date folosit este compus din 3000 de imagini reprezent ând 3 specii de plante, fiecare
specie av ând 1000 de imagini. Scopul acestui set de date este s ă clasifice corect imagini ce
conțin una din cele trei plante.

3.2. Structura proiectului
Folosim comanda “tree” pentru a vedea structura proiectului î n terminal:
.
├── flori
│ ├── papadie [~1000 exemple]
│ ├── musetel [ ~1000 exemple]
│ └── trandafir [ ~1000 exemple]
├── imagini_test

26
│ ├── papadie .jpg
│ ├── musetel.jpg
│ └── trandafir.jpg
├── output
│ ├── smallvggnet .model
│ ├── smallvggnet _lb.pickle
│ └── smallvggnet _plot.png
├── im g
│ ├── __init__.py
│ └── smallvggnet .py
├── predict.py
└── train .py
Figura 3.1. Structura arbore
Dosarul ‘flori’ este organizat într -o structuă ramificată . În dosarul ‘flori’ avem trei clase î n
dosarele: ‘ papadie ’, ‘musetel’ și ‘trandafir’. Î n fiecare din aceste trei do sare sunt 1000 de
imagini reprez entative clasei.
În dosarul ‘ test’ sunt 3 imagini din fiecar e clas ă în scop de testare. Dup ă încărcarea unui model
antrenat putem clasifica o imagine care nu f ace parte din setul de date iniț ial.
Dosarul ‘ output ’ conț ine trei tipuri de fi șiere care sunt generate dup ă antrenarea re țelei
neuronale:
 .model : Un fișier de model Keras serializat este generat după instruire și poate fi utilizat
în scripturile de inferență viitoare.
 .pickle : Un fișier binarizator etichetat serializat. Acest fișier conține un obiect care
conține nume de clasă. Însoțește un fișier model.
 .png: Plaseaza imaginile de formare /validare în folderul de ieșire, deoarece este o ieșire
a procesului de instruire.
Dosarul img este un modul ce se află în folderul proiectului și clasele conținute în interior pot
fi importate în script.
3.3. Încărcarea datelor
Există convenții pentru stocarea și structurarea setului de date al imaginii pe disc, pentru a face
încărcarea rapidă și eficientă și formarea și evaluarea modelelor Deep Learning .
Odată structurat e, se poti utiliza instrumente precum clasa ImageDa taGenerator din biblioteca
Keras pentru a se încărca automat seturile de date de antrenare, testare și validarea. În plus,

27
generatorul va încărca progresiv imaginile din setul de date, permițând lucrul atât cu seturi de
date mici cât și foarte mari care co nțin mii de imagini care s -ar putea să nu se încadreze în
memoria sistemului (figura 3.2).

Figura 3. 2. Încărcarea datelor

3.3.1. Importul pachetelor necesare
# sunt importate pachetele necesare
from pyimagesearch.smallvggnet import SmallVGGNet
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.optimizers import SGD
from imutils import paths
import matplotlib.pyplot as plt
import numpy as np
import argparse
import random
import pickle
import cv2
import os

 sklearn : Biblioteca Scikit -Learn ne va ajuta să b inarizăm etichetele noastre, să împărțim
date pentru instruire/testare și să generam un raport de instruire în termi nalul nostru [7];
 Tensorflow.keras – Keras este un modul de nivel î nalt pentru TensorFlow și alte libră rii
de DeepLearning [8];

[7] https://scikit -learn.org/stable/supervised_learning.html#supervised -learning
[8] https://keras.io/about/

Încărcarea
imaginilor

RAM

28
 Numpy – este o libr ărie scris ă în limbajul de programare C++, ce adaug ă suport pentru
matrici și matrici multidimensionale mari, împreună cu o colecție mare de funcții matematice
la nivel înalt care să funcționeze pe aceste tablouri [9];
 cv2 – o altă librărie scris ă în C++, o librarie cu funcții de programare care vizează în
principal vede rea în timp real a computerului [10];
 matplotlib – este o bibliotecă de ploturi pentru limbajul de programare Python și extensia
sa matematică NumPy. Oferă un API orientat pe obiecte pentru încorporarea de ploturi în
aplicații folosind seturi de instrumente GUI cu scop general [11];
3.3.2. Plasarea argume ntelor în linia de comand
# construirea argumentele
ap = argparse.ArgumentParser()
ap.add_argument( "-d", "–dataset" , required =True,
help="path to input dataset of images")
ap.add_argument( "-m", "–model", required =True,
help="path to output trained model")
ap.add_argument( "-l", "–label-bin", required =True,
help="path to output label binarizer" )
ap.add_argument( "-p", "–plot", required =True,
help="path to output accuracy/loss plot")
args = vars(ap.parse_args())

Scriptul va gestiona dinamic informațiile suplimentare furnizate prin intermediul liniei de
comandă atunci când vom executa scriptul nostru. Informațiile suplimentare sunt sub formă de
argumente în linia de comandă. Modulul argparse este încorporat în Pyth on și va gestiona
analizarea informațiilor pe care le furnizam în șirul de comandă.
Avem patru argumente de linie de comandă pentru a analiza:
–dataset : Calea către setul de date de imagini de pe disc.
–model : Modelul nostru va fi serializat și va fi tra nsmis pe disc. Acest argument conține calea
către fișierul model de ieșire.
–label -bin: Etichetele de seturi de date sunt serializate pe disc pentru a fi rechemate ușor în alte
scripturi. Aceasta este calea către fișierul de fișier binarizator eticheta de ieșire.
–plot: Calea către fișierul de imagine de ieșire. Vom printa acest plot pentru a verifica dacă
ne-am îndeplinit adecvat datele noastre.

[9] https://numpy.org/doc/stable/
[10] https://opencv.org/links/
[11] https://matplotlib.org/contents.html

29
3.3.3. Încărcarea imaginilor și a etichetelor
# amestecarea random a imaginilor
imagePaths = sorted(list(paths.list_images(args[ "dataset" ])))
random.seed( 42)
random.shuffle(imagePaths)

# iterarea imaginilor de intrare
for imagePath in imagePaths:
# se incarca imaginile
# sunt redimensionate la 64×64 de pixeli
# sunt introduse in lista de date
image = cv2.imread(imagePath)
image = cv2.resize(image, (64, 64))
data.append(image)

# se extrage eticheta din path-ul imaginii
# este introdusa in lista de etichete
label = imagePath.split(os.path .sep)[-2]
labels.append(label)

Inițializăm dou ă liste ce con țin imagini și etichete. Aceste liste vor fi transformate ulterior în
tablouri multidimensionale. Prelu ăm căile imaginilor și le amestec ăm random. Funcția
paths.list_images va găsi toate căile către toate imaginile de intrare în directorul nostru ( –
dataset) înainte de a le sorta și a le amesteca.
Am setat un seed, astfel încât reordonarea aleatorie să fie reproductibilă. Urmeaz ă să facem o
buclă peste toate imaginile din setu l de date.
Pentru fiecare imagePath încărcăm imaginea în memorie, o redimensionam la 32×32 de pixeli
(ignorând raportul de aspect) deoarece aceast ă rețea neuronal ă are nevoie de aceste dimensiuni.
Adaug ăm imaginea redimensionata la lista data. Extragem e ticheta de clasă a imaginii din
path și o adaugam pe lista de etichete. Lista de etichete conține clasele care corespund fiecărei
imagini din lista de date.

# scalarea intensitatii pixelilor in plaja [0, 1]
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)

Aplic ăm operațiuni matematice la matricile date și etichete.
Scalăm intensitatea brut – a pixelilor pe o scar ă e la 0 la 1.

30
3.4. Separarea setului de date în antrenare și testare

Figura 3. 3. Separarea setului de date în antrenare și testare
Se aloc ă un procent din date pentru instruire și un procent mai mic din date pentru testare.
Scikit -learning oferă o funcție utilă train_test_split care va împărți datele.
# partitionarea datelor in date de antrenare si date de testare
# 75% antrenare si 25% testare
(trainX, testX, trainY, testY) = train_test_split(data,
labels, test_size =0.25, random_state =42)

Împărți m datel e în diviziuni de instruire și testare folosind 75% din datele pentru instruire și
restul de 25% pentru testare.
Atât trainX cât și testX compun datele imaginii în sine, în timp ce trainY și testY compun
etichetele .
Etichetele clasei sunt în prezent repreze ntate ca șiruri. Keras va presupune că etichetele sunt
codate ca numere întregi si codificarea one-hot este realizată pe aceste etichete, făcând fiecare
etichetă reprezentată ca un vector și nu ca un număr întreg. Pentru a realiza această codificare,
putem folosi clasa LabelBinarizer de la scikit -learning:
# convertirea etichetelor
# din numere intregi in vectori

lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)

Un apel la fit_transform găsește toate etichetele de clasă unice în trainY și apoi le transformă în
etichete codate cu un one-hot.
Un apel la just.transform pe te stY efectuează doar pasul de codificare unic – setul unic de
etichete de clasă posibile a fost deja determinat de apelul la fit_transform .
Amestecare Aleatorie

Setul de Date

Date Testare Date Antrenare

31
3.5. Augmentarea datelor
# generatorul de imagini pentru augmentarea datelor
aug = ImageDataGenerator( rotation_range =30, width_shift_range =0.1,
height_shift_range =0.1, shear_range =0.2, zoom_range =0.2,
horizontal_flip =True, fill_mode ="nearest" )

Augmentarea datelor ne permite să construim date de instruire „suplimentare” din datele noastre
de pregătire existente prin rotire aleatorie, deplasare, forfecare, zoom și întoarcere.
Augmentarea datelor este adesea un pas esențial pentru evitarea supraajustării si asigurarea ca
modelul se generalizează bine.
3.6. Conv Net
Pentru a construi ConvNet , apelăm pur și simplu ConvNet .build si trecem parametrii necesari.
# initializarea retelei neuronale convolutionale
model = SmallVGGNet.build( width=64, height=64, depth=3,
classes=len(lb.classes_))

# initializare hiperparametri

INIT_LR = 0.01
EPOCHS = 30
BS = 32

# initializarea modelului si optimizatorului

print("[INFO] training network…" )
opt = SGD(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile( loss="categorical_crossentropy" , optimizer =opt,
metrics=["accuracy" ])

# anrtenarea retelei
H = model.fit( x=aug.flow(trainX, trainY, batch_size =BS),
validation_data =(testX, testY), steps_per_epoch =len(trainX) // BS,
epochs=EPOCHS)

În primul rând, stabilim rata de învățare, numărul de epoci și dimensiunea lotului.
Urmeaza să compilăm și să formăm modelul. Apelul model.fit se ocupă atât de instruire, cât și
de creștere a datelor. Trebuie să trecem generatorul cu datele de formare ca prim parametru.
Generatorul va produce loturi de date de instruire augmentate în conformitate cu setările pe care
le-am făcut anterior.
3.7. Evaluarea modelului
Vom evalua modelul, vom parcurge curbele de pierdere/precizie și vom salva modelul.

32
# evaluarea retelei
print("[INFO] evaluating network…" )
predictions = model.predict( x=testX, batch_size =32)
print(classification_report(testY.argmax( axis=1),
predictions.argmax( axis=1), target_names =lb.classes_))

# plotare
N = np.arange( 0, EPOCHS)
plt.style.use( "ggplot" )
plt.figure()
plt.plot(N, H.history[ "loss"], label="train_loss" )
plt.plot(N, H.history[ "val_loss" ], label="val_loss" )
plt.plot(N, H.history[ "accuracy" ], label="train_acc" )
plt.plot(N, H.history[ "val_accuracy" ], label="val_acc" )
plt.title( "Training Loss and Accuracy (SmallVGGNet)" )
plt.xlabel( "Epoch #")
plt.ylabel( "Loss/Accuracy" )
plt.legend()
plt.savefig(args[ "plot"])

# salvarea modelului
print("[INFO] serializing network and label binarizer…" )
model.save(args[ "model"], save_format ="h5")
f = open(args["label_bin" ], "wb")
f.write(pickle.dumps(lb))
f.close()

Facem predicții cu privire la setul de testare, apoi scikit -learn este folosit pentru a calcula și
tipări raportul de clasificare.
Matplotlib este utilizat pentru trasarea curbelor de pierdere/precizie.
3.8. Etichetare
Aplicarea rețelei neuronale convoluț ional e se face pe imagini de tes t pe care nu a fost a ntrenată .
Rețeaua este utilizat ă, în principa ,l pentru a identifica deplasarea, zoomul și alte forme de
invarianță. Deoarece stratul de detectare a funcțiilor retelei învață prin datele de instruire, acesta
evită extragerea caracteristică explicită și impl icit învață din datele de instruire. Mai m ult,
neuronii din același plan au greutatea identică, deci rețeaua poate studia concomitent . Din cauza
structurii speciale, greutăți le partajate o fac să aibă un avantaj unic în procesarea imaginilor.

from tensorflow.keras.models import load_model
import argparse
import pickle
import cv2

33
Importul pachetelor necesare:

ap = argparse.ArgumentParser()
ap.add_argument( "-i", "–image", required =True,
help="path to input image we are going to classify" )
ap.add_argument( "-m", "–model", required =True,
help="path to trained Keras model")
ap.add_argument( "-l", "–label-bin", required =True,
help="path to label binarizer" )
ap.add_argument( "-w", "–width", type=int, default=28,
help="target spatial dimension width")
ap.add_argument( "-e", "–height", type=int, default=28,
help="target spatial dimension height")
ap.add_argument( "-f", "–flatten" , type=int, default=-1,
help="whether or not we should flatten the image")
args = vars(ap.parse_args())

Construirea ș i plasarea argumentelor se face cu m odulul argparse care facilitează scrierea
interfețelor de linie de comandă. Programul definește ce argumente are nevoie, iar argparse își
va dă seama cum să -i analizeze pe cei din sys.argv . Modulul argparse generează automat
mesaje de ajutor și de utilizare și emite erori atunci când utilizatorii oferă argumente invalide
programului.

image = cv2.imread(args[ "image"])
output = image.copy()
image = cv2.resize(image, (args["width"], args["height" ]))

# scalarea valorilor pixelilor in plaja [0, 1]
image = image.astype( "float") / 255.0

# verificare flatten
if args["flatten" ] > 0:
image = image.flatten()
image = image.reshape(( 1, image.shape[ 0]))

# adaugare dimensiuni

else:
image = image.reshape(( 1, image.shape[ 0], image.shape[ 1],
image.shape[ 2]))

Încărcarea și ajustarea imaginilor se face cu ajutorul librariei OpenCV. Func ția flatten
aplatizeaz ă straturile care sunt toate stivuite, unul peste celălalt, dacă le aplatizam, le îmbinam

34
toate înt r-un singur strat. T oate informațiile vizibile , care existau înainte de aplatizare , s-au
îmbinat între ele. Toate procesele ascunse, efectele stratu lui etc. (orice este ascuns) va fi inclus
în proces. Straturile de îmbinare s unt similare, dar afectează numai straturile selectate în prezent
sau stratul direct sub stratul selectat în prezent .

print("[INFO] loading network and label binarizer…" )
model = load_model(args[ "model"])
lb = pickle.loads( open(args["label_bin" ], "rb").read())

preds = model.predict(image)

i = preds.argmax( axis=1)[0]
label = lb.classes_[i]

# printare eticheta si probabilitate pe poza
text = "{}: {:.2f}%".format(label, preds[0][i] * 100)
cv2.putText(output, text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7,
(0, 0, 255), 2)

# afisare imagine
cv2.imshow( "Image", output)
cv2.waitKey( 0)

Se încarc ă modelul, se face o predic ție pe imagine și se g ăsește eticheta cu cea mai mare
probabilitate. Pe imaginea ce urmeaz ă a fi afi șată se printeaz ă eticheta și probabilitatea care
reprezint ș procentual c ât de sigur ă este re șeaua c ă acea imagine este clasificat ă corect.

Figura 3.4. Plantă determinată

35
Capitolul 4
Rezultate
Pentru obținerea rezultatelor am folosit setul de date ce conține imagini cu cele trei tipuri de
plante care este grupat în trei directoare, fiecare fiind specific unui tip. Un exempl u de imagini
sunt ilustrate în f igurile 4.1- 4.3.

Figura 4.1. Imagini – Mușețel [12]

Figura 4. 2. Imagini – Păpădie [13]

Figura 4. 3. Imagini – Trandafiri [14]

[12]https://www.csid.ro/plante -medicinale -fitoterapice -si-gemoterapice/musetel -matricaria -chamomilla
[13] https://vitasana.ro/papadie/
[14] https://magazinuldeplante.ro/produs/trandafiri

36

Înainte de a comenta rezultatele obținute, este importantă familiarizarea cu anumiți termeni
pentru înțelegerea mai profundă a acestora:
– True Negative ( 𝑡𝑛): are loc atunci când valoarea actuală este fals ă, iar modelul o prezice la
fel. Î n cazul nostru, avem o imagine în care este o floare , iar modelul prezice același lucru .
– False Positive: (𝑓𝑝): are loc atunci când valoarea actuală este falsă, iar modelul o prezice ca
fiind adevărată, acest fenomen fiind cunoscut ca „Eroare de tipul I” .
– False Negative (𝑓𝑛): are loc atunci când valoarea actuală este adevărată, iar modelul o prezice
ca fiind falsă, acest fenomen fiind cunoscut ca „Eroare de tipul II” .
– True Positive (𝑡𝑝): are loc atunci când val oarea actuală este adevărată, iar modelul o prezice
la fel .
Precizia reprezintă o metrică ce definește raportul dintre valorile „True positive” și suma
valorilor pozitive.
𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 = 𝑡𝑝
𝑡𝑝+ 𝑓𝑝 (4.1)
Recall reprezintă raportul dintre observațiile pozitive prezise corect și toate observațiile din
clasa reală care au fost efectiv preluate.
𝑅𝑒𝑐𝑎𝑙𝑙 = 𝑡𝑝
𝑡𝑝+ 𝑓𝑛 (4.2)
F1 score este definit ca media armonică ponderată dintre precizie și recall. F score ne oferă o
măsură mai realistă asupra rezultatelor, utilizând atât precizia, cât și recall.
𝐹1 = 2
𝑟𝑒𝑐𝑎𝑙𝑙−1+ 𝑝𝑟𝑒𝑐𝑖𝑠 𝑖𝑜𝑛−1 = 2 ∙ 𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 ∙ 𝑟𝑒𝑐𝑎𝑙𝑙
𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 + 𝑟𝑒𝑐𝑎𝑙𝑙 (4.3)
Acuratețea reprezintă cea mai intuitivă măsură a performanței și este raportul dintre observațiile
corect prezise și observațiile totale.
𝐴𝑐𝑐𝑢𝑟𝑎𝑐𝑦 = 𝑡𝑝+ 𝑡𝑛
𝑡𝑝+ 𝑡𝑛 + 𝑓𝑝 + 𝑓𝑛 (4.4)
Metoda „Micro average” presupune însumarea diferitelor valori pentru seturi de date diferite
și aplicarea lor pentru a obține diferite statistici. De exempl u, această metodă se poate aplica
asupra preciziei, formula devenind:
𝑀𝑖𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 =𝑡𝑝1+𝑡𝑝2
𝑡𝑝1+𝑡𝑝2+𝑓𝑝1+𝑓𝑝2 (4.5)
𝑀𝑖𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑟𝑒𝑐𝑎𝑙𝑙 =𝑡𝑝1+𝑡𝑝2
𝑡𝑝1+𝑡𝑝2+𝑓𝑛1+𝑓𝑛2 (4.6)

37
În cazul metricii 𝐹1 score, acesta devine media armonică a celor două măsuri de mai sus,
𝑀𝑖𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 , respectiv 𝑀𝑖𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑟𝑒𝑐𝑎𝑙𝑙 .
𝐹1=2 ∙𝑀𝑖𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 ∙𝑀𝑖𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑟𝑒𝑐𝑎𝑙𝑙
𝑀𝑖𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 + 𝑀𝑖𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑟𝑒𝑐𝑎𝑙𝑙 (4.7)
Metoda „Macro average” este mai simplă și mai rapidă, luând v alorile medii ale sistemului
pentru diferite seturi. De exemplu, pentru precizie sau recall, formulele devin:
𝑀𝑎𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 = 𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 1+𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 2
2 (4.8)
𝑀𝑎𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑟𝑒𝑐𝑎𝑙𝑙 = 𝑅𝑒𝑐𝑎𝑙𝑙 1+ 𝑅𝑒𝑐𝑎𝑙𝑙 2
2 (4.9)
Și în acest caz, metrica 𝐹1 este definită de media armonică a celor două mărimi de mai sus,
𝑀𝑎𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 , respectiv 𝑀𝑎𝑐𝑟𝑜 −𝑎𝑣𝑒𝑟𝑎𝑔𝑒 𝑜𝑓 𝑟𝑒𝑐𝑎𝑙𝑙 .
Pentru a evita overfitting -ul, am antrenat rețeaua neuronală pe parcursul a 30 de epoci, atât când
am folosit ReLU ca funcție de activare, cât și pentru funcția sigmoidă. De asemenea, setul de
imagini de antrenament a fost împărțit în d ouă categorii: 75% fiind folosite pentru antrenare,
iar restul, pentru testare. Deși am pornit inițial de la 100 de epoci, overfitting -ul era foarte
accentuat, iar precizia rețelei avea valori asemănătoare.

Figura 4. 4. Evoluția preciziei și a pierderilor pe parcursul antrenării pentru prima rețea
neuronală

38

Figura 4. 5. Captură realizată în timpul antrenării primei rețele neuronale

În cazul rețelei neuronale unde am folosit ReLU ca funcție de activare, am obținut o er oare de
0,1387 și o precizie de 0,9524. După cum se poate observa în imaginea de mai jos, pe parcursul
ultimelor epoci, rețeaua este stabilizată, rezultatele de la o epocă la alta fiind destul de apropiate.
Procesul de antrenare pentru ambele variante ale rețelei neuronale a fost monitorizat cu ajutorul
pachetului Tensorboard, linia albastră reprezentând fluctuația pentru datele de antrenare, iar cea
roșie, pentru datele de validare. După cum se poate observa din graficul obținut la sfârșitul
antrenării ( figura 4. 5), deși precizia pe datele de antrenare pornește de la un procent destul de
ridicat, cele două se stabilizează pe parcursul celor 30 de epoci, cele două ajungând la un
rezultat de aproximativ 95%.
De asemenea, mai mulți indici ce prezintă gradul d e performanță al rețelei sunt prezentați în
tabelul de mai jos.

Tabelul 4.1 Rezultatele clasificării rețelei neuronale cu ReLU ca funcție de activare
Precision Recall F1-score Support
0 0.92 1.00 0.95 230
1 1.00 0.91 0.95 232
3 0.96 0.95 0.95 233
Accuracy 0.95 462
Macro avg 0.96 0.95 0.95 462
Weighted avg 0.96 0.95 0.95 462

În cadrul aceleiași rețele neuronale, am hotărât să schimb funcția de activare pentru a observa
impactul acesteia asupra rezultatelor finale, dar și pentru a putea prezenta rezultatele în mod

39
comparativ. Astfel, am păstrat aceeași structură pentru rețeaua neuronală (are același număr de
straturi, acestea fiind configurate în același mod) și am ales funcția sigmoidă în locul funcției
ReLU. Aceasta a fost aplicată pentru fiecare strat al rețelei, în afară de ultimul, unde am hotărât
să păstrez funcția softmax pentru ambele variante ale rețelei neuronale. După cum se poate
observa din captura realizată în timpul antrenarii acestei versiuni a rețelei neuronale, precizia
tinde să fluctueze mai mult decât atunci când am folosit ReLU ca funcție de activare, chiar ș i
pe parcursul ultimelor epoci rezultatele nefiind constante. Cu toate acestea, rezultatele finale
sunt favorabile și în acest caz, obținându -se o eroare de 0,1728 și o precizie de 0, 9372, care,
deși mai mici, sunt apropiate de cele obținute cu funcția Re LU.

Figura 4. 6. Captură realizată în timpul antrenării celei de -a doua rețele neuronale

Pentru cea de -a doua rețea neuronală, care folosește funcția sigmoidă ca funcție de activare,
linia roșie reprezintă fluctuația datelor de antrenare, iar cea albastră este folosită pentru
reprezentarea fluctuației în cazul datelor de validare. Deși cele două ajung să aibă valori
asemenătoare la finalul antrenării, realizată, de asemenea, pe parcursul a 30 de epoci, se poate
observa că funcția de cost pleacă de la o valoare destul de ridicată, în jur de 2, în timp ce pentru
funcția ReLU, valoarea inițială a acesteia era mai mică de 1.

40

Figura 4. 7. Evoluția preciziei și a pierderilor pe parcursul antrenării pentru cea de -a
doua rețea neuronală

Tabelul 4.2 Rezultatele clasificării rețelei neuronale cu funcție de activare sigmoidă
Precision Recall F1-score Support
0 0.90 0.98 0.94 230
1 0.98 0.89 0.93 232
Accuracy 0.94 462
Macro avg 0.94 0.94 0.94 462
Weighted avg 0.94 0.94 0.94 462

Figura 4. 8. Rezultatele clasificării utilizând funcția sigmoidă

41

De asemenea, diferențele de precizie ale modelului sunt cel mai bine vizibile în practică, atunci
când aplicăm cele două opțiuni asupra aceleiași imagini. Deși cele două variante ale rețelei au
valori apropiate ale preciziei: 0, 95 cu ReLU ca funcție de activare și 0,93 cu funcția sigmoidă,
în practică, diferențele pot fi majore. De exemplu, putem observa că aceeași plant ă este
clasificat ă cu funcția de activare ReLU cu o precizie de 99,94%, atunci când f olosim funcția
sigmoidă, procentul scade semnificativ, ajungând la 91,40%.

Figura 4. 9. Rezultatele clasificării utlizând funcția ReLU

42
Capitolul 5
Concluzii

În urma rezultatelor obținute, putem spune că soluția propusă pentru determinarea plantelor are
succes pentru o gamă variată de imagini. Având în vedere că am folosit o baza de date solidă,
cu imagini destul de variate, aplicația a reușit să ofere rezultate favorabile la nivelul tuturor
categoriilor de plante.

Faptul că, atât pentru s etul de antrenament, cât și pentru setul de validare au fost folosite relativ
multe imagini, cele două rețele neuronale care diferă doar prin funcția de activare au reușit să
obțină rezultate considerabile. Pentru obținerea unor rezultate care să prezinte o precizie mai
ridicată, setul de imagini poate fi extins în funcție de mediul sau regiunea geografică în care
este pus în aplicare sistemul.

Ca urmare a faptului că structura rețelei neuronale este simplă, timpul necesar antrenării
acesteia este destul d e scurt, iar obținerea unui rezultat este rapidă, această soluție poate fi
folosită cu succes și de sisteme în timp real, unde este necesară clasificarea unor plante într -un
timp optim.

Pe viitor, mi -aș propune să dezvolt și o aplicație web cu aceste cara cteristici, întrucât acestea
prezintă un grad ridicat de portabilitate, dar și să extind aplicația actuală cu alte funcționalități
care să o facă eligibilă în situații reale. O funcționalitate pe care aș dori să o adaug ulterior
acestei aplicații ar putea fi identificarea bolilor.

43

Bibliografie

[1] Performance Analysis of Various Activation Functions in Generalized MLP Architectures
of Neural Networks,
http://www.cscjournals.org/manuscript/Journals/IJAE/Volume1/Issue4/IJAE -26.pdf
[2] Rețele neuronale convoluționale, Big Data și Deep Learning în analiza automată de
imagini, https://www.researchgate.net/publication/332129835_
[3] Model View Controller Framework – Introduction,
https://www.tutorialspoint.com/mvc_framework/mvc_framework_introduction.htm
[4] Adam: A method for stochastic opt imization, https://arxiv.org/pdf/1412.6980.pdf
[5] AlexNet: The Architecture that Challenged CNNs,
https://towardsdatascience.com/alexnet -the-architecture -that-challenged -cnns-e406d5297951
[6] Python Software Foundation. Python Language Reference, version 3.7.
http://www.python.org .
[7] https://scikit -learn.org/stable/supervised_learning.html#supervised -learning
[8] https://keras.io/about/
[9] https://numpy.org/doc/stable/
[10] https://opencv.org/links/
[11] https://matplotlib.org/contents.html
[12] https://www.csid.ro/plante -medicinale -fitoterapice -si-gemoterapice/musetel -matricaria –
chamomilla
[13] https://vitas ana.ro/papadie/
[14] https://magazinuldeplante.ro/produs/trandafiri
[16] Tudor N.L., Programarea calculatoarelor și calcul numeric , Editura Matrix Rom, 2015;
[17] Tudor N.L., Rețele neuronale artificiale . Aplicatii Matlab , Editura Matrix Rom, 2013 ;
[18] Popescu D., Flonta M.L., Teoria Rețelelor Neuronale Artificiale , vol 1, Editura
Universitatii din Bucuresti, 2009 ;
[19] Curteanu, S., Inițiere în Matlab , Editura Polirom, Iași, 2008;
[20] Dumitrescu D., Princ ipiile inteligenței artificiale , Editura Albastră, Cluj -Napoca, 2002 ;
[21] Enăchescu C., Calculul Neuronal , 2008;

44
[22] Tiponu V., Căleanu C.D., Rețele neuronale. Arhitecturi și algoritmi, Editura Politehnică
timișoara, 2000 ;
[23] Enăchescu C., Learning Properties for Radial Basis Functions Neural Networks,
microCAD , 2002 ;
[24] Neagoe V., Stănășilă O., Recunoa șterea formelor și reț ele neurale – algoritmi
fundamentali , Ed. Matrix Rom, București, 1998 ;
[25] Holban Ș., Vancea R., Iancu F., Inteligența artificială. Partea a doua: Tehnici în
inteligența artificială, Timișoara, 1994 ;
[26] Shah C., A Hands -On Introduction to Data Science , Cambridge University Press, 2020 ;
[27] VanderPlas J., Python Data Science Handbook , O’Reilly Media, 2017 ;
[28] Sewak M., Md. Rezaul Karim, Pujari P., Practical Convolutional Neural Networks , Packt
Publishing Ltd, 2018 ;
[29] Ciaburro G., Keras 2.x Project , Packt Publishing Ltd, 2018 ;
[30] Hope T., Yehezkel S. Resheff & Itay Lieder, Learning TensorFlow, O’Reilly Media, 2017 ;
[31] Géron A., Hands -On Machine Learning with Scikit -Learn & TensorFlow, O’Reilly Media,
2017 ;
[32] Gershgorn D., It's not about the algorithm. The data that transformed AI research – and
possibly the world , 2017 ;
[33] Gulli A., Pal S., Deep Learning with Keras, Packt Publishing Ltd, 2017
[34] Simonyan K., Zisserman A., Very deep convolutional networks for large -scale image
recognition, Proc. ICLR , 2015 ;
[35] Grus J., Data Science from Scratch, O’Reilly Media, 2015.
[36] wikipedia.

Similar Posts