Institute of Computer Science
  1. Main page
  2. IT koolidele
ET
Log in

IT koolidele

  • OpenCV sissejuhatus
  • OpenCV paigaldamine
  • Vajalike materjalide allalaadimine
  • Mis on pilt?
  • Pildid
  • Kaamera kasutamine
  • Pilditöötlus
  • Objektide tuvastus
  • Lisa: Panoraam

Objektide tuvastamine

pildi allikas: https://www.augmentedstartups.com/blog/boosting-agriculture-with-computer-vision

Eesmärk

Arvutile on võimalik objektide tuvastust õpetada, kuid see on tihtipeale ajamahukas protsess, sest eeldab suures koguses näidispiltide analüüsimist. Kui soovime, et arvuti suudaks piltidelt koerad ära tuvastada, siis see nõuab kõigepealt arvutile suurel hulgal koerte piltide näitamist. Arvuti loob piltide põhjal endale seosed ning alles siis on võimalik objektide tuvastamisega pihta hakata. Mida rohkem on näidisandmeid, seda paremini tuvastab arvuti objekte. OpenCV'l on olemas eeltreenitud mudeleid, mida saab kiiresti kasutada teatud liiki objekted tuvastamiseks, seega ei pea ise arvuti õpetamisele aega panustama.

Selles peatükis:

  • Tutvume OpenCV moodulis olevate klassifikaatoritega.
  • Kasutame Haari klassifikaatoreid objektide tuvastamiseks piltidel ja videotel.

Haar klassifikaator

Algoritm kasutab kaskaadi ehk mitmeastmelist klassifikaatorite seeriat (lihtsaid otsustajaid). Iga kaskaadi aste kontrollib teatud omadusi ja lükkab kiiresti tagasi pildi piirkonnad, mis ei sisalda objekti, keskendudes ainult tõenäolistele aladele, mis võivad sisaldada nägu. Ainult need alad, mis läbivad kõik etapid, lõpuks arvestatakse näona.

Vajalike materjalide alt lae alla ning pane pythoni failiga samasse kausta järgnevad failid:

  • haarcascade_eye.xml
  • haarcascade_frontalface_default.xml
  • haarcascade_fullbody.xml
  • haarcascade_smile.xml
  • haarcascade_upperbody-xml

OpenCV'l on olemas juba päris mitu eeltreenitud mudelit, mida saab kohe kasutusele võtta. Neid saad alla laadida siit.

Failinimedest lähtuvalt võib juba eeldada, mida iga fail tuvastab. Kõik need failid on leitavad ka githubis'is.

OpenCV kasutamine näotuvastuseks

cv2.CascadeClassifier funktsiooniga saame kasutada Haar klassifikaatoreid. Reaalsuses ei ole vahet, kas kasutame funktsiooni pildi või videoga, sest video on lihstalt mitu pilti sekundis järjend. CascadeClassifier funktsioon oskab analüüsida grayscale värviruumiga pilti.

Kopeeri Haar klassifikaatori XML fail õigesse kausta ja kirjutame näotuvastus koodijupi.

import cv2
# loeme sisse näotuvastuse faili
näotuvastus = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# loeme sisse pildi, kus soovime nägusid tuvastada
pilt = cv2.imread('inimesed.jpg')
# Haar klassifikaator analüüsib ainult grayscale filtriga pilte
hall = cv2.cvtColor(pilt, cv2.COLOR_BGR2GRAY)
# näotuvastuse rakendamine
näod = näotuvastus.detectMultiScale(hall, 1.3, 5)

for (x, y, w, h) in näod:
    # joonistame ristkülikud ümber tuvastatud nägude
    pilt = cv2.rectangle(pilt, (x, y), (x+w, y+h), (255, 0, 0), 2)

cv2.imshow('Tuvastati inimesed!', pilt)
# salvestab tuvastatud näod uue failina
cv2.imwrite('./tuvastatud_inimesed.jpg', pilt)
cv2.waitKey(0)

Käime koodi läbi:

Kõigepealt impordime cv2 mooduli ning peale seda määrame ära näotuvastuse mudeli.

näotuvastus = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

Siis laeme pildi üles kasutades cv2.imread käsku ning muudame selle grayscale'ile, sest CascadeClassifier eeldab halli pilti.

pilt = cv2.imread('inimesed.jpg')
gray = cv2.cvtColor(pilt, cv2.COLOR_BGR2GRAY)
näod = näotuvastus.detectMultiScale(gray, 1.4, 5)

Näotuvastus toimub detectMultiScale funktsiooniga. Esimene parameeter on pilt muudetud halliks, teine on scaleFactor ja kolmas on minNeighbors.

Parameetrid:

  • scaleFactor: See parameeter määrab, kui põhjalikult pilti uuritakse. Tavaliselt on see väärtus vahemikus 1.1 kuni 1.4. Väiksem väärtus tähendab täpsemat, kuid aeglasemat tuvastust.
  • minNeighbors: See parameeter määrab, mitu naabrit iga kandidaatkast peab omama, et seda detekteerida. Suurem arv vähendab valepositiivsete tuvastuste arvu.

Väljund: Funktsioon tagastab objektide asukohad pildil kui ristkülikute nimekiri (bounding boxes). Iga ristkülik on määratud koordinaatidega (x, y, laius, kõrgus), kus x ja y on ristküliku vasak ülemine nurk.

Joonistame sinised ristkülikud kõikide leitud nägude ümber, kasutades cv2.rectangle käsku. Tsüklit kasutades käime läbi kõik tuvastatud näod ja nende koordinaadid.

for (x, y, w, h) in näod:
    pilt = cv2.rectangle(pilt, (x, y), (x+w, y+h), (255, 0, 0), 2)

Lõpuks kasutame cv2.imshow funktsiooni, et kuvada töödeldud pilti. Salvestame tuvastatud nägudega pildi nimega "tuvastatud_inimesed.jpg"

cv2.imshow('Tuvastati inimesed!', pilt)
cv2.imwrite('./tuvastatud_inimesed.jpg', pilt)
cv2.waitKey(0)

Ülesanne: Kirjuta programm, mis kasutab haarcascade_eye.xml klassifikaatorit, et tuvastada inimene2.jpg pildilt silmad.

Näotuvastus videos:

Nüüd mõistame, kuidas teostada näotuvastust staatilisel pildil. Nagu varem mainitud, saame näotuvastusprotsessi korrata iga video kaadri puhul (olgu see siis kaamera otseülekanne või eelsalvestatud videofail). Seekord kasutame video otsepilti veebikaamerast ning lisaks näotuvastusele kasutame ka silmade tuvastust.

import cv2
näotuvastus = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
silmatuvastus = cv2.CascadeClassifier('haarcascade_eye.xml')

#kasutame kaamerat
kaamera = cv2.VideoCapture(0)
while (cv2.waitKey(1) == -1):
    success, frame = kaamera.read()
    if success:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        näod = näotuvastus.detectMultiScale(
            gray, 1.3, 5, minSize=(120, 120))
        for (x, y, w, h) in näod:
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
            roi_gray = gray[y:y+h, x:x+w]
            silmad = silmatuvastus.detectMultiScale(
                roi_gray, 1.03, 5, minSize=(40, 40))
            for (ex, ey, ew, eh) in silmad:
                cv2.rectangle(frame, (x+ex, y+ey),
                              (x+ex+ew, y+ey+eh), (0, 255, 0), 2)
        cv2.imshow('Näo tuvastus', frame)

Analüüsime koodi läbi: Impordime cv2 mooduli ja kasutame CascadeClassifier klassi.

näotuvastus = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
silmatuvastus = cv2.CascadeClassifier('haarcascade_eye.xml')

Peale seda avame kaamera ja analüüsime igat kaadrit eraldi.

kaamera = cv2.VideoCapture(0)
while (cv2.waitKey(1) == -1):
    success, frame = kaamera.read()
    if success:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        näod = näotuvastus.detectMultiScale(
            gray, 1.3, 5, minSize=(120, 120))

Näotuvastus toimib detectMultiScale meetodiga.

näod = näotuvastus.detectMultiScale(
            gray, 1.3, 5, minSize=(120, 120))

Joonistame sinise ristküliku tuvastatud nägude ümber.

for (x, y, w, h) in näod:
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
            roi_gray = gray[y:y+h, x:x+w]

Ülesanne: Kirjuta programm, mis proovib kaamera videopildist tuvastada objekte. Lisaks peab hakkama kaamera salvestama videot, kui objekt tuvastatakse reaalajas videolt. Kasutada võib kõiki saadaval olevaid OpenCV Haar klassifikaatoreid.

Vihje saamiseks võid vaadata "Video salvestamine" peatükki.

  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment