目录
1.神经网络结构基本原理
随便看看,这个资料比较笼统参考资料25个神经网络
1.1 CNN卷积神经网络
(卷积层+池化层)来几次,最后跟2-3层全连接层
在我们的实际项目中,一般不会直接从第一层直接开始训练,而是通过在大的数据集上(如ImageNet)训练好的模型,把前面那些层的参数固定,在运用到我们新的问题上,修改最后一到两层,用自己的数据去微调(finetuning),一般效果也很好。
所谓finetuning,就是说我们针对某相似任务已经训练好的模型,比如CaffeNet, VGG-16, ResNet等, 再通过自己的数据集进行权重更新, 如果数据量比较小,可以只更新最后一层,其他层的权重不变,如果数据量中等,可以训练后面几层,如果数据量很大,那OK,直接从头训练,只不过在训练时间上,需要花费比较多。
在网络训练好之后,只需要forward过程就能做预测,当然,我们也可以直接把这个网络当成一个feature extractor来用,可以直接用任何一层的输出作为特征,根据R-CNN论文对Alexnet的实验结果,如果不做fine-tuning,pool5和fc6和fc7的特征效果并没有很强的提升,所以,如果直接用作feature extractor,直接用pool的最后一层输出就OK。
1.2 FCN全卷积神经网络
(卷积层+池化层)来几次,最后跟卷积层,没有全连接层.这样做的好处就是能够进行dense prediction简单的来说,FCN与CNN的区域在把于CNN最后的全连接层换成卷积层,输出的是一张已经Label好的图片。FCN详细介绍如图所示,对猫的识别从单一概率值的大小,变成了对某一范围概率的云图。
FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。
最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本。下图是Longjon用于语义分割所采用的全卷积网络(FCN)的结构示意图:
1.2.1FCN语义分割
在进行语义分割的时候,需要解决的一个重要问题就是,如何把定位和分类这两个问题结合起来,毕竟语义分割就是进行逐个像素点的分类,就是把where和what两个问题结合在了一起进行解决.
在前面几层卷积层,分辨率比较高,像素点的定位比较准确,后面几层卷积层,分辨率比较低,像素点的分类比较准确,所以为了更加准确的分割,需要把前面高分辨率的特征和后面的低分辨率特征结合起来.
如上图所示,对原图像进行卷积conv1、pool1后原图像缩小为1/2;之后对图像进行第二次conv2、pool2后图像缩小为1/4;接着继续对图像进行第三次卷积操作conv3、pool3缩小为原图像的1/8,此时保留pool3的featureMap;接着继续对图像进行第四次卷积操作conv4、pool4,缩小为原图像的1/16,保留pool4的featureMap;最后对图像进行第五次卷积操作conv5、pool5,缩小为原图像的1/32,然后把原来CNN操作中的全连接变成卷积操作conv6、conv7,图像的featureMap数量改变但是图像大小依然为原图的1/32,此时进行32倍的上采样可以得到原图大小,这个时候得到的结果就是叫做FCN-32s.
这个时候可以看出,FCN-32s结果明显非常平滑,不精细. 针对这个问题,作者采用了combining what and where的方法,具体来说,就是在FCN-32s的基础上进行fine tuning,把pool4层和conv7的2倍上采样结果相加之后进行一个16倍的上采样,得到的结果是FCN-16s.
之后在FCN-16s的基础上进行fine tuning,把pool3层和2倍上采样的pool4层和4倍上采样的conv7层加起来,进行一个8倍的上采样,得到的结果就是FCN-8s.
上图从左至右分别是原图,FCN-32s,FCN-16s,FCN-8s.可以看出结果明显是FCN-8s好于16s,好于32s的.
缺点
- 是得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。
- 是对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial
regularization)步骤,缺乏空间一致性。
1.2.2 U-Net
做语义分析很好使,性能很好,在很小的训练集上也能取得很好的效果U-Net介绍
U-Net和FCN非常的相似,U-Net比FCN稍晚提出来,但都发表在2015年,和FCN相比,U-Net的第一个特点是完全对称,也就是左边和右边是很类似的,而FCN的decoder相对简单,只用了一个deconvolution的操作,之后并没有跟上卷积结构。第二个区别就是skip connection,FCN用的是加操作(summation),U-Net用的是叠操作(concatenation)。这些都是细节,重点是它们的结构用了一个比较经典的思路,也就是编码和解码(encoder-decoder),早在2006年就被Hinton大神提出来发表在了nature上.
当时这个结构提出的主要作用并不是分割,而是压缩图像和去噪声。输入是一幅图,经过下采样的编码,得到一串比原先图像更小的特征,相当于压缩,然后再经过一个解码,理想状况就是能还原到原来的图像。这样的话我们存一幅图的时候就只需要存一个特征和一个解码器即可。这个想法我个人认为是很漂亮了。同理,这个思路也可以用在原图像去噪,做法就是在训练的阶段在原图人为的加上噪声,然后放到这个编码解码器中,目标是可以还原得到原图。
输入是一幅图,输出是目标的分割结果。继续简化就是,一幅图,编码,或者说降采样,然后解码,也就是升采样,然后输出一个分割结果。根据结果和真实分割的差异,反向传播来训练这个分割网络。我们可以说,U-Net里面最精彩的部分就是这三部分:
- 下采样
- 上采样
- skip connection
随着下采样的进行,感受野会一步步扩大,就相当于图片被压缩,单位面积能被感知的区域变大了。随着下采样的进行,图片的低频信息被更多的感知到。
上采样是一个恢复的过程,在上采样的同时,网络架构进行了skip connection,也就是图片中的这部分:
这部分有利于将下采样的各个阶段的信息在上采样过程中进行整合,就是在上采样的过程中,结合了各个层次的结构信息。
通俗的来讲就是在网络的高层(就是U型的上部分),获取了图形的细节信息(因为这时候图片很大,很多细节可以得以保留)。在网络的底层(U型的下部分),获取了图形的低频信息(感受野很大,便于获取大的轮廓信息)。然后用过skip connection将各个层次的信息保留。使得整个网络可以很好的记住图片的所有信息。
1.3 SegNet
SegNet 是一个encoder-decoder结构的卷积神经网络.
PSPNet
FPN
2.计算机视觉
在这里,先介绍几个概念,也是图像处理当中的最常见任务.
- 语义分割(semantic segmentation):简单来说就是给定一张图片,对图片中的每一个像素点进行分类
比如说下图,原始图片是一张街景图片,经过语义分割之后的图片就是一个包含若干种颜色的图片,其中每一种颜色都代表一类.语义分割中最长用的是CNN,FCN。尤其是FCN
- 目标检测(object detection):就是在一张图片中找到并用box标注出所有的目标.
- 目标识别(object recognition):就是检测和用box标注出所有的物体,并标注类别.
- 实例分割(instance segmentation):对图像中的每一个像素点进行分类,同种物体的不同实例也用不同的类标进行标注.
下图展示了语义分割和实例分割之间的区别:中间是实例分割,右图是语义分割.
2.1语义分割工具:vedaseg
库:opencv,dlib,pillow
2.2机器视觉特征提取算法介绍:HOG、SIFT、SURF、ORB、LBP、HAAR总结
我觉得以上特征中主要分为两类:点和面
- 点:SIFT、SURF、ORB提取的是关键点的信息,可以用于表示某些图像的细节(或者指纹)。这几个特征可用于图像匹配和3维建模等算法。
- 面:HOG、LBP、HAAR提取的是面的信息,可以表示一块区域是什么样的,所以这几个特征可以用于人脸、人体等物体识别。其中HAAR特征不是很好可视化,另外两种都可以比较容易的可视化出来。
1.1.1 AlexNet
1.1.2 VGG-16
- 输入224x224x3的图片,经过64个卷积核的两次卷积后,采用一次pooling。经过第一次卷积后,c1有(3x3x3)个可训练参数
- 之后又经过两次128的卷积核卷积之后,采用一次pooling
- 再经过三次256的卷积核的卷积之后,采用pooling
- 重复两次三个512的卷积核卷积之后再pooling。
- 三次Fc,可以接一个Softmax
3.语音处理
库:scipy,librosa
4.文字
直接用Python 或Cython 基础数据加载模块,或者用NLTK 和SpaCy