• 金天

    标题: 论如何完美的实现和pytorch一模一样的softmax功能.

    很多人所以然的一行代码搞定:

    [np.exp(i)/np.sum(np.exp(i)) for i in a]
    

    但是你真以为这就行了吗? 来对比一下:

    import torch
    import numpy as np
    
    
    # label = torch.Tensor([
    #     [1, 2, 3],
    #     [0, 2, 1],
    # ])
    
    
    label = torch.Tensor([0, 2, 1]).long()
    
    
    fc_out = torch.Tensor([
        [245, 13., 3.34],
        [45., 43., 37.],
        [1.22, 35.05, 1.23]
    ])
    
    def one_hot(a, n):
        b = a.shape[0]
        c = np.zeros([b, n])
        for i in range(b):
            c[i][a[i]] = 1
        return np.array(c)
    
    def softmax(a):
        return [np.exp(i)/np.sum(np.exp(i)) for i in a]
    
    
    def cross_entropy_loss(out, label):
        # convert out to softmax probability
        out_list = out.numpy().tolist()
        out1 = softmax(out_list)
        print(out1)
    
        out2 = torch.softmax(out, 0)
        print(out2)
        # [0, 2, 1] -> [[1, 0, 0], [0, 0, 1], [0, 1, 0]]
        # onehot label and rotate
        label_onehot = one_hot(label, 3)
        loss = np.sum(out1 * label_onehot.T)
        print(loss)
    
    
    loss = torch.nn.CrossEntropyLoss()
    lv = loss(fc_out, label)
    print(lv)
    lv = cross_entropy_loss(fc_out, label)
    print(lv)
    

    这是一段尝试复现pytorch里面CrossEntropy的代码. 但是你尝试之后发现, 连softmax都复现不了啊.

    欢迎大家评论交流, 这里面涉及到很多知识点, 也有很多巨坑.

    发布在 社区博客 阅读更多
  • 金天

    有没有人思考过这么一个问题:

    
    label = torch.Tensor([0, 2, 1]).long()
    
    
    fc_out = torch.Tensor([
        [245, 13., 3.34],
        [45., 43., 37.],
        [1.22, 35.05, 1.23]
    ])
    
    def cross_entropy_loss(out, label):
        # convert out to softmax probability
        out = out.numpy().tolist()
        out = np.array([np.exp(i)/np.sum(np.exp(i)) for i in out])
        print(out)
    
    loss = torch.nn.CrossEntropyLoss()
    # lv = loss(fc_out, label)
    lv = cross_entropy_loss(fc_out, label)
    print(lv)
    

    我们尝试用np来编写一个CrossEntropy, 实现和pytorch一样的输出. 但是, 遇到一个问题.
    其中那行代码:

        out = out.numpy().tolist()
    

    如果改为:

        out = out.numpy()
    

    则结果不一样. 结果差异如下:

    [[1.00000000e+000 1.75258947e-101 1.11788072e-105]
     [8.80536902e-001 1.19167711e-001 2.95387223e-004]
     [2.03150559e-015 1.00000000e+000 2.05192254e-015]]
    
    
    a.py:23: RuntimeWarning: overflow encountered in exp
      out = np.array([np.exp(i)/np.sum(np.exp(i)) for i in out])
    a.py:23: RuntimeWarning: invalid value encountered in true_divide
      out = np.array([np.exp(i)/np.sum(np.exp(i)) for i in out])
    [[          nan 0.0000000e+00 0.0000000e+00]
     [8.8053685e-01 1.1916771e-01 2.9538720e-04]
     [2.0315054e-15 1.0000000e+00 2.0519225e-15]]
    
    

    这不是一个经常会遇到的问题, 但是在实际之中你确实应该思考差异的缘由.
    to_list() 去掉之后, 结果会出现溢出. 这个十分的不对劲.
    发生这个现象的根本原因是: list和np里面默认的精度是不一样的. numpy里面是float, list是动态的. float无法表征10-501这么小的数, 因此会溢出.

    发布在 社区求助区(SOS!!) 阅读更多
  • 金天

    @songzhiming 你们可以在论坛里面的3D检测板块进行交流

    发布在 社区求助区(SOS!!) 阅读更多
  • 金天

    最近会更新很多anchor-free的目标检测方法上来,这篇也是2019最新的论文。为什么要用anchor-free?是因为以前之所以anchor-free不行是因为技术限制,实验不够,比如yolov1,就搞不过ssd。现在不一样了,很多探索,总结起来可以组成一个强大的检测框架。

    论文来自于微软和清华。

    这篇论文的一些结果:

    c357c087-67da-45d6-b8ba-4b92ed5a4578-image.png

    发布在 最新论文速递 阅读更多
  • 金天

    DenseBox 的升级版本,是一种anchor free的检测器。具体论文地址不知道在哪里,research gate上下载不下来。感兴趣的同学根据题目搜索一下,欢迎评论来讨论、品读。

    对于这个方法的前辈:DenseBox倒是很多话要说,据说这个检测网络速度快,精度高,但是什么没有fasterrcnn那么有名气呢?原因很简单,没有开源,也没有人去实现,蛋疼啊。

    这篇不知道啥时候开源

    发布在 最新论文速递 阅读更多
  • 金天

    一种基于mask的行人检测。这个方法来自于国防科大的某位同学。实验做的非常的solid。
    看效果,似乎还行?

    3d0c5292-5924-47c9-8767-db954dbaa1bc-image.png

    开源github: https://github.com/liuwei16/CSP

    发布在 最新论文速递 阅读更多
  • 金天

    @ravend 哈哈哈哈, 你不说我还真没有感觉到,正太。。。。。正态分布。。。

    发布在 社区博客 阅读更多
  • 金天

    @xi3299 这个是opencv的问题,你直接把protobuf 去掉。 -DBUILD_PROTOBUF=OFF 具体是哪个洪标志记不清了,你可以google一下

    发布在 Caffe 阅读更多
  • 金天

    来自github链接

    https://github.com/weslynn/AlphaTree-graphic-deep-neural-network

    AlphaTree : Graphic Deep Neural Network 神经网络模型图示

    在AI学习的漫漫长路上,理解不同文章中的模型与方法是每个人的必经之路,偶尔见到Fjodor van Veen所作的A mostly complete chart of Neural Networks 和 FeiFei Li AI课程中对模型的画法,大为触动。决定将深度神经网络中的一些模型 进行统一的图示,便于大家对模型的理解。

    从AI研究的角度来说,AI的学习和跟进是有偏向性的,更多的精英是擅长相关的一到两个领域,在这个领域做到更好。而从AI应用工程师的角度来说,每一个工程都可能涉及很多个AI的方向,而他们需要了解掌握不同的方向才能更好的开发和设计。但是AI中每一个领域都在日新月异的成长。而每一位研究人员写paper的风格都不一样,相似的模型,为了突出不同的改进点,他们对模型的描述和图示都可能大不相同。为了帮助更多的人在不同领域能够快速跟进前沿技术,我们构建了“AlphaTree计划”,每一篇文章都会对应文章,代码,然后进行图示输出。

    进度:

    2018/05/30 目前object classification 主干部分基本完成 包括 LeNet, AlexNet, GoogLeNet, Inception V3,Inception-Resnet-V2, VGG, ResNet ,ResNext, DenseNet ,DPN等。

    2018/06/15 完成 MobileNet 与 MobileNet V2.

    2018/07/04 完成FaceNet系列,修正地图上facenet loss部分,将二维距离(center loss) 到 球面角度距离SphereFace之后的发展 区分开

    2018/08/10 图上加入MnasNet ,人脸部分加入 mobilefacenet mobileID

    2018/09/04 修正3D人脸部分,整理16 17年的部分知名开源成果 将加入密集人脸对齐部分的算法 和 之前的cnn获取3dmm参数算法分开 。18年开始 主要研究在gan对侧脸部分的正脸生成,暂未整理 可看后续发展。

    其他:
    Face : mtcnn

    OCR : CRNN CTPN Textboxes Textboxes++

    Object Detection:ssd

    在了解这个计划之前,我们先了解一下各个方向的发展情况,用地铁图的形式绘制了第一个版本。第一个版本主要包括了图像方向的十二个子方向,里面列的模型,除了商业化的部分外,其他则选择了一些应用方向使用较多的开源模型。也许还有遗漏与不完善的地方,大家一起来更新吧。

    8d2c167d-69f8-4f6f-95b9-06e0b86037ee-image.png

    大图链接

    现在主要有如下方向

    64a8caf8-1f27-4565-8f7f-8f2a5f3bb8d3-image.png 方向

    每个方向上都记录了一些比较重要的模型结构。为了方便理解模型的变化,我们对模型进行统一的图示

    一个常用的神经网络结构可以进行如下的等价变换。每个圆圈上的数字代表这一层有多少个神经元。

    图像的深度卷积网络 每一层的卷积核大小也是大家感兴趣的,因此会在简化结构中,加上卷积核大小。这个可以写在圆圈中,也可以写在圆圈下方。

    LeNet网络

    Lenet_short

    模型中用到的图标规定如下:
    图标

    当大家描述网络结构时,常常会将卷积层和maxpooling层画在一起,我们也提供了这样的简化方法

    一个具体的问题是否能用人工智能,或者更进一步说用深度学习某个算法解决,首先需要人对问题进行分解,提炼成可以用机器解决的问题,譬如说分类问题,回归问题,聚类问题等。

    PS: caffe 模型可视化网址 http://ethereon.github.io/netscope/#/editor

    版权申明:CC-BY-NC-SA 知识共享-署名-非商业性-相同方式共享

    Object Classification 物体分类

    深度学习在解决分类问题上非常厉害。让它声名大噪的也是对于图像分类问题的解决。也产生了很多很经典的模型。其他方向的模型发展很多都是源于这各部分,它是很多模型的基础工作。因此我们首先了解一下它们。

    object classification

    从模型的发展过程中,随着准确率的提高,网络结构也在不断的进行改进,现在主要是两个方向,一是深度,二是复杂度。此外还有卷积核的变换等等。

    深度神经网络的发展要从经典的LeNet模型说起,那是1998年提出的一个模型,在手写数字识别上达到商用标准。之后神经网络的发展就由于硬件和数据的限制,调参的难度等各种因素进入沉寂期。

    到了2012年,Alex Krizhevsky 设计了一个使用ReLu做激活函数的AlexNet 在当年的ImageNet图像分类竞赛中(ILSVRC 2012),以top-5错误率15.3%拿下第一。 他的top-5错误率比上一年的冠军下降了十个百分点,而且远远超过当年的第二名。而且网络针对多GPU训练进行了优化设计。从此开始了深度学习的黄金时代。

    大家发表的paper一般可以分为两大类,一类是网络结构的改进,一类是训练过程的改进,如droppath,loss改进等。

    之后网络结构设计发展主要有两条主线,一条是Inception系列(即上面说的复杂度),从GoogLeNet 到Inception V2 V3 V4,Inception ResNet。 Inception module模块在不断变化,一条是VGG系列(即深度),用简单的结构,尽可能的使得网络变得更深。从VGG 发展到ResNet ,再到DenseNet ,DPN等。

    最终Google Brain用500块GPU训练出了比人类设计的网络结构更优的网络NASNet,最近训出了mNasNet。

    此外,应用方面更注重的是,如何将模型设计得更小,这中间就涉及到很多卷积核的变换。这条路线则包括 SqueezeNet,MobileNet V1 V2 Xception shuffleNet等。

    ResNet的变种ResNeXt 和SENet 都是从小模型的设计思路发展而来。

    allmodel

    模型名 AlexNet ZFNet VGG GoogLeNet ResNet
    初入江湖 2012 2013 2014 2014 2015
    层数 8 8 19 22 152
    Top-5错误 16.4% 11.2% 7.3% 6.7% 3.57%
    Data Augmentation + + + + +
    Inception(NIN) +
    卷积层数 5 5 16 21 151
    卷积核大小 11,5,3 7,5,3 3 7,1,3,5 7,1,3
    全连接层数 3 3 3 1 1
    全连接层大小 4096,4096,1000 4096,4096,1000 4096,4096,1000 1000 1000
    Dropout + + + + +
    Local Response Normalization + + +
    Batch Normalization +

    ILSVRC2016
    2016 年的 ILSVRC,来自中国的团队大放异彩:

    CUImage(商汤和港中文),Trimps-Soushen(公安部三所),CUvideo(商汤和港中文),HikVision(海康威视),SenseCUSceneParsing(商汤和香港城市大学),NUIST(南京信息工程大学)包揽了各个项目的冠军。

    CUImage(商汤科技和港中文):目标检测第一;
    Trimps-Soushen(公安部三所):目标定位第一;
    CUvideo(商汤和港中文):视频中物体检测子项目第一;
    NUIST(南京信息工程大学):视频中的物体探测两个子项目第一;
    HikVision(海康威视):场景分类第一;
    SenseCUSceneParsing(商汤和港中文):场景分析第一。

    其中,Trimps-Soushen 以 2.99% 的 Top-5 分类误差率和 7.71% 的定位误差率赢得了 ImageNet 分类任务的胜利。该团队使用了分类模型的集成(即 Inception、Inception-ResNet、ResNet 和宽度残差网络模块的平均结果)和基于标注的定位模型 Faster R-CNN 来完成任务。训练数据集有 1000 个类别共计 120 万的图像数据,分割的测试集还包括训练未见过的 10 万张测试图像。

    ILSVRC 2017
    Momenta 提出的SENet 获得了最后一届 ImageNet 2017 竞赛 Image Classification 任务的冠军, 2.251% Top-5 错误率

    LeNet 详解 detail Yann LeCun

    AlexNet 详解 detail Alex Krizhevsky, Geoffrey Hinton

    GoogLeNet 详解 detail Christian Szegedy / Google

    Inception V3 详解 detail Christian Szegedy / Google

    VGG 详解 detail Karen Simonyan , Andrew Zisserman / Visual Geometry Group(VGG)Oxford

    • VGG
      VGG-Net是2014年ILSVRC classification第二名(第一名是GoogLeNet),ILSVRC localization 第一名。VGG-Net的所有 convolutional layer 使用同样大小的 convolutional filter,大小为 3 x 3

    单独看VGG19的模型:

    [5] Simonyan, Karen, and Andrew Zisserman. "Very deep convolutional networks for large-scale image recognition." arXiv preprint arXiv:1409.1556 (2014). pdf

    tensorflow 源码: https://github.com/tensorflow/models/blob/master/research/slim/nets/vgg.py

    caffe :

    vgg16 https://gist.githubusercontent.com/ksimonyan/211839e770f7b538e2d8/raw/0067c9b32f60362c74f4c445a080beed06b07eb3/VGG_ILSVRC_16_layers_deploy.prototxt

    vgg19 https://gist.githubusercontent.com/ksimonyan/3785162f95cd2d5fee77/raw/f02f8769e64494bcd3d7e97d5d747ac275825721/VGG_ILSVRC_19_layers_deploy.prototxt

    ResNet and ResNeXt详解 detail 何凯明 He Kaiming

    结构采用grouped convolutions,减少了超参数的数量(子模块的拓扑结构一样),不增加参数复杂度,提高准确率。

    [7] He, Kaiming, et al. "Aggregated Residual Transformations for Deep Neural Networks." arXiv preprint arXiv:1611.05431 . [pdf](https://arxiv.org/pdf/1611.05431.pdf) (ResNet,Very very deep networks, CVPR best paper) 
    
    
    torch https://github.com/facebookresearch/ResNeXt
    

    Inception-Resnet-V2详解 detail Christian Szegedy / Google

    Inception Resnet V2是基于Inception V3 和 ResNet结构发展而来的一个网络。在这篇paper中,还同期给出了Inception V4.

    [8] Christian Szegedy, et al. “Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning” arXiv preprint arXiv:1602.07261 (2015). pdf

    github链接:
    https://github.com/tensorflow/models/blob/master/research/slim/nets/inception_resnet_v2.py

    DenseNet详解 detail 黄高Gao Huang, 刘壮Zhuang Liu

    作者发现(Deep networks with stochastic depth)通过类似Dropout的方法随机扔掉一些层,能够提高ResNet的泛化能力。于是设计了DenseNet。
    DenseNet 将ResNet的residual connection 发挥到了极致,它做了两个重要的设计,一是网络的每一层都直接与其前面层相连,实现特征的重复利用,第二是网络的每一层都很窄,达到降低冗余性的目的。

    DenseNet很容易训练,但是它有很多数据需要重复使用,因此显存占用很大。不过现在的更新版本,已经通过用时间换空间的方法,将DenseLayer(Contact-BN-Relu_Conv)中部分数据使用完就释放,而在需要的时候重新计算。这样增加少部分计算量,节约大量内存空间。


    [9] Gao Huang,Zhuang Liu, et al. DenseNet:2016,Densely Connected Convolutional Networks arXiv preprint arXiv:1608.06993 . pdf CVPR 2017 Best Paper
    [10]Geoff Pleiss, Danlu Chen, Gao Huang, et al.Memory-Efficient Implementation of DenseNets. pdf

    github链接:
    torch https://github.com/liuzhuang13/DenseNet

    pytorch https://github.com/gpleiss/efficient_densenet_pytorch

    caffe https://github.com/liuzhuang13/DenseNetCaffe

    DPN详解 detail 颜水成

    之前我们已经了解了ResNet 和 DenseNet,ResNet使用的是相加(element-wise adding),DenseNet则使用的是拼接(concatenate)。

    DPN把DenseNet和ResNet联系到了一起,该神经网络结合ResNet和DenseNet的长处,共享公共特征,并且通过双路径架构保留灵活性以探索新的特征。在设计上,采用了和ResNeXt一样的group操作。

    它在在图像分类、目标检测还是语义分割领域都有极大的优势,可以去看2017 ImageNet NUS-Qihoo_DPNs 的表现。


    [11]Yunpeng Chen, Jianan Li, Huaxin Xiao, Xiaojie Jin, Shuicheng Yan, Jiashi Feng.Dual Path Networks pdf

    github链接:

    MxNet https://github.com/cypw/DPNs (官方)

    caffe:https://github.com/soeaver/caffe-model

    PolyNet [Xingcheng Zhang] 林达华[Dahua Lin] / CUHK-MMLAB & 商汤科技 详解 detail

    这个模型在Inception_ResNet_v2 的基础上,替换了之前的Inception module,改用 PolyInception module 作为基础模块,然后通过数学多项式来组合设计每一层网络结构。因此结构非常复杂。

    PolyNet在ImageNet大规模图像分类测试集上获得了single-crop错误率4.25%和multi-crop错误率3.45%。在ImageNet2016的比赛中商汤科技与香港中大-商汤科技联合实验室在多项比赛中选用了这种网络结构并取得了三个单项第一的优异成绩。

    提供了caffe的proto 和模型。
    caffe:https://github.com/CUHK-MMLAB/polynet

    模型结构图 (官方)
    http://ethereon.github.io/netscope/#/gist/b22923712859813a051c796b19ce5944
    https://raw.githubusercontent.com/CUHK-MMLAB/polynet/master/polynet.png

    [12] Xingcheng Zhang, Zhizhong Li, ChenChange Loy, Dahua Lin,PolyNet: A Pursuit of Structural Diversity in Very Deep Networks.2017 pdf

    SENet 详解 detail

    Momenta 提出的SENet 获得了最后一届 ImageNet 2017 竞赛 Image Classification 任务的冠军。
    它在结构中增加了一个se模块,通过Squeeze 和 Excitation 的操作,学习自动获取每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

    [13] Squeeze-and-Excitation Networks pdf

    caffe:https://github.com/hujie-frank/SENet

    NASNet Google

    这是谷歌用AutoML(Auto Machine Learning)在500块GPU上自行堆砌convolution cell(有两种cell
    )设计的网络。性能各种战胜人类设计。

    [14]Learning Transferable Architectures for Scalable Image Recognitionpdf

    github链接:
    https://github.com/tensorflow/models/blob/master/research/slim/nets/nasnet/nasnet.py


    轻量级模型 & 剪枝

    随着模型结构的发展,在很多机器智能领域,深度神经网络都展现出了超人的能力。但是,随着准确率的提升,这些网络也需要更多的计算资源和运行时的内存,这些需求使得高精度的大型网络无法在移动设备或者嵌入式系统上运行。

    于是从应用角度发展了另外一条支线,着重在于轻量化模型的设计与发展。它的主要思想在于从卷积层的设计来构建更高效的网络计算方式,从而使网络参数减少的同时,不损失网络性能。

    除了模型的设计,还有Deep Compression ,剪枝等多种方法将模型小型化。

    SqueezeNet使用bottleneck方法设计一个非常小的网络,使用不到1/50的参数(125w --- 1.25million)在ImageNet上实现AlexNet级别的准确度。 MobileNetV1使用深度可分离卷积来构建轻量级深度神经网络,其中MobileNet-160(0.5x),和SqueezeNet大小差不多,但是在ImageNet上的精度提高4%。 ShuffleNet利用pointwise group卷积和channel shuffle来减少计算成本并实现比MobileNetV1更高的准确率。 MobileNetV2基于inverted residual structure with linear bottleneck,改善了移动模型在多个任务和基准测试中的最新性能。mNASNet是和NASNet一样强化学习的构造结果,准确性略优于MobileNetV2,在移动设备上具有比MobileNetV1,ShuffleNet和MobileNetV2更复杂的结构和更多的实际推理时间。(总结出自MobileFaceNets)


    With the same accuracy, our MnasNet model runs 1.5x faster than the hand-crafted state-of-the-art MobileNetV2, and 2.4x faster than NASNet, which also used architecture search. After applying the squeeze-and-excitation optimization, our MnasNet+SE models achieve ResNet-50 level top-1 accuracy at 76.1%, with 19x fewer parameters and 10x fewer multiply-adds operations. On COCO object detection, our model family achieve both higher accuracy and higher speed over MobileNet, and achieves comparable accuracy to the SSD300 model with 35x less computation cost.

    在相同的准确率下,MnasNet 模型的速度比手工调参得到的当前最佳模型 MobileNet V2 快 1.5 倍,并且比 NASNet 快 2.4 倍,它也是使用架构搜索的算法。在应用压缩和激活(squeeze-and-excitation)优化方法后,MnasNet+SE 模型获得了 76.1% 的 ResNet 级别的 top-1 准确率,其中参数数量是 ResNet 的 1/19,且乘法-加法运算量是它的 1/10。在 COCO 目标检测任务上,我们的MnasNet模型系列获得了比 MobileNet 更快的速度和更高的准确率,并在 1/35 的计算成本下获得了和 SSD300 相当的准确率。”
    https://ai.googleblog.com/2018/08/mnasnet-towards-automating-design-of.html

    网络名称 最早公开日期 发表情况 作者团队
    SqueezeNet 2016.02 ICLR2017 Berkeley&Stanford
    MobileNet 2016.04 CVPR2017 Google
    ShuffleNet 2016.06 CVPR2017 Face++
    Xception 2016.10 ---- Google
    MobileNetV2 2018.01 ---- Google
    ShuffleNet V2 2018.07 ECCV2018 Face++
    MorphNet 2018.04 ---- Google
    MnasNet 2018.07 ---- Google

    ShuffleNet 论文中引用了 SqueezeNet;Xception 论文中引用了 MobileNet

    CNN网络时间消耗分析

    对于一个卷积层,假设其大小为 h \times w \times c \times n (其中c为#input channel, n为#output channel),输出的feature map尺寸为 H' \times W' ,则该卷积层的

    paras = n \times (h \times w \times c + 1)
    FLOPS= H' \times W' \times n \times(h \times w \times c + 1)
    即#FLOPS= H' \times W' \times #paras

    但是虽然Conv等计算密集型操作占了其时间的绝大多数,但其它像Elemwise/Data IO等内存读写密集型操作也占了相当比例的时间

    ShuffleNet_V1与MobileNet_V2上的时间消耗分析

    从上图中可看出,因此像以往那样一味以FLOPs来作为指导准则来设计CNN网络是不完备的,虽然它可以反映出占大比例时间的Conv操作。
    --------此处来自shufflenet v2

    SqueezeNet

    SqueezeNet 的核心在于 Fire module,Fire module 由两层构成,分别是 squeeze 层+expand 层,squeeze 层是一个 1×1 卷积核的卷积层,对上一层 feature map 进行卷积,主要目的是减少 feature map 的维数,expand 层是 1×1 和 3×3 卷积核的卷积层,expand 层中,把 1×1 和 3×3 得到的 feature map 进行 concat。

    [1]AlexNet-level accuracy with 50x fewer parameters and <0.5MBpdf

    github链接:
    caffe: https://github.com/DeepScale/SqueezeNet

    MobileNet 详解 detail Google

    MobileNet 顾名思义,可以用在移动设备上的网络,性能和效率取得了很好平衡。它发展了两个版本,第一个版本基本结构和VGG类似,主要通过 depthwise separable convolution 来减少参数和提升计算速度。 第二代结合了ResNet的特性,提出了一种新的 Inverted Residuals and Linear Bottleneck。性能优于对应的NasNet。

    mobilenetv2_compare

    MobileNet v1:2017,MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

    mobilenet_struct

    MobileNet v2:2018,Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation

    mobilenetv2_struct

    TensorFlow实现:

    https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.py

    https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet_v2.py

    caffe实现:https://github.com/pby5/MobileNet_Caffe

    Xception

    ShuffleNet

    手机端caffe实现:https://github.com/HolmesShuan/ShuffleNet-An-Extremely-Efficient-CNN-for-Mobile-Devices-Caffe-Reimplementation
    caffe实现:https://github.com/camel007/Caffe-ShuffleNet

    shufflenet v2

    https://arxiv.org/abs/1807.11164

    MorphNet

    NasNet和 AdaNet 等方法会通过搜索从零开始设计一个网络,但是考虑到搜索需要的计算资源和时间,成本太昂贵的。如何利用现有架构来进行优化,
    谷歌研究人员提出一种神经网络模型改进的复杂方法 MorphNet。
    MorphNet: Fast & Simple Resource-Constrained Structure Learning of Deep Networks,
    MorphNet 将现有神经网络作为输入,为新问题生成规模更小、速度更快、性能更好的新神经网络。

    https://github.com/google-research/morph-net

    MorphNet 通过收缩和扩展阶段的循环来优化神经网络。在收缩阶段,MorphNet 通过稀疏性正则化项(sparsifying regularizer)识别出效率低的神经元,并将它们从网络中去除,因而该网络的总损失函数包含每一神经元的成本。但是对于所有神经元,MorphNet 没有采用统一的成本度量,而是计算神经元相对于目标资源的成本。随着训练的继续进行,优化器在计算梯度时是了解资源成本信息的,从而得知哪些神经元的资源效率高,哪些神经元可以去除。

    MnasNet

    [5]MnasNet: Platform-Aware Neural Architecture Search for Mobilepdf

    other

    pytorch pretrained-model https://github.com/Cadene/pretrained-models.pytorch


    人脸识别概述:

    https://arxiv.org/pdf/1804.06655.pdf

    FaceDetection

    FaceDetection

    Face Detection and Face Alignment 人脸检测与矫正

    人脸检测与识别是一个研究很久的课题。传统方法之前也有了很多稳定可行的方法。而深度学习的出现,无论对检测还是识别又有了很大的提升。随着算法和代码的开源,现在很多公司都可以自己搭建一套自己的人脸检测识别系统。那么下面几篇经典论文,都是会需要接触到的。

    在了解深度学习算法之前,也要了解一下传统的方法:如 harr特征( 2004 Viola和Jones的《Robust Real-Time Face Detection》),LAP(Locally Assembled Binary)等。LAP是结合haar特征和LBP(local binary pattern)特征,把不同块的haar特征按照lbp的编码方法形成一个编码。

    常见的人脸检测开源算法可以使用 opencv dlib seetaface等。seetafce采用了多种特征(LAB、SURF、SIFT)和多种分类器(boosted、MLP)的结合。

    深度学习最早的代表作之一是2015年CVPR的 CascadeCNN 。

    CascadeCNN详解 detail

    H. Li, Z. Lin, X. Shen, J. Brandt, and G. Hua, “A convolutional neuralnetwork cascade for face detection,” in IEEE Conference on ComputerVision and Pattern Recognition, 2015, pp. 5325-5334.
    这篇文章保留了传统人脸检测方法中Cascade的概念,级联了6个CNN,使用3种输入大小分别为12、24、48的浅层网络,一类为分类网络(12-net,24...):2分类,判断是不是人脸,同时产生候选框,一类是矫正网络(12-Calibration-net,24...)它们是45分类(当时训练的时候将每一个正样本进行scale、x轴、y轴变换(共45种变换),生成45张图片)对候选框进行位置矫正。在每个分类网络之后接一个矫正网络用于回归人脸框的位置。

    对比传统人脸检测方法,CascadeCNN将Cascade级联结构中每个stage中CNN的分类器代替了传统的分类器;2. 每个分类stage之后应用了一个矫正网络使得人脸框的位置更为精确。该论文是当时基于CNN的人脸检测方法中速度最快的

    MTCNN 详解 detail zhang kaipeng 乔宇 Qiao Yu / CUHK-MMLAB & SIAT

    FaceBoxes

    文章链接: 《FaceBoxes: A CPU Real-time Face Detector with High Accuracy》

    非官方实现 https://github.com/zeusees/FaceBoxes

    PCN

    https://arxiv.org/pdf/1804.06039.pdf.

    https://github.com/Jack-CV/PCN

    此外我们可以了解一下商用的一些算法:

    DenseBox Baidu

    DenseBox: Unifying Landmark Localization with End to End Object Detection

    arxiv: http://arxiv.org/abs/1509.04874
    demo: http://pan.baidu.com/s/1mgoWWsS
    KITTI result: http://www.cvlibs.net/datasets/kitti/eval_object.php


    Landmark Localization 68 points


    从技术实现上可将人脸关键点检测分为2大类:生成式方法(Generative methods) 和 判别式方法(Discriminative methods)。
    Generative methods 构建人脸shape和appearance的生成模型。这类方法将人脸对齐看作是一个优化问题,来寻找最优的shape和appearance参数,使得appearance模型能够最好拟合输入的人脸。这类方法包括:

    ASM(Active Shape Model) 1995
    AAM (Active Appearnce Model) 1998

    Discriminative methods直接从appearance推断目标位置。这类方法通常通过学习独立的局部检测器或回归器来定位每个面部关键点,然后用一个全局的形状模型对预测结果进行调整,使其规范化。或者直接学习一个向量回归函数来推断整个脸部的形状。这类方法包括传统的方法以及最新的深度学习方法:

    Constrained local models (CLMs) 2006 https://github.com/TadasBaltrusaitis/CLM-framework
    Deformable part models (DPMs)
    基于级联形状回归的方法(Cascaded regression) 2010
    CPR(Cascaded Pose Regression)
    ESR https://github.com/soundsilence/FaceAlignment
    ERT(Ensemble of Regression Trees) dlib: One Millisecond Face Alignment with an Ensemble of Regression Trees. http://www.csc.kth.se/~vahidk/papers/KazemiCVPR14.pdf https://github.com/davisking/dlib
    Face Alignment at 3000 FPS cvpr2013, https://github.com/yulequan/face-alignment-in-3000fps

    FacePoint

    深度学习:

    face++ DCNN

    2013 香港中文大学汤晓欧,SunYi等人作品,首次将CNN用于人脸关键点检测。总体思想是由粗到细,实现5个人脸关键点的精确定位。网络结构分为3层:level 1、level 2、level 3。每层都包含多个独立的CNN模型,负责预测部分或全部关键点位置,在此基础上平均来得到该层最终的预测结果。

    TCDCN VanillaCNN TCNN(Tweaked Convolutional Neural Networks)

    TCDCN Facial Landmark Detection by Deep Multi-task Learning
    http://mmlab.ie.cuhk.edu.hk/projects/TCDCN.html
    VanillaCNN

    DAN Deep-Alignment-Network

    https://github.com/MarekKowalski/DeepAlignmentNetwork

    ##LAB (LAB-Look at Boundary A Boundary-Aware Face Alignment Algorithm )
    2018cvpr 清华&商汤作品。借鉴人体姿态估计,将边界信息引入关键点回归上。网络包含3个部分:边界热度图估计模块(Boundary heatmap estimator),基于边界的关键点定位模块( Boundary-aware landmarks regressor )和边界有效性判别模块(Boundary effectiveness discriminator)


    过去二十年来,人脸识别要解决的关键问题还是如何寻找合适特征的算法,主要经过了四个阶段。

    第一个阶段Holistci Learning,通过对图片进行空间转换,得到满足假设的一定分布的低维表示
    ,如线性子空间,稀疏表示等等。这个想法在20世纪90年代占据了FR的主导地位
    2000年。

    然而,一个众所周知的问题是这些理论上合理的算法无法解决很多异常的问题,当人脸变化偏离了先前的假设,算法就失效了。
    在21世纪初,这个问题引起了以Local handcraft算子为主的研讨。 出现了Gabor 算子和LBP算子,及它们的多层和高维扩展。局部算子的一些不变属性表现出了强大的性能。

    不幸的是,手工设计的算子缺乏独特性和紧凑性,在海量数据处理表现出局限性。
    在2010年初,基于浅层学习的算法被引入,尝试用两层网络来学习,之后,出现了深度学习的方法,使用多层神经网络来进行特征提取和转换。

    Osadchy, Margarita, Yann Le Cun, and Matthew L. Miller. "Synergistic face detection and pose
    estimation with energy-based models." The Journal of Machine Learning Research 8 (2007): 1197-
    1215.

    2014年,DeepFace 和DeepID第一次在不受约束的情景超越了人类的表现。从那时起,研究
    重点已转向基于深度学习的方法。

    FaceDetection1

    FaceRecognition

    face Recognition

    DeepFace是FaceBook提出来的,后续有DeepID和FaceNet出现。DeepFace是第一个真正将大数据和深度神经网络应用于人脸识别和验证的方法,人脸识别精度接近人类水平,可以谓之CNN在人脸识别的奠基之作

    之后Facenet跳出了分类问题的限制,而是构建了一种框架,通过已有的深度模型,训练一个人脸特征。然后用这个人脸特征来完成人脸识别,人脸验证和人脸聚类。

    Deep Face

    DeepFace 在算法上并没有什么特别的创新,它的改进在于对前面人脸预处理对齐的部分做了精细的调整,结果显示会有一定的帮助,但是也有一些疑问,因为你要用 3D Alignment(对齐),在很多情况下,尤其是极端情况下,可能会失败。

    DeepFace: Closing the Gap to Human-Level Performance in Face Verification

    DeepFace1

    DeepFace2

    DeepFacemodel

    DeepID

    DeepID 还是将人脸作为一个分类问题来解决,而从facenet开始,则是通过设计不同的loss,端对端去学习一个人脸的特征。这个特征 在欧式空间 或者高维空间,能够用距离来代表人脸的相似性。

    VGGFace

    faceloss

    Facenet 详解 detail

    和物体分类这种分类问题不同,Facenet是构建了一种框架,通过已有的深度模型,结合不同loss,训练一个很棒的人脸特征。它直接使用端对端的方法去学习一个人脸图像到欧式空间的编码,这样构建的映射空间里的距离就代表了人脸图像的相似性。然后基于这个映射空间,就可以轻松完成人脸识别,人脸验证和人脸聚类。

    [CVPR2015] Schroff F, Kalenichenko D, Philbin J. Facenet: A unified embedding for face recognition and clustering[J]. arXiv preprint arXiv:1503.03832, 2015.pdf

    Model name LFW accuracy Training dataset Architecture

    20170511-185253 0.987 CASIA-WebFace Inception ResNet v1

    20170512-110547 0.992 MS-Celeb-1M Inception ResNet v1

    它使用现有的模型结构,然后将卷积神经网络去掉sofmax后,经过L2的归一化,然后得到特征表示,之后基于这个特征表示计算Loss。文章中使用的结构是ZFNetGoogLeNet,tf代码是改用了Inception_resnet_v1。

    Loss的发展:
    文中使用的Loss 是 triplet loss。后来相应的改进有ECCV2016的 center loss,SphereFace,2018年的AMSoftmax和ArchFace(InsightFace),现在效果最好的是ArchFace(InsightFace)。

    loss1

    loss2

    https://github.com/davidsandberg/facenet/blob/master/src/models/inception_resnet_v1.py

    tensorflow 源码 :https://github.com/davidsandberg/facenet

    caffe center loss:https://github.com/kpzhang93/caffe-face

    mxnet center loss :https://github.com/pangyupo/mxnet_center_loss

    caffe sphereface: https://github.com/wy1iu/sphereface

    deepinsight: https://github.com/deepinsight/insightface

    AMSoftmax :https://github.com/happynear/AMSoftmax

    github:https://github.com/cmusatyalab/openface
    基于谷歌的文章《FaceNet: A Unified Embedding for Face Recognition and Clustering》。openface是卡内基梅隆大学的 Brandon Amos主导的。
    B. Amos, B. Ludwiczuk, M. Satyanarayanan,
    "Openface: A general-purpose face recognition library with mobile applications,"
    CMU-CS-16-118, CMU School of Computer Science, Tech. Rep., 2016.

    SeetaFace

    Detection: Funnel-Structured Cascade for Multi-View Face Detection with Alignment-Awareness

    2016

    中科院山世光老师开源的人脸识别引擎—SeetafaceEngine,主要实现下面三个功能:
    SeetaFace Detection
    SeetaFace Alignment
    SeetaFace Identification

    github:https://github.com/seetaface/SeetaFaceEngine

    OpenFace

    主要在Landmark Detection,Landmark and head pose tracking,Facial Action Unit Recognition等,其中Facial Action Unit Recognition是个比较有意思的点,该项目给出一个脸部的每个AU的回归分数和分类结果。

    Detect faces with a pre-trained models from dlib or OpenCV.
    Transform the face for the neural network. This repository uses dlib's real-time pose estimation with OpenCV's affine transformation to try to make the eyes and bottom lip appear in the same location on each image.

    github:https://github.com/TadasBaltrusaitis/OpenFace


    轻量级人脸识别模型

    这个研究得比较少,主要是分两个方面:

    一种是设计一个小型网络,从头开始训。这种包括LmobileNetE(112M),lightCNN (A light cnn for deep face representation with noisy labels. arXiv preprint), ShiftFaceNet(性能能有点差 LFW 96%),MobileFaceNet等

    一种是从大模型进行knowledge distillation 知识蒸馏得到小模型。包括从DeepID2 进行teacher-student训练得到MobileID,从FaceNet预训练模型继续训MobileNetV1等。

    MobileFaceNet

    这个模型主要就是用类MobileNet V2的结构,加上ArcFace的loss进行训练。


    3d face

    3D人脸重建主要有两种方式,一种是通过多摄像头或者多帧图像的关键点匹配(Stereo matching),重建人脸的深度信息,或者深度相机,从而得到模型,另一种是通过预先训练好的人脸模型(3d morphable model),拟合单帧或多帧RGB图像或深度图像,从而得到3d人脸模型的个性化参数。

    深度学习在3d face的研究着重在第二个。

    由于Blanz和Vetter在1999年提出3D Morphable Model(3DMM)(Blanz, V., Vetter, T.: A morphable model for the synthesis of 3d faces. international
    conference on computer graphics and interactive techniques (1999)),成为最受欢迎的单图3D面部重建方法。早期是针对特殊点的对应关系(可以是关键点 也可以是局部特征点)来解非线性优化函数,得到3DMM系数。然而,这些方法严重依赖于高精度手工标记或者特征。

    首先,2016年左右,CNN的尝试主要是用级联CNN结构来回归准确3DMM系数,解决大姿态下面部特征点定位问题。但迭代会花费大量时间

    3DDFA: Face Alignment Across Large Poses- A 3D Solution CVPR2016

    http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/main.htm

    自动化所作品, 解决极端姿态下(如侧脸),一些特征点变了不可见,不同姿态下的人脸表观也存在巨大差异使得关键点定位困难等问题

    本文提出一种基于3D人脸形状的定位方法3DDFA,算法框架为:
    (1) 输入为100x100的RGB图像和PNCC (Projected Normalized Coordinate Code) 特征,PNCC特征的计算与当前形状相关,可以反映当前形状的信息;算法的输出为3D人脸形状模型参数
    (2) 使用卷积神经网络拟合从输入到输出的映射函数,网络包含4个卷积层,3个pooling层和2个全连接层
    通过级联多个卷积神经网络直至在训练集上收敛,PNCC特征会根据当前预测的人脸形状更新,并作为下一级卷积神经网络的输入。
    (3) 此外,卷积神经网络的损失函数也做了精心的设计,通过引入权重,让网络优先拟合重要的形状参数,如尺度、旋转和平移;当人脸形状接近ground truth时,再考虑拟合其他形状参数
    实验证明该损失函数可以提升定位模型的精度。由于参数化形状模型会限制人脸形状变形的能力,作者在使用3DDFA拟合之后,抽取HOG特征作为输入,使用线性回归来进一步提升2D特征点的定位精度。

    训练3DDFA模型,需要大量的多姿态人脸样本。为此,作者基于已有的数据集如300W,利用3D信息虚拟生成不同姿态下的人脸图像,核心思想为:先预测人脸图像的深度信息,通过3D旋转来生成不同姿态下的人脸图像

    Large-Pose Face Alignment via CNN-Based Dense 3D Model Fitting PAWF

    这篇文章是来自密西根州立大学的Amin Jourabloo和Xiaoming Liu的工作。
    2D的人脸形状U可以看成是3D人脸形状A通过投影变化m得到,如下图所示: 3D人脸形状模型可以表示为平均3D人脸形状 A 0 与若干表征身份、表情的基向量 A id 和 A exp 通过p参数组合而成
    面部特征点定位问题(预测U)可以转变为同时预测投影矩阵m和3D人脸形状模型参数p

    算法的整体框架通过级联6个卷积神经网络来完成这一任务:
    (1) 首先以整张人脸图像作为输入,来预测投影矩阵的更新
    (2) 使用更新后的投影矩阵计算当前的2D人脸形状,基于当前的2D人脸形状抽取块特征作为下一级卷积神经网络的输入,下一级卷积神经网络用于更新3D人脸形状
    (3) 基于更新后的3D人脸形状,计算可得当前2D人脸形状的预测
    (4) 根据新的2D人脸形状预测,抽取块特征输入到卷积神经网络中来更新投影矩阵,交替迭代优化求解投影矩阵m和3D人脸形状模型参数p,直到在训练集收敛

    值得一提的是,该方法在预测3D人脸形状和投影矩阵的同时也考虑到计算每一个特征点是否可见。如果特征点不可见,则不使用该特征点上的块特征作为输入,这是普通2D人脸对齐方法难以实现的
    此外,作者提出两种pose-invariant的特征Piecewise Affine-Warpped Feature (PAWF)和Direct 3D Projected Feature (D3PF),可以进一步提升特征点定位的精度

    End to end 的方法,将输入图片转换为3DMM参数

    3dmm_cnn

    Regressing Robust and Discriminative 3D Morphable Models with a very Deep Neural Network 2016
    https://github.com/anhttran/3dmm_cnn

    密集人脸对齐 用cnn学习2d图像与3d图像之间的密集对应关系 然后使用预测的密集约束计算3DMM参数。

    DeFA: Dense Face Alignment /Pose-Invariant Face Alignment (PIFA) ICCV 2017

    http://cvlab.cse.msu.edu/project-pifa.html

    密西根州立大学的Amin Jourabloo和Xiaoming Liu等人的工作,该组其他人脸对齐的工作可参见其项目主页。

    摘要: 在人脸对齐方法中,以前的算法主要集中在特定数量的人脸特征点检测,比如5、34或者68个特征点,这些方法都属于稀疏的人脸对齐算法。在本文中,我们提出了一种针对大角度人脸图像的一种3D密集人脸对齐算法。在该模型中,我们通过训练CNN模型利用人脸图像来估计3D人脸shape,利用该shape来fitting相应的3D人脸模型,不仅能够检测到人脸特征点,还能匹配人脸轮廓和SIFT特征点。此外还解决了不同数据库中由于包含不同数量的特征点(5、34或68)而不能交叉验证的问题。可以实时运行

    DenseReg: Fully Convolutional Dense Shape Regression In-the-Wild

    原文: CVPR 2017 https://github.com/ralpguler/DenseReg
    摘要: 在本文中,我们提出通过完全卷积网络学习从图像像素到密集模板网格的映射。我们将此任务作为一个回归问题,并利用手动注释的面部标注来训练我们的网络。我们使用这样的标注,在三维对象模板和输入图像之间,建立密集的对应领域,然后作为训练我们的回归系统的基础。我们表明,我们可以将来自语义分割的想法与回归网络相结合,产生高精度的“量化回归”架构。我们的系统叫DenseReg,可以让我们以全卷积的方式估计密集的图像到模板的对应关系。因此,我们的网络可以提供有用的对应信息,而当用作统计可变形模型的初始化时,我们获得了标志性的本地化结果,远远超过当前最具挑战性的300W基准的最新技术。我们对大量面部分析任务的方法进行了全面评估,并且还展示了其用于其他估计任务的用途,如人耳建模。

    vrn

    诺丁汉大学和金斯顿大学 用CNN Regression的方法解决大姿态下的三维人脸重建问题。
    ICCV论文:《Large Pose 3D Face Reconstruction from a Single Image via Direct Volumetric CNN Regression》

    Volumetric Regression Network(VRN) 本文作者使用的模型,由多个沙漏模型组合在一起形成。

    • VRN模型使用两个沙漏模块堆积而成,并且没有使用hourglass的间接监督结构。
    • VRN-guided 模型是使用了Stacked Hourglass Networks for Human Pose Estimation 的工作作为基础,在前半部分使用两个沙漏模块用来获取68个标记点,后半部分使用两个沙漏模块,以一张RGB图片和68个通道(每个通道一个标记点)的标记点作为输入数据。
    • VRN-Multitask 模型,用了三个沙漏模块,第一个模块后分支两个沙漏模块,一个生成三维模型,一个生成68个标记点。

    github:https://github.com/AaronJackson/vrn

    PRNet:Joint 3D Face Reconstruction and Dense Alignment with Position Map Regression Network

    原文: CVPR 2017
    摘要: 本文提出了一个强有力的方法来同时实现3D人脸重构和密集人脸对齐。为实现该目标,我们设计了一个UV位置图,来达到用2D图表示UV 空间内完整人脸的3D形状特征。然后训练了一个简单的CNN来通过单张2D图像回归得到UV图。我们的方法不需要任何先验人脸模型,就可以重构出完整的面部结构。速度9.8ms/帧。

    https://github.com/YadiraF/PRNet

    PRNet 简单来说,就是以前的一张图片三通道是RGB,表达的是二维的图片, 有没有什么方法简单的将三维问题,转换成和现有解决方案相似的问题来处理。作者将一个三维的人脸,投影到x y z 三个平面上,改用xyz作为三个通道,于是 三维的人脸 就可以还是变成三个通道来进行处理。
    简单有效。

    PS: 个人用CAS-PEAL-R1数据集测试了作者给的模型,人脸角度偏差在5°以内,胜过其他二维图片68个特征点很多算法的效果。

    HPEN High-Fidelity Pose and Expression Normalization for Face Recognition in the Wild

    表情相关
    ExpNet: Landmark-Free, Deep, 3D Facial Expressions

    Expression-Net
    https://github.com/fengju514/Expression-Net

    数据集

    UMDFace

    MTFL(TCDCN所用)

    [300W-3D]: The fitted 3D Morphable Model (3DMM) parameters of 300W samples.

    [300W-3D-Face]: The fitted 3D mesh, which is needed if you do not have Basel Face Model (BFM)

    3D-FAN :2D-and-3D-face-alignment

    How far are we from solving the 2D & 3D Face Alignment problem? (and a dataset of 230,000 3D facial landmarks) ICCV2017
    直接使用CNN预测heatmap以获得3D face landmark

    两个github项目,在做同一件事,2d和3d的人脸对齐问题,区别在于前者是Pytorch 的代码,后者是Torch7的。
    github:https://github.com/1adrianb/face-alignment
    github: https://github.com/1adrianb/2D-and-3D-face-alignment

    2D-FAN:https://www.adrianbulat.com/downloads/FaceAlignment/2D-FAN-300W.t7

    3D-FAN:https://www.adrianbulat.com/downloads/FaceAlignment/3D-FAN.t7

    2D-to-3D FAN:https://www.adrianbulat.com/downloads/FaceAlignment/2D-to-3D-FAN.tar.gz

    3D-FAN-depth:https://www.adrianbulat.com/downloads/FaceAlignment/3D-FAN-depth

    other


    OCR

    OCR:Optical Character Recognition 字符识别 / STR, Scene Text Recognition 场景文字识别

    传统的文本文字检测识别,有了很好的商用。但是场景文字检测识别一直没有很好的被解决。随着深度学习的发展,近年来相应工作了有了较好的进展,其主要分为两个步骤:

    1.文字定位(Text Detection),即找到单词或文本行(word/linelevel)的边界框(bounding box),近些年的难点主要针对场景内的倾斜文字检测。

    2.文字识别(Text Recognition)

    将这两个步骤合在一起就能得到文字的端到端检测(End-to-end Recognition)

    传统常用的方法有:

    MSER(Maximally Stable Extremal Regions)最大稳定极值区域
    
    Chen H, Tsai S S, Schroth G, et al. Robust text detection in natural images with edge-enhanced maximally stable extremal regions[C]//Image Processing (ICIP), 2011 18th IEEE International Conference on. IEEE, 2011: 2609-2612.
    
    通过MSER得到文本候选区域,再通过几何和笔划宽度信息滤掉非文本区域, 剩余的文本信息形成文本直线,最终可被切分为单个文字。
    
    Matlab code:http://cn.mathworks.com/help/vision/examples/automatically-detect-and-recognize-text-in-natural-images.html
    

    此外Google DeepMind提出了一种新的网络结构,叫做STN(Spatial Transformer Networks) ,可以用在文字校正方面:

    STN可以被安装在任意CNN的任意一层中,相当于在传统Convolution中间,装了一个“插件”,可以使得传统的卷积带有了[裁剪]、[平移]、[缩放]、[旋转]等特性。

    [1] Jaderberg M, Simonyan K, Zisserman A. Spatial transformer networks[C]//Advances in Neural Information Processing Systems. 2015: 2017-2025.

    https://github.com/skaae/recurrent-spatial-transformer-code

    Text Detection (文字定位)

    文字定位分为 如下几类:Proposal-based method ,Segmantation-based method , Part-based method 和 Hybrid method

    Proposal-based method

    DeepText 金连文

    DeepText(此方法不是Google的DeepText哦),对fasterRCNN进行改进用在文字检测上,先用Inception-RPN提取候选的单词区域,再利用一个text-detection网络过滤候选区域中的噪声区域,最后对重叠的box进行投票和非极大值抑制

    Deep Matching Prior Network
    金连文教授发表在 CVPR2017 上的工作提出了一个重要观点:在生成 proposal 时回归矩形框不如回归一个任意多边形。

    理由:这是因为文本在图像中更多的是具有不规则多边形的轮廓。他们在SSD(Single ShotMultiBox Detector)的检测框架基础上,将回归边界框的过程和匹配的过程都加入到网络结构中,取得了较好的识别效果并且兼顾了速度。

    现在的方法越来越倾向于从整体上自动处理文本行或者边界框,如 arXiv上的一篇文章就将 Faster R-CNN中的RoI pooling替换为可以快速计算任意方向的操作来对文本进行自动处理。

    Arbitrary Oriented Scene Text Detection via Rotation Proposals

    TextProposals: a Text-specific Selective Search Algorithm for Word Spotting in the Wild.

    这篇文章针对文本的特殊属性,将object proposal 的方法用在了文本检测中,形成了text-proposal。

    text-proposal也是基于联通区域的组合,但又与之前的方法有所不同:初始化的区域并不对应单个字符,也不需要知道里面的字符数。

    代码见:https://github.com/lluisgomez/TextProposals

    Gupta A, et al. Synthetic data for text localisation in natural images. CVPR, 2016.

    CTPN (Connectionist Text Proposal Network) 详解 detail Zhi Tian, 乔宇 Qiao Yu / CUHK-MMLAB & SIAT

    • CTPN 使用CNN + RNN 进行文本检测与定位。

    作者caffe中模型结构如图:

    [1] [ECCV2016] Detecting Text in Natural Image with Connectionist Text Proposal Network pdf

    Caffe 源码:https://github.com/tianzhi0549/CTPN 官方

    TextBoxes 详解 detail 白翔 Xiang Bai/Media and Communication Lab, HUST

    • TextBoxes,一个端到端的场景文本检测模型。这个算法是基于SSD来实现的,解决水平文字检测问题,将原来3×3的kernel改成了更适应文字的long conv kernels 3×3 -> 1×5。default boxes 也做了修改。

    作者caffe中模型结构如图:

    [2] M. Liao et al. TextBoxes: A Fast Text Detector with a Single Deep Neural Network. AAAI, 2017. pdf

    Caffe 源码:https://github.com/MhLiao/TextBoxes 官方

    TextBoxes++ 详解 detail 白翔 Xiang Bai/Media and Communication Lab, HUST

    • TextBoxes++ 这个算法也是基于SSD来实现的,实现了对多方向文字的检测。boundingbox的输出从4维的水平的boundingbox扩展到4+8=12维的输出。long conv kernels 从 1×5 改成了 3×5。default boxes 也做了修改。

      [3] M. Liao et al. TextBoxes++: Multi-oriented text detection pdf

      Caffe 源码:https://github.com/MhLiao/TextBoxes_plusplus 官方

    East: An Efficient and Accurate Scene Text Detector

    Segmantation-based method:

    FCN_Text

    基于分割的方法,使用FCN来做,
    将文本行视为一个需要分割的目标,通过分割得到文字的显著性图像(salience map),这样就能得到文字的大概位置、整体方向及排列方式,再结合其他的特征进行高效的文字检测。

    [CVPR2016]Zhang Z, et al.Multi-Oriented Text Detection with Fully Convolutional Networks,CVPR, 2016. pdf

    caffe torch code :https://github.com/stupidZZ/FCN_Text

    这篇文章将局部和全局信息结合,使用了一种coarse-to-fine的方法来定位自然场景中的文本。首先,使用了全卷积的神经网络来训练和预测文字区域的显著图;然后,结合显著图和文字元素来估计文字所在的直线;最后,另一个全卷积模型的分类器用来估计每个字符的中心,从而去掉误检区域。这个系统能够处理不同方向、语言、字体的文本检测,在MSRA-TD500, ICDAR2015和ICDAR2013的评测集上都取得了state-of-the-art的结果。

    Scene Text Detection Via Holistic multi-channel Prediction

    发现在卷积神经网络中可以同时预测字符的位置及字符之间的连接关系,这些特征对定位文字具有很好的帮助。其过程如下:

    得到文字文本行的分割结果;

    得到字符中心的预测结果;

    得到文字的连接方向。

    通过得到的这三种特征构造连通图(graph),然后对图进行逐边裁剪来得到文字位置。

    Multi-Oriented Scene Text Detection via Corner Localization and Region Segmentation

    Part-based method:

    对于多方向文字检测的问题,回归或直接逼近bounding box的方法难度都比较大,所以考虑使用 part-based model 对多方向文字进行处理。

    SegLink

    将文字视为小块单元。对文字小块同时进行旋转和回归。并且通过对文字小块之间的方向性进行计算来学习文字之间的联系,最后通过简单的后处理就能得到任意形状甚至具有形变的文字检测结果。

    例如,对于那些很长的文本行,其卷积核的尺寸难以控制,但是如果将其分解为局部的文字单元之后就能较好地解决。

    SegLink+ CRNN 在ICDAR 2015上得到了当时最好的端到端识别效果。

    B. Shi et al. Detecting Oriented Text in Natural Images by Linking Segments. IEEE CVPR, 2017.

    Code: https://github.com/bgshih/seglink

    Hybrid method

    最近有些方法同时使用分割(segmentation)和边界框回归(bounding box regression)的方式对场景文字进行检测。

    如 CVPR2017 上的一篇文章使用PVANet对网络进行优化、加速,并输出三种不同的结果:

    边缘部分分割的得分(score)结果;

    可旋转的边界框(rotated bounding boxes)的回归结果;

    多边形bounding boxes(quadrangle bounding boxes)的结果。

    同时对非极大值抑制(NMS)进行改进,得到了很好的效果。

    He W, et al. Deep Direct Regression for Multi-Oriented Scene Text Detection. ICCV, 2017

    arXiv上的一篇文章使用了相似的思想:一个分支对图像分割进行预测,另一个分支对边界框(bounding box)进行预测,最后利用经过改进的非极大抑制(Refined NMS)进行融合。

    Text Recognition (文字识别)

    ###Word/Char Lever
    通过多类分类器,如word 分类器,char 分类器 来判断。每一类都是一个word 或者char。

    M. Jaderberg et al. Reading text in the wild with convolutional neural networks. IJCV, 2016.

    Sequence Level

    从图片获取Sequence feature,然后通过RNN + CTC
    B. Su et al. Accurate scene text recognition based on recurrent neural network. ACCV, 2014.

    He et al. Reading Scene Text in Deep Convolutional Sequences. AAAI, 2016.

    CRNN 详解 detail 白翔 Xiang Bai/Media and Communication Lab, HUST

    RARE 白翔 Xiang Bai/Media and Communication Lab, HUST

    用STN 加上 SRN 解决弯曲形变的文字识别问题

    SRN: an attention-based encoder-decoder framework

    Encoder: ConvNet + Bi-LSTM

    Decoder: Attention-based character generator

    [2]Shi B, Wang X, Lv P, et al. Robust Scene Text Recognition with Automatic Rectification[J]. arXiv preprint arXiv:1603.03915, 2016. paper

    End to End 端到端文字检测与识别

    [2016-IJCV]Reading Text in the Wild with Convolutional Neural Networks pdf
    较早的端到端识别研究是VGG 组发表在 IJCV2016中的一篇文章,其识别效果很好,并且在两年内一直保持领先地位。

    这篇文章针对文字检测问题对R-CNN进行了改造:

    通过edge box或其他的handcraft feature来计算proposal;

    然后使用分类器对文本框进行分类,去掉非文本区域;

    再使用 CNN对文本框进行回归来得到更为精确的边界框(bounding box regression);

    最后使用一个文字识别算法进一步滤除非文本区域。

    VGG组在CVPR2016上又提出了一个很有趣的工作。文章提出文本数据非常难以标注,所以他们通过合成的方法生成了很多含有文本信息的样本。虽然图像中存在合成的文字,但是依然能得到很好的效果。

    Deep TextSpotter

    [ICCV2017] Lukas Neumann ,Deep TextSpotter:An End-to-End Trainable Scene Text Localization and Recognition Framework pdf

    https://github.com/MichalBusta/DeepTextSpotter

    该方法将文字检测和识别整合到一个端到端的网络中。检测使用YOLOv2+RPN,并利用双线性采样将文字区域统一为高度一致的变长特征序列,再使用RNN+CTC进行识别。

    文档矫正

    DocUNet: Document Image Unwarping via A Stacked U-Net face++

    https://zhuanlan.zhihu.com/p/37306349

    ObjectDetection&Seg

    物体分类(物体识别)解决的是这个东西是什么的问题(What)。而物体检测则是要解决这个东西是什么,具体位置在哪里(What and Where)。
    物体分割则将物体和背景进行区分出来,譬如人群,物体分割中的实例分割则将人群中的每个人都分割出来。

    Object Detection 物体检测

    Christian Szegedy / Google 用AlexNet也做过物体检测的尝试。

    [1] Szegedy, Christian, Alexander Toshev, and Dumitru Erhan. "Deep neural networks for object detection." Advances in Neural Information Processing Systems. 2013. pdf

    不过真正取得巨大突破,引发基于深度学习目标检测的热潮的还是RCNN

    RCNN Ross B. Girshick(RBG) link / UC-Berkeley

    • RCNN R-CNN框架,取代传统目标检测使用的滑动窗口+手工设计特征,而使用CNN来进行特征提取。

    Traditional region proposal methods + CNN classifier

    创新点:将CNN用在物体检测上,提高了检测率。
    缺点:每个proposal都卷积一次,重复计算,速度慢。

    R-CNN在PASCAL VOC2007上的检测结果提升到66%(mAP)

    [2] SGirshick, Ross, et al. "Rich feature hierarchies for accurate object detection and semantic segmentation." Proceedings of the IEEE conference on computer vision and pattern recognition. 2014. pdf

    SPPNet 何凯明 He Kaiming /MSRA

    • SPPNet
      [3] He, Kaiming, et al. "Spatial pyramid pooling in deep convolutional networks for visual recognition." European Conference on Computer Vision. Springer International Publishing, 2014. pdf

    Fast RCNN Ross B. Girshick

    • Fast RCNN
      [4] Girshick, Ross. "Fast r-cnn." Proceedings of the IEEE International Conference on Computer Vision. 2015.

    Faster RCNN 何凯明 He Kaiming

    • Faster RCNN
      将Region Proposal Network和特征提取、目标分类和边框回归统一到了一个框架中。

    Faster R-CNN = Region Proposal Network +Fast R-CNN

    [5] Ren, Shaoqing, et al. "Faster R-CNN: Towards real-time object detection with region proposal networks." Advances in neural information processing systems. 2015.

    Yolo

    • Yolo
      [6] Redmon, Joseph, et al. "You only look once: Unified, real-time object detection." arXiv preprint arXiv:1506.02640 (2015). [pdf] (YOLO,Oustanding Work, really practical)

    SSD(The Single Shot Detector) 详解 detail

    ParseNet

    R-FCN

    • R-FCN
      [8] Dai, Jifeng, et al. "R-FCN: Object Detection via Region-based Fully Convolutional Networks." arXiv preprint arXiv:1605.06409 (2016). [pdf]

    Mask R-CNN

    • Mask R-CNN
      [9] He, Gkioxari, et al. "Mask R-CNN" arXiv preprint arXiv:1703.06870 (2017). [pdf]

    Object Segmentation 物体分割

    FCN 
    SegNet
    Dilated Convolutions
    DeepLab (v1 & v2)
    RefineNet
    PSPNet
    Large Kernel Matters
    DeepLab v3

    FCN

    [1] J. Long, E. Shelhamer, and T. Darrell, “Fully convolutional networks for semantic segmentation.” in CVPR, 2015. [pdf]

    U-NET

    SegNet

    DeconvNet

    Deeplab

    RefineNet

    BlitzNet

    DeepMask

    https://github.com/facebookresearch/deepmask

    Art&Gan

    Art

    Interactive Deep Colorization

    https://github.com/junyanz/interactive-deep-colorization

    pix2pix

    Edges2cats:

    http://affinelayer.com/pixsrv/index.html

    Github:

    https://github.com/phillipi/pix2pix

    http://paintschainer.preferred.tech/index_zh.html

    Neural Doodle

    使用深度神经网络把你的二流涂鸦变成艺术品。

    Champandard(2016) “Semantic Style Transfer and Turning Two-Bit Doodles into Fine Artworks”

    基于 Chuan Li 和 Michael Wand(2016)在论文“Combining Markov Random Fields and Convolutional Neural Networks for Image Synthesis”中提出的 Neural Patches 算法。这篇文章中深入解释了这个项目的动机和灵感来源:https://nucl.ai/blog/neural-doodles/

    doodle.py 脚本通过使用1个,2个,3个或4个图像作为输入来生成新的图像,输入的图像数量取决于你希望生成怎样的图像:原始风格及它的注释(annotation),以及带有注释(即你的涂鸦)的目标内容图像(可选)。该算法从带风格图像中提取 annotated patches,然后根据它们匹配的紧密程度用这些 annotated patches 渐进地改变目标图像的风格。

    Github 地址:https://github.com/alexjc/neural-doodle

    Deep Painterly Harmonization

    https://github.com/luanfujun/deep-painterly-harmonization

    Visual Attribute Transfer through Deep Image Analogy SIGGRAPH 2017 paper

    https://github.com/msracver/Deep-Image-Analogy

    Colornet

    Github 地址:https://github.com/pavelgonchar/colornet

    强化学习

    SAC-X

    GAN

    生成式对抗网络(GAN, Generative Adversarial Networks )是近年来深度学习中复杂分布上无监督学习最具前景的方法之一。
    监督学习需要大量标记样本,而GAN不用。
    模型包括两个模块:生成模型(Generative Model)和判别模型(Discriminative Model),通过模型的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。

    [1] Ian Goodfellow. "Generative Adversarial Networks." arXiv preprint arXiv:1406.2661v1 (2014). [pdf] (https://arxiv.org/pdf/1406.2661v1.pdf)

    和监督学习的的网络结构一样,GAN的发展 也主要包含网络结构性的改进 和loss、参数、权重的改进。我们首先看后者 。

    WGAN /WGAN-GP

    在初期一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。

    为啥难训练? 令人拍案叫绝的Wasserstein GAN 中做了如下解释 :
    原始GAN不稳定的原因就彻底清楚了:判别器训练得太好,生成器梯度消失,生成器loss降不下去;判别器训练得不好,生成器梯度不准,四处乱跑。只有判别器训练得不好不坏才行,但是这个火候又很难把握,甚至在同一轮训练的前后不同阶段这个火候都可能不一样,所以GAN才那么难训练。

    https://zhuanlan.zhihu.com/p/25071913

    WGAN 针对loss改进 只改了4点:
    1.判别器最后一层去掉sigmoid
    2.生成器和判别器的loss不取log
    3.每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c
    4.不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行

    https://github.com/martinarjovsky/WassersteinGAN

    WGAN的作者Martin Arjovsky不久后就在reddit上表示他也意识到没能完全解决GAN训练稳定性,认为关键在于原设计中Lipschitz限制的施加方式不对,并在新论文中提出了相应的改进方案--WGAN-GP ,从weight clipping到gradient penalty,提出具有梯度惩罚的WGAN(WGAN with gradient penalty)替代WGAN判别器中权重剪枝的方法(Lipschitz限制):

    [1704.00028] Improved Training of Wasserstein GANspdf

    Tensorflow实现:https://github.com/igul222/improved_wgan_training

    pytorch https://github.com/caogang/wgan-gp

    发布在 社区博客 阅读更多

与 奇点AI社区 的连接断开,我们正在尝试重连,请耐心等待