아버지를 변기로 인식하는 패륜 AI를 재현해봤다

2020.12.11

|

1205

*잠깐, 이 글을 소개해드리는 위시켓은 2019년 시밀러웹 방문자 수 기준, 국내 1위 IT아웃소싱 플랫폼입니다.
현재 8만 이상의 개발업체, 개발 프리랜서들이 활동하고 있으며, 무료로 프로젝트 등록이 가능합니다. 프로젝트 등록 한 번으로 여러 개발업체의 견적, 포트폴리오, 예상기간을 한 번에 비교해보세요:)

야 이 드라마에 나오는 거 진짜야?

드라마 스타트업 방영 이후
유독 이런 질문을 하는 지인들이 많아졌습니다.

도대체 뭐가 나오길래 그러는지 궁금해
드라마를 현재 2회째 정주행하고 있는데요.

음.. 다른 건 잘 모르겠고
“저 얼굴이 개발자”라는 게 가장 비현실적인 것 같습니다.
아니 무슨 개발자가 이렇게 생겼..

아차차..
물론 오늘 주제가 “남주혁이 어떻게 개발자인가”인건 아니고요,
“야 이 드라마에 나오는 거 진짜야?”에 대한 첫 번째 대답으로
“남도산의 프로토타입 따라 하기”를 준비해봤습니다.

최연소 수학올림피아드 출신 개발자 남도산 씨는
직접 개발한 사물 인식 카메라와 함께 등장합니다.

아버지의 지원을 받은 지 어언 3년째,
오늘은 “돈만 축내는 장손놈!”을 외치며 난입한
아버지를 꼭 설득시켜야 할텐데요.

아버지의 얼굴을 변기로 인식하는 장면

안타깝게도 사물인식 카메라가 사소한 오류를 내고 맙니다.
바로 아버지의 얼굴을 ‘변기’로 인식해버린 건데요.
분노에 찬 아버지는 ‘패륜 기계’의 제작자 남도산 씨를 몽둥이로 응징합니다.

흠..
흐음…

이 기계..
문득 만들고 싶다는 욕심이 생겼습니다.

그.래.서.
오늘의 주제는 얼굴 인식 AI 만들기입니다.
아 물론 이 AI는 적당히 멍청한 탓에
김원해 배우님의 얼굴만 변기로 인식할 겁니다.

패륜이 등장

설명의 편의를 위해
앞으로 이 AI의 이름을 “패륜이”라 부르겠습니다.
오늘 패륜이가 김원해 배우님을 알아볼 방법은 다음과 같은데요.

패륜 AI가 변기 및 얼굴을 인식하는 프로세스

1. 우선 (영상에서 변환된) 사진을 받으면
2. 패륜이는 사진 속에서 사람의 얼굴 찾아내고
3. 그 얼굴들을 미리 준비한 김원해 배우님 얼굴과 비교해서
4. 유사도가 높은 얼굴에 변기 표시를 할 겁니다.


라이브러리는 numpy, dlib, opencv를 활용했으며,
환경은 mac OS와 windows에서 로컬로 진행했습니다.

*본문에선 김원해 배우님을 “도산아빠”로 칭하겠습니다.

01
Video Capture / Writer

목표 : 비디오를 사진으로 나누기 & 사진을 비디오로 만들기
사용 라이브러리 : openCV

기본적으로 패륜이는 사진에서 얼굴을 찾아내는 친구입니다.
하지만 우리는 영상에서 이 기능을 수행해야 하죠.
즉, 영상에서 변기를 찾기 위해선
1. 영상을 사진으로 나눠 패륜이에게 전달하고,
2. 패륜이가 편집한 사진을 다시 영상으로 만들어줄 영상편집자가 필요합니다.
이번 장에서 소개할 영상편집자는
[openCV]의 [VideoCapture]와 [VideoWriter]입니다.

두 번째 장에서 진행할 “영상/사진 변환”

역할을 정리하자면,
1. [Video Capture]는 영상을 사진으로 변경하는 기능을 수행하며
2. 패륜이가 얼굴을 찾아 사진을 편집하면
3. [Video Writer]는 편집된 사진을 다시 영상으로 만들어줍니다.

우선 패륜이를 빼고, 영상 편집자가 제대로된 역할을 하는지 간단한 텍스트를 삽입하는 시험을 해봤는데요.
아래의 사진과 같이 영상편집이 잘 되는 걸 확인할 수 있었습니다.

video_tester.py의 결과물

이제 영상/사진 변환 과정을 완료했으니 본격적으로 패륜이에게 일을 맡길 수 있겠네요.

*비디오 편집 테스트 코드
video_tester.py

02-1
Face Detection

목표 : 사진 속에서 사람의 얼굴 찾아내기
사용 라이브러리 : dlib.get_frontal_face_detector,

사진을 받은 패륜이의 첫 번째 미션은 사진 속 ‘얼굴’을 찾는 겁니다.
하지만 아쉽게도 영상 속에는 얼굴 말고도 휴지부터 몽둥이, 컵라면, 테이블까지 다양한 물건들이 존재하죠.

두 번째 장에서 진행할 “얼굴 찾기”

따라서 패륜이가 가장 먼저 해야 할 일은 사진 속 다양한 물체로부터 ‘얼굴’을 구분해내는 것인데요.
이번 장에서 패륜이는 [dlib]의 [get_frontal_face_detector]라는 모델에게 도움을 받을겁니다.
이 모델은 HOG라는 방식을 사용해 얼굴을 인식하는데요.

출처: Hackevolve.com

HOG는 각 픽셀의 밝기 변화를 통해 얼굴의 윤곽을 찾아냅니다.
간단히 말하자면 오른쪽 사진처럼 단순화된 윤곽을 보며
이 물체가 얼굴인지 아닌지 확인하는 방법인 거죠.
(*분량 관계상 HOG에 대한 기술적 설명은 잘 정리된 블로그의 링크를 첨부하겠습니다)

그런데..
이렇게 찾아낸 얼굴들을 그대로 쓰자니
정보가 너무 많아 보입니다.

9만 개의 숫자가 3층으로 쌓여 만든 도산아빠의 사진

비교 기준으로 사용될 도산아빠의 사진만 해도 약 9만 개의 픽셀, 27만 개의 숫자로 구성될 정도죠.
아직 어린(?) 패륜이에게 27만 개는 너무 많은 숫자입니다.
심지어 굴곡이 없는 이마나 볼 쪽의 픽셀들은 얼굴을 구분에 별로 도움도 안 되는데 말이죠.
이 문제를 해결하기 위해 다음 장에서 할 일은 얼굴의 진짜 ‘특징’들을 뽑아내는 겁니다.

02-2
Landmark predict

목표 : 얼굴의 특징 뽑아내기
사용 라이브러리 : dlib.shape_perdictor
여러분은 “옆 사람의 외모를 설명해주세요”라는 질문을 들으면 어떻게 하실 건가요?
아마 대부분 “눈은 동그랗고, 코는 오뚝하며 턱은 짧아”와 같은 대답을 하실 겁니다.
“얼굴의 상단 30%는 검고, 이하 70%는 하얀데, 중간에 붉은 지점이 있고..”
라고 설명할 분은.. 아마 없겠죠.
이는 눈, 코, 턱 등이 사람의 얼굴을 구분하는 중요한 특징이기 때문일 텐데요.
AI도 사람과 비슷한 방법을 사용합니다.
보다 쉽고 정확한 설명(혹은 인식)을 위해 사람의 얼굴을 약 68개의 주요 지점으로 분류하죠.
이 “주요 지점”들은 랜드마크라고 불리는데요.
이번 장에서 패륜이는 [dlib]의 [shape_predictor]를 활용하여 사진 속 등장인물들의 얼굴 위에 이 랜드마크들을 표시합니다.

landmark.py를 통해 도산아빠 얼굴에 랜드마크를 표시

이 과정을 거치면 패륜이는 도산아빠의 눈, 눈썹, 코, 입술, 턱선을 알아볼 수 있게 됩니다.
휴.. 계산할게 9만 개에서 68개로 감소했으니 우리의 패륜이, 한숨 트였네요.

*랜드마크 표시 테스트 코드
landmark_tester.py

03
face_recognition, Calculating distance

김원해 씨와 사진 내 등장인물의 특징 비교하기
사용 라이브러리 : dlib.face_recognition, numpy linalg

앞선 과정에서 패륜이는 사진 속 얼굴을 찾아
눈, 눈썹, 코, 입, 턱의 위치를 알아냈는데요.
이번엔 이 얼굴들을 서로 비교하여
“변기인지 아닌지”를 구분하는 작업을 할 겁니다.

세 번째 장에서 진행할 얼굴 비교 및 변기 표시

사람이 아닌 패륜이는 얼굴 사진이 아닌,
“숫자가 된 무언가로”로 얼굴 간 유사도를 계산해야 하는데요.
이를 위해 패륜이는 [dlib]의 [Face_recognition_model]을 사용합니다.
이 모델은 전체 이미지와 랜드마크 정보를 주면 “얼굴 점수”를 알려주는 역할을 하죠.

Face recognition model의 구조

패륜이는
1) 영상 편집자가 일을 하기 전에 미리 도산아빠의 사진을 모델에게 줘서 점수화해두고,
2) 영상 편집자가 사진을 주면 사진 속 배우들의 얼굴을 모델에게 가져다줍니다.

이제 이 과정을 통해 받은 “얼굴 점수”를 서로 비교할 건데요.
비교는 “얼굴 점수” 사이의 거리를 계산하여 진행합니다.
화면 속 “얼굴 점수”를 좌표에 배치하여 다음과 같은 결과를 얻었다고 가정해봅시다.

실제로는 훨씬 복잡한 차원의 계산으로 구성됨

영상 속 도산아빠는 미리 저장해둔 자신의 얼굴과 0.39로 가깝지만 남도산씨는 기준 사진과 약 0.72로 멀리 배치되어있습니다.
여기서 패륜이는 미리 저장해뒀던 도산아빠를 기준으로 원을 그려 원 안의 얼굴들을 도산아빠로 인식하기로 합니다.

기준거리 설정에 따라 변기 인식도가 달라짐

문제는..
철산이와 도산아빠가 제법 닮았다는 건데요.
이러면 원의 반지름이 커질 경우 패륜이는 철산이도 도산아빠로 인식하게 됩니다.
영상의 프레임마다 각 등장인물의 “얼굴 점수”는 다르니, 영상 속 도산아빠는 모두 도산아빠로 인식하면서
철산이는 도산아빠로 인식하지 않는 반지름을 찾아야 하는데요.

저는 몇 차례 시도 끝에 반지름의 길이를 0.45로 설정했습니다.
이제 패륜이는 원 안의 얼굴을 toilet으로, 원 밖의 얼굴을 Face라고 표시할 인식할 수 있게 되었죠.

마침내 패륜이는 영상 속에서 도산아빠를 인식하고, 얼굴 위에 변기 표시를 할 수 있게 되었습니다.
이 과정을 다시 한번 요약하면 다음과 같습니다.

라이브러리를 포함한 최종 프로세스

드. 디. 어 찾아온 결과 시간,
제 패륜이는 김원해 배우님을 변기로 인식했을까요?


다행히,
김원해 배우님의 얼굴은 “Toilet”으로,
다른 배우분들의 얼굴은 “face”라고 인식되는 걸 확인할 수 있습니다.

드라마 속 모델과는 달리 아직 물체 인식이 아닌 얼굴 인식만 할 수 있다는 점과,
dlib 모델의 특성상 측면 얼굴을 잘 인식하지 못한다는 점이 약간 아쉽긴 하네요.

휴… 오늘은 이렇게 드라마 스타트업의 패륜 AI를 만들어봤는데요.
사실 남도산의 프로토타입은 아버지의 얼굴만 제외하면
나머지 물건들인 “컵라면”, “화장실 휴지”등은 정말 훌륭하게 인식합니다.

이 정도로 자질구레(?)한 오브젝트까지 다 트레이닝을 시키려면, 이거.. 시간이 걸려도 엄청 오래 걸렸을 텐데
3년이라는 시간 동안 데이터 라벨링과 모델 트레이닝을 시켜왔을 남도산씨에게 존경의 박수를 보냅니다.
앞으로 남도산씨와, 이 프로토타입의 발전이 기대되네요:)
아, 혹시 제가 만든 패륜이를 직접 만나고 싶다면
아래의 파일을 확인해보세요.
(*저작권 문제로 영상은 포함하지 않았습니다)
video_tester.py

위시켓에서 빠르고 안전한 외주를 경험해보세요.

앱 개발 비용 궁금하세요?
위시켓이 바로 알려드릴게요!

AIAI 사물 인식AI 사물인식AI 사물인식 카메라AI 카메라드라마 스타트업드라마 스타트업 카메라드라마 스타트업 프로토타입사물인식사물인식 카메라스타트업 따라잡기스타트업 사물인식스타트업 사물인식 카메라스타트업 프로토타입
다음 글

위시켓 블로그의 새로운 소식 받기