Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/junyong1111/faceid
https://github.com/junyong1111/faceid
Last synced: 3 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/junyong1111/faceid
- Owner: junyong1111
- License: mit
- Created: 2022-11-21T13:56:20.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2022-12-16T13:25:46.000Z (about 2 years ago)
- Last Synced: 2024-11-13T16:46:06.744Z (2 months ago)
- Language: Python
- Size: 14.5 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# FaceID
### Facial Recognition 의 한계
- 대부분 데이터셋이 서양인에 맞추어져 있어 동양인에 대한 얼굴 인식률이 낮다.
- Facial Recognition 기능 개선을 위한 방법론 탐구
1. Ageitgey/face_recognition
- 현재 사용 중인 모델로 빠르고 가볍지만 동양인과 흑인 인식률이 상당히 낮음
2. CompreFace
- FaceNet과 InsightFace를 사용하며 docker를 사용
- 정보가 많이 없어서 사용하기 어려움
- 도커를 사용하여 실행하였으나 Python 제어가 힘듬
3. DeepFace
- Deepface는 Python용 경량 얼굴 인식 및 얼굴 속성 분석(나이, 성별, 감정 및 인종) 프레임워크 이다.
- 최신 모델 VGG-Face인, google FaceNet, Openface, Facebook DeepFace, DeepID,및 ArcFace을 래핑하는 하이브리드 얼굴 인식 프레임워크이다.
- 이 라이브러리는 FaceNet 및 InsightFace와 같은 다양한 얼굴 인식 방법을 지원하며 REST API도 제공하지만 인증 방식만 지원하기 때문에 얼굴 모음을 생성하고 그중에서 얼굴을 찾을 수 없다
- 파이썬 개발자라면 쉽게 시작할 수 있지만 다른 사람들이 통합하기는 어려울 수 있다.
- 이슈 : 현재 사용 중인 FaceRecognition 모델은 2018년까지가 최신 업데이트 모델로 서양인을 제외한 나머지 인종에 대한 얼굴인식률이 상당히 낮다. 따라서 모델에 대한 교체 필요성을 느꼈고 다음 5가지 얼굴인식 모델을 후보로 생각
1. CompreFace
2. DeepFace
3. FaceNet
4. InsightFace
5. InsightFace-REST
- 해결 : 3~5번까지 얼굴인식 모델이 포함되어 있는 프레임워크인 CompreFace 또는 DeepFace를 선택 둘 중 현재 정보나 파이썬 개발에 맞는 DeepFace를 모델로 선택 프레임워크 공부 후 실제 모델에 적용 예정## DeepFace
### 목표 : Deepface 프레임워크를 사용하여 사용자 얼굴 학습 및 인식
- 현재 선택한 Deepface는 라이브러리를 설치하는 것으로 쉽게 사용이 가능하지만 이 코드를 현재 코드에 맞게 수정하는 작업이 필요.- Deepface 사용법
- 기본적인 샘플 코드에서는 1장의 사진만으로 학습하는 방법이 제시되어 있다. 이를 여러 장에 사진으로 학습하기 위해서는 다음과 같은 파일구조를 생성 후 path를 넘겨주는 방식으로 사용이 가능하다.
- 파일구조
- Username
- Username1.jpg
- Username2.jpg
- …
- 기존에 사용했던 SaveimgFromVideo.py 파일을 이용하여 학습 이미지 확보
- pip install deepface 명령어를 사용하여 라이브러리 설치
- 여러 샘플 코드 중 실시간 영상 얼굴 인식 코드 필요
- DeepFace.stream()함수 사용
- 위 함수에는 감정 ,나이, 성별 등 현재 프로젝트에서 필요없는 코드가 포함되어 있음
- 인자로 enable_face_analysis = false로 사용
- 프로젝트에 맞게 코드 수정
- realtime.py 파일 수정
- 기존 track코드와 영상 무한 루프가 겹쳐 탈출을 못함 얼굴인식 코드는 무한 루프 제거
- 함수 호출 시마다 얼굴 학습 코드가 실행됨 얼굴 학습 코드 분리
- 현재 코드는 5프레임마다 인식하여 5초간 이미지를 보여줌으로 설정된 조건 초기화
- 불필요한 연산이 들어가는 감정, 나이, 성별 모델 road 코드 삭제
- 사용자 ID 값을 Return 하도록 설정
- FaceEmbeddingFromImage.py 작성
- 위 코드에서 얼굴 학습만을 따로 제거하여 분리.
- 얼굴 학습에서 얼굴 탐지 모델은 ssd를 사용
- 다른 모델에 비해 상당히 빠른 학습이 가능
- 최종 폴더 구성
- SaveImgFromVideo.py
- FaceEmbeddingFromImage.py
- FaceID.py
- Username
- Username1.jpg
- Username2.jpg
- …- 개발 과정 생긴 문제점
- 정보가 없다. 기존에 잘 알려진 프레임워크와는 다르게 정보가 없어 코드를 하나씩 실행하고 읽어가면서 수정하여 시간이 상당히 오래 걸렸다.
- 현재 동영상으로부터 이미지를 저장하고 학습하여 실시간으로 얼굴인식하는 코드는 완성은 하였으나 인식률이 저조함 여러 가지 모델을 테스트해봐야 함- 해야할 일
- 현재 모델 학습과 실행까지는 완료되었으나 모델 인식률이 좋지 못함
- 얼굴인식 모델 별, 얼굴 탐지 모델 별, 유사도 계산 별 가장 좋은 모델을 찾아야 함.
- 개발 완료 시 원본 코드와 합쳐서 테스트 필요참고링크(Deepface Github) : https://github.com/serengil/deepface
### 목표 : Deepface 최고의 얼굴 인식 모델 확인 후 코드 결합
- 현재 모델은 아직까지도 인식률이 저조하다는 문제점이 있음 다양한 모델 실험 필요
- 모델 실험 후 원본 코드와 결합 후 테스트- 모델에 들어가는 각각의 인자 수정 후 확인
- 모델 종류 {VGG_Face, Facenet, Facenet512, OpenFace, DeepFace, DeepID, ArcFace, Dlib, SFace}(Deepface Github 참고)
#참고 : 라벨이 붙은 얼굴 (LFW) 데이터 세트 및 동영상 용 (YTF) 데이터 세트
- 얼굴 탐지 모델 종류 {opencv, ssd,dlib,mtcnn, retinaface,mediapipe}
- opencv 모델은 빠르지만 얼굴 탐지를 제대로 못하는 경우가 자주 발생
- 각 모델 별 얼굴 크롭 특징이 다름
- 본 테스트에서는 retinaface을 고정하여 사용(Deepface Github 참고)
- 유사도 계산 종류 {cosin, euclidean, euclidean_l2}
- 유사도 계산은 현재 Deepface Github사이트에서 안정적이라고 하는 euclidean_l2을 고정하여 사용- Test1(VGG_Face)
- VGG_Face는 파라미터 수가 상당히 많기 때문에 적은 이미지 학습 시 과적합 가능성 존재
- 얼굴 감지는 잘 되지만 학습된 이미지뿐 아니라 동양인 전체적으로 인식률이 저조함
- 다른 모델에 비해 인식률이 좋지 못함
- 20~30장만으로 학습하는 프로젝트 특성상 높은 정확도를 기대하기 어려움
- Test2(FaceNet)
- FaceNet은 최초로 Triplet Loss개념을 도입한 모델
- 깃허브에서도 정확도가 가장 높은 모델 중 하나
- 꽤나 정확한 확률로 사용자를 인식하지만 아직도 동양인 전체를 사용자라 인식
- 여러 환경 테스트 중 가장 안정적인 모델 중 하나
- Test3(FaceNet-512)
- 깃허브에서 정확도가 가장 높은 모델
- 정확도가 가장 높은 모델임에도 불구하고 인식률은 FaceNet보다 좋지 못함
- FaceNet을 사용하는 게 더 좋아 보임
- Test4(ArcFace)
- ArcFace는 클래스 간 각도를 통해 차이를 주어 서로 다른 클래스 간에는 더 큰 격차를 만드는 방법
- 위에서 언급한 방법과 다른 방식이라 기대했지만 적은 데이터 때문인지 학습되지 않은 인물뿐 아니라 사용자까지도 인식을 못 하는 상황 발생
- 데이터가 더욱더 충분하다면 좋은 모델이 될 수 있어 보이지만 현재 프로젝트에는 부적합
- Test5(SFace)
- 훈련 데이터의 불안정성을 고려하여, 과적합 문제를 완화하기 위해 클래스 내 및 클래스 간 목표를 적당한 방식으로 최적화
- 대량의 이미지로 학습하는 다른 모델과는 다르게 적은 데이터의 불안정성을 고려하여 최적화한 모델로 현재 프로젝트에 가장 적합한 모델 중 하나라고 볼 수 있음
- 실제로도 20~30장에 이미지로 학습하는 현재 프로젝트에서 최고의 성능을 보여줌- 현재 프로젝트에서는 훈련 데이터가 다른 케이스에 비해 상당히 부족함. 따라서 현재 프로젝트에서 최고의 조합
Model : SFace
Backend : retinaface
Metric: euclidean_l2- 코드 결합
- 기존 추적 모델 코드와 결합 진행
- 기존 코드와 문제없이 결합 완료
- 테스트 완료 (이상 없음)- 개발 과정 생긴 문제점 및 해결방법
- Github에 나와있는 정확도 표와는 다르게 현재 프로젝트에는 훈련 데이터가 상당히 부족하다는 문제점이 존재
- SFace라는 적은 데이터에서도 최적화 과정을 통해 높은 정확도를 내는 모델이 존재하여 이를 어느정도 해결- 추후 개발 피드백
- 이전 모델보다는 확실하게 동양인 인식률이 올라갔지만 아직 만족할 수 있는만큼 수치가 아니다. 이번 프로젝트가 끝나더라도 여러 가지 다양한 모델을 조합하여 적은데이터로도 좋은 성능을 낼 수 있는 모델을 개발하면 좋은 경험이 될 수 있다고 생각이 든다.- 결과
- 동양인 FaceID 기능 재구현 완료