โ—๐ŸŒ ๋ณด๊ณ  ๋”ฐ๋ผํ•œ ํฌ์ŠคํŒ… : Marcelo ์•„์ €์”จ ๋ธ”๋กœ๊ทธ


๐Ÿ›  ์ค€๋น„๋ฌผ

  • ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด4
  • ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด ์นด๋ฉ”๋ผ ๋ชจ๋“ˆ

  • openCV ์„ค์น˜ (์„ค์น˜ ์ •๋ณด Link)
  • python3 ์ž‘์—… ํ™˜๊ฒฝ
  • haarcascade ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ


โญ๏ธ ๋ชฉํ‘œ

ย  openCV์— ๊ด€๋ จ๋œ ์˜คํ”ˆ์†Œ์Šค๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ๋‚ด ์–ผ๊ตด ์ธ์‹ ํ™•์ธํ•˜๊ธฐ
โœ”๏ธ openCV ๋“ฑ ๊ด€๋ จ ํŒจํ‚ค์ง€๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์น˜๋˜์—ˆ๋Š”๊ฐ€
โœ”๏ธ ์ฝ”๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”๊ฐ€
โœ”๏ธ ๋‚ด ์–ผ๊ตด์„ ๋ผ์ฆˆ๋ฒ ๋ฆฌ๊ฐ€ ์•Œ์•„๋จน๋‚˜?!


์‚ฌ์‹ค ์ค€๋น„๋ฌผ๋งŒ ์žˆ์œผ๋ฉด ๋œ ๊ฑฐ๋ผ ๋ณธ๋‹ค
์ง„์งœ์ž„

๋ณดํ†ต ๋ฌธ์ œ๋Š” ํŒจํ‚ค์ง€ ์„ค์น˜์—์„œ ๋ฐœ์ƒํ•œ๋‹ค

๋ชจ๋“ˆ ๋กœ๋“œ์— ๊ด€ํ•œ ๋ฌธ์ œ๋Š” ์ตœ์ƒ๋‹จ ์›๋ณธ ๊ธ€์—์„œ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•˜์ง€๋งŒ ํŒจํ‚ค์ง€ ์˜์กด์„ฑ์ด๋‚˜ ๋ฒ„์ „ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ณจ์น˜์•„ํ”„๋‹ค

ํ˜น์‹œ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด

could not open moddep file '/lib/modules/4.19.75-v7l+/modules.dep.bin'

๐ŸŒ ์—ฌ๊ธฐ๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค

openCV์™€ Python์„ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ๋น„๊ต์  ๊ฐ„๋‹จํ•˜์ง€๋งŒ
haarcascade๋ฅผ ๋ฐ›๋Š”๋‹ค๊ณ  ํ•  ๋•Œ ์ •๋ง์ •๋ง ๋‰ด๋น„๋ผ๋ฉด ํ—ค๋งฌ ์ˆ˜ ์žˆ๋‹ค
์ฐธ๊ณ ๋กœ ๋‚œ ์—„์ฒญ ํ—ค๋งธ๋‹ค

๐Ÿ“ haarcascade๋Š” ๊ฐ์ฒด ์ธ์‹๊ณผ ํ•™์Šต์— ๊ด€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค
์ด๋ฅผ ํ†ตํ•ด ์‚ฌ๋žŒ์˜ ์–ผ๊ตด์ด๋‚˜ ๋ˆˆ๋™์ž ์ž…์ˆ  ๋“ฑ์„ openCV๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค

haarcascade๋Š” ์ง์ ‘ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š”๊ฒŒ ํŽธํ•˜๋‹ค
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์— ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ์™์™ ๊ณจ๋ผ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
ํ•œ๊บผ๋ฒˆ์— ๋ฐ›์•„๋‘๋„๋ก ํ•˜์ž
๐Ÿ“Œ $ git clone https://github.com/opencv/opencv.git
์„ค์น˜๋˜๊ธธ ์›ํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์œ„์˜ ๋ช…๋ น์–ด๋กœ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค
์ง์ ‘ ๊นƒํ—ˆ๋ธŒ์—์„œ ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋‹ค
๋‹ค์šด๋กœ๋“œ๋Š” ์–ด๋ ค์šด ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ๊ผญ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•ด๋‘์ž


์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋๋‹ค๋ฉด ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ํŒŒ์ผ๋กœ ์ž‘์„ฑํ•œ๋‹ค

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
while(True):
    ret, frame = cap.read()
    frame = cv2.flip(frame, -1) # Flip camera vertically
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    cv2.imshow('frame', frame)
    cv2.imshow('gray', gray)
    
    k = cv2.waitKey(30) & 0xff
    if k == 27: # press 'ESC' to quit
        break
cap.release()
cv2.destroyAllWindows()

์ถœ์ฒ˜: Marcelo ์•„์ €์”จ ๋ธ”๋กœ๊ทธ

์ด ์ฝ”๋“œ๋ฅผ ๐Ÿ“Œ python <ํŒŒ์ผ์ด๋ฆ„>.py ๋กœ ์‹คํ–‰ํ•˜๋ฉด
์ปฌ๋Ÿฌ ํ™”๋ฉด๊ณผ ํ‘๋ฐฑ ํ™”๋ฉด์ด ๋™์‹œ์— ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค


ํ™”๋ฉด์ด ๋‚˜์˜ค๊ฒŒ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์ด์ œ ์–ผ๊ตด์„ ์ธ์‹ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ๊ฒ ๋‹ค

๐Ÿ’ก ์–ผ๊ตด(๋˜๋Š” ๋ชจ๋“  ๋ฌผ์ฒด)์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€
Haar Cascade classifier ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค

์–ผ๊ตด๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ์ž์‹ ์ด ์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ธ์‹ ์‹œํ‚ค๋ ค๋ฉด ํ›ˆ๋ จ์ด ํ•„์š”ํ•œ๋ฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€
๐ŸŒ์—ฌ๊ธฐ์—์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค

๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์–ผ๊ตด์„ ์ธ์‹ํ•˜์—ฌ ์‚ฌ๊ฐํ˜• ๋ฐ•์Šค๋กœ ์žก์•„์ฃผ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค
์ฝ”๋“œ ์ดˆ๋ฐ˜์˜ faceCascade ๋ณ€์ˆ˜์˜ ๊ฒฝ๋กœ๋Š” ์ž์‹ ์ด ๋งŒ๋“  ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ˆ˜์ •ํ•ด์ค€๋‹ค

โ—โ— ์ด ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ฒฝ๋กœ์—
haarcascade_frontalface_default.xml ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์—ฌ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค
์ด ํŒŒ์ผ์€ ๋ฏธ๋ฆฌ ๋‹ค์šด ๋ฐ›์•„๋†“์€ harrCascadeํด๋”์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค

'''
Haar Cascade Face detection with OpenCV  
    Based on tutorial by pythonprogramming.net
    Visit original post: https://pythonprogramming.net/haar-cascade-face-eye-detection-python-opencv-tutorial/  
Adapted by Marcelo Rovai - MJRoBot.org @ 7Feb2018 
'''

import numpy as np
import cv2

# multiple cascades: https://github.com/Itseez/opencv/tree/master/data/haarcascades
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)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(
        gray,
        
        scaleFactor=1.2,
        minNeighbors=5
        ,     
        minSize=(20, 20)
    )

    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]
        

    cv2.imshow('video',img)

    k = cv2.waitKey(30) & 0xff
    if k == 27: # press 'ESC' to quit
        break

cap.release()
cv2.destroyAllWindows()

์ถœ์ฒ˜: Marcelo ์•„์ €์”จ ๋ธ”๋กœ๊ทธ

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ
faceCascade = cv2.CascadeClassifier('Cascades/haarcascade_frontalface_default.xml')

๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค๋ฉด haarcascade_frontalface_default.xml ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋‹ˆ ํ™•์ธํ•ด์„œ ๋ฐ”๋กœ ์žก๋Š”๋‹ค

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฝ”๋“œ๋ฅผ ๐Ÿ“Œ python <ํŒŒ์ผ์ด๋ฆ„>.py ๋กœ ์‹คํ–‰ํ•˜๋ฉด

ํŒŒ๋ž€์ƒ‰ ์‚ฌ๊ฐํ˜• ์•ˆ์— ์–ผ๊ตด์„ ์žก์•„์ค€๋‹ค
์‚ฌ๋žŒ ์–ผ๊ตด ์ทจ๊ธ‰์„ ๋‹นํ•ด์„œ ๋‹คํ–‰์ด๋‹ค


์ด์ œ ๋‚ด ์–ผ๊ตด์„ ๋ณด๋ฉด ํŠน์ •์ธ์œผ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก
๋‚ด ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ณ  ์‚ฌ์ง„์„ ์ฐ์–ด์„œ ํ•™์Šต์‹œํ‚ฌ ๊ฒƒ์ด๋‹ค

๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ ํ•˜๋‚˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค
ํ„ฐ๋ฏธ๋„์—์„œ๋“  ํŒŒ์ผ๋งค๋‹ˆ์ €์—์„œ๋“  ์•„๋ฌดํŠผ ์›ํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค

๋‚˜๋Š” ์–Œ์ „ํžˆ Marcelo์•„์ €์”จ๋ฅผ ๋”ฐ๋ผํ–ˆ๋‹ค
๐Ÿ“Œ mkdir FacialRecognitionProject

๊ทธ๋ฆฌ๊ณ  ํ•™์Šต์‹œํ‚ฌ ๋‚ด ์–ผ๊ตด ์‚ฌ์ง„์„ ์ €์žฅํ•ด๋‘˜ ํด๋”๋ฅผ ํ•˜์œ„ํด๋”๋กœ ๋งŒ๋“ ๋‹ค
๐Ÿ“Œ mkdir dataset

~/FacialRecognitionProject/dataset
์š”๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ์ƒํƒœ์ด๋‹ค

๋‹ค์Œ์˜ ์ฝ”๋“œ๋Š”
dataset์—์„œ ๋‹ค์‹œ ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์˜ฌ๋ผ๊ฐ€์„œ
~/FacialRecognitionProject ์— ์ƒ์„ฑํ•œ๋‹ค

โ—โ— ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ haarcascade_frontalface_default.xml ํŒŒ์ผ์„ ~/FacialRecognitionProject ์— ๋„ฃ์–ด์ฃผ์ž
๋ณต์‚ฌํ•˜๋Š” ๊ฒŒ ํŽธํ•œ ๊ฒƒ ๊ฐ™๋‹ค

์—ฌ๊ธฐ์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ faceCascade ๋ณ€์ˆ˜์˜ ๊ฒฝ๋กœ๋ฅผ ์ž์‹ ์ด ์ƒ์„ฑํ•œ ๊ฒฝ๋กœ์— ๋งž๊ฒŒ ์ž˜ ์ˆ˜์ •ํ•ด์ค€๋‹ค

import numpy as np
import 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)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(
        gray,     
        scaleFactor=1.2,
        minNeighbors=5,     
        minSize=(20, 20)
    )
    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]  
    cv2.imshow('video',img)
    k = cv2.waitKey(30) & 0xff
    if k == 27: # press 'ESC' to quit
        break
cap.release()
cv2.destroyAllWindows()

์ถœ์ฒ˜: Marcelo ์•„์ €์”จ ๋ธ”๋กœ๊ทธ

์ด ์ฝ”๋“œ๋ฅผ ๐Ÿ“Œ python <ํŒŒ์ผ์ด๋ฆ„>.py ๋กœ ์‹คํ–‰ํ•˜๋ฉด

์ด๋Ÿฐ ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜์˜จ๋‹ค
user id๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š”๋ฐ ์—ฌ๊ธฐ์— ๋„ฃ์„ id๋Š” ์ˆซ์ž์ด๋‹ค
์–ผ๊ตด๊ณผ ๋งค์น˜ํ•  ์ด๋ฆ„์— ๋Œ€ํ•œ ๋ฐฐ์—ด์„ ๋‹ค์Œ ํŒŒ์ผ์—์„œ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค
์ง€๊ธˆ์€ ์•Œ๊ธฐ ์‰ฝ๊ฒŒ 1๋กœ ๋„ฃ์–ด์„œ ์‹คํ–‰ํ•œ๋‹ค

1์„ ์ž…๋ ฅํ•˜๋ฉด

์บก์ณ๊ฐ€ ์‹œ์ž‘๋˜๋‹ˆ ์ž ์‹œ ๋™์•ˆ ์นด๋ฉ”๋ผ๋ฅผ ์‘์‹œํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋ผ๋Š” ์•ˆ๋‚ด๊ฐ€ ๋‚˜์˜จ๋‹ค
์ง์ ‘ ํ•ด๋ณด๋‹ˆ ๋งˆ์Šคํฌ๋ฅผ ์“ด ์ƒํƒœ์—์„œ๋Š” ์–ผ๊ตด์ด ์ž˜ ์ธ์‹๋˜์ง€ ์•Š๋Š”๋‹ค
์•ˆ๊ฒฝ๋„ ์ธ์‹์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋‹ค ๋‚ด๋ ค ๋†“๊ณ (?) ์นด๋ฉ”๋ผ๋ฅผ ์ณ๋‹ค ๋ด์•ผ ํ•œ๋‹ค

์•„๋ฌดํŠผ ์ด ์ž‘์—…์ด ๋ฌด์‚ฌํžˆ ๋๋‚ฌ๋‹ค๋ฉด

์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค
user id๋ฅผ '1'๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 1.1, 1.2, 1.3 ~ ์ˆœ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค
์ด ์‚ฌ์ง„๋“ค์„ ํ†ตํ•ด ์ฝ”๋“œ๊ฐ€ ๋‚ด ์–ผ๊ตด์„ ํ•™์Šตํ•˜๊ณ  ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค


ํ•™์Šต ์ž์ฒด๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ RUN ํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚œ๋‹ค
๊ทธ ์ „์— ํ•™์Šต์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  trainer ํด๋”๋ฅผ ๋งŒ๋“ ๋‹ค
๐Ÿ“Œ mkdir trainer

๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  Run์‹œํ‚ฌ ๊ฒƒ์ธ๋ฐ

โ—โ— ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ haarcascade_frontalface_default.xml ํŒŒ์ผ์„ ~/FacialRecognitionProject ์— ๋„ฃ์–ด์ฃผ์ž
์ฝ”๋“œ ๋‚ด์˜ ํŒŒ์ผ ๊ฒฝ๋กœ๋„ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณผ ๊ฒƒ!

import cv2
import numpy as np
from PIL import Image
import os
# Path for face image database
path = 'dataset'
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");
# function to get the images and label data
def getImagesAndLabels(path):
    imagePaths = [os.path.join(path,f) for f in os.listdir(path)]     
    faceSamples=[]
    ids = []
    for imagePath in imagePaths:
        PIL_img = Image.open(imagePath).convert('L') # convert it to grayscale
        img_numpy = np.array(PIL_img,'uint8')
        id = int(os.path.split(imagePath)[-1].split(".")[1])
        faces = detector.detectMultiScale(img_numpy)
        for (x,y,w,h) in faces:
            faceSamples.append(img_numpy[y:y+h,x:x+w])
            ids.append(id)
    return faceSamples,ids
print ("\n [INFO] Training faces. It will take a few seconds. Wait ...")
faces,ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))
# Save the model into trainer/trainer.yml
recognizer.write('trainer/trainer.yml') # recognizer.save() worked on Mac, but not on Pi
# Print the numer of faces trained and end program
print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids))))

์ถœ์ฒ˜: Marcelo ์•„์ €์”จ ๋ธ”๋กœ๊ทธ

๋งŒ์•ฝ PIL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ ์ด ์ฝ”๋“œ์— ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด

๐Ÿ“Œ pip install pillow

๋ช…๋ ์–ด๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•ด์ฃผ๋„๋ก ํ•œ๋‹ค

์ฝ”๋“œ๊ฐ€ ๋ฌด๋‚œํ•˜๊ฒŒ ์ž‘๋™๋˜์—ˆ๋‹ค๋ฉด trainer ํด๋”์— ๋ญ”๊ฐ€๊ฐ€ ์ƒ๊ฒผ์„ ๊ฒƒ์ด๋‹ค
๋Œ€์ถฉ ํ•™์Šต๋œ ๋‚ด์šฉ์ด ์ €์žฅ๋œ ํŒŒ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๊ฒ ๋‹ค


์ด์ œ ์ด๊ฑธ ํ† ๋Œ€๋กœ ํ•ด์„œ ๋‚ด ์–ผ๊ตด์„ ์•Œ์•„๋ณด๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค
ํ•™์Šต๋œ ๋‚ด์šฉ์ด ์ €์žฅ๋œ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™€์„œ ๊ทธ๊ฑธ ํ† ๋Œ€๋กœ ๋‚ด ์–ผ๊ตด์„ ์ธ์‹ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋Œ์•„๊ฐ„๋‹ค

โšก๏ธ ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณตํ•˜๋Š” ๋‚ด์šฉ์ด์ง€๋งŒ
haarcascade_frontalface_default.xml ์ด ๋†ˆ์˜ ๊ฒฝ๋กœ๋ฅผ ์ฃผ์˜ํ•˜์ž

์•„๋ž˜์— ๋‚˜์˜ค๋Š” ์ฝ”๋“œ์˜ ์ดˆ๋ฐ˜๋ถ€ ๋ณ€์ˆ˜ ๋ถ€๋ถ„์„ ๋ณด๋ฉด names๋ผ๋Š” ๋ฐฐ์—ด์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค

๐Ÿงฉ 12) names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']

์•„๊นŒ์ „์— ์šฐ๋ฆฌ๋Š” id๋ฅผ '1'๋กœ ์„ค์ •ํ–ˆ์—ˆ๋‹ค
๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ ์“ฐ๊ธฐ ์œ„ํ•จ์ด์—ˆ๋‹ค
์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ๋ธ”๋กœ๊ทธ์— ์ž‘์„ฑํ•˜์‹  Marcelo์•„์ €์”จ์˜ ์ด๋ฆ„์ด
๋ฐฐ์—ด์˜ 1๋ฒˆ ์ธ๋ฑ์Šค์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

๋‚˜๋Š” Marcelo์•„์ €์”จ ๋•๋ถ„์— ์ด๋Ÿฐ ์žฌ๋ฐŒ๋Š” ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ๊ธด ํ•˜์ง€๋งŒ
๊ทธ๋ ‡๋‹ค๊ณ  ๋‚ด๊ฐ€ Marcelo์•„์ €์”จ๊ฐ€ ๋œ ๊ฑด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— user id ๋˜๋Š” ๋ฐฐ์—ด์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•ด์„œ ๋‚ด ์ด๋ฆ„์„ ์“ธ ๊ฑฐ์ž„

import cv2
import numpy as np
import os 
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
font = cv2.FONT_HERSHEY_SIMPLEX
#iniciate id counter
id = 0
# names related to ids: example ==> Marcelo: id=1,  etc
names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W'] 
# Initialize and start realtime video capture
cam = cv2.VideoCapture(0)
cam.set(3, 640) # set video widht
cam.set(4, 480) # set video height
# Define min window size to be recognized as a face
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)
while True:
    ret, img =cam.read()
    img = cv2.flip(img, -1) # Flip vertically
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    faces = faceCascade.detectMultiScale( 
        gray,
        scaleFactor = 1.2,
        minNeighbors = 5,
        minSize = (int(minW), int(minH)),
       )
    for(x,y,w,h) in faces:
        cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
        id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
        # Check if confidence is less them 100 ==> "0" is perfect match 
        if (confidence < 100):
            id = names[id]
            confidence = "  {0}%".format(round(100 - confidence))
        else:
            id = "unknown"
            confidence = "  {0}%".format(round(100 - confidence))
        
        cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
        cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)  
    
    cv2.imshow('camera',img) 
    k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
    if k == 27:
        break
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

์ถœ์ฒ˜: Marcelo ์•„์ €์”จ ๋ธ”๋กœ๊ทธ

์ด๊ฑธ ๋Œ๋ ค ๋ณด๋ฉด

๋‚ฎ์€ ์ˆ˜์น˜์ง€๋งŒ ๊ณ ๋ง™๊ฒŒ๋„ ์•Œ์•„์ค€๋‹ค
์ •๋ฉด์œผ๋กœ ์ดฌ์˜์„ ๋งŽ์ด ํ–ˆ๋Š”๋ฐ ์˜†๋ชจ์Šต์ด ๋‚˜์™€์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ๊ณ 
์ฒ˜์Œ dataset์„ ๋งŒ๋“ค ๋•Œ ์ •๋ฉด์ด ์ œ๋Œ€๋กœ ์žกํžˆ์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค

์•„๋ฌดํŠผ Marcelo์•„์ €์”จ ๋•์— ๋‚˜๋Š” ๋‚ด ์–ผ๊ตด์„ ์ธ์‹ํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค

๊ฝค ์žฌ๋ฐŒ์—ˆ๋‹ค

๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์˜ ์„ฑ๋Šฅ์ด ์กฐ๊ธˆ ๋” ์ข‹์•˜๋‹ค๋ฉด
์—ฌ๋Ÿฌ ์ธ์‹ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ์ข€ ์•„์‰ฝ๋‹ค

์•„๋ฌดํŠผ Marcelo์•„์ €์”จ์—๊ฒŒ ๊ฒฝ์˜๋ฅผ ํ‘œํ•˜๋ฉฐ ์‹ค์Šต ๋์ด๋‹ค

๋


โ—๐ŸŒ ํ•™์Šต ๋‚ด์šฉ ์ถœ์ฒ˜: ํ™ฉ๋ฅด์…€๋กœ ๋ธ”๋กœ๊ทธ

0๊ฐœ์˜ ๋Œ“๊ธ€