atidarymas

„OpenCV“ veido atpažinimas

„OpenCV“ veido atpažinimas

Veido atpažinimas naudojant „OpenCV“

Mašinų sudėtingumas bėgant metams išaugo ir kompiuteriai nėra išimtis. Kompiuteriai padėjo žmonijai išspręsti daugybę problemų ir atlikti daug sunkių užduočių. Praėjo laikai, kai visi kompiuteriai atlikdavo paprastas aritmetines operacijas, dabar kompiuteriai varo pasaulį.

Kompiuteriai tapo tokie sudėtingi, kad jie mokomi mąstyti kaip žmonės.
Taip!

Šiame straipsnyje mes padarysime kažką tokio pobūdžio. Kaip žmonėms, atpažinti kitų žmonių veidus yra paprasta užduotis ir, nepaisant šiuolaikinių kompiuterių galimybių, kompiuteriui nėra taip lengva, todėl turime jį išmokyti, kad galėtume daryti tą patį.

Daugybė straipsnių, kuriuos matytumėte, nustoja ties paprastu veido aptikimu, tačiau šiame straipsnyje bus aptariami ne tik veido, bet ir veido atpažinimas.

Tai reiškia, kad jei kompiuteriui pateikiamos dvi mano nuotraukos, jis ne tik atpažins, kokia paveikslo dalis yra mano veidas, bet ir atpažins, kad aš taip pat esu abiejuose paveikslėliuose.

Norėdami pradėti, pirmiausia turėtume įdiegti „opencv“ savo mašinose, o tai galima padaryti tik tuo atveju, jei turite „Python“. „Python“ diegimas nėra šio straipsnio tikslas, taigi, jei dar neturite jo savo kompiuteryje, galite įdiegti „Python“ iš „Python“ svetainės.

Norėdami įdiegti „Open CV“, tai galime padaryti naudodami komandą pip.

pip įdiegti opencv-python

Šiame straipsnyje taip pat naudosime numpy paketą, kuris turėtų būti įdiegtas šalia „OpenCV“ naudojant aukščiau pateiktą komandą.

Jei „numpy“ neįdiegta, galite lengvai tai padaryti naudodami toliau pateiktą komandą:

„pip install numpy“

Norėdami patvirtinti, kad jūsų „OpenCV“ yra įdiegtas, įjungę interaktyvią „Python“ aplinką pabandykite ją importuoti naudodami:

importuoti cv2

Jei negaunate klaidos, galite tęsti.

Veido atpažinimui parašytume tris scenarijus. Vienas sukuria vaizdų duomenų rinkinį, kitas treniruoja tuos vaizdus, ​​o paskutinis atpažįsta veidus pagal kompiuterio mokymų rezultatus.

Mums reikėtų „Open CV“ pateiktos „Haar Cascade“. Šį failą galima gauti iš „opencv“ katalogo, kuris yra cv2 / data / haarcascade_frontalface_default.xml mano kompiuteryje jis turėtų būti tas pats ir jūsų kompiuteryje. Nukopijuokite failą į aplanką, kuriame norite atpažinti veidą.

Dabar įsigilinkime į reikalus.
Mes bandytume gauti savo interneto kamerą, kad gautume nuotraukų, reikalingų duomenų rinkiniui.

importuoti cv2
vid_cam = cv2.„VideoCapture“ (0)
veido_detektorius = cv2.„CascadeClassifier“ ('haarcascade_frontalface_default.xml ')
face_id = 1
skaičius = 0
o (vid_kamera.isOpened ()):
ret, image_frame = vid_kamera.skaityti ()
pilka = cv2.„cvtColor“ („image_frame“, cv2.COLOR_BGR2GRAY)
veidai = veido detektorius.nustatyti „MultiScale“ (pilka, 1.3, 5)
(x, y, w, h) veiduose:
cv2.stačiakampis (image_frame, (x, y), (x + w, y + h), (255,0,0), 2)
skaičius + = 1
cv2.imwrite ("duomenų rinkinys / Vartotojas."+ str (face_id) + '.„+ str (skaičius) +“.JPG ", pilka [y: y + h, x: x + w])
cv2.imshow ('rėmelis', image_frame)
jei cv2.waitKey (100) & 0xFF == ord ('q'):
pertrauka
elifų skaičius> 100:
pertrauka
vid_cam.išleisti ()
cv2.destrAllWindows ()

Taigi paaiškinkite, ką daro kiekviena kodo eilutė:

importuoti cv2

Čia yra komanda, liepianti pitonui įtraukti išorinę biblioteką, kuri bus naudojama šiame kode, šiuo atveju tai yra „Open CV“.

vid_cam = cv2.„VideoCapture“ (0)

Šis kodas kviečia importuotą „Open CV“ biblioteką pradėti fiksuoti ir šiuo metu pradedama interneto kamera. Jei „Open CV“ nepalaiko jūsų internetinės kameros, kodas čia nepavyks.

veido_detektorius = cv2.„CascadeClassifier“ ('haarcascade_frontalface_default.xml ')

Kad galėtume atpažinti vaizdą, reikalingas šis kodas. Atvirame CV naudojamas 'haarcascade_frontalface_default.xml '- kaskados klasifikacijai. Tada gautas objektas saugomas kintamajame face_detector.

face_id = 1

Čia yra veido ID numerio nustatymo atvejis, taigi pirmasis veidas gauna 1 ID.

skaičius = 0

Fotografuosime porą vaizdų, nes „Open CV“ turi mokyti vaizdus, ​​kad galėtų atpažinti veidus. Skaičiavimo kintamasis yra vaizdų skaičius.

o (vid_kamera.isOpened ()):

Tai leidžia atlikti šias operacijas, jei vaizdo kamera yra atidaryta. Metodas isOpened () grąžina tiesą arba melą.

ret, image_frame = vid_kamera.skaityti ()

Čia, vid_cam.„read ()“ peržiūri vaizdo įrašą ir tada užfiksuoja kadrą, kuris saugomas kintamajame „image_frame“, jei operacija sėkminga, loginė vertė „True“ grąžinama ir saugoma ret kintamajame

pilka = cv2.„cvtColor“ („image_frame“, cv2.COLOR_BGR2GRAY)

CvtColor () metodas naudojamas vaizdo kadrui konvertuoti į norimą spalvų tipą. Šiuo atveju mes jį pavertėme pilka spalva.

veidai = veido_detektorius.nustatyti „MultiScale“ (pilka, 1.3, 5)

Tai tikrina skirtingų dydžių rėmus ir bando juos nustatyti pagal mastelį. Tai taikoma kintamajam, kuriam buvo pritaikytas „Haar Cascade“.

(x, y, w, h) veiduose:

Čia mes pereiname per veidus ir jų matmenis, kur x ir y reiškia koordinates, o w ir h - atitinkamai plotį ir aukštį.

cv2.stačiakampis (image_frame, (x, y), (x + w, y + h), (255,0,0), 2)

Atminkite, kad mes vis dar dirbame su vaizdo kamera, tada vaizdo kamera apkarpo reikalingą vaizdo dalį pagal aukščiau pateiktus matmenis.

skaičius + = 1

Iškart tai padarius, skaičiaus kintamasis, kuris yra skaitiklis, didėja.

cv2.imwrite ("duomenų rinkinys / Vartotojas."+ str (face_id) + '.„+ str (skaičius) +“.JPG ", pilka [y: y + h, x: x + w])

Apkarpytas vaizdas išsaugomas pavadinimu Vartotojas (face_id).(skaičiuoti).JPG ir įdėkite į aplanką, vadinamą duomenų rinkiniu.

cv2.imshow ('rėmelis', image_frame)

Po išsaugojimo šis kodas užtikrina, kad vaizdo veidrodžio rėmelis būtų rodomas stačiakampiu ant asmens veido po veido aptikimo.

jei cv2.waitKey (100) & 0xFF == ord ('q'):
pertrauka

Po kiekvieno paveikslėlio vartotojui leidžiama sustabdyti programos daugiau nuotraukų, kurias galima padaryti paspaudus klaviatūros „q“ bent 100 ms.

elifų skaičius> 100:
pertrauka

Šis kodas yra sustabdyti vaizdo įrašo veikimą tuo metu, kai buvo padaryta 100 nuotraukų, neatsižvelgiant į tai, ar vartotojas nori padaryti daugiau, ar ne.

vid_cam.išleisti ()

Čia internetinė kamera yra uždaryta ir ne tik sustabdyta fotografuojant.

cv2.destrAllWindows ()

Tada visi „OpenCV“ atidaryti langai buvo sunaikinti ir kodas baigtas.

Dabar, kai tai atliksime, galėsime išmokyti vaizdo duomenų rinkinį:

importuoti cv2, os
importuoti numerį kaip np
iš PIL importo atvaizdo
atpažintuvas = cv2.veidas.createLBPHFaceRecognizer ()
detektorius = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml ");
def getImagesAndLabels (kelias):
imagePaths = [os.kelias.prisijungti (kelias, f) už f in os.listdir (kelias)]
faceSamples = []
ID = []
„imagePath“ sistemoje „imagePaths“:
PIL_img = Vaizdas.atidaryti („imagePath“).konvertuoti ('L')
img_numpy = np.masyvas (PIL_img, 'uint8')
id = int (os.kelias.padalinti („imagePath“) [- 1].padalinti (".") [1])
veidai = detektorius.aptiktiMultiScale (img_numpy)
(x, y, w, h) veiduose:
veidasMėginiai.pridėti (img_numpy [y: y + h, x: x + w])
ID.pridėti (id)
grąžinimo veidasMėginiai, ID
veidai, ids = getImagesAndLabels ('duomenų rinkinys')
atpažintojas.traukinys (veidai, np.masyvas (ID))
atpažintojas.sutaupyti ('treneris / treneris.yml ')

Pereikime ir paaiškinkime šį kodą:

importuoti cv2, os

Kaip ir kitas kodas, čia importuojame „OpenCV“ ir „OS“, kurių mums prireiks failo kelyje.

importuoti numerį kaip np

Mes taip pat importuojame numpy biblioteką, kuri būtų naudojama skaičiuojant matricą (matrica yra tik masyvų išdėstymas).

iš PIL importo atvaizdo

Mes importuojame „Python“ vaizdų biblioteką ir tada iš jos taip pat gauname vaizdų biblioteką iš šio paketo.

atpažintuvas = cv2.veidas.createLBPHFaceRecognizer ()

Tai reiškia, kad „CV2“ reikia pritaikyti metodą „createLBPHFaceRecognizer ()“.veido objektą, tai padėtų lengvai atpažinti veidus, nes mes neturime sugalvoti savo algoritmų rinkinio.

detektorius = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml ");

Jei laikėtės pamokos, su tuo būtumėte susidūrę ir anksčiau. Tai padeda nustatyti veidą naudojant „haarcascade_frontalface_default“.xml “-„ Cascade “klasifikacijai.

def getImagesAndLabels (kelias):

Dabar mes ruošiamės pradėti vaizdų mokymą, todėl sukuriame funkciją.

imagePaths = [os.kelias.prisijungti (kelias, f) už f in os.listdir (kelias)]

Šis kodas patenka į dabartinį failo katalogą ir patikrina, ar vaizdo failai juos prideda prie šio sąrašo.

faceSamples = []

Tai inicializuoja pavyzdžių sąrašą, šiuo metu jis yra tuščias, bet veidai būtų pridėti, kai kodas vykdomas.

ID = []

Inicializuokite ID sąrašą, kuris iš pradžių yra tuščias.

„imagePath“ sistemoje „imagePaths“:

Prisiminkite kodą, kuris patikrino paveikslėlių failus kataloge? Taip? Dabar mes pereisime kiekvieną iš šių failų ir atliksime su jais operacijas.

PIL_img = Vaizdas.atidaryti („imagePath“).konvertuoti ('L')

Pirmas dalykas, kurį darome paveikslėlyje, yra konvertuoti jį į pilkos spalvos skalę, ir šis kodas tai daro.

img_numpy = np.masyvas (PIL_img, 'uint8')

Pilkai atvaizduotas vaizdas yra tik skaičių serija vienoje vietoje, todėl iš jų sukuriame numpy masyvą ir priskiriame jį kintamajam.

id = int (os.kelias.padalinti („imagePath“) [- 1].padalinti (".") [1])

Jei prisiminsite failą, kuris gauna vaizdus, ​​turėtumėte prisiminti, kad mes pavadinome failus Vartotoju (face_id).suskaičiuoti.JPG. Taigi čia mes padalijame pavadinimus su „.“, Tada išskleidžiame face_id ir priskiriame čia kintamąjį. Mums reikėtų ID, kad būtų galima atpažinti.

veidai = detektorius.aptiktiMultiScale (img_numpy)

Iš numpy masyvo „DetectMultiScale ()“ metodas bandys aptikti veidus iš šablono, kurį randa numpy masyve. Tada jis priskiria veidų kintamųjų reikšmes.

(x, y, w, h) veiduose:

Čia mes stebime kintamajam priskirtas vertes. Čia pateikiamos reikšmės yra x ir y koordinatės, kurias galėtume laikyti kilme, o tada w ir h yra atitinkamai plotis ir aukštis.

veidasMėginiai.pridėti (img_numpy [y: y + h, x: x + w])

Anksčiau mes sukūrėme veido pavyzdžių sąrašą, tačiau jis buvo tuščias. Čia prie šio sąrašo turime pridėti veidus ir pridedame y prie h, kad gautume dvi y koordinačių reikšmes ir tas pats daroma x.

ID.pridėti (id)

Dabar veidų pavyzdžių sąraše turime veidą, todėl gauname jo ID ir taip pat pridedame prie ID sąrašo.

grąžinimo veidasMėginiai, ID

Tada po visko grąžiname veido pavyzdžių ir identifikatorių sąrašą.

veidai, ids = getImagesAndLabels ('duomenų rinkinys')

Atminkite, kad getImagesAndLabels () yra tik funkcija. Taigi čia turime iškviesti funkciją, o grąžinimo reikšmės išsaugomos veidų ir ID kintamuosiuose.

atpažintojas.traukinys (veidai, np.masyvas (ID))

Čia vyksta tikroji treniruotė. Kažkada anksčiau taikėme metodą createLBPHFaceRecognizer () ir priskyrėme atpažintuvo kintamajam. Tai treniruočių laikas!

atpažintojas.sutaupyti ('treneris / treneris.yml ')

Po treniruotės galime išsaugoti mokymų rezultatus.
Paleidus kodą, jis sukuria failą, vadinamą treneriu.yml, kurį tada naudotų veido atpažinimo kodas.

Štai veido atpažinimo kodas:

importuoti cv2
importuoti numerį kaip np
atpažintuvas = cv2.veidas.createLBPHFaceRecognizer ()
atpažintojas.apkrova ('treneris / treneris.yml ')
cascadePath = "haarcascade_frontalface_default.xml "
faceCascade = cv2.„CascadeClassifier“ („cascadePath“)
font = cv2.FONT_HERSHEY_SIMPLEX
kumštelis = cv2.„VideoCapture“ (0)
o tiesa:
ret, im = kumštelis.skaityti ()
pilka = cv2.„cvtColor“ (im, cv2.COLOR_BGR2GRAY)
veidai = faceCascade.nustatyti „MultiScale“ (pilka, 1.2,5)
(x, y, w, h) veiduose:
cv2.stačiakampis (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)
Id = atpažintuvas.numatyti (pilka [y: y + h, x: x + w])
jei (Id == 1):
Id = "Nazmi"
Kitas:
Id = "Nežinoma"
cv2.stačiakampis (im, (x-22, y-90), (x + w + 22, y-22), (0,255,0), -1)
cv2.„putText“ (im, str (Id), (x, y-40), font, 2, (255,255,255), 3)
cv2.imshow ('im', im)
jei cv2.waitKey (10) & 0xFF == ord ('q'):
pertrauka
kumštelis.išleisti ()
cv2.destrAllWindows ()

Jei sekėte straipsnį nuo pat pradžių, tai darėme ir anksčiau. Jei maloniai nepadarei.

atpažintojas.apkrova ('treneris / treneris.yml ')

Atminkite, kad išmokėme atpažintuvą ir išsaugojome failą? Taip? Dabar įkeliame tą failą.

cascadePath = "haarcascade_frontalface_default.xml "

Mes dirbtume su „haarcascade“ rinkmena, o štai failo pavadinimą priskyrėme kintamajam.

# Sukurkite klasifikatorių pagal iš anksto pastatytą modelį
faceCascade = cv2.„CascadeClassifier“ („cascadePath“)

Čia mes turime atlikti kaskados klasifikavimą haarcascade byloje.

font = cv2.FONT_HERSHEY_SIMPLEX

Mes nustatome šrifto tipą, kuris būtų naudojamas, kai kodas atpažįsta paveikslėlyje esantį veidą ir rodo vardą.

kumštelis = cv2.„VideoCapture“ (0)

Mes jau buvome čia, bet šį kartą atėjo laikas atpažinti veidus. Jei nežinote, ką daro šis kodas, jis paleidžia internetinę kamerą.

o tiesa:
ret, im = kumštelis.skaityti ()
pilka = cv2.„cvtColor“ (im, cv2.COLOR_BGR2GRAY)
veidai = faceCascade.nustatyti „MultiScale“ (pilka, 1.2,5)
(x, y, w, h) veiduose:

Visa tai buvo padaryta anksčiau, maloniai patikrinkite kodą, kuris buvo naudojamas vaizdams išsaugoti, jei nežinote, ką daro kodas.

cv2.stačiakampis (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)

Taigi tai padeda internetinei kamerai aptikti veidus ir uždeda stačiakampį, kuris nurodo veidą.

Id = atpažintuvas.numatyti (pilka [y: y + h, x: x + w])

Alerady įkėlė traukinio failą į atpažintuvą, todėl jis dabar gali atpažinti veidą.

jei (Id == 1):
Id = "Aš pats"
Kitas:
Id = "Nežinoma"

Pabandęs atpažinti, koks tai veidas, jis patikrina, ar nėra asmens tapatybės, ir patikrina, ar jis egzistuoja. Čia ID reikšmė būtų tas, kuris turėjo nuosavybės teises, susidurdamas su tokiu ID, kai buvo kuriamas vaizdo duomenų rinkinys.

cv2.stačiakampis (im, (x-22, y-90), (x + w + 22, y-22), (0,255,0), -1)
cv2.„putText“ (im, str (Id), (x, y-40), font, 2, (255,255,255), 3)

Kodas, radęs ID savininką, nupiešia stačiakampį aplink veidą ir uždeda veido savininko vardą. Veidas atpažintas!

cv2.imshow ('im', im)

Čia vaizdo rėmelis rodomas su apribotu stačiakampiu.

jei cv2.waitKey (10) & 0xFF == ord ('q'):
pertrauka
kumštelis.išleisti ()
cv2.destrAllWindows ()

Taigi, atlikę programą, galite sustabdyti programą paspausdami klavišą „q“. Ji sustabdo internetinę kamerą ir ją uždaro.

Turite tai, jūsų interneto kamera dabar gali atpažinti veidus ir galite ją naudoti, kai tik norite. Be interneto kameros naudojimo, taip pat galite įkelti vaizdą, tačiau tam reikia atlikti kitus veiksmus nei tie, kurie buvo atlikti šiame straipsnyje.

Galite rasti jo github repo naudojamą šaltinio kodą. Taip pat rašykite mums, jei turite komentarų ar norite aptarti @linuxhint

Kaip įdiegti ir žaisti „Doom“ sistemoje „Linux“
Įvadas į Doom „Doom“ serija atsirado 90-aisiais, išleidus originalų „Doom“. Tai buvo tiesioginis hitas, o nuo to laiko žaidimų serija gavo daugybę apd...
„Vulkan“, skirta „Linux“ vartotojams
Kiekvienos naujos kartos grafikos plokštės matome, kaip žaidimų kūrėjai peržengia grafinės ištikimybės ribas ir artėja prie fotorealizmo. Nepaisant vi...
„OpenTTD“ ir „Simutrans“
Sukurti savo transporto modeliavimą gali būti smagu, atpalaiduojanti ir be galo viliojanti. Štai kodėl jūs turite įsitikinti, kad išbandėte kuo daugia...