v4.x — Ediția 2026. O călătorie cuprinzătoare în lumea computer vision cu OpenCV. De la operațiuni fundamentale cu matrice și procesare clasică de imagini, până la cele mai noi inovații în deep learning, arhitecturi YOLO și agentic AI.
Computer VisionProcesarea imaginilorDeep Learning pentru știință
Explorăm modelul mental fundamental al OpenCV, unde imaginile sunt tratate ca array-uri de date multidimensionale. Ascultătorii vor învăța cum manipularea matricelor NumPy se traduce în schimbări vizuale pe ecran.
3m 57s
2
Convolution Kernels: Filtrare și Edge Detection
Explorează matematica filtrării spațiale folosind convolution kernels. Acest episod explică modul în care glisarea unei mici grile numerice peste o imagine realizează efecte de blur, sharpening și edge detection.
4m 22s
3
Desenarea granițelor: Contururi și geometrie
Trecem de la pixeli bruți la forme coerente prin extragerea granițelor continue. Învață cum să calculezi bounding boxes, convex hulls și proprietăți geometrice direct din contururile imaginii.
3m 57s
4
Feature Detectors: Keypoints și Neural Matching
Descoperă cum algoritmii identifică ancore vizuale distincte, cunoscute sub numele de keypoints, pentru a urmări obiecte din perspective diferite. Acoperim neural feature matching pentru sarcini complexe de aliniere a imaginilor.
4m 15s
5
Geometrie în lumea reală: Construirea unui scanner de documente
Un episod de referință care combină conceptele anterioare într-un pipeline practic. Ascultătorii vor învăța cum edge detection, contururile și perspective transforms creează un scanner de documente funcțional.
3m 54s
6
Avantajul experimental: opencv_contrib
Explorăm repository-ul opencv_contrib, terenul de testare pentru algoritmi de ultimă generație. Învață cum sunt evaluate modulele experimentale de computer vision înainte de a intra în biblioteca de bază.
3m 53s
7
Motorul de inferență: Modulul DNN din OpenCV
O introducere în modulul Deep Neural Network (DNN). Discutăm despre cum OpenCV ocolește framework-urile ML greoaie pentru a executa forward passes ultra-rapide pe modele AI pre-antrenate.
3m 54s
8
Linia YOLO: Object Detection rapid
Urmărim evoluția arhitecturii You Only Look Once (YOLO). Ascultătorii vor înțelege schimbarea de paradigmă arhitecturală care a făcut posibilă predicția de bounding boxes în timp real.
3m 51s
9
YOLOv26: Detecție End-to-End NMS-Free
O analiză detaliată a arhitecturii de ultimă generație YOLOv26. Învață cum eliminarea Non-Maximum Suppression (NMS) și integrarea optimizatorului MuSGD creează implementări edge cu latență ultra-scăzută.
4m 15s
10
YOLO-World: Detecție Zero-Shot Open Vocabulary
Eliberează-te de categoriile fixe, predefinite. Acest episod acoperă modul în care YOLO-World folosește maparea Vision-Language pentru a detecta obiecte complet noi, fără nicio antrenare suplimentară a modelului.
3m 58s
11
De la clasic la Deep: Evoluția Facial Recognition
Urmărește istoria recunoașterii faciale, de la metodele statistice timpurii precum PCA și Eigenfaces, până la modelele moderne de embedding bazate pe deep learning. Înțelege cum vectorii definesc identitatea.
4m 17s
12
Percepție persistentă: Algoritmi de Object Tracking
Detectarea unui obiect este doar jumătate din bătălie; urmărirea mișcării sale în timp este adevărata provocare. Învață despre algoritmii de multi-object tracking și atribuirea de ID-uri de-a lungul cadrelor video.
4m 35s
13
Modele Vision-Language pentru segmentare
Explorăm modul în care modelele Vision-Language (VLM) depășesc limitele bounding boxes, permițând o segmentare semantică pixel-perfect bazată exclusiv pe prompturi în limbaj natural.
4m 19s
14
Alchimia pixelilor: Alpha Blending și Color Spaces
O privire asupra laturii matematice a fotografiei computaționale. Înțelege canalele alpha, ecuațiile de image blending și de ce spațiul de culoare HSV este superior RGB-ului pentru logica de computer vision.
4m 03s
15
Calibrarea camerei: Navigarea prin Lens Distortion
Toate lentilele fizice ale camerelor distorsionează realitatea. Învață cum să calculezi matricele intrinseci ale camerei și coeficienții de radial distortion pentru a „îndrepta” matematic lumea, obținând o robotică precisă.
4m 41s
16
Stereo Vision: Găsirea profunzimii cu două camere
Comparând micile decalaje vizuale dintre două lentile de cameră, putem calcula distanțe fizice exacte. Acest episod acoperă epipolar geometry și disparity maps.
3m 55s
17
Deep Monocular Metric Depth
Explorăm modul în care rețelele neuronale profunde moderne au învățat să deducă o profunzime metrică 3D extrem de precisă din imagini 2D complet plate, cu o singură lentilă, încălcând regula tradițională a stereo vision.
3m 45s
18
AI on the Edge: Implementarea pe microcontrollere
Modelele nu rulează întotdeauna pe GPU-uri masive în cloud. Învață cum quantization, conversia INT8 și architecture pruning permit modelelor complexe de viziune să ruleze pe microcontrollere IoT cu consum redus de energie.
5m 15s
19
Radiance Fields: 3D Gaussian Splatting
Grafica 3D tradițională folosește wireframes, dar CV-ul modern folosește radiance fields. Analizăm tehnologia de ultimă oră 3D Gaussian Splatting pentru reconstrucția fotorealistă a mediului.
3m 56s
20
Bucla Vision-Action: Agentic AI
În finalul seriei noastre, privim către destinația supremă a computer vision: Agentic AI. Învață cum percepția vizuală este integrată cu modelele de acțiune pentru a crea lucrători digitali autonomi.
3m 56s
Episoade
1
Sufletul OpenCV: Pixelii ca matrice
3m 57s
Explorăm modelul mental fundamental al OpenCV, unde imaginile sunt tratate ca array-uri de date multidimensionale. Ascultătorii vor învăța cum manipularea matricelor NumPy se traduce în schimbări vizuale pe ecran.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Deep Dive în Computer Vision, episodul 1 din 20. Majoritatea developerilor se gândesc la o imagine ca la un fișier comprimat care stă pe un hard disk. Dar în momentul în care pasezi acel fișier unei librării de computer vision, el își pierde formatul de fișier și devine o grilă masivă de numere care așteaptă calcule cu matrici. Să înțelegi exact cum sunt structurate aceste numere este Sufletul OpenCV: Pixeli ca Matrici.
Când încarci o imagine folosind OpenCV, funcția read trage fișierul de pe disk și îl convertește instantaneu într-un array NumPy multidimensional. Asta e partea care contează. OpenCV în Python nu folosește un obiect imagine proprietar. Se bazează în întregime pe NumPy. Pentru că o imagine este doar un array standard, orice operație matematică pe care o poți aplica unui array poate fi aplicată direct pe imaginea ta.
Hai să ne uităm la structura acestui array. Dacă încarci o imagine color standard, obții o matrice tridimensională. Prima dimensiune este înălțimea, care reprezintă numărul de rânduri. A doua dimensiune este lățimea, reprezentând numărul de coloane. A treia dimensiune conține canalele de culoare. Dacă ai o imagine cu o lățime de opt sute de pixeli și o înălțime de șase sute de pixeli, forma array-ului tău va fi de șase sute de rânduri, opt sute de coloane și trei canale. Fiecare intersecție dintre un rând și o coloană conține un pixel. Iar pentru imaginile standard, fiecare canal de culoare din interiorul acelui pixel conține o valoare integer de la zero la două sute cincizeci și cinci, reprezentând intensitatea acelei culori.
Există o capcană foarte comună aici. Majoritatea softurilor de grafică și a browserelor web reprezintă culorile în formatul Red, Green, Blue, cunoscut sub numele de RGB. OpenCV nu face asta. Din motive istorice care datează de la hardware-ul primelor camere, OpenCV stochează canalele de culoare în ordine inversă: Blue, Green, Red, sau BGR. Dacă încerci să afișezi o imagine OpenCV într-o altă librărie fără să faci swap acelor canale, roșul tău va arăta albastru, iar albastrul tău va arăta roșu. Nu este un bug în codul tău. Ține minte doar că valoarea la indexul zero al canalului este blue, indexul unu este green, iar indexul doi este red.
Pentru că imaginile sunt doar array-uri NumPy, manipularea lor se bazează pe sintaxa standard Python. Nu ai nevoie de funcții OpenCV specializate ca să dai crop unei imagini. Pur și simplu dai slice la array. Să presupunem că ai un feed de la o cameră de securitate high-definition și te interesează doar o regiune de o sută pe o sută de pixeli unde se află o ușă. Extragi un Region of Interest, sau ROI, folosind array slicing standard. Specifici rândul de început și rândul de sfârșit, urmate de coloana de început și coloana de sfârșit. În termeni matematici, dai slice mai întâi pe axa Y, apoi pe axa X. Asta returnează instantaneu un array NumPy mai mic care conține doar datele pixelilor de la ușă.
După ce ai dat slice la array sau i-ai modificat pixelii, de obicei vrei să salvezi rezultatul. OpenCV gestionează asta cu o simplă funcție write. Oferi un file path de destinație și pasezi array-ul tău NumPy. OpenCV citește extensia de fișier pe care ai cerut-o, cum ar fi dot JPG, și gestionează automat compresia complexă necesară pentru a transforma acea matrice de numere înapoi într-un fișier de imagine standard.
Cel mai util lucru pe care îl poți face atunci când înveți computer vision este să nu te mai gândești la imagini ca la niște canvas-uri vizuale, și să începi să le tratezi ca pe niște sisteme de coordonate pline cu date numerice raw. Dacă îți plac aceste deep dive-uri, poți susține emisiunea căutând DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Mulțumesc pentru audiție, și continuă să construiești!
2
Convolution Kernels: Filtrare și Edge Detection
4m 22s
Explorează matematica filtrării spațiale folosind convolution kernels. Acest episod explică modul în care glisarea unei mici grile numerice peste o imagine realizează efecte de blur, sharpening și edge detection.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 2 din 20. Aplicarea unui filtru de blur pe o fotografie pare un efect vizual complex, dar din punct de vedere computațional, înseamnă doar înlocuirea fiecărui pixel cu media matematică a vecinilor săi imediați. Mecanismul din spatele acestui proces este ceea ce acoperim astăzi: Convolution Kernels: Filtering și Edge Detection.
Când auzi cuvântul convoluție, s-ar putea să te gândești imediat la Convolutional Neural Networks. Trebuie să separăm aceste concepte chiar acum. Într-o rețea de deep learning, un model determină valorile din interiorul filtrelor sale în timpul unui proces masiv de antrenament. Astăzi, vorbim despre convoluția bidimensională clasică. Aceste kernel-uri sunt matrici matematice fixe, hardcoded, care există de zeci de ani. Ele nu învață. Ele doar calculează.
Un kernel este pur și simplu o grilă minusculă de numere. O dimensiune comună este un pătrat de trei pe trei. Convoluția este procesul prin care iei această grilă minusculă și o glisezi peste întreaga imagine, pixel cu pixel. La fiecare oprire, aliniezi centrul kernel-ului tău cu un pixel specific din imagine. Apoi, înmulțești fiecare număr din kernel cu valoarea pixelului din imagine aflat direct sub el. Aduni toate cele nouă rezultate, iar acea sumă finală devine noua valoare unică pentru pixelul central din imaginea ta de output. Faci acest lucru pentru fiecare pixel.
Numerele pe care le pui în interiorul acelei grile mici dictează exact ce se întâmplă cu întreaga imagine. Dacă umpli kernel-ul cu fracții a căror sumă este unu, obții un blur. Un Gaussian blur este un tip specific de kernel în care valoarea centrală are cea mai mare pondere, iar valorile scad pe măsură ce te deplasezi spre marginile grilei. Asta creează o medie ponderată localizată. Asta e partea care contează. Nu aplicăm blur pe imagini pentru a le face să arate artistic. Le aplicăm blur pentru a distruge acel noise. Un senzor de cameră înregistrează fluctuații mici și aleatorii de lumină. Dacă încerci să analizezi structura rigidă a unei imagini cu acel noise prezent, algoritmii tăi vor eșua. Un Gaussian blur netezește acel noise neregulat, păstrând în același timp formele generale.
Odată ce acel noise a dispărut, de obicei vrei să găsești obiectele reale din cadru. Gândește-te la un sistem de camere conceput să citească plăcuțe de înmatriculare. Înainte să poți citi caracterele, trebuie să izolezi plăcuța dreptunghiulară de bara mașinii. Pentru un computer, un edge este pur și simplu o tranziție bruscă de la pixeli întunecați la pixeli deschiși, sau invers. Pentru a găsi aceste tranziții clare, înlocuim matricea de blur cu o matrice de edge detection, cum ar fi kernel-ul Sobel.
Un kernel Sobel vertical este conceput special pentru a găsi edge-uri verticale. Este o grilă de trei pe trei care conține o coloană de numere negative în stânga, o coloană de zerouri în mijloc și o coloană de numere pozitive în dreapta. Pe măsură ce acest kernel alunecă peste o zonă de culoare solidă, cum ar fi o bară de protecție gri netedă, numerele negative și pozitive se înmulțesc cu aceeași valoare de gri. Se anulează reciproc. Suma este zero, ceea ce se traduce printr-un pixel negru în imaginea de output. Zonele solide dispar.
Dar când kernel-ul aterizează fix pe limita verticală dintre acea bară de protecție întunecată și o plăcuță de înmatriculare albă și strălucitoare, matematica se schimbă. Numerele negative se înmulțesc cu pixelii întunecați, producând o valoare mică. Numerele pozitive se înmulțesc cu pixelii albi strălucitori, producând o valoare masivă. Ele nu se mai anulează reciproc. Suma finală este un număr pozitiv foarte mare, care creează un pixel alb strălucitor în imaginea ta de output exact acolo unde se află acel edge. Prin rularea acestei operații pe întreaga imagine, bara de protecție dispare în întuneric, lăsând în urmă un contur alb intens al plăcuței de înmatriculare.
Tocmai ai transformat datele brute de culoare în geometrie structurală. Concluzia principală este că un kernel de convoluție clasic nu este altceva decât o regulă matematică locală aplicată global, care dictează cum ar trebui să reacționeze fiecare pixel la vecinii săi imediați.
Îți mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
3
Desenarea granițelor: Contururi și geometrie
3m 57s
Trecem de la pixeli bruți la forme coerente prin extragerea granițelor continue. Învață cum să calculezi bounding boxes, convex hulls și proprietăți geometrice direct din contururile imaginii.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 3 din 20. Ai nevoie de outline-ul exact al unui obiect pe o bandă transportoare. Primul tău instinct ar putea fi să încarci un neural network masiv de semantic segmentation. Dar calcularea acelui outline folosind geometria standard este cu ordine de mărime mai rapidă, mai ieftină computațional și nu necesită un GPU. Exact asta îți permite să faci Drawing Boundaries: Contours and Geometry.
O greșeală frecventă este să tratezi edges și contours ca fiind același lucru. Sunt data structures fundamental diferite. Un edge detector îți oferă un binary map de pixeli albi neorganizați și deconectați, unde intensitatea se schimbă. Un contour este o curbă matematică continuă care unește toate punctele consecutive de-a lungul unui boundary cu aceeași culoare sau intensitate. Edges sunt doar puncte izolate pe un ecran. Contours formează forme închise, măsurabile.
Imaginează-ți un sistem de control al calității dintr-o fabrică ce inspectează o roată dințată metalică. Ai convertit deja camera feed-ul într-un binary image alb-negru. Roata dințată este complet albă pe un fundal negru. Pentru a obține acel mathematical boundary al roții dințate, pasezi această imagine funcției de contour finding. OpenCV face acest lucru scanând imaginea rând cu rând. Când algoritmul atinge un boundary între pixelii negri și albi, trasează de-a lungul acelei margini, înregistrând coordonatele într-un array. Pentru a salva memorie, comprimă output-ul, stocând doar punctele de start și de end ale segmentelor drepte în loc de fiecare pixel în parte.
Acest proces captează și relațiile spațiale. Roata dințată are un outer edge, dar are și o gaură la mijloc pentru ax. Algoritmul de contour construiește o ierarhie. Înregistrează outer boundary-ul ca un parent contour, iar gaura interioară ca un child contour. Asta îți permite să analizezi selectiv sau să ignori formele interne în funcție de nevoile tale.
Acum că ai roata dințată ca un connected boundary, poți să-i extragi geometria. Poți calcula contour area. Acesta este un calcul matematic al ariei totale a pixelilor din interiorul curbei închise. O roată dințată perfect fabricată va avea o arie specifică, cunoscută. Dacă o roată dințată are un dinte rupt, aria contour-ului său scade sub threshold-ul tău acceptabil. Semnalezi defectul instantaneu.
Uneori trebuie să înțelegi forma generală a unui obiect, ignorând în același timp detaliile sale complexe. Aici devine interesant. Poți calcula convex hull-ul unui contour. Gândește-te la convex hull ca la un elastic întins strâns în jurul exteriorului obiectului tău. Pentru roata dințată, contour-ul standard urmărește perfect fiecare dinte și vale. Convex hull-ul ignoră văile. Se întinde direct de la vârful unui dinte până la vârful următorului.
Comparând contour-ul original cu convex hull-ul, identifici anomalii structurale. Spațiile goale dintre elastic și contour-ul real al roții dințate se numesc convexity defects. Măsurarea acestor defects îți spune exact cât de adânci sunt dinții roții dințate și dacă vreunul este uzat, totul prin calcul geometric pur.
Contours fac legătura între low-level image processing și high-level object analysis, transformând o grilă de pixeli simpli în forme geometrice structurate pe care le poți valida strict.
Asta e tot pentru acest episod. Mulțumesc pentru ascultare și spor la construit!
4
Feature Detectors: Keypoints și Neural Matching
4m 15s
Descoperă cum algoritmii identifică ancore vizuale distincte, cunoscute sub numele de keypoints, pentru a urmări obiecte din perspective diferite. Acoperim neural feature matching pentru sarcini complexe de aliniere a imaginilor.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 4 din 20. Cele mai robuste trackere vizuale nu memorează cum arată un obiect întreg. În schimb, se fixează pe colțuri distincte matematic și pe gradienți cu contrast ridicat, care rămân constanți indiferent de iluminare. Rezolvarea corectă a acestui lucru ține de domeniul Feature Detectors: Keypoints și Neural Matching.
Înainte să ne uităm la mecanică, trebuie să separăm asta de object detection. Object detection aplică categorii semantice largi. Desenează un bounding box și îți spune că o clădire se află în cadru. Feature matching-ul este strict structural. Nu știe ce este aia o clădire. Găsește o intersecție specifică și identică a două cărămizi în două imagini diferite.
Gândește-te că vrei să construiești o aplicație de panorama stitching. Ai două fotografii suprapuse cu un zid de cărămidă, făcute din unghiuri ușor diferite. Pentru a le da stitch perfect, software-ul trebuie să alinieze matematic zona de overlap. Face asta găsind features locale distincte în prima imagine, găsind aceleași features în a doua imagine și împerechindu-le.
Primul pas este detecția. Sistemul scanează imaginea după keypoints. Un keypoint este o locație specifică a unui pixel care iese în evidență față de împrejurimi. Zonele plate, cum ar fi un cer senin sau un perete alb gol, sunt inutile, deoarece fiecare pixel arată exact la fel. Algoritmul vânează textură intensă, colțuri ascuțite și linii care se intersectează. În mod tradițional, algoritmii se bazau pe formule matematice create manual pentru a găsi aceste margini. Abordările moderne folosesc convolutional neural networks. Introduci imaginea în rețea, iar aceasta scoate un probability map care indică cât de probabil este ca un anumit pixel să fie un keypoint stabil.
Odată ce rețeaua identifică un punct, cum ar fi colțul unei anumite rame de fereastră, are nevoie de o modalitate de a-l descrie. Acesta este descriptorul. Rețeaua neurală generează un vector high-dimensional, un embedding, care surprinde pattern-ul vizual al pixelilor care înconjoară imediat acel keypoint. Un descriptor robust rămâne similar din punct de vedere matematic chiar dacă a doua fotografie este făcută la un scale diferit, este rotită sau se află în condiții de iluminare diferite.
Aici este ideea de bază. Să ai o listă de puncte și descrierile lor este doar jumătate din puzzle. Tot trebuie să dai match la punctele din prima imagine cu punctele din a doua imagine. Istoric vorbind, pur și simplu calculai distanța dintre vectori și îl alegeai pe cel mai apropiat. Dar pattern-urile repetate, cum ar fi sutele de cărămizi identice de pe un perete, cauzează erori grave de mismatching. Aici intervin modelele de neural matching. În loc să evalueze un keypoint în izolare, un neural matcher analizează relațiile spațiale dintre toate keypoint-urile simultan. Practic, învață că un anumit colț ar putea arăta ca alte cincizeci de colțuri de cărămidă, dar este singurul situat exact între rama unei ferestre și o umbră specifică. Trecând descriptorii și pozițiile lor geometrice prin layere de self-attention, sistemul respinge false positives și scoate perechi de matching extrem de precise.
Într-un pipeline tipic, treci mai întâi ambele imagini printr-o rețea de feature extraction. Asta returnează două seturi de keypoints și două seturi de descriptori. Apoi, trimiți ambele seturi de date într-o rețea de matching. Rețeaua de matching calculează similaritățile contextuale și returnează o listă de perechi valide, aruncând keypoint-urile care nu există în ambele cadre. Apoi folosești acele perechi de coordonate care au primit match pentru a calcula transformarea geometrică necesară pentru a da warp și stitch perfect celor două fotografii.
Trecerea de la formule create manual la neural embeddings înseamnă că feature matching-ul poate acum gestiona variații extreme de iluminare și unghiuri extreme care obișnuiau să strice complet algoritmii mai vechi. Mersi de ascultare, happy coding tuturor!
5
Geometrie în lumea reală: Construirea unui scanner de documente
3m 54s
Un episod de referință care combină conceptele anterioare într-un pipeline practic. Ascultătorii vor învăța cum edge detection, contururile și perspective transforms creează un scanner de documente funcțional.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 5 din 20. Aplicațiile mobile de tip document scanner par o magie complexă de AI. Îndrepți telefonul spre o foaie de hârtie și instantaneu se aplatizează într-un document digital perfect. Dar motorul principal din spate nu este o rețea neuronală care prezice detaliile lipsă. Este construit pe un truc matematic vechi de cincisprezece ani, care implică o matrice de transformare trei pe trei. Acest episod acoperă Real-World Geometry: construirea unui document scanner.
Gândește-te la un bon mototolit lăsat pe o masă de restaurant. Îi faci o poză dintr-un unghi înclinat. Din cauza perspectivei, bonul arată ca un trapez deformat, înconjurat de textura mesei. Pentru a extrage documentul, primul pas este să-l izolezi de background. Convertești imaginea în grayscale și aplici un blur ușor. Asta atenuează detaliile cu noise, cum ar fi cutele hârtiei sau textura lemnului de pe masă, păstrând în același timp marginile principale intacte. Apoi, rulezi un Canny edge detection. Asta evidențiază schimbările bruște de intensitate, lăsându-te cu un contur luminos al bonului pe un background întunecat.
Mai departe, trebuie să transformi acele margini libere într-o formă definită. Găsești contururile în edge map. Imaginea va conține multe contururi, iar majoritatea sunt mici artefacte inutile. Le sortezi după arie, păstrându-le doar pe cele mai mari. Apoi, iterezi prin aceste contururi mari și le aproximezi forma poligonală. Cauți un indiciu structural specific. Dacă găsești o formă care poate fi aproximată cu exact patru puncte, ai găsit conturul bonului. Acele patru puncte definesc colțurile documentului tău în fotografia originală, înclinată.
Acum ajungem la pasul critic de aplatizare a documentului. O concepție greșită comună este că acest proces folosește AI pentru a ghici sau a halucina date lipsă. Nu este așa. Un perspective transform este o deformare matematică pură a coordonatelor pixelilor de la un plan la altul.
Pentru a executa asta, ai nevoie de două seturi de câte patru puncte. Primul set reprezintă cele patru colțuri pe care tocmai le-ai găsit pe bon. Al doilea set reprezintă locul unde ar trebui să fie acele colțuri în imaginea finală, perfectă. Pentru a obține al doilea set, calculezi lățimea maximă și înălțimea maximă a bonului deformat, folosind formula distanței dintre punctele originale. Apoi definești un dreptunghi nou, perfect, începând de la coordonata zero-zero, care se extinde exact pe acea lățime și înălțime.
Cu aceste două seturi de puncte, calculezi o matrice de perspective transform. Această matrice definește exact cât de mult trebuie să se deplaseze, să se întindă sau să se comprime fiecare pixel pentru a trece de la forma de trapez înclinat la forma de dreptunghi plat. În cele din urmă, aplici această matrice pe imaginea originală de înaltă rezoluție. Matematica trage la propriu cele patru colțuri spre exterior și le aliniază la unghi drept, deformând toți pixelii interiori odată cu ele. Rezultatul este o imagine bidimensională, perfect top-down, a bonului tău, gata de procesare.
Iată ideea cheie. Nu ai nevoie de deep learning pentru a corecta perspectiva. Atâta timp cât poți izola patru colțuri, o simplă operație cu matricea va remapa perfect geometria oricărei suprafețe plane.
Mersi că ai fost aici. Sper că ai învățat ceva nou.
6
Avantajul experimental: opencv_contrib
3m 53s
Explorăm repository-ul opencv_contrib, terenul de testare pentru algoritmi de ultimă generație. Învață cum sunt evaluate modulele experimentale de computer vision înainte de a intra în biblioteca de bază.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 6 din 20. Până când un nou algoritm de tracking devine o funcție standard în library-ul principal OpenCV, a petrecut adesea ani de zile fiind testat intens de cercetători într-un spațiu separat, paralel. Dacă te limitezi doar la release-urile default, ratezi cele mai noi tehnici din domeniu. Acel spațiu paralel este repository-ul opencv_contrib.
Mulți developeri văd cuvântul „contrib” și presupun că acel cod este broken, netestat sau strict software beta. Asta este o neînțelegere. Codul din acest repository este adesea extrem de optimizat și utilizat activ în medii solicitante. Distincția ține în întregime de stabilitatea API-ului, nu de calitatea codului.
Library-ul core OpenCV impune garanții stricte, pe termen lung, de backward-compatibility. Dacă o funcție intră în release-ul principal, inputurile, outputurile și comportamentul ei trebuie să rămână stabile ani de zile. Dar cercetarea în domeniul computer vision avansează extrem de rapid. Cercetătorii au nevoie de un loc unde să publice noi algoritmi, să redenumească parametri și să modifice structuri de date pe baza feedback-ului din lumea reală. Repository-ul opencv_contrib oferă exact acest mediu. Acționează ca un incubator. Maintainerii acestor module extra au voie să facă breaking changes la API între release-uri. Ei pot redenumi funcții sau pot schimba modul în care se inițializează un algoritm fără a încălca regulile stricte ale library-ului core.
În timp, un modul s-ar putea dovedi a fi universal util. API-ul său se stabilizează, edge case-urile sunt rezolvate, iar comunitatea ajunge să se bazeze foarte mult pe el. Când se întâmplă asta, maintainerii OpenCV migrează codul. Ei mută fizic modulul din repository-ul opencv_contrib și îi dau merge direct în repository-ul principal OpenCV. Acest proces de absolvire asigură că library-ul core absoarbe doar tehnologie dovedită și stabilă.
Ia în considerare un scenariu concret. Construiești un proiect de augmented reality și vrei să folosești modulul de tracking ArUco pentru a detecta markeri fiduciali pătrați într-un live camera feed. Acest modul conține funcții extrem de specializate, state-of-the-art. Ca să-l folosești, faci build la mediul OpenCV from source. Clonezi repository-ul principal pe mașina ta locală, apoi clonezi repository-ul opencv_contrib chiar lângă el.
Când îți configurezi build tool-ul, pasezi o variabilă de path specifică care indică spre folderul de module din interiorul repository-ului contrib. Build system-ul citește acest flag și compilează library-ul core, dar se duce și în folderul contrib, compilează modulul ArUco și îi dă link direct în binarele tale finale. Nu te alegi cu două library-uri separate. Obții o singură instalare OpenCV unificată, care include atât baza rock-solid, cât și modulele experimentale alese de tine.
Dacă îți place podcastul și vrei să susții emisiunea, poți căuta DevStoriesEU pe Patreon — este mereu apreciat.
Adevărata putere a acestei arhitecturi constă în înțelegerea naturii sale duale: repository-ul principal îți protejează production pipelines de breaking changes, în timp ce repository-ul contrib îți oferă astăzi cercetarea de computer vision de mâine.
Asta e tot pentru episodul ăsta. Ne auzim data viitoare!
7
Motorul de inferență: Modulul DNN din OpenCV
3m 54s
O introducere în modulul Deep Neural Network (DNN). Discutăm despre cum OpenCV ocolește framework-urile ML greoaie pentru a executa forward passes ultra-rapide pe modele AI pre-antrenate.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Deep Dive în Computer Vision, episodul 7 din 20. Poți să extragi creierul unui server masiv de training PyTorch, să-l exporți ca un singur fișier și să-l rulezi incredibil de rapid în C++ pur, fără să instalezi deloc PyTorch. Când treci de la trainingul unui model la deploy-ul lui în lumea reală, cerințele tale se schimbă de la flexibilitate la viteză brută. Exact aici preia controlul Inference Engine, modulul DNN al OpenCV.
O capcană comună în care cad inginerii este să presupună că, dacă un model a fost antrenat folosind TensorFlow, mașina de deploy trebuie să aibă și o instalare masivă de TensorFlow pentru a-l rula. Asta e fals. OpenCV execută inference-ul complet nativ. Modulul DNN este un inference engine dedicat, extrem de optimizat, de tip forward-pass. Nu face backpropagation. Nu calculează gradienți. Nu antrenează modele. Singurul lui job este să ia o rețea pre-antrenată, să preia o imagine și să-ți ofere un răspuns cât de repede permite hardware-ul.
OpenCV oferă loadere native pentru formatele standard de modele. Poți încărca modele Caffe, protocol buffers TensorFlow, configurații Darknet și fișiere ONNX direct în aplicația ta. Aici e ideea principală. Când apelezi o funcție precum readNet, OpenCV parsează formatul de fișier extern și reconstruiește graful rețelei neuronale folosind propriile implementări interne de layere C++. Dependențele externe sunt complet eliminate. Aplicația ta face link doar cu OpenCV.
Imaginează-ți o cameră smart embedded în C++, concepută să detecteze pietonii pe stradă. Nu vrei un runtime Python masiv care să-ți consume memoria limitată și cu siguranță nu vrei gigabytes de librării de deep learning care să ocupe spațiu de stocare pe un edge device. În schimb, îți antrenezi detectorul de pietoni pe un cluster GPU puternic și exporți weights-urile finale într-un fișier ONNX. Pui acel singur fișier pe storage-ul camerei tale.
În aplicația ta C++, folosești modulul DNN ca să încarci fișierul ONNX. Apoi, capturezi un frame de la senzorul camerei. Rețelele neuronale nu pot procesa direct imagini raw. Trebuie să convertești acel frame într-un array structurat, cu patru dimensiuni, numit în mod obișnuit blob. OpenCV oferă o funcție dedicată pentru a construi acest blob, care se ocupă de redimensionarea imaginii, schimbarea canalelor de culoare și aplicarea de mean subtraction sau a scaling-ului specific pe care modelul original îl cere.
Pasezi acest blob pregătit către input layer-ul rețelei. Apoi apelezi funcția forward. Modulul DNN preia controlul, împingând datele prin fiecare layer convoluțional, funcție de activare și pooling layer. Pentru că OpenCV deține întregul graf de execuție în acest moment, poate optimiza agresiv calculele matematice. Fuzionează layerele adiacente acolo unde este posibil pentru a reduce memory bandwidth-ul și folosește automat accelerarea hardware nativă. Funcția forward se termină și returnează un array final care conține coordonatele de bounding box și confidence scores pentru pietonii pe care i-a găsit.
Păstrează framework-urile grele în laborator pentru training și folosește modulul DNN al OpenCV pentru un deploy lightweight, fără dependențe, în producție. Mersi că ai fost pe aici. Sper că ai învățat ceva nou.
8
Linia YOLO: Object Detection rapid
3m 51s
Urmărim evoluția arhitecturii You Only Look Once (YOLO). Ascultătorii vor înțelege schimbarea de paradigmă arhitecturală care a făcut posibilă predicția de bounding boxes în timp real.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 8 din 20. Înainte de apariția sistemelor moderne, modelele de object detection trebuiau să scaneze o singură imagine de zeci de ori la scale diferite doar pentru a găsi o țintă. Era extrem de lent și foarte costisitor din punct de vedere computațional. Apoi, o nouă arhitectură a revoluționat domeniul, făcând toată treaba dintr-o singură trecere matematică incredibil de rapidă. Astăzi, ne uităm la seria YOLO: Fast Object Detection.
Pentru a înțelege de ce You Only Look Once, sau YOLO, a schimbat totul, uită-te la standardul anterior. Acele pipelines multi-stage mai vechi se bazau pe region proposals. Ele generau sute de presupuneri despre locul în care s-ar putea afla un obiect, dădeau crop acelor zone, și apoi rulau un image classifier peste fiecare patch izolat. Rulai rețele complexe într-un loop. Era un proces deconectat, greu de optimizat și fundamental lent.
Unii developeri confundă YOLO cu standard image classification, care pur și simplu atribuie o etichetă unei imagini întregi. YOLO face mult mai mult. Returnează bounding boxes spațiale precise, alături de class probabilities. Îți spune ce este obiectul și exact unde se află în spațiul fizic.
YOLO a realizat asta prin reformularea completă a procesului de object detection. În loc de un pipeline multi-stage, a transformat detecția într-o singură problemă de regresie. Logica merge direct de la raw image pixels la coordonatele de bounding box și class probabilities, într-un singur pas continuu.
Iată ideea cheie. YOLO ia imaginea de input și o împarte într-un grid uniform. Dacă centrul unui obiect cade într-o anumită celulă din grid, exact acea celulă devine responsabilă pentru detectarea obiectului. Fiecare celulă din grid prezice simultan un număr fix de bounding boxes. Pentru fiecare box, returnează coordonatele centrului, lățimea și înălțimea. De asemenea, returnează un confidence score, care îi spune sistemului cât de sigur este că acel box conține, de fapt, un obiect.
Simultan, celula prezice acele class probabilities. Calculează dacă obiectul este o mașină, un camion sau o persoană. Rețeaua înmulțește apoi acel box confidence cu class probability. Această singură operație matematică filtrează toate estimările slabe de pe întregul grid, lăsând doar acele bounding boxes extrem de precise.
Gândește-te la o cameră de mare viteză pentru taxare pe autostradă. Mașinile se deplasează cu optzeci de mile pe oră. Ai nevoie de o rețea single-pass pentru a desena bounding boxes în jurul plăcuțelor de înmatriculare înainte ca mașina să părăsească acel frame. Un detector multi-stage ar avea lag, dând crop și analizând patch-uri izolate de asfalt în timp ce mașina se îndepărtează în viteză. YOLO procesează întregul frame deodată. Aplică grid-ul, prezice geometria și calculează probabilitățile într-un singur forward pass al rețelei neuronale.
Pentru că YOLO procesează toată imaginea dintr-o singură trecere, înțelege în mod inerent contextul global al scenei. Modelele mai vechi confundau adesea patch-uri de background cu obiecte, pentru că vedeau doar crop-uri izolate. Prin formularea detecției ca o singură problemă de regresie pe un grid, YOLO forțează rețeaua să învețe reprezentări generalizate ale obiectelor în contextul lor complet.
Îți mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
9
YOLOv26: Detecție End-to-End NMS-Free
4m 15s
O analiză detaliată a arhitecturii de ultimă generație YOLOv26. Învață cum eliminarea Non-Maximum Suppression (NMS) și integrarea optimizatorului MuSGD creează implementări edge cu latență ultra-scăzută.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 9 din 20. Timp de un deceniu, cel mai mare bottleneck în real-time object detection nu a fost neural network-ul în sine. Ci algoritmul hand-coded, greoi, folosit pentru a curăța predicțiile sale dezordonate și suprapuse. Soluția pentru asta este YOLOv26, mai exact arhitectura sa de detecție end-to-end, NMS-free.
Pentru a înțelege schimbarea, trebuie să te uiți la modul în care detectoarele tradiționale își termină treaba. Ele se bazează pe Non-Maximum Suppression, sau NMS. NMS este un pas lent de post-processing. Când un model standard se uită la un obiect, nu prezice doar un singur bounding box. Prezice zeci de bounding boxes suprapuse în jurul aceluiași obiect. NMS intervine pentru a da un scor acestor boxes, a le calcula suprapunerea, a șterge duplicatele și a păstra doar cel mai bun fit.
Acest proces de cleanup este inerent secvențial și aproape mereu rulează pe CPU. Imaginează-ți că faci deploy la un vision model pe un NVIDIA Jetson Orin pentru un robot de sortare dintr-un depozit. Trebuie să detectezi sute de pachete care se mișcă rapid la 60 de cadre pe secundă. GPU-ul trece fulgerător prin layerele din neural network. Apoi, pipeline-ul se blochează. CPU-ul se gâtuie încercând să ruleze NMS peste mii de coordonate brute de bounding boxes suprapuse. Frame rate-ul tău scade drastic din cauza procesului de cleanup, nu din cauza inference-ului.
YOLOv26 elimină complet acest bottleneck, oferind inferență nativă NMS-free. Treci o imagine prin rețea, iar rețeaua dă ca output exact un bounding box per obiect. Scriptul de post-processing a dispărut.
Pentru a face asta posibil, arhitectura YOLOv26 renunță la o componentă numită Distribution Focal Loss, sau DFL. În iterațiile anterioare, DFL era folosit pentru a modela marginile unui bounding box ca o distribuție statistică continuă. Ajuta modelul să ghicească unde ar putea fi marginile neclare sau ascunse, dar încuraja în mod natural rețeaua să dea ca output mai multe estimări suprapuse. Eliminarea DFL schimbă fundamental comportamentul rețelei. Fără el, modelul este puternic penalizat în timpul procesului de training dacă prezice mai mult de un bounding box per obiect. Forțează rețeaua să fie absolut decisivă.
Totuși, eliminarea DFL creează o nouă problemă. Faptul că forțezi rețeaua să dea ca output exact o singură graniță fixă face ca procesul de training să fie extrem de instabil. Loss landscape-ul devine ascuțit și haotic. Pentru a repara asta, YOLOv26 integrează optimizer-ul MuSGD în pipeline-ul său de training. MuSGD stabilizează procesul de învățare prin ajustarea dinamică a momentum-ului pe baza variance-ului gradienților. Când procesul de training lovește o parte abruptă și haotică din loss landscape, MuSGD amortizează weight updates-urile, astfel încât modelul să nu deraieze. Când calea gradientului este stabilă, accelerează. Acest optimizer specific este cel care permite arhitecturii să conveargă către o singură predicție strictă, fără să colapseze.
Rezultatul la deployment este masiv. Când exporți un model YOLOv26 în TensorRT pentru acel robot de depozit, întregul pipeline rămâne pe GPU. Rețeaua procesează frame-ul și dă ca output direct coordonatele finale ale pachetului. CPU-ul este complet eliberat pentru alte task-uri de control robotic.
Iată ideea cheie. Cel mai rapid cod este codul care nu rulează niciodată. Prin mutarea poverii de deduplication de la un script de post-processing la runtime înapoi în faza de optimizare din training, YOLOv26 deblochează o eficiență hardware care anterior era imposibilă.
Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
10
YOLO-World: Detecție Zero-Shot Open Vocabulary
3m 58s
Eliberează-te de categoriile fixe, predefinite. Acest episod acoperă modul în care YOLO-World folosește maparea Vision-Language pentru a detecta obiecte complet noi, fără nicio antrenare suplimentară a modelului.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 10 din 20. Detectoarele tradiționale de obiecte suferă de o formă severă de tunnel vision. Pot urmări perfect mașinile, oamenii și bicicletele, dar dacă le ceri să găsească o cană de cafea vărsată, sunt complet oarbe, limitate la cele câteva clase pe care au fost antrenate explicit în laborator. Ca să repari asta, nu trebuie să faci label la mii de căni vărsate. Ai nevoie de YOLO-World și Open-Vocabulary Zero-Shot Detection.
Ia în calcul un scenariu specific. Gestionezi un sistem de securitate pentru un magazin de retail. Trebuie să cauți în feed-urile video live o sticlă albastră Hydro Flask sau un golden retriever pierdut. Cu un detector standard cu vocabular fix, ar trebui să oprești sistemul, să colectezi imagini cu golden retrieveri din magazinul tău, să desenezi manual bounding boxes în jurul lor, să reantrenezi modelul și să-i faci redeploy. Cu YOLO-World, pur și simplu scrii un text prompt în sistem. Acesta găsește obiectul instantaneu, zero-shot.
Acesta nu este un model generativ text-to-image. Nu creează imagini. De asemenea, este complet diferit de simpla adăugare a unei noi clase la un dataset existent. Open-vocabulary detection se bazează pe o înțelegere semantică profundă a limbajului. Mapează direct text prompt-urile lingvistice la bounding boxes vizuale.
Sistemul primește două input-uri: o imagine și un set de text prompt-uri. Folosește un vision backbone pentru a extrage visual features din imagine. Simultan, folosește un text encoder pentru a traduce text prompt-urile tale în vectori matematici, numiți embeddings.
Aici devine interesant. Aceste două fluxuri distincte de date trebuie combinate. YOLO-World gestionează asta folosind o structură numită RepVL-PAN. Asta vine de la Reparameterizable Vision-Language Path Aggregation Network. Acronimul este dens, dar funcția este simplă. RepVL-PAN fuzionează feature-urile de imagine și text. Injectează sensul semantic al text prompt-ului tău direct în visual feature map la scări multiple. Pe măsură ce rețeaua procesează pixelii, este ghidată activ de text embedding.
Modelul învață să facă asta în faza inițială de training printr-un mecanism numit region-text contrastive loss. Modelul generează bounding boxes și extrage visual features din acele regiuni. Apoi compară acele visual features cu text embeddings. Contrastive loss-ul penalizează puternic modelul dacă acele visual features ale unui box nu se aliniază cu text embedding-ul corect. Îl recompensează atunci când se potrivesc. Asta forțează rețeaua să-și alinieze reprezentarea vizuală precis cu conceptele lingvistice, folosind dataset-uri masive de perechi imagine-text. Învață ce înseamnă albastru, Hydro Flask și sticlă ca niște concepte generale, în loc să memoreze o singură categorie rigidă.
Când rulezi modelul în producție, workflow-ul este incredibil de curat. Mai întâi, definești o listă de vocabular custom care conține obiectele tale target. Treci acea listă prin text encoder o singură dată pentru a genera text embeddings-urile. Apoi, trimiți frame-urile video live în visual backbone. Arhitectura RepVL-PAN fuzionează datele vizuale primite cu text embeddings-urile tale precalculate. În cele din urmă, modelul returnează bounding boxes și confidence scores pe baza cât de bine se potrivesc regiunile vizuale cu cuvintele tale.
Adevărata putere a YOLO-World constă în decuplarea detectorului de un dataset rigid, permițându-ți să folosești limbajul natural ca un query executabil, în timp real, pentru lumea fizică.
Mersi că ne-ai ascultat. Pe data viitoare!
11
De la clasic la Deep: Evoluția Facial Recognition
4m 17s
Urmărește istoria recunoașterii faciale, de la metodele statistice timpurii precum PCA și Eigenfaces, până la modelele moderne de embedding bazate pe deep learning. Înțelege cum vectorii definesc identitatea.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 11 din 20. Pentru un AI modern, identitatea ta nu este definită de forma nasului sau de distanța dintre ochi. În schimb, identitatea ta este definită de poziția exactă a coordonatelor tale într-un spațiu geometric cu 128 de dimensiuni. Classic to Deep: Facial Recognition Evolution explică cum am ajuns la acest model.
În primul rând, trebuie să separăm două concepte care se confundă adesea. Face detection înseamnă să găsești unde se află o față într-o imagine. Desenează un bounding box în jurul pixelilor care arată ca un cap uman. Face recognition înseamnă să identifici a cui este fața din interiorul acelui bounding box. Acest episod se concentrează strict pe recognition.
Timp de decenii, abordarea standard a fost statistică. Dacă ai construit un sistem la începutul anilor două mii, probabil ai folosit o tehnică numită Eigenfaces. Eigenfaces se bazează pe un algoritm numit Principal Component Analysis, sau PCA. Începi cu un dataset de imagini cu fețe și faci flatten la fiecare imagine într-un array unidimensional masiv de intensități raw ale pixelilor. PCA analizează apoi întregul dataset pentru a găsi direcțiile de varianță maximă. Găsește pattern-urile matematice de bază care diferențiază o față de alta. Când vizualizezi aceste componente principale, ele arată ca niște fețe fantomatice, blurate.
Pentru a recunoaște o persoană nouă folosind Eigenfaces, sistemul proiectează noua imagine raw în acest subspațiu de componente principale și calculează distanța până la fețele cunoscute din baza de date. Asta funcționează în medii extrem de controlate, dar dă greș în lumea reală. O umbră pe un obraz sau o ușoară înclinare a capului modifică complet valorile raw ale pixelilor. Algoritmul vede un pattern diferit de lumină și nu reușește să te recunoască.
Iată ideea cheie. Deep learning a renunțat complet la ideea de a compara varianța pixelilor raw. Sistemele moderne folosesc Convolutional Neural Networks pentru a genera embeddings. Un embedding este un vector dens de numere care reprezintă feature-urile high-level ale unei fețe. Aceste rețele sunt antrenate pe milioane de imagini folosind penalizări matematice avansate, cum ar fi ArcFace loss. În timpul antrenamentului, rețeaua este forțată să împingă vectorii de embedding ai aceleiași persoane mai aproape unii de alții în spațiul geometric, în timp ce împinge vectorii persoanelor diferite mai departe unii de alții.
Imaginează-ți o încuietoare securizată pentru o ușă de birou, echipată cu o cameră. Când se apropie un vizitator, sistemul detectează și face crop la față, apoi trece acea imagine prin rețeaua neuronală. Rețeaua generează ca output un singur array de 128 de numere floating-point. Acesta este vectorul de embedding. Sistemul calculează apoi distanța euclidiană simplă dintre acel vector al vizitatorului și o bază de date cu vectori ai angajaților autorizați. Nu compară pixeli sau iluminare. Măsoară doar distanța în linie dreaptă dintre două puncte într-un spațiu cu 128 de dimensiuni. Dacă distanța până la un vector al unui angajat este sub un threshold predefinit, ușa se descuie. Sistemul este robust deoarece rețeaua a învățat să ignore umbrele, ochelarii și rotațiile ușoare ale capului în timpul antrenamentului.
Evoluția de la Eigenfaces la deep embeddings este trecerea de la analiza modului în care lumina atinge o față la maparea identității conceptuale a unei persoane într-un sistem de coordonate măsurabil. Dacă vrei să ajuți la menținerea fluxului de cafea și să susții emisiunea, poți căuta DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Mulțumesc pentru audiție și spor la construit!
12
Percepție persistentă: Algoritmi de Object Tracking
4m 35s
Detectarea unui obiect este doar jumătate din bătălie; urmărirea mișcării sale în timp este adevărata provocare. Învață despre algoritmii de multi-object tracking și atribuirea de ID-uri de-a lungul cadrelor video.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 12 din 20. Rularea unei rețele neuronale grele pe fiecare frame al unui video de înaltă rezoluție este o risipă de resurse de calcul. Sistemele inteligente detectează un obiect o singură dată, apoi folosesc ecuații fizice extrem de rapide pentru a prezice unde se va mișca în continuare. Acesta este domeniul Percepției Persistente: algoritmi de Object Tracking.
Imaginează-ți un sistem smart-city de monitorizare a traficului. Trebuie să numeri vehiculele unice care trec printr-o intersecție aglomerată. Un model de object detection analizează un singur moment înghețat în timp. Dacă rulezi detecție pură pe un video la treizeci de frame-uri pe secundă, o mașină oprită la un semafor roșu timp de zece secunde generează trei sute de bounding boxes separate, deconectate. Fără o logică de tracking, sistemul tău numără trei sute de mașini. Detecția găsește obiectul. Tracking-ul asociază matematic acel obiect cu versiunea sa din trecut, de-a lungul timpului.
Pentru a repara camera de trafic, ai nevoie de un multi-object tracker pentru a menține un ID persistent pentru fiecare vehicul. Trackerele moderne, precum cele implementate folosind Roboflow și OpenCV, împart această problemă în două faze matematice distincte. Prima fază este predicția, iar a doua fază este asocierea.
Când o mașină intră în feed-ul camerei, detectorul inițial desenează un bounding box. Tracker-ul extrage coordonatele centrului, lățimea și înălțimea acelui box și îi atribuie un integer unic, cum ar fi ID 42. Când sosește următorul frame video, tracker-ul nu scanează imediat imaginea. În schimb, folosește un model matematic, de obicei un Kalman Filter, pentru a face state estimation. Evaluând modul în care ID 42 s-a mișcat în frame-urile anterioare, filtrul calculează viteza vehiculului. Apoi proiectează aceste proprietăți fizice înainte pentru a prezice exact unde ar trebui să fie bounding box-ul pentru ID 42 în noul frame.
Acum ai două seturi de date pentru frame-ul curent. Ai box-urile prezise, generate de state estimator, și box-urile reale, tocmai găsite de detector. Aici este ideea cheie. Tracker-ul trebuie să reconcilieze aceste două seturi pentru a menține ID-urile consistente fără a analiza din nou pixelii efectivi. Construiește o matrice care compară fiecare box prezis cu fiecare box nou detectat. Metrica principală folosită pentru această comparație este Intersection over Union, sau IoU. Aceasta măsoară cât de mult se suprapune aria geometrică prezisă cu aria geometrică detectată.
Dacă locația prezisă pentru ID 42 se suprapune puternic cu un bounding box nou detectat, sistemul concluzionează că este același vehicul. O metodă de optimizare, de obicei Hungarian algorithm, rezolvă această matrice pentru a găsi cele mai logice perechi one-to-one pe întreaga intersecție. Noua detecție moștenește ID 42, iar tracker-ul își actualizează modelul de viteză cu noile coordonate confirmate.
Acest loop de predicție și asociere gestionează în mod inerent obstrucțiile vizuale temporare. Dacă un autobuz blochează vederea mașinii noastre timp de câteva frame-uri, detectorul nu reușește să o găsească. Totuși, state estimator-ul continuă să prezică mișcarea mașinii în spatele autobuzului pe baza ultimei sale traiectorii cunoscute. ID-ul este menținut în viață într-un pending state. Când mașina reapare și detectorul marchează un bounding box care se aliniază cu predicția oarbă continuă a tracker-ului, ID-ul este re-linkat instantaneu.
Făcând legătura între frame-urile independente, multi-object tracking-ul transformă un stream de imagini statice într-o hartă coerentă a entităților în mișcare. Tracking-ul permite aplicației tale să nu se mai întrebe ce se află în frame, și să înceapă să înțeleagă cum se comportă lucrurile în timp.
Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și spor la construit!
13
Modele Vision-Language pentru segmentare
4m 19s
Explorăm modul în care modelele Vision-Language (VLM) depășesc limitele bounding boxes, permițând o segmentare semantică pixel-perfect bazată exclusiv pe prompturi în limbaj natural.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 13 din 20. Am petrecut ani de zile antrenând AI-ul să deseneze bounding boxes în jurul obiectelor, dar aceste boxes sunt greoaie și pline de background noise. Adevăratul scop este să ceri unui sistem, în limbaj natural, să picteze o siluetă pixel-perfect în jurul contururilor exacte ale unui obiect, chiar dacă nu a fost antrenat niciodată explicit pe acel obiect înainte. Asta ne aduce la Vision-Language Models pentru segmentare.
Modelele tradiționale de image segmentation sunt rigide. Ele mapează pixelii la o listă fixă și închisă de categorii, precum mașină, persoană sau copac. Dacă vrei să segmentezi ceva în afara acelei liste, trebuie să colectezi un dataset masiv și să antrenezi un model complet nou. Vision-Language Models, sau VLM-urile, sparg această limitare fuzionând large language models cu visual encoders pentru a face open-world segmentation. Introduci o imagine și un text string arbitrar, iar modelul returnează o mască densă, la nivel de pixel, a oricărui lucru pe care l-ai descris.
Gândește-te la o dronă agricolă automată care zboară deasupra unei podgorii. Un fermier nu vrea bounding boxes generice în jurul plantelor. Are nevoie de o hartă precisă a infecției. El dă un prompt dronei cu text string-ul frunze de viță bolnave. VLM-ul procesează visual feed-ul și text prompt-ul împreună. Înțelege sensul semantic pentru bolnave și frunze de viță din antrenamentul său de limbaj, aliniază acest sens cu visual features ale imaginii și generează o mască. Această mască izolează doar frunzișul infectat până la pixelul exact, ignorând complet frunzele sănătoase, solul și umbrele.
Asta ne aduce la modul în care modelul execută efectiv această logică. Abordarea de baseline este text prompting cu zero-prediction, adesea numită zero-shot. În acest mod, modelul se bazează în întregime pe dataset-ul vast pe care a fost antrenat inițial. Text prompt-ul trece printr-un text encoder, transformându-se într-o reprezentare matematică a cererii tale. Simultan, imaginea trece printr-un vision encoder, împărțind poza într-un grid de visual features. Modelul calculează apoi similaritatea dintre reprezentarea ta text și fiecare visual feature din acel grid. Scorurile mari de similaritate devin masca ta. Punctul crucial aici este că weights-urile modelului rămân complet frozen. Extragi o mască complexă de pixeli folosind doar puterea de language alignment.
Iată ideea cheie. Zero-prediction este puternic, dar se bazează pe un antrenament larg, general-purpose. Uneori, domeniul vizual este pur și simplu prea specializat. Dacă o boală specifică a frunzelor de viță-de-vie arată identic cu o deficiență inofensivă de nutrienți, VLM-ul frozen ar putea avea dificultăți în a le diferenția pur și simplu dintr-o descriere text. Acesta este momentul în care treci la visual fine-tuning. În loc să schimbi doar text prompt-ul, actualizezi weights-urile reale ale componentelor vizuale ale modelului folosind un dataset mic de imagini extrem de specifice, mascate manual. Înveți în mod explicit vision encoder-ul textura vizuală nuanțată a bolii, în loc să te bazezi doar pe înțelegerea conceptuală largă a language model-ului pentru cuvântul boală.
Zero-prediction tratează VLM-ul ca pe un reasoning engine out-of-the-box, condus în întregime de cuvinte, în timp ce visual fine-tuning îl tratează ca pe o fundație puternică pe care o modifici permanent pentru a stăpâni un anumit domeniu vizual. Adevărata putere a segmentării moderne nu mai constă în colectarea a milioane de pixeli etichetați; este vorba despre a ști când să controlezi un model frozen cu un text prompt inteligent și când să consumi compute pentru a-i modifica visual weights. Asta e tot pentru acest episod. Mulțumesc că ai ascultat și continuă să construiești!
14
Alchimia pixelilor: Alpha Blending și Color Spaces
4m 03s
O privire asupra laturii matematice a fotografiei computaționale. Înțelege canalele alpha, ecuațiile de image blending și de ce spațiul de culoare HSV este superior RGB-ului pentru logica de computer vision.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 14 din 20. Deși noi, oamenii, ne gândim la culoare ca la un amestec de roșu, verde și albastru, să încerci să programezi un calculator să facă tracking pe un obiect folosind RGB este un coșmar în momentul în care un nor acoperă soarele. Soluția stă în modul în care reprezentăm și combinăm matematic pixelii. Astăzi, vorbim despre Pixel Alchemy: Alpha Blending și Color Spaces.
Problema principală cu color space-ul RGB este că leagă informația de culoare direct de luminanță. Dacă o umbră cade peste un obiect verde aprins, valorile pixelilor săi de roșu, verde și albastru se schimbă semnificativ. Pentru un algoritm standard de thresholding, un obiect verde aflat în umbră arată complet diferit față de unul iluminat. Ca să rezolvi asta, transformi imaginea din RGB în color space-ul HSV. HSV vine de la Hue, Saturation și Value. Hue reprezintă culoarea de bază în sine, ca un unghi pe un cilindru de culoare. Saturation reprezintă intensitatea acelei culori, iar Value reprezintă luminozitatea. Izolând informația pură de culoare în acel singur canal Hue, pipeline-ul tău de computer vision devine extrem de rezistent la schimbările de lumină. Îți poți configura logica să caute o nuanță specifică de verde, și o va găsi indiferent dacă încăperea este puternic luminată sau întunecată.
Această robustețe este esențială atunci când construiești ceva de genul unui sistem automat de green-screen pentru un broadcast. Vrei să faci un blend perfect cu o hartă meteo dinamică în spatele unui prezentator de știri. Mai întâi, iei feed-ul camerei și îl convertești în HSV. Apoi definești un range de nuanțe de verde care corespund fundalului fizic. Pentru fiecare pixel care pică în acel range de Hue verde, dai output zero. Pentru orice altceva, cum ar fi prezentatorul, dai output unu. Asta creează o mască binară. Această mască acționează ca alpha channel-ul tău.
Iată ideea cheie. Ascultătorii vorbesc adesea despre alpha ca și cum ar fi o culoare, aproape ca o vopsea transparentă. Nu este. Alpha este pur și simplu o pondere numerică, o valoare scalară între zero și unu care dictează opacitatea într-o ecuație de interpolare liniară. Image blending-ul este pur și simplu aritmetică pixel cu pixel. Ca să combini prezentatorul din foreground cu harta meteo din background, folosești o ecuație specifică. Pentru fiecare pixel, culoarea finală de output este egală cu pixelul din foreground înmulțit cu valoarea alpha, plus pixelul din background înmulțit cu unu minus valoarea alpha.
Gândește-te la matematica din acel scenariu de green-screen. Acolo unde stă prezentatorul, alpha este unu. Pixelul din foreground este înmulțit cu unu, păstrând prezentatorul perfect. Pixelul hărții meteo din background este înmulțit cu unu minus unu, adică zero. Harta meteo dispare exact în acel loc. În schimb, acolo unde se află green-screen-ul, alpha este zero. Pixelul verde din foreground se înmulțește cu zero, ștergând complet ecranul fizic. Pixelul hărții meteo din background se înmulțește cu unu minus zero, adică unu, făcând harta meteo complet vizibilă. Dacă vrei o margine fină, anti-aliased, în jurul prezentatorului, folosești valori alpha fracționare, cum ar fi zero virgulă cinci, de-a lungul conturului. Asta face media între pixelii din foreground și cei din background pentru a evita contururile dure și zimțate.
Cel mai util lucru de reținut este că imaginile din memorie sunt doar matrici, iar manipularea pixelilor este doar aritmetică de matrici; alegerea sistemului de coordonate corect, cum ar fi HSV, face ca acea aritmetică să fie robustă și predictibilă, în loc de fragilă. Mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
15
Calibrarea camerei: Navigarea prin Lens Distortion
4m 41s
Toate lentilele fizice ale camerelor distorsionează realitatea. Învață cum să calculezi matricele intrinseci ale camerei și coeficienții de radial distortion pentru a „îndrepta” matematic lumea, obținând o robotică precisă.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 15 din 20. Fiecare fotografie pe care ai făcut-o vreodată este o minciună subtilă, deformată de sticla curbată a obiectivului. În robotică, acea ușoară deformare este diferența dintre a prinde o minge și a o rata complet. Rezolvarea acestui decalaj necesită Camera Calibration: navigarea prin distorsiunea obiectivului.
Montezi un webcam fisheye ieftin, cu distorsiuni mari, pe un braț robotic. Sistemul trebuie să calculeze distanța exactă la milimetru pentru a prinde în siguranță o cană de cafea fragilă. Dacă procesezi direct video feed-ul raw, geometria ta este complet greșită. Obiectivul curbează lumina care intră, ceea ce înseamnă că un pixel din apropierea marginii frame-ului reprezintă o distanță în lumea reală complet diferită față de un pixel aflat exact în centru. Dacă robotul are încredere în acei pixeli raw, va zdrobi cana.
Trebuie să corectăm două tipuri principale de distorsiune a obiectivului. Prima este distorsiunea radială. Lumina se curbează mai mult la marginile unui obiectiv decât în centrul acestuia. Asta face ca liniile drepte să pară curbate, adesea bombate spre exterior ca un butoi sau strânse spre interior. A doua este distorsiunea tangențială. Aceasta apare în timpul procesului de fabricație, atunci când obiectivul nu este montat perfect paralel cu senzorul de imagine, făcând ca unele zone ale imaginii să pară mai apropiate decât altele.
Pentru a repara asta, avem nevoie de un punct de referință geometric cunoscut. Standardul în industrie este un simplu pattern de tip checkerboard plat, printat pe o placă rigidă. Un checkerboard oferă linii care se intersectează clar, cu contrast ridicat, făcând extrem de ușor pentru un algoritm de detecție să identifice exact colțurile interioare. Mai important, pentru că l-am printat, cunoaștem dimensiunile fizice exacte ale pătratelor.
Developerii confundă frecvent parametrii intrinseci și extrinseci atunci când lucrează cu datele de calibrare. Este ușor să îi bagi în aceeași oală ca fiind doar setări ale camerei. Iată ideea de bază. Parametrii extrinseci nu descriu deloc hardware-ul camerei. Ei definesc locația fizică și rotația camerei în lumea 3D în raport cu scena. Parametrii intrinseci, pe de altă parte, definesc proprietățile fizice interne ale obiectivului și senzorului. Ei încapsulează distanța focală și centrul optic. Matricea intrinsecă este unică pentru acea cameră fizică specifică și rămâne constantă indiferent unde se mișcă brațul robotic.
Procesul de calibrare funcționează prin maparea unor puncte 3D cunoscute la pixelii 2D observați. Mai întâi, faci o duzină sau mai multe poze cu acel checkerboard din diferite unghiuri și distanțe folosind webcam-ul tău. Apoi, rulezi o funcție de corner detection peste acele imagini. Construiești o listă cu locurile în care aceste coordonate de pixeli 2D pică în imagini și le asociezi cu un array de coordonate 3D din lumea reală ale acelorași colțuri. Coordonatele 3D sunt doar un grid plat bazat pe dimensiunea cunoscută a pătratului, cu axa Z setată la zero.
Pasezi ambele seturi de coordonate în funcția de camera calibration. Algoritmul calculează transformarea matematică necesară pentru a mapa punctele 3D pe imaginile tale 2D. Acesta returnează matricea intrinsecă a camerei, vectorii extrinseci de rotație și translație pentru fiecare imagine și un set de coeficienți de distorsiune. Acești coeficienți gestionează atât deformarea radială, cât și pe cea tangențială.
Odată ce ai acești coeficienți și matricea intrinsecă, îi pasezi într-o funcție de undistortion. Fiecare frame nou pe care îl vede robotul tău este întins matematic și tras înapoi într-o proiecție rectilinie reală. Liniile drepte devin din nou drepte. Brațul tău robotic poate acum să măsoare milimetri exacți, să se întindă și să apuce cana în siguranță.
Matricea intrinsecă este stratul fundamental al geometriei de computer vision, transformând un array deformat de pixeli într-un sistem de coordonate matematic de încredere. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
16
Stereo Vision: Găsirea profunzimii cu două camere
3m 55s
Comparând micile decalaje vizuale dintre două lentile de cameră, putem calcula distanțe fizice exacte. Acest episod acoperă epipolar geometry și disparity maps.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 16 din 20. Împrumutând exact trucul biologic pe care îl folosesc cei doi ochi umani pentru a percepe spațiul tridimensional, un computer poate calcula instantaneu distanța până la un obiect folosind doar geometrie de bază. Aceasta este Stereo Vision: Finding Depth with Two Cameras.
O singură cameră de bord înregistrează o proiecție bidimensională plată a lumii. Pierde complet informațiile de adâncime. Fără context, nu poate spune cu siguranță dacă mașina din față este mică și aproape, sau mare și departe. Pentru a construi un Advanced Driver Assistance System, sau ADAS, care poate preveni efectiv o coliziune cu o mașină care frânează, ai nevoie de distanța fizică reală. Poți obține asta montând două camere de bord perfect aliniate. Distanța fizică dintre lentilele lor se numește baseline.
Pentru a găsi distanța până la mașina din față, sistemul trebuie să găsească exact același punct de pe acea mașină atât în imaginea camerei din stânga, cât și în imaginea camerei din dreapta. Să cauți în toată imaginea din dreapta un punct din imaginea din stânga este mult prea lent pentru condusul în real time. Aici intervine geometria epipolară. Prin transformarea matematică, sau rectificarea celor două imagini, astfel încât lentilele lor să fie virtual aliniate pe exact același plan, simplifici căutarea. Un anumit stop găsit pe rândul două sute în imaginea din stânga va exista acum doar pe rândul două sute în imaginea din dreapta. Această cale orizontală de căutare se numește linie epipolară. Sistemul trebuie doar să scaneze la stânga și la dreapta de-a lungul unui singur rând.
Când sistemul găsește pixelul corespondent pe acea linie, măsoară diferența dintre pozițiile lor orizontale. Această diferență se numește disparity. Oamenii confundă adesea conceptul de disparity cu adâncimea, dar ele sunt invers proporționale. Obiectele care își schimbă drastic poziția între cele două view-uri ale camerelor sunt fizic mai aproape de lentile. Dacă mașina din față care frânează sare cu patruzeci de pixeli între view-ul din stânga și cel din dreapta, este foarte aproape. Dacă un munte de la orizont se deplasează cu un singur pixel, este departe. Disparity mare înseamnă adâncime mică.
Aici e ideea cheie. Nu vrei doar distanța până la un singur stop. Vrei un disparity map dens, adică o valoare de adâncime pentru aproape fiecare pixel din cadru. OpenCV gestionează asta folosind block matching, mai exact un algoritm numit Semi Global Block Matching. În loc să încerce să facă match pe un singur pixel ambiguu, ia un mic block de pixeli din imaginea din stânga. Apoi glisează acel block de-a lungul liniei epipolare orizontale în imaginea din dreapta, comparând intensitățile pixelilor până când găsește cel mai bun match matematic. Face asta pe întreaga imagine, aplicând penalizări pentru salturi bruște de disparity, pentru a menține harta rezultată smooth și realistă din punct de vedere fizic.
Odată ce ai disparity map-ul, convertirea lui în adâncime din lumea reală este un singur calcul. Înmulțești distanța focală a camerelor cu distanța fizică baseline dintre ele, și împarți rezultatul la valoarea de disparity a pixelului. Matematica este absolută. Nu ghicești pe baza umbrelor sau a dimensiunii obiectului. Atâta timp cât camerele tale rămân rigid calibrate și aliniate, acest calcul geometric îți oferă distanța precisă până la vehiculul din față în milisecunde.
Frumusețea unui stereo rig calibrat este că elimină nevoia de a identifica ce este un obiect înainte de a ști unde se află. Asta e tot pentru acest episod. Mulțumesc pentru ascultare și continuă să construiești!
17
Deep Monocular Metric Depth
3m 45s
Explorăm modul în care rețelele neuronale profunde moderne au învățat să deducă o profunzime metrică 3D extrem de precisă din imagini 2D complet plate, cu o singură lentilă, încălcând regula tradițională a stereo vision.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 17 din 20. Timp de decenii, inginerii de computer vision au crezut că ai nevoie de două camere pentru a calcula distanța reală. Aveai nevoie de vedere stereoscopică pentru a triangula puncte în spațiu. Astăzi, modelele de AI pot percepe distanța fizică dintr-o singură imagine plană, interpretând umbrele, textura și scara, exact așa cum o face un pictor. Această descoperire se numește Deep Monocular Metric Depth.
Oamenii confundă adesea relative depth cu metric depth. Relative depth înseamnă pur și simplu să știi că o canapea este în fața unui perete. Este o sortare a straturilor vizuale. Metric depth înseamnă să știi că acea canapea se află la exact doi virgulă patru metri distanță de obiectivul camerei. Până de curând, extragerea măsurătorilor metrice absolute dintr-o singură imagine era considerată matematic imposibilă. O singură imagine 2D își pierde toată scara inerentă. Un obiect ar putea fi mic și aproape de lentilă, sau masiv și foarte departe.
Modelele de deep learning ocolesc complet problema clasică de geometrie. În loc să trianguleze puncte între două lentile, rețelele precum DepthPro învață din dataset-uri masive care conțin milioane de imagini asociate cu 3D depth maps de tip ground-truth. Când introduci o singură imagine standard în rețea, aceasta nu caută stereo disparities. Evaluează monocular cues. Analizează gradienții de textură, observând unde suprafețele par mai netede cu cât sunt mai departe. Procesează iluminarea contextuală, ocluzia și scara fizică cunoscută a obiectelor recognoscibile. Modelul construiește apoi o predicție densă, pixel cu pixel, a distanței absolute.
Iată ideea cheie. Arhitecturile moderne realizează asta fără să îți cunoască camera intrinsics. Nu trebuie să oferi rețelei focal length-ul, field of view-ul sau dimensiunea senzorului camerei care a făcut poza. Rețeaua deduce focal length-ul direct din conținutul vizual al imaginii în sine. Asta creează o soluție zero-shot. Îi oferi modelului o poză făcută cu orice lentilă random, necalibrată, iar el generează un absolute depth map precis.
Gândește-te la o aplicație de augmented reality pe un smartphone standard. Un utilizator vrea să vadă dacă o masă nouă de dining încape în casa lui. Stă într-o cameră goală și își îndreaptă singura cameră de pe spate spre podea. AR-ul clasic îți cere să miști telefonul de colo-colo pentru a genera parallax și a construi încet un spatial map. Cu deep monocular metric depth, aplicația procesează instantaneu un singur frame static. Rețeaua neuronală calculează volumul și dimensiunile exacte ale spațiului de pe podea în milisecunde. Aplicația randează apoi o masă virtuală în camera feed, perfect scalată la lumea reală, plantată pe podea la adâncimea exactă.
Under the hood, ca să obții asta ai nevoie de receptive fields masive în arhitectura rețelei neuronale. Modelul folosește Vision Transformers pentru a capta contextul global. Se uită la întreaga imagine dintr-o dată pentru a înțelege geometria generală a camerei. Apoi combină această vedere de ansamblu cu o procesare locală high-resolution. Această abordare duală îi permite modelului să producă depth boundaries clare în jurul marginilor complexe, cum ar fi picioarele subțiri ale unui scaun sau frunzele unei plante de apartament. Evită complet artefactele de tip blurry și bleeding edge care afectau modelele anterioare de depth estimation.
Schimbarea fundamentală este capacitatea de a extrage măsurători spațiale absolute dintr-un singur image frame, complet necalibrat. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și keep building!
18
AI on the Edge: Implementarea pe microcontrollere
5m 15s
Modelele nu rulează întotdeauna pe GPU-uri masive în cloud. Învață cum quantization, conversia INT8 și architecture pruning permit modelelor complexe de viziune să ruleze pe microcontrollere IoT cu consum redus de energie.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 18 din 20. Cele mai impresionante deploy-uri de AI de astăzi nu rulează în ferme masive de servere, cu aer condiționat. Rulează pe cipuri de siliciu de doi dolari, alimentate de o baterie de ceas, în mijlocul pustietății. Mutarea rețelelor neuronale complexe pe aceste dispozitive minuscule necesită o abordare complet diferită, ceea ce ne aduce la AI on the Edge: Deploy pe microcontrolere.
Microcontrolerele sunt incredibil de limitate. Vorbim despre dispozitive cu kilobytes de RAM, câțiva megabytes de flash storage și limite stricte de consum de energie. Modelele standard de computer vision folosesc numere floating-point pe 32 de biți pentru weights și activations. Un model tipic are nevoie de sute de megabytes doar pentru a se încărca în memorie. Dacă încerci să rulezi asta pe un microcontroler de bază, va da crash imediat din lipsă de memorie.
Gândește-te la o cameră wildlife alimentată de baterii, reîncărcată cu energie solară, amplasată adânc într-o pădure. Sarcina sa este de a identifica un leopard de zăpadă pe cale de dispariție. Dacă camera își trezește emițătorul radio pentru a trimite fiecare poză declanșată de mișcare către un cloud server pentru analiză, bateria se va descărca într-o zi. Dispozitivul trebuie să ruleze object detector-ul local. Trebuie să proceseze video feed-ul direct pe siliciu și să trezească emițătorul mare consumator de energie pentru a trimite o alertă doar atunci când identifică în mod specific leopardul.
Pentru a face un vision model să încapă pe un cip atât de mic, trebuie să îl micșorezi agresiv. Faci asta în principal prin două tehnici: pruning și quantization. Pruning-ul este exact ceea ce pare. Analizezi rețeaua neuronală antrenată și elimini conexiunile care au cel mai mic impact asupra predicției finale. Practic, tai uscăturile din arhitectura rețelei, astfel încât să aibă loc mai puține calcule per frame.
A doua tehnică, quantization-ul, este locul unde are loc reducerea reală a dimensiunii. Aceasta este partea care contează. Quantization-ul reduce precizia numerică a modelului. În loc să stochezi fiecare weight ca un float pe 32 de biți, mapezi acele valori la un integer pe 8 biți, proces denumit în mod obișnuit conversie INT8. Trade-off-ul principal aici este simplu. Renunți intenționat la precizia numerică. Pentru a face asta corect, rulezi un dataset de calibrare prin model pentru a urmări valorile minime și maxime ale weights-urilor. Apoi scalezi acel range floating-point pentru a se încadra exact în cele 256 de valori posibile ale unui integer pe 8 biți. Asta sacrifică o mică fracțiune din acuratețea modelului pentru o reducere masivă a memory footprint-ului și a timpului de execuție.
Un model INT8 ocupă exact un sfert din spațiul de stocare al unui model pe 32 de biți. În plus, microcontrolerele gestionează operațiunile cu integeri mult mai rapid și cu un consum de energie semnificativ mai mic decât operațiunile floating-point. Multe microcontrolere cu consum redus de energie nu au deloc hardware dedicat pentru operațiunile floating-point. Asta înseamnă că operațiunile floating-point trebuie emulate în software, ceea ce este incredibil de lent și consumă bateria. Cu un model INT8 quantizat agresiv, atunci când camera wildlife captează o imagine, rețeaua neuronală înmulțește și adună valori integer mici în cicluri de ceas hardware individuale. Microcontrolerul poate evalua imaginea în milisecunde, poate confirma că nu există niciun leopard de zăpadă și poate reveni instantaneu într-o stare de deep sleep pentru a economisi energie.
Procesul de deploy propriu-zis începe pe un computer desktop obișnuit. Îți antrenezi modelul pe un dataset standard. Odată antrenat, rulezi un script de conversie care aplică pruning-ul și quantization-ul INT8. Output-ul este de obicei un flat byte array exportat ca un bloc de cod de C header care conține weights-urile comprimate. Compilezi asta direct în firmware-ul microcontrolerului tău, împreună cu driverele camerei. Nu există un sistem de operare și niciun sistem de fișiere din care să încarci modelele la runtime. Este logică compilată pură care se execută direct pe bare metal.
Constrângerea supremă din acest mediu schimbă modul în care evaluezi succesul. Pe un microcontroler, metrica ta principală nu mai este precizia maximă, ci numărul de inferences precise pe care le poți executa per milijoule de energie a bateriei. Dacă vrei să ajuți la continuarea emisiunii, ne poți sprijini căutând DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Mulțumesc că ai ascultat și continuă să construiești!
19
Radiance Fields: 3D Gaussian Splatting
3m 56s
Grafica 3D tradițională folosește wireframes, dar CV-ul modern folosește radiance fields. Analizăm tehnologia de ultimă oră 3D Gaussian Splatting pentru reconstrucția fotorealistă a mediului.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Computer Vision Deep Dive, episodul 19 din 20. Jocurile video tradiționale randează lumi desenând milioane de triunghiuri minuscule și plate. Cea mai nouă revoluție din computer vision elimină complet triunghiurile, randând realitatea ca un cloud dens de milioane de blob-uri matematice strălucitoare, care se suprapun. Asta înseamnă Radiance Fields: 3D Gaussian Splatting.
Un agent imobiliar se plimbă printr-o casă și înregistrează un video standard cu smartphone-ul. Tu trebuie să procesezi acel raw footage într-un tur virtual 3D complet navigabil, fotorealist, cu reflexii și iluminare dinamică. Timp de câțiva ani, abordarea standard a fost Neural Radiance Fields, sau NeRFs. Un NeRF mapează spațiul folosind un implicit neural network. Pentru a genera o imagine, trage o rază matematică prin scenă și face un query pe neural network în sute de puncte de-a lungul acelei raze, ca să întrebe ce culoare și densitate există acolo. Produce rezultate superbe, dar să faci query pe un deep neural network pentru milioane de pixeli este extrem de lent.
3D Gaussian Splatting abandonează acel implicit neural network. În schimb, folosește o structură explicită, asemănătoare unui point cloud. Pipeline-ul începe cu un algoritm standard de structure-from-motion care analizează clipul de pe smartphone pentru a face track la poziția camerei și a construi un 3D point cloud sparse al casei. Algoritmul înlocuiește apoi fiecare punct din acel cloud cu un 3D Gaussian. Poți să te gândești la un 3D Gaussian ca la un elipsoid semitransparent și colorat.
Fiecare Gaussian conține un set specific de parametri. Are o coordonată centrală în spațiul 3D. Are o covariance matrix, care îi dictează scale-ul și rotația, întinzându-l într-un disc plat sau într-un trabuc lung, în funcție de geometria pe care o reprezintă. Are o valoare de opacitate. În cele din urmă, stochează date de culoare folosind Spherical Harmonics. Aici e ideea cheie. Spherical Harmonics sunt funcții matematice care encodează culoarea direcțional. Când te uiți la Gaussian dintr-un unghi, ar putea reflecta o fereastră luminoasă. Dintr-un alt unghi, arată textura întunecată a unei podele. Asta este ceea ce îi dă turului virtual final acea iluminare fotorealistă, view-dependent.
Point cloud-ul inițial este dezordonat, așa că sistemul intră într-un optimization loop. Proiectează, sau face splat, la acești 3D Gaussians pe un camera view 2D ca să randeze o imagine. Scade această imagine randată din fotografia reală făcută de agentul imobiliar pentru a calcula eroarea. Algoritmul folosește apoi acea eroare pentru a face update la parametrii acelor Gaussians.
În timpul acestei optimizări, sistemul gestionează activ populația de Gaussians. Dacă un blob devine prea mare și face overlap pe prea multe detalii, algoritmul îi dă split în bucăți mai mici. Dacă o zonă cu texturi complexe are nevoie de mai multă rezoluție, algoritmul clonează Gaussians existenți pentru a crește densitatea. Dacă un blob devine complet transparent sau irelevant, sistemul îl șterge.
Pentru că scena finală este compusă în întregime din data points explicite, randarea ei este excepțional de rapidă. Hardware-ul grafic doar sortează elipsoidele din spate în față și le face blend la culori pentru a forma imaginea finală. Breakthrough-ul adus de 3D Gaussian Splatting este că demonstrează cum un cloud haotic de blob-uri matematice explicite poate capta lumină și geometrie complexă mult mai rapid decât un neural network dens.
Mersi că m-ați ascultat. Aveți grijă de voi, tuturor.
20
Bucla Vision-Action: Agentic AI
3m 56s
În finalul seriei noastre, privim către destinația supremă a computer vision: Agentic AI. Învață cum percepția vizuală este integrată cu modelele de acțiune pentru a crea lucrători digitali autonomi.
Salut, sunt Alex de la DEV STORIES DOT EU. OpenCV: Un deep dive în computer vision, episodul 20 din 20. Timp de decenii, algoritmii de computer vision au fost complet pasivi. Puteau desena un bounding box în jurul unei cești pe o masă, dar asta era tot. Astăzi, sistemul nu doar că vede ceașca – folosește acele date vizuale pentru a întinde mâna și a o apuca. Puntea dintre a vedea și a acționa este acel Vision-Action Loop, condus de Agentic AI.
Înainte să intrăm în detalii, trebuie să tragem o linie clară între două tehnologii care sună similar, dar fac lucruri complet diferite. Un Vision-Language Model standard, sau VLM, este descriptiv. Îi dai un screenshot, iar el îți dă ca output un text care îți spune ce este pe ecran. Un model Vision-Language-Action, sau VLA, este executiv. Îi dai unui VLA un screenshot și un obiectiv, iar el generează comenzi executabile. Nu doar că descrie acel user interface; interacționează activ cu el.
Agentic AI transformă un vision pipeline într-un organ senzorial pentru un motor de decizie. Acesta operează într-un ciclu continuu de percepție, raționament și acțiune. Mai întâi, sistemul preia o observație vizuală a mediului său curent. Asta ar putea fi un camera feed de la un robot sau o captură în timp real a unui desktop. Apoi, agentul procesează această stare vizuală împreună cu un prompt sau un obiectiv specific. Analizează relațiile spațiale, citește textul și identifică elementele interactive. Când modelul identifică un element, mapează înțelegerea semantică – știind că un anumit dreptunghi verde este un buton de submit – la un spațiu de coordonate geometrice. În cele din urmă, în loc să returneze o descriere, modelul generează un action payload. Adesea, aceasta este o comandă structurată care conține coordonatele exacte de pe ecran, o ajustare a unui motor hardware sau un API call. Odată ce acțiunea este executată, mediul se schimbă. Agentul preia o nouă observație vizuală, verifică dacă acțiunea anterioară a avut succes și calculează următorul pas.
Iată ideea cheie. Datele vizuale nu mai sunt un punct mort; ele reprezintă mecanismul de grounding pentru utilizarea autonomă a tool-urilor. Hai să trecem printr-un scenariu concret cu un asistent digital automatizat de contabilitate. Scopul este să autorizeze o plată. Agentul începe prin a captura ecranul. Modelul de vision procesează o factură PDF scanată, extrăgând numele furnizorului și suma totală. Motorul de reasoning știe că trebuie să logheze aceste date. Generează o acțiune pentru a muta mouse-ul pe iconița softului de contabilitate din taskbar și a da click pe ea. Ecranul se actualizează. Agentul preia o altă observație vizuală pentru a verifica dacă aplicația este deschisă. Scanează noua interfață, localizează câmpul de autorizare a plății, mapează locația vizuală la coordonatele ecranului, tastează suma și dă click pe butonul de submit. Acel vision pipeline trimite constant state updates înapoi către agent, astfel încât acesta să știe exact când să execute următoarea acțiune și, mai important, când să se oprească.
Computer vision a evoluat de la un tool de analiză independent, la stratul senzorial pentru sisteme autonome. Dacă pipeline-ul tău analizează doar o imagine și se oprește, folosești doar jumătate din tehnologie. Deoarece acesta este ultimul nostru episod, te încurajez să explorezi documentația oficială pentru modelele VLA, să încerci să construiești un feedback loop de bază hands-on, sau să vizitezi devstories dot eu pentru a sugera subiecte pentru următoarea noastră serie. Asta e tot pentru acest episod. Mersi că ai ascultat și continuă să construiești!
Tap to start playing
Browsers block autoplay
Share this episode
Episode
—
Copy this episode in another language:
Acest site nu folosește cookie-uri. Furnizorul nostru de hosting ar putea înregistra adresa ta IP în scopuri de analiză. Află mai multe.