forked from yeyupiaoling/Tensorflow-FaceRecognition
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c548def
commit 6fda6e5
Showing
29 changed files
with
1,977 additions
and
128 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,129 +1,5 @@ | ||
# Byte-compiled / optimized / DLL files | ||
.idea/ | ||
*.pyc | ||
__pycache__/ | ||
*.py[cod] | ||
*$py.class | ||
|
||
# C extensions | ||
*.so | ||
|
||
# Distribution / packaging | ||
.Python | ||
build/ | ||
develop-eggs/ | ||
dist/ | ||
downloads/ | ||
eggs/ | ||
.eggs/ | ||
lib/ | ||
lib64/ | ||
parts/ | ||
sdist/ | ||
var/ | ||
wheels/ | ||
pip-wheel-metadata/ | ||
share/python-wheels/ | ||
*.egg-info/ | ||
.installed.cfg | ||
*.egg | ||
MANIFEST | ||
|
||
# PyInstaller | ||
# Usually these files are written by a python script from a template | ||
# before PyInstaller builds the exe, so as to inject date/other infos into it. | ||
*.manifest | ||
*.spec | ||
|
||
# Installer logs | ||
pip-log.txt | ||
pip-delete-this-directory.txt | ||
|
||
# Unit test / coverage reports | ||
htmlcov/ | ||
.tox/ | ||
.nox/ | ||
.coverage | ||
.coverage.* | ||
.cache | ||
nosetests.xml | ||
coverage.xml | ||
*.cover | ||
*.py,cover | ||
.hypothesis/ | ||
.pytest_cache/ | ||
|
||
# Translations | ||
*.mo | ||
*.pot | ||
|
||
# Django stuff: | ||
*.log | ||
local_settings.py | ||
db.sqlite3 | ||
db.sqlite3-journal | ||
|
||
# Flask stuff: | ||
instance/ | ||
.webassets-cache | ||
|
||
# Scrapy stuff: | ||
.scrapy | ||
|
||
# Sphinx documentation | ||
docs/_build/ | ||
|
||
# PyBuilder | ||
target/ | ||
|
||
# Jupyter Notebook | ||
.ipynb_checkpoints | ||
|
||
# IPython | ||
profile_default/ | ||
ipython_config.py | ||
|
||
# pyenv | ||
.python-version | ||
|
||
# pipenv | ||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. | ||
# However, in case of collaboration, if having platform-specific dependencies or dependencies | ||
# having no cross-platform support, pipenv may install dependencies that don't work, or not | ||
# install all needed dependencies. | ||
#Pipfile.lock | ||
|
||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow | ||
__pypackages__/ | ||
|
||
# Celery stuff | ||
celerybeat-schedule | ||
celerybeat.pid | ||
|
||
# SageMath parsed files | ||
*.sage.py | ||
|
||
# Environments | ||
.env | ||
.venv | ||
env/ | ||
venv/ | ||
ENV/ | ||
env.bak/ | ||
venv.bak/ | ||
|
||
# Spyder project settings | ||
.spyderproject | ||
.spyproject | ||
|
||
# Rope project settings | ||
.ropeproject | ||
|
||
# mkdocs documentation | ||
/site | ||
|
||
# mypy | ||
.mypy_cache/ | ||
.dmypy.json | ||
dmypy.json | ||
|
||
# Pyre type checker | ||
.pyre/ | ||
detection/__pycache__/ | ||
face_db/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
# 人脸和年龄性别识别 | ||
- `camera_demo.py` 调用摄像头进行人脸识别和年龄性别识别,并通过视频展示 | ||
- `camera_main.py` 通过HTTP接口调用启动摄像头,并进行识别,把识别结果返回 | ||
- `server_main.py` 人脸识别和年龄性别识别,通过HTTP调用,接收传过来的图片进行识别并返回结果 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
import configparser | ||
import cv2 | ||
import numpy as np | ||
import sklearn | ||
from utils import face_preprocess | ||
from utils.utils import feature_compare, load_mtcnn, load_faces, load_mobilefacenet, add_faces | ||
|
||
conf = configparser.ConfigParser() | ||
conf.read("config/main.cfg") | ||
# 加载人脸检测模型 | ||
VERIFICATION_THRESHOLD = float(conf.get("MOBILEFACENET", "VERIFICATION_THRESHOLD")) | ||
|
||
# 检测人脸检测模型 | ||
mtcnn_detector = load_mtcnn(conf) | ||
# 加载人脸识别模型 | ||
face_sess, inputs_placeholder, embeddings = load_mobilefacenet(conf) | ||
# 添加人脸 | ||
add_faces(conf, mtcnn_detector) | ||
# 加载已经注册的人脸 | ||
faces_db = load_faces(conf, face_sess, inputs_placeholder, embeddings) | ||
|
||
|
||
# 注册人脸 | ||
def register_face(): | ||
print("点击y确认拍照!") | ||
cap = cv2.VideoCapture(0) | ||
while True: | ||
ret, frame = cap.read() | ||
if ret: | ||
cv2.imshow('image', frame) | ||
if cv2.waitKey(1) & 0xFF == ord('y'): | ||
faces, landmarks = mtcnn_detector.detect(frame) | ||
if faces.shape[0] is not 0: | ||
faces_sum = 0 | ||
bbox = [] | ||
points = [] | ||
for i, face in enumerate(faces): | ||
if round(faces[i, 4], 6) > 0.95: | ||
bbox = faces[i, 0:4] | ||
points = landmarks[i, :].reshape((5, 2)) | ||
faces_sum += 1 | ||
if faces_sum == 1: | ||
nimg = face_preprocess.preprocess(frame, bbox, points, image_size='112,112') | ||
user_name = input("请输入注册名(不支持中文):") | ||
cv2.imwrite('face_db/%s.png' % user_name, nimg) | ||
print("注册成功!") | ||
else: | ||
print('注册图片有错,图片中有且只有一个人脸') | ||
else: | ||
print('注册图片有错,图片中有且只有一个人脸') | ||
break | ||
|
||
|
||
def infer_face(): | ||
cap = cv2.VideoCapture(0) | ||
while True: | ||
ret, frame = cap.read() | ||
if ret: | ||
faces, landmarks = mtcnn_detector.detect(frame) | ||
if faces.shape[0] is not 0: | ||
faces_sum = 0 | ||
for i, face in enumerate(faces): | ||
if round(faces[i, 4], 6) > 0.95: | ||
faces_sum += 1 | ||
if faces_sum == 0: | ||
continue | ||
# 人脸信息 | ||
info_location = np.zeros(faces_sum) | ||
info_location[0] = 1 | ||
info_name = [] | ||
probs = [] | ||
# 提取图像中的人脸 | ||
input_images = np.zeros((faces.shape[0], 112, 112, 3)) | ||
for i, face in enumerate(faces): | ||
if round(faces[i, 4], 6) > 0.95: | ||
bbox = faces[i, 0:4] | ||
points = landmarks[i, :].reshape((5, 2)) | ||
nimg = face_preprocess.preprocess(frame, bbox, points, image_size='112,112') | ||
nimg = nimg - 127.5 | ||
nimg = nimg * 0.0078125 | ||
input_images[i, :] = nimg | ||
|
||
# 进行人脸识别 | ||
feed_dict = {inputs_placeholder: input_images} | ||
emb_arrays = face_sess.run(embeddings, feed_dict=feed_dict) | ||
emb_arrays = sklearn.preprocessing.normalize(emb_arrays) | ||
for i, embedding in enumerate(emb_arrays): | ||
embedding = embedding.flatten() | ||
temp_dict = {} | ||
# 比较已经存在的人脸数据库 | ||
for com_face in faces_db: | ||
ret, sim = feature_compare(embedding, com_face["feature"], 0.70) | ||
temp_dict[com_face["name"]] = sim | ||
dict = sorted(temp_dict.items(), key=lambda d: d[1], reverse=True) | ||
if dict[0][1] > VERIFICATION_THRESHOLD: | ||
name = dict[0][0] | ||
probs.append(dict[0][1]) | ||
info_name.append(name) | ||
else: | ||
probs.append(dict[0][1]) | ||
info_name.append("unknown") | ||
|
||
for k in range(faces_sum): | ||
# 写上人脸信息 | ||
x1, y1, x2, y2 = faces[k][0], faces[k][1], faces[k][2], faces[k][3] | ||
x1 = max(int(x1), 0) | ||
y1 = max(int(y1), 0) | ||
x2 = min(int(x2), frame.shape[1]) | ||
y2 = min(int(y2), frame.shape[0]) | ||
prob = '%.2f' % probs[k] | ||
label = "{}, {}".format(info_name[k], prob) | ||
size = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 1, 2)[0] | ||
cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2) | ||
cv2.rectangle(frame, (x1, y1 - size[1]), (x1 + size[0], y1), (255, 0, 0), cv2.FILLED) | ||
cv2.putText(frame, label, (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2) | ||
cv2.imshow('image', frame) | ||
if cv2.waitKey(1) & 0xFF == ord('q'): | ||
break | ||
|
||
|
||
if __name__ == '__main__': | ||
i = int(input("请选择功能,1为注册人脸,2为识别人脸:")) | ||
if i == 1: | ||
register_face() | ||
elif i == 2: | ||
infer_face() | ||
else: | ||
print("功能选择错误") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
[MTCNN] | ||
MODEL_PATH = ./models/mtcnn_model | ||
MIN_FACE_SIZE = 120 | ||
STEPS_THRESHOLD = 0.9,0.6,0.7 | ||
|
||
[MOBILEFACENET] | ||
MODEL_PATH = ./models/mobilefacenet_model/MobileFaceNet_9925_9680.pb | ||
VERIFICATION_THRESHOLD = 0.6 | ||
FACE_DB_PATH = ./face_db/ | ||
TEMP_FACE_PATH = ./temp/ | ||
|
||
[SERVER] | ||
HOST = 192.168.89.175 | ||
POST = 5000 |
Oops, something went wrong.