Բովանդակություն:
- Քայլ 1: BoM - նյութի հաշիվ
- Քայլ 2. OpenCV 3 փաթեթի տեղադրում
- Քայլ 3: Փորձարկեք ձեր տեսախցիկը
- Քայլ 4: Դեմքի հայտնաբերում
- Քայլ 5: Տվյալների հավաքում
- Քայլ 6: Մարզիչ
- Քայլ 7: Recանաչիչ
- Քայլ 8: Եզրակացություն
Video: Իրական ժամանակի Դեմքի ճանաչում. Անընդհատ նախագիծ ՝ 8 քայլ (նկարներով)
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:51
OpenCV- ն ուսումնասիրող իմ վերջին ձեռնարկում մենք սովորեցինք ԱՎՏՈՄԱՏԱԿԱՆ ՎԻIONԻԱՆԻ ՕԲՅԵԿՏԻ ԳՆԱՀԱՏՈՄ: Այժմ մենք կօգտագործենք մեր PiCam- ը ՝ իրական ժամանակում դեմքերը ճանաչելու համար, ինչպես կարող եք տեսնել ստորև.
Այս նախագիծը կատարվեց այս ֆանտաստիկ «Բաց կոդով համակարգչային տեսողության գրադարանի» ՝ OpenCV- ի միջոցով: Այս ձեռնարկի վրա մենք կկենտրոնանանք Raspberry Pi- ի վրա (այսինքն ՝ Raspbian որպես ՕՀ) և Python- ի վրա, բայց ես նաև փորձարկեցի կոդը իմ Mac- ում և այն նույնպես լավ է աշխատում: OpenCV- ն նախատեսված է հաշվողական արդյունավետության համար և մեծ ուշադրություն է դարձնում իրական ժամանակի ծրագրերին: Այսպիսով, դա կատարյալ է իրական ժամանակում դեմքի ճանաչման համար `տեսախցիկով:
Դեմքի ճանաչման վերաբերյալ ամբողջական նախագիծ ստեղծելու համար մենք պետք է աշխատենք 3 շատ հստակ փուլերի վրա.
- Դեմքի հայտնաբերում և տվյալների հավաքում
- Սովորեցրեք ճանաչողին
- Դեմքի ճանաչում
Ստորև բերված բլոկ -դիագրամը վերսկսում է այդ փուլերը.
Քայլ 1: BoM - նյութի հաշիվ
Հիմնական մասեր.
- Raspberry Pi V3 - 32,00 ԱՄՆ դոլար
- 5 մեգապիքսել 1080p սենսոր OV5647 մինի տեսախցիկի վիդեո մոդուլ - 13,00 ԱՄՆ դոլար
Քայլ 2. 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
Ստորև ներկայացնում ենք ապագա ձեռնարկի ակնարկը, որտեղ մենք ուսումնասիրելու ենք «դեմքի ավտոմատ հետևում և դեմքի հայտնաբերման այլ մեթոդներ».
Սալուդոս աշխարհի հարավից:
Կհանդիպենք իմ հաջորդ հրահանգի մեջ:
Շնորհակալություն, Մարսելո
Խորհուրդ ենք տալիս:
Opencv դեմքի հայտնաբերում, ուսուցում և ճանաչում. 3 քայլ
Opencv դեմքի հայտնաբերում, ուսուցում և ճանաչում. OpenCV- ը բաց կոդով համակարգչային տեսադարան է, որը շատ տարածված է պատկերի մշակման հիմնական առաջադրանքների կատարման համար, ինչպիսիք են ՝ պղտորումը, պատկերի միաձուլումը, պատկերի, ինչպես նաև տեսանյութի որակի բարձրացումը, շեմը և այլն: Բացի պատկերի մշակումից, դա ապացուցում է
Դեմքի ճանաչում և նույնականացում - Arduino Face ID ՝ օգտագործելով OpenCV Python և Arduino. 6 քայլ
Դեմքի ճանաչում և նույնականացում | Arduino Face ID ՝ օգտագործելով OpenCV Python և Arduino. Դեմքի ճանաչում AKA face ID- ն մեր օրերում բջջային հեռախոսների ամենակարևոր հատկություններից է: Այսպիսով, ես ունեի մի հարց " կարո՞ղ եմ ունենալ դեմքի ID իմ Arduino նախագծի համար " և պատասխանը այո է … Իմ ճանապարհորդությունը սկսվեց հետևյալ կերպ. Քայլ 1. Մուտք դեպի մեզ
Դեմքի ճանաչում պրակտիկայում. 21 քայլ
Դեմքի ճանաչում պրակտիկայում. Սա այն առարկան է, որով ես այնքան հրապուրված եմ, որ ստիպում է ինձ քնել: Համակարգչային տեսլականը, օբյեկտների և մարդկանց հայտնաբերումը նախապես պատրաստված մոդելի միջոցով
Իրական ժամանակի դեմքի հայտնաբերում ազնվամորու վրա Pi-4: 6 քայլեր (նկարներով)
Իրական ժամանակի դեմքի հայտնաբերում RaspberryPi-4- ում. Այս հրահանգում մենք պատրաստվում ենք իրական ժամանակում դեմքի հայտնաբերում կատարել Raspberry Pi 4-ում Shunya O/S- ի միջոցով `օգտագործելով Shunyaface գրադարանը: Դուք կարող եք հասնել RaspberryPi-4- ի վրա 15-17-ի հայտնաբերման շրջանակի արագությանը ՝ հետևելով այս ձեռնարկին
Դեմքի հայտնաբերում+ճանաչում. 8 քայլ (նկարներով)
Դեմքի հայտնաբերում+ճանաչում. Սա պարզ օրինակ է ՝ տեսախցիկից OpenCV- ով դեմքի հայտնաբերման և ճանաչման գործարկման: ՈEՇԱԴՐՈԹՅՈՆ. ԱՅՍ JՐԱԳԻՐԸ ԿԱՏԱՐԵԼ ԵՄ ՍԵՆՍՈՐ ՄՐTՈՅԹԻ ՀԱՄԱՐ և ՕԳՏԱԳՈՐՈՄ ԵՄ ԿԱՄԵՐԱՅԻՆ ՝ որպես սենսոր ՝ հետևելու և ճանաչելու դեմքերին: Այսպիսով, մեր նպատակը Այս նստաշրջանում 1. Տեղադրեք Anaconda