Life sucks, but you're gonna love it.

0%

【百度PaddlePaddle】深度学习7日入门-CV疫情

本文件夹为百度Aistudio课程《深度学习7日入门-CV疫情》

  • 数据: 从百度Aistudio数据集下载
  • 框架: PaddlePaddle
  • 语言: Python

作业调试详解及心得体会请参照各作业文件夹。

1. 数据可视化[已完成])

基于 丁香园 整合全国疫情数据更新制作可视化数据图。

作业任务:

 1. 下载安装 PaddlePaddle,课程中有详细介绍
 2. 应用学习pyecharts库学习应用,将全国疫情数据可视化在饼状图中

作业举例:

1. 已提供爬虫script,将丁香园中的数据下载整合到本地
2. 已提供pyecharts部分地图和趋势图的实现代码

2. 构建DNN神经网络手势识别[已完成)]

基于DNN全连接神经网络对手势和对应数字进行识别。

作业任务:

 1. 完成DNN 神经网络
 2. 优化自己的DNN神经网络(test_acc:0.83, SGD, lr = 0.001, epoch = 200)

3. 构建CNN神经网络车牌识别[已完成)]

基于CNN卷积神经网络对车牌的(数字/ 字母/ 省简称)进行识别

作业任务:

 1. 完成CNN神经网络
 2. 优化自己的CNN神经网络(test_acc:0.93, SGD, lr 0.01, epoch = 200)

4. 模块化构建VGG神经网络口罩识别[已完成)]

定义重复出现的CNN网络结构使其模块化,二分类识别图片中的人是否戴口罩。(更完整的完成任务还需要识别图片中人脸的位置)

作业任务:

1. 完成CNN神经网络
2. 优化自己的CNN神经网络(+BatchNorm test_acc=1.0, Adam, lr = 0.0001, epoch=50)

5. Paddle Slim 对模型进行精简[已完成]

学习实践Paddle Slim对模型精简模块,可以有效提高模型速度,减小模型所占内存。

作业任务:

1. 概念选择题
2. 完成定点量化精简

比赛:人流密度检测[得分:0.49469分 排名:51/368] [已完成][(https://github.com/Capchenxi/Aistudio/tree/master/深度学习7日入门-CV疫情特辑/Compete)]

比赛任务:检测人流密度,得分应该是错误率之类的,越低越好。
训练数据:常规赛-人流密度检测
试验方法:

  • Baseline: 老师给出的baseline就已经了不起了,跑通了大概能排到200+左右目前,单纯的cnn放在一起提取的人流密度热力图。的粉黛该是0.68左右
  • 我的方法:参考了 Dense Scale Network for Crowd Counting 这篇文章中密集的残差连接结构,除了MSE作为loss之外还加入了不同尺度下的MAE(mean absolute error)作为loss。

摘要

我们介绍了一个新的语言表达模型叫做 BERT (Bidirectional-Encoder-Representations from Transformers).和最近出现的语言表达模型不同, Bert是基于前后上下文来预训练深度双向表达未标注文本的。所以说,预训练BERT模型可以通过只增加一个输出层来调优以便得到适用于各种任务的最佳模型。

BERT is conceptually simple and empirically powerful. 从理论和实践上来讲,BERT很强大。他得到了新的GLUE高分。

简介

最近参加了百度Aistudio深度学习七天训练营cv疫情的课程,临近结束,发布了PaddlePaddle的比赛,是关于人流密度检测的比赛。于是我打开电脑,一时不知道如何下手。虽然我知道任务的目的是什么,也有一些了解的网络结构可以应用,但我被卡在了看似最基础的部分 : 数据准备。

计算机视觉的任务主要分为三种:图像分类,图像分割,图像检测。

  • 分类任务很简单,数据的输入输出对之间有明确的一一对应的关系,最主要的形式就是(Img图片, class类别)。一般情况下class类别以是个hot vector
  • 分割任务也很明确,输入输出数据之间的关系也很明显,主要形式就是(IMG图片, MASK掩膜),输出的mask和输入图片的大小一致,mask上像素级别的分类可以告诉我们实际图片上对应像素属于哪一类,从而实现将原图片分割为不同类别的目标。

但到了图像检测(目标检测)的任务我就有些慌乱,为啥呢,前两个任务的输入输出都很明确且是固定的,但对于检测任务来说,没一张图片上可以检测出来的目标是不确定的,那这个数据应该怎么准备呢。我陷入了思考。但幸运的是,课程老师发布了Baseline的版本,上面带有对数据的处理,于是,我来研究和总结一下对于目标检测的任务,他的数据是怎么准备的。

当然了,也可以说,在人流密度检测中可以简单将任务的数据处理为(IMG图片, COUNT人数),这样就变成了一个回归问题,但我还是想借此机会了解一下不定数量的标注框在目标检测任务中,是怎么放到模型中去的。

【2 Days Later】

朋友们,我看了baseline的程序之后发现,原来人流密度计算更多是用人流密度图来做参考的,也就是说这边作为目标的不是一个一个框框的位置标定,而是将框转化为点,然后将点表示在和输入图像相同大小的图片中。因为数据集还考虑了ignore region,也就是需要被忽略部分的点,而这些点在density图上被直接挖空,不再考虑。

(可能也还是有用人像的框做标记的人流密度计算的方法的?这里先考虑的是转化为人流密度图)

那我们就先来看一下人流密度图的数据是如何构造的。

数据整理

其实对于数据的整理和读取也是很范式化的过程。

  1. 明确已有数据构成
  2. 明确需要数据构成

这其实是很简单也显而易见的,并且正因为这部分的大同小异,我们在参考别人的porject的时候,关于数据的读取部分也是相似的。除了一些训练上的需要,其他部分都类似。

文件读取

以文件夹形式存在的

我见识的比较少,一般常见的都是以文件夹形式存在的,也就是说,每个文件夹的名称代表的数据类别。这种一般出现在分类和分割的任务中。我们一般会把训练集的文件名保存在.txt 文件中,之后用的时候直接读取就可以了。

  • 文件夹已分好类别,很简单,只要了解一些电脑的io知识以及读写txt文件的知识就可以了。

    1
    2
    3
    4
    5
    6
    import os
    os.listdir(path) # 根据输入的path输出不同的path中的文件名
    os.listdir(os.path.join(path +'***')) # 可拼凑组合不同给的文件夹名称
    with ('filename') open as f:
    f.write()
    f.close()
  • 文件夹没分好类,类别在文件名中表示,这时候需要一些简单的字符串处理就可以了。

    1
      

以json和文件夹形式存在的

如果除了图片本身和文件夹说明的标签之外我们还需要其他的信息,那么这时候,就需要用json文件描述更多信息。我接触的目标检测的project不是很多,目前来说就见到了这一种。但很显然的是,除了文件夹能表示的标签之外,这类任务需要其他的文件来表明更多的信息。

摘要

神经网络为基础的机器翻译(Neural Machine Translation, NMT)是自动翻译的端到端学习方法,它具有克服很多传统基于词组的劣势的潜质。但不幸的是,我们都知道NMT的计算复杂度和空间复杂度过高,在训练和翻译应用时需要很多的资源,当数据资源和模型过大的时候,NMT是不适合运用的。一些研究者表明,NMT的鲁棒性是很低的,尤其是当输入的句子包含有某些少见的单词的时候。

在这片文章中,我们引入了 Google’s Neural Machine Translation System, GNMT, 来解决这些潜在的问题。这个模型包含了8个编译层和8个解码层,使用残差网络和注意力模块来连接编译和解码层。

  • 为了增强平行性来减少训练时间,我们的注意力模块连接的只有编码层的最高层和解码层的最底层。
  • 为了加速最终的翻译速度,我们在进行inference计算的时候运用了低精度的计算
  • 为了增强对不常见词的处理能力,我们将输入和输出的词语分解为常见的sub-words单元

  • 我们的定向搜索技术运用了长度归一化的方法,并且加上了收敛损失,使得翻译输出的句子能够将输入的信息全部囊括。

  • 为了优化翻译的BLEU 分数,我们加入了强化学习,但是增高的BLEU分数并没有反映在人工评价的提升上。

Read more »

讲过了第一大类的Regression,自然就到了机器学习的另一个问题:Classification。Regression主要是处理和数值相关的问题,比如我们需要预测某种结果的时候。但Classification着重于分类,比如说我们在看病的时候,需要一种模型来告诉我们究竟是否得病了,再比如一些手写识别,人脸识别。在这部分,我们也会通过举出某种实例来说明分类的问题。

Example:Classification of Pokemon

这部分举例主要是通过不同的宝可梦的特征值,来判断它是什么属性的。

可能你也会问,那既然如此,我们何不利用regression定义一条直线,然后通过的两边来定义不同的类呢。

这样的想法是合理的,但如果用regression其实拔高了各类之间的关系。怎么说呢,可能现在有两组分类,但由于其中一组一些data过于正确,这条分类的regression的线就会过度偏向于有很多正确data的一方。所以Regression的方法是不合适的。

所以我们还是通过既定的步骤来找合适的模型:

  • 分类问题该应用怎样的模型
  • 分类问题该应用怎样的损失函数进行训练
  • 最佳的模型是什么

Probability Generative Model

首先,回答第一个问题的是,我们该通过怎样的模型对分类问题进行训练。这里选择的是概率模型。至于为什么叫Generative,是因为在我们得知模型之后就可以自己生成数据了。

这里把问题建模为一个概率模型,即当我们得知数据 $\bf x$ 之后,它处于每一类的概率是多少,概率越大的类别有更大的可能性,我们就将数据分到概率最大的类别。若是二分类,直接看概率是否大于0.5即可。

摘要

目前,有监督的卷积网络收获了极大地成功。但是无监督的卷积神经网络受到的关注度就比较低。这篇文章主要是希望可以构建有监督和无监督学习之间的桥梁。文章介绍了一类被称为是深度卷积生成网络的结构,他们有很浅给的结构上的限制并且说明了在无监督学习方面这类网络是很有优势的,并且会通过一系列的任务来体现这类网络的优势。

简介

从大量的无标记图片数据库中学习重复出现的特征是热门研究的方向。在计算机视觉中,我们可以利用大量的无标记数据来学习他们的中间特征,这些学到的特征可以完成分类的任务。本文提出一种通过训练GAN(生成对抗网络)来建立图片的特征,并且之后再利用生成器和判别器中的网络作为有监督学习中的特征提取器。GAN模型提供了一个很好的对于最大化估计的替代手段。GAN模型的训练不是很稳定,明显的表现在生成器生成一些奇怪的图片上;展现GAN学习到了什么特征的可视化研究也很少。

这篇文章的贡献主要有几个方面:

  • 提出和评价了卷积对抗生成网络中结构的限制,希望这些限制能帮助GAN结构更稳定地训练。并且命名为DCGAN
  • 训练了可以进行图片分类的生成器,和其他无监督分类模型进行比较
  • 可视化GAN模型学习到的filter,并且展示了特定的filter可以画出特定的物体
  • 展示了生成器有很多有趣的向量计算,可以直接反映在生成的图片上。

Related Work

  • 从无标签数据中学习特征表达
  • 生成自然的图片(比较像真的的图片)
  • 可视化内部CNN层

Approach and Model Architecture

历来将CNN结构用在GAN的模型中生成图片展示的效果都不是很好。这让LAPGAN的作者想到逐步提高生成图片的分辨率使得生成图片的模型更加稳定。我们同样也遇到了将CNN运用在GAN模型中常见的不稳定的问题。然而在一些列的模型探索以后,我们选定了一组模型可以在训练时稳定生成高清晰度的图片。

我们方法的核心是采用和修改最近在CNN结构中提出的改变

  1. 用带有确定stride参数的卷积层替代池化层,这可以使网络自己去学习适用于自身的下采样的方法。我们在生成器generator中采用这个改变
  2. 去除卷积网络顶部的全连接层。最强有力的证明是使用平均池化层,我们发现global average pooling会提升模型的稳定性但是会减缓收敛速度。折中的办法是直接用卷积特征连接生成器和判别器的输入和输出层。(?)。GAN网络的第一层,也就是随机 z 向量这一层可以被称作全连接层,因为这只是矩阵的乘法,但是他得出的结果会变形为4维tensor,并且开启以后一堆卷积。对于判别器来讲,最后一层的卷积层会被放入单一的sigmoid方程中作为输出。
  3. Batch Normalization可以稳定学习过程。但是在每一层增加BN层会导致生成的样本不稳定,所以在生成器的输出和判别器的输入层,我们不会用到BN。
  4. 在生成器除了输出层职位都用ReLU,在判别器用leaky ReLU会好一些

对抗训练的细节

我们用三个数据库: LSUN, Imagenet,组合人脸作为训练数据,训练了DCGAN模型。

  • 对于训练图片 scale到 tanh方程的范围 [-1, 1]
  • 所有训练中用size 128 mini-batch的SGD进行梯度下降运算
  • 初始化z向量都来自于deviation为0.02的高斯分布
  • LeakyReLU中的斜率为0.2
  • 利用Adam优化器,momentum设置为0.5
  • 学习率设置为0.0002

LSUN

随着由GAN网络生成的图片质量的提高,对于网络是否过拟合的讨论也随之增加。为了说明我们的模型是如何处理更多数据并且生成更高分辨率的图片,我们在LSUN大约三百万张图上做了训练。最近的分析显示了模型学习速度之快和生成图片质量之间的关系。我们展示了训练一次过后的sample,模仿在线学习,显示我们的模型并不是通过过拟合生成高质量图片的。训练的图片没有进行数据增广。

Faces

Faces的数据库是从网上下载了一些包含人的图片。每一个人都做了确认,保证他们是处于现代的人。对于这些图片,通过OpenCV里的人脸detector将脸从图片中识别出来。这些face boxes就被当做是训练数据。同样这部分的图片没有进行数据增广。

ImageNet-1k

我们用了ImageNet数据库中的图片作为无监督学习的图片来源。训练是在大小为 $32\times32$ 尺寸的图片上展开。图片同样没有做数据增广。

Empirical Validation of DCGAN capabilities

Classifying CIFAR-10 using GANs as a feature extractor

常见的评价无监督特征学习的算法就是将他们用作特征提取器用在有监督的数据库中,然后看他表现如何。

在CIFAR-10数据库中,用K-means算法作为单层网络的特征提取器已经可以得到很好的分类结果。当特征map的数量增加到4800的时候,可以达到的准确略为80.6%,若是将它拓展为多层特征学习,那么准确率可以高达82%。为了评价DCGAN学到的特征,我们将模型在ImageNet-1k上进行训练,然后用判别器每一层的卷积特征进行最大池化处理,将每一层生成一个 $4\times4$ 的网格。这些特征然后被展开形成一个 28672 维的向量,然后用 L2-svm分类器进行分类,可以得到准确率为82.8%的结果。DCGAN的结果还是没有直接训练CNN的结果好。另外,因为DCGAN不是在CIFAR-10本来的数据库上训练的,也可以说明该模型真的学到了特征,并且不受训练数据的影响。

Classifiying SVHN digits using GAN as a feature extractor

这部分和上部分的内容差不多,是在另一个数据集上面的测试。如果用DCGAN的判别器做有监督学习,能够得到比较小的test error。另外,我们验证了DCGAN里面的CNN结构并不是模型分类的关键点,因为如果纯训练一个CNN的有监督模型,达到的误差更大。

Investigating and visualizing the internals of the networks

我们从多方面研究了训练的生成器和判别器。我们不做任何 nearest neighbor的搜索。在像素级别或者特征级别的nearest neighbor容易被愚弄,童谣的我们不用log-likelihood标准来评价模型,因为这种标准很弱。

Walking in the latent space

我们做的第一个实验是去理解隐层的样貌。顺着训练中学习到的流我们可以找到一些出现剧烈变化时表现出的训练模型memorization的标志,以及那些信息被破坏了。如果在隐层中探索的过程中,某一层的语义发生了变化(比如增加或减少了某个部分)那么我们可以以此作为模型学习到的相关和有趣的特征。

Visualizing the discriminator features

之前的工作显示了在有监督训练下的CNN网络会学到很有力的特征。特别是对以一些场景而言,CNN网络会学习到一些物体的detector。我们介绍了DCGAN也同样从大量的图片数据库中学到有趣的特征。特别是在卧室的场景中,可以看到学习到了一些床,窗户这样的特征。

Manipulating the generator representation

除了从判别器学习到的特征之外,我们也需要考虑生成器学到了什么。从生成的图片的质量上来讲,生学期学习到了场景一些主要的特征,比如床,窗户,台灯,门还有奢华的家具。为了探索更多的特征的性能,我们做事杨尝试去除生成器中的窗户。

在150个sample中,52个窗户被人为地框起来。在第二高的卷积特征层,应用了logistic regression去预测窗户的特征是否被激活。圈出的窗户盒子内的激活层是正值还是随机值。【这部分是没怎么弄明白是怎么把窗户给搞没有的】

Vector arithmetic on face samples

学习了用在自然语言处理上的对于词向量的操作。这里是直接将加减操作用在Z向量上,最后生成的图片也会产生某种特征上的变化。

摘要

Semantic Human Matting也被称作是人像的抠图,是一种高质量的图像分割。在图像硬分割的任务中,我们的分割只分为前景和背景两个部分,所以分割看到的边界比较明确。但是human matting的输出并不是一个 非零即一的掩码,而是一个透明度的层,这样可以将分离出的人像的边界有比较好的过度,而不至于太硬。

现存的很多抠图的算法是需要人标定出前景和背景的一小部分,然后根据标定的位置进行抠图。这篇文章提出了一个自动进行图像抠图的算法 — 语义人像抠图。

Read more »

摘要

这篇文章介绍了一个新的网络MobileNet,可用在移动设备的视觉应用中。MobileNet是基于深度可分离卷积建立的。同时介绍了两个可以在准确性和运算复杂度进行衡量的超参。超参可以针对不同的问题选择一个最优的模型。这篇文章展示在不同任务上的不同实验。

【这篇文章提出了新的网络结构,将标准卷积结构替换为depthwise seperable convolution,减少计算复杂度以及网络参数;引入两个超参:Width Multiplier $\alpha$ 用来缩减特征channel,Resolution Multiplier $\rho$ 用来缩减特征的大小 】

Read more »

摘要

文章介绍了新的提高应用于多任务上的轻型网络;介绍了将模型应用于新的SSDLite框架上。这个模型是基于倒置残差结构; 发现移除比较narrow的神经网络层中的非线性比较重要。分别在分类和目标检测的任务上做了实验。

【这篇文章主要提出的是inverted bottleneck结构和结构中线性的加入,都是为了在传播过程中可以最大化保留输入数据的信息】

Read more »

我整了半天的Advances in Machine Learning,然后发现我还有前半部分的没听。其实之前Machine Learning听过Andrew Ng的课,比较纯理论,基本上是用黑板上课全部推公式的过程,也是很受益匪浅的课。然后现在又跑来听李宏毅老师的课,希望可以做一下作业吧,包括后面很多用Neural Network的部分。Andrew的课和我后来上的estimation and detection很像,用到Neural Network部分的比较少,基本上都传统的有监督和无监督学习,包括贝叶斯, SVM, K-means, EM 这些算法的推论和讲解。

感觉自己的实践还是比较少的,所以又来听课了,并且还是记录一下可能会比较好复习。

这部分是课程Introduction。

Read more »