人脸检测(一)——MTCNN集成包安装使用指南

0. 引言

初衷:  
  当前已经有很多博客对MTCNN的原理分析,不过对于很多从事人脸研究(非人脸检测)的小伙伴而言,人脸检测只是一个前置步骤,并不需要了解太多,更不需要做技术上的创新,只需要效果不错的人脸检测工具箱就好。
  既然只是需要一个工具箱,自然选择尽量省事的方法,也就是不需要我们训练网络的方法。因此,本指南只面向于将人脸检测作为工具箱的小伙伴,若想进一步研究的大佬,请移步github查找MTCNN的代码。
  本文参考:https://github.com/ipazc/mtcnn

1. 安装

  1. 环境
    python >= 3.4
    opencv >= 4.1
    tensorflow >=1.12.0
conda install tensorflow-gpu
pip install opencv-python
  1. 安装
pip install mtcnn

整个安装过程就是这么简单

2. 使用

  1. 检测
    我们用Vggface数据库中的一张图片进行测试
    在这里插入图片描述
from mtcnn.mtcnn import MTCNN
import cv2

img = cv2.imread("/vggface2/test/n000001/0001_01.jpg")
detector = MTCNN()
face = detector.detect_faces(img)
print(face)
  1. 坐标输出
    运行上述指令,会得到以下结果
[{'box': [57, 71, 79, 97],
 'confidence': 0.9995273351669312, 
 'keypoints': {'left_eye': (73, 110), 
 				'right_eye': (106, 104), 
 				'nose': (89, 133), 
 				'mouth_left': (82, 147), 
 				'mouth_right': (114, 141)}}]

上述数值分别表示:
  box:[x, y, width, height],x,y是人脸框左上角坐标的位置,width是框的宽度,height是框的高度。
  cofidence:自信度
  keypoints:左/右眼,左/右嘴角,鼻子,五个关键点的坐标

  1. 可视化
    有了坐标就可以在图中绘制了
    检测的结果是一个被矩阵包围的多层字典,因此需要一层又一层把坐标信息提取出来
face = face[0]
#画框
box = face["box"]

I = cv2.rectangle(img, (box[0],box[1]),(box[0]+box[2], box[1]+box[3]), (255, 0, 0), 2)

#画关键点
left_eye = face["keypoints"]["left_eye"]
right_eye = face["keypoints"]["right_eye"]
nose = face["keypoints"]["nose"]
mouth_left = face["keypoints"]["mouth_left"]
mouth_right = face["keypoints"]["mouth_right"]

points_list = [(left_eye[0], left_eye[1]),
               (right_eye[0], right_eye[1]),
               (nose[0], nose[1]),
               (mouth_left[0], mouth_left[1]),
               (mouth_right[0], mouth_right[1])]
for point in points_list:
	cv2.circle(I, point, 1, (255, 0, 0), 4)
#保存
cv2.imwrite('result.jpg',I,[int(cv2.IMWRITE_JPEG_QUALITY),70])

效果如下:
在这里插入图片描述
当然也可以根据个人需求,不需要画出五个关键点
在这里插入图片描述

### 使用MNN框架部署MTCNN模型 #### 准备工作 在准备阶段,需确保拥有合适的环境设置和必要的文件。这包括安装MNN库及其依赖项,并准备好待转换的原始模型。 对于MTCNN而言,该模型是个由三个连续卷积神经网络组成的级联结构,专门设计用来处理人脸检测中的初步定位、精确位置调整以及面部特征点识别的任务[^3]。 #### 模型转换 为了使MTCNN能够在基于MNN的应用程序中正常运作,必须先将其从源格式(通常是TensorFlow或PyTorch等训练框架下的格式)转化为MNN能够解析的形式。此过程通常涉及到以下几个步骤: 1. **导出ONNX模型** 如果初始模型不是以ONNX形式存在的,则应首先通过官方提供的工具或其他第三方解决方案将其转成ONNX格式。这是因为大多数现代深度学习框架均提供至ONNX的支持,而后者又易于进步向其他特定平台优化后的版本转变[^2]。 2. **利用MNN Converter进行最终转化** 接下来就是采用MNN自带的`mnnconvert`命令行工具来完成从ONNX到MNN专有格式(.mnn)的最后公里旅程。具体操作如下所示: ```bash mnnconvert -f ONNX --modelFile pnet.onnx --MNNModel pnet.mnn --bizCode PNet ``` 上述指令展示了如何针对PNet组件执行这样的变换;同样的方法也适用于RNet和ONet两个子模块。 #### 集成与调用 旦获得了`.mnn`结尾的目标文件之后,就可以着手于应用程序内部集成了。考虑到Python API的存在使得这环节变得尤为简便——开发者可以直接借助所提供的接口快速搭建起整个推理管道而不必深入接触底层细节[^1]。 下面给出了段简单的代码片段示范怎样加载已编译好的MNN模型并实施预测动作: ```cpp #include <MNN/MNN.hpp> // ...省略其它必要头文件... int main() { auto session = std::make_shared<MNN::Express::Session>(); // 加载模型 const char* modelPath = "path/to/pnet.mnn"; MNN::Interpreter *pnet_interpreter; {std::unique_ptr<MNN::Backend> backend(MNN::createDefaultBackend()); pnet_interpreter = new MNN::Interpreter(modelPath, nullptr); } // 创建会话配置 MNN::ScheduleConfig config; config.numThread = 4; // 运行session... } ``` 请注意上述例子仅覆盖了C++层面的操作指南,在实际应用当中可能还需要考虑更多因素比如输入预处理、输出后处理等等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值