본문 바로가기
Python

[Python] Face_Landmark 관련 간단한 팁(?) 정리

by 신입같은 3년차 2018. 8. 9.



Python과 Camera를 이용하여 Face_Landmark관련 분석을 하던도중 정리할만한 자료가 있어서 글을 올렸습니다 .


Face_Landmark관련 모델은 shape_predictor_68_face_landmarks.dat를 사용하였습니다. 관련 lib는 dlib를 사용하였습니다.


dlib 및 모델에 관한 설명 은 패스하겠습ㅂ니다.


이미지를 보면 37 ~ 42 , 43 ~ 48 숫자들이 눈에 관한 번호라는것은 딱보면 알수있습니다. 


Face_Landmark로 유명한 자료는 졸음 방지 ( Drowsiness alert )를 볼수 있습니다 . 눈이 감겼는지에 따 운전자가 졸고있는지 유무를 파악할수 있기 때문입니다 .


python에서는 Imutils의 FACIAL_LANDMARKS_IDXS의 key값으로 좌 , 우측의 눈의 Index를 가져올수 있습니다 . 아래의 이미지처럼 말이죠



Key는 mouth , right_eyebrow , left_eyebrow , right_eye , left_eye , nose , jaw로 구성되어있으니 원하는 좌표를 얻고싶다면 key만 바꿔주시면 됩니다 . 


python에서는 68개의 점에서 눈에대한 Index를 통해 그눈에 대한 좌표만 얻어낼것입니다.


헌데 첫 68개의 점이미지를 보면 시작점이 37 , 43인데 왜 반환하는 값은 36 과 42인지 궁금하실수도 있을것입니다.


첫 이미지의 점은 기본적으로 1번부터 시작하지만 프로그래밍상에서의 번호는 0번부터 시작하기때문입니다.


따라서 python slice를 이용하여 잘라낼때는 shape68[ lStart , lEnd] , shape68[rStart : rEnd] 로 좌우측의 좌표를 구하시면됩니다.


그후 좌 우측 눈의 비율을 구하는 방식은


44 , 48 사이의 거리  45 , 47 사이의 거리를 더한후 43 , 46 사이의 거리 *2를 한후 나눠주면 됩니다 , 글로쓰니 어려워보이지만


정리하자면  (A + B) / (C * 2.0 )이라 보시면 됩니다.  


참고로 두점사이의 거리는 유클리드 거리 측정 공식을 사용하였습니다 . (euclidean distance 입니다.)


그러면 좌 우측 눈의 비율을 구할수 있습니다.


그러면 졸음의 비율은 양쪽눈이 다 감겼을때 존다는 가정이기 때문에 left Eye Average aspect ratio 와 right Eye Average aspect ratio를 더한후 2.0 으로 나눠주면 그 비율이 나옵니다.


그후 졸음에 대한 평균값을 측정후 기준으로 잡아준다면 그값 보다 작다면 졸음운전으로 판단하면됩니다 .



자세한 사용 코드는 직접적으로 올리지 않았습니다.  궁금하신 사항이 있다면 따로 댓글남겨주시면 답변 달아드리겠습니다 .



반응형

댓글