2018-10-15 09:13:00 weixin_30446613 阅读数 301
  • YOLOv3目标检测实战:训练自己的数据集

    YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。本课程将手把手地教大家使用labelImg标注和使用YOLOv3训练自己的数据集。课程分为三个小项目:足球目标检测(单目标检测)、梅西目标检测(单目标检测)、足球和梅西同时目标检测(两目标检测)。 本课程的YOLOv3使用Darknet,在Ubuntu系统上做项目演示。包括:安装Darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 Darknet是使用C语言实现的轻型开源深度学习框架,依赖少,可移植性好,值得深入探究。 除本课程《YOLOv3目标检测实战:训练自己的数据集》外,本人推出了有关YOLOv3目标检测的系列课程,请持续关注该系列的其它课程视频,包括: 《YOLOv3目标检测实战:交通标志识别》 《YOLOv3目标检测:原理与源码解析》 《YOLOv3目标检测:网络模型改进方法》 敬请关注并选择学习!

    1670 人正在学习 去看看 白勇

目前最好的高动态范围(HDR)成像方法通常是先利用光流将输入图像对齐,随后再合成 HDR 图像。然而由于输入图像存在遮挡和较大运动,这种方法生成的图像仍然有很多缺陷。最近,腾讯优图和香港科技大学的研究者提出了一种基于深度学习的非光流 HDR 成像方法,能够克服动态场景下的大范围前景运动。

论文:Deep High Dynamic Range Imaging with Large Foreground Motions

论文链接:https://arxiv.org/abs/1711.08937

摘要:本文章基于深度学习,提出了一种非光流的高动态范围(HDR)成像方法,能够克服动态场景下的大范围前景运动。目前最好的 HDR 成像方法,例如 Kalantari 在 2017 年提出的方法,通常是先利用光流将输入图像对齐,随后再合成 HDR 图像。然而由于输入图像存在遮挡和较大运动,这种方法生成的图像仍然有很多缺陷。与此相反,我们避免了光流,直接将 HDR 成像视为图像转换的问题,这为 HDR 成像提供了重要启示。而且,即使出现了完全遮挡、过曝、曝光不足等问题,简单的翻译网络也能够生成逼真的细节,这也是传统优化方法所做不到的。此外,这种方法还能根据不同的指定参照图生成 HDR 图像。我们通过足量定性和定量的对比,展示了这种方法能够生成高质量的 HDR 图像,与现有技术相比,生成结果的颜色缺陷和形状畸变都大幅减少了,而且对于不同输入具有鲁棒性,甚至是未进行辐射校正过的图像。

贡献: 现有的数码相机一般都不足以记录整个场景的动态范围,而一些用于拍摄 HDR 图像的特制设备通常都过于昂贵或沉重,因此,合并多张在不同曝光拍摄的低动态范围(LDR)图像是另一种比较现实的方法。如果这些 LDR 图像是完美对齐的,也就是说拍摄时相机以及物体都没有移动,合并的问题已经基本被解决。但是在大范围前景位移与轻度相机位移存在的情况下,前景与后景的错位是不可避免的。后者很大程度上可以用单应性变换来解决,然而前景位移会让合并过程变得困难。很多已有的方法很容易在最终生成的高动态图中引入鬼影等缺陷。本文提出了一种用简易的端到端的卷积神经网络,即使有较大范围的前景位移的情况下也能学习如何把多张低动态图合并成没有鬼影的高动态图。不像 Kalantari 的方法,我们的神经网络是在没有光流对齐的情况下进行端到端的训练,从而在本质上避免了错误光流造成扭曲等问题。而且,通常由于饱和以及阻挡,一些内容在所有的 LDR 图像中都没有被拍摄到,神经网络同样可以幻化出合理的细节,这是在处理大范围的前景位移时是非常实用的。

网络结构:

我们利用翻译网络去学习多张 LDR 到 HDR 图像的映射。网络主体是对称的编码器解码器架构加以 Unet 与 ResNet 变化。Unet 是映射学习的常用工具。它主要是一个具有跳跃连接的编码器解码器的架构,编码器的输出的特征图直接与相应层的解码器的输入拼接。除了简单的 Unet, 我们也尝试了 ResNet,用残差模块取代中间层。整体来看,网络结构可以分为 3 个部分,编码器,合并器,解码器,对于每个不同的曝光输入,编码器的前两层是分立的,其余层共享参数。在抽取特征之后,合并器学习如何去合并他们,而解码器则负责生成 HDR 图像。

定性比较:

在没有物体位移的区域,所有的方法都生成了不错的结果,但是当过曝区域出现较大的物体位移时,其他的方法会出现较明显的颜色缺陷或几何畸变。相比之下,我们提出的两种网络都生成了很好的结果,ResNet 结构表现通常好于 Unet 结构。

定量比较:

我们用生成的图像与真实图像的 PSNR 和 SSIM 来比较。我们同时也计算了衡量 HDR 图像视觉效果的度量 HDR-VDP-2。尽管 Kalantari 的 PSNR 分数略微偏高,但我们的方法得到了相近的 SSIM 分数以及略微高一点的 HDR-VDP-2 分数。

幻化:

我们的方法能够幻化出缺失的细节,这些细节对于传统的优化方法是不可能恢复的。在 Fig.5 中,只输入中等曝光的图片,我们的网络可以合理地幻化出饱和区域里草地的纹理。

如 Fig.6 所示,在过度曝光或者低度曝光的区域里,有些细节通常会在所有的 LDR 图像中都缺失,因此这种幻化效果在动态范围成像中显得十分有用。

手机拍摄:

为了验证实用性,我们在手机图片上测试了我们的模型。值得注意的是,这些输入图像都没有经过辐射校正,这也验证了我们模型的鲁棒性。

运行时间:

由于传统的优化方法是用 CPU 进行的,公平起见,我们在相同的 CPU 环境测试所有方法的运行时间。若在 GPU 环境下运行,我们的方法处理 896×1408 的图像则只需要 0.23 秒。

转载于:https://www.cnblogs.com/alan-blog-TsingHua/p/9789245.html

2019-10-12 09:57:01 hahabeibei123456789 阅读数 330
  • YOLOv3目标检测实战:训练自己的数据集

    YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。本课程将手把手地教大家使用labelImg标注和使用YOLOv3训练自己的数据集。课程分为三个小项目:足球目标检测(单目标检测)、梅西目标检测(单目标检测)、足球和梅西同时目标检测(两目标检测)。 本课程的YOLOv3使用Darknet,在Ubuntu系统上做项目演示。包括:安装Darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 Darknet是使用C语言实现的轻型开源深度学习框架,依赖少,可移植性好,值得深入探究。 除本课程《YOLOv3目标检测实战:训练自己的数据集》外,本人推出了有关YOLOv3目标检测的系列课程,请持续关注该系列的其它课程视频,包括: 《YOLOv3目标检测实战:交通标志识别》 《YOLOv3目标检测:原理与源码解析》 《YOLOv3目标检测:网络模型改进方法》 敬请关注并选择学习!

    1670 人正在学习 去看看 白勇

 

概述

利用机器学习自动进行表面异常检测已成为一个有趣而有希望的领域研究,对视觉检查的应用领域具有非常直接影响。

深度学习方法已成为完成此任务的最合适方法。

它们使检查系统可以通过简单地显示一些示例来学习检测表面异常图片。

 

该论文文提出了一种基于分割的深度学习架构,该架构旨在检测和分割表面异常,并在表面裂纹检测的特定领域。

 

设计该架构使模型可以使用较小的模型进行训练样本数量,这是实际应用。所提出的模型与相关的深度学习方法(包括最新的商业软件)表明,该方法在以下方面优于相关方法表面裂纹检测。大量实验还阐明了注释所需的精度,所需培训样本的数量和所需的数量计算成本。

实验是在新的根据真实的质量控制案例创建数据集并证明所提出的方法能够学习在少数有缺陷的表面上,仅使用大约25-30个有缺陷的训练样本,而不是数百或数千,这在深度学习中通常是这样应用程序。这使深度学习方法变得实用用于有缺陷数量的行业。

 

 

介绍

 

深度学习的检测方法基本上可以分为两个大类。

  • 基于目标检测网络实现的缺陷检测系统

  • 基于图像分割网络实现的缺陷检测系统

 

本文探讨了合适的深度学习方法用于表面质量控制。尤其是,本文研究了应用于工业产品表面裂纹检测的深度学习方法(见图1)。探索合适的网络体系结构,不仅是从整体上分类的表现,也是从角度来看

对于工业4.0特别重要的两个特征:

(a)注释/数据要求和

(b)计算要求。满足数据要求

通过利用深度卷积的有效方法基于两阶段语义分割的网络。

提出了适合的细分和决策网络从少数有缺陷的训练样本中学习,但仍可以达到最新结果。

 

在称为Kolektor表面缺陷数据集(KolektorSDD)的新颖,真实世界的数据集上对提出的方法进行了广泛的评估。

 

数据集代表工业上半成品表面缺陷检测的实际问题,其中可用于培训的缺陷项目数量有限。建议通过突出三个重要方面,证明该方法已经适合于所研究的应用程序:

(a)进行100%检测所需的手动检查率(人工检验假阳性结果),

(b)所需的注释详细信息和培训次数导致人力成本的样本;

(c)所需的样本计算成本。在研究领域,网络显示胜过相关的最新技术方法,包括最新的商业产品和两种标准细分网络。在本文的其余结构如下。

 

网络设计

 

作者使用基于图像分割网络实现的缺陷检测系统实现缺陷检测和缺陷尺寸分割网络,从而实现了更加有效和准确的缺陷检测系统。该网络仅需要20到30个训练量的样本即可获得良好的结果,从而避免了网络训练所需的数千个样本收集成本。作者在论文中提到,经典的机器视觉方法不能满足工业4.0的技术要求,而深度学习方法具有很高的灵活性和准确性。传统的手动标准特征提取+ SVM / KNN视觉检测方法不如深度学习相关方法有效。 

 

该网络在设计时考虑了以下两个关键问题。

  • 需要多少标签数据?

  • 网络参数和浮点计算

语义分离与决策两阶段网络基于KolektorSDD(缺陷检测开放数据库)以达到最佳效果,从而实现少量的样本训练和高精度检测。 

 

整个网络的架构如下:

 

 

带有细分和决策网络的拟议架构

 

在分割网络部分,作者认为表面缺陷检测可以解释为图像二进制分割问题,因此作者首先通过语义分割网络实现像素级语义分割,然后将分割结果作为输入特征进行处理。构建决策部分。第一部分称为分割网络,第二部分自然被视为决策网络。

 

如何分割网络?

 

分割网络由11个卷积层和3个池化层组成。每个卷积层之后是BN层和ReLU激活层(conv + BN + ReLU),以优化学习加速收敛。除了最后一层的卷积核大小为15x15之外,所有卷积层都使用5x5大小的卷积核。最后,通过与1x1卷积获得的图像大小是原始图像大小的单通道蒙版图像。辍学正则化被完全丢弃。作者认为,这样的网络是足够规则的(事实背后的实验数据被证明是正确的)。因此),这样的网络架构具有检测高分辨率图像中小的缺陷的能力,网络具有相对较大的接收场(5x5),并且可以实现相对较小的特征捕获(像素级分割),作者还解释了网络的下采样和高层的大卷积内核(15x15)用于放大接收场大小,底层使用多个卷积内核和一个下采样最大池化层。

 

如何决策网络?

 

决策网络使用分段网络的输出作为输入,并使用分段网络的最后卷积层(1024通道数据+上遮罩通道),使用max-pooling + conv(5x5卷积,获得1025通道数据作为输入特征)最后,网络通过全局最大池化和池化输出的平均来生成66个输出向量。在设计决策网络时,作者考虑了以下两个重要原则。

 

  • 该网络具有处理大型和复杂形状的能力,因此它使用三个最大池

  • 输入不仅采用卷积层特征的最后一层,而且以掩码数据为输入,最后输出66个特征向量,有效解决了过拟合和全卷积特征参数的问题。

 

同时,作者提出了一种快速路径的概念,它通过全局最大池化和卷积层实现了不同的快捷路径,有效地防止了网络的复杂性。以下是一些注释数据的原始图像和Mask图像。

 

具有可见缺陷的表面图像及其注释Mask的几个示例

 

如何训练?

分割网络的学习目标是生成基于像素级分类操作的两类分割网络。作者使用两种训练方法。

  • 基于回归的平方误差(MSE)

  • 基于交叉熵的两种分类

该模型在开始时并未使用任何图像分类网络进行预训练,并且使用正分布生成了网络参数的初始化。

 

决策网络首先通过交叉熵损失训练分割网络,然后冻结分割网络参数,直接使用分割网络的输出来训练决策网络。仅当决策层具有拟合现象时,才需要对分割网络的加权参数进行微调。。作者在培训期间没有很多GPU。他说,在训练决策网络时,批处理大小= 2,在训练分割网络时,可以增加样本数量(此操作使我深深感到世界需要GPU)。

 

两种网络培训方法的作者也尝试过。此时,损失函数更为关键。作者指出,此时两级网络应使用交叉熵损失。

作者的实验也证明了一起训练的效果会更好。

 

结果

作者说,当推断输入尽可能使用灰度图像时,作者使用两个分辨率的图像作为测试。

  • 1408x512

  • 704x256

两个输出层分别从决策网络输出二进制分割掩码图像和概率异常分数(0〜1),指示异常出现在图像中。KolektorSDD数据集支持的五种数据注释方法如下:

通过以不同比率扩展(a)中所示的原始注释而生成的五种不同注释类型的示例:(b)dilate= 5,(c)膨胀= 9,(d)膨胀= 13,(e)膨胀= 15

 

最后,在KolektorSDD数据集上查看网络的实验结果和性能。准确性和不同损失函数训练结果的五种标准方法:

拟议方法在KolektorSDD上的结果(深色显示为假阳性(FP),浅色显示为假阴性(FN))

 

当前的市场在KolektorSDD数据集上的康耐视缺陷检测测试结果中占主导地位,如下所示:

在KolektorSDD上评估商用软件Cognex ViDi Suite

不同模型效果对比结果要比Cognex更好:

与最新的KolektorSDD进行比较(在中间的图中:深色的假阳性和浅色的假阴性)

带有分段输出和相应分类(真实缺陷在第一行中圈出)的真阳性(绿色实线边框)和假阴性(红色虚线边框)检测示例

总结

 

作者核心思想是将缺陷检测视为二进制图像分割问题, 像素级语义分割网络用于成功减少网络深度和参数总数,并通过少量的样本训练实现非常高精度的缺陷,表面检查网络。 在本文中,作者提到网络设计的思想是本质。

 

相关数据集论文源码下载地址:关注“图像算法”微信公众号 回复表面检测

2017-04-11 11:04:34 juanjuan1314 阅读数 12383
  • YOLOv3目标检测实战:训练自己的数据集

    YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。本课程将手把手地教大家使用labelImg标注和使用YOLOv3训练自己的数据集。课程分为三个小项目:足球目标检测(单目标检测)、梅西目标检测(单目标检测)、足球和梅西同时目标检测(两目标检测)。 本课程的YOLOv3使用Darknet,在Ubuntu系统上做项目演示。包括:安装Darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 Darknet是使用C语言实现的轻型开源深度学习框架,依赖少,可移植性好,值得深入探究。 除本课程《YOLOv3目标检测实战:训练自己的数据集》外,本人推出了有关YOLOv3目标检测的系列课程,请持续关注该系列的其它课程视频,包括: 《YOLOv3目标检测实战:交通标志识别》 《YOLOv3目标检测:原理与源码解析》 《YOLOv3目标检测:网络模型改进方法》 敬请关注并选择学习!

    1670 人正在学习 去看看 白勇

        此文实际上是读论文《Collaborative Deep Learning for RecommenderSystem》的读书笔记。这一篇论文出自香港理工大学王灏博士,论文讲了一种紧耦合的混合式推荐算法。主要是栈式自编码器sdae和CTR通过贝叶斯图方式结合。

1.      概述

        当前推荐算法主要是基于内容(CB)、协同过滤(CF)、混合算法。基于内容的推荐依靠用户profile和item的描述做推荐。CF基于过去的的表现和行为推荐。由于种种原因,收集过去的行为比收集用户画像要容易,但CF又有他的局限性,当打分(rating)很稀疏时,预测精度会下降很厉害,同时,新产品的冷启动也是CF的问题。因此,近年来,混合方法应用比较广。

        混合方法又分两种:松耦合方式、紧耦合方式。松耦合方式先处理辅助信息,然后,用它为CF提供特征。由于信息的流向是单向的,打分信息无法反馈回来去提取有用的特征。这种方式下,为了提升性能,通常依赖人工提取特征。紧耦合方式,两种方法相互影响,一方面,打分信息指导特征的提取,另一方面,提取出来的特征进一步促进CF的预测能力(例如,稀疏打分矩阵的矩阵因式分解)。两方面的相互影响,使得紧耦合方式可以从辅助信息中自动学习特征,并且能平衡打分信息和辅助信息的影响。这也是紧耦合方法比松耦合方法表现更好的原因。

        协同话题回归(CTR)是当下被推崇的紧耦合方法。它是一个整合了Topic model,LDA,CF,概率矩阵分解(PMF)的概率图模型。

CTR能生成可靠,且可判断的结果,即是辅助信息很松散也不会影响结果。

论文讲述了一种多层贝叶斯模型(hierarchical Bayesian model)叫协同深度学习(CDL)。实际上CDL就是把CRT模型和深度学习模型SDAE集合起来,形成一个多层贝叶斯模型。作者用贝叶斯法则表征栈式自编码器(sdae),用深度学习的方式表示content information和rating matrix,使两者双向相互影响。

SDAE在CDL中用于学习特征,实际上更多的深度学习模型可以用进来,如Deep Boltzmann machines,RNN, CNN.


2.   论文要点

(1).   CDL可抽取content的深度特征,并捕获content或者user的相似度。这种学习方式不仅可以用于推荐,也可以用于别的地方。

(2).   学习目标不是简单的分类或者reconstruction,本文的目标是通过概率框架用CF做一个更复杂的目标。

(3).   用了最大后验估计(MAP),CDL贝叶斯法则的抽样,贝叶斯版本的反向传播。

(4).   用贝叶斯模型连接DL和RS。


3.  模型推导

        模型如图1, 下图中,矩阵Xc扮演的角色是SDAE干净的输入,X0作为加入了噪声的输入矩阵,X1至Xl表示sdae中间各层。SDAE的输出层是Xl,W+是W和b表示权重和偏执。

图1


 

左边的贝叶斯图的目的是通过内容生成V矩阵,用户信息生成u矩阵,然后通过v和u生成user-item的关联打分矩阵R。这其实就是普通的推荐方法,只是这里,内容通过sdae自动提取特征,这些特征作用于v矩阵。具体推导过程如下:

(1). Sdae在前面的文章中已经写过了,这里不赘述。它的优化目标:

图2

2. 推广Bayesian SDAE,其中,干净输入Xc和噪声X0都是可观察的。

图3

趋近于无穷大时,式(1)中的高斯分布变成Dirac delta分布中心点在,其中,是sigmoid函数。模型会退化成一个SDAE高斯公式。因此,我们叫他推广Bayesian SDAE.

要注意的是前L/2 层网络扮演encoder,后L/2层网络扮演decoder。当权重延迟纳入考虑,最大后验概率等同于最小化重建误差。

 

3. CDL

用Bayesian SDAE作为成分,组成CDL的过程如下:

图4

是寄生参数,Cij是置信度参数。中间层充当rating和content的桥梁。带有主题偏执的中间层是开启学习特征和捕获相似度的钥匙。如同推广SDAE中,这里也可以让趋于无穷大。

趋近于正无穷,CDL的网络就如上面的图1所示。


4.  最大后验估计

基于CDL,所有参数可以被看做随机变量,fully Bayesian方法,例如,markov chain Monte Carlo 等可以用到这里,只是这些的计算代价比较高。综合考虑,EM-style法则用于获得MAP估计。

最大后验概率等同于给出后对U、V、做大对数似然估计:

图5.


其中,encoder函数表示为,以加入噪音的内容向量为输入计算item的encoding,函数也是以为输入,计算encoding,然后重建item向量。如果网络有6层的话,是第3层的输出,是第6层的输出。

从优化来看,当公式(2)的第4项等于SDAE最小化重建误差时,第3项等同于一个以主题item向量Vj为目标的多层感知机。当趋于正无穷大时,训练图1可以分裂成训练2个相似的神经网络,这两个网络有公共的输入,但输出不同。这样,网络可以演化成图6所示的网络,第一个网络输出干净数据,第二个网络输出item的打分矩阵。

图6

比率有两种极端,(1)当这个比率趋近于正无穷时,整个系统将退化成一个两步式的模型,在这个模型中SDAE学习到的主题表示会直接被放入CTR中。(2)当比率趋近于0时,SDAE的decoder部分将消失,整个系统变成图7所示的图模型。

图7

当U和V给定,用反向传播方式学习每层的W和b。W和b的梯度表示如下:

图8


2018-07-31 23:36:17 hobbitdream 阅读数 2202
  • YOLOv3目标检测实战:训练自己的数据集

    YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。本课程将手把手地教大家使用labelImg标注和使用YOLOv3训练自己的数据集。课程分为三个小项目:足球目标检测(单目标检测)、梅西目标检测(单目标检测)、足球和梅西同时目标检测(两目标检测)。 本课程的YOLOv3使用Darknet,在Ubuntu系统上做项目演示。包括:安装Darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 Darknet是使用C语言实现的轻型开源深度学习框架,依赖少,可移植性好,值得深入探究。 除本课程《YOLOv3目标检测实战:训练自己的数据集》外,本人推出了有关YOLOv3目标检测的系列课程,请持续关注该系列的其它课程视频,包括: 《YOLOv3目标检测实战:交通标志识别》 《YOLOv3目标检测:原理与源码解析》 《YOLOv3目标检测:网络模型改进方法》 敬请关注并选择学习!

    1670 人正在学习 去看看 白勇

核心参考

感谢开源贡献Caffe(贾扬清)

本文测试工程源码连接

链接(工程源码大小限制,整个工程压缩成3个包上传):

https://download.csdn.net/download/hobbitdream/10578026

https://download.csdn.net/download/hobbitdream/10578035

https://download.csdn.net/download/hobbitdream/10578044

鉴于Caffe框架配置GPU版本不同,可能导致应用出错,所以仅提供CPU版本的测试工程。另外,在测试时,请重新配置Caffe模型文件路径(NET_DEF_FILE与MODEL_FILE)以及测试图像路径(str)。

算法基本实现原理

深度学习Caffe框架

开源的Caffe框架相关理论,网上已有太多资料可供参阅,欢迎各位感兴趣的朋友研究。

号牌文本目标的定位检测

整个算法的核心即通过Caffe最后的fc层特征通过回归得到各种候选的proposal矩形,然后采用线段构造等方法,将各种相邻的矩形合并,构成最终的文本目标位置(思路参考另一篇文章《超高效车牌识别算法》)。

算法测试

将该方法应用到目前比较流行的号牌定位上,得到了较好的效果;尤其当测试目标为水平横置的文本号牌对象时,效果更佳。具体测试目标主要包括了三大类(测试资源来源于网络):身份证字符、车牌字符、高铁车号,下面简单附上各类的测试基本效果。更多测试,欢迎各位感兴趣的朋友下载测试工程自行测试。

2017-03-12 15:58:55 hlx371240 阅读数 10515
  • YOLOv3目标检测实战:训练自己的数据集

    YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。本课程将手把手地教大家使用labelImg标注和使用YOLOv3训练自己的数据集。课程分为三个小项目:足球目标检测(单目标检测)、梅西目标检测(单目标检测)、足球和梅西同时目标检测(两目标检测)。 本课程的YOLOv3使用Darknet,在Ubuntu系统上做项目演示。包括:安装Darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 Darknet是使用C语言实现的轻型开源深度学习框架,依赖少,可移植性好,值得深入探究。 除本课程《YOLOv3目标检测实战:训练自己的数据集》外,本人推出了有关YOLOv3目标检测的系列课程,请持续关注该系列的其它课程视频,包括: 《YOLOv3目标检测实战:交通标志识别》 《YOLOv3目标检测:原理与源码解析》 《YOLOv3目标检测:网络模型改进方法》 敬请关注并选择学习!

    1670 人正在学习 去看看 白勇

1 介绍

本文将介绍一种基于深度学习和稀疏表达的人脸识别算法。首先,利用深度学习框架(VGGFace)提取人脸特征;其次,利用PCA对提取的特征进行降维;最后,利用稀疏表达分类实现特征匹配。我采用CMC曲线评价在AR数据库上的识别性能。最后我还提供了整个过程的code。


2 基于深度学习和稀疏表达的人脸识别算法

2.1 利用VGGFace提取人脸特征

下面介绍利用VGGFace对人脸特征进行提取。我们利用的数据库为AR数据库,数据库的图例如下:
这里写图片描述
接下来我们利用VGGFace对人脸特征进行提取。

2.2 PCA对人脸特征进行降维

利用pca对数据降维,VGGFace提取出的特征为4096维,对提取的特征进行降维最后降到128维。

2.3 稀疏表达的人脸匹配

数据库一共有C个人,每个人有k张图片,那么每一个人的特征字典为Dc={fc1,fc2,,fck}, 那么C个人就组成一个Gallery特征字典D={D1,D2,,DC}。给一定probe人脸x, 那么特征为y=F(x), 则稀疏表达可以有如下表达:

||x||1,Dx=y

其中x为稀疏编码。
最后我们可以利用稀疏表达分类器来识别这个probe人脸x:
mincrc(y)=||yDcδc(x)||22

3 Code

function cnn_vgg_faces()
%CNN_VGG_FACES  Demonstrates how to use VGG-Face
clear all
clc
addpath PCA
run(fullfile(fileparts(mfilename('fullpath')),...
    '..', 'matlab', 'vl_setupnn.m')) ;
net = load('data/models/vgg-face.mat') ;
list = dir('../data/AR');
C = 100;
img_list = list(3:end);
index = [1, 10];
%% 建立基于VGGFace的Gallery字典
dictionary = [];
for i = 1:C
    disp(i)
    numEachGalImg(i) = 0;
    for j = 1:2
        im = imread(strcat('../data/AR/',img_list((i-1)*26+index(j)).name));
        im_ = single(im) ; % note: 255 range
        im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
        for k = 1:3
            im1_(:,:,k) = im_;
        end
        im2_ = bsxfun(@minus,im1_,net.meta.normalization.averageImage) ;
        res = vl_simplenn(net, im2_) ;
        feature_p(:,j) = res(36).x(:);
    end
    numEachGalImg(i) = numEachGalImg(i) + size(feature_p,2);
    dictionary = [dictionary feature_p];
end
%% PCA对特征进行降维
FaceContainer = double(dictionary');
[pcaFaces W meanVec] = fastPCA(FaceContainer,128);
X = pcaFaces;
[X,A0,B0] = scaling(X);
LFWparameter.mean = meanVec;
LFWparameter.A = A0;
LFWparameter.B = B0;
LFWparameter.V = W;
imfo = LFWparameter;
train_fea = (double(FaceContainer)-repmat(imfo.mean, size(FaceContainer,1), 1))*imfo.V;
dictionary = scaling(train_fea,1,imfo.A,imfo.B);
for i = 1:size(dictionary, 1)
    dictionary(i,:) = dictionary(i,:)/norm(dictionary(i,:));
end
dictionary = double(dictionary);
totalGalKeys = sum(numEachGalImg);
cumNumEachGalImg = [0; cumsum(numEachGalImg')];

%% 利用稀疏编码进行特征匹配
% sparse coding parameters
if ~exist('opt_choice', 'var')
    opt_choice = 1;
end
num_bases = 128;
beta = 0.4;
batch_size = size(dictionary, 1);
num_iters = 5;
if opt_choice==1
    sparsity_func= 'L1';
    epsilon = [];
elseif opt_choice==2
    sparsity_func= 'epsL1';
    epsilon = 0.01;
end

Binit = [];

fname_save = sprintf('../results/sc_%s_b%d_beta%g_%s', sparsity_func, num_bases, beta, datestr(now, 30));

AtA = dictionary*dictionary';
for i = 1:C
    fprintf('%s  \n',num2str(i));
    tic
    im = imread(strcat('../data/AR/',img_list((i-1)*26+26).name));
    im_ = single(im) ; % note: 255 range
    im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
    for k = 1:3
        im1_(:,:,k) = im_;
    end
    im2_ = bsxfun(@minus,im1_,net.meta.normalization.averageImage) ;
    res = vl_simplenn(net, im2_) ;
    feature_p = res(36).x(:);
    feature_p  = (double(feature_p)'-imfo.mean)*imfo.V;
    feature_p = scaling(feature_p,1,imfo.A,imfo.B);
    feature_p = feature_p/norm(feature_p, 2);
    [B S stat] = sparse_coding(AtA,0, dictionary', double(feature_p'), num_bases, beta, sparsity_func, epsilon, num_iters, batch_size, fname_save, Binit);
    for m = 1:length(numEachGalImg)
        AA = S(cumNumEachGalImg(m)+1:cumNumEachGalImg(m+1),:);
        X1 = dictionary(cumNumEachGalImg(m)+1:cumNumEachGalImg(m+1),:);
        recovery = X1'*AA;
        YY(m) = mean(sum((recovery'-double(feature_p)).^2));
    end
    score(:,i) = YY;
    toc
end
accuracy = calrank(score1,1:1,'ascend');
fprintf('rank-1:%d/%%\n',accuracy*100);

文中以
calrank可以计算得到CMC曲线:参见http://blog.csdn.net/hlx371240/article/details/53482752
最后得到rank-1为82%。
整个代码见资源,由于vgg-face 太大,可以自己到vgg的官网下载,然后放到../matconvnet-1.0-beta19\examples\data\models中。

没有更多推荐了,返回首页