Python中大名鼎鼎的face_recognition使用

背景

face_recognition是号称世界上最简单的人脸识别工具和Python库。虽然,是国外开源的项目(良心的MIT开源协议),竟然有官方的中文文档支持,从未见过如此亲近天朝人民的开源项目了。

问题

手里有一张目标人物图,需要从一堆图片文件中,找出这个人是谁?这一堆的图片文件时,按人的姓名分类的。本来想直接使用face_recognition命令行解决,如下:

face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/

然而,我的unknown_pictures文件下面是按人姓名做为文件夹划分的,face_recognition不支持递归文件夹来找文件,所以,就只能编写python程序来解决了。

Python3

from __future__ import division
from tqdm import tqdm

import os
import face_recognition
import imghdr
import sys


def get_all_files(path_dir):
    all_file = []
    for dir_path, dir_names, filenames in os.walk(path_dir):
        for dir_ in dir_names:
            all_file.append(os.path.join(dir_path, dir_))
        for name in filenames:
            all_file.append(os.path.join(dir_path, name))
    return all_file


def get_image_file(file_check):
    if os.path.isfile(file_check):
        if imghdr.what(file_check) == 'jpeg':
            unknown_picture = face_recognition.load_image_file(file_check)
            unknown_face_encoding_list = face_recognition.face_encodings(unknown_picture)
            if len(unknown_face_encoding_list) > 0:
                unknown_face_encoding = unknown_face_encoding_list[0]
                results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding, tolerance=0.2)
                if results[0]:
                    return file_check


if __name__ == '__main__':
    picture_of_me = face_recognition.load_image_file(
        "/Users/zhangyalin/Downloads/images/pictures_of_people_i_know/zyl.jpg")
    my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]

    resultList = []

    path = "/Users/zhangyalin/Downloads/images/unknown_pictures/"
    files = get_all_files(path)
    num_tasks = len(files)
    for file in tqdm(files):
        fileTarget = get_image_file(file)
        if fileTarget is not None:
            resultList.append(file)
            break
    print("定位:")
    print(resultList)
    sys.exit()

这里就是递归unknown_pictures文件夹,然后不断将获得的图像中人脸与pictures_of_people_i_know/zyl.jpg图像中人脸进行对比,而zyl.jpg中人叫zyl。具体可以去看Face Recognition 人脸识别,说的很清楚的。

Note:tolerance=0.2,容错率需要设置为0.2,这样人脸识别更加准确。熟悉Python线程池的朋友,可以补充完善一下上面的代码。

参考

转载于:https://my.oschina.net/fxtxz2/blog/2967570

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值