news 2026/9/3 2:09:33

基于深度学习神经网络MTCNN的人脸检测系统源码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于深度学习神经网络MTCNN的人脸检测系统源码

一. mtcnn概述

MTCNN,英文全称是Multi-task convolutional neural network,中文全称是多任务卷积神经网络,该神经网络将人脸区域检测与人脸关键点检测放在了一起。

二. mtcnn的网络结构

mtcnn从整体上划分分为P-Net、R-Net、和O-Net三层网络结构。各层的作用直观上感受如下图所示:

其网络结构:

三. mtcnn的网络结构代码

import tensorflow as tf class PNet(tf.keras.Model): def __init__(self): super().__init__() self.conv1 = tf.keras.layers.Conv2D(10, 3, 1, name='conv1') self.prelu1 = tf.keras.layers.PReLU(shared_axes=[1,2], name="PReLU1") self.conv2 = tf.keras.layers.Conv2D(16, 3, 1, name='conv2') self.prelu2 = tf.keras.layers.PReLU(shared_axes=[1,2], name="PReLU2") self.conv3 = tf.keras.layers.Conv2D(32, 3, 1, name='conv3') self.prelu3 = tf.keras.layers.PReLU(shared_axes=[1,2], name="PReLU3") self.conv4_1 = tf.keras.layers.Conv2D(2, 1, 1, name='conv4-1') self.conv4_2 = tf.keras.layers.Conv2D(4, 1, 1, name='conv4-2') def call(self, x, training=False): out = self.prelu1(self.conv1(x)) out = tf.nn.max_pool2d(out, 2, 2, padding="SAME") out = self.prelu2(self.conv2(out)) out = self.prelu3(self.conv3(out)) score = tf.nn.softmax(self.conv4_1(out), axis=-1) boxes = self.conv4_2(out) return boxes, score class RNet(tf.keras.Model): def __init__(self): super().__init__() self.conv1 = tf.keras.layers.Conv2D(28, 3, 1, name='conv1') self.prelu1 = tf.keras.layers.PReLU(shared_axes=[1,2], name="prelu1") self.conv2 = tf.keras.layers.Conv2D(48, 3, 1, name='conv2') self.prelu2 = tf.keras.layers.PReLU(shared_axes=[1,2], name="prelu2") self.conv3 = tf.keras.layers.Conv2D(64, 2, 1, name='conv3') self.prelu3 = tf.keras.layers.PReLU(shared_axes=[1,2], name="prelu3") self.dense4 = tf.keras.layers.Dense(128, name='conv4') self.prelu4 = tf.keras.layers.PReLU(shared_axes=None, name="prelu4") self.dense5_1 = tf.keras.layers.Dense(2, name="conv5-1") self.dense5_2 = tf.keras.layers.Dense(4, name="conv5-2") self.flatten = tf.keras.layers.Flatten() def call(self, x, training=False): out = self.prelu1(self.conv1(x)) out = tf.nn.max_pool2d(out, 3, 2, padding="SAME") out = self.prelu2(self.conv2(out)) out = tf.nn.max_pool2d(out, 3, 2, padding="VALID") out = self.prelu3(self.conv3(out)) out = self.flatten(out) out = self.prelu4(self.dense4(out)) score = tf.nn.softmax(self.dense5_1(out), -1) boxes = self.dense5_2(out) return boxes, score class ONet(tf.keras.Model): def __init__(self): super().__init__() self.conv1 = tf.keras.layers.Conv2D(32, 3, 1, name="conv1") self.prelu1 = tf.keras.layers.PReLU(shared_axes=[1,2], name="prelu1") self.conv2 = tf.keras.layers.Conv2D(64, 3, 1, name="conv2") self.prelu2 = tf.keras.layers.PReLU(shared_axes=[1,2], name="prelu2") self.conv3 = tf.keras.layers.Conv2D(64, 3, 1, name="conv3") self.prelu3 = tf.keras.layers.PReLU(shared_axes=[1,2], name="prelu3") self.conv4 = tf.keras.layers.Conv2D(128, 2, 1, name="conv4") self.prelu4 = tf.keras.layers.PReLU(shared_axes=[1,2], name="prelu4") self.dense5 = tf.keras.layers.Dense(256, name="conv5") self.prelu5 = tf.keras.layers.PReLU(shared_axes=None, name="prelu5") self.dense6_1 = tf.keras.layers.Dense(2 , name="conv6-1") self.dense6_2 = tf.keras.layers.Dense(4 , name="conv6-2") self.dense6_3 = tf.keras.layers.Dense(10 , name="conv6-3") self.flatten = tf.keras.layers.Flatten() def call(self, x, training=False): out = self.prelu1(self.conv1(x)) out = tf.nn.max_pool2d(out, 3, 2, padding="SAME") out = self.prelu2(self.conv2(out)) out = tf.nn.max_pool2d(out, 3, 2, padding="VALID") out = self.prelu3(self.conv3(out)) out = tf.nn.max_pool2d(out, 2, 2, padding="SAME") out = self.prelu4(self.conv4(out)) out = self.dense5(self.flatten(out)) out = self.prelu5(out) score = tf.nn.softmax(self.dense6_1(out)) boxes = self.dense6_2(out) lamks = self.dense6_3(out) return boxes, lamks, score

四. mtcnn的演示效果

五. 整个工程的内容

提供源代码,模型,提供GUI界面代码,主要使用方法可以参考里面的“文档说明_必看.docx”

项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷

https://www.bilibili.com/video/BV1rCU6Y1EbX/

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 21:28:28

Golang map取不存在的key时返回零值

现象由于python的字典取不存在的key时会报错,误以为golang也是一样的。其实不然。原因golang的map取不存在的key时,并不会报错,而是会返回对应数据类型的零值,例子如下:package mainimport "fmt"func main()…

作者头像 李华
网站建设 2026/9/2 22:28:30

Infinigen程序化世界生成:5步打造你的无限创意空间

Infinigen程序化世界生成:5步打造你的无限创意空间 【免费下载链接】infinigen Infinite Photorealistic Worlds using Procedural Generation 项目地址: https://gitcode.com/gh_mirrors/in/infinigen 还在为3D建模的复杂流程而头疼吗?Infinigen…

作者头像 李华
网站建设 2026/9/2 22:26:45

深度学习毕设项目:基于python-深度学习的混凝土马路和泥地马路识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/8/31 2:50:02

大模型意图识别全攻略:从入门到精通,收藏这篇就够了

本文详细介绍了大模型应用中意图识别的方法与技巧,包括基础方法(规则、深度学习、大模型)和进阶方法(Prompt优化、增加召回、向量检索等),并强调提升准确率的关键在于构建清晰正交的分类体系、确保每个子分…

作者头像 李华
网站建设 2026/9/2 9:37:13

AI校招风暴来袭:掌握大模型技能,轻松斩获百万年薪offer(建议收藏)_AI岗平均月薪4.7万起,大厂秋招疯狂抢人

2026届互联网大厂校招已演变为AI人才争夺战,阿里、腾讯等企业AI岗位占比超60%,百度达90%。企业更看重AI落地能力而非学历,AI工具使用已成"通识"技能。AI相关岗位薪资大幅上涨,顶尖应届博士年薪近200万。随着AI技术深入应…

作者头像 李华