Real Time Facial Expression Recognition on Streaming Data
다른 글에서 맞춤 이미지의 얼굴 표현 인식을 작업했다.facial-expression-recognition-with-keras 게다가 이미지내 여러 얼굴을 탐지하고 이들 이미지에 동일한 얼굴 표현 인식 절차를 적용할 수 있다. 사실 우리는 연속적인 데이터 스트리밍에서 이를 할 수 있다. 이러한 추가는 커다란 노력없이 가능하다.
Face Detection
얼굴을 탐지하는 가장 쉬운 방법은 OpenCV의 haar cascade이다.
import cv2
face_cascade = cv2.CascadeClassifier('C:/ProgramData/Anaconda3/envs/tensorflow/Library/etc/haarcascades/haarcascade_frontalface_default.xml')
img = cv2.imread('/data/friends.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #transform image to gray scale
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
#print(faces)
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('img',img)
그외에도 SSD, HOG, MMOD, MTCNN 등이 있다.
다음 비디오에서 파이썬으로 어떻게 다른 얼굴 탐지기를 사용하는지를 볼 수 있다.
Streaming Data
꾸준한 이미지 대신 소스가 캠(cam)이라면 어떻게 될까요? 다시 OpenCV의 도움을 받을 수 있다.
cap = cv2.VideoCapture(0)
while(True):
ret, img = cap.read()
#apply same face detection procedures
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
if cv2.waitKey(1) == ord('q'): #press q to quit
break
cap.release()
cv2.destroyAllWindows()
소스가 무엇인지는 중요하지 않고 얼굴을 탐지할 수 있을 것 같다. 일단 탐지된 얼굴의 좌표가 계산되면 원본 이미지로부터 얼굴을 추출할 수 있다. 다음 코드는 위 코드의 faces 반복문에 넣어야 한다. 또한 얼굴 표정 인식을 위해 gray로 변환한 48 X 48 크기의 이미지가 필요하다.
detected_face = img[int(y):int(y+h), int(x):int(x+w)] #crop detected face
detected_face = cv2.cvtColor(detected_face, cv2.COLOR_BGR2GRAY) #transform to gray scale
detected_face = cv2.resize(detected_face, (48, 48)) #resize to 48x48
Expression Analysis
facial-expression-recognition-with-keras에서 얼굴 표정 인식을 위한 모델을 구축하고 훈련했다. 여기서도 동일한 사전구축된 모델과 가중치를 사용한다.
from keras.models import model_from_json
model = model_from_json(open("facial_expression_model_structure.json", "r").read())
model.load_weights('facial_expression_model_weights.h5') #load weights
이제 이미지에서 탐지된 얼굴의 표정을 분류할 수 있다.
img_pixels = image.img_to_array(detected_face)
img_pixels = np.expand_dims(img_pixels, axis = 0)
img_pixels /= 255
predictions = model.predict(img_pixels)
#find max indexed array
max_index = np.argmax(predictions[0])
emotions = ('angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral')
emotion = emotions[max_index]
cv2.putText(img, emotion, (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2)
Evaluation
이미지에 얼굴 탐지와 표정 인식 절차를 모두 적용한 것은 매우 성공적으로 보인다.
또한, 비디오 스트림 데이터에 동일한 절차를 적용하는 것도 매우 만족해 보인다.
스트림 데이터를 처리하고 이미지에서 얼굴을 탐지하기 위해 OpenCV를 사용했다. 그리고 이를 합쳐 캄정을 탐지하기 위해 스트림 데이터를 처리하였다. 이 프로젝트에서 사용된 소스코드는 여기에서 찾을 수 있다. 또한 사용한 사전구축된 모델과 사전훈련된 가중치 또한 동일한 저장소에 있다.
Bonus
여러분은 단지 몇줄의 파이썬 코드로 얼굴인식과 나이, 성별, 감정을 포함한 얼굴 특성 분석 모두를 적용할 수 있다. 얼굴 탐지, 얼굴 정렬 그리고 분석은 백그라운드에서 동작한다.
DeepFace는 파이썬을 위한 오픈소스 프레임워크로 PyPI에서 사용가능하다.