精华内容
下载资源
问答
  • MTCNN算法

    万次阅读 2017-08-16 14:33:14
    MTCNN算法出自深圳先进技术研究院,乔宇老师组,是今年2016的ECCV。 采用级联的卷积神经网络进行人脸五官特征点检测,其流程如下图所示。 图6级联卷积神经网络流程图 首先,将给定的图片缩放到不同尺度...
    

    该MTCNN算法出自深圳先进技术研究院,乔宇老师组,是今年2016的ECCV。


    采用级联的卷积神经网络进行人脸五官特征点检测,其流程如下图所示。


         

    6级联卷积神经网络流程图


    首先,将给定的图片缩放到不同尺度,形成图像金字塔,以达到尺度不变。通过上述流程图可知,该模型有三个步骤组成:


    Stage 1Proposal Network(P-Net):使用P-Net全卷积网络用来生成候选窗和边框回归向量(boundingbox regression vectors)。使用Bounding box regression的方法来校正候选窗,使用非极大值抑制(NMS)合并重叠的候选框。P-Net网络结构如图7所示。

      

    7 P-Net

    Stage 2 Refine Network(R-Net):使用R-Net改善候选窗。将通过P-Net的候选窗输入R-Net中,拒绝掉大部分false的窗口,继续使用Bounding box regressionNMS合并。R-Net网络结构如图8所示。

     

    8 R-Net

    Stage 3 Output Network(O-Net):最后使用O-Net输出最终的人脸框和特征点位置。和第二步类似,但是不同的是生成5个特征点位置。O-Net网络结构如图9所示。


    9 O-Net

    其中MTCNN算法还可以参考博客http://blog.csdn.net/qq_14845119/article/details/52680940

    bounding box regression算法可以参考博客http://blog.csdn.net/Bixiwen_liu/article/details/53840913

    算法原文及代码链接https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.html?from=timeline&isappinstalled=1

    算法NMS可以参考http://blog.csdn.net/zhang_shuai12/article/details/52716952


    
    展开全文
  • 人脸检测MTCNN算法

    2021-01-29 23:43:31
    人脸检测MTCNN算法,采用tensorflow框架编写,从理解到训练,中文注释完全,含测试和训练,支持摄像头
  • Keras:人脸识别mtcnn算法实现
  • MTCNN算法详解

    万次阅读 2018-05-21 16:18:15
    MTCNN算法出自深圳先进技术研究院,乔宇老师组,是今年2016的ECCV。(至少我知道的今年已经一篇cvpr,一篇eccv了)。 进入正题理论基础:正如上图所示,该MTCNN由3个网络结构组成(P-Net,R-Net,O-Net)。Proposal...

    该MTCNN算法出自深圳先进技术研究院,乔宇老师组,是今年2016的ECCV。(至少我知道的今年已经一篇cvpr,一篇eccv了)。

     

     

    进入正题

    理论基础:


    正如上图所示,该MTCNN由3个网络结构组成(P-Net,R-Net,O-Net)。

    Proposal Network (P-Net):该网络结构主要获得了人脸区域的候选窗口和边界框的回归向量。并用该边界框做回归,对候选窗口进行校准,然后通过非极大值抑制(NMS)来合并高度重叠的候选框。

    Refine Network (R-Net):该网络结构还是通过边界框回归和NMS来去掉那些false-positive区域。

    只是由于该网络结构和P-Net网络结构有差异,多了一个全连接层,所以会取得更好的抑制false-positive的作用。

    Output Network (O-Net):该层比R-Net层又多了一层卷基层,所以处理的结果会更加精细。作用和R-Net层作用一样。但是该层对人脸区域进行了更多的监督,同时还会输出5个地标(landmark)。

     

    详细的网络结构如下图所示:


    prototxt的更加详细的网络结构如下:分别为det1,det2,det3。

    det1.prototxt结构:


    det2.prototxt结构:


    det3.prototxt结构:


    训练:

    MTCNN特征描述子主要包含3个部分,人脸/非人脸分类器,边界框回归,地标定位。

    人脸分类:

    上式为人脸分类的交叉熵损失函数,其中,pi为是人脸的概率,yidet为背景的真实标签。

    边界框回归:

    上式为通过欧氏距离计算的回归损失。其中,带尖的y为通过网络预测得到,不带尖的y为实际的真实的背景坐标。其中,y为一个(左上角x,左上角y,长,宽)组成的四元组。

    地标定位:

    和边界回归一样,还是计算网络预测的地标位置和实际真实地标的欧式距离,并最小化该距离。其中,,带尖的y为通过网络预测得到,不带尖的y为实际的真实的地标坐标。由于一共5个点,每个点2个坐标,所以,y属于十元组。

    多个输入源的训练:

    整个的训练学习过程就是最小化上面的这个函数,其中,N为训练样本数量,aj表示任务的重要性,bj为样本标签,Lj为上面的损失函数。

    在训练过程中,为了取得更好的效果,作者每次只后向传播前70%样本的梯度,这样来保证传递的都是有效的数字。有点类似latent SVM,只是作者在实现上更加体现了深度学习的端到端。

    在训练过程中,y尖和y的交并集IoU(Intersection-over-Union)比例:

    0-0.3:非人脸

    0.65-1.00:人脸

    0.4-0.65:Part人脸

    0.3-0.4:地标

    训练样本的比例,负样本:正样本:part样本:地标=3:1:1:2

    安装步骤:

    caffe-windows的安装:

    http://blog.csdn.net/qq_14845119/article/details/52415090

    Pdollartoolbox的安装:

     

    Pdollartoolbox UCSD Piotr Dollar 编写,侧重物体识别( Object Recognition )检测相关的特征提取和分类算法。这个工具箱属于专而精的类型,主要就是 Dollar 的几篇物体检测的论文的相关算法,如果做物体识别相关的研究,应该是很好用的。同时它的图像操作或矩阵操作函数也可以作为 Matlab 图像处理工具箱的补充,功能主要包括几个模块:  

    channels模块 ,图像特征提取,包括 HOG 等, Dollar 的研究工作提出了一种 Channel Feature 的特征 [2] ,因此这个 channels 主要包括了提取这一特征需要的一些基本算法梯度、卷及等基本算法  

    classify模块,一些快速的分类相关算法,包括random ferns, RBF functions, PCA 

    detector模块,与Channel Feature特征对应的检测算法

    filters模块,一些常规的图像滤波器 

    images模块,一些常规的图像、视频操作,有一些很实用的函数 

    matlab模块,一些常规的Matlab函数,包括矩阵计算、显示、变量操作等,很实用 

    videos模块,一些常规的视频操作函数等

     

    下载链接:https://github.com/pdollar/toolbox

    下载到Toolbox后,将其解压到任意目录下,如E:\MATLAB\MATLAB Production Server\toolbox

    Matlab命令行中输入

     

    addpath(genpath(‘toolbox-masterROOT’));savepath;

     

    将解压目录加入Matlab路径。其中toolbox-masterROOT为解压目录路径,如解压到E:\ MATLAB\MATLAB Production Server\toolbox时,则命令为

    addpath(genpath(‘E:\ MATLAB\MATLAB ProductionServer\toolbox’)); savepath;

     

    这样Piotr’s Image & VideoMatlab Toolbox就安装好了。

     

    path里面加入caffe的库目录,例如本人的path加入如下的路径

    打开demo.m,修改其中的caffe_path,pdollar_toolbox_path,caffe_model_path

    。同时由于本人电脑没有GPU,因此对其做如下修改。


    实验结果:

    运行时间1.2S,按照检测出18个脸算,平均一个66MS,运行版本为release版本。从实验结果来看,不管是检测还是对齐都是空前的好。以我的经验来看,face++的对齐是最好的,剩下的开源的里面这篇MTCNN算是最好的了,然后才是SDM。

    从下面的作者在FDDB+WIDERFACE+AFLW上验证的正确性来看,基本95%的准确度。可见该MTCNN的性能和效率都是很给力的。

    从实验结果可以看出,上图的第二行的第二个对齐的出了问题,因此,本人对其程序进行了微小改动,实际运行效果如下图,时间和效果上都有了提升。



    下载链接:http://download.csdn.net/detail/qq_14845119/9653138

    组后感谢公司大牛的帮忙,c语言版本终于改出来了。老实说,真心不容易,走了好多坑。贴个效果图,纪念那些苦了笑了的时光。


    References:

    [1] https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.html

    [2] https://github.com/kpzhang93/MTCNN_face_detection_alignment/tree/master/code/codes

    [3] ZhangK, Zhang Z, Li Z, et al. Joint Face Detection and Alignment using Multi-taskCascaded Convolutional Networks[J]. arXiv preprint arXiv:1604.02878, 2016.

    展开全文
  • MTCNN算法过程及其相关思路配图集合 目录 MTCNN思路结构框图 MTCNN关键步骤 MTCNN思路结构框图 MTCNN关键步骤 1、Proposal Net 2、Refine Net 3、Output Net ...

    MTCNN算法过程及其相关思路配图集合

     

     

    目录

    MTCNN思路结构框图

    MTCNN关键步骤


     

     

    MTCNN思路结构框图

     

     

    MTCNN关键步骤

    1、Proposal Net

    2、Refine Net

    3、Output Net

     

     

     

    展开全文
  • MTCNN算法及代码笔记

    2019-02-23 13:35:35
    代码下载地址: 这里采用第三方的MXNet实现版本:https://github.com/pangyupo/mxnet_mtcnn_face_detection 参考网页 ...   ...代码主要是说怎么使用MTCNN算法进行人脸检测,不涉及到训练过程   主要包含三个脚...

    代码下载地址:

    这里采用第三方的MXNet实现版本:https://github.com/pangyupo/mxnet_mtcnn_face_detection

    参考网页

    https://blog.csdn.net/u014380165/article/details/78906898

     

    概要:

    代码主要是说怎么使用MTCNN算法进行人脸检测,不涉及到训练过程

     

    主要包含三个脚本:main.py、mtcnn_detector.py、helper.py。

    main.py是代码的入口

    mtcnn_detector.py是主要的执行函数

    helper.py一系列辅助函数

     

    代码修改

    代码直接运行会有问题,添加了一些修改,已经提交到本人git上

    1.在main.py中添加一个main函数包含所有代码,然后

    if __name__ == "__main__":

    main()

    因为使用multiprocessing库时会报错

     

    2.python3中使用from itertools import izip有错误

    改为

    try: from itertools import izip except ImportError: #python3.x izip = zip

    3.还有一些float需要转为int的过程,代码运行的时候就知道了

     

    代码解析

    main.py

    主要代码就是main函数,在代码里面详细解释

    def main():
    
    '''
    
    主要的解析函数类的初始化
    
    model_folder:文件夹
    
    num_worker:使用进程的个数
    
    accurate_landmark :是否需要计算高精度的标记点
    
    
    
    '''
    
    detector = MtcnnDetector(model_folder='model', ctx=mx.cpu(0), num_worker = 4 , accurate_landmark = False)
    
    img = cv2.imread('test2.jpg')
    
    # run detector
    
    #主解析函数
    
    results = detector.detect_face(img)
    
    #显示并保存图片
    
    if results is not None:
    
    total_boxes = results[0]
    
    points = results[1]
    
    # extract aligned face chips
    
    chips = detector.extract_image_chips(img, points, 144, 0.37)
    
    for i, chip in enumerate(chips):
    
    cv2.imshow('chip_'+str(i), chip)
    
    cv2.imwrite('chip_'+str(i)+'.png', chip)
    
    
    
    draw = img.copy()
    
    for b in total_boxes:
    
    cv2.rectangle(draw, (int(b[0]), int(b[1])), (int(b[2]), int(b[3])), (255, 255, 255))
    
    
    
    for p in points:
    
    for i in range(5):
    
    cv2.circle(draw, (p[i], p[i + 5]), 1, (0, 0, 255), 2)
    
    
    
    cv2.imshow("detection result", draw)
    
    cv2.waitKey(0)

    mtcnn_detector.py

    首先看初始化

    def __init__(self,
    
    model_folder='.',#训练好的模型位置
    
    minsize = 20,#最小检测的脸部大小
    
    threshold = [0.6, 0.7, 0.8],#对3个网络的阈值
    
    factor = 0.709,#每次图片缩放比例
    
    num_worker = 1,#在检测时使用的进程池个数
    
    accurate_landmark = False,#是否计算高精度标记点
    
    ctx=mx.cpu()):
    
    """
    
    Initialize the detector
    
    
    
    Parameters:
    
    ----------
    
    model_folder : string
    
    path for the models
    
    minsize : float number
    
    minimal face to detect
    
    threshold : float number
    
    detect threshold for 3 stages
    
    factor: float number
    
    scale factor for image pyramid
    
    num_worker: int number
    
    number of processes we use for first stage
    
    accurate_landmark: bool
    
    use accurate landmark localization or not
    
    
    
    """
    
    self.num_worker = num_worker
    
    self.accurate_landmark = accurate_landmark
    
    
    
    # load 4 models from folder
    
    #加载模型
    
    models = ['det1', 'det2', 'det3','det4']
    
    models = [ os.path.join(model_folder, f) for f in models]
    
    self.PNets = []
    
    for i in range(num_worker):
    
    workner_net = mx.model.FeedForward.load(models[0], 1, ctx=ctx)
    
    self.PNets.append(workner_net)
    
    
    
    self.Pool = Pool(num_worker)
    
    
    
    self.RNet = mx.model.FeedForward.load(models[1], 1, ctx=ctx)
    
    self.ONet = mx.model.FeedForward.load(models[2], 1, ctx=ctx)
    
    self.LNet = mx.model.FeedForward.load(models[3], 1, ctx=ctx)
    
    
    
    self.minsize = float(minsize)
    
    self.factor = float(factor)
    
    self.threshold = threshold

    detect_face

    主要函数,分为初始化,3个阶段,高精度计算

    1初始化

    def detect_face(self, img):
    
    """
    
    detect face over img
    
    Parameters:
    
    ----------
    
    img: numpy array, bgr order of shape (1, 3, n, m)
    
    input image
    
    Retures:
    
    -------
    
    bboxes: numpy array, n x 5 (x1,y2,x2,y2,score)
    
    bboxes
    
    points: numpy array, n x 10 (x1, x2 ... x5, y1, y2 ..y5)
    
    landmarks
    
    """
    
    
    
    # check input
    
    MIN_DET_SIZE = 12 #设计最小检测的图片大小
    
    
    
    if img is None:
    
    return None
    
    
    
    # only works for color image
    
    if len(img.shape) != 3:#长、宽、颜色
    
    return None
    
    
    
    # detected boxes
    
    total_boxes = []
    
    
    
    height, width, _ = img.shape
    
    minl = min( height, width)
    
    """
    
    构件一系列 scales,使得图片最终大小为MIN_DET_SIZE
    """
    # get all the valid scales
    
    scales = []
    
    m = MIN_DET_SIZE/self.minsize
    
    minl *= m
    
    factor_count = 0
    
    while minl > MIN_DET_SIZE:
    
    scales.append(m*self.factor**factor_count)
    
    minl *= self.factor
    
    factor_count += 1
    
    2.第一阶段,使用PNet构造一系列box
    
    使用了几个函数
    
    """
    
    将 number根据进程池大小(num_worker)分段
    
    比如输入number=10,num_worker=4
    
    输出[[0,1,2,3],[4,5,6,7],[8,9]]
    
    """
    
    def slice_index(self, number):
    
    """
    
    slice the index into (n,n,m), m < n
    
    Parameters:
    
    ----------
    
    number: int number
    
    number
    
    """
    
    def chunks(l, n):
    
    """Yield successive n-sized chunks from l."""
    
    for i in range(0, len(l), n):
    
    yield l[i:i + n]
    
    num_list = range(number)
    
    return list(chunks(num_list, self.num_worker))
    """
    
    nms算法
    
    将输入的多个box根据置信度排序
    
    如果置信度高的box和另外一个box的重合度大于阈值,删除置信度低的box
    
    """
    
    
    
    def nms(boxes, overlap_threshold, mode='Union'):
    
    """
    
    输入参数
    
    boxes:一系列box,每个box有5个参数,起点xy,终点xy,置信度(起点比终点小)
    
    overlap_threshold:阈值
    
    """
    
    """
    
    non max suppression
    
    
    
    Parameters:
    
    ----------
    
    box: numpy array n x 5
    
    input bbox array
    
    overlap_threshold: float number
    
    threshold of overlap
    
    mode: float number
    
    how to compute overlap ratio, 'Union' or 'Min'
    
    Returns:
    
    -------
    
    index array of the selected bbox
    
    """
    
    # if there are no boxes, return an empty list
    
    if len(boxes) == 0:
    
    return []
    
    
    
    # if the bounding boxes integers, convert them to floats
    
    if boxes.dtype.kind == "i":
    
    boxes = boxes.astype("float")
    
    
    
    # initialize the list of picked indexes
    
    pick = []
    
    #获得坐标数据
    
    # grab the coordinates of the bounding boxes
    
    x1, y1, x2, y2, score = [boxes[:, i] for i in range(5)]
    
    
    
    area = (x2 - x1 + 1) * (y2 - y1 + 1)
    
    #根据置信度排序得到index
    
    idxs = np.argsort(score)
    
    
    
    # keep looping while some indexes still remain in the indexes list
    
    while len(idxs) > 0:
    
    # grab the last index in the indexes list and add the index value to the list of picked indexes
    
    last = len(idxs) - 1
    
    i = idxs[last]
    
    pick.append(i)
    
    """
    
    根据输入的数据,返回2者之间大的那个,最终得到一个list,妹妹的,开始我还以为是找最大值
    
    所以如果两个box不相交,面积就会是0
    
    """
    
    xx1 = np.maximum(x1[i], x1[idxs[:last]])
    
    yy1 = np.maximum(y1[i], y1[idxs[:last]])
    
    xx2 = np.minimum(x2[i], x2[idxs[:last]])
    
    yy2 = np.minimum(y2[i], y2[idxs[:last]])
    
    
    
    # compute the width and height of the bounding box
    
    w = np.maximum(0, xx2 - xx1 + 1)
    
    h = np.maximum(0, yy2 - yy1 + 1)
    
    
    
    inter = w * h#重叠面积
    
    if mode == 'Min':
    
    overlap = inter / np.minimum(area[i], area[idxs[:last]])
    
    else:
    
    overlap = inter / (area[i] + area[idxs[:last]] - inter)
    
    
    
    # delete all indexes from the index list that have
    
    idxs = np.delete(idxs, np.concatenate(([last],
    
    np.where(overlap > overlap_threshold)[0])))
    
    
    
    return pick
    '''
    
    第一阶段代码
    
    '''
    
    sliced_index = self.slice_index(len(scales))
    
    total_boxes = []
    
    
    
    '''
    
    total_boxes是一个box的list,box的shape为K*9,K就是bbox的数量,9包含4个坐标点信息,一个置信度score和4个用来调整前面4个坐标点的偏移信息
    
    偏移信息是百分比的形式,
    
    '''
    
    for batch in sliced_index:
    
    #将多个数据放入进程池里面,这里是4个进程
    
    local_boxes = self.Pool.map( detect_first_stage_warpper, \
    
    izip(repeat(img), self.PNets[:len(batch)], [scales[i] for i in batch], repeat(self.threshold[0])) )
    
    total_boxes.extend(local_boxes)
    
    
    
    
    
    # remove the Nones
    
    total_boxes = [ i for i in total_boxes if i is not None]
    
    
    
    if len(total_boxes) == 0:
    
    return None
    
    
    
    total_boxes = np.vstack(total_boxes)
    
    
    
    if total_boxes.size == 0:
    
    return None
    
    #使用nms算法删除box
    
    # merge the detection from first stage
    
    pick = nms(total_boxes[:, 0:5], 0.7, 'Union')
    
    total_boxes = total_boxes[pick]
    
    
    
    bbw = total_boxes[:, 2] - total_boxes[:, 0] + 1
    
    bbh = total_boxes[:, 3] - total_boxes[:, 1] + 1
    
    
    
    #按照偏移值重新计算box
    
    # refine the bboxes
    
    total_boxes = np.vstack([total_boxes[:, 0]+total_boxes[:, 5] * bbw,
    
    total_boxes[:, 1]+total_boxes[:, 6] * bbh,
    
    total_boxes[:, 2]+total_boxes[:, 7] * bbw,
    
    total_boxes[:, 3]+total_boxes[:, 8] * bbh,
    
    total_boxes[:, 4]
    
    ])
    
    
    
    total_boxes = total_boxes.T
    
    total_boxes = self.convert_to_square(total_boxes)
    
    total_boxes[:, 0:4] = np.round(total_boxes[:, 0:4])

    第二三阶段类似,可以忽略了

     

    展开全文
  • 人脸识别:这是人脸检测和识别的实现项目。 使用MTCNN算法进行人脸检测,并使用LightenenCNN算法进行识别
  • 深度学习开源网络mtcnn算法解析源码解读
  • 人脸识别系列三 | MTCNN算法详解上篇

    千次阅读 2019-11-19 22:28:08
    今天我们开始分享一下MTCNN算法,这个算法可以将人脸检测和特征点检测结合起来,并且MTCNN的级联结构对现代的人脸识别也产生了很大的影响。上篇为大家介绍MTCNN的算法原理和训练技巧,下篇为大家解析MTCNN算法的代码...
  • 上篇讲解了MTCNN算法的算法原理以及训练细节,这篇文章主要从源码实现的角度来解析一下MTCNN算法。我要解析的代码来自github的https://github.com/ElegantGod/ncnn中的mtcnn.cpp。 网络结构 再贴一下MTCNN的网络...
  • MTCNN算法分析笔记1. 项目来源(1)论文题目(2)实现目标(3)相关资源2. 代码运行i)图像标注ii)生成PNet训练数据iii)训练PNetiv)生成RNet训练数据v)训练RNetvi)生成ONet训练数据vii)训练ONet3. 算法与代码...
  • MTCNN算法及代码笔记(转载)

    千次阅读 2018-07-03 16:07:29
    MTCNN算法及代码笔记 论文链接:https://arxiv.org/abs/1604.02878 官方代码链接:https://github.com/kpzhang93/MTCNN_face_detection_alignment 其他代码实现(MXNet):...
  • mtcnn算法实现基于ncnn版本原码讲解原理PnetRnetOnetLnet其他函数各网络的损失函数 原理 MTCNN由3个网络结构组成(P-Net,R-Net,O-Net)。 Proposal Network (P-Net):该网络结构主要获得了人脸区域的候选窗口和边界...
  • MTCNN算法简介

    2020-01-16 14:17:21
    主页:https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.html论文:https://arxiv.org/abs/1604.02878代码:官方matlab版、C++ caffe版第三方...MTCNN,恰如论文标题《Joint Face Detection and ...
  • MTCNN算法提速应用(ARM测试结果评估) 置顶 2017年11月02日 10:48:05 samylee 阅读数:11584 &lt;span class="tags-box ...
  • 人脸检测MTCNN算法,采用tensorflow框架编写,从理解到训练,中文注释完全,含测试和训练,支持摄像头,代码参考 ,相应地减少了尺寸和优化。 模型理解 是目前比较流行的人脸检测方法,通过人脸检测可以进行更精准的...
  • MTCNN算法与代码理解—人脸检测和人脸对齐联合学习   写在前面 主页:https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.html论文:https://arxiv.org/abs/1604.02878代码:官方matlab版、C++ ...
  • 使用MTCNN算法进行人脸检测,并使用LightenedCNN算法进行人脸识别。 发行版本是0.1.0,基于ROCK960平台,目标操作系统是Ubuntu 16.04。 MTCNN是一个深层级联的多任务框架,可提高面部检测性能。 另请参阅 。 轻...
  • mtcnn算法实现总结

    2019-02-27 13:10:37
    源码地址:https://github.com/Seanlinx/mtcnn stage 1: Proposal Net,提供大量候选窗口,计算bounding box回归向量并用NMS减少窗口 stage 2: Refining Net,拒绝一些非人脸窗口,计算bounding box回归向量并用NMS...
  • MTCNN Implementation of the MTCNN face detector for Keras in Python3.4+. It is written from scratch, using as a reference the implementation of MTCNN from David Sandberg (FaceNet's MTCNN) in ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,263
精华内容 905
关键字:

mtcnn算法