What is object detection using Haar feature-based Cascade classifiers?

Detectia Obiectelor cu Haar Cascades: Ghid Complet

17/01/2022

Rating: 4.84 (14661 votes)

În lumea în continuă evoluție a viziunii computerizate, detectia obiectelor reprezintă o piatră de temelie, permitând sistemelor să identifice și să localizeze entități specifice în imagini sau fluxuri video. O metodă clasică, dar încă relevantă și eficientă pentru anumite aplicații, este detectia obiectelor utilizând clasificatori în cascadă bazați pe caracteristici Haar. Această abordare, popularizată de Paul Viola și Michael Jones, a revoluționat domeniul prin combinarea eficienței cu o acuratețe remarcabilă pentru acea vreme. Acest articol își propune să demistifice procesul de antrenare a unui clasificator Haar personalizat, ghidându-vă pas cu pas prin etapele necesare, de la pregătirea datelor până la implementarea modelului final. Indiferent dacă sunteți un entuziast al viziunii computerizate sau un dezvoltator care caută o soluție robustă pentru detectia obiectelor, acest ghid vă va oferi cunoștințele practice necesare pentru a vă antrena propriul model Haar Cascade.

How do I train a Haar classifier?
Testing included creating a sample haar cascade from hundreds of images of boxes. After cloning the repository you can get started training the classifier. Comprehensive tutorials are available for this process. Ensure your image format is .bmp for the extracted positive images, and ensure you extract the files to \training\positve\rawdata

Metoda clasificatorilor în cascadă bazați pe caracteristici Haar este o abordare de învățare automată unde o funcție cascadă este antrenată dintr-un număr mare de imagini pozitive (care conțin obiectul de interes) și imagini negative (care nu conțin obiectul). Modelul antrenat este apoi utilizat pentru a detecta obiecte în imagini noi, neetichetate. Este o tehnică robustă, recunoscută pentru viteza sa de execuție, fiind adesea folosită pentru detectia fețelor în timp real. Prin înțelegerea și aplicarea pașilor de antrenament detaliați mai jos, veți putea construi propriul detector pentru orice obiect specific.

Cuprins

Ce Sunt Caracteristicile Haar și Clasificatoarele în Cascadă?

Înainte de a ne scufunda în procesul de antrenare, este esențial să înțelegem conceptele fundamentale. Caracteristicile Haar, inspirate de undele Haar, sunt modele simple de pixeli care detectează diferențe de contrast în imagine. De exemplu, o caracteristică poate identifica o regiune luminoasă adiacentă unei regiuni întunecate, utilă pentru a detecta margini sau linii. Aceste caracteristici sunt calculate rapid pe o imagine integrală, ceea ce contribuie la eficiența algoritmului.

Un clasificator în cascadă este o serie de clasificatori mai simpli (numiți „clasificatori slabi”) aranjați secvențial. Fiecare clasificator dintr-o etapă ulterioară este mai complex decât cel anterior. Dacă o regiune a imaginii trece de prima etapă (adică este considerată a fi un potențial obiect), ea este trimisă la etapa următoare. Dacă eșuează la orice etapă, este imediat respinsă ca non-obiect. Această structură de cascadă permite algoritmului să filtreze rapid majoritatea regiunilor non-obiect, concentrându-se doar pe cele mai promițătoare, ceea ce duce la o detectie extrem de rapidă.

Pregătirea Mediului de Antrenament

Pentru a antrena un clasificator Haar personalizat, veți avea nevoie de câteva instrumente specifice, în special executabilele de antrenament de la OpenCV. Versiunile mai recente de OpenCV nu mai includ aceste executabile, așa că este necesară o versiune 3.x. Recomandăm OpenCV 3.4.3 sau o versiune stabilă similară.

Descărcarea Executabilelor OpenCV:

  1. Descărcați o versiune stabilă de OpenCV 3.x (de exemplu, 3.4.3) de pe site-ul oficial OpenCV sau de pe arhivele lor.
  2. Extrageți arhiva ZIP într-o locație accesibilă pe sistemul dumneavoastră Windows.
  3. Notați calea către folderul bin, care conține executabilele precum opencv_annotation, opencv_createsamples și opencv_traincascade. De exemplu: C:\Users\UtilizatorulMeu\objectDetection\opencv\build\x64\vc15\bin\. Vom denumi această cale generic [CaleaOpenCV] în continuare.

Structura Directorului de Proiect:

Pentru o organizare eficientă, creați o structură de directoare similară cu aceasta în directorul principal al proiectului dumneavoastră:

Base Directory
--positive
--negative
--cascade

Folderul positive va conține imagini cu obiectul de detectat, în timp ce negative va conține imagini fără obiect (doar fundal). Folderul cascade va fi folosit pentru a stoca modelul antrenat.

Generarea Datelor de Antrenament

Acesta este un pas crucial, deoarece calitatea și cantitatea datelor de antrenament influențează direct performanța modelului final. Avem nevoie de două tipuri de imagini: pozitive și negative.

1. Colectarea Imaginilor

Imagini Pozitive: Acestea sunt imagini care conțin obiectul pe care doriți să-l detectați. Colectați cât mai multe imagini posibile ale obiectului, din diverse unghiuri, iluminări, și contexte. Asigurați-vă că obiectul este clar vizibil în fiecare imagine. De exemplu, dacă antrenați un detector de calcar, veți avea nevoie de sute, chiar mii de imagini cu fragmente de calcar.

Imagini Negative: Acestea sunt imagini care NU conțin obiectul de interes. Ele ar trebui să reprezinte fundaluri tipice în care obiectul ar putea apărea, dar fără obiect. Este recomandat să includeți imagini ale mediului în care veți folosi clasificatorul Haar, dar fără obiect în cadru. Imaginile negative ar trebui să fie monocrome (alb-negru) și salvate, de preferință, în format .jpg.

2. Adnotarea Datelor Pozitive

Adnotarea înseamnă a desena cutii de delimitare (bounding boxes) în jurul fiecărei instanțe a obiectului în imaginile pozitive. Acest proces învață modelul exact unde se află obiectul în fiecare imagine. Vom folosi instrumentul opencv_annotation sau Objectmarker (dacă folosiți un pachet predefinit pentru antrenament Haar).

Utilizând opencv_annotation:

Rulați următoarea comandă în promptul de comandă sau Anaconda Prompt (asigurați-vă că sunteți în directorul principal al proiectului):

[CaleaOpenCV]\opencv_annotation.exe --annotations=pos.txt --images=positive/

Această comandă va deschide o interfață grafică unde veți putea desena cutii de delimitare pe fiecare imagine din folderul positive. Pentru fiecare obiect, faceți clic pe colțul din stânga sus, trageți mouse-ul până la colțul din dreapta jos al obiectului și eliberați. Repetați pentru toate obiectele din imagine. Apăsați SPACE pentru a confirma selecția și ENTER pentru a trece la imaginea următoare. Dacă nu sunteți mulțumit cu o selecție, apăsați orice altă tastă pentru a anula și a reîncerca.

What are positive and negative images in a cascade classifier?
For better understanding, take face detection as an example. Positive images are the images with faces negative images are the images that don’t have faces in it. Cascade Trainer GUI is a program which simplifies the training process of the cascade classifiers.

După ce toate imaginile sunt adnotate, un fișier numit pos.txt va fi generat în directorul rădăcină al proiectului. Formatul acestui fișier este crucial:

LocatieImagine|NumarObiecte|x_min1|y_min1|latime1|inaltime1|x_min2|y_min2|latime2|inaltime2|...

De exemplu:

positive/1.jpeg|2|2.3|5.6|10|10|30.2|67.3|13|14
positive/18.jpeg|1|2.3|5.6|10|10

Verificați acest fișier pentru a vă asigura că nu există erori și că numărul de coordonate (4n) corespunde numărului de obiecte (n) declarat.

3. Generarea Fișierului cu Imagini Negative

Pentru imaginile negative, trebuie doar să creăm un fișier text care listează calea către fiecare imagine negativă. Rulați următorul script Python în directorul principal al proiectului:

import os

def generate_negative_description_file():
with open('neg.txt', 'w') as f:
for filename in os.listdir('negative'):
f.write('negative/' + filename + '\n')

generate_negative_description_file()

Acest script va crea un fișier neg.txt care conține o listă a tuturor imaginilor din directorul negative, câte una pe linie.

Crearea Eșantioanelor de Antrenament

Odată ce pos.txt și neg.txt sunt gata, putem genera eșantioanele pozitive vectoriale necesare procesului de boosting. Acestea sunt imagini mici, scalate, ale obiectului de interes, utilizate pentru a defini ce ar trebui să caute modelul.

Crearea Eșantioanelor Pozitive (pos.vec):

Utilizați opencv_createsamples pentru a genera fișierul pos.vec. Asigurați-vă că ați creat deja folderul cascade în directorul principal.

[CaleaOpenCV]\opencv_createsamples.exe -info pos.txt -bg neg.txt -vec pos.vec -w 24 -h 24 -num 4300

Explicația parametrilor:

  • -info pos.txt: Specifică fișierul cu informații despre imaginile pozitive adnotate.
  • -bg neg.txt: Specifică fișierul cu lista imaginilor negative.
  • -vec pos.vec: Numele fișierului vectorial de ieșire care va conține eșantioanele pozitive.
  • -w 24: Lățimea eșantioanelor pozitive (în pixeli).
  • -h 24: Înălțimea eșantioanelor pozitive (în pixeli). Aceste valori ar trebui să fie relativ apropiate de raportul de aspect al obiectului dvs. și nu ar trebui să fie foarte mari (inițial sub 80).
  • -num [numar_imagini_pozitive]: Numărul de eșantioane pozitive de generat. Acesta ar trebui să fie cel puțin egal cu numărul de intrări din pos.txt, dar adesea se generează mai multe eșantioane prin distorsiuni minore ale imaginilor existente. Pentru un antrenament eficient, ar trebui să aveți mii de eșantioane.

Acest proces poate dura, în funcție de numărul de imagini și complexitatea lor. La final, veți avea fișierul pos.vec.

Antrenamentul Clasificatorului în Cascadă

Acesta este pasul cel mai intensiv din punct de vedere computațional, unde clasificatorul Haar este efectiv antrenat utilizând eșantioanele pozitive și negative. Vom folosi opencv_traincascade.

Comanda de Antrenament:

[CaleaOpenCV]\opencv_traincascade.exe -data cascade_dir -vec pos.vec -bg neg.txt -numPos 430 -numNeg 450 -w 24 -h 24 -numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -precalcValBufSize 1024 -precalcIdxBufSize 1024 -featureType HAAR -mode ALL -acceptanceRatioBreakValue 1.0e-5

Explicația detaliată a parametrilor (unele valori sunt exemple și trebuie ajustate):

  • -data cascade_dir: Specifică directorul unde vor fi salvate fișierele modelului antrenat (ex: cascade/). Asigurați-vă că acest director este gol înainte de a începe antrenamentul.
  • -vec pos.vec: Calea către fișierul vectorial cu eșantioane pozitive.
  • -bg neg.txt: Calea către fișierul cu lista imaginilor negative.
  • -numPos 430: Numărul de eșantioane pozitive folosite la fiecare etapă de antrenament. Ar trebui să fie mai mic decât numărul total de eșantioane din pos.vec. Un bun punct de plecare este aproximativ 80-90% din numărul total de obiecte adnotate.
  • -numNeg 450: Numărul de eșantioane negative folosite la fiecare etapă. Acest număr poate fi mai mare decât -numPos și ar trebui să fie mai mic decât numărul total de imagini negative disponibile.
  • -w 24: Lățimea eșantioanelor utilizate în antrenament. Trebuie să corespundă cu valorile -w utilizate la opencv_createsamples.
  • -h 24: Înălțimea eșantioanelor utilizate în antrenament. Trebuie să corespundă cu valorile -h utilizate la opencv_createsamples.
  • -numStages 20: Numărul de etape (stagii) în cascadă. Cu cât sunt mai multe etape, cu atât clasificatorul va fi mai precis, dar și timpul de antrenament va crește. O valoare inițială de 10-20 este sugerată.
  • -minHitRate 0.999: Rata minimă de detecție dorită la fiecare etapă. Asigură că aproape toate obiectele pozitive sunt detectate la fiecare etapă.
  • -maxFalseAlarmRate 0.5: Rata maximă de fals-pozitive permisă la fiecare etapă. Această valoare este importantă pentru a filtra rapid non-obiectele.
  • -precalcValBufSize 1024 / -precalcIdxBufSize 1024: Mărimea buffer-ului de memorie (în MB) utilizat pentru precalculări. Valori mai mari pot accelera antrenamentul.
  • -featureType HAAR: Specifică utilizarea caracteristicilor Haar.
  • -mode ALL: Specifică utilizarea tuturor tipurilor de caracteristici Haar.
  • -acceptanceRatioBreakValue 1.0e-5: O valoare de prag care, dacă este atinsă, oprește antrenamentul mai devreme.
  • -nonsym: (Opțional) Adăugați acest argument dacă obiectul dvs. nu este simetric pe orizontală (ex: o mașină).

Antrenamentul poate dura ore sau chiar zile, în funcție de numărul de etape, dimensiunea setului de date și puterea de calcul a sistemului dumneavoastră. Monitorizați progresul în consola de comandă. La final, fișierul cascade.xml va fi generat în folderul cascade_dir (ex: cascade/cascade.xml). Acesta este modelul dumneavoastră final!

Inference: Utilizarea Modelului Antrenat

Odată ce aveți fișierul cascade.xml, puteți încărca modelul și efectua detectia obiectelor în imagini sau video noi. Iată un exemplu de cod Python folosind OpenCV:

import cv2
import os

def load_images_from_folder(folder):
images = []
for filename in os.listdir(folder):
file_path = os.path.join(folder, filename)
img = cv2.imread(file_path)
if img is not None:
images.append(img)
return images

# Calea către fișierul cascade.xml antrenat
finalCascadeFile = 'cascade/cascade.xml'

# Încărcați clasificatorul Haar
cascade_limestone = cv2.CascadeClassifier(finalCascadeFile)

# Încărcați imagini pentru testare (asigurați-vă că aveți un folder 'test' cu imagini)
test_images = load_images_from_folder("test")

if not test_images:
print("Nu s-au găsit imagini în folderul 'test'. Asigurați-vă că folderul există și conține imagini.")
else:
# Asigurați-vă că folderul 'op' există pentru a salva imaginile rezultate
if not os.path.exists('op'):
os.makedirs('op')

print(f"Încărcate {len(test_images)} imagini pentru testare.")

for i, image in enumerate(test_images):
# Convertiți imaginea la gri pentru o detecție mai eficientă (opțional, dar recomandat)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Efectuați detecția obiectelor
# detectMultiScale(imagine, scaleFactor, minNeighbors, minSize, maxSize)
# scaleFactor: cât de mult se reduce imaginea la fiecare scară de imagine
# minNeighbors: câți vecini ar trebui să aibă un dreptunghi candidat pentru a fi reținut
rectangles = cascade_limestone.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

print(f"Imaginea {i+1}: {len(rectangles)} obiecte detectate.")

# Desenați dreptunghiuri în jurul obiectelor detectate
for (x, y, w, h) in rectangles:
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2) # Culoare albastră, grosime 2

# Salvați imaginea cu obiectele detectate
output_path = os.path.join("op", f"newImage_{i}.jpg")
cv2.imwrite(output_path, image)

print("Toate imaginile au fost procesate și salvate în folderul 'op'.")

În acest cod, detectMultiScale este funcția cheie. Ea detectează obiecte de diferite dimensiuni în imaginea de intrare. Parametrii scaleFactor și minNeighbors sunt importanți pentru a ajusta sensibilitatea și precizia detecției. Experimentați cu aceste valori pentru a obține cele mai bune rezultate pentru cazul dumneavoastră specific.

Sfaturi pentru un Antrenament Succes

Antrenarea unui clasificator Haar robust necesită atenție la detalii și, adesea, răbdare. Iată câteva sfaturi pentru a vă maximiza șansele de succes:

  • Cantitatea Contează: Folosiți cât mai multe imagini pozitive și negative posibil. Mii de imagini sunt ideale. Cu cât setul de date este mai diversificat, cu atât modelul va fi mai generalizabil.
  • Varietatea Imaginilor Negative: Asigurați-vă că imaginile negative acoperă o gamă largă de fundaluri și condiții de iluminare. Acest lucru ajută la reducerea numărului de fals-pozitive.
  • Consistența Adnotărilor: Fiți meticulos în adnotarea imaginilor pozitive. Cutiile de delimitare ar trebui să încadreze cât mai precis obiectul.
  • Dimensiunea Eșantioanelor: Valorile -w și -h pentru eșantioane ar trebui să reflecte raportul de aspect mediu al obiectului dvs. Dacă obiectul are forme și dimensiuni foarte variate, ar putea fi necesar să antrenați mai multe clasificatori sau să folosiți o metodă mai avansată.
  • Numărul de Etapă (-numStages): Un număr mai mare de etape crește precizia, dar și timpul de antrenament. Începeți cu un număr moderat și creșteți-l dacă rezultatele nu sunt satisfăcătoare.
  • Monitorizarea Progresului: Urmăriți ieșirea consolei în timpul antrenamentului. Vă va oferi informații despre rata de detecție și rata de fals-pozitive la fiecare etapă.
  • Resurse Hardware: Antrenamentul Haar Cascade poate fi intensiv din punct de vedere computațional. Asigurați-vă că aveți suficientă memorie RAM și un procesor puternic.

Beneficii și Limitări ale Clasificatorilor Haar

Deși au apărut metode mai moderne de detectie a obiectelor (cum ar fi rețelele neuronale convoluționale), clasificatorii Haar Cascade rămân relevanți datorită anumitor avantaje:

Beneficii:

  • Viteză: Odată antrenați, clasificatorii Haar sunt extrem de rapizi în timpul inferenței, făcându-i potriviți pentru aplicații în timp real pe hardware cu resurse limitate.
  • Simplicitate: Procesul de antrenament este relativ simplu de înțeles și implementat, nefiind nevoie de cunoștințe aprofundate de învățare profundă.
  • Eficiență Computațională: Necesită mai puține resurse computaționale pentru antrenament și inferență comparativ cu modelele bazate pe rețele neuronale profunde.

Limitări:

  • Sensibilitate la Iluminare și Unghi: Performanța poate scădea semnificativ în condiții de iluminare variate sau dacă obiectul este prezent sub unghiuri neîntâlnite în setul de antrenament.
  • Rigiditate: Sunt mai puțin flexibili decât rețelele neuronale pentru detectarea obiectelor cu variații mari de formă sau textură.
  • Acuratețe Inferioară: În general, oferă o acuratețe mai mică decât metodele moderne de învățare profundă, mai ales pentru obiecte complexe sau în medii aglomerate.
  • Necesită Multă Muncă Manuală: Procesul de adnotare este intensiv și necesită mult timp.

Întrebări Frecvente (FAQ)

1. Care este numărul minim de imagini necesare pentru antrenament?
Nu există un număr minim strict, dar se recomandă cel puțin câteva sute de imagini pozitive și mii de imagini negative pentru a obține rezultate decente. Cu cât mai multe și mai variate, cu atât mai bine.

2. De ce să folosesc Haar Cascades când există metode mai noi precum YOLO sau SSD?
Haar Cascades sunt încă utile pentru scenarii specifice unde viteza este critică și obiectul de detectat este relativ simplu și consistent în aparență (ex: detectia fețelor în sisteme încorporate cu putere de procesare limitată). Sunt, de asemenea, o bază excelentă pentru a înțelege fundamentele detectiei de obiecte.

3. Ce fac dacă antrenamentul eșuează sau modelul nu detectează nimic?
Verificați următoarele:

  • Formatul fișierelor pos.txt și neg.txt.
  • Căile către executabilele OpenCV și datele de antrenament.
  • Asigurați-vă că -numPos și -numNeg nu depășesc numărul real de eșantioane disponibile.
  • Verificați parametrii -w și -h (trebuie să fie aceiași la createsamples și traincascade).
  • Asigurați-vă că aveți suficiente imagini pozitive și negative și că adnotările sunt corecte.
  • Creșteți -numStages sau ajustați -minHitRate și -maxFalseAlarmRate.

4. Cum pot îmbunătăți acuratețea modelului meu Haar Cascade?

  • Măriți numărul și diversitatea imaginilor pozitive și negative.
  • Asigurați-vă că adnotările sunt precise.
  • Experimentați cu parametrii -w, -h, -numStages, -minHitRate și -maxFalseAlarmRate.
  • Asigurați-vă că imaginile negative sunt reprezentative pentru fundalurile din lumea reală.

Concluzie

Antrenarea unui clasificator Haar Cascade personalizat este un proces detaliat, dar extrem de recompensator. Acesta vă permite să construiți un detector de obiecte specific nevoilor dumneavoastră, fără dependența de modele pre-antrenate. Deși este o tehnică mai veche, înțelegerea și aplicarea ei oferă o perspectivă valoroasă asupra principiilor fundamentale ale viziunii computerizate și rămâne o opțiune viabilă pentru anumite aplicații. Sperăm că acest ghid v-a oferit claritatea și încrederea necesară pentru a începe propria călătorie în detectia obiectelor cu Haar Cascades. Prin practică și experimentare, veți putea antrena modele robuste și eficiente.

Dacă vrei să descoperi și alte articole similare cu Detectia Obiectelor cu Haar Cascades: Ghid Complet, poți vizita categoria Fitness.

Go up