728x90
반응형

DeepFace

 

DeepFace는 파이썬을 위한 가벼운 얼굴 인식 및 얼굴 속성 분석( 나이 , 성별 , 감정  인종 ) 프레임워크입니다. 최첨단 모델을 래핑하는 하이브리드 얼굴 인식 프레임워크입니다 : 

VGG-Face, FaceNet, OpenFace, DeepFace, DeepID, ArcFace, Dlib, SFace, GhostFaceNet, Buffalo_L.

Experiments 인간의 얼굴 인식 작업 정확도는 97.53%인 반면, 해당 모델은 이미 이 정확도 수준에 도달하여 이를 넘어섰습니다 .

설치

deepface를 설치하는 가장 쉬운 방법은 PyPI에서 다운로드하는 것입니다 . 라이브러리 자체와 필수 구성 요소도 설치됩니다.

$ pip install deepface

 

또는 소스 코드에서 deepface를 설치할 수도 있습니다. 소스 코드에는 아직 pip 릴리스에 공개되지 않은 새로운 기능이 있을 수 있습니다.

$ git clone https://github.com/serengil/deepface.git
$ cd deepface
$ pip install -e .

 

라이브러리를 설치한 후에는 라이브러리를 가져와서 해당 기능을 사용할 수 있습니다.

from deepface import DeepFace

 

현대 얼굴 인식 파이프라인 - Demo

최신 얼굴 인식 파이프라인은 detect , align , normalize , representation , verify 라는 5가지 일반적인 단계로 구성됩니다. 

DeepFace는 이러한 모든 일반적인 단계를 백그라운드에서 처리하지만, 그 뒤에 있는 모든 프로세스에 대한 심층적인 지식을 습득할 필요는 없습니다. 한 줄의 코드로 verification, find 또는 analysis 함수를 호출하기만 하면 됩니다.

 

얼굴 확인 - Demo

이 함수는 얼굴 쌍을 같은 사람인지 다른 사람인지 확인합니다. 정확한 이미지 경로를 입력으로 기대합니다. numpy 또는 base64로 인코딩된 이미지를 전달하는 것도 환영합니다. 그런 다음 사전을 반환하고 검증된 키만 확인해야 합니다.

result = DeepFace.verify(img1_path = "img1.jpg", img2_path = "img2.jpg")

얼굴 인식 - Demo

얼굴 인식은 얼굴 검증을 여러 번 적용해야 합니다. 여기서 deepface는 이 작업을 처리하기 위한 기본 find 함수를 가지고 있습니다. 데이터베이스 경로에서 입력 이미지의 신원을 찾고 출력으로 pandas 데이터 프레임 목록을 반환합니다. 한편, 얼굴 데이터베이스의 얼굴 임베딩은 다음에 더 빠르게 검색할 수 있도록 pickle 파일에 저장됩니다. 결과는 소스 이미지에 나타나는 얼굴의 크기가 됩니다. 게다가, 데이터베이스의 대상 이미지에도 여러 얼굴이 있을 수 있습니다.

dfs = DeepFace.find(img_path = "img1.jpg", db_path = "C:/my_db")
 

임베딩 - Demo

 

얼굴 인식 모델은 기본적으로 얼굴 이미지를 다차원 벡터로 표현합니다. 때로는 이러한 임베딩 벡터가 직접 필요합니다. DeepFace에는 전용 표현 함수가 제공됩니다. Represent 함수는 임베딩 목록을 반환합니다. 결과는 이미지 경로에 나타나는 얼굴의 크기가 됩니다.

embedding_objs = DeepFace.represent(img_path = "img.jpg")

 

 

임베딩은 아래와 같이 플로팅 할 수 있습니다 . 각 슬롯은 차원 값에 해당하며 차원 값은 색상으로 강조됩니다. 2D 바코드와 유사하게 수직 차원은 일러스트레이션에 정보를 저장하지 않습니다.

얼굴 인식 모델 - Demo

 

DeepFace는 하이브리드 얼굴 인식 패키지입니다. 현재 최첨단(state-of-the-art) 얼굴 인식 모델인 : VGG-Face, FaceNet,  OpenFace, DeepFace, DeepID, ArcFace, Dlib, SFace,  GhostFaceNet, Buffalo_L을 많이 래핑합니다 . 기본 구성은 VGG-Face 모델을 사용합니다.

models = [
    "VGG-Face", "Facenet", "Facenet512", "OpenFace", "DeepFace",
    "DeepID", "ArcFace", "Dlib", "SFace", "GhostFaceNet",
    "Buffalo_L",
]

result = DeepFace.verify(
  img1_path = "img1.jpg", img2_path = "img2.jpg", model_name = models[0]
)

dfs = DeepFace.find(
  img_path = "img1.jpg", db_path = "C:/my_db", model_name = models[1]
)

embeddings = DeepFace.represent(
  img_path = "img.jpg", model_name = models[2]
)

 

FaceNet, VGG-Face, ArcFace 및 Dlib는 실험에 근거하여 성능이 뛰어난 모델입니다. BENCHMARKS자세한 내용은 를 참조하십시오. DeepFace의 다양한 모델에 대한 측정 점수와 원래 연구에서 보고된 점수는 다음 표에서 찾을 수 있습니다.

모델측정된 점수선언된 점수

Model Measured Score Declared Score
Facenet512 98.4% 99.6%
Human-beings 97.5% 97.5%
Facenet 97.4% 99.2%
Dlib 96.8% 99.3 %
VGG-Face 96.7% 98.9%
ArcFace 96.7% 99.5%
GhostFaceNet 93.3% 99.7%
SFace 93.0% 99.5%
OpenFace 78.7% 92.9%
DeepFace 69.0% 97.3%
DeepID 66.5% 97.4%

 

DeepFace 내에서 이러한 모델로 실험을 수행하면 고유한 탐지 또는 정규화 기술을 채택했기 때문에 원래 연구와 비교하여 차이가 드러날 수 있습니다. 게다가 일부 모델은 사전 훈련된 가중치가 없는 백본만 가지고 출시되었습니다. 따라서 우리는 원래 사전 훈련된 가중치 대신 재구현을 활용하고 있습니다.

 

유사성 - Demo

 

얼굴 인식 모델은 일반적인 합성 신경망 이며 얼굴을 벡터로 표현하는 역할을 합니다. 우리는 같은 사람의 얼굴 쌍이 다른 사람의 얼굴 쌍보다 더 유사 할 것으로 예상합니다.

유사도는 코사인 유사도 , 유클리드 거리 또는 L2 정규화된 유클리드 와 같은 다양한 지표로 계산할 수 있습니다 . 기본 구성은 코사인 유사도를 사용합니다. 실험 에 따르면 , 어떤 거리 지표도 다른 것보다 성능이 뛰어나지 않습니다.

metrics = ["cosine", "euclidean", "euclidean_l2"]

result = DeepFace.verify(
  img1_path = "img1.jpg", img2_path = "img2.jpg", distance_metric = metrics[1]
)

dfs = DeepFace.find(
  img_path = "img1.jpg", db_path = "C:/my_db", distance_metric = metrics[2]
)

 

 

얼굴 속성 분석 - Demo

 

DeepFace에는 또한 age, gender, facial expression(화남, 두려움, 중립, 슬픔, 혐오, 행복, 놀람 포함) 및 race(아시아인, 백인, 중동인, 인도인, 라틴계, 흑인 포함) 예측을 포함한 강력한 얼굴 속성 분석 모듈이 함께 제공됩니다. 결과는 소스 이미지에 나타나는 얼굴의 크기가 됩니다.

objs = DeepFace.analyze(
  img_path = "img4.jpg", actions = ['age', 'gender', 'race', 'emotion']
)

튜토리얼 에 언급된 대로 연령 모델은 ± 4.65 MAE를 얻었고, 성별 모델은 97.44%의 정확도, 96.29%의 정밀도, 95.05%의 재현율을 얻었습니다 .

 

얼굴 감지 및 정렬 - Demo

 

얼굴 감지 및 정렬은 현대 얼굴 인식 파이프라인의 중요한 초기 단계입니다. 실험에 따르면 감지는 얼굴 인식 정확도를 최대 42%까지 높이고 정렬은 최대 6%까지 높입니다. OpenCV, Ssd, Dlib, MtCnn, Faster MtCnn, RetinaFace, MediaPipe, Yolo, 감지기 YuNet는 CenterFacedeepface에 래핑됩니다.

모든 deepface 함수는 선택적 감지기 백엔드와 정렬 입력 인수를 허용합니다. 이러한 인수를 사용하여 감지기와 정렬 모드 사이를 전환할 수 있습니다. OpenCV가 기본 감지기이고 정렬은 기본적으로 켜져 있습니다.

backends = [
    'opencv', 'ssd', 'dlib', 'mtcnn', 'fastmtcnn',
    'retinaface', 'mediapipe', 'yolov8', 'yolov11s',
    'yolov11n', 'yolov11m', 'yunet', 'centerface',
]
detector = backends[3]
align = True

obj = DeepFace.verify(
  img1_path = "img1.jpg", img2_path = "img2.jpg", detector_backend = detector, align = align
)

dfs = DeepFace.find(
  img_path = "img.jpg", db_path = "my_db", detector_backend = detector, align = align
)

embedding_objs = DeepFace.represent(
  img_path = "img.jpg", detector_backend = detector, align = align
)

demographies = DeepFace.analyze(
  img_path = "img4.jpg", detector_backend = detector, align = align
)

face_objs = DeepFace.extract_faces(
  img_path = "img.jpg", detector_backend = detector, align = align
)

 

 

얼굴 인식 모델은 실제로 CNN 모델이며 표준 크기의 입력을 기대합니다. 따라서 표현하기 전에 크기 조정이 필요합니다. 변형을 피하기 위해 deepface는 감지 및 정렬 후 대상 크기 인수에 따라 검은색 패딩 픽셀을 추가합니다.

RetinaFace  MtCnn은 감지 및 정렬 단계에서 성능이 뛰어난 것으로 보이지만 훨씬 느립니다. 파이프라인 속도가 더 중요하다면 opencv나 ssd를 사용해야 합니다. 반면 정확도를 고려한다면 retinaface나 mtcnn을 사용해야 합니다.

다음 그림에서 볼 수 있듯이 RetinaFace의 성능은 군중 속에서도 매우 만족스럽습니다. 게다가 놀라운 얼굴 랜드마크 감지 성능이 함께 제공됩니다. 강조된 빨간색 점은 눈, 코, 입과 같은 얼굴 랜드마크를 보여줍니다. 그래서 RetinaFace의 정렬 점수도 높습니다.

옐로우 엔젤스 - 페네르바흐체 여자 배구 팀

 

RetinaFace에 대해 더 자세히 알아보려면 이 저장소를 방문하세요 .

 

실시간 분석 - Demo,  React Demo part-i, React Demo part-ii

 

실시간 비디오에도 deepface를 실행할 수 있습니다. 스트림 기능은 웹캠에 액세스하여 얼굴 인식과 얼굴 속성 분석을 모두 적용합니다. 이 기능은 얼굴에 5프레임 연속으로 초점을 맞출 수 있는 경우 프레임을 분석하기 시작합니다. 그런 다음 5초 동안 결과를 보여줍니다.

DeepFace.stream(db_path = "C:/database")

얼굴 인식은 원샷 학습에 기반을 두고 있지만, 한 사람의 얼굴 사진을 여러 장 사용할 수도 있습니다. 아래 그림과 같이 디렉토리 구조를 재정렬해야 합니다.

user
├── database
│   ├── Alice
│   │   ├── Alice1.jpg
│   │   ├── Alice2.jpg
│   ├── Bob
│   │   ├── Bob.jpg

 

 

브라우저에서 직접 얼굴 확인이나 분석 작업을 수행하려는 경우, deepface-react-ui deepface api에 따라 ReactJS를 사용하여 구축된 별도의 저장소가 있습니다.

 

얼굴 안티 스푸핑 - Demo

 

DeepFace에는 또한 주어진 이미지가 진짜인지 가짜인지 이해하기 위한 안티 스푸핑 분석 모듈이 포함되어 있습니다. 이 기능을 활성화하려면 anti_spoofingDeepFace 작업에서 인수를 True로 설정합니다.

 

# anti spoofing test in face detection
face_objs = DeepFace.extract_faces(img_path="dataset/img1.jpg", anti_spoofing = True)
assert all(face_obj["is_real"] is True for face_obj in face_objs)

# anti spoofing test in real time analysis
DeepFace.stream(db_path = "C:/database", anti_spoofing = True)

 

 

API - Demo,Docker Demo

 

DeepFace는 API도 제공합니다 api folder. 자세한 내용은 를 참조하세요. deepface 소스 코드를 복제하고 다음 명령으로 API를 실행할 수 있습니다. 이 명령은 gunicorn 서버를 사용하여 REST 서비스를 시작합니다. 이런 식으로 모바일 앱이나 웹과 같은 외부 시스템에서 deepface를 호출할 수 있습니다.

cd script

# run the service directly
./service.sh

# run the service via docker
./dockerize.sh

API에는 얼굴 인식, 얼굴 속성 분석 및 벡터 표현 기능이 포함되어 있습니다. 이러한 기능은 http post 메서드로 호출해야 합니다. 기본 서비스 엔드포인트는 http://localhost:5005/verify는 얼굴 인식, http://localhost:5005/analyze는 얼굴 속성 분석 및 http://localhost:5005/represent 는 벡터 표현을 위한 것입니다. API는 파일 업로드(양식 데이터를 통해) 또는 정확한 이미지 경로, URL 또는 base64 인코딩된 문자열(JSON 또는 양식 데이터를 통해)로 이미지를 허용하여 다양한 클라이언트 요구 사항에 대한 다양한 옵션을 제공합니다. 여기에서 이러한 메서드를 호출하는 방법을 알아보려면 postman 프로젝트를 찾을 수 있습니다.

 

대규모 얼굴 인식 - Playlist

 

Vector Similarity Search for Machine Learning

Embark on an enlightening journey into the realm of vector search with our meticulously curated YouTube playlist. Delve into the intricacies of approximate n...

www.youtube.com

 

작업에 대규모 데이터 세트에서 얼굴 인식이 필요한 경우 DeepFace를 벡터 인덱스 또는 벡터 데이터베이스와 결합해야 합니다. 이 설정은 정확한 검색 대신 근사적 최근접 이웃 검색을 수행하여 밀리초 내에 수십억 개의 항목이 포함된 데이터베이스에서 얼굴을 식별할 수 있습니다. 일반적인 벡터 인덱스 솔루션에는 Annoy , Faiss , Voyager , NMSLIB , ElasticSearch 가 있습니다 . 벡터 데이터베이스의 경우 인기 있는 옵션은 pgvector 확장 기능이 있는 Postgres  RediSearch 입니다 .

반대로, 작업에 중소 규모 데이터베이스에서의 얼굴 인식이 포함된다면 Postgres , SQLite 와 같은 관계형 데이터베이스 나 Mongo , Redis , Cassandra 와 같은 NoSQL 데이터베이스를 사용하여 정확한 최근접 이웃 검색을 수행할 수 있습니다.

임베딩 암호화 - Demo with PHE, Tutorial for PHE, Demo with FHE,Tutorial for FHE

벡터 임베딩은 원본 이미지로 되돌릴 수 없지만 지문과 같은 민감한 정보가 여전히 포함되어 있어 보안이 중요합니다. 임베딩을 암호화하는 것은 민감한 정보를 조작하거나 추출할 수 있는 적대적 공격을 방지하기 위해 보안 수준이 높은 애플리케이션에 필수적입니다. AES와 같은 기존 암호화 방법은 매우 안전하지만 거리 계산을 위해 클라우드 컴퓨팅 파워를 안전하게 활용하는 데 제한이 있습니다. 여기서 암호화된 데이터에 대한 계산을 허용하는 동형 암호화는 강력한 대안을 제공합니다.

from lightphe import LightPHE

# build an additively homomorphic cryptosystem (e.g. Paillier) on-prem
cs = LightPHE(algorithm_name = "Paillier", precision = 19)

# define plain vectors for source and target
alpha = DeepFace.represent("img1.jpg")[0]["embedding"]
beta = DeepFace.represent("target.jpg")[0]["embedding"]

# encrypt source embedding on-prem - private key not required
encrypted_alpha = cs.encrypt(alpha)

# dot product of encrypted & plain embedding in cloud - private key not required
encrypted_cosine_similarity = encrypted_alpha @ beta

# decrypt similarity on-prem - private key required
calculated_similarity = cs.decrypt(encrypted_cosine_similarity)[0]

# verification
print("same person" if calculated_similarity >= 1 - threshold else "different persons")

# proof of work
assert abs(calculated_similarity - sum(x * y for x, y in zip(alpha, beta))) < 1e-2

 

 

이 방식에서는 클라우드의 계산 능력을 활용하여 암호화된 코사인 유사도를 계산합니다. 그러나 클라우드는 수행하는 실제 계산에 대해 전혀 알지 못합니다. 이것이 바로 동형 암호화의 마법 입니다 ! 온프레미스 측의 비밀 키 보유자만 암호화된 코사인 유사도를 해독하고 쌍이 같은 사람을 나타내는지 다른 개인을 나타내는지 확인할 수 있습니다. LightPHE라이브러리를 확인하여 부분 동형 암호화에 대해 자세히 알아보세요.

Contribution

풀 리퀘스트는 언제나 환영합니다! 대규모 패치를 기여할 계획이라면, 먼저 이슈를 생성하여 사전 질문이나 디자인 결정을 먼저 해결하세요.

PR을 만들기 전에 명령을 실행하여 로컬에서 단위 테스트와 린팅을 실행해야 합니다 make test && make lint. PR이 전송되면 GitHub 테스트 워크플로가 자동으로 실행되고 단위 테스트 및 린팅 작업은 승인 전에 GitHub 작업 에서 사용할 수 있습니다.

Support

프로젝트를 지원하는 방법은 여러 가지가 있습니다. GitHub 저장소를 starring⭐️하는 것은 그 중 하나입니다 🙏

이 작업이 마음에 든다면 Patreon , GitHub Sponsors 또는 Buy Me a Coffee 에서 재정적으로 지원할 수 있습니다 . 또한, 골드, 실버 또는 브론즈 티어의 스폰서가 되면 회사 로고가 GitHub의 README에 표시됩니다.

Citation

연구에 도움이 된다면 출판물에서 deepface를 인용해 주세요.

 

S. Serengil 및 A. Ozpinar, "얼굴 인식 파이프라인의 벤치마크 및 모듈의 공동 사용성 성능" , 정보 기술 저널 , 제17권, 제2호, 95-107쪽, 2024년.

@article{serengil2024lightface,
  title     = {A Benchmark of Facial Recognition Pipelines and Co-Usability Performances of Modules},
  author    = {Serengil, Sefik and Ozpinar, Alper},
  journal   = {Journal of Information Technologies},
  volume    = {17},
  number    = {2},
  pages     = {95-107},
  year      = {2024},
  doi       = {10.17671/gazibtd.1399077},
  url       = {https://dergipark.org.tr/en/pub/gazibtd/issue/84331/1399077},
  publisher = {Gazi University}
}

 

 

SI Serengil 및 A. Ozpinar, "LightFace: 하이브리드 딥 페이스 인식 프레임워크" , 2020년 지능형 시스템 및 애플리케이션 혁신 컨퍼런스(ASYU) , 2020, 23-27쪽.

 

SI Serengil 및 A. Ozpinar, "HyperExtended LightFace: 얼굴 속성 분석 프레임워크" , 2021 국제 엔지니어링 및 신흥 기술 컨퍼런스(ICEET) , 2021, pp. 1-4.

 

또한, GitHub 프로젝트에서 deepface를 사용하는 경우 . deepface을 추가하세요 requirements.txt.

특허

DeepFace는 MIT 라이선스에 따라 라이선스가 부여되었습니다. LICENSE자세한 내용은 여기에서 확인하세요.

DeepFace는 일부 외부 얼굴 인식 모델을 래핑합니다: VGG-Face , Facenet (128d와 512d 모두), OpenFace, DeepFace, DeepID, ArcFace, Dlib, SFace, GhostFaceNet  Buffalo_L . 또한, 연령, 성별 및 인종/민족 모델은 전이 학습을 통해 VGG-Face의 백본에서 학습되었습니다.

마찬가지로, DeepFace는 많은 얼굴 감지기를 래핑합니다: OpenCv , Ssd , Dlib , MtCnn , Fast MtCnn , RetinaFace , MediaPipe , YuNet , Yolo  CenterFace . 마지막으로, DeepFace는 선택적으로 얼굴 스푸핑 방지를 사용하여 제공된 이미지가 진짜인지 가짜인지 판별합니다. 해당 모델을 활용하려는 경우 라이선스 유형이 상속됩니다. 프로덕션 목적으로 해당 모델의 라이선스 유형을 확인하세요.

 

DeepFace 로고는 Adrien Coquet가 제작하였으며 크리에이티브 커먼즈: 저작자표시 3.0 라이선스 에 따라 라이선스가 부여되었습니다 .

728x90
반응형

+ Recent posts