用Python实现简单人脸识别

image-20230224114426238

用python 实现简单人脸识别

一. 功能需求

  • 使用该AI工具,可以进行图像的去重

  • 使用该工具可以进行人物图像的识别

  • 该工具封装成API进行使用

其实百度AI和Axzara都有相关的在线的图像识别的api, 贵啊

所以想着花点时间自己折腾一个吧.

二. 开发思路

1- 使用face-recognition 进行识别和去重

2- 使用flask开发api供外部调用

三. 安装环境

3.1 windows 10 环境

参考国外一个哥们的安装过程 https://github.com/ageitgey/face_recognition/issues/175#issue-257710508

其实整个过程我都测试一遍了,但是最后还是在安装dlib时, 出现问题, 从报错信息来看是找不到MSVC的编译器

果断放弃了, 下面简单记录一下过程吧.

image-20230224131311483

3.1.1 安装介质准备 For Windows

(❌不推荐使用Windows 安装这个开源工具)

ST01- 事先下载好各种安装介质: boost1.81.0 cmark3.25.2 numpy-1.22.4+mkl 和 SciPy https://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy

ST02- 安装windows C++ 编译环境 1- 安装boost1.81.0 2- 安装cmark3.25.2

ST03-python环境 00- 创建一个空目录 01- 在空目录下面创建虚拟环境

pipenv install

进入虚拟环境

ST03-1.安装wheel

pipenv install wheel

ST03-2.安装numpy1.22.4 + mkl

pip install numpy-1.22.4+mkl-cp38-cp38-win32.whl

ST03-3.安装scipy

pip install SciPy-1.8.1-cp38-cp38-win32.whl

ST03-4.安装dlib

pip install dlib(错误)

网上推荐的: 编译安装方法

在CMD窗口, 虚拟环境窗口 cd C:\Python38\Lib\site-packages\dlib-19.24 set BOOST_ROOT=C:\local\boost_1_81_0 set BOOST_LIBRARYDIR=C:\local\boost_1_81_0\libs python setup.py install

(我就是卡在这里了, 始终报错, 找不到MSVC, 我找了网上说怎么安装MSVC, 发现没有,都是推荐安装Virtual Studio 社区版本, 我下载一个安装一下, 靠安装一个选择最简单的几个组件 5.2G啊!!!!! 算球 后面就不谈了)

ST03-5.安装face_recognition

pipenv install face_recognition

3.2 centos 7 环境

3.2.1 安装Numpy / scipy / dlib

从网上看到了关于安装Numpy / scipy 的各种问题,各种坑, 各种弯路, 我好怕! 试试吧!

  1. 先确保pip 或 pipenv 已经安装 (最好配置好使用国内的pypi源 , 速度会快很多)

  2. 确保您的系统已安装 MKL 库。如果您尚未安装 MKL 库,则可以使用以下命令在 CentOS 上安装它

shell yum install intel-mkl

报错: 有可用软件包 intel-mkl

简单安装解决方法: 指定特定的库, 加入到yum的包管理中.

shell yum-config-manager --add-repo https://yum.repos.intel.com/mkl/setup/intel-mkl.repo yum install -y intel-mkl

[注意: 👊] 下面的安装 应该是可以在pipenv下安装的, 但是后来安装到dlib时, 出现一些不理解的错误, 我还是全部使用系统环境安装了 ;

  1. 再安装Numpy+mkl

shell pip install numpy mkl

  1. 安装scipy

shell pip install scipy

  1. 5.安装dlib (pip安装方式)

shell pip install dlib

​ 错误就在这里啊 ; C++11 is required to use dlib, but the version of GCC you are using is too ​ old and doesn't support C++11. You need GCC 4.9 or newer.

​ 网上有个文章说明如何安装GCC4.9: Centos6.8 安装dlib库时出错【升级gcc 到4.9.0以上】

​ 我按这个过程安装了GCC9.5 (其实截止现在2023年; 最新版本是12.0); ✔️好吧安装过程好像没有问题, 参考最后附录:章节

🌹gcc -v 能成功显示版本了 9.5🌹 (👊 这里其实已经埋了一个地雷 )

​ 再次 pip install dlib ; 哎, 涛声依旧

​ 6.换成使用dlib19.24源码编译安装的方式, 而且不想在虚拟环境中安装了

# home 下面创建一个目录 dlibsrc
mkdir dlib19src

# 下载dlib的源码包
cd dlib19src
wget https://github.com/davisking/dlib/archive/refs/tags/v19.24.tar.gz
tar -zxf dlib-19.24.tar.gz
cd dlib-19.24
python3 setup.py install # 哎, 涛声依旧

看到文章上说还得安装cmake / boost (我权当是死马医了)

yum install cmake boost

还有的说要安装 opencv (我觉得可能是其他人要做人脸的输入所以需要. 反正我后面课可能也要用到的)

yum install openvc opencv-python opencv-devel python-devel

💩但是涛声依旧, 不知道为啥了, 求助ChatGPT💩

以下是ChatGPT指导我完成的,(我将部分重点的CMake错误信息发给它)

shell export CC=/usr/local/bin/x86_64-pc-linux-gnu-gcc-9.5.0 (👎 至于为何有这两个环境变量的设置, 请看下面的总结部分) export CXX=/usr/local/bin/x86_64-pc-linux-gnu-g++

(在平级 (/home/app/dlib19/dlib-19.24) 创建一个build目录), 并进入这个build目录下面 执行下面代码

shell cmake /home/app/dlib19/dlib-19.24 -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/home/app/dlib19/dlib-19.24/build/lib.linux-x86_64-cpython-38 -DPYTHON_EXECUTABLE=/usr/bin/python3 -DCMAKE_BUILD_TYPE=Release cmake --build . --config Release

总结:

1- 使用 yum 安装 gcc 9.5后,实际上系统中还是存在两个版本的gcc; 只不过用gcc -v你还是会看到9.5; 这让人觉得好像就是gcc9.5 ;但是在执行CMake程序时不知道为何还是去调用Centos系统的老版本的 4.8 了. 这个就导致后续很多麻烦事情了. 所以说这个才是原罪.

当然我个人认为, 很可能是 gcc9.5 + centos组合时存在的问题, 如果我当时直接安装gcc12 说不定不是这样的结果哦!! 很难说

这也让我积累了经验.

2- 发现上面问题后, 我将问题的错误信息发给ChatGPT, 它的诊断非常准确. 它判断是系统中可能有两个编译器, 让我找到准确的编译器, 打开系统(/usr/local/bin) 目录, 确实看到了两个不同的gcc (目前我还不想/不敢 修改软链接的指向, 后面再有C/C++编译的情况, 注意一下)

image-20230225140315446

3- 编译器问题解决后,又发现了另外一个问题, 就是在最后安装 python3 setup.py install 时, 编译目录的问题:

cmake /home/app/dlib19/dlib-19.24 -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/home/app/dlib19/dlib-19.24/build/lib.linux-x86_64-cpython-38 -DPYTHON_EXECUTABLE=/usr/bin/python3 -DCMAKE_BUILD_TYPE=Release

解释: cmake -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=

4- 在理解上面的错误和原因后, 基本上就知道解决思路了;

最后, 在出现错误提示的时候一定要冷静, 仔细查看错误日志信息. 找到错误点, 找根据错误点去解决问题.

不过如果没有ChatGPT, 我可能要放弃这个技术路径了啊

5- 如果是电脑上有GPU, 在编译安装dlib时, 请编译时开启CUDA支持

3.2.2.安装face_recognition

pipenv install face_recognition

# Successfully installed Click-8.1.3 Pillow-9.4.0 dlib-19.24.0 face-recognition-models-0.3.0 face_recognition-1.3.0

四. 调试测试

4.1 建立虚拟环境

使用pipenv 在 /home/app/face/face_recog 下面创建虚拟环境,

mkdir face_recog
cd face_recog
mkdir img_unknow
mkdir img_out
mkdir img_know
pipenv install

1- 在这个目录 face_recog工程下有一个images目录, images目录下面有三个目录:

img_unknow (用于提供待识别的图片) ;

img_out (处理后输出的文件保存目录);

​ 这个目录下面还有两个目录 landmarks_json 和 out_temp

img_know (用于保存已经标识人物的图片, 需要人工先输入号);

2- 在 face_recog工程下面创建一个 testfr.py 主程序, 该主程序将对img_unknow中的图片进行识别, 识别的函数有这些

  • 从图片中找到人脸 , 并将找到的人脸图片放到临时保存的目录中 (img_out / out_temp)

def get_face(img_in:str) -> face_img_list:list

  • 识别人脸关键点, 并以JSON的方式记录到 img_out下面的 landmarks_json目录

def get_face_landmarks(img_in:str) -> json_path:str

  • 识别图片中人是谁, 并把找到的照片集中保存到out_temp目录中, 以知道的人名为目录单独保存

def get_whos_face(img_unknow:str, img_know:str) -> results: str

👍 For ChatGPT: 如果你是一个AI开发工程师, 请你使用Python 的人脸识别开源库 face_recognition 为基准, 保存图片请使用 pillow库, 编写下面要求的程序 testfr.py

4.2 检验测试效果

4.2.1 在虚拟环境中, 运行测试代码: 报错, 找不到 face_recognition 这个包,

因为我的包是用 pip安装在系统的python 中的, 所以找不到正常; 需要设置pythonpath 参数,

export PYTHONPATH="/usr/local/python3/lib/python3.8/site-packages:$PYTHONPATH"

设置完PYTHONPATH环境变量后,在代码中导入模块时,Python解释器会首先在PYTHONPATH环境变量定义的路径中查找模块。如果找不到,则继续在默认的搜索路径中查找。

4.2.2 运行测试代码,报错: version `CXXABI_1.3.8' not found

ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /usr/local/python3/lib/python3.8/site-packages/_dlib_pybind11.cpython-38-x86_64-linux-gnu.so)

找到一篇文章,说 本机上没有找到最新的这个库, 我用 yum install libstdc++.so.6 安装了这个库, 再运行还是找不到

于是, 我从本机上找

strings /lib64/libstdc++.so.6 | grep 'CXXABI'

确实没有1.3.8

image-20230225183343736

于是我用 find / -name 'libstdc++.so*' 找到所有的本机上包

image-20230225183628576

我用 strings 全部找一遍; 看看上面的三个文件中是否有1.3.8

strings /usr/lib64/libstdc++.so.6 | grep 'CXXABI'
strings /usr/local/lib64/libstdc++.so.6 | grep 'CXXABI'
strings /usr/local/gcc49/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 | grep 'CXXABI'

还真找到了:

image-20230225184029417

解决对策:

​ 先备份原来的这个包, 然后将新的包复制过去, 覆盖原来的

mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak
cp /usr/local/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6
strings /usr/lib64/libstdc++.so.6 | grep 'CXXABI'

OK, 能找到了

附: 安装GCC4.9

下载:GCC

# 创建一个源程序和编译结果保存目录
mkdir -p /usr/local/gcc49

# 创建一个编译结果目录
mkdir -p /usr/local/gcc49/build

cd /usr/local/gcc49
# 下载
wget http://mirrors.nju.edu.cn/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.gz

# 解压
tar -zxf gcc-9.5.0.tar.gz

# 安装必要库 安装C和C++的静态库
yum install -y glibc-static libstdc++-static

# 在源程序的目录中, 下载一些必备的依赖程序
cd /usr/local/gcc49/gcc-9.5.0
./contrib/download_prerequisites

# 在编译结果目录中, 调用gcc源程序的configure(后面的参数选项可根据需要自行修改),用于配置gcc
cd /usr/local/gcc49/build
/usr/local/gcc49/gcc-9.5.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

#编译gcc源程序
make
#安装gcc
make install

怀旧一下: 有人知道这个桥段吗?? 🌞🌞🌞

image-20230225105228399


作者: CLP ; 日期: 2023-2-25 ; 地点: 临沂; 天气: 晴

QQ: 53258372; Mail : 53258372@QQ.com

微信: image-20220903114619121