Բովանդակություն:

Իրական ժամանակի Դեմքի ճանաչում. Անընդհատ նախագիծ ՝ 8 քայլ (նկարներով)
Իրական ժամանակի Դեմքի ճանաչում. Անընդհատ նախագիծ ՝ 8 քայլ (նկարներով)

Video: Իրական ժամանակի Դեմքի ճանաչում. Անընդհատ նախագիծ ՝ 8 քայլ (նկարներով)

Video: Իրական ժամանակի Դեմքի ճանաչում. Անընդհատ նախագիծ ՝ 8 քայլ (նկարներով)
Video: 8 բան, որ տղամարդիկ անում են ՄԻԱՅՆ այն կնոջ հետ, ում սիրում են 2024, Հունիսի
Anonim
Իրական ժամանակի դեմքի ճանաչում. Վերջ-ծայր ծրագիր
Իրական ժամանակի դեմքի ճանաչում. Վերջ-ծայր ծրագիր

OpenCV- ն ուսումնասիրող իմ վերջին ձեռնարկում մենք սովորեցինք ԱՎՏՈՄԱՏԱԿԱՆ ՎԻIONԻԱՆԻ ՕԲՅԵԿՏԻ ԳՆԱՀԱՏՈՄ: Այժմ մենք կօգտագործենք մեր PiCam- ը ՝ իրական ժամանակում դեմքերը ճանաչելու համար, ինչպես կարող եք տեսնել ստորև.

Պատկեր
Պատկեր

Այս նախագիծը կատարվեց այս ֆանտաստիկ «Բաց կոդով համակարգչային տեսողության գրադարանի» ՝ OpenCV- ի միջոցով: Այս ձեռնարկի վրա մենք կկենտրոնանանք Raspberry Pi- ի վրա (այսինքն ՝ Raspbian որպես ՕՀ) և Python- ի վրա, բայց ես նաև փորձարկեցի կոդը իմ Mac- ում և այն նույնպես լավ է աշխատում: OpenCV- ն նախատեսված է հաշվողական արդյունավետության համար և մեծ ուշադրություն է դարձնում իրական ժամանակի ծրագրերին: Այսպիսով, դա կատարյալ է իրական ժամանակում դեմքի ճանաչման համար `տեսախցիկով:

Դեմքի ճանաչման վերաբերյալ ամբողջական նախագիծ ստեղծելու համար մենք պետք է աշխատենք 3 շատ հստակ փուլերի վրա.

  1. Դեմքի հայտնաբերում և տվյալների հավաքում
  2. Սովորեցրեք ճանաչողին
  3. Դեմքի ճանաչում

Ստորև բերված բլոկ -դիագրամը վերսկսում է այդ փուլերը.

Պատկեր
Պատկեր

Քայլ 1: BoM - նյութի հաշիվ

Հիմնական մասեր.

  1. Raspberry Pi V3 - 32,00 ԱՄՆ դոլար
  2. 5 մեգապիքսել 1080p սենսոր OV5647 մինի տեսախցիկի վիդեո մոդուլ - 13,00 ԱՄՆ դոլար

Քայլ 2. OpenCV 3 փաթեթի տեղադրում

OpenCV 3 փաթեթի տեղադրում
OpenCV 3 փաթեթի տեղադրում

Ես օգտագործում եմ Raspberry Pi V3- ը, որը թարմացվել է Raspbian- ի (Stretch) վերջին տարբերակին, ուստի OpenCV- ն տեղադրելու լավագույն միջոցը հետևելն է Ադրիան Ռոուզբրոկի մշակած հիանալի ձեռնարկին. Raspbian Stretch. Տեղադրեք OpenCV 3 + Python ձեր Raspberry Pi- ի վրա:.

Ես փորձեցի մի քանի տարբեր ուղեցույցներ տեղադրել իմ Pi- ի վրա OpenCV- ն: Ադրիանի ձեռնարկը լավագույնն է: Ես ձեզ խորհուրդ եմ տալիս նույնն անել ՝ քայլ առ քայլ հետևելով նրա ուղեցույցին:

Երբ ավարտեք Ադրիանի ձեռնարկը, դուք պետք է ունենաք OpenCV վիրտուալ միջավայր, որը պատրաստ կլինի մեր փորձերը ձեր Pi- ով գործարկելու համար:

Եկեք գնանք մեր վիրտուալ միջավայր և հաստատենք, որ OpenCV 3 -ը ճիշտ է տեղադրված:

Ադրիանը խորհուրդ է տալիս ամեն անգամ նոր տերմինալ բացելիս գործարկել «աղբյուր» հրամանը `ձեր համակարգի փոփոխականները ճիշտ տեղադրելու համար:

աղբյուր ~/. պրոֆիլ

Հաջորդը, եկեք մուտքագրենք մեր վիրտուալ միջավայրը.

workon cv

Եթե տեսնում եք ձեր տեքստին նախորդող տեքստը (cv), ապա դուք գտնվում եք cv վիրտուալ միջավայրում.

(cv) pi@ազնվամորի ՝ ~ $Ադրիանը ուշադրություն է հրավիրում, որ cv Python վիրտուալ միջավայրը լիովին անկախ է և անջատված է Raspbian Stretch- ի ներբեռնման մեջ ներառված Python- ի կանխադրված տարբերակից: Այսպիսով, գլոբալ կայքերի փաթեթների գրացուցակում ցանկացած Python փաթեթ հասանելի չի լինի cv վիրտուալ միջավայրին: Նմանապես, cv- ի փաթեթներում տեղադրված Python փաթեթները հասանելի չեն լինի Python- ի գլոբալ տեղադրմանը

Այժմ մուտքագրեք ձեր Python թարգմանիչը.

պիթոն

և հաստատեք, որ աշխատում եք 3.5 (կամ ավելի բարձր) տարբերակով

Թարգմանչի ներսում (կհայտնվի «>>>»), ներմուծեք OpenCV գրադարանը ՝

ներմուծել cv2

Եթե սխալ հաղորդագրություններ չեն հայտնվում, OpenCV- ն ճիշտ տեղադրված է ձեր PYTHON վիրտուալ միջավայրի վրա:

Կարող եք նաև ստուգել տեղադրված OpenCV տարբերակը ՝

cv2._ տարբերակ_

3.3.0 -ը պետք է հայտնվի (կամ բարձրակարգ տարբերակ, որը կարող է թողարկվել ապագայում): Վերոնշյալ տերմինալային PrintScreen- ը ցույց է տալիս նախորդ քայլերը:

Քայլ 3: Փորձարկեք ձեր տեսախցիկը

Փորձարկեք ձեր տեսախցիկը
Փորձարկեք ձեր տեսախցիկը

Երբ ձեր RPi- ում տեղադրեք OpenCV- ն, եկեք փորձարկենք `հաստատելու համար, որ ձեր տեսախցիկը ճիշտ է աշխատում:

Ենթադրում եմ, որ ձեր Raspberry Pi- ի վրա արդեն տեղադրված PiCam ունեք:

Ձեր IDE- ում մուտքագրեք Python- ի ստորև նշված կոդը.

ներմուծել numpy որպես np

ներմուծել cv2 cap = cv2. VideoCapture (0) cap.set (3, 640) # set Լայնություն cap.set (4, 480) # հավաքած Բարձրություն մինչ (Trueշմարիտ) ՝ ret, frame = cap.read () frame = cv2: մատով խփել (շրջանակ, -1) # Շրջել տեսախցիկը ուղղահայաց մոխրագույն = cv2.cvtColor (շրջանակ, cv2. COLOR_BGR2GRAY) cv2.imshow («շրջանակ», շրջանակ) cv2.imshow («մոխրագույն», մոխրագույն) k = cv2.waitKey (30) & 0xff, եթե k == 27: # սեղմեք «ESC» ՝ դադարեցնելու համար cap.release () cv2.destroyAllWindows ()

Վերոնշյալ ծածկագիրը կգրավի տեսահոսքը, որը կստեղծվի ձեր PiCam- ի կողմից ՝ ցուցադրելով երկուսն էլ, BGR գույնի և մոխրագույնի ռեժիմում:

Ուշադրություն դարձրեք, որ ես տեսախցիկս ուղղահայաց պտտեցի `դրա հավաքման եղանակի պատճառով: Եթե դա ձեր դեպքում չէ, մեկնաբանեք կամ ջնջեք «մատով խփել» հրամանի տողը:

Այլապես կարող եք ներբեռնել կոդը իմ GitHub- ից ՝ simpleCamTest.py

Իրականացնելու համար մուտքագրեք հրամանը.

python simpleCamTest.py

Finishրագիրը ավարտելու համար դուք պետք է սեղմեք [ESC] ստեղնաշարի ստեղնը:

Սեղմեք ձեր մկնիկը տեսանյութի պատուհանի վրա, նախքան [ESC] սեղմելը

Վերևի նկարը ցույց է տալիս արդյունքը:

Որոշ արտադրողներ խնդիրներ են հայտնաբերել տեսախցիկը բացելիս («Հաստատումը ձախողվեց» սխալի հաղորդագրություններ): Դա կարող է տեղի ունենալ, եթե տեսախցիկը միացված չլիներ OpenCv- ի տեղադրման ընթացքում և, հետևաբար, տեսախցիկի վարորդները ճիշտ տեղադրված չլինեին: Ուղղելու համար օգտագործեք հրամանը.

sudo modprobe bcm2835-v4l2

Կարող եք նաև bcm2835-v4l2 ավելացնել /etc /մոդուլների ֆայլի վերջին տողին, որպեսզի վարորդը բեռնվի բեռնման ժամանակ:

OpenCV- ի մասին ավելին իմանալու համար կարող եք հետևել ձեռնարկին ՝ loading -video-python-opencv-tutorial

Քայլ 4: Դեմքի հայտնաբերում

Դեմքի հայտնաբերում
Դեմքի հայտնաբերում
Դեմքի հայտնաբերում
Դեմքի հայտնաբերում

Դեմքի ճանաչման ամենահիմնական խնդիրն, իհարկե, «Դեմքի հայտնաբերում» -ն է: Ամեն ինչից առաջ դուք պետք է «գրավեք» դեմք (1 -ին փուլ), որպեսզի ճանաչեք այն, եթե համեմատեք ապագայում գրաված նոր դեմքի հետ (3 -րդ փուլ):

Դեմքը (կամ որևէ առարկա) հայտնաբերելու ամենատարածված միջոցը «Haar Cascade դասակարգիչ» -ի օգտագործումն է:

Օբյեկտների հայտնաբերումը Haar- ի վրա հիմնված կասկադի դասակարգիչների միջոցով օբյեկտների հայտնաբերման արդյունավետ մեթոդ է, որն առաջարկել են Փոլ Վիոլան և Մայքլ onesոնսը իրենց հոդվածում ՝ «Արագ օբյեկտների հայտնաբերում ՝ օգտագործելով պարզ հատկությունների խթանված կասկադ» 2001 թ.: Դա մեքենայական ուսուցման վրա հիմնված մոտեցում է, որտեղ կասկադի գործառույթը վարժվում է բազմաթիվ դրական և բացասական պատկերներից: Այնուհետեւ այն օգտագործվում է այլ պատկերներում օբյեկտների հայտնաբերման համար:

Այստեղ մենք աշխատելու ենք դեմքի հայտնաբերման հետ: Սկզբում ալգորիթմին անհրաժեշտ են բազմաթիվ դրական պատկերներ (դեմքերի պատկերներ) և բացասական պատկերներ (պատկերներ առանց դեմքերի) `դասակարգիչին պատրաստելու համար: Հետո մենք պետք է դրանից հատկանիշներ հանենք: Լավ նորությունն այն է, որ OpenCV- ն գալիս է ինչպես մարզիչ, այնպես էլ դետեկտոր: Եթե ցանկանում եք պատրաստել ձեր սեփական դասակարգիչը ցանկացած օբյեկտի համար, ինչպիսիք են մեքենան, ինքնաթիռները և այլն, կարող եք օգտագործել OpenCV- ն ՝ դրանք ստեղծելու համար: Դրա ամբողջական մանրամասները տրված են այստեղ ՝ Կասկադի դասակարգիչների ուսուցում:

Եթե դուք չեք ցանկանում ստեղծել ձեր սեփական դասակարգիչը, OpenCV- ն արդեն պարունակում է բազմաթիվ նախապես պատրաստված դասակարգիչներ ՝ դեմքի, աչքերի, ժպիտի և այլնի համար: Այդ XML ֆայլերը կարելի է ներբեռնել haarcascades գրացուցակից:

Բավական տեսություն, եկեք OpenCV- ով ստեղծենք դեմքի դետեկտոր:

Ներբեռնեք ֆայլը ՝ faceDetection.py իմ GitHub- ից:

ներմուծել numpy որպես np

ներմուծել cv2 faceCascade = cv2. CascadeClassifier ('Cascades/haarcascade_frontalface_default.xml') cap = cv2. VideoCapture (0) cap.set (3, 640) # set Width cap.set (4, 480) # set Height while True: ret, img = cap.read () img = cv2.flip (img, -1) մոխրագույն = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) դեմքեր = faceCascade.detectMultiScale (մոխրագույն, scaleFactor = 1.2, min Հարևաններ = 5, minSize = (20, 20)) դեմքերի համար (x, y, w, h): cv2. Ուղղանկյուն (img, (x, y), (x+w, y+h), (255, 0, 0), 2) roi_gray = մոխրագույն [y: y+h, x: x+w] roi_color = img [y: y+h, x: x+w] cv2.imshow («տեսանյութ», img) k = cv2.wait Հիմնական (30) & 0xff, եթե k == 27: # սեղմեք «ESC» ՝ դադարեցնելու համար cap.release () cv2.destroyAllWindows ()

Ուզում եք հավատացեք, թե ոչ, կոդի վերը նշված մի քանի տողերն այն ամենն են, ինչ ձեզ անհրաժեշտ է ՝ դեմքը հայտնաբերելու համար ՝ օգտագործելով Python և OpenCV:

Երբ համեմատում եք տեսախցիկը փորձարկելու համար օգտագործված վերջին ծածկագրի հետ, կհասկանաք, որ դրան մի քանի մաս է ավելացվել: Ուշադրություն դարձրեք ստորև նշված տողին.

faceCascade = cv2. CascadeClassifier ('Cascades/haarcascade_frontalface_default.xml')

Սա այն տողն է, որը բեռնում է «դասակարգիչը» (այն պետք է լինի «Կասկադ/» անունով գրացուցակում ՝ ձեր ծրագրի գրացուցակի ներքո):

Այնուհետև մենք կդնենք մեր տեսախցիկը և օղակի ներսում, կտեղադրենք մեր մուտքային տեսանյութը մոխրագույն չափման ռեժիմում (նույնը, ինչ նախկինում տեսել էինք):

Այժմ մենք պետք է կանչենք մեր դասակարգչի գործառույթը ՝ դրան փոխանցելով որոշ շատ կարևոր պարամետրեր ՝ որպես մասշտաբի գործոն, հարևանների թիվը և հայտնաբերված դեմքի նվազագույն չափը:

դեմքեր = faceCascade.detectMultiScale (մոխրագույն, scaleFactor = 1.2, min Հարևաններ = 5, min Չափ = (20, 20))

Որտեղ,

  • մոխրագույնը մոխրագույն մասշտաբի պատկերն է:
  • scaleFactor- ը այն պարամետրն է, որը սահմանում է, թե որքան է պատկերի չափը կրճատվում յուրաքանչյուր պատկերի սանդղակում: Այն օգտագործվում է մասշտաբի բուրգ ստեղծելու համար:
  • minNeighbors- ը պարամետր է, որը սահմանում է, թե քանի հարևան պետք է ունենա յուրաքանչյուր թեկնածու ուղղանկյուն ՝ այն պահպանելու համար: Ավելի մեծ թիվը տալիս է ավելի ցածր կեղծ դրական:
  • minSize- ը երես համարվող ուղղանկյան նվազագույն չափն է:

Ֆունկցիան կբացահայտի դեմքի պատկերը: Հաջորդը, մենք պետք է «նշենք» նկարի դեմքերը ՝ օգտագործելով, օրինակ, կապույտ ուղղանկյուն: Դա արվում է ծածկագրի այս հատվածով.

(x, y, w, h) դեմքերի համար.

cv2. ուղղանկյուն (img, (x, y), (x+w, y+h), (255, 0, 0), 2) roi_gray = մոխրագույն [y: y+h, x: x+w] roi_color = img [y: y+h, x: x+w]

Եթե դեմքեր գտնվեն, այն վերադարձնում է հայտնաբերված դեմքերի դիրքերը որպես ուղղանկյուն ՝ ձախ վերևի անկյունով (x, y), իսկ լայնությունը ՝ «w», իսկ բարձրությունը ՝ «h» ==> (x, y, w, ը) Խնդրում ենք տեսնել վերը նշված նկարը:

Այս վայրերը ստանալուց հետո մենք կարող ենք ստեղծել «ROI» (գծված ուղղանկյուն) դեմքի համար և արդյունքը ներկայացնել imshow () գործառույթով:

Գործարկեք վերը նշված python Script- ը ձեր python միջավայրի վրա ՝ օգտագործելով Rpi տերմինալը.

python faceDetection.py

Արդյունքը:

Պատկեր
Պատկեր

Կարող եք ներառել նաև «աչքերի հայտնաբերման» կամ նույնիսկ «ժպիտի հայտնաբերման» դասակարգիչները: Այդ դեպքերում դուք կներառեք դասակարգչի գործառույթը և ուղղանկյան գծագիրը դեմքի օղակի ներսում, որովհետև անիմաստ կլինի աչքից կամ ժպիտը հայտնաբերել դեմքից դուրս:

Նկատի ունեցեք, որ Pi- ում միևնույն դասի մի քանի դասակարգիչ ունենալը կդանդաղեցնի մշակումը, երբ հայտնաբերման այս մեթոդը (HaarCascades) օգտագործի մեծ քանակությամբ հաշվողական ուժ: Սեղանի վրա այն ավելի հեշտ է գործարկել:

Իմ GitHub- ում դուք կգտնեք այլ օրինակներ.

faceEyeDetection.py

faceSmileDetection.py

faceSmileEyeDetection.py

Եվ վերը նշված նկարում դուք կարող եք տեսնել արդյունքը:

Դեմքի հայտնաբերումը ավելի լավ հասկանալու համար կարող եք նաև հետևել ստորև ներկայացված ձեռնարկին:

Haar Cascade Object Detection Face & Eye OpenCV Python ձեռնարկ

Քայլ 5: Տվյալների հավաքում

Տվյալների հավաքում
Տվյալների հավաքում
Տվյալների հավաքում
Տվյալների հավաքում

Առաջին հերթին, ես պետք է շնորհակալություն հայտնեմ Ռամիզ Ռաջային ՝ լուսանկարների վրա Face Recognition- ում կատարած հիանալի աշխատանքի համար.

ԴԵՄՔԻ RԱՆԱՉՈ USԹՅՈՆ ՕԳՆՈՄ ԵՎ PYTHON. ԱՍՏԱՅԻՆ ուղեցույց

և նաև Anirban Kar- ը, որը մշակեց շատ համապարփակ ձեռնարկ ՝ տեսանյութի միջոցով.

ԴԵՄՔԻ ԱՆԱՉՈՄ - 3 մաս

Ես իսկապես խորհուրդ եմ տալիս, որ դուք նայեք երկու ձեռնարկներին:

Ասելով դա ՝ եկեք սկսենք մեր նախագծի առաջին փուլը: Այն, ինչ մենք կանենք այստեղ, սկսվում է վերջին քայլից (Դեմքի հայտնաբերում), մենք պարզապես կստեղծենք տվյալների հավաքածու, որտեղ յուրաքանչյուր id- ի համար կպահենք մոխրագույն գույնի լուսանկարների խումբ `այն հատվածով, որն օգտագործվել է դեմքի հայտնաբերման համար:

Նախ, ստեղծեք տեղեկատու, որտեղ դուք զարգացնում եք ձեր նախագիծը, օրինակ ՝ FacialRecognitionProject:

mkdir Դեմքի ճանաչման նախագիծ

Այս գրացուցակում, բացի 3 պիթոնի սցենարներից, որոնք մենք կստեղծենք մեր նախագծի համար, մենք պետք է դրա վրա պահպանած լինենք Դեմքի դասակարգիչը: Դուք կարող եք ներբեռնել այն իմ GitHub- ից ՝ haarcascade_frontalface_default.xml

Հաջորդը, ստեղծեք ենթագրացուցակ, որտեղ մենք կպահենք մեր դեմքի նմուշները և այն կդնենք «տվյալների հավաքածու».

mkdir տվյալների հավաքածու

Եվ ներբեռնեք կոդը իմ GitHub- ից ՝ 01_face_dataset.py

ներմուծել cv2

import os cam = cv2. VideoCapture (0) cam.set (3, 640) # սահմանել տեսանյութի լայնություն cam.set (4, 480) # սահմանել տեսանյութի բարձրություն face_detector = cv2. CascadeClassifier ('haarcascade_frontalface_default.xml') # Յուրաքանչյուր անձի համար, մուտքագրեք մեկ թվային դեմքի id face_id = մուտքագրում ('\ n մուտքագրեք օգտվողի ID- ի վերջը սեղմել ==>') տպել ("\ n [INFO] Դեմքի ֆիքսման սկզբնավորումը: Նայեք տեսախցիկին և սպասեք …") # Նախաձեռնեք անհատական նմուշառման դեմքի հաշվարկը = 0 իսկ (Trueշմարիտ). մոխրագույն, 1.3, 5) դեմքի համար (x, y, w, h): cv2. ուղղանկյուն (img, (x, y), (x+w, y+h), (255, 0, 0), 2) count + = 1 # Պահել նկարված պատկերը տվյալների հավաքածուի թղթապանակում cv2.imwrite ("տվյալների հավաքածու/օգտվող": + str (face_id) + '.' + str (count) + ".jpg", մոխրագույն [y: y + h, x: x+w]) cv2.imshow ('image', img) k = cv2.waitKey (100) & 0xff # Սեղմեք 'ESC' ՝ տեսանյութից դուրս գալու համար, եթե k == 27: ընդմիջում էլիֆի հաշիվը> = 30: # Վերցրեք 30 դեմքի նմուշ և դադարեցրեք վիդեո ընդմիջումը # Do ab դա մաքրման տպագրությունից է ("\ n [INFO] Exiting Program and cleanup stuff") cam.release () cv2.destroyAllWindows ()

Կոդը շատ նման է այն կոդին, որը մենք տեսանք դեմքի հայտնաբերման համար: Մեր ավելացրածը «մուտքագրման հրաման» էր ՝ օգտվողի ID գրավելու համար, որը պետք է լինի ամբողջ թիվ (1, 2, 3 և այլն)

face_id = մուտքագրում ('\ n մուտքագրեք օգտվողի ID- ի վերջը սեղմեք ==>')

Եվ գրավված շրջանակներից յուրաքանչյուրի համար մենք պետք է այն պահենք որպես ֆայլ «տվյալների հավաքածուի» գրացուցակում.

cv2.imwrite ("տվյալների հավաքածու/օգտվող." + փող (face_id) + '.' + փող (հաշվարկ) + ".jpg", մոխրագույն [y: y + h, x: x + w])

Նկատի ունեցեք, որ վերը նշված ֆայլը պահելու համար դուք պետք է ներմուծեք «os» գրադարանը: Յուրաքանչյուր ֆայլի անունը կհետեւի կառուցվածքին.

User.face_id.count.jpg

Օրինակ, face_id = 1 ունեցող օգտվողի համար տվյալների հավաքածուի/ գրացուցակի 4 -րդ նմուշը նման կլինի հետևյալին.

User.1.4.jpg

ինչպես ցույց է տրված իմ Pi- ի վերևի լուսանկարում: Իմ ծածկագրի վրա ես վերցնում եմ 30 նմուշ յուրաքանչյուր id- ից: Դուք կարող եք փոխել այն վերջին «էլիֆի» վրա: Նմուշների քանակը օգտագործվում է այն օղակը կոտրելու համար, որտեղ դեմքի նմուշները գրավվում են:

Գործարկեք Python սցենարը և գրավեք մի քանի Ids: Դուք պետք է ամեն անգամ գործարկեք սցենարը, երբ ցանկանում եք միավորել նոր օգտվող (կամ փոխել արդեն գոյություն ունեցող լուսանկարները):

Քայլ 6: Մարզիչ

Մարզիչ
Մարզիչ

Այս երկրորդ փուլում մենք պետք է օգտագործողի բոլոր տվյալները վերցնենք մեր տվյալների հավաքածուից և «մարզենք» OpenCV Recognizer- ը: Դա ուղղակիորեն կատարվում է OpenCV- ի հատուկ գործառույթի միջոցով: Արդյունքը կլինի.yml ֆայլ, որը կպահվի «trainer/» գրացուցակում:

Այսպիսով, եկեք սկսենք ստեղծել ենթառեկտորիա, որտեղ մենք կպահենք պատրաստված տվյալները.

mkdir մարզիչ

Ներբեռնեք իմ GitHub- ից երկրորդ պիթոնի սցենարը ՝ 02_face_training.py

ներմուծել cv2

ներմուծել numpy as np PIL- ից ներմուծել պատկեր ներմուծել os # faceանապարհ ՝ դեմքի պատկերի տվյալների շտեմարան ճանապարհ = 'տվյալների' ճանաչիչ = cv2.face. LBPHFaceRecognizer_create () detector = cv2. CascadeClassifier ("haarcascade_frontalface_default.xml"); # գործառույթ ՝ պատկերներն ու պիտակի տվյալները ստանալու համար getImagesAndLabels (ուղի).: PIL_img = Image.open (imagePath).convert ('L') # փոխակերպել այն մոխրագույն սանդղակի img_numpy = np.array (PIL_img, 'uint8') id = int (os.path.split (imagePath) [-1]: պառակտում («.») [1]) դեմքեր = detector.detectMultiScale (img_numpy) համար (x, y, w, h) դեմքերի համար ՝ faceSamples.append (img_numpy [y: y+h, x: x+w]) ids.append (id) return face Օրինակներ, ID- ների տպում ("\ n [INFO] Training სახეեր. Դա կտևի մի քանի վայրկյան: Սպասեք …") դեմքեր, ids = getImagesAndLabels (path) ճանաչող. ուսուցում (դեմքեր, np.array (id)) # Պահպանեք մոդելը trainer/trainer.yml ճանաչող.գրեք ('trainer/trainer.yml') # ճանաչիչ. պահեք () աշխատեց Mac- ում, բայց ոչ Pi # Տպեք մարզված դեմքերի թիվը և ավարտեք ծրագրի տպումը ("\ n [INFO] {0} վերապատրաստված դեմքեր: itingրագրից դուրս գալու".format (len (np.unique (id))))

Հաստատեք, արդյոք ունեք PIL գրադարանը տեղադրված ձեր Rpi- ում: Եթե ոչ, գործարկեք ստորև բերված հրամանը տերմինալում.

pip տեղադրել բարձ

Որպես ճանաչող, մենք կօգտագործենք LBPH (LOCAL BINARY PATTERNS HISTOGRAMS) դեմքի ճանաչիչ, որը ներառված է OpenCV փաթեթում: Մենք դա անում ենք հետևյալ տողում.

ճանաչող = cv2.face. LBPHFaceRecognizer_create ()

«GetImagesAndLabels (ուղի)» գործառույթը կտանի բոլոր լուսանկարները գրացուցակում ՝ «dataset/» ՝ վերադարձնելով 2 զանգված ՝ «Ids» և «դեմքեր»: Այդ զանգվածների մուտքով մենք «կսովորեցնենք մեր ճանաչողին».

ճանաչող. գնացք (դեմքեր, ID)

Արդյունքում, «trainer.yml» անունով ֆայլը կպահվի մարզիչների գրացուցակում, որը նախկինում ստեղծվել էր մեր կողմից:

Վերջ! Ես ներառեցի վերջին տպագիր հայտարարությունը, որտեղ ես ցույց տվեցի հաստատման համար, այն մարզված օգտվողների դեմքերը:

Ամեն անգամ, երբ կատարում եք 1 -ին փուլը, 2 -րդ փուլը նույնպես պետք է գործարկվի

Քայլ 7: Recանաչիչ

Ճանաչող
Ճանաչող
Ճանաչող
Ճանաչող

Այժմ մենք հասանք մեր նախագծի վերջին փուլին: Այստեղ մենք ֆիքսելու ենք մեր դեմքի թարմ դեմքը, և եթե այս անձը նախկինում զբաղված լիներ նրա դեմքով և վարժեցվեր, մեր ճանաչողը կկատարի «կանխատեսում» ՝ վերադարձնելով իր ID- ն և ինդեքսը ՝ ցույց տալով, թե ճանաչողը որքան վստահ է այս խաղին:

Եկեք ներբեռնենք 3 -րդ փուլի python սցենարը իմ GitHub- ից ՝ 03_face_recognition.py:

ներմուծել cv2

ներմուծել numpy as np ներմուծում os ճանաչիչ = cv2.face. LBPHFaceRecognizer_create () αναγνώիչ. ընթերցող ('trainer/trainer.yml') cascadePath = "haarcascade_frontalface_default.xml" faceCascade = cv2. CascadeClassifier (cascadePath); font = cv2. FONT_HERSHEY_SIMPLEX #iniciate id counter id = 0 # id- ների հետ կապված անուններ. օրինակ ==> Marcelo: id = 1 և այլն անուններ = ['Ոչ մեկը', 'Մարսելո', 'Պաուլա', 'Ilza', 'Z ',' W '] # Նախաստեղծել և սկսել իրական ժամանակի տեսանկարահանման տեսախցիկ = cv2. VideoCapture (0) cam.set (3, 640) # set video widht cam.set (4, 480) # սահմանել տեսանյութի բարձրություն # Սահմանել պատուհանի նվազագույն չափը ճանաչվել որպես դեմք minW = 0.1*cam.get (3) minH = 0.1*cam.get (4) իսկ True: ret, img = cam.read () img = cv2.flip (img, -1) # Ուղղահայաց մոխրագույն = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) դեմքեր = faceCascade.detectMultiScale (մոխրագույն, scaleFactor = 1.2, minNeighbors = 5, minSize = (int (minW), int (minH)),) (x, y), w, h) դեմքերում ՝ cv2. ուղղանկյուն (img, (x, y), (x+w, y+h), (0, 255, 0), 2) id, վստահություն = ճանաչող: կանխատեսել (մոխրագույն [y: y+h, x: x+w]) # Ստուգեք, թե արդյոք վստահությունը նրանցից պակաս է 100 ==> "0" -ը կատարյալ համընկնում է, եթե (վստահություն <100): id = անուններ [id] վստահություն = "{0}% ".ֆորմատ (կլոր (100 - վստահություն)) այլ: id =" անհայտ "վստահություն =" {0}%": ձևաչափ (շրջան (100 - կոնֆ նշան)) cv2.putText (img, str (id), (x+5, y-5), տառատեսակ, 1, (255, 255, 255), 2) cv2.putText (img, str (վստահություն), (x+5, y+h-5), տառատեսակ, 1, (255, 255, 0), 1) cv2.imshow («տեսախցիկ», img) k = cv2.waitKey (10) & 0xff # Սեղմեք «ESC» տեսահոլովակից դուրս գալու համար, եթե k == 27: ընդմիջում # Մի փոքր մաքրեք տպագրությունը ("\ n [INFO] itingրագրից և մաքրման միջոցներից դուրս գալու մասին] cam.release () cv2.destroyAllWindows ()

Մենք այստեղ ընդգրկում ենք նոր զանգված, ուստի կցուցադրենք «անուններ» ՝ համարակալված ID- ների փոխարեն.

անուններ = ['Ոչ մեկը', 'Մարսելո', 'Պաուլա', 'Իլզա', 'Z', 'W']

Այսպիսով, օրինակ ՝ Մարսելոն կամենում է id = 1 օգտագործողին; Պաուլա ՝ id = 2 և այլն:

Հաջորդը, մենք կհայտնաբերենք դեմք, նույնը, ինչ արեցինք նախկինում haasCascade դասակարգչի դեպքում: Ունենալով հայտնաբերված դեմք, մենք կարող ենք զանգահարել վերը նշված կոդի ամենակարևոր գործառույթը.

id, վստահություն = ճանաչող: կանխատեսում (դեմքի մոխրագույն հատված)

Recognizer.predict (), որպես պարամետր կվերցնի վերլուծության ենթակա դեմքի գրավված հատվածը և կվերադարձնի դրա հավանական սեփականատիրոջը ՝ նշելով դրա ID- ն և ճանաչման ճանաչման որքա՞ն վստահություն այս համընկնումի նկատմամբ:

Նկատի ունեցեք, որ վստահության ինդեքսը կվերադառնա «զրո», եթե այն համարվի կատարյալ համընկնում

Եվ վերջապես, եթե ճանաչողը կարողանար գուշակել դեմք, մենք տեքստ ենք դնում պատկերի վրա ՝ հավանական id- ով, և որքան է կազմում % հավանականության մեջ «հավանականությունը», որ համընկնումը ճիշտ է («հավանականություն» = 100 - վստահության ինդեքս): Եթե ոչ, ապա «անհայտ» պիտակ է դրվում դեմքին:

Ստորև բերված gif- ով ՝ արդյունքով.

Պատկեր
Պատկեր

Վերոնշյալ նկարի վրա ես ցույց եմ տալիս այս նախագծով կատարված որոշ թեստեր, որտեղ ես նաև օգտագործել եմ լուսանկարներ ՝ ստուգելու համար, թե արդյոք ճանաչողն աշխատում է:

Քայլ 8: Եզրակացություն

Եզրակացություն
Եզրակացություն

Ինչպես միշտ, ես հույս ունեմ, որ այս նախագիծը կարող է օգնել ուրիշներին գտնել իրենց ճանապարհը դեպի էլեկտրոնիկայի հետաքրքիր աշխարհ:

Մանրամասների և վերջնական ծածկագրի համար այցելեք իմ GitHub ավանդապահ ՝ OpenCV-Face-Recognition

Լրացուցիչ նախագծերի համար այցելեք իմ բլոգը ՝ MJRoBot.org

Ստորև ներկայացնում ենք ապագա ձեռնարկի ակնարկը, որտեղ մենք ուսումնասիրելու ենք «դեմքի ավտոմատ հետևում և դեմքի հայտնաբերման այլ մեթոդներ».

Պատկեր
Պատկեր

Սալուդոս աշխարհի հարավից:

Կհանդիպենք իմ հաջորդ հրահանգի մեջ:

Շնորհակալություն, Մարսելո

Խորհուրդ ենք տալիս: