使用 TensorFlow 进行深度学习:FCN 论文学习笔记
这篇文章陆陆续续看了快两周,其中也遇到了自己很多的知识的漏洞,踩了很多坑,这里希望能够和大家说一说,也希望大家可以分享一下自己的看法.
1:FCN基本思路
自从CNN成功之后,很多人都在尝试使用CNN进行图像分割,个人认为CNN最厉害的地方是他的多层结构可以自动提取学习的特征,并且将其学习,并且将提取的这些特征进行分类,但是我们当用CNN进行图像分割的时候,CNN的这项优势反而变成了劣势,因为在特征提取时丢失了一些细节,反倒没有办法指出某些像素点属于那些物体,而FCN跟传统的CNN进行像素分割不同,FCN是试图从抽象的这些抽象的特征中恢复每个像素的类别,也就是从物体的分类到像素点级别的分类,这可以说是一个很大的突破.
2:end-to-end模型怎么理解?
在论文阅读中,我们多次发现读者强调FCN是end-to-end的,这一个部分我觉得用NLP的流程思路去想想还是挺有意思的.在我们之前的NLP对话系统中,往往是由很多个模块组成的,每一个模块单独执行一块任务,这些模块合在一起就构成了整个系统,这样有些面向对象的思想,但是这样每一个模块质量的好坏将直接影响到下一个步骤甚至是整个任务,这是非端到端的.
现在到了深度学习了,深度学习的模型直接在训练过程中从输入数据开始,到达输出端就会有一个输出结果,这样和真实的结果之间就会有一个误差值,这个误差会经过反向传播之后不断进行迭代,每层进行微调,直到我们的模型误差达到一个合理的范围.
最后通俗的说,端到端模型就是输入原始数据,经过模型,获得你想要的结果.
3:FCN基本结构
FCN将传统CNN中的全连接层转化成一个个的卷积层
在上图中,我们可以看到FCN将传统的CNN中的三层全连接层全部修改为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,1,1)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,所以叫做FCN.
但是我们熟悉卷积原理我们应该知道,每一次卷积都是对图像的一次缩小,每一次缩小带来的是分辨率越低,图像越模糊,而在第一部分我们知道FCN是通过像素点进行图像分割,那FCN是怎么解决的这一个问题?
答案是上采样,比如我们在3次卷积后,图像分别缩小了2 4 8倍,因此在最后的输出层,我们需要进行8倍的上采样,从而得到原来的图像大小.而上采样本身就是一个反卷积实现的,论文中的解释:卷积的forward、backward操作对调,也就是转置卷积.
上图是这个卷积和反卷积上采样的过程:所说的是对第5层的输出(32倍放大)反卷积到原图大小,得到的结果还是不够精确,一些细节无法恢复。于是Jonathan将第4层的输出和第3层的输出也依次反卷积,分别需要16倍和8倍上采样,结果就精细一些了。
有对反卷积不理解的同学可以去看看知乎的提问,如果通俗易懂的解释反卷积?
从论文中得到的结果来看,从32倍,16倍,8倍到最终结果,结果越来越精细.
4:优点和不足
优点:
1:模型的拓展性简单
主要结构与很多模型都类似,基本上现在的采用CNN的模型都可以通过将全连接层转换为卷积层来转化为全卷机模型,这样就可以输出空间的映射.
2:速度快速,高效
因为避免了由于使用像素块而带来的重复存储和计算卷积的问题。
缺点:
1:结果不够精细
从上图中来看,进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感.
2:没有考虑像素之间的关系,缺乏空间一致性.
5:展望
FCN虽然有一些缺点,但是我们更应该关注他的优点,关注他启发性的思路,通过像素与像素之间的关系来去将图像进行分割,比如有一些学者采用了FCN+CRF的结合,这都是一些大胆的创新,值得我们学习.
引用资料:
1:FCN学习笔记 https://zhuanlan.zhihu.com/p/34453588
2:什么是 end-to-end 神经网络? https://www.zhihu.com/question/51435499
推荐阅读
-
人工智能:162 - 如何使用 Python 进行图像识别和处理 深度学习和卷积神经网络应用
-
深度学习] 深度学习 md 笔记总结第一篇:TensorFlow 简介、学习目标 [含代码文档]。
-
使用 TensorFlow 进行深度学习:FCN 论文翻译
-
使用 TensorFlow 进行深度学习:FCN 论文学习笔记
-
深度学习论文笔记(七)--解卷积网络-2016 年(Learning Deconvolution Network for Semantic Segmentation )(用于语义分割的学习解卷积网络
-
从视频中无监督学习深度和自我运动》论文笔记
-
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。 基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。 特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。 旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。 三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。 特征点定位 特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图 def get_face_info(image). img_copy = image.copy image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释。 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) box_info, facial = None, None if results.detections: for detection in results. for detection in results.detections: mp_drawing.Drawing.detection = 无 mp_drawing.draw_detection(image, detection) 面部 = detection.location_data.relative_keypoints 返回面部 在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。 使用 dlib 使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下: 确保已安装 Dlib 库,可使用以下命令: pip install dlib 导入必要的库: 加载 Dlib 的人脸检测器和关键点检测器模型: 读取图像并将其灰度化: 使用人脸检测器检测图像中的人脸: 对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点: 显示绘制了关键点的图像: 以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。
-
资源|使用 Python 和 NumPy 进行深度学习的线性代数基础知识
-
使用深度学习自动识别限速标志:Keras 和 TensorFlow 教程
-
学习笔记:R-CNN 系列论文阅读,使用 Faster-RCNN 进行交通标志检测