cv2 인공지능 snow 앱 만들어 보기

be1le·2022년 3월 19일
7

Open-CV

목록 보기
9/11
post-thumbnail

오늘은 실시간으로 얼굴의 좌표를 인지하여 스티커를 따라다니게 하는 실습을 해보려 한다!
불과 3~4년전 우리나라에서 엄청 유행했던 이런 실시간으로 스티커를 붙여주는 기술은 현재까지도 많은 사람들의 사랑을 받으면서 본인의 매력을 색다르게 표현하는데 도움을 주고있다. 오늘은 실생활에서도 많이 쓰이는 실시간 인공지능 snow앱을 개인단위에서 따라해 볼 수 있는 실습을 해보려 한다. 오늘도 크게 어려운 사항이 없으니 부담없이 읽어주기를 바란다!

패키지 부터 로드하기

여기서 우리가 처음 보는 패키지가 있다! 바로 dlib! dlib이란 무엇일까?

dlib이란?

이미지 처리, 선형대수 뿐만 아니라 다양한 머신러닝 알고리즘을 활용할 수 있는 dlib 라이브러리는 C++로 작성된 툴킷이지만, python 패키지로도 설치해 사용할 수 있다. 특히 HOG(Histogram of Oriented Gradients) 특성을 사용하여 얼굴 검출하는 기능이 많이 사용된다!

dlib을 이용하요 우리는 실습에서 눈코입의 위치를 알아낼 것이다!
그리고 실습을 하기전에 꼭 알아두어야 하는게 있는데 바로
"dlib 라이브러리는 C++로 작성된 툴킷이지만,"
이 부분이다. 그래서 CMake를 꼭 우리가 dlib을 사용하는 로컬에 다운로드를 받아주자!
pip install cmake 필수!
dlib에 대해서 더 자세히 파고들고 싶지만! 곧 딥러닝, 머신러닝 관련 라이브러리들을 하나씩 자세히 파고들어볼 생각이라, 후에 dlib 라이브러리 만을 블로깅 하겠다! (사실 이런 라이브러리 들의 함수를 조금만 소개해도 무한스크롤이 될것이라 생각한다.)

모델 로드하기

detector라는 변수에 dlib의 get_frontal_face_detector() 함수를 할당해 두었다. 이따 우리의 동영상이 플레이될때 실시간으로 얼굴의 좌표를 반환해주는 역할을 하게된다.

cap이라는 변수에는 cv2.VideoCature를 할당해 주었는데, cv2.VideoCature가 나온것으로 보아 이번 실습에도 video player코드가 나오겠다! 미리 생각해 볼 수 있다.

sticker_img 에는 png파일 하나를 cv2.imread로 읽고있는데 뒤에 옵션을 보면 cv2.IMREAD_UNCHANGED가 있는것으로 보아 png파일을 투명도가 포함된 채로 로드해야하는 구나 알 수 있다!

video player 코드 작성


벌써 4번째로 만나는 video player코드이다. 하지만 print문을보면
print("number of faces detected:", len(dets))
라는 구문이 있는데 이는 get_frontal_face_detector() 함수가 지금 몇개의 얼굴영역을 탐지하는지 보여달라는 것이다. 이러면 실시간으로 print문으로 찍혀나오게 된다.

이렇게 되면 실시간으로 몇명의 얼굴이 detect되는지도 우리가 확인 할 수 있다!

점을 찍어주자

이런식으로 for문을 돌면서 두점의 좌표를 받아와야 하는데 스티커의 종류에 따라 자연스럽게 보이기 위해서는 -40,-50,+40,+30 이렇게 직접 실행 시킨후 수정하는 부분이 필요하다.
그래야 더 자연스럽게 스티커가 따라 올것이다!

에외처리 및 적용하는 코드


스티커 이미지가 화면밖으로 나가버릴때는 try except문을 사용하여 예외처리를 하고 우리가 구한 얼굴의 좌표위에 우리가 이전에 실습했던 image_overlay 를 적용하는 코드가 함께 쓰여있는 부분이다! 이렇게 사실 이미지 처리는 중복되는 코드도 상당히 많고 중복되는 개념도 상당히 많다. 이 말은 즉

"한줄의 코드를 열개의 실습에 적용해 볼 수 있다."

내가 한줄의 코드라도 그냥 넘어가지 않고 완벽한 이해를 추구하게 되었던 cv2실습의 특징이다.
우리가 무작정 따라치는 한줄의 코드에도 얼마나 많은 라이브러리 개발자들의, 혹은 딥러닝 선조개발자들의 야근이 담겨져 있는걸까.. 라는 생각을 하게되었던 순간중 하나였다.

출력하기


video player를 사용하면 출력부 코드도 위처럼 고정되는 것을 우리는 알 수 있다. 한번 시작해 확인해 보도록 하자!

실시간 동영상 에서도 얼굴이미지를 잘 찾아내는 것을 알 수 있다!

글을 마치며

사실 얼마전에 정말 좋은 기업에서 좋은 제안을 받았는데, 작성자 스스로는 항상 배움에 목이마르기에 최우선 적으로 나에게 정말 좋은 기회라고 생각을 한다. 큰 책임감에는 큰 보상(배움) 또한 있을거라 생각하기에.. 정말로 놓치고 싶지 않은 기회이다. 부디 잘되었으면..! 한다 :)

profile
그저 그런 개발자가 되지 않겠습니다.

0개의 댓글