
用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的编译器
果断放弃了, 下面简单记录一下过程吧.

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 的各种问题,各种坑, 各种弯路, 我好怕! 试试吧!
-
先确保pip 或 pipenv 已经安装 (最好配置好使用国内的pypi源 , 速度会快很多)
-
确保您的系统已安装 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时, 出现一些不理解的错误, 我还是全部使用系统环境安装了 ;
- 再安装Numpy+mkl
shell
pip install numpy mkl
- 安装scipy
shell
pip install scipy
- 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++编译的情况, 注意一下)

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
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

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

我用 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'
还真找到了:

解决对策:
先备份原来的这个包, 然后将新的包复制过去, 覆盖原来的
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
怀旧一下: 有人知道这个桥段吗?? 🌞🌞🌞

作者: CLP ; 日期: 2023-2-25 ; 地点: 临沂; 天气: 晴
QQ: 53258372; Mail : 53258372@QQ.com
微信:
