Documente Academic
Documente Profesional
Documente Cultură
BUCUREŞTI
2018
NECLASIFICAT
Cuprins
CAPITOLUL 1 - Introducere............................................................................................................. 5
1.1 Componența unui UAS ............................................................................................................ 5
1.2 Sistem de urmărire ................................................................................................................... 6
1.3 Metode de reprezentare a țintelor dinamice si statice ................................................................ 8
CAPITOLUL 2 – Descrierea sistemului ........................................................................................... 12
2.1 Structura sistemului ............................................................................................................... 12
2.2 Camera stereo ZED................................................................................................................ 12
2.3 Modulul de procesare video Nvidia Jetson TX2 ..................................................................... 17
2.4 Interfață Carrier Orbitty ......................................................................................................... 18
2.5 Transmisie de date UART ...................................................................................................... 19
2.6 Biblioteca publică OpenCV.................................................................................................... 21
2.7 Limbaj de programare Python 3.5 .......................................................................................... 23
2.8 Sistemul de operare Linux...................................................................................................... 24
CAPITOLUL 3 – Sisteme de coordonate ......................................................................................... 25
3.1 Relații de legătura între sistemele de coordonate .................................................................... 25
3.2 Modelul matematic al unei camere ........................................................................................ 26
3.3 Sistem girostabilizat pentru controlul camerei ........................................................................ 27
CAPITOLUL 4 – Metode de urmărire studiate................................................................................. 30
4.1 Descrierea procesului de urmărire .......................................................................................... 30
4.2 Clasificarea metodelor de urmărire ......................................................................................... 30
4.3 Algoritmul BOOSTING ......................................................................................................... 32
4.4 Algoritmul bazat pe fluxul optic (Dense Optical Flow) ........................................................... 32
4.5 Metoda Lucas-Kanade ........................................................................................................... 34
4.6 Algoritmul TLD (Urmarire Invatare Detectare) ...................................................................... 37
4.7 Algoritmul MIL (Invatarea Instantelor Multiple) .................................................................... 39
4.8 Ipoteza GMIL ........................................................................................................................ 41
CAPITOLUL 5 – Comparație a tehnicilor de urmărire ..................................................................... 43
5.1 Urmărirea punctelor ............................................................................................................... 43
5.1.1 Metoda deterministă ........................................................................................................ 43
5.1.2 Metoda statistica ............................................................................................................. 44
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
Listă figuri
Figura 1.1 Componența unui UAS ............................................ Error! Bookmark not defined.
Figura 1.2 Urmărire bazată pe procesare de imagine ............... Error! Bookmark not defined.
Figura 1.3 Tipuri de reprezentări a țintelor ............................... Error! Bookmark not defined.
Figura 2.1 Structura sistemului de urmărire automată ............. Error! Bookmark not defined.
Figura 2.2 Cameră stereo ZED .................................................. Error! Bookmark not defined.
Figura 2.3 Colectarea fluxului video ......................................... Error! Bookmark not defined.
Figura 2.4 Sistemul de coordonate al camerei ZED ................. Error! Bookmark not defined.
Figura 2.5 Modul de procesare video Nvidia Jetson TX2 ....... Error! Bookmark not defined.
Figura 2.6 Caracteristici tehnice ale modulului de procesare video Nvidia Jetson TX2 . Error!
Bookmark not defined.
Figura 2.7 Interfață Carrier Orbitty ........................................... Error! Bookmark not defined.
Figura 2.8 Secvență de biți în transmisia UART ...................... Error! Bookmark not defined.
Figura 2.9 Schema transmisiei UART....................................... Error! Bookmark not defined.
Figura 2.10 Logo OpenCV-Python ........................................... Error! Bookmark not defined.
Figura 2.11 Logo sistem de operare Linux ............................... Error! Bookmark not defined.
Figura 3.1 Modelul geometric al camerei video ....................... Error! Bookmark not defined.
Figura 4.1 Clasificare metode de urmărire ................................ Error! Bookmark not defined.
Figura 4.2 Diagrama de stări a algoritmului TLD .................... Error! Bookmark not defined.
Figura 4.3 Diagrama procesului de învățare P-N ..................... Error! Bookmark not defined.
Figura 6.1 Structura algoritmului realizat ................................. Error! Bookmark not defined.
Figura 7.1 Quadcopterul integrat pentru ambarcarea sistemului de urmărire realizat ..... Error!
Bookmark not defined.
Figura 7.2 Telecomanda utilizată în controlul platformei aeriene .......... Error! Bookmark not
defined.
Figura 7.3 Sistemul surprins în modul de funcționare ............. Error! Bookmark not defined.
Figura 7.4 Stația de control de la sol ......................................... Error! Bookmark not defined.
Figura 7.5 Cadrul selectat în momentul opririi transimiei video ............ Error! Bookmark not
defined.
Figura 7.6 Selecția țintei............................................................. Error! Bookmark not defined.
Figura 7.7 Urmărirea țintei de interes........................................ Error! Bookmark not defined.
Figura 7.8 Prezentarea sistemului în cadrul BSDA .................. Error! Bookmark not defined.
Figura 7.9 Prezentarea sistemului în cadrul BSDA .................. Error! Bookmark not defined.
Figura 8.1 Structura unei rețele neuronale ................................ Error! Bookmark not defined.
Figura 8.2 Funcționarea unui neuron tipic ................................ Error! Bookmark not defined.
Figura 8.3 Reprezentări ale funcțiilor de transfer ..................... Error! Bookmark not defined.
Figura 8.4 Algoritmul de antrenament al propagării înapoi....................................................68
NECLASIFICAT
din
NECLASIFICAT
Capitolul 1
Introducere
O descriere și mai simplă a unui avion fără pilot este că acesta reprezintă
o aeronavă la care personalul navigant a fost îndepărtat și înlocuit cu un sistem
informatic și o legătură radio. În realitate, este mult mai complex de atât
deoarece aeronava trebuie să fie concepută de la început, fără personal navigant
ceea ce implică o complexitate ridicată. Aeronava este doar o parte, deși este o
parte importantă, a unui întreg sistem. Acest sistem de avioane fără pilot este
conceput că un întreg și este compus din următoarele componente și sisteme
majore:
a) aeronava fără pilot (UAV) care transportă sarcină utilă și care poate
fi de mai multe tipuri;
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
Capitolul 2
Descrierea sistemului
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
puțin jumătate din timpul biților, acesta este valabil și semnalează începutul
unui nou caracter.
Comunicația UART nu are de obicei niciun sistem de sincronizare
partajat în afară de semnalul de comunicare. În mod obișnuit, UART-urile își
resincronizează ceasurile interne la fiecare schimbare a liniei de date care nu
este considerată un impuls fals. Obținând informații de sincronizare în acest
mod, acestea află în mod fiabil când transmițătorul trimite o viteză ușor diferită
decât ar trebui. UART-urile simplificate nu fac acest lucru, în schimb
resincronizează pe marginea descendentă a bitului inițial și apoi citesc centrul
fiecărui bit de date așteptat iar acest sistem funcționează dacă rată de transmisie
este suficient de precisă pentru a permite biților de stop să fie eșantionați în mod
fiabil.
Operația de transmisie este mai simplă, deoarece nu trebuie determinată
temporizarea de la starea liniei, nici nu este legată de intervale fixe de timp. De
îndată ce sistemul de expediere depune un caracter în registrul de deplasare
(după completarea caracterului anterior), UART generează un bit de pornire,
schimbă numărul de biți de date pe linie, generează și trimite bitul de paritate
(dacă este folosit ) și trimite biții de stop.
Transmisia și recepționarea UART-urilor trebuie să fie setate pentru
aceeași viteză de biți, lungime de caractere, paritate și biți de oprire pentru o
funcționare corectă. UART-ul de recepție poate detecta unele setări
necorespunzătoare și poate seta un bit de flag "eroare de încadrare" pentru
sistemul gazdă; în cazuri excepționale, UART-ul de recepție va produce un flux
neregulat de caractere și le va transfera în sistemul gazdă.
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
are peste 2500 de algoritmi optimizați, care includ un set complet de algoritmi
de CV precum și algoritmi de ML. Acești algoritmi pot fi utilizați pentru a
detecta și a recunoaște fețele, a identifica obiecte, a clasifica acțiunile umane în
videoclipuri, a urmări mișcările camerei, a urmări obiectele în mișcare, a
extrage modele 3D ale obiectelor, găsirea unor imagini similare dintr-o bază de
date a imaginilor, urmărirea mișcărilor ochilor, recunoașterea peisajelor etc.
OpenCV are mai mult de 47 mii de utilizatori și numărul estimat de descărcări
depășește 14 milioane. Biblioteca este utilizată extensiv în companii, grupuri de
cercetare și organisme guvernamentale. Pe lângă companii celebre precum:
Google, Yahoo, Microsoft, Intel, există multe companii mai puțin cunoscute:
Applied Minds, VideoSurf etc, care folosec această sursă publică. OpenCV
acopera o gamă largă de aplicații, de la detectarea intruziunilor într-un video în
Israel, monitorizarea echipamentelor miniere în China, navigația roboților în
SUA, detectarea accidentelor de înec in Spania, până la verificarea pistelor în
Turcia și analiza facială in Japonia. Această biblioteca software are interfețe
C++, Python, Java, MATLAB și suportă drept sisteme de operare, Windows,
Linux, Android și Mac OS. OpenCV se bazează în principal pe aplicațiile
vizuale în timp real și beneficiază de instrucțiunile MMX și SSE atunci când
sunt disponibile. Există peste 500 de algoritmi și aproximativ de 10 ori mai
multe funcții care compun sau susțin acești algoritmi. OpenCV este scris în C
++ și are o interfață template care funcționează fără probleme cu containerele
STL. Toate noile dezvoltări și algoritmi din OpenCV sunt acum dezvoltate în
interfața C++. OpenCV 3 vine cu un nou API de urmărire care conține
implementări ale mai multor algoritmi de urmărire. Exista șase algoritmi de
urmărire diferiți disponibili: BOOSTING, MIL, KCF, TLD, MEDIANFLOW si
GOTURN.
2.7 Limbaj de programare Python 3.5
NECLASIFICAT
din
NECLASIFICAT
Inițial a fost necesar ca modulul Nvidia Jetson TX2 sa fie supus unei
„flash-uiri” cu un computer care să ruleze drept sistem de operare Linux.
NECLASIFICAT
din
NECLASIFICAT
Capitolul 3
Sisteme de coordonate
NECLASIFICAT
din
NECLASIFICAT
Gimbal: F (i , j , k )
g g g g
Camera: F (i , j , k )
c c c c
az - R de azimut al gimbalului
cos az sin az 0
R ( az ) sin az
g1
b cos az 0 (3.1)
0 0 1
el R de elevație al gimbal-ului
NECLASIFICAT
din
NECLASIFICAT
Unde:
f=lungimea focală în pixeli
p=convertește pixelii în metri
PF=lungimea focală în metri
M=nr. de pixeli pe o latură a imaginii
v=câmpul de vedere al camerei
Pentru a simplifica modelul, vom presupune că imaginea este patrată (adică
avem același număr de pixeli atât pe lungime cât și pe lățime).
Lungimea focală în pixeli este următoarea:
M
f (3.5)
v
2tg
2
M=256×256 pixeli
NECLASIFICAT
din
NECLASIFICAT
ex
L
l ey
c
(3.8)
F
f
l -este vectorul obiectului de interes
L l
Trebuie precizat faptul că l c nu poate fi determinat direct din datele furnizate
de cameră atâta timp cât L este necunoscut.
Astfel se poate determina direcția vectorului la țintă:
ex ex
lc 1 1
ey ey ① (3.9)
L F ex ey f
2 2 2
f f
L -distanța până la țintă;
l c -ținta în sistemul de coordonate al camerei;
lc
Vectorul unitate: joacă un rol major și se notează cu:
L
lx'
l
l ' l y' , l devine normat (3.10)
L '
lz
Sistemele UAV de dimensiuni mici sunt folosite, cel mai frecvent pentru
îndeplinirea misiunilor de tip ISR(Intelligence Surveillance Reconaissance).
Dacă UAV-ul este echipat cu gimbal, acest lucru implică control asupra camerei
astfel incât să focuseze asupra țintelor.
Presupunând că avem un gimbal pe 2 axe(azimut si elevație) atunci ecuațiile de
mișcare pentru ansamblul gimbal sunt:
Rbi Rbi (3.11)
Unde uaz si uel sunt variabilele de control ale unghiurilor de azimut și elevație
ale gimbal-ului.
1. Obiectivul primului scenariu este acela de a directiona gimbalul către
ținta pe baza coordonatelor geografice date.
2. Obiectivul celui de-al doilea scenariu este acela de a directiona gimbalul
astfel încât axele optice să se alinieze cu un punct dat în planul imaginii.
Pentru acest scenariu se poate imagina ca utilizatorul în timp ce primește
fluxul de date video de la camera,poate selecta o locație în planul
imaginii, iar gimbal-ul trebuie să aducă acea locație în centrul imaginii.
NECLASIFICAT
din
NECLASIFICAT
i
1. Pentru primul scenariu,vom nota pobj ca fiind locația unui obiect în
sistemul de coordonate inerțial.
Obiectivul este alinierea axelor optice ale camerei cu vectorul de poziție
dorit:
ldi pobj
i
pMAV
i
(3.12)
Unde pMAVi
( pn , pe , pd )T .
Vectorul unitate în sistemul de coordonate legat de UAV, îndreptat în
direcția dorită, are următoarea ecuație:
b 1
l%d i Rib * ldi (3.13)
ld
2. În cel de-al doilea scenariu, se presupune că se dorește manevrarea
gimbal-ului astfel încât locația pixelului să fie adusă în centrul imaginii.
Folosind ecuația ①, se poate determina direcția dorită a axelor optice în
sistemul de coordonate legat de cameră astfel:
ex
c 1
l%d ey (3.14)
2
f ex ey
2 2
f
Astfel că în sistemul de coordonate legat de UAV, directia dorită a
axelor optice este următoarea:
b c
d Rg * Rc * l d
l% b g % (3.15)
Următoarea etapă este determinarea unghiurilor de azimut și de elevație
astfel încât axa optică dată de vectorul 0, 0,1 .Astfel că, obiectivul
c
NECLASIFICAT
din
NECLASIFICAT
l%b
xd
0
l%d l%yd Rgb ( gc , elc ) * Rcg 0
b b
1
l%b
zd
NECLASIFICAT
din
NECLASIFICAT
Capitolul 4
Metode de urmărire studiate
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
baza aspectului. Dacă obiectul a fost simplu și nu și-a schimbat mult aspectul,
se poate folosi un șablon simplu ca model de aspect. Acesta este însă cazul
ideal. Înfățișarea unui obiect se poate schimbă radical. Pentru a aborda această
problemă, la mulți algoritmi moderni, acest model de aspect este un clasificator
care este instruit într-o manieră online.
Funcția clasificatorului este de a clasifică o regiune dreptunghiulară a
unei imagini ca obiect sau fundal. Clasificatorul ia un „patch de imagine că
intrare și returnează un scor între 0 și 1 pentru a indică probabilitatea că patch-ul
de imagine să conțînă obiectul. Scorul este 0 atunci când este absolut sigur că
patch-ul de imagine este fundalul și 1 când este absolut sigur că patch-ul este
obiectul.
Un clasificator este „instruit” prin furnizarea de exemple pozitive (obiect) și
negative (de fundal). Pentru construirea unui clasificator care să detecteze
NECLASIFICAT
din
NECLASIFICAT
I I I
I ( x x, y y, t t ) I ( x, y, t ) x y t (4.2)
x y t
Rezultă:
I I I
x y t 0 (4.3)
x y t
Sau:
I I I
Vx Vy 0 (4.4)
x y t
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
I x (q1 ) I y (q1 )
I (q ) I y (q2 )
A
x 2
(4.8)
M M
I x (qn ) I y (qn )
Vx
v (4.9)
Vy
I t (q1 )
I (q )
b t 2 (4.10)
M
I t (qn )
Acest sistem are mai multe ecuații decât necunoscute și, prin urmare,
este supra-determinat. Metoda Lucas-Kanade obține o soluție de compromis
prin principiul celor mai mici pătrate. Rezultă sistemul de 2 2 :
AT Av AT b
(4.11)
v ( AT A) 1 AT b
NECLASIFICAT
din
NECLASIFICAT
1
Vx i I x (qi ) I (q ) I (q ) i I x (qi ) I t (qi )
2
V
x i y i
i
(4.12)
y i I x (qi ) I y (qi ) I (q ) i I y (qi ) I t (qi )
2
i y i
ATWAv ATWb
(4.13)
v ( ATWA)1 ATWb
V
i x i y i
i
(4.14)
y i wi I x (qi ) I y (qi ) w I (q ) i wi I y (qi ) I t (qi )
2
i i y i
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
de ori pentru ca grupul să fie etichetat pozitiv. Păstrând notațiile de mai sus,
fiecarei instanțe conceptuale ci CR îi este asociat un prag li Ą . Pentru un grup
B , c B 1 #( B, ci ) li , ci CR . Ipoteza bazată pe calcul este generalizarea
finală care impune atât limitele înferioare cât și pe cele superioare pentru
numărul de momente în care o instanță conceptuală poate apărea într-un grup
marcat ca fiind pozitiv. Fiecare instanță conceptuală ci CR are un prag minim
li Ą si un prag maxim ui Ą cu li ui . Un grup B este etichetat conform
c B 1 li #( B, ci ) ui , ci CR .
Ipoteza colectiva:
p( y | B) p( y x) p( x B)dx (4.16)
x
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
Capitolul 5
Comparație a tehnicilor de urmărire
Scopul urmăririi este de a crea traseul unei ținte în timp prin găsirea
poziției sale în secvențe video. Detectarea țintei și crearea unei corespondențe
între aparițiile obiectului prin cadre pot fi realizate separat sau în comun. În
prima etapă, regiunea de interes în fiecare cadru este realizată printr-un algoritm
de detectare a obiectelor, iar urmărirea face corespondențe între cadre. În etapa
finală, regiunea obiectului este proiectată prin actualizarea iterativă a locației
obiectului obținută din cadrele anterioare. Urmărirea obiectelor poate fi
clasificată ca urmărirea punctelor, urmărirea bazată pe nucleu și urmărirea
bazată pe siluetă.
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
Capitolul 6
Algoritmul de urmărire realizat
n
qu c xi u , u 1, 2,..., m (6.1)
i 1
255
pu min qu , 255 (6.2)
max q u 1,...,m
NECLASIFICAT
din
NECLASIFICAT
M 00 I ( x, y) , (6.3)
x y
M 01 yI ( x, y) , (6.4)
x y
M10 xI ( x, y) (6.5)
x y
NECLASIFICAT
din
NECLASIFICAT
M 02 y 2 I ( x, y) (6.9)
x y
Putem obține lungimea celor două axe ale ferestrei de căutare a țintei:
( A C ) B 2 ( A C )2
L (6.11)
2
( A C ) B 2 ( A C )2
S (6.12)
2
Unde:
A M 20 / M 00 xc (6.13)
B M 20 / M 00 xc yc (6.14)
C M 02 / M 00 yc2 (6.15)
Totodata putem obține unghiul de directie al țintei:
1 2( M11 / M 00 xc yc
arctan 2
(6.16)
( M 20 / M 00 xc ) ( M 02 / M 00 yc
2
2
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
Criteriul ocluziei
1, normala
f yk
0, ocluzionata
Metoda aleasă are avantajul unei urmăriri în timp real mai bună decât
ceilați algoritmi dar va întampina dificultăți atunci când ținta va fi puternic
ocluzionată. O soluție pentru optimizarea algoritmului ar fi introducerea unui
filtru Kalman pentru rezolvarea problemei ocluziei. Cu toate acestea, filtrarea
Kalman presupune un model spațial de stare Gauss, care poate să nu fie în
concordanță cu mișcarea țintei în lumea reala.
NECLASIFICAT
din
NECLASIFICAT
Capitolul 7
Rezultate obținute
Sistemul de urmărire realizat a fost testat atât în condiții de laborator cât
și în condiții reale pe aerodromul Clinceni. În urma numeroaselor teste la care a
fost supus, a obținut rezultate bune. Sistemul a fost ambarcat pe o platformă
aeriană autonomă și anume un quadcopter.
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
Capitolul 8
Preocupări viitoare
NECLASIFICAT
din
NECLASIFICAT
trebuie să fie cât mai aproape posibil de scenariul lumii reale. Simulările
complexe sunt totuși costisitoare atât în timpul de dezvoltare, cât și în timpii de
execuție. Prin urmare, un model al lumii reale abstractizarea informațiilor non-
vitale, asigurându-se în același timp că aspectele majore sunt captate.
Performanța algoritmului de inteligenta artificiala depinde de calitatea
modelului de simulare.
NECLASIFICAT
din
NECLASIFICAT
I j W ji X i j
(8.1)
Y j f ( I j ) f (W ji X i j )
Log-tangențială f ( x) (e x e x ) / (e x e x ) [−1,1]
Hard-limit 0, x 0 [0 or 1]
f ( x)
1, x 1
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
algoritmul modificat cu cea mai abruptă coborâre. Acest proces se repetă până
când eroarea globală este minimă.
NECLASIFICAT
din
NECLASIFICAT
Capitolul 9
Concluzii
NECLASIFICAT
din
NECLASIFICAT
Bibliografie
[1]Agarwa, V. K., Sivakumaran, N., & S., V. P. Six Object Tracking Algorithms: A
Comparative Study . Tiruchirappalli: Department of Instrumentation and Control
Engineering.
[2]Baker, S., & Matthews, I. (2004). Lucas-kanade 20 years on: A unifying framework. IJCV,
Vol.56(No.3):221–255.
[3]Bharati, S. P., Wu, Y., Sui, Y., Padgett, C., & Wang, G. Real-time Obstacle Detection and
Tracking for Sense-and-Avoid Mechanism in UAVs . IEEE.
[4]Bradski, G. R. . Computer Vision Face Tracking For Use in a Perceptual User Interface.
Santa Clara, CA: Intel Corporation.
[5]Comaniciu, D., & Meer, P.. “Robust Analysis of Feature Spaces: Color Image
Segmentation”. CVPR’97, pp. 750-755.
[6]Danelljan, M., Khan, F., Felsberg, M., & Weijer, J. v.. Adaptive color attributes for real-
time visual tracking. 2014.
[7]Dufrene, W. R., & Nova, J. [1]AI Techniques in Uninhabited Aerial Vehicle Flight.
Southeastern University.
[8]Eck, L., & Marchand, E. Chasing a moving target from a flying UAV C´eline Teuli`ere.
[9]Fukunaga, K. (1990). “Introduction to Statistical Pattern Recognition” . Boston:
Academic Press.
[10]G´omez, J. J., Giner, J. d., & Cruz, A. B. Multi-uav coordination and control interface.
2016.
[11]Godbehere, A. B., Matsukawa, A., & Goldberg, K. Visual Tracking of Human Visitors
under Variable-Lighting Conditions for a Responsive Audio Art Installation.
[12]https://en.wikipedia.org/wiki/Artificial_intelligence.
[13]https://en.wikipedia.org/wiki/Optical_flow.
[14]https://en.wikipedia.org/wiki/Track_algorithm.
[15]https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/.
[16]https://www.python.org/.
[17]Isard, M., & Blake, A. “Contour tracking by stochastic propagation of conditional
density”. Proc. 4th European Conf. On Computer Vision, Cambridge, UK.
[18]J, Z., W, Q., & G, M. (2009 Jul 4). An approach based on mean shift and Kalman Filter
for target tracking under occlusion. Baoding: Proceedings of the Eighth International
Conference on Machine Learning and Cybernetics.
[19]Jackson, S. P. Controlling Small Fixed Wing UAVs to Optimize Image Quality from On-
Board Cameras .
[20]Jalal, A. S. "The State-of-the-Art in Visual Object Tracking". Department of Computer
Engineering & Applications.
[21]Javed, O. Object Tracking: A Survey Alper Yilmaz Ohio State University. ObjectVideo,
Inc.
[22]Jie, L., Jian, C., & Lei, a. W. Design of Multi-Mode UAV Human-Computer Interaction
System.
[23]L, T.-J., & Z., Z.-T. ( IJACT. 2013 Mar). Adaptive double Kalman Filter and mean shift
for robust fast object tracking.
[24]M. Andriluka, S. R. (2008). “People-tracking-by-detection and people-detection-by-
tracking”. CVPR 2008. IEEE Conference on. IEEE, 2008, pp. 1–8.
[25]McLain, R. W. Small Unmanned Aircraft Theory and Practice.
[26]Patel, M. J., & Bhatt, B. A Comparative Study of Object Tracking Techniques .
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
Anexa 1
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
2. Generare imagini
from __future__ import print_function
import numpy as np
import os
import argparse
LABEL_ACTION_MAP = {
0 : "Background",
1 : "Walking",
2 : "Sitting",
3 : "Standing",
4 : "Running",
5 : "Lying",
6 : "Carrying",
7 : "Pushing/Pulling",
8 : "Reading",
9 : "Drinking",
10 : "Calling",
11 : "Hand Shaking",
12 : "Hugging"
}
def generate(sequence_path, model_type, frame_interval,
confidence_threshold):
from PIL import Image, ImageDraw, ImageFont
path_until_sequence, sequence_name = os.path.split(sequence_path)
tracking_file_path =
"../data/results/{}/{}/{}.txt".format(path_until_sequence, model_type,
sequence_name)
image_dir_path = "../data/{}/images".format(sequence_path)
NECLASIFICAT
din
NECLASIFICAT
output_dir_path = "output/{}".format(sequence_name)
if not os.path.exists(output_dir_path):
print("Creating output directory {}".format(output_dir_path))
os.makedirs(output_dir_path)
detections = np.loadtxt(os.path.abspath(tracking_file_path),
delimiter=",")
colours = np.random.randint(0, 255, (32, 3))
for frame in range(0, int(detections[:,0].max()), frame_interval):
image_name = str(frame).rjust(4, '0') + ".jpg"
image_path = "{}/{}".format(image_dir_path, image_name)
with Image.open(image_path) as image:
draw = ImageDraw.Draw(image, 'RGBA')
# Format: [frame, ID, x1, y1, width, height, confidence, _, _,
_, (label)]
dets = detections[detections[:,0]==frame, 1:7]
labels = None
if model_type == "action-detection":
labels = detections[detections[:,0]==frame, 1]
dets[:, 3:5] += dets[:, 1:3] # Convert from [x1, y1, width,
height] to [x1, y1, x2, y2]
for i, d in enumerate(dets):
if d[5] < CONFIDENCE_THRESHOLD:
continue
d = d.astype(np.int32)
c = tuple(colours[d[0]%32, :])
draw.rectangle([d[1], d[2], d[3], d[4]], fill=(c + (100,)),
outline=c)
if model_type == "action-detection":
draw.text((d[1], d[2] + 4),
LABEL_ACTION_MAP[labels[i]], fill=(255,255,255))
image.save("{}/{}".format(output_dir_path, image_name))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-s', '--sequenceMap', metavar='sequenceMap',
required=True,
help='a textfile specifying paths to
sequences')
parser.add_argument('-m', '--modelType', metavar='modelType',
required=True,
help='name of the type of model')
parser.add_argument('-i', '--frameInterval', metavar='frameInterval',
required=False, type=int, default=1,
NECLASIFICAT
din
NECLASIFICAT
Anexa 2
3.Algortimul CAMshift
# import the required packages
from imutils.video import WebcamVideoStream
from imutils.video import FPS
import numpy as np
import argparse
import imutils
import time
import cv2
import dlib
from trackers.camshifttracker import CAMShiftTracker
if __name__ == '__main__':
print("[info] starting to read a webcam ...")
capWebCam = WebcamVideoStream(0).start()
time.sleep(1.0)
# initialize dlib face detector
frontFaceDetector = dlib.get_frontal_face_detector()
# meanShift tracker
camShifTracker = None
curWindow = None
# start the frame per second (FPS) counter
#fps = FPS2().start()
boolDetectFaceinfirsFrameOnly = True
# loop over the frames obtained from the webcam
NECLASIFICAT
din
NECLASIFICAT
while True:
# grab each frame from the threaded stream,
# resize
# it, and convert it to grayscale (while still retaining 3
# channels)
frame1 = capWebCam.read()
frame = cv2.flip(frame1,1)
#frame = imutils.resize(frame, width=450)
#frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#frame = np.dstack([frame, frame, frame])
# display the size of the queue on the frame
#cv2.putText(frame, "Queue Size: {}".format(fvs.Q.qsize()),
# (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
if boolDetectFaceinfirsFrameOnly:
faceRect = frontFaceDetector(frame, 0)
if(not len(faceRect) ):
print("[info] Face not found")
continue
# start the frame per second (FPS) counter
fps = FPS2().start()
bbox = faceRect[0]
# convert dlib rect to opencv rect
curWindow = (int(bbox.left()), int(bbox.top()), int(bbox.right() -
bbox.left()),
int(bbox.bottom() - bbox.top()) )
# intialize the CAMShift Tracker
camShifTracker = CAMShiftTracker(curWindow, frame)
boolDetectFaceinfirsFrameOnly = False
continue
camShifTracker.computeNewWindow(frame)
x,y, w, h = camShifTracker.getCurWindow()
bkprojectImage = camShifTracker.getBackProjectedImage(frame)
cv2.imshow("CAMShift Face in Back Project Image", bkprojectImage)
# display the current window
cv2.rectangle(frame, (x,y), (x+w, y+h), (255, 0, 0), 2, cv2.LINE_AA)
rotatedWindow = camShifTracker.getRotatedWindow()
#display rotated window
cv2.polylines(frame, [rotatedWindow], True, (0,255,0), 2, cv2.LINE_AA)
fps.update()
cv2.putText(frame, "FPS: {:.2f}".format(fps.fps()),
(10, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
NECLASIFICAT
din
NECLASIFICAT
Anexa 3
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
break
# stop the timer and display FPS information
fps.stop()
print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
# do a bit of cleanup
cv2.destroyAllWindows()
capWebCam.stop()
Anexa 4
5. Algoritmul realizat
# USAGE
# python track.py --video video/sample.mov
NECLASIFICAT
din
NECLASIFICAT
def main():
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video",
help="path to the (optional) video file")
args = vars(ap.parse_args())
# if the video path was not supplied, grab the reference to the
#camera
if not args.get("video", False):
# camera = cv2.VideoCapture(0)
zed = zcam.PyZEDCamera()
# Create a PyInitParameters object and set configuration parameters
init_params = zcam.PyInitParameters()
init_params.camera_resolution =
sl.PyRESOLUTION.PyRESOLUTION_HD720 # Use HD1080 video mode
init_params.camera_fps = 30 # Set fps at 30
NECLASIFICAT
din
NECLASIFICAT
camera = cv2.VideoCapture(args["video"])
NECLASIFICAT
din
NECLASIFICAT
point1 = pts[0]
point2 = pts[1]
point3 = pts[2]
point4 = pts[3]
minx = np.min(ptsx)
maxx = np.max(ptsx)
miny = np.min(ptsy)
maxy = np.max(ptsy)
cx = ((maxx-minx)/2+minx)
cy = ((maxy-miny)/2+miny)
center = (cx,cy)
dx = (320-cx)
dy = (180-cy)
deviation = (dx,dy)
print(deviation)
print(center)
cv2.polylines(frame, [pts], True, (0, 0, 255), 2)
#cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
#cv2.CHAIN_APPROX_SIMPLE)
NECLASIFICAT
din
NECLASIFICAT
cv2.imshow("frame", frame)
key = cv2.waitKey(1) & 0xFF
NECLASIFICAT
din
NECLASIFICAT
if __name__ == "__main__":
main()
Anexa 5
6. Algoritmul MIL
import numpy as np
import cv2
import fhog
# ffttools
def fftd(img, backwards=False):
# shape of img can be (m,n), (m,n,1) or (m,n,2)
# in my test, fft provided by numpy and scipy are slower than cv2.dft
return cv2.dft(np.float32(img), flags = ((cv2.DFT_INVERSE |
cv2.DFT_SCALE) if backwards else cv2.DFT_COMPLEX_OUTPUT)) #
'flags =' is necessary!
def real(img):
return img[:,:,0]
def imag(img):
return img[:,:,1]
def complexMultiplication(a, b):
res = np.zeros(a.shape, a.dtype)
NECLASIFICAT
din
NECLASIFICAT
def x2(rect):
return rect[0] + rect[2]
def y2(rect):
return rect[1] + rect[3]
NECLASIFICAT
din
NECLASIFICAT
if(border != [0,0,0,0]):
res = cv2.copyMakeBorder(res, border[1], border[3], border[0],
border[2], borderType)
return res
# KCF tracker
class KCFTracker:
def __init__(self, hog=False, fixed_window=True, multiscale=False):
self.lambdar = 0.0001 # regularization
self.padding = 2.5 # extra area surrounding the target
self.output_sigma_factor = 0.125 # bandwidth of gaussian target
if(multiscale):
self.template_size = 96 # template size
self.scale_step = 1.05 # scale step for multi-scale estimation
NECLASIFICAT
din
NECLASIFICAT
def createHanningMats(self):
hann2t, hann1t = np.ogrid[0:self.size_patch[0],
0:self.size_patch[1]]
if(self._hogfeatures):
hann1d =
hann2d.reshape(self.size_patch[0]*self.size_patch[1])
self.hann = np.zeros((self.size_patch[2], 1), np.float32) +
hann1d
else:
self.hann = hann2d
NECLASIFICAT
din
NECLASIFICAT
self.hann = self.hann.astype(np.float32)
d = d * (d>=0)
NECLASIFICAT
din
NECLASIFICAT
d = np.exp(-d / (self.sigma*self.sigma))
return d
if(inithann):
padded_w = self._roi[2] * self.padding
padded_h = self._roi[3] * self.padding
if(self._hogfeatures):
self._tmpl_sz[0] = int(self._tmpl_sz[0]) /
(2*self.cell_size) * 2*self.cell_size + 2*self.cell_size
self._tmpl_sz[1] = int(self._tmpl_sz[1]) /
(2*self.cell_size) * 2*self.cell_size + 2*self.cell_size
else:
self._tmpl_sz[0] = int(self._tmpl_sz[0]) / 2 * 2
self._tmpl_sz[1] = int(self._tmpl_sz[1]) / 2 * 2
NECLASIFICAT
din
NECLASIFICAT
if(z.shape[1]!=self._tmpl_sz[0] or z.shape[0]!=self._tmpl_sz[1]):
z = cv2.resize(z, tuple(self._tmpl_sz))
if(self._hogfeatures):
mapp = {'sizeX':0, 'sizeY':0, 'numFeatures':0, 'map':0}
mapp = fhog.getFeatureMaps(z, self.cell_size, mapp)
mapp = fhog.normalizeAndTruncate(mapp, 0.2)
mapp = fhog.PCAFeatureMaps(mapp)
self.size_patch = map(int, [mapp['sizeY'], mapp['sizeX'],
mapp['numFeatures']])
FeaturesMap =
mapp['map'].reshape((self.size_patch[0]*self.size_patch[1],
self.size_patch[2])).T # (size_patch[2], size_patch[0]*size_patch[1])
else:
if(z.ndim==3 and z.shape[2]==3):
FeaturesMap = cv2.cvtColor(z,
cv2.COLOR_BGR2GRAY) # z:(size_patch[0], size_patch[1], 3)
FeaturesMap:(size_patch[0], size_patch[1]) #np.int8 #0~255
elif(z.ndim==2):
FeaturesMap = z #(size_patch[0], size_patch[1])
#np.int8 #0~255
FeaturesMap = FeaturesMap.astype(np.float32) / 255.0 - 0.5
self.size_patch = [z.shape[0], z.shape[1], 1]
if(inithann):
self.createHanningMats() # createHanningMats need
size_patch
NECLASIFICAT
din
NECLASIFICAT
p[0] -= res.shape[1] / 2.
p[1] -= res.shape[0] / 2.
return p, pv
self._tmpl = (1-train_interp_factor)*self._tmpl +
train_interp_factor*x
self._alphaf = (1-train_interp_factor)*self._alphaf +
train_interp_factor*alphaf
cx = self._roi[0] + self._roi[2]/2.
cy = self._roi[1] + self._roi[3]/2.
NECLASIFICAT
din
NECLASIFICAT
if(self.scale_step != 1):
# Test at a smaller _scale
new_loc1, new_peak_value1 = self.detect(self._tmpl,
self.getFeatures(image, 0, 1.0/self.scale_step))
# Test at a bigger _scale
new_loc2, new_peak_value2 = self.detect(self._tmpl,
self.getFeatures(image, 0, self.scale_step))
x = self.getFeatures(image, 0, 1.0)
self.train(x, self.interp_factor)
return self._roi
7. Algoritmul BOOSTING
#from fbtrack import *
#from bb import getBB, getRectFromBB
NECLASIFICAT
din
NECLASIFICAT
import cv2
class mftrack:
def __init__(self, source=None, bb=None):
self.mouse_p1 = None
self.mouse_p2 = None
self.mouse_drag = False
self.bb = None
self.img = None
self.mouseFlag = True
if source:
self.cam = cv2.VideoCapture(source)
else:
self.cam = cv2.VideoCapture(0)
if not bb:
self.start()
else:
self.bb = bb
_, self.img = self.cam.read()
self.track()
def start(self):
_, self.img = self.cam.read()
cv2.imshow("img", self.img)
cv.SetMouseCallback("img", self.__mouseHandler, None)
if not self.bb:
_, self.img = self.cam.read()
cv2.imshow("img", self.img)
cv2.waitKey(30)
cv2.waitKey(0)
NECLASIFICAT
din
NECLASIFICAT
cv2.imshow("img",self.img)
cv2.waitKey(30)
if self.mouse_p1 and self.mouse_p2:
cv2.destroyWindow("img")
print self.mouse_p1
print self.mouse_p2
xmax = max(self.mouse_p1[0],self.mouse_p2[0])
xmin = min(self.mouse_p1[0],self.mouse_p2[0])
ymax = max(self.mouse_p1[1],self.mouse_p2[1])
ymin = min(self.mouse_p1[1],self.mouse_p2[1])
self.bb = [xmin,ymin,xmax-xmin,ymax-ymin]
self.track()
def track(self):
self.mouseFlag = False
oldg = cv2.cvtColor(self.img, cv2.cv.CV_BGR2GRAY)
bb = self.bb
bb = [bb[0], bb[1], bb[0]+bb[3], bb[1]+bb[3]]
while True:
t = time.time()
_, img = self.cam.read()
newg = cv2.cvtColor(img, cv2.cv.CV_BGR2GRAY)
newbb, shift = fbtrack(oldg, newg, bb, 12, 12, 3, 12)
#print newbb, "newbb", shift, "shift"
oldg = newg
bb = newbb
cv2.rectangle(img, (bb[0], bb[1]), (bb[2], bb[3]), (255, 0, 0))
cv2.imshow("Media Flow Tracker", img)
print (time.time() - t)*1000,"msec"
k = cv2.waitKey(1)
if k == 27:
self.mouseFlag = False
cv2.destroyAllWindows()
break
return None
NECLASIFICAT
din
NECLASIFICAT
import argparse
import cv2
# initialize the current frame of the video, along with the list of
# ROI points along with whether or not this is input mode
frame = None
roiPts = []
inputMode = False
def selectROI(event, x, y, flags, param):
# grab the reference to the current frame, list of ROI
# points and whether or not it is ROI selection mode
global frame, roiPts, inputMode
args = vars(ap.parse_args())
# grab the reference to the current frame, list of ROI
# points and whether or not it is ROI selection mode
global frame, roiPts, inputMode
# if the video path was not supplied, grab the reference to the
#camera
if not args.get("video", False):
camera = cv2.VideoCapture(0)
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
point1 = pts[0]
point2 = pts[1]
point3 = pts[2]
point4 = pts[3]
minx = np.min(ptsx)
maxx = np.max(ptsx)
miny = np.min(ptsy)
maxy = np.max(ptsy)
center = [((maxx-minx)/2+minx),((maxy-miny)/2+miny)]
print(center)
cv2.polylines(frame, [pts], True, (0, 0, 255), 2)
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din
NECLASIFICAT
trackerType = trackerTypes[int(args["type"])]
trackerOpenCV = cv2.Tracker_create("MIL")
frontFaceDetector = dlib.get_frontal_face_detector()
initOnce = False
print("[info] starting to read a webcam ...")
capWebCam = WebcamVideoStream(0).start()
time.sleep(1.0)
NECLASIFICAT
din
NECLASIFICAT
bbox = faceRect[0]
print(bbox)
fps.update()
cv2.putText(frame, "FPS: {:.2f}".format(fps.fps()),
(10, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
NECLASIFICAT
din
NECLASIFICAT
# do a bit of cleanup
cv2.destroyAllWindows()
capWebCam.stop()
NECLASIFICAT
din
NECLASIFICAT
#
init = False
bboxes = [] # contains bounding boxes around the objects to be tracked
# initialize various objects in the first frame of the video
while True:
# select the ROI around the object to be tracked
box = cv2.selectROI('tracking', frame, showCrossair=False,
fromCenter=False)
print(box)
bboxes.append(box)
print("[info] print q to quit object selection and anyother key for next
object selection")
k = cv2.waitKey(0) & 0xff
if(k== 113):
break
print("[info] selecting objects {}".format(bboxes))
# start the frame per second (FPS) counter
fps = FPS2().start()
NECLASIFICAT
din
NECLASIFICAT
# loop over the frames obtained from the video file stream
while fvs.more():
# grab each frame from the threaded video file stream,
# resize
# it, and convert it to grayscale (while still retaining 3
# channels)
frame = fvs.read()
#frame = imutils.resize(frame, width=450)
#frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#frame = np.dstack([frame, frame, frame])
NECLASIFICAT
din
NECLASIFICAT
# do a bit of cleanup
cv2.destroyAllWindows()
fvs.stop()
NECLASIFICAT
din
NECLASIFICAT
NECLASIFICAT
din