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 으로 나눠주면 그 비율이 나옵니다.
그후 졸음에 대한 평균값을 측정후 기준으로 잡아준다면 그값 보다 작다면 졸음운전으로 판단하면됩니다 .
자세한 사용 코드는 직접적으로 올리지 않았습니다. 궁금하신 사항이 있다면 따로 댓글남겨주시면 답변 달아드리겠습니다 .
'Python' 카테고리의 다른 글
[Python] OpenCV를 이용한 imread중 image 한글파일 경로 입력시 문제와 해결방안. (0) | 2018.11.29 |
---|---|
[Python OpenCV] OpenCV 간단한 정리. (0) | 2018.08.31 |
[Python] Pycharm debug error (0) | 2018.08.06 |
[Python] Centos7 에서 Conda 설치하기 (0) | 2018.06.22 |
[Python] SIngleQuote , DoubleQuote의 사용 방법 및 응용 (0) | 2018.06.18 |
댓글