Hanes.eunice7@yahoo.ro 975 Licentaa Yolo Masini Text
1 Cuprins 1 Summary ……………………………………………………………………………………………………………………………..3 1.1 State of the Art ………………………………………………………………………………………………………………3 1.2 Theoretical Fundamentals ……………………………………………………………………………………………….3 1.2.1 Introduction ……………………………………………………………………………………………………………3 1.2.2 YOLO (You Only Look Once) ……………………………………………………………………………………..4 1.3 Implementation ……………………………………………………………………………………………………………..5 1.3.1 YOLOV3-tiny …………………………………………………………………………………………………………..5 1.3.2 Installing Darknet and PC configuration ……………………………………………………………………..5 1.3.3 YOLOV3-tiny train ……………………………………………………………………………………………………6 1.3.4 YOLOV3-tiny testing system ……………………………………………………………………………………..6 1.4 Experimental Results ………………………………………………………………………………………………………7 1.5 Conclusions ……………………………………………………………………………………………………………………8 2 Planificarea activității …………………………………………………………………………………………………………….9 3 Stadiul actual …………………………………………………………………………………………………………………….. 11 3.1 Introducere ………………………………………………………………………………………………………………… 11 3.2 Detectarea obiectelor …………………………………………………………………………………………………. 11 3.3 Clasificarea obiectelor …………………………………………………………………………………………………. 12 3.4 Detecția și clasificarea vehiculelor ………………………………………………………………………………… 13 3.4.1 Metode bazate pe rețele neuronale convoluționale ………………………………………………… 13 3.4.2 Metode bazate pe caracteristici …………………………………………………………………………….. 13 4 Fundamentare teoretică …………………………………………………………………………………………………….. 15 4.1 Introducere ………………………………………………………………………………………………………………… 15 4.1.1 Privire generală……………………………………………………………………………………………………. 15 4.1.2 Rețea neuronală convoluțională ……………………………………………………………………………. 15 4.2 YOLO (You Only Look Once) …………………………………………………………………………………………. 16 4.2.1 Introducere …………………………………………………………………………………………………………. 16 4.2.2 Arhitectura YOLO …………………………………………………………………………………………………. 16 4.2.3 Realizarea detecției ……………………………………………………………………………………………… 19 4.2.4 Îmbunătățiri făcute pentru YOLOV3 ……………………………………………………………………….. 20 4.2.5 Avantajele utilizării YOLOV3 ………………………………………………………………………………….. 21 5 Implementarea soluției adoptate…………………………………………………………………………………………. 23 5.1 Introducere ………………………………………………………………………………………………………………… 23 5.2 YOLOV3-tiny ………………………………………………………………………………………………………………. 23 5.3 Instalare Darknet si configurare PC ……………………………………………………………………………….. 24 5.4 Antrenare YOLOV3-tiny ……………………………………………………………………………………………….. 25 2 5.4.1 Colectarea imaginilor pentru antrenare ………………………………………………………………….. 25 5.4.2 Etichetarea zonelor de obiect ……………………………………………………………………………….. 25 5.4.3 Pregătirea fișierelor necesare ……………………………………………………………………………….. 26 5.4.4 Antrenarea rețelei neuronale ………………………………………………………………………………… 27 5.4.5 Oprirea antrenării ………………………………………………………………………………………………… 28 5.5 Sistem Testare model YOLOV3-tiny antrenat …………………………………………………………………. 28 5.5.1 Sistem testare model YOLO bazat pe funcțiile din OpenCV ……………………………………….. 28 5.5.2 Sistem testare model YOLO bazat pe Darknet cu rulare GPU …………………………………….. 33 6 Rezultate Experimentale …………………………………………………………………………………………………….. 35 6.1 Testare Darknet pe diferite versiuni YOLO ……………………………………………………………………… 35 6.2 Setul de imagini utilizat la antrenare …………………………………………………………………………….. 37 6.3 Etichetarea zonelor de obiect ………………………………………………………………………………………. 38 6.4 Sistem testare model YOLO bazat pe funcțiile din OpenCV ………………………………………………. 41 7 Concluzii …………………………………………………………………………………………………………………………… 48 8 Bibliografie ……………………………………………………………………………………………………………………….. 49 Anexe ………………………………………………………………………………………………………………………………………. 51 3 1 SUMMARY 1.1 State of the Art Object detection and classification play important role in computer vision field. To achieve good results both object detection and classification need, however, a lot of preliminary work. This includes images pre-processing such as removing noise, adjusting contrast, re-sizing, and background subtraction. However, lately, interest in deep learning techniques, such as convolutional neural network (CNN), has increased. CNNs have achieved outstanding results not only within computer vision field but also within speech recognition and natural language processing fields. CNNs` advantages come from needing no extensive pre-processing and hand-crafted features. Intelligent transportation system (ITS) rely a lot on object detection and classification. For instance, object detection is helpful in analyzing traffic flow and behavior or identifying traffic accidents. There are various factors that may make the recognition process more difficult, such as varying lighting and weather conditions, the number of different vehicle types in one image or the distance of captured vehicles. YOLO is one of the most recent object detection approaches. Some previous works use classifier to perform object detection. In contrast, the proposed method predicts bounding boxes coordinates along with class score within the same neural network. The network architecture is based on GoogleLeNet where inception modules are replaced by reduction layers. Twenty convolutional layers are first pre-trained and then another four convolutional and two fully- connected are added to the model. Vehicle detection methods have been proposed to identify the object as a vehicle. It can be used for multi-view vehicle tracking and verification. Vehicle detection and classification task were implemented in two different methods, feature-based methods or CNNs methods. Through various methods used for vehicle detection using CNNs, we recall semi-supervised CNN for detecting vehicles from frontal view images, unsupervised CNN for vehicle classification, CNN with low resolution video frames to detect and classify vehicles, fine-tuned YOLO for vehicle detection and fine-tuned AlexNet model for vehicle classification, Faster R-CNN and his predecessor Fast R-CNN. Other method uses descriptors like Scale-Invariant Feature Transform (SIFT), Speeded-up Robust Features (SURF) or Histogram of Oriented Gradients (HOG) for vehicle detection and classification. Compared to CNNs the features extracted by previously mentioned methods are rather low-level. Typically, a support vector machine (SVM) is used as the classifier. 1.2 Theoretical Fundamentals 1.2.1 Introduction Object detection, tracking and classification can be used for various purposes. In the Intelligent Transportation Systems (ITS) field object detection is utilized for vehicle and pedestrian detection, traffic sign and lane detection or vehicle make detection. Ability to detect or classify traffic related object makes it possible to further improve the state of the roads and traffic flow, prevent serious traffic accidents and even register traffic violations and crimes, such as stolen vehicles or speeding. This is especially important since the number of passenger car users is constantly rising. 4 Convolutional neural networks are deep artificial neural networks that are used primarily to classify images, cluster them by similarity, and perform object recognition within scenes. They are algorithms that can identify faces individuals, street sign and many other aspects of visual data. Convolutional networks perform optical character recognition to digitize text and make natural-language processing possible, CNNs can also be applied to sound when it is represented visually as a spectrogram. The efficacy of convolutional nets in image recognition is one of the main reasons why the world has woken up to the efficacy of deep learning. They are powering major advances in computer vision, which has obvious applications for self-driving cars, robotics, drones and security. 1.2.2 YOLO (You Only Look Once) Deep learning has proven to be a useful tool for classifying images, realizing this task at the level of human ability. You Only Look Once or YOLO in brief is a real-time learning object detection algorithm developed by Joseph Redmon and Ali Farhadi at the University of Washington in 2016. Convolutional neural network YOLO has in its architecture 24 convolutional layers followed by 2 fully-connected layers (FC), represented in figure 1. Figure 1. YOLO architecture The initial convolutional layers of the neural network extract features from the image, while the fully-connected layers predict the output probabilities and coordinates of the bounding box. YOLOV2 network architecture, an improved version of convolutional neural network YOLO, has the same number of convolutional layers, but it is more accurate and as fast as the previous version. The fallowing improvements are implemented in the new version: batch normalization, high resolution classifier, convolutional with anchor boxes, dimension clusters, direct location prediction, fine-grained features. Neural network YOLO detects objects by dividing the input image into a S x S cell grid like in the figure 2. If the center of an object is in a cell in the grid, that cell is responsible for detecting the object. Each cell in the grid predicts B bounding boxes and a trusted score for these boxes. These trusted scores reflect how confident the system is that the bounding box contains an object. 𝑆×𝑆×(𝐵∗5+𝐶) S x S: is the number of the grid cells of the system B: is the number of the bounding boxes per grid cell C: is the number of the classes we train our network on. 5 To choose the right bounding box for the grid cell, we select the one with the highest IoU (intersection over union) with the ground truth. Figure 2. Generation of bounding boxes Improvements made in YOLOV3: multi-label classification, use of different bounding box prediction, use of prediction across scale using the concept of feature pyramid networks and use of the new CNN extractor named Darknet-53. The formula for calculating the number of bounding boxes has been modified to: 𝑁×𝑁×(3∗(4+1+ 𝐶)) N x N: is the number of the grid cells of the system 3: to decode the features extracted from each of the 3 scales 4 + 1: to decode the bounding boxes offsets + objectness score C: is the number of the classes we train our network on. 1.3 Implementation 1.3.1 YOLOV3-tiny YOLOV3-tiny represents the smaller and faster version of the YOLOV3 convolutional neural network. This neural network model consists of 16 convolutional layers of 3 x 3 and 1 x 1 dimensions. We choose this convolutional neural network version because it has fewer convolutional layers, so training time will be shorter, and the detection run much faster than YOLOV3. 1.3.2 Installing Darknet and PC configuration A PC station with the fallowing configuration was used to train the system: GPU NVIDIA GeForce GTX 780 TI with 3 GB memory CPU Intel Xeon CPU E5-1620 with 3,6 GHz frequency and four cores 32 GB RAM memory 6 Windows 10 operating system The times determined in the training and detection process are not standard but are influenced by the PC configuration used. Darknet is a framework for neural networks written in programming languages C and CUDA, that we will use to train our convolutional neural network. Darknet is fast, easy to install and can be run using CPU, but also GPU. To install Darknet we need OpenCV version 3.0 and CUDA version 10.0. After we install OpenCV and CUDA we have to compile Darknet using Microsoft Visual Studio 2015 or another newer version. If the compilation succeeds without getting an error, then Darknet is successfully installed. 1.3.3 YOLOV3-tiny train To get the images needed to create the training data set, we extract frames from video stream with street traffic. From the videos 852 images were taken, containing different car models to create the data set. Now we take each image from the data set and draw bounding boxes to fit the object that need to be detected, so we will have for each image in the data set a text file with the coordinates of the bounding boxes. After we labelled each image, we need to modify the configuration file of the neural network, were we need to set the number of batch, subdivision, filters and anchors boxes. We calculate the number of filters with the following formula: 𝑓𝑖𝑙𝑡𝑒𝑟𝑠= (𝑐𝑙𝑎𝑠𝑠𝑒𝑠+5)×3 After we modify the configuration file, we make two files one with the name obj.names in which we will write on each line the name of each class for which we are trained our system and a file with the name obj.data in which we will write the number of classes, the location of the data set for training, the location of the file which contains the name of the classes to be trained, but also the location where we want to save the new weights file. Before we start the training, we test which method is faster training on CPU or GPU. The results are shown in table 1. Table 1. Test training time GPU NVIDIA GeForce GTX 780 TI 2,7 s CPU Intel Xeon CPU E5 -1620, 3,60 GHz 214 s The table shows that network training on the GPU is about 100 times faster than CPU training. After we start the training, we can stop after approximately 2000 iterations for each class. The training can also stop if the average loss is lees than 1, and after several iterations it is no longer decreasing. 1.3.4 YOLOV3-tiny testing system The YOLO model testing system is implemented in Python using Jupyter Notebook and Spyder, based on OpenCV package features running on the CPU because GPU run require Intel Graphics Processing Unit. First, we import necessary packages, the class name file, the weights file obtained after training process and the network configuration file. After importing necessary files, we select to run the system on CPU, we load the video sequence that we want detection to be made and select the area of interest. We extract each frame from loaded video sequence, then perform the detection on each frame. After detecting we filter out detections that have low confidence score 7 and overlap. After filtering the detections, we draw bounding boxes on detected object and save the new video sequence. 1.4 Experimental Results We test the detection system on several video sequences and get the fallowing detection results: Figure 3. Result obtained from detection Figure 4. Result obtained from detection 8 Figure 5. Result obtained from detection 1.5 Conclusions Vehicle detection and classification have great influence on the advances in the field of Intelligent Transportations Systems. This computer vision task helps in developing better road systems by analyzing the traffic and assist in preventing or detecting traffic accidents. While it is helpful in many ways, detecting and classifying vehicles is not an easy task. In this paper, the vehicle detection and classification is done utilizing convolutional neural networks as they proved to be a suitable choice for the task. Based on the experimental results obtained in the detection process, it can be concluded that the vehicle detection system has a good accuracy, being able to detect the vehicles from different perspectives, and the processing time is small even if the run is done on the CPU. 9 2 PLANIFICAREA ACTIVITĂȚII Nr. Activitatea des fășurată Data de început Data de sf ârșit Nr. de zile 1. Documentare CNN 07.11.2018 19.12.2018 42 2. Instalare mediu de programare Anaconda și studierea funcțiilor de bază 15.03.2019 15.04.2019 30 3. Implementare program testare YOLO 16.04.2019 15.05.2019 30 4. Re-antrenare YOLOV3 -tiny 16.05.2019 23.05.2019 7 5. Testare/validare rezultate experimentale 23.05.2019 6. Scriere lucrare de diplomă 30.05.2019 15.07.2019 46 10 11 3 STADIUL ACTUAL 3.1 Introducere Detectarea și clasificarea obiectelor joacă un rol important în domeniul viziunii pe calculator. Pentru a obține rezultate bune, atât pentru detectarea obiectelor, cât și pentru clasificarea lor, este nevoie de foarte mult lucru preliminar. Acest lucru include pre-procesarea imaginilor, cum ar fi ajustarea contrastului, redimensionarea, extragerea fundalului și eliminarea zgomotului. În continuare, caracteristicile fezabile trebuie să fie detectate și extrase. De exemplu, pentru a genera puncte de interes, pot fi folosite caracteristici robuste de viteză (SURF) [1], o histogramă a gradienților orientați (HOG) [ 2] sau o caracteristică de transformare a caracteristicelor inversate în scalare (SIFT) [ 3]. Pentru o lungă perioadă de timp, detecția obiectelor a depins de aceste caracteristici artizanale. În consecință, selectarea caracteristicilor bune este crucială pentru a obține o precizie ridicată [4]. Cu toate acestea, în ultimul timp, interesul pentru tehnicile de învățare profundă, cum ar fi rețelele neuronale convoluționale, a crescut foarte mult. Deși prima rețea neuronală convoluțională datează din anii 1960 [ 5], acestea au câștigat popularitate în mare parte după ce AlexNet [ A. Krizhevsky ] a câștigat ”ImageNet Large Scale Visual Recognition Challenge” (ILSVRC). În ansamblu, rețelele neuronale convoluționale au obținut rezultate remarcabile nu numai în domeniul viziunii computerizate, dar și în domeniul recunoașterii vocale și în domeniul de recunoaștere al limbajului natural. Avantajele oferite de rețelele neuronale convoluționale au fost obținute de la o prelucrare excesivă de pre-procesare [ 6] și de caracteristici prelucrate manual. Sistemele inteligente de transport (ITS) se bazează foarte mult pe detectarea și clasificarea obiectelor. De exemplu, detectarea obiectelor este utilă pentru analiza fluxului de trafic și a comportamentului sau identificarea accidentelor de trafic. Există diferiți factori care pot face procesul de recunoaștere mai dificil, cum ar fi diferitele condiții de iluminare și meteorologice, numărul diferitelor tipuri de mașini dintr-o singură imagine sau distanța la care se afla vehiculele din imagine. 3.2 Detectarea obiectelor Sermanet și colaboratorii [ 7] au realizat o rețea neuronală care poate fi utilizată pentru a realiza trei sarcini în viziunea calculatorului: clasificarea obiectului, localizarea și detectarea. În plus, este lansat un extractor de caracteristici, denumit Overfeat. Autorii își propun să demonstreze că rețelele neuronale convoluționale sunt capabile să facă mai mult decât clasificare. AlexNet este utilizat ca rețea de bază pentru clasificare. Modificările aduse sistemului de clasificare AlexNet includ gruparea non-suprapusă, reducerea dimensiunilor primelor doua straturi convoluționale și omiterea normalizării contrastului. Pentru sarcina de localizare, straturile complet conectate ale modelului de clasificare sunt schimbate într-o rețea de regresie. Rețeaua de regresie este antrenată pentru a determina cele patru coordonate ale zonelor de încadrare. Rețelele de clasificare și regresie sunt rulate simultan, iar apoi rezultatele lor sunt combinate pentru a obține predicțiile finale. Sarcina de detecție este similară cu sarcina de localizare, dar este adăugată clasa fundal pentru imaginile care nu conțin obiecte. 12 În 2013, Girshick și colaboratorii [ 8] au introdus R-CNN, o rețea neuronală convoluțională cu propuneri regionale. În lucrarea lor, autorii doresc să demonstreze că rețeaua este capabilă de rezultate mai bune decât metodele care utilizează caracteristici de nivel inferior, cum ar fi HOG. Procesul de detecție de obiecte este format din trei părți. Mai întâi, R-CNN utilizează căutarea selectivă pentru a crea propuneri regionale, adică diferite regiuni care ar putea include un obiect. Apoi, vectorii extrag caracteristici din fiecare regiune detectată folosind AlexNet. Singura modificare a arhitecturii este numărul de unități din stratul de clasificare. Pe setul de date de detectare ILSVRC2013, R-CNN a obținut un scor mai bun decât Overfeat. YOLO [ 9] reprezintă una dintre cele mai recente abordări de detectare a obiectelor. Unele lucrări anterioare utilizează clasificatori pentru a efectua detectarea de obiecte. În schimb, metoda propusă prezice coordonatele zonelor de încadrare împreună cu gradul de încredere pentru clasa detectată în cadrul aceleiași rețele neuronale. Spre deosebire de rețelele bazate pe propuneri regionale, YOLO utilizează întreaga imagine în loc de regiuni separate pentru a lua decizii. Arhitectura rețelei se bazează pe GoogleLeNet, unde modulele inițiale sunt înlocuite cu straturi de reducere. Douăzeci de straturi convoluționale sunt precomprimate și apoi alte patru straturi convoluționale și două straturi complet conectate sunt adăugate modelului. Fiecare imagine de intrare este împărțită într-o grilă de celule. Fiecare celulă din grilă prezice coordonatele zonelor de încadrare, gradul de încredere al detecție și eticheta clasei detectate. Ming Liang și Xiaolin Hu [ 10] propun o rețea neuronală convoluțională recurentă. Această soluție este inspirată de conexiunile recurente ale rețelei neuronale. Autorii implementează un strat convoluștional recurent care este folosit în locul straturilor convoluționale regulare din modelul propus. Numai primul strat convoluțional al rețelei nu este recurent. Rețeaua de bază și procesul de antrenare au fost adaptate de la AlexNet. Dimensiunea rețelei este mărită prin adăugarea straturilor convoluționale recurente. 3.3 Clasificarea obiectelor În 2012, Krizhevsky și colaboratorii [11] fac o descoperire în clasificarea imaginilor pe seturi de date de dimensiuni mari, introducând AlexNet. Deși există alte câteva metode de învățare a mașinilor utilizate în competiție, autorii demonstrează ca rețelele neuronale convoluționale sunt capabile să gestioneze milioane de imagini și să obțină rezultate foarte bune. Cheia rezultatelor finale este dimensiunea rețelei AlexNet. Nu există o preprocesare efectuată pe setul de date, cu excepția scăderii mediei. Rețeaua propusă este alcătuită din cinci straturi convoluționale și trei straturi complet conectate. Autorii aleg Unitatea Liniară Rectificată (ReLu) pentru funcția de activare, deoarece a îmbunătățit drastic viteza de antrenare. Răspunsul la normalizarea răspunsului local se aplică după activarea în primele două straturi convoluționale. În plus, punerea în comun a suprapunerilor a contribuit la reducerea suprapunerii în timpul procesului de antrenare. Stratul final este un strat sofmax cu 1000 de unități. Antrenarea se face pe două Unități de Procesare Grafică, fiecare GPU are acces la diferite straturi convoluționale. Mărirea și scăderea datelor sunt utilizate pentru a reduce suprapunerea. În 2014 [12] a fost introdusă cu succes o altă arhitectură pentru rețelele neuronale convoluționale VGGNet. Cu această rețea neuronală, autorii au câștigat primul și al doilea loc la sarcinile de clasificare și localizare ale concursului ILSVRC`14. Baza rețelei este inspirată de la rețeaua AlexNet, singura preprocesare a fost extracția medie. Autorii au experimentat pe diferite dimensiuni ale rețelei pentru a înțelege cum afectează acest aspect rezultatele finale. Una dintre diferențele față de arhitecturile anterioare reprezintă utilizarea dimensiunii de 3 x 3 pentru toate straturile convoluționale. În plus, rețelele neuronale convoluționale conțin mai multe straturi convoluționale secvențiale, fără a avea un strat de max pooling între ele. Autorii au testat șase configurări diferite de dimensiuni diferite. Cele mai bune rezultate au fost obținute atunci când rețeaua era alcătuită din 16 sau 19 straturi. 13 CNN-RNN [ 13] este o rețea neuronală convoluțională combinată cu o rețea neuronală recurentă (RNN) utilizată pentru clasificarea pe mai multe clase. Scopul clasificării cu mai multe clase este de a prezice etichetele mai multor obiecte din aceeași imagine. Autorii au observat că adăugarea RNN la rețeaua originală a crescut precizia. Unitățile de memorie pe termen scurt sunt utilizate ca unități recurente ale rețelei. Partea convoluțională a rețelei se bazează pe VGGNet și este utilizată pentru a colecta informații semantice din imagini. Partea RNN se ocupă de relația dintre imagini și etichete. 3.4 Detecția și clasificarea vehiculelor Acest sub-capitol oferă o prezentare generală a metodelor de detectare și clasificare a vehiculelor care utilizează fie metode CNN, fie metode bazate pe caracteristici. 3.4.1 Metode bazate pe rețele neuronale convoluționale Dong și colaboratorii [14] propun o rețea neuronală convoluțională semi-supravegheată pentru detectarea vehiculelor din imagini cu vedere frontală asupra acestora. Filtrele, utilizate în straturile convoluționale, sunt învățate utilizând date neetichetate și învățarea laplaciană propusă rar. Stratul de ieșire este un clasic softmax care este antrenat pe date mici etichetate. Soluția finală s-a dovedit a fi eficientă atunci când este utilizată pentru clasificarea tipurilor de vehicule. Cu un an înainte, Dong și colaboratorii [15] au introdus o rețea neuronală convoluțională nesupravegheată pentru clasificarea vehiculelor. Ei folosesc CNN pentru a învăța caracteristicile și apoi clasifică vehiculele folosind funcția softmax redusă. În [16], autorii utilizează o rețea neuronală convoluțională cu cadre video cu rezoluție redusă pentru a detecta și clasifica vehiculele. Etapa de pre-procesare include redimensionarea fiecărui cadru și ajustarea contrastului cu egalizarea histogramei. Arhitectura CNN propusă detectează atât caracteristici de nivel înalt, cât și de nivel scăzut. Autorii variază numărul de filtre și dimensiunile acestora, precum și numărul de straturi convoluționale. Transferul de învățare este o altă abordare utilizată pentru detectarea și clasificarea vehiculelor. Este o metodă în care un model deja antrenat este folosit ca punct de plecare sau ca extractor de caracteristici. În [17], autorii folosesc modelul YOLO [9] pentru detectarea vehiculelor și modelul AlexNet pentru clasificarea vehiculelor. Autorii folosesc suplimentar AlexNet ca extractor de caracteristici și efectuează clasificarea pe caracteristicile extrase utilizând SVM liniar. 3.4.2 Metode bazate pe caracteristici Detectarea și clasificarea vehiculelor au diferite soluții care utilizează descriptori precum SFIT, SURF și HOG. În comparație cu CNN, caracteristicile extrase de către descriptorii menționați anterior sunt destul de slabe. În mod obișnuit, un vector de suport mașină (SMV) este utilizată ca clasificator. În [ 18] autorii folosesc o combinație între SIFT și bag-of-words și efectuează clasificarea pentru marca și modelul vehiculului utilizând SVM. O altă abordare scade în primul rând fundalul din jurul vehiculului, apoi imaginea este segmentată, iar SIFT este utilizat pentru extragerea caracteristicilor [ 19]. O altă încercare de detecție pentru marca și modelul vehiculelor a fost realizată utilizând un algoritm SURF modificat; un descriptor SURF simetric [ 20]. Ideea acestei modificări este de a identifica dacă intrările conțin obiecte simetrice. Metoda propusă funcționează bine cu datele în timp real și nu are nevoie de extragerea fundalului. X. Li și X. Guo [ 21] au dezvoltat un sistem de detectare a vehiculelor care utilizează descriptorul HOG și SVM. Ideea lor se bazează pe detectarea umbrelor sub vehicule pentru a 14 distinge între vehicule și fundal. Mai mult, această metodă s-a dovedit a funcționa bine în diferite condiții de iluminare. Ca și în cazul cercetărilor anterioare, Sivaraman și Trivedi [ 22] profită de metoda de detecție a umbrelor de sub vehicule. Caracteristicile sunt extrase folosind HOG și HOG propus simetric care detectează caracteristicile simetrice. În studiul lor, Feng Han și colaboratorii [ F. Han] utilizează HOG împreună cu SVM pentru a detecta persoane și vehicule din puncte de vedere diferite. În primul rând, autorii folosesc stereo cue pentru a detecta fie o persoană sau un vehicul. Apoi, clasificarea folosind caracteristicile HOG se face cu SVM. Pentru fiecare punct de vedere, autorii dezvoltă clasificatori separați care sunt aplicați simultan pentru a obține un rezultat. Pablo Negri și colaboratorii [23] utilizează caracteristicile HOG și Haar în cercetarea lor de detectare a vehiculelor. De fapt, autorii experimentează fuzionarea acestor descriptori pentru a obține rezultate finale precise. 15 4 FUNDAMENTARE TEORETICĂ 4.1 Introducere 4.1.1 Privire generală Detectarea obiectelor, urmărirea și clasificarea lor pot fi folosite în diferite scopuri. În domeniul sistemelor inteligente de transport (STI) detecția obiectelor este utilizată pentru detecția vehiculelor, pietonilor, semnelor din trafic și a benzilor de trafic. Abilitatea de a detecta sau a clasifica obiecte legate de trafic face posibilă îmbunătățirea traficului și a stării drumurilor, prevenirea accidentelor grave în trafic și chiar înregistrarea încălcării regulilor de circulație cum ar fii depășirea vitezei legale de circulație, depășiri în zonele interzise și detecția vehiculelor furate. Acest aspect este foarte important deoarece numărul persoanelor care utilizează vehicule e în continuă creștere. În plus, în ultimul timp, subiectul autovehiculelor autonome a început să capete o popularitate tot mai ridicată. Pentru oameni este foarte ușor să recunoască vehiculele din imagini sau din secvențe video sau să distingă între diferitele tipuri de mașini. Pentru un program pe calculator, dificultatea detecției și clasificării vehiculelor depinde foarte mult de timpul de date. Condițiile de iluminare și vremea reprezintă principalele caracteristici care determină calitatea unei imagini sau a unui video. Vehiculele vin în diferite forme și culori, iar unele modele sunt destul de similare. În plus, detectarea mai multor obiecte în mișcare este mult mai dificilă. Cu toate acestea, există multe metode de detectare și clasificare a vehiculelor. O mulțime de lucrări abordează această sarcină prin extragerea caracteristicilor relevante, iar apoi prin utilizarea unui clasificator se iau decizii suplimentare. Din moment ce domeniul viziunii computerelor evoluează constant, unele metode noi încep să iasă în evidență. 4.1.2 Rețea neuronală convoluțională Convoluția și stratul convoluțional reprezintă principalele blocuri folosite în rețelele neuronale convoluționale (CNN). Convoluția este o simplă operație matematică care reprezintă aplicarea unui filtru asupra unei intrări pentru a obține ca rezultat o activare. Aplicarea repetată a aceluiași filtru pe o intrare are ca rezultat o hartă a activărilor numită hartă de caracteristici, indicând locațiile și puterea unei caracteristici detectate într-o intrare, cum ar fi o imagine. Rețelele neuronale convoluționale sunt rețele neuronale artificiale care sunt folosite în principal pentru clasificarea imaginilor, grupându-le după similitudine realizează recunoașterea obiectelor din cadrul unor scene. Ele sunt algoritmi care pot identifica fețe, persoane, semne stradale, vehicule și multe alte aspecte ale datelor vizuale. Rețelele neuronale realizează recunoașterea optică a caracterelor (OCR) pentru a digitaliza textul și a face posibilă procesarea în limbaj natural a documentelor scrise manual, unde imaginile reprezintă simboluri care trebuie transcrise. CNN-urile pot fi, de asemenea, aplicate sunetului atunci când sunt reprezentate vizual sub formă de spectrogramă. Eficacitatea rețelelor convoluționale în recunoașterea imaginilor este unul din principalele motive din care lumea a realizat importanța învățatului profund. Învățarea profundă cunoscută și sub denumirea de învățare ierarhică este parte dintr-o familie de metode de învățare automată. Inspirația pentru învățarea profundă provine de la rețelele neuronale ale creierului uman. Creierele noastre pot fi văzute ca un model foarte complex de învățare profundă. Rețelele neuronale ale creierului uman sunt compuse din miliarde de neuroni interconectați; învățarea profundă simulează această structură. Aceste rețele multi- strat pot colecta informații și pot efectua acțiuni corespunzătoare. 16 4.2 YOLO (You Only Look Once) 4.2.1 Introducere Învățarea profundă s-a dovedit a fi un instrument util pentru clasificarea imaginilor, realizând această sarcină la capacitatea nivelului uman. You Ony Look Once [9] sau YOLO pe scurt este un algoritm de învățare în timp real, de detectare a obiectelor dezvoltat de Joseph Redmon și Ali Farhadi la Universitatea din Washington în 2016. Scopul general al acestei rețele neuronale este de a fi rapid, precis, și în stare să recunoască o mare varietate de obiecte. 4.2.2 Arhitectura YOLO Rețeaua neuronală convoluțională YOLO are în arhitectura sa 24 de straturi convoluționale urmate de 2 straturi complet conectate (FC), reprezentate în figura 1. Figura 1. Arhitectura rețelei neuronale convoluționale YOLO Straturile convoluționale inițiale ale rețelei neuronale extrag caracteristici din imagine, în timp ce, straturile complet conectate prezic probabilitățile de ieșire și coordonatele zonei de încadrare a obiectului. În locul modulelor de inițiere folosite de GoogleLeNet, această rețea utilizează straturi de reducere de dimensiunea 1 x 1 urmate de straturi convoluționale de dimensiunea 3 x 3. Rezultatul final al rețelei neuronale YOLO este un tensor de predicții de dimensiunea 7 x 7 x 30. Întreaga rețea este prezentată in tabelul 1. Tabelul 1. Arhitectura YOLO Nume Filtru Dimensiunea de ie șire Convolutional 1 7 x 7 x 64, pas = 2 224 x 224 x 64 Max pooling 1 2 x 2, pas = 2 112 x 112 x 64 Convolutional 2 3 x 3 x 192 112 x 112 x 192 Max pooling 2 2 x 2, pas = 2 56 x 56 x 192 Convolutional 3 1 x 1 x 128 56 x 56 x 128 Convolutional 4 3 x 3 x 256 56 x 56 x 256 Convolutional 5 1 x 1 x 256 56 x 56 x 256 Convolutional 6 1 x 1 x 512 56 x 56 x 512 Max pooling 3 2 x 2, pas = 2 28 x 28 x 512 Convolutional 7 1 x 1 x 256 28 x 28 x 256 Convolutional 8 3 x 3 x 512 28 x 28 x 512 Convolutional 9 1 x 1 x 256 28 x 28 x 256 Convolutional 10 3 x 3 x 512 28 x 28 x 512 17 Convolutional 11 1 x 1 x 256 28 x 28 x 256 Convolutional 12 3 x 3 x 512 28 x 28 x 512 Convolutional 13 1 x 1 x 256 28 x 28 x 256 Convolutional 14 3 x 3 x 512 28 x 28 x 512 Convolutional 15 1 x 1 x 512 28 x 28 x 512 Convolutional 16 1 x 1 x 1024 28 x 28 x 1024 Max pooling 4 2 x 2, pas =2 14 x 14 x 1024 Convolutional 17 1 x 1 x 512 14 x 14 x 512 Convolutional 18 3 x 3 x 1024 14 x 14 x 1024 Convolutional 19 1 x 1 x 512 14 x 14 x 512 Convolutional 20 3 x 3 x 1024 14 x 14 x 1024 Convolutional 21 3 x 3 x 1024 14 x 14 x 1024 Convolutional 22 3 x 3 x 1024, pas = 2 7 x 7 x 1024 Convolutional 23 3 x 3 x 1024 7 x 7 x 1024 Convolutional 24 3 x 3 x 1024 7 x 7 x 1024 FC 1 – 4096 FC 2 – 7 x 7 x 30 (1470) Arhitectura rețelei YOLOV2, o versiune îmbunătățită a rețelei convoluționale neuronale YOLO, prezintă același număr de straturi convoluționale, dar este un detector mult mai precis și la fel de rapid ca versiunea anterioară. În loc să extindă dimensiunea rețelei neuronale YOLOV2 adăugând mai multe straturi convoluționale, aceasta este simplificată, iar reprezentarea devine mai ușor de învățat. Următoarele concepte sunt implementate în noua versiune. Batch normalization. Normalizarea loturilor conduce la o îmbunătățire semnificativă a convergenței, eliminând în același timp necesitatea altor forme de regularizare [24]. Prin adăugarea normalizării loturilor pe toate straturile convoluționale ale rețelei YOLO, se obține o îmbunătățire mai mare de 2% pentru mean Avarage Precision (mAP). AP este o metodă populară de măsurare a preciziei detecției de obiecte pentru rețelele neuronale convoluționale. Cu ajotorul normalizării loturilor putem elimina abandonul din model fără a suprasolicita sistemul. High Resolution Classifier. Versiunea originală YOLO antrenează rețeaua de clasificare cu imagini de dimensiunea 224 x 224 și crește rezoluția acestora la 448 pentru procesul de detecție. Aceasta înseamnă că rețeaua trebuie să schimbe simultan de la învățarea detecției de obiecte la ajustarea la noua rezoluție de intrare. Pentru YOLOV2 mai întâi se face o ajustare a rețelei de clasificare la o rezoluție de 448 x 448 timp de 10 iterații pe setul de date ImageNet [25]. Acest lucru oferă rețelei timp să-și adapteze filtrele pentru a funcționa mai bine în cazul imaginilor cu rezoluție mare. Această rețea de clasificare cu rezoluție ridicată oferă o creștere de aproape 4% a mAP. Convolutional With Anchor Boxes. YOLO prezice coordonatele zonelor de încadrare direct folosind straturi complet conectate deasupra extractorului de caracteristici convoluționale. În loc să prezică coordonatele zonelor de încadrare direct rețeaua neuronală convoluțională Faster R-CNN prezice coordonatele folosind priorități selectate manual. Folosind numai straturi convoluționale, rețeaua de propuneri regionale (RPN) din Faster R-CNN prezice offseturi și gradul de încredere pentru regiunile de încadrare. Deoarece stratul de predicție este convoluțional, RPN prezice aceste offseturi la fiecare locație dintr-o hartă de caracteristici. Prezicerea offseturilor în locul coordonatelor simplifică problema și facilitează învățarea pentru rețea. Din versiunea YOLOV2 au fost eliminate straturile complet conectate și sunt utilizate anchors boxes pentru a prezice zonele de încadrare. Mai întâi a fost eliminat un strat de pooling pentru ca ieșirea straturilor de convoluție ale rețelei neuronale să aibă o rezoluție mai mare. De asemenea, rețeaua a fost micșorată pentru a funcționa pe imagini de dimensiunea 416 x 416 în loc de 448 x 448. Acest lucru a fost realizat pentru a avea un număr impar de locații pe harta de 18 caracteristici, astfel încât să existe o singură celulă centrală. Obiectele, în special cele mari, tind să ocupe centrul unei imagini, din acest motiv este bine să existe o singură locație chiar în centrul imaginii, în locul a patru locații care sunt în apropiere. Straturile convoluționale ale rețelei YOLO împarte, cu un factor egal cu 32, imaginea de la intrare de dimensiunea 416 x 416 astfel se obține o hartă caracteristică de ieșire de dimensiunea 13 x 13. Din YOLOV2 a fost eliminat și mecanismul de predicție al claselor în schimb prezicem clasa pentru fiecare anchors box. Dimension cluster. Au fost întâmpinate două probleme atunci când anchors boxes au început sa fie utilizate în structura YOLO. Prima problemă apărea datorită faptului că dimensiunea anchors boxes era selectată manual. Rețeaua poate învăța să modifice anchors boxes în mod corespunzător, dar dacă alegem priorități mai bune cu care să înceapă rețeaua pentru a ușura procesul de învățare pentru detecția obiectelor. În loc să alegem prioritățile manual executăm k-means clustering pe zonele de încadrare din imaginile care formează setul de date pentru antrenare pentru a găsi automat prioritățile bune. Ceea ce se dorește este găsirea priorităților care determină scoruri bune ale intersecției peste unire (IOU). Intersecția peste unire reprezintă o metodă de evaluare pentru a măsura acuratețea unui detector de obiecte pe un anumit set de date. Formula utilizată pentru calcularea scorului IOU este următoarea: 𝑑(𝑏𝑜𝑥,𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑 )= 1−𝐼𝑂𝑈(𝑏𝑜𝑥,𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑 ) (1) Direct location prediction. Atunci când se folosesc anchors boxes în structura YOLO apare o a doua problemă: instabilitatea sistemului, mai ales în timpul primelor iterații. Cea mai mare parte a problemei de instabilitate de la prezicerea locațiilor (x, y) pentru coordonatele zonei de încadrare. Versiunea YOLOV2 prezice coordonatele locației în raport cu locația celulei din imagine. Acest lucru limitează ground truth să scadă între 0 și 1. Se utilizează o activare logistică pentru a constrânge predicțiile rețelei să scadă în acest interval. Rețeaua prezice 5 zone de încadrare pentru fiecare celulă din imagine. Rețeaua mai prezice și 5 coordonate, ca în figura 2, pentru fiecare zonă de încadrare, 𝑡௫, 𝑡௬, 𝑡௪, 𝑡 și 𝑡. Dacă celula este deplasată din colțul din stânga sus al imaginii cu (𝑐௫,𝑐௬) și zona de încadrare are lățimea și înălțimea 𝑝௪ și 𝑝, atunci predicțiile corespund cu următoarele formule: 𝑏௫= 𝜎(𝑡௫) + 𝑐௫ 𝑏௬= 𝜎(𝑡௬) + 𝑐௬ 𝑏௪ = 𝑝௪∗𝑒௧ೢ 𝑏= 𝑝∗𝑒௧ Pr(𝑜𝑏𝑗𝑒𝑐𝑡)∗𝐼𝑂𝑈(𝑏,𝑜𝑏𝑗𝑒𝑐𝑡)= 𝜎(𝑡) Deoarece predicția locației a fost restricționată, parametrizarea este mai ușor de învățat, ceea ce face rețeaua să fie mult mai stabilă. 19 Figura 2. Prezicerea coordonatelor zonelor de încadrare Fine-Grained Features. Noua versiune YOLO face detecția pe o hartă de caracteristici de dimensiunea 13 x 13. În timp ce acest lucru este suficient pentru obiectele mari, cu ajutorul caracteristicilor fine granulate rețeaua va putea detecta și obiectele de dimensiuni mici. A fost adăugată o simplă trecere prin strat care aduce caracteristicile dintr-un strat anterior la o rezoluție de 26 x 26. Stratul de trecere conectează caracteristicile de rezoluție scăzută prin stivuirea elementelor adiacente în diferite canale în loc de locații spațiale. Acesta transformă harta de dimensiunea 26 x 26 x 512 într-o hartă a caracteristicilor de 13 x 13 x 2048, care poate fi concatenată cu caracteristicile originale. 4.2.3 Realizarea detecției Rețeaua neuronală YOLO împarte imaginea de intrare într-o grilă de celule de dimensiunile S x S. Daca centrul unui obiect se află într-o celulă din grilă, acea celulă este responsabilă cu detecția acelui obiect. Fiecare celulă din grilă prezice B zone de încadrare și scorul de încredere pentru aceste zone. Aceste scoruri de încredere reflectă cât de încrezător este sistemul că zona de încadrare conține un obiect, și de asemenea, cât de precisă crede că este zona care încadrează obiectul. Fiecare zonă de încadrare constă din 5 predicții: x, y, w, h , scorul de încredere. În ceea ce privește obiectul detectat celula din grilă va fi asociată unei secvențe de probabilități de clase pentru a estima clasificarea obiectului pentru C clase ale sistemului. Numărul zonelor de încadrare prezise este calculat cu următoarea formulă: 𝑆×𝑆×(𝐵∗5+𝐶) S x S: reprezintă numărul de celulelor în care a fost împărțită imaginea de la intrare B: reprezintă numărul zonelor de încadrare prezise pentru o celulă C: reprezintă numărul de clase pentru care a fost antrenat sistemul. 20 Pentru a alege zona de încadrare potrivită pentru o celulă din grilă, rețeaua selectează zona de încadrare cu cel mai mare scor IOU. Pentru a calcula pierderile YOLO folosește eroarea medie pătrată între predicții și ground truth. Funcția de pierderi totală este compusă din trei funcții de pierderi: pierderea localizării, pierderea de clasificare și pierderea de încredere. Pentru a elimina detecțiile multiple pentru același obiect sistemul YOLO folosește suprimarea non- maximală. Dacă avem IOU ≥ 0,5 între oricare dintre predicțiile din imagine, suprimarea non- maximală șterge predicția cu cel mai mic scor de încredere. Rezultatul unei detecții realizat cu rețeaua neuronală YOLOV2 este reprezentat în figura 3. Figura 3. Rezultatul detecției utilizând YOLOV2 4.2.4 Îmbunătățiri făcute pentru YOLOV3 YOLOV3 [26] este o versiune îmbunătățită față de versiunile precedente YOLOV1 și YOLOV2 [ 9]. Prima îmbunătățire făcută rețelei YOLOv3 este utilizarea clasificării prin etichetare multiplă, care este diferită de etichetarea reciprocă exclusivă utilizată în versiunile anterioare. Acesta metodă utilizează un clasificator logistic pentru a calcula probabilitatea ca obiectul să aibă o etichetă specifică. Versiunile anterioare utilizează funcția softmax pentru a determina probabilitățile din scoruri. Pentru pierderea de clasificare este utilizată pierderea de entropie binară pentru fiecare etichetă, în loc de eroarea medie pătrată utilizată în versiunile anterioare. Cea de-a doua îmbunătățire făcută reprezintă utilizarea unei metode diferite de predicție a zonelor de încadrare. Această metodă asociază scorul de obiect 1 la zona de încadrare care se suprapune cel mai bine peste obiectul detectat și ignoră celelalte zone de încadrare detectate care se suprapun peste obiect în funcție de un prag ales (0.7 este utilizat în rețeaua YOLOV3). Prin urmare sistemul asigură o singură zonă de încadrare pentru fiecare obiect detectat. A treia îmbunătățire făcută este folosirea predicției pe scări folosind conceptul de rețele piramidale caracteristice. YOLOV3 prezice trei zone de încadrare de scale diferite apoi extrage caracteristicile din aceste zone, ca în figura 4. 21 Figura 4. Generarea zonelor de încadrare și detecția obiectelor Rezultatul predicției realizat de rețea este un vector cu dimensiunea egală cu 3 care conține coordonatele zonei de încadrare, gradul de încredere al detecției și clasa detectată. Acesta este motivul pentru care dimensiunea vectorului de la ieșire a fost modificată, fața de versiunile YOLO anterioare, după următoarea formulă: 𝑁×𝑁×(3∗(4+1+ 𝐶)) N x N: reprezintă numărul de celulelor în care a fost împărțită imaginea de la intrare 3: pentru a decoda caracteristicile extrase de cele trei zone de încadrare de dimensiuni diferite 4 + 1: pentru a decoda decalajul zonei de încadrare + gradul de încredere al detecției C: reprezintă numărul de clase pentru care a fost antrenat sistemul. Ultima îmbunătățire făcută rețelei reprezintă utilizarea noului extractor de caracteristici CNN numit Darknet-53. Darknet-53 reprezintă o rețea neuronală convoluțională cu 53 de straturi care utilizează rețeaua de conexiuni prin sărituri. Utilizează, de asemenea, straturi convoluționale de dimensiunea 3 x 3 și 1 x 1. Acest aspect a demonstrat o precizie și viteză de detecție mult mai bună. 4.2.5 Avantajele utilizării YOLOV3 O singură rețea de convoluție prezice simultan mai multe zone de încadrare și gradele de încredere pentru acele zone de încadrare. YOLO este antrenat pe imagini complete ceea ce optimizează direct procesul de detecție. Acest model unificat are mai multe avantaje față de metodele tradiționale de detectare a obiectelor. În primul rând, YOLO este extrem de rapid deoarece face ca detecția să fie o problemă de regresie, astfel nu este nevoie de o rețea complexă. YOLOV3 rulează la 45 de cadre pe secundă, fără nici o prelucrare discontinuă, pe Unitate de Procesare Grafică (GPU) Titan X, iar versiunea rapidă YOLOV3-tiny rulează la peste 150 de cadre pe secundă. Datorită acestui aspect YOLOV3 poate procesa streaming video în timp real cu mai puțin de 25 de milisecunde de latență. În al doilea rând, YOLOV3 face predicția pe imagine la nivel global, face predicții pe toată imaginea. Spre deosebire de tehnicile bazate pe propuneri de ferestre și de regiuni, YOLO vede 22 întreaga imagine în timpul antrenamentului și în timpul testării, astfel încât codifică implicit informațiile contextuale despre clase, precum și aspectul lor. În al treilea rând YOLO învață reprezentări generalizate ale obiectelor. Atunci când sistemul este antrenat pe imagini natural și testat pe operele de artă, YOLO depășește celelalte rețele neuronale convoluționale, ca DPM și R-CNN. 23 5 IMPLEMENTAREA SOLUȚIEI ADOPTATE 5.1 Introducere În acest capitol este descrisă rețeaua neuronală convoluțională care este utilizată pentru sistemul de detecție de obiecte, procesul de configurare al PC, specificațiile PC folosit și procesul de antrenare al rețelei neuronale, codul în limbajul de programare Python cu funcții din OpenCV implementat pentru realizarea sistemul de detecție și modul de testare al sistemului și sistemul de testare al rețelei neuronale utilizând Darknet. 5.2 YOLOV3-tiny YOLOV3-tiny reprezintă versiunea mai mică și mai rapidă a rețelei neuronale convoluționale YOLOV3. Acest model de rețea neuronală este formată din 16 straturi convoluționale de dimensiunile 3 x 3 și 1 x 1. Arhitectura YOLOV3-tiny este reprezentată în tabelul 2. Tabel 2. Ahitectura YOLO-tiny Nume Filtru Dimensiunea de ie șire Convoluțional 1 3 x 3 / 1 224 x 224 x 16 Max pooling 1 2 x 2 / 1 112 x 112 x 16 Convoluțional 2 3 x 3 / 1 112 x 112 x 32 Max pooling 2 2 x 2 / 2 56 x 56 x 32 Convoluțional 3 1 x 1 / 1 56 x 56 x 16 Convoluțional 4 3 x 3 / 1 56 x 56 x 128 Convoluțional 5 1 x 1 / 1 56 x 56 x 16 Convoluțional 6 3 x 3 / 1 56 x 56 x 128 Max pooling 3 2 x 2 / 2 28 x 28 x 128 Convoluțional 7 1 x 1 / 1 28 x 28 x 32 Convoluțional 8 3 x 3 / 1 28 x 28 x 256 Convoluțional 9 1 x 1 / 1 28 x 28 x 32 Convoluțional 10 3 x 3 / 1 28 x 28 x 256 Max pooling 4 2 x 2 / 2 14 x 14 x 256 Convoluțional 11 1 x 1 / 1 14 x 14 x 64 Convoluțional 12 3 x 3 / 1 14 x 14 x 512 Convoluțional 13 1 x 1 / 1 14 x 14 x 64 Convoluțional 14 3 x 3 / 1 14 x 14 x 512 Convoluțional 15 1 x 1 / 1 14 x 14 x 128 Convoluțional 16 1 x 1 / 1 14 x 14 x 1000 Average 1000 Softmax 1000 Cost 1000 Alegem această versiune de rețea neuronală convoluțională deoarece are mai puține straturi convoluționale astfel durata de antrenare va fi mai mică și rulează detecția mult mai rapid ca versiune mare YOLOV3. 24 5.3 Instalare Darknet si configurare PC Pentru antrenarea sistemului s-a utilizat o stație PC cu următoarea configurare: Unitate de Procesare Grafică NVIDIA GeForce GTX 780 TI cu memorie de 3 GB Unitate Centrală de Procesare Intel Xeon CPU E5-1620 cu frecvența de 3,6 GHz și patru nuclee 32 GB de memorie RAM Sistemul de operare Windows 10. Timpii determinați în procesul de antrenare și detecție nu sunt standard ci sunt influențati de configurația PC-ul utilizat. Darknet reprezintă un cadru pentru rețelele neuronale scris în limbajele de programare C și CUDA pe care îl vom folosi pentru a ne antrena rețeaua neuronală convoluțională proprie. Este rapid, ușor de instalat și poate fi rulat folosind CPU (Unitate Centrală de Procesare), dar și GPU (Unitate de Procesare Grafică). Pentru a putea instala Darknet, mai întâi trebuie să descărcăm pachetul de pe GitHub [27]. După ce am descărcat Darknet, trebuie să descărcăm și să instalăm OpenCV [28] versiunea 3.0 pentru a putea instala și rula Darkent pe CPU. În cazul în care dorim să rulăm Darknet folosind GPU trebuie să mai instalăm CUDA [29] versiunea 10.0. CUDA reprezintă o platformă de calcul paralelă și un mod de programare care utilizează GPU în loc de CPU pentru procesarea calculelor. Deoarece Darknet este scris în limbajul de programare C, acesta trebuie compilat utilizând Microsoft Visual Studio 2015 sau altă versiune mai nouă. Dacă compilarea reușește fără să obținem vreo eroare, atunci Darkent este instalat cu succes. Putem verifica acest lucru rulând o detecție pe o imagine oarecare cu următoarea comandă, din Panoul de Comandă din Windows: “darknet.exe detect cfg/yolov3.cfg yolov3.weights data/dog.jpg” . Pentru a determina care variantă de rulare este mai eficientă am testat timpul de detecție pe mai multe versiuni ale rețelei neuronale YOLO. Diferențele de timp dintre rularea pe CPU și rularea pe GPU sunt destul de mari și sunt exemplificate in tabelul 3, timpul este măsurat în milisecunde. Conform valorilor din tabel cel mai eficient este să rulăm procesul de recunoaștere și detecție pe GPU pentru a avea rezultate cât mai rapide. Tabel 3. Testare timp de detecție YOLOV2 YOLOV3 YOLOV3-tiny CPU 1348 ms 2790 ms 309 ms GPU 245 ms 283 ms 229 ms 25 5.4 Antrenare YOLOV3-tiny 5.4.1 Colectarea imaginilor pentru antrenare Rețeaua neuronală convoluțională propusă în lucrare este antrenată pentru a recunoaște și detecta clasa vehicule. Pentru a obține imagini necesare pentru a crea setul de date pentru antrenare extragem cadre din secvențe video cu traficul de pe străzi. Din videoclipurile filmate au fost extrase 850 de imagini care conțineau diferite modele de mașini pentru a crea setul de date. O perspectivă asupra setulului de date descărcat este reprezentată în figura 5. După ce am extras cadrele pentru setul de date trebuie să redenumim toate imaginile în ordine crescătoare începând de la 0. Figura 5. Perspectivă asupra setului de imagini utilizat 5.4.2 Etichetarea zonelor de obiect Acum luăm fiecare imagine din setul de date și etichetăm zonele care trebuie să încadreze obiectele ce urmează să fie detectate în imaginea respectivă, astfel vom avea pentru fiecare imagine din setul de date un fișier text cu coordonatele zonelor de încadrare. Aceste fișiere cu coordonate vor avea același nume cu imaginea căreia îi corespund. Pentru a desena zonele de încadrare și pentru a salva coordonatele lor în fișiere text folosim un script scris în limbajul de programare Python, reprezentat în figura 6. 26 Figura 6. Desenarea zonelor de încadrare 5.4.3 Pregătirea fișierelor necesare Pentru început trebuie să facem o copie la fișierul de configurație al rețelei neuronale YOLOV3-tiny pe care îl redenumim YOLOV3-tiny-obj.cfg. În acest fișier modificăm valoarea lotului (batch) la 64, valoarea subdiviziunilor (subdivision) la 8. Următorul pas reprezintă calcularea numărului de filtre (filtres) folosind formula de la (): 𝑓𝑖𝑙𝑡𝑒𝑟𝑠 = (𝑐𝑙𝑎𝑠𝑠𝑒𝑠+5)×3 După ce am calculat numărul de filtre modificăm valoarea acestora și numărul de clase (classes), aici scriem numărul de clase pentru care vrem să antrenăm sistemul, în fișierul de configurare. 27 Un alt pas important care trebuie realizat reprezintă calcularea valorilor anchors boxes, care se face cu comanda: “darknet.exe detector calc_anchors data/obj.data -num_of_clusters 6 –width 416 –height 416” . Noile valori ale anchors boxes le scriem în fișierul de configurare al rețelei neuronale. Aceste valori reprezintă cel mai important parametru pentru îmbunătățirea performanțelor în procesul de antrenare. Dacă nu sunt calculate corect sistemul nu va fii în stare să detecteze corect obiectele din imagini. Ultimul pas reprezintă crearea a două fișiere unul cu numele obj.names în care vom scrie pe câte o linie numele fiecărei clase pentru care se face antrenarea și un fișier cu numele obj.data în care vom scrie numărul de clase, locația setului de imagini pentru antrenare, locația fișierului care conține numele claselor pentru care se face antrenarea, dar și locația în care vrem să salvăm noul fișier cu ponderi: 5.4.4 Antrenarea rețelei neuronale Pentru antrenarea sistemului vom urmării timpul necesar pentru antrenare atât pe CPU cât și pe GPU. Pentru acest experiment antrenăm rețeaua neuronală YOLOV3-tiny mai întâi pe GPU, iar apoi pe CPU. Timpul de realizare a unei iterații este măsurat în secunde și reprezentat în tabelul 4. Tabelul 4. Testare timp de antrenare GPU NVIDIA GeForce GTX 780 TI 2,7 s CPU Intel Xeon CPU E5 -1620, 3,60 GHz 214 s Din tabel reiese că antrenarea rețelei pe GPU este de aproximativ 100 de ori mai rapidă decât antrenarea pe CPU. Pentru a porni antrenarea mai întâi selectăm fișierul cu ponderi pre-antrenat folosind comanda: “darknet.exe partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15” în Panoul de Comandă, astfel vom antrena rețeaua neuronală să detecteze doar clasele de obiecte pe care le dorim. Acum tot ce mai trebuie să facem este să pornim antrenarea. În Panoul de Comandă din Windows rulăm următoarea comandă: “darknet.exe detector train data/obj.data yolov3-tiny-obj.cfg yolov3-tiny.conv.15”. După ce începe antrenarea la fiecare iterație vom obține următoarele informații: 28 Prima valoare din printscreen-ul de mai sus reprezintă numărul de iterații care au fost realizate în procesul de antrenare, a doua valoare reprezintă pierderea medie (average loss) precedentă, iar a treia valoare reprezintă pierderea medie actuală. 5.4.5 Oprirea antrenării Putem să oprim antrenarea rețelei neuronale după aproximativ 2000 de iterații pentru fiecare clasă. Antrenarea se poate opri și în cazul în care pierderea medie este mai mică decât 1, iar după mai multe iterații aceasta nu mai scade. Pierderea medie finală poate să fie între 0.05 (daca folosim o versiune YOLO mai simpla cum ar fi YOLOv3-tiny și setul de date este simplu) și 3.0 (daca folosim o versiune YOLO mai complexă, de exemplu YOLOV3 și setul de date este complex). După ce am oprit antrenarea trebuie să alegem fișierul cu ponderi care oferă cele mai bune rezultate. De exemplu, în cazul în care oprim antrenarea după 8000 de iterații, cel mai bun rezultat s-ar putea sa îl ofere fișierul cu ponderi care a fost antrenat doar 7000 sau 6000 de iterații. Acest rezultat apare datorită fenomenului de overfitting. Overfittingul reprezintă fenomenul în care sistemul poate detecta obiecte din imaginile din setul de date folosit pentru antrenare dar nu mai poate detecta obiecte din alte imagini. 5.5 Sistem Testare model YOLOV3-tiny antrenat 5.5.1 Sistem testare model YOLO bazat pe funcțiile din OpenCV Sistemul de testare model YOLO este implementat în Python utilizând Jupyter Notebook și Spyder, bazat pe funcțiile din pachetul OpenCV care s-a rulat CPU, deoarece pentru rulare GPU necesita Unitate de Procesare Grafică de la producătorul Intel. Pentru început trebuie să importam pachetele necesare pentru a dezvolta codul pentru rularea sistemului de detecție de mașini pe secvențe video: NumPy este pachetul fundamental pentru tehnică de calcul științifică cu limbajul de programare Python. Acesta conține, printre altele: o puternica matrice de dimensiune n, funcții sofisticate, instrumente pentru integrarea codurilor în C/C++ și Fortran precum și funcții de algebră liniară, transformată Fourier, generare de numere aleatorii. Pe lângă utilizarea sa științifică evidentă, NumPy poate fi de asemenea utilizat ca un container multidimensional eficient de date generice. Pachetul Imutils conține o serie de funcții pentru a face mai ușor funcțiile de procesare a imaginilor, cum ar fi traducerea, rotirea, redimensionarea, scheletizarea și afișarea lor. Pachetul Time oferă diferite funcții legate de timp. CV2 reprezintă pachetul 29 OpenCV care este o bibliotecă de funcții informatice specializată pe vederea computerizată în timp real. Pachetul OS oferă un mod portabil de utilizare a funcționalității dependente de sistemul de operare. Cu acest pachet putem să citim sau să scriem un fișier, putem să creăm fișiere sau directoare și putem sa manipulam fișiere sau fișiere la nivel înalt. În următoarele secvențe de cod va trebui să setam locațiile fișierelor necesare rețelei neuronale, precum și niște parametri. Încărcam fișierul obj.names din folderul yolo-coco care conține numele claselor pe care trebuie să le detecteze sistemul. După ce am încărcat fișierul, inițializăm o listă de culori care reprezintă fiecare clasă din fișierul obj.names : În continuare selectam fișierul cu configurație YOLOV3-tiny folosit și la antrenare și fișierul cu ponderile rețelei neuronale rezultat după procesul de antrenare: După ce am selectat locațiile în care sunt salvate fișierele de ponderi și configurare încărcăm sistemul de detecție YOLO setăm modul de rulare pe CPU și determinăm numele etichetelor pe care le vom utiliza la detecția de obiecte. Acum selectăm fișierul video pe care se va face detecția: După ce încărcam fișierul video creăm variabile în care vom salva dimensiunile secvenței video, înălțime și lățime, și cadrele din secvența video. Apoi selectă regiunea de interes din video, pentru a realiza detecția doar pe zona dorită, variabila rw reprezintă dimensiunea regiunii de interes, iar rx_min și ry_min reprezintă coordonatele de la care începe regiunea de interes. În continuare calculăm rx_max și ry_max pentru a determina dimensiunea regiunii de interes, apoi selectăm gradul de încredere minim pentru ca o detecție să fie afișată, acesta este setat la 0,5 și pragul de suprapunere la 0,4; în cazul în care doua detecții se suprapun cu un grad mai mare de 0,4 atunci doar o singură detecție va fi afișată. 30 În ultima linie de cod din printscreen se citește un cadru din secvența video. În următoarea secvență de cod salvam cadrul extras din secvența video încărcată pentru a putea determina coordonatele și dimensiunea zonei de interes, iar apoi modificam dimensiunea cadrelor și salvam un cadru doar cu zona de interes selectată: Încercăm sa determinăm numărul cadrelor din secvența video și afișam numărul acestora cu următorul mesaj “[INFO] total frames in video ” ,iar în cazul în care apare o eroare și nu putem determina numărul de cadre va fi afișat un mesaj de atenționare: În următoarea secvență de cod extragem fiecare cadru din secvența video încărcată, în cazul în care nu a mai fost extras un cadru atunci am ajuns la finalul secvenței video și oprim bucla while. În continuare modificam dimensiunea cadrele în funcție de zona de interes aleasă: După ce am redimensionat toate cadrele, folosim variabilele create anterior pentru a obține dimensiunile cadrelor, iar apoi acordăm aceste informații rețelei neuronale YOLOV3-tiny pentru a obține zonele de încadrare și gradele de încredere pentru aceste zone: 31 Definim câte o listă pentru coordonatele zonelor de încadrare, gradul de încredere al detecției și clasa care a fost detectată. În continuare parcurgem fiecare strat din rețeaua neuronală convoluțională, apoi parcurgem fiecare detecție realizată pentru a extrage gradul de încredere și numele clasei detectate: Filtrăm detecțiile realizate care au gradul de încredere mai mic decât 0,4 pentru a păstra doar detecțiile bune, după se face o scalare asupra coordonatelor zonelor de încadrare în funcție de dimensiunea cadrului. Trebuie să ne reamintim că YOLO returnează coordonatele centrului, lățimea și înălțimea zonei de încadrare, astfel folosim coordonatele centrului determinăm coordonatele colțului din stânga sus al zonei de încadrare: În ultimele trei linii de cod din printscreen-ul de mai sus actualizăm listele care conțin coordonatele , gradul de încredere și numele claselor detectate. Aplicăm suprimarea non-maximală cu valoarea de prag egală cu 0,4 pentru a elimina zonele de încadrare care se suprapun peste același obiect detectat. Ne asigurăm ca după ce am aplicat filtrarea în funcție de gradul de încredere și suprimarea non-maximală mai avem măcar o detecție rămasă. În continuare extragem coordonatele zonelor de încadrare, și în funcție de aceste 32 coordonate desenăm zonele de încadrare și eticheta corespunzătoare fiecărui obiect detectat pe din fiecare cadru: În ultima secvență din cod selectăm locația în care vrem să salvăm noua secvență video procesată de sistemul YOLO. Afișăm doua mesaje unul cu durata de procesare a unui cadru de rețeaua neuronală și un mesaj cu durata totală de procesare a secvenței video. După ce secvența video a fost procesată și salvată eliberăm toate resursele utilizate: Pentru testarea sistemul de detecție YOLOV3-tiny mai întâi trebuie sa pregătim fișierele necesare. În folderul “yolo-coco” trebuie să copie fișierele ”obj.names” ”yolov3-tiny- obj_last.weights” și “yolov3-tiny-obj.cfg ”, iar apoi trebuie să copiem fișierul video pe care vrem să facem testarea în folderul “videos”. Sistemul de detecție poate fi utilizat direct și pe stream-ul video de la o cameră. Pentru asta trebuie să modificăm linia de cod, cu care importam secvența video, cu următoarea linie de cod: “cap = cv2.VideoCapture(0)” Astfel utilizăm camera video de la laptop sau camera conectată la PC. Rulăm sistemul de testare YOLOV3-tiny pe o imagine în care avem două mașini obținem următorul rezultat reprezentat în figura 7.Gradele de încredere pentru cele doua detecții sunt foarte bune mai mari de 0,9. 33 Figura 7. Rezultat obținut cu sistemul de detecție implementat 5.5.2 Sistem testare model YOLO bazat pe Darknet cu rulare GPU Sistemul de testare model YOLO bazat pe Darknet cu rulare GPU este utilizat prin rularea următoarei comenzi de la Linia de Comandă din Windows : “darknet.exe detector demo cfg/obj.data yolov3-tiny-obj.cfg yolov3-tiny-obj_last.weights – ext_output test9.mp4” Un cadru din secvența video procesată este reprezentă în figura 8. Deoarece pe sistemul de operare Windows putem rula Darknet doar de la linia de comandă nu putem modifica regiunea de interes a secvenței video pentru a face detecția doar zona dorită. 34 Figura 8. Rezultat obținut cu sistemul de testare bazat pe Darknet 35 6 REZULTATE EXPERIMENTALE 6.1 Testare Darknet pe diferite versiuni YOLO Pentru a determina care metodă de detecție e mai rapidă, cea pe CPU sau cea pe GPU am rulat o serie de detecții utilizând mai multe versiuni ale rețelei neuronale convoluționale YOLO. Rezultatele obținute sunt urmatoarele: YOLOV3 rulare CPU YOLOV3 rulare GPU YOLOV3-tiny rulare CPU YOLOV3-tiny rulare GPU YOLOV2 rulare CPU YOLOV2 rulare GPU 36 Rezultatele detecțiilor nu depind de modul de rulare al detecției și sunt reprezentate în figurile următoarele: YOLOV3 Figura 9. Detecție realizată cu versiunea YOLOV3 YOLOV3-tiny Figura 10. Detecție realizată cu versiunea YOLOV3-tiny 37 YOLOV2 Figura 11. Detecție realizată cu versiunea YOLOV2 Singura diferența obținută în urma detecției pe aceeași imagine este faptul ca versiunea YOLOV3-tiny realizează o detecție dublă asupra obiectului camion pe care îl percepe și ca mașină. 6.2 Setul de imagini utilizat la antrenare În procesul de antrenare au fost utilizate 850 de imagini. Aceste imagini au fost extrase din secvențe video filmate din diferite perspective și conțin diferite modele de mașini. Figura 12 reprezintă o perspectivă asupra setului de imagini. Figura 12. Perspectivă asupra setului de imagini utilizat la antrenare 38 6.3 Etichetarea zonelor de obiect În fiecare imagine din setul de date etichetăm zonele care trebuie să încadreze obiectele ce urmează să fie detectate din imaginea respectiva, astfel vom avea pentru fiecare imagine din setul de date un fișier text cu coordonatele zonelor de încadrare. Figura 13. Desenarea zonelor de încadrare 39 Figura 14. Desenarea zonelor de încadrare Figura 15. Desenarea zonelor de încadrare 40 Figura 16. Desenarea zonelor de încadrare După ce am etichetat fiecare zonă de încadrare din fiecare imagine obținem un set de date care conține imaginile necesare pentru antrenare și fișierele text care conțin coordonatele zonelor de încadrare. O perspectivă asupra setului de date complet este reprezentată în figura 16. Figura 16. Perspectivă asupra setului de date 41 6.4 Sistem testare model YOLO bazat pe funcțiile din OpenCV Sistemul de testare model YOLO bazat pe funcții din OpenCV a fost rulat pe mai multe secvențe video pentru a testa acuratețea de detecție. Din prima secvență video utilizată la testare extragem un cadru, reprezentat în figura 17. Figura 17. Cadru extras din prima secvență video După ce am extras un cadru din secvența video selectăm zona de interes pe care vrem să se realizeze detecția vehiculelor. Coordonatele de la care începe prima zonă de interes sunt rx_min = 310 și ry_min = 0 . Dimensiunea zonei de interes este rw = 170 . Zonă de interes extrasă este reprezentată în figura 18. Figura 18. Zonă de interes extrasă din prima secvență video 42 Rezultatele obținute în urma rulării sistemului de detecție pe zona de interes selectată sunt reprezentate în figurile 19, 20, 21. Figura 19. Rezultat obținut în urma detecției Figura 20. Rezultat obținut în urma detecției Figura 21. Rezultat obținut în urma detecției 43 A două zonă de interes extrasă din prima secvență video are următoarele coordonate rx_min = 300 și ry_min = 454 . Dimensiunea zonei de interes este rw = 180 . Zonă de interes extrasă este reprezentată în figura 22. Figura 22. Zonă de interes extrasă din prima secvență video Rezultatele obținute în urma rulării sistemului de detecție pe zona de interes selectată sunt reprezentate în figurile 23, 24, 25. Figura 23. Rezultat obținut în urma detecției 44 Figura 24. Rezultat obținut în urma detecției Figura 25. Rezultat obținut în urma detecției Timpul necesar pentru a procesa un cadru din secvența video și timpul total necesar pentru a procesa întreaga secvență sunt reprezentate mai jos: 45 Din a doua secvență video utilizată la testare extragem un cadru, reprezentat în figura 26. Figura 26. Cadru extras din a doua secvență video Coordonatele de la care începe zonă de interes sunt rx_min = 289 și ry_min = 451 . Dimensiunea zonei de interes este rw = 160 . Zonă de interes extrasă este reprezentată în figura 27. Figura 27. Zonă de interes extrasă din prima secvență video Rezultatele obținute în urma rulării sistemului de detecție pe zona de interes selectată sunt reprezentate în figurile 28, 29, 30. 46 Figura 28. Rezultat obținut în urma detecției Figura 29. Rezultat obținut în urma detecției Figura 30. Rezultat obținut în urma detecției 47 Timpul necesar pentru a procesa un cadru din secvența video și timpul total necesar pentru a procesa întreaga secvență sunt reprezentate mai jos: 48 7 CONCLUZII Detectarea și clasificarea vehiculelor au o mare influență asupra progreselor înregistrate în domeniul sistemelor inteligente de transport. Această sarcină de viziune a calculatorului contribuie la dezvoltarea unor drumuri mai bune prin analizarea traficului și sprijinirea prevenirii sau detectării accidentelor din trafic. Deși este util în multe feluri, detectarea și clasificarea vehiculelor nu este o sarcină ușoară. Detectarea și clasificarea obiectelor a devenit mai rapidă odată cu creșterea popularității rețelelor neuronale convoluționale. Aceste rețele neuronale pot produce rezultate pe seturi de date mari, fără să mai fie nevoie de extracție de caracteristici suplimentare și preprocesare extinsă în majoritatea cazurilor. În această lucrare, detecția și clasificarea vehiculelor se face folosind rețele neuronale convoluționale, deoarece acestea s-au dovedit a fi o alegere potrivită pentru această sarcină. Clasificarea vehiculelor este o sarcină binară de clasificare în care rețeaua trebuie să facă diferența între două tipuri de date: vehicule și fundal. Pentru detectarea vehiculelor, rețeaua neuronală sugerată este antrenată să prezică coordonatele zonelor de încadrare ale vehiculelor. Această sarcină implică înțelegerea atunci când nu există un vehicul prezent într-o imagine. În urma rezultatelor experimentale obținute în procesul de detecție, se poate concluziona că sistemul de detecție de vehicule are o acuratețe bună fiind în stare să detecteze vehiculele din diferite perspective, iar timpul de procesare este mic chiar dacă rularea se face pe CPU. 49 8 BIBLIOGRAFIE [1] H. Bay, A. Ess, T. Tuytelaars, and L. Van Gool, “Speeded-up robust features (SURF),” Computer vision and image understanding, vol. 110, no. 3, pp. 346–359, 2008. [2] N. Dalal and B. Triggs, “Histograms of oriented gradients for human detection,” in Computer Vision and Pattern Recognition, 2005. CVPR 2005. IEEE Computer Society Conference on, vol. 1, pp. 886–893, IEEE, 2005. [3] D. G. Lowe, “Distinctive image features from scale-invariant keypoints,” International journal of computer vision, vol. 60, no. 2, pp. 91–110, 2004. [4] S. Srinivas, R. K. Sarvadevabhatla, K. R. Mopuri, N. Prabhu, S. S. S. Kruthiventi, and R. V. Babu, “A Taxonomy of Deep Convolutional Neural Nets for Computer Vision,” CoRR, vol. abs/1601.06615, 2016. [5] Y. LeCun, B. E. Boser, J. S. Denker, D. Henderson, R. E. Howard, W. E. Hubbard, and L. D. Jackel, “Handwritten digit recognition with a back-propagation network,” in Advances in neural information processing systems, pp. 396–404, 1990. [6] Y. LeCun, B. E. Boser, J. S. Denker, D. Henderson, R. E. Howard, W. E. Hubbard, and L. D. Jackel, “Handwritten digit recognition with a back-propagation network,” in Advances in neural information processing systems, pp. 396–404, 1990. [7] P.Sermanet, D.Eigen,X.Zhang, M.Mathieu, R.Fergus, andY.LeCun,“OverFeat: IntegratedRecognition, LocalizationandDetectionusingConvolutionalNetworks,” CoRR, vol. abs/1312.6229, 2013. [8] R. B. Girshick, J. Donahue, T. Darrell, and J. Malik, “Rich feature hierarchies for accurate object detection and semantic segmentation,” CoRR, vol. abs/1311.2524, 2013. [9] J. Redmon and A. Farhadi, “YOLO9000: better, faster, stronger,” in 2017 IEEE Conference on Computer Vision and Pattern Recognition, CVPR 2017, Honolulu, HI, USA, July 21-26, 2017, pp. 6517–6525, 2017. [10] M. Liang and X. Hu, “Recurrent convolutional neural network for object recognition,” in Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 3367– 3375, 2015. [11] A. Krizhevsky, I. Sutskever, and G. E. Hinton, “Imagenet classification with deep convolutional neural networks,” in Advances in neural information processing systems, pp. 1097–1105, 2012. [12] K. Simonyan and A. Zisserman, “Very deep convolutional networks for large-scale image recognition,” arXiv preprint arXiv:1409.1556, 2014. [13] J. Wang, Y. Yang, J. Mao, Z. Huang, C. Huang, and W. Xu, “Cnn-rnn: A unified framework for multi-label image classification,” in Computer Vision and Pattern Recognition (CVPR), 2016 IEEE Conference on, pp. 2285–2294, IEEE, 2016. [14] Z. Dong, Y. Wu, M. Pei, and Y. Jia, “Vehicle type classification using a semisupervised convolutional neural network,” IEEE transactions on intelligent transportation systems, vol. 16, no. 4, pp. 2247–2256, 2015. [15] Z. Dong, M. Pei, Y. He, T. Liu, Y. Dong, and Y. Jia, “Vehicle Type Classification Using Unsupervised Convolutional Neural Network,” in 2014 22nd International Conference on Pattern Recognition, pp. 172–177, Aug 2014. [16] C.M.Bautista, C.A.Dy, M.I.Mañalac, R.A.Orbe, and M.Cordel, “Convolutional neural network for vehicle detection in low resolution traffic videos,” in Region 10 Symposium (TENSYMP), 2016 IEEE, pp. 277–281, IEEE, 2016. 50 [17] Y. Zhou, H. Nejati, T.-T. Do, N.-M. Cheung, and L. Cheah, “Image-based vehicle analysis using deep neural network: A systematic study,” in Digital Signal Processing (DSP), 2016 IEEE International Conference on, pp. 276–280, IEEE, 2016. [18] M. A. Manzoor and Y. Morgan, “Vehicle Make and Model classification system using bag of SIFT features,” in Computing and Communication Workshop and Conference (CCWC), 2017 IEEE 7th Annual, pp. 1–5, IEEE, 2017. [19] M. C. Narhe and M. Nagmode, “Vehicle classification using SIFT,” International [20] J.-W. Hsieh, L.-C. Chen, and D.-Y. Chen, “Symmetrical SURF and its applications to vehicle detection and vehicle make and model recognition,” IEEE Transactions on intelligent transportation systems, vol. 15, no. 1, pp. 6–20, 2014. [21] X. Li and X. Guo, “A HOG feature and SVM based method for forward vehicle detection with single camera,” in Intelligent Human-Machine Systems and Cybernetics (IHMSC), 2013 5th International Conference on, vol. 1, pp. 263–266, IEEE, 2013. [22] S. Sivaraman and M. M. Trivedi, “Looking at vehicles on the road: A survey of vision-based vehicle detection, tracking, and behavior analysis, ”IEEETransactions on Intelligent Transportation Systems, vol. 14, no. 4, pp. 1773–1795, 2013. [23] P. Negri, X. Clady, S. M. Hanif, and L. Prevost, “A cascade of boosted generative and discriminative classifiers for vehicle detection, ”EURASIP Journal on Advances in Signal Processing, vol. 2008, p. 136, 2008. [24] S. Ioffe and C. Szegedy. Batch normalization: Accelerating deep network training by reducing internal covariate shift. arXiv preprint arXiv:1502.03167, 2015. 2, 5 Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specification, IEEE Std. 802.11, 1997. [25] O. Russakovsky, J. Deng, H. Su, J. Krause, S. Satheesh, S. Ma, Z. Huang, A. Karpathy, A. Khosla, M. Bernstein, A. C. Berg, and L. Fei-Fei. ImageNet Large Scale Visual Recognition Challenge. International Journal of Computer Vision (IJCV), 2015. [26] J. Redmon and A. Farhadi, “Yolov3: An incremental improvement,” CoRR, vol. abs/1804.02767, 2018. [27] Yolo-v3 and Yolo-v2 for Windows and Linux [online 15.07.2019] https://github.com/AlexeyAB/darknet [28] OpenCV [online 15.07.2019] https://opencv.org/opencv-3-0/ [29] CUDA Toolkit 10.0 Archive [online 15.07.2019], https://developer.nvidia.com/cuda-10.0-download-archive 51 ANEXE # import the necessary packages import numpy as np import imutils import time import cv2 import os # load the COCO class labels our YOLO model was trained on labelsPath = os.path.sep.join([„yolo-coco”, „obj.names”]) LABELS = open(labelsPath).read().strip().split(„\n”) # initialize a list of colors to represent each possible class label np.random.seed(42) COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype=”uint8″) # derive the paths to the YOLO weights and model configuration weightsPath = „yolo-coco/yolov3-tiny-obj_last.weights” configPath = „yolo-coco/yolov3-tiny-obj.cfg” # load our YOLO object detector trained on COCO dataset (80 classes) # and determine only the *output* layer names that we need from YOLO print(„[INFO] loading YOLO from disk…”) net = cv2.dnn.readNetFromDarknet(configPath, weightsPath) net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV) net.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU) ln = net.getLayerNames() ln = [ln[i[0] – 1] for i in net.getUnconnectedOutLayers()] #%% # initialize the video stream, pointer to output video file, and fileName = „test3” # frame dimensions vs = cv2.VideoCapture(„./videos/”+fileName+ „.mp4”) writer = None (W, H) = (None, None) # test 1 roi jos #rw = 200 #rx_min = 63 #ry_min = 184 ## test 1 roi sus rw = 170 rx_min = 295 ry_min = 359 rx_max = rx_min + rw ry_max = ry_min + rw 52 confidencePar = 0.5 thresholdPar = 0.4 (grabbed, frame) = vs.read() #(W, H) = frame.shape[0:2] #M = cv2.getRotationMatrix2D((H/2,W/2),-90,1) #frame = cv2.warpAffine(frame, M, (H, W)) cv2.imwrite(os.path.sep.join([„rez/”, fileName+”.jpg”]),frame) frame = frame[rx_min:rx_max,ry_min:ry_max,:] cv2.imwrite(os.path.sep.join([„rez/”, fileName+”_c.jpg”]),frame) #%% # try to determine the total number of frames in the video file try: prop = cv2.cv.CV_CAP_PROP_FRAME_COUNT if imutils.is_cv2() \ else cv2.CAP_PROP_FRAME_COUNT total = int(vs.get(prop)) print(„[INFO] {} total frames in video”.format(total)) # an error occurred while trying to determine the total # number of frames in the video file except: print(„[INFO] could not determine # of frames in video”) print(„[INFO] no approx. completion time can be provided”) total = -1 # loop over frames from the video file stream while True: # read the next frame from the file (grabbed, frame) = vs.read() # if the frame was not grabbed, then we have reached the end # of the stream if not grabbed: break #M = cv2.getRotationMatrix2D((H/2,W/2),-90,1) #frame = cv2.warpAffine(frame, M, (H, W)) frame = frame[rx_min:rx_max,ry_min:ry_max,:] # if the frame dimensions are empty, grab them if W is None or H is None: (H, W) = frame.shape[:2] # construct a blob from the input frame and then perform a forward # pass of the YOLO object detector, giving us our bounding boxes # and associated probabilities blob = cv2.dnn.blobFromImage(frame, 1 / 255.0, (416, 416), swapRB=True, crop=False) net.setInput(blob) start = time.time() 53 layerOutputs = net.forward(ln) end = time.time() # initialize our lists of detected bounding boxes, confidences, # and class IDs, respectively boxes = [] confidences = [] classIDs = [] # loop over each of the layer outputs for output in layerOutputs: # loop over each of the detections for detection in output: # extract the class ID and confidence (i.e., probability) # of the current object detection scores = detection[5:] classID = np.argmax(scores) confidence = scores[classID] # filter out weak predictions by ensuring the detected # probability is greater than the minimum probability if confidence > confidencePar: # scale the bounding box coordinates back relative to # the size of the image, keeping in mind that YOLO # actually returns the center (x, y)-coordinates of # the bounding box followed by the boxes’ width and # height box = detection[0:4] * np.array([W, H, W, H]) (centerX, centerY, width, height) = box.astype(„int”) # use the center (x, y)-coordinates to derive the top # and and left corner of the bounding box x = int(centerX – (width / 2)) y = int(centerY – (height / 2)) # update our list of bounding box coordinates, # confidences, and class IDs boxes.append([x, y, int(width), int(height)]) confidences.append(float(confidence)) classIDs.append(classID) # apply non-maxima suppression to suppress weak, overlapping # bounding boxes idxs = cv2.dnn.NMSBoxes(boxes, confidences, confidencePar,thresholdPar) #classIDsIn = [] # ensure at least one detection exists if len(idxs) > 0: # loop over the indexes we are keeping for i in idxs.flatten(): # extract the bounding box coordinates (x, y) = (boxes[i][0], boxes[i][1]) (w, h) = (boxes[i][2], boxes[i][3]) 54 # draw a bounding box rectangle and label on the frame color = [int(c) for c in COLORS[classIDs[i]]] cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2) text = „{}: {:.4f}”.format(LABELS[classIDs[i]], confidences[i]) cv2.putText(frame, text, (x, y – 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) # check if the video writer is None if writer is None: # initialize our video writer fourcc = cv2.VideoWriter_fourcc(*”MJPG”) fileOut = os.path.join(„./output/”,fileName+”.avi”) writer = cv2.VideoWriter(fileOut, fourcc, 30, (frame.shape[1], frame.shape[0]), True) # some information on processing single frame if total > 0: elap = (end – start) print(„[INFO] single frame took {:.4f} seconds”.format(elap)) print(„[INFO] estimated total time to finish: {:.4f}”.format(elap * total)) # write the output frame to disk writer.write(frame) # release the file pointers print(„[INFO] cleaning up…”) writer.release() vs.release()
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: Hanes.eunice7@yahoo.ro 975 Licentaa Yolo Masini Text (ID: 700256)
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.
