這裡介紹一個叫 DeepFace 的套件, 希望你能得到點啟發, 神速做個有趣的小 app 出來!
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
!pip install deepface
Collecting deepface Downloading deepface-0.0.67-py3-none-any.whl (61 kB) |████████████████████████████████| 61 kB 3.1 MB/s Requirement already satisfied: pandas>=0.23.4 in /usr/local/lib/python3.7/dist-packages (from deepface) (1.1.5) Requirement already satisfied: opencv-python>=3.4.4 in /usr/local/lib/python3.7/dist-packages (from deepface) (4.1.2.30) Requirement already satisfied: Pillow>=5.2.0 in /usr/local/lib/python3.7/dist-packages (from deepface) (7.1.2) Requirement already satisfied: Flask>=1.1.2 in /usr/local/lib/python3.7/dist-packages (from deepface) (1.1.4) Requirement already satisfied: tqdm>=4.30.0 in /usr/local/lib/python3.7/dist-packages (from deepface) (4.41.1) Collecting mtcnn>=0.1.0 Downloading mtcnn-0.1.1-py3-none-any.whl (2.3 MB) |████████████████████████████████| 2.3 MB 7.5 MB/s Collecting retina-face>=0.0.1 Downloading retina_face-0.0.5-py3-none-any.whl (14 kB) Collecting gdown>=3.10.1 Downloading gdown-3.13.0.tar.gz (9.3 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing wheel metadata ... done Requirement already satisfied: numpy>=1.14.0 in /usr/local/lib/python3.7/dist-packages (from deepface) (1.19.5) Requirement already satisfied: keras>=2.2.0 in /usr/local/lib/python3.7/dist-packages (from deepface) (2.4.3) Requirement already satisfied: tensorflow>=1.9.0 in /usr/local/lib/python3.7/dist-packages (from deepface) (2.5.0) Requirement already satisfied: itsdangerous<2.0,>=0.24 in /usr/local/lib/python3.7/dist-packages (from Flask>=1.1.2->deepface) (1.1.0) Requirement already satisfied: Werkzeug<2.0,>=0.15 in /usr/local/lib/python3.7/dist-packages (from Flask>=1.1.2->deepface) (1.0.1) Requirement already satisfied: click<8.0,>=5.1 in /usr/local/lib/python3.7/dist-packages (from Flask>=1.1.2->deepface) (7.1.2) Requirement already satisfied: Jinja2<3.0,>=2.10.1 in /usr/local/lib/python3.7/dist-packages (from Flask>=1.1.2->deepface) (2.11.3) Requirement already satisfied: filelock in /usr/local/lib/python3.7/dist-packages (from gdown>=3.10.1->deepface) (3.0.12) Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from gdown>=3.10.1->deepface) (1.15.0) Requirement already satisfied: requests[socks]>=2.12.0 in /usr/local/lib/python3.7/dist-packages (from gdown>=3.10.1->deepface) (2.23.0) Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from Jinja2<3.0,>=2.10.1->Flask>=1.1.2->deepface) (2.0.1) Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from keras>=2.2.0->deepface) (3.13) Requirement already satisfied: scipy>=0.14 in /usr/local/lib/python3.7/dist-packages (from keras>=2.2.0->deepface) (1.4.1) Requirement already satisfied: h5py in /usr/local/lib/python3.7/dist-packages (from keras>=2.2.0->deepface) (3.1.0) Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.23.4->deepface) (2.8.1) Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.23.4->deepface) (2018.9) Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests[socks]>=2.12.0->gdown>=3.10.1->deepface) (2.10) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests[socks]>=2.12.0->gdown>=3.10.1->deepface) (1.24.3) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests[socks]>=2.12.0->gdown>=3.10.1->deepface) (2021.5.30) Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests[socks]>=2.12.0->gdown>=3.10.1->deepface) (3.0.4) Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.7/dist-packages (from requests[socks]>=2.12.0->gdown>=3.10.1->deepface) (1.7.1) Requirement already satisfied: typing-extensions~=3.7.4 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (3.7.4.3) Requirement already satisfied: protobuf>=3.9.2 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (3.17.3) Requirement already satisfied: flatbuffers~=1.12.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (1.12) Requirement already satisfied: absl-py~=0.10 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (0.12.0) Requirement already satisfied: keras-nightly~=2.5.0.dev in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (2.5.0.dev2021032900) Requirement already satisfied: astunparse~=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (1.6.3) Requirement already satisfied: tensorflow-estimator<2.6.0,>=2.5.0rc0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (2.5.0) Requirement already satisfied: grpcio~=1.34.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (1.34.1) Requirement already satisfied: google-pasta~=0.2 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (0.2.0) Requirement already satisfied: wheel~=0.35 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (0.36.2) Requirement already satisfied: gast==0.4.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (0.4.0) Requirement already satisfied: termcolor~=1.1.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (1.1.0) Requirement already satisfied: keras-preprocessing~=1.1.2 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (1.1.2) Requirement already satisfied: tensorboard~=2.5 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (2.5.0) Requirement already satisfied: wrapt~=1.12.1 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (1.12.1) Requirement already satisfied: opt-einsum~=3.3.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow>=1.9.0->deepface) (3.3.0) Requirement already satisfied: cached-property in /usr/local/lib/python3.7/dist-packages (from h5py->keras>=2.2.0->deepface) (1.5.2) Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.5->tensorflow>=1.9.0->deepface) (0.6.1) Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.5->tensorflow>=1.9.0->deepface) (3.3.4) Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.5->tensorflow>=1.9.0->deepface) (0.4.4) Requirement already satisfied: google-auth<2,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.5->tensorflow>=1.9.0->deepface) (1.32.1) Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.5->tensorflow>=1.9.0->deepface) (1.8.0) Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard~=2.5->tensorflow>=1.9.0->deepface) (57.2.0) Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow>=1.9.0->deepface) (4.7.2) Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow>=1.9.0->deepface) (4.2.2) Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow>=1.9.0->deepface) (0.2.8) Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.5->tensorflow>=1.9.0->deepface) (1.3.0) Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard~=2.5->tensorflow>=1.9.0->deepface) (4.6.1) Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard~=2.5->tensorflow>=1.9.0->deepface) (0.4.8) Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.5->tensorflow>=1.9.0->deepface) (3.1.1) Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->markdown>=2.6.8->tensorboard~=2.5->tensorflow>=1.9.0->deepface) (3.5.0) Building wheels for collected packages: gdown Building wheel for gdown (PEP 517) ... done Created wheel for gdown: filename=gdown-3.13.0-py3-none-any.whl size=9046 sha256=ff931b1a5b93eb72771dada48c473d8446364322a4625d8743c84261fc017042 Stored in directory: /root/.cache/pip/wheels/2f/2a/2f/86449b6bdbaa9aef873f68332b68be6bfbc386b9219f47157d Successfully built gdown Installing collected packages: gdown, retina-face, mtcnn, deepface Attempting uninstall: gdown Found existing installation: gdown 3.6.4 Uninstalling gdown-3.6.4: Successfully uninstalled gdown-3.6.4 Successfully installed deepface-0.0.67 gdown-3.13.0 mtcnn-0.1.1 retina-face-0.0.5
from deepface import DeepFace
Directory /root /.deepface created Directory /root /.deepface/weights created
!wget --no-check-certificate \
https://github.com/yenlung/Deep-Learning-Basics/raw/master/images/photos.zip \
-O /content/photos.zip
--2021-08-06 08:43:19-- https://github.com/yenlung/Deep-Learning-Basics/raw/master/images/photos.zip Resolving github.com (github.com)... 52.192.72.89 Connecting to github.com (github.com)|52.192.72.89|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://raw.githubusercontent.com/yenlung/Deep-Learning-Basics/master/images/photos.zip [following] --2021-08-06 08:43:19-- https://raw.githubusercontent.com/yenlung/Deep-Learning-Basics/master/images/photos.zip Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.111.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1758026 (1.7M) [application/zip] Saving to: ‘/content/photos.zip’ /content/photos.zip 100%[===================>] 1.68M --.-KB/s in 0.1s 2021-08-06 08:43:20 (16.9 MB/s) - ‘/content/photos.zip’ saved [1758026/1758026]
再來就是解壓縮。
import os
import zipfile
local_zip = '/content/photos.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/content')
zip_ref.close()
我們在 /content/photos
這個資料夾下的架構如下:
faces: 每個人有獨立的資料夾。
另外有準備做測試的一些照片。
這裡只是秀出照片, 看照片內容是什麼。
import cv2
def show_image(*args):
k = len(args)
fig = plt.figure(figsize=(5*k, 5))
for i, photo in enumerate(args):
plt.subplot(1,k,i+1)
plt.axis('off')
plt.axis('equal')
plt.imshow(cv2.cvtColor(photo, cv2.COLOR_BGR2RGB))
使用方式是這樣, 如果有一張照片 im01
要秀出來:
show_image(im01)
多張照片同時要秀出來也可以, 比如說:
show_image(im01, im02)
等等。
verify
看兩個人是不是同一個人¶base_dir = "/content/photos"
face_dir = "/content/photos/faces"
im01_path = base_dir + '/' + "yenjan.jpg"
im01 = cv2.imread(im01_path)
im02_path = face_dir + '/yenjan/yenjan01.jpg'
im02 = cv2.imread(im02_path)
show_image(im01, im02)
result = DeepFace.verify(im01, im02)
我們看看 result
。
result
{'distance': 0.21004351387743403, 'max_threshold_to_verify': 0.4, 'model': 'VGG-Face', 'similarity_metric': 'cosine', 'verified': True}
這裡的重點是 verified
, 看是否為同一個人。因此我們也可以直接看結論:
result[`verified`]
另外我們還可以選不同的 model
來做這件事。有多項選擇可用:
VGG-Face
, Facenet
, Facenet512
, OpenFace
, DeepFace
, DeepID
, ArcFace
, Dlib
比如說我們想試試 Facenet512
, 那就是這麼下指令。
result = DeepFace.verify(im01, im02, model_name="Facenet512")
result['verified']
True
faces
資料夾, 之下每個人都有自己的資料夾就可以。而且, 我們不需要自己寫程式一一比對, 因為 DeepFace
預計我們就是要做這件事!!find
辨識一下這位是誰¶im03_path = base_dir + '/' + "mengjie.jpg"
im03 = cv2.imread(im03_path)
show_image(im03)
以下就是人臉辨識示範。我們只需要輸入照片的檔名, 再來是放有每個人照片資料夾的路徑就好。這裡用了
enforce_detection=False
是有時系統找不到人臉在哪裡 (!#@*$) 於是我們就說找不到就別找了。
df = DeepFace.find(img_path=im03_path, db_path=face_dir, enforce_detection=False)
WARNING: Representations for images in /content/photos/faces folder were previously stored in representations_vgg_face.pkl . If you added new instances after this file creation, then please delete this file and call find function again. It will create it again. There are 7 representations found in representations_vgg_face.pkl find function lasts 0.5007319450378418 seconds
這是一個 pandas
(終於出現了!) 的 DataFrame。第 0 筆數據就是判定最像的那一位! 因為我們把每個人的名字當資料夾名稱, 所以想辦法找出資料夾名稱, 我們就知道是誰了!
name = df.loc[0].values[0].split('/')[-2]
print(f"我辨識這位是 {name}。")
我辨識這位是 mengjie。
analyze
分析一下照片中這個人¶我們可以分析一下照片中這個人的性別、年齡、種族、情緒!
im04_path = base_dir + '/' + "tseyu.jpg"
im04 = cv2.imread(im04_path)
show_image(im04)
obj = DeepFace.analyze(img_path = im04_path, actions = ['age', 'gender', 'race', 'emotion'])
Action: emotion: 100%|██████████| 4/4 [00:02<00:00, 1.61it/s]
obj
{'age': 32, 'dominant_emotion': 'sad', 'dominant_race': 'asian', 'emotion': {'angry': 0.06337279337458313, 'disgust': 0.01596664951648563, 'fear': 4.1415490210056305, 'happy': 2.0698627457022667, 'neutral': 35.38447618484497, 'sad': 58.320462703704834, 'surprise': 0.004311823795433156}, 'gender': 'Man', 'race': {'asian': 89.49413299560547, 'black': 0.24159520398825407, 'indian': 1.681152917444706, 'latino hispanic': 6.250745803117752, 'middle eastern': 0.10842719348147511, 'white': 2.2239448502659798}, 'region': {'h': 354, 'w': 354, 'x': 251, 'y': 206}}
這裡做個簡單示範, 看我們如何更親切的呈現結果。
labels = {'angry':'生氣', 'disgust':'厭惡', 'fear':'恐懼',
'happy':'開心', 'neutral':'沒什麼特別表情',
'sad':'悲傷', 'surprise':'吃驚',
'Man':'男', 'Woman':'女',
'asian':'亞洲', 'black':'黑', 'indian':'印弟安',
'latino hispanic':'拉丁美洲 (西班牙裔)',
'middle eastern':'中東', 'white':'白'}
def show_info(obj):
age = obj['age']
emotion = labels[obj['dominant_emotion']]
race = labels[obj['dominant_race']]
gender = labels[obj['gender']]
text = f"這是一位 {age} 歲的{race}人{gender}子, 他感覺是{emotion}的。"
print(text)
show_info(obj)
這是一位 32 歲的亞洲人男子, 他感覺是悲傷的。
im05_path = base_dir + "/yanwen.jpg"
im05 = cv2.imread(im05_path)
obj = DeepFace.analyze(img_path = im05_path, actions = ['age', 'gender', 'race', 'emotion'])
Action: emotion: 100%|██████████| 4/4 [00:02<00:00, 1.36it/s]
show_image(im05)
show_info(obj)
這是一位 40 歲的亞洲人男子, 他感覺是恐懼的。
相信大家這裡可以做出許多有趣的應用, 比如說: