4. 얼굴인식기반 실시간 교육 플랫폼 개발 - KHU Face ID

얼굴인식기반 실시간 교육 플랫폼 개발과정

[Github] 코드 원본(DL서버)

4. 얼굴인식기반 실시간 교육 플랫폼 개발 - KHU Face ID

1. 프로젝트 개요

개발 동기 및 필요성

수업시작 직전, 뛰는 사람은 ‘김’씨고 걷는 사람은 ‘하’씨라는 농담이 있다. 같은 수업 일지라도 호명 순서에 따라 임의적으로 출석과 지각의 경계에 놓이며, 많은 시간이 소요되는 현재 출결 방식의 문제를 잘 드러내는 말이라고 생각한다. 실제로 이러한 출결 확인 방식의 비효율성과 불공정성은 매번 학생들의 불만을 야기하는 요소로 손꼽힌다.

출결 관리 시간을 비용으로 환산 했을 경우(경희대학교 등록금 기준) 약 89,375원의 비용적 손실이 발생한다고 볼 수 있다. 이는 60명 기준 강의 하나에서 발생하는 손실이기 때문에 이를 학교 전체로 확대 했을 경우 학생과 학교입장에서 결코 무시할 수 없는 비용일 것이다.

이러한 불만을 해소하기 위해 전자출결시스템이 등장했다. 최근에는 RFID, QR코드 등의 과학기술을 활용하여 시스템이 새롭게 개발되었지만, 여전히 그 실효성에 대한 의문이 제기되고 있고, 대리출석과 무단조퇴와 같은 문제의 발생률이 현저히 높아졌다.

따라서 이러한 모든 문제점을 확인 할 수 있는 합리적인 방법을 제시하기 위해 얼굴인식기반 교육 플랫폼[KHU-FACE ID]를 개발하게 되었다.

서비스 기획

서비스의 주요기능은 그림과 같이 크게 두가지 이고 해당 기능은 실제 교수님들과 학생들의 니즈를 바탕으로 설계하였다.

전체적인 파이프라인

  • IP Camera(혹은 스마트폰)의 영상을 실시간으로 스트리밍하여 Web Server에서 확인 할 수 있게한다. (초록색 점선)

  • IP Camera(혹은 스마트폰)의 영상 중 일부를 Deep Learning Server로 보내 얼굴 위치를 파악하고 해당 얼굴에 대한 정보를 Web에 제공한다. (빨간색 점선)

  • 영상을 처리하는 Web Server와 얼굴인식 및 출결 관리를 하는 Deep Learning Server로 분할하여 병렬처리 하였고, 이를 통해 병목현상이 줄어 서버가 안정적이고 Web에서 영상이 끊기지 실시간 재생이 가능하게 설계한다.

2. 네트워크 설계

네트워크 설계 개요

IP Camera의 영상을 Web Server로 보내기 위해서는 다음의 두 가지 과정이 필요하다.

  1. IP Camera에 IP를 부여하기 위해 VPN을 활용하여 IP Camera를 Router와 연결해야 한다.

  2. IP Camera에 부여한 내부 IP를 포트포워딩을 통해 외부와 연결해야 한다.

VPN 설정

그림과 같이 Router의 내부 IP를 할당하여 VPN에 접속할 수 있는 계정을 생성하여 IP카메라가 어디에서든 Router에 접속할 수 있게 한다.

포트포워딩 설정

그림과 같이 이전에 할당한 내부 IP를 포트포워딩하여 지정된 포트를 통해 외부와 연결할 수 있도록 한다.

3. 얼굴인식 시스템 설계 및 개선

얼굴인식 모델의 파이프라인

얼굴인식 모델의 파이프라인은 크게 두 단계로 나누어진다.

1. MTCNN을 활용한 얼굴위치 확인 [MTCNN에 대한 상세설명]

MTCNN을 통해 들어온 영상에서 얼굴의 위치를 검출한다. MTCNN은 그림과 같이 세 가지 네트워크를 통해 영상에 있는 여러 얼굴의 위치를 빠르게 파악할 수 있기때문에 본 프로젝트에 적합하여 이를 채택하였다.

2. FaceNet을 활용한 얼굴의 특징 추출 및 신원 확인 [FaceNet에 대한 상세설명]

FaceNet을 통해 앞서 검출된 얼굴에서 128개의 특징값을 추출한다. 이 값들을 다시 128차원으로 임베딩하면 각 얼굴(사람)간의 유클리드 거리를 계산하여 얼굴을 구분할 수 있게 된다.

직접 실험한 영상

추가 개선사항

1. 데이터 증가

인당 5장(정면, 웃음, 안경, 좌측아래, 우측아래)으로 데이터를 확보하여 다양한 각도에서 잘 인식할 수 있도록 한다.

2. Github[Code]를 참고하여 데이터를 flip하여 사용

3. Pruning을 하여 모델을 경량화 (실패)

모델자체는 경량화 되었으나 성능이 너무 낮아져 사용하지 않기로 하였다.

4. 딥러닝서버와 웹서버간의 통신 설계

[Github] 코드 원본

딥러닝 서버와 웹 서버간의 통신

딥러닝 서버와 웹 서버는 Rest API방식으로 통신한다. (설계한 딥러닝 서버와 통신하는 웹 서버는 유정수 엔지니어님 [유정수님 티스토리 링크] 이 설계해 주셨다.) 그 중 GET을 사용하여 영상을 제공받는 카메라의 IP를 웹으로 부터 받고, 그 영상을 분석하여 얻은 정보를 웹으로 다시 보내주는 방식을 사용한다. 이때 사용되는 3가지 함수는 아래와 같다.

얼굴위치 확인 함수 - Modelfr

  • Code
def get_face(URL, device, targets=target, names=name):
    student_list = []
    frame = URL2Frame(URL)
    try:
        bboxes, landmarks = MTCNN_NET(frame, 0.5, device, 'MTCNN/weights/pnet_Weights',
                                      'MTCNN/weights/rnet_Weights', 'MTCNN/weights/onet_Weights')
        landmarks = landmarks.tolist()
        for i, b in enumerate(bboxes):
            box = dict()
            box['x1'] = b[0]
            box['y1'] = b[1]
            box['x2'] = b[2]
            box['y2'] = b[3]
            box['landmarks'] = landmarks[i]
            student_list.append(box)
        return student_list
    except:
        return []
        
@app.route('/modelfr', methods=['GET'])
def modelfr():
    if request.method == 'GET':
        URL_fr = request.args.get('ip', '')
        student_list = get_face(URL_fr, device_0, target, name)
        return {'box': student_list}
  • input
ip = http://xxx.xxx.xxx.xxx:xxxx/shot.jpg # ip camera의 영상 주소
landmark = [xxxx, xxxx, xxxx.....] # modelfr에서 찾은 얼굴의 landmark
  • ouput
{"box":[{"landmarks":[xxxx, xxxx, xxxx.....],"x1":xxx,"x2":xxx,"y1":xxx,"y2":xxx},
        {"landmarks":[yyyy, yyyy, yyyy.....],"x1":yyy,"x2":yyy,"y1":yyy,"y2":yyy}]} 
        # 인식한 학생의 얼굴에서 찾은 landmark와 bounding box의 
  • 실행화면

Modelfr은 수업시간 중 웹에서 계속해서 요청을 하는 함수이며 얼굴의 위치를 파악하여 웹으로 실시간 전송한다. 그리고 웹에서는 이러한 정보를 바탕으로 얼굴의 위치에 맞는 버튼을 실시간으로 생성힌다.

얼굴 정보 확인 함수 - Modelin

  • Code
def get_id(URL, device, targets=target, names=name):
    student_list = []
    frame = URL2Frame(URL)
    try:
        faces = Face_alignment(
            frame, default_square=True, landmarks=landmarks)

        embs = []

        test_transform = trans.Compose([
            trans.ToTensor(),
            trans.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])

        for img in faces:
            embs.append(detect_model(
                test_transform(img).to(device).unsqueeze(0)))

        if embs != []:
            source_embs = torch.cat(embs)
            diff = source_embs.unsqueeze(-1) - \
                targets.transpose(1, 0).unsqueeze(0)
            dist = torch.sum(torch.pow(diff, 2), dim=1)
            minimum, min_idx = torch.min(dist, dim=1)
            min_idx[minimum > ((75-156)/(-80))] = -1
            results = min_idx

            for i, k in enumerate(bboxes):
                if results[i] == -1:
                    continue
                student_list.append(names[results[i] + 1])
        return student_list
    except:
        return []

@app.route('/modelin', methods=['GET'])
def modelin():
    if request.method == 'GET':
        URL_in = request.args.get('ip', '')
        landmark = request.args.get('landmark', '')
        try:
            landmark = list(
                map(float, landmark.rstrip(']').lstrip('[').split(',')))
        except:
            pass
        student_id = get_info(URL_in, landmark, device_0, target, name)
        return {'id': student_id}
  • input
ip = http://xxx.xxx.xxx.xxx:xxxx/shot.jpg # ip camera의 영상 주소
landmark = [xxxx, xxxx, xxxx.....] # modelfr에서 찾은 얼굴의 landmark
  • ouput
{"id":["0"]} # 인식한 학생의 id 값
  • 실행화면

Modelin은 웹에 생성된 버튼을 클릭할 시 해당 얼굴의 특징과 DB의 정보를 비교하여 신원을 확인하여 웹으로 전송한다. 이를 통해 웹에서는 해당 인원에 대한 정보를 가져와 사용자가 쉽게 확인 및 수정 할 수 있도록 화면을 제공한다.

출결 정보 확인 함수 - Modelat

  • Code
def get_id(URL, device, targets=target, names=name):
    student_list = []
    frame = URL2Frame(URL)
    try:
        bboxes, landmarks = MTCNN_NET(frame, 0.5, device, 'MTCNN/weights/pnet_Weights',
                                  'MTCNN/weights/rnet_Weights', 'MTCNN/weights/onet_Weights')
        faces = Face_alignment(
            frame, default_square=True, landmarks=landmarks)

        embs = []

        test_transform = trans.Compose([
            trans.ToTensor(),
            trans.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])

        for img in faces:
            embs.append(detect_model(
                test_transform(img).to(device).unsqueeze(0)))

        if embs != []:
            source_embs = torch.cat(embs)
            diff = source_embs.unsqueeze(-1) - \
                targets.transpose(1, 0).unsqueeze(0)
            dist = torch.sum(torch.pow(diff, 2), dim=1)
            minimum, min_idx = torch.min(dist, dim=1)
            min_idx[minimum > ((75-156)/(-80))] = -1
            results = min_idx

            for i, k in enumerate(bboxes):
                if results[i] == -1:
                    continue
                student_list.append(names[results[i] + 1])
        return student_list
    except:
        return []

@app.route('/modelat', methods=['GET'])
def modelat():
    if request.method == 'GET':
        URL_at = request.args.get('ip', '')
        student_list = get_id(URL_at, device_0, target, name)
        return {'id': student_list}
  • input
ip = http://xxx.xxx.xxx.xxx:xxxx/shot.jpg # ip camera의 영상 주소
  • ouput
{"id":["4","2","1","0"]} # 인식한 학생의 id 값
  • 실행화면

Modelat는 웹에서 출석확인 버튼을 클릭할 시 화면에서 보이는 모든 학생들의 정보를 웹으로 전송한다. 이를 통해 웹에서는 출석정보를 업데이트하여 사용자가 쉽게 확인할 수 있도록 화면을 제공한다.

5. 결론

1. 최종 데모 영상

2. 기대효과 및 의의

  • 많은 학생의 얼굴을 실시간으로 인식하여 출석 여부를 짧은 시간에 파악할 수 있다. 기존 방식의 출석 확인 절차에서 소요되는 시간을 절약하여 학생의 학습권을 보장할 수 있다.

  • 학기마다 새로운 학생을 마주하게 되는 교수님에게 KHU_FACEID를 통해 실시간으로 학생의 정보를 파악할 수 있도록 한다. 이에 교수는 학생 개인에게 보다 더 맞춤화된 질의를 할 수 있으며, 수업 진행의 지연 방지에도 큰 도움을 줄 수 있다.

  • 학생 정보 데이터베이스와 연동을 통해 열람실 좌석 서비스 제공 및 대리 좌석 예약 근절, 학생회 행사 중 학생회비 납부 여부 파악 등 학생 정보가 필요한 시설 및 서비스에 다양하게 확대될 수 있음을 기대할 수 있다.

  • 얼굴인식의 특성상 교내 연구 시설 및 건물 출입 통제, 학생증 도용 방지 등 보안 관련 분야에서도 유용하게 사용될 것이다.

3. 추후 과제

현재 모델보다 우수한 성능을 발휘하는 최신 모델들을 테스트하여 딜레이를 최대한 줄임과 동시에 코드 리팩토링(Refactoring)을 거쳐 효율적인 코드 작성 및 사용자에게 좀 더 편리한 웹 디자인과 UI 개발을 통해 완성도를 높일 필요가 있다.

또한, 실제로 적용하기 위해서는 조금더 좋은 네트워크 환경을 구축할 필요가 있으며, 딜레이나 병목현상이 생기는 부분에 대해 웹과 모델에서 알고리즘을 추가적으로 개선해야 할 것이다. 마지막으로 발생할 수 있는 face spoofing 이슈를 해결하기 위해 얼굴인식 파이프라인에 anti-spoofing 모델을 추가 할 것이다.

4. 수상

  • 경희대학교 캡스톤디자인 경진대회 최우수상 수상

  • 경희대학 캠퍼스타운 창업경진대회 1차 선발


© 2020. All rights reserved.