본문 바로가기
프로그램 활용/인공지능(AI)

[자료수집] 얼굴인식 출입통제 프로그램을 만들어보세요.(유튜브 소개)

by 3604 2022. 7. 17.
728x90

 

얼굴인식 출입통제 프로그램을 만들어보세요.(유튜브 소개)

출처: https://wiserloner.tistory.com/1198?category=825446
 
2년 전 by Prowd Loner

- 이번 글은 제가 직접 만드는 것도 아니고 분석하는 글도 아닙니다.

제목에 적힌 서비스를 직접 한번 만들어볼수 있도록 잘 설명된 유튜브 영상을 소개합니다.

https://www.youtube.com/watch?v=sz25xxF_AVE&t=28s

컴퓨터 비전,

OpenCV를 이용한 실제 프로그램 개발에 대한 영상을 올리시는 분인데,

실제 개발 영상도 상세히 올려주니 참고하기도 좋습니다.

 

이전에 저도 만들어본 얼굴 유사도 비교 프로그램도 이분 코드를 사용한 것인데,

이번에는 그것을 조금 응용해서, 실제 동영상에서 사람 얼굴을 인식하고, 이 사람이 언제 출입을 했는지에 대해 기록을 하는 출입 통제 프로그램이네요. (거의 동일함.)

 

관심있는 분은 그대로 따라해보시거나 커스텀해보세요.

 

[간단 설명]

- Face Recognition은, 아래와 같은 step으로 이루어져있습니다.

1. 얼굴 검출 : 객체 탐지 모델을 이용하여 영상 속의 얼굴이 위치한 모든 부분을 찾고, 그곳의 바운딩 박스 좌표를 이용해 ROI를 추려옵니다. (쉽게 말하면 얼굴 위치부분의 이미지를 사각형으로 잘라냄.)

영상에서는 HOG를 이용한 얼굴 특징 검출을 했는데, 얼굴 검출시 드는 시간을 최소화하기 위함일까요? 어쨌든, 얼굴 부분의 ROI를 추려오면 되기때문에, YOLO와 같은 객체 탐지 모델을 사용해도 되고, 머신러닝 알고리즘을 사용해도 됩니다.

영상 분석 모델은 속도가 생명이니 각 step별 그 부분만 유의합시다.

 

2. 얼굴 랜드마크 및 정렬

같은 사람이라도 찍힌 각도가 다르고, 여러모로 차이가 존재하죠.

이를 방지하기 위해 얼굴에서 특징적인 부분을 랜드마크 합니다.

 

 

위와 같이, 얼굴의 특징을 모아둔 점을 얼굴에 찍는 것입니다.(라이브러리는 dlib을 사용한다고 합니다.)

사람마다 저 점들이 찍히는 위치가 다르겠죠?

일단 얼굴이 찍히면, 저 특징점을 통해 얼굴 이미지를 정면이 되도록 정렬합니다.

 

3. 특징 인코딩

얼굴에서 나온 특징들을 인코딩합니다.

단순히 1대1 매칭으로는 이미지를 비교할수 없습니다.

그렇기에 이미지를 일종의 특징 맵이나 벡터로 만들어서 그 거리를 구하는 방식으로 유사도를 측정하는 것입니다.

여기선 128 Measurements의 특징맵을 사용합니다.

즉, 위에서 우리가 정렬을 했던 얼굴 이미지가 들어가면 1x128의 벡터가 출력된다는 것을 의미하죠.

 

이 인코딩 부분은 아마 딥러닝을 사용하는 것 같은데, 정확히 무슨 모델을 사용한지 모르겠네요.

AE를 사용한건 아닐테고, 이전에 소개한 샴 네트워크를 Triplet Loss로 학습시킨게 아닐까 조심스레 예측해봅니다.

 

4. 얼굴 매칭

이제 특징을 인코딩했으면, 데이터베이스상 저장된 다른 얼굴들과 비교를 하면 됩니다.

인코딩이라는게 정말 좋은 개념인게, 이 인코딩 데이터를 사용하여 분류뿐 아니라 클러스터링도 가능하기 때문입니다.

이에대해선 나중으로 미루고, 어쨌건 같은 인코딩을 거쳐 비슷한 값들이 출력되는 이미지들은 서로 같은 사람을 찍은 사진이라는 것이 되겠죠?

그렇기에 데이터베이스에 저장된 인코딩 데이터를 순회하며, 그 거리를 계산하고, 가장 유사한 클래스명과 유사도를 얻어오면 됩니다.

예를들면 loner라는 이름으로 128 인코딩 데이터를 저장하고 있다면, 새로 이미지가 들어왔을 때, 각자의 인코딩 데이터를 비교 후, 서로 유사하다면, 새 이미지는 loner라고 인식할수 있으며, 유사도 ~%라고 얻어낼수 있겠죠.

 

- 위의 원리까지는 저번에도 실제로 만들어보며 정리해본 것인데, 이번 코드는 Face Recognition에 더불어 Attendance 기능을 붙인 것 뿐입니다.

그냥 저번 코드의 유사도 파악 코드 뒤쪽에, 유사도가 일정 이상이거나 이하일 때의 기능을 붙여주거나, DB에 이를 반영하는 코드를 작성하기만 하면 됩니다.

 

혹여 성능 향상을 하고 싶다면 바로 위와 같은 각 step 부분에 필요한 기술들을 이해하고 커스텀하는 방법외에는 없겠죠.

 

이상입니다.

 

- 참고로, 위 시스템은 사람이 늘어날수록 당연히 메모리 공간도 많이 차지할테고, 무엇보다 클래스가 많아질수록 비교하는데 시간이 걸릴 것입니다.

이를 어떻게 해결해야 할지, DB의 인덱스나 정렬과 같은 원리로 큰 분류와 소분류의 인식으로 비교할 데이터를 추려낼지 등에 대한 방식이 떠오르지만 아직 잘 모르겠네요.

인코딩 데이터를 비교하는 방식을 알수 있다면, 그에따라서 애초에 특징맵의 거리가 비슷한 것들만 가져와서 비교를 할수도 있을텐데, 이는 실험과 연구가 필요합니다. (지금은 다른 공부중이니 넘김.)

 

// 실습은 말했듯 이전에 한 것과 거의 다를게 없으므로 개인적으로는 실습을 하지 않습니다.

그냥 이런게 있다는 것을 소개한 것입니다.

 

무엇보다 커스텀할수 있는 범위가, 실제 인식 부분은 라이브러리에서 제공하는 api를 사용할 뿐이니 성능 향상 및 커스텀이 불가능합니다.

Landmark Detection이나 실제 Face Recognition 모델 제작의 경우는 현재 공부중이라, 되는데로 정리해봐야겠네요. (방법은 많은데 아직 명확한 기준이 없습니다. 위와 같이 머신러닝과 같이 사용하기도 하고, 딥러닝 모델로 구현하는 논문도 일단 존재는 하는데, yolo처럼 독보적이진 않더군요... 아직 자료도 제대로 찾아보진 않았는데, 일단 관련 대회 같은게 있나 살펴보고, 있다면 우승 모델을 공부할 예정입니다.)

728x90