2019-周报18

本次周报主要整理了图片视频超分和去噪的常用数据集和SHVC中去噪的试验情况,周五讨论到的运动模糊数据集制作是使用高帧率的视频通过算法合成的运动模糊图像。

1.数据集整理

本部分针对常用超分和去噪的数据集进行了整理,超分数据集又分为图片超分数据集和视频超分数据集。

超分最常用的训练集为NTIRE2017年发布的DIV2K[2]和NTIRE2019最新发布的REDS[3]数据集,以及Vimeo-90K[9]。由于超分数据集容易制作,所以也有很多文章采用自己制作的数据集进行训练。为了统一进行效果对比,了解常用的测试集很有必要。图片超分中,常用的数据集有Set5[4], Set14[1],B100[5],Urban100[6],Manga109[7]。视频超分中,最常用的是Vid4[8]测试集。

去噪数据集中最常用的是REDS[3]和DBNSet[10]。他们的运动模糊均是通过高帧率的相邻帧使用算法合成得到。

1.1常用数据集介绍

对目前最常用的超分数据集进行介绍

#####1.1.1 DIV2K

DIV2K ( DIVerse 2K ) 是NTIRE在2017年发布的高清(2k分辨率)图片修复的数据集,其中包含800张训练图片,100张验证图片,100张测试图片,常用于图片的超分和去噪。

项目地址:https://data.vision.ee.ethz.ch/cvl/DIV2K/

1.1.2 REDS

REDS (REalistic and Diverse Scenes dataset) 是NTIRE在2019年发布的高质量(720p)视频超分和去模糊数据集。它包含来240个训练序列,30个验证序列,30个测试序列,总共270000张图片。通过四种视频质量降级方法得到四个子数据集如下:

  • Bicubic 下采样
  • 带运动模糊的Bicubic 下采用
  • 运动模糊
  • 带压缩的运动模糊

其中运动模糊是通过多帧连续图像用算法合成的运动模糊图像,使用不同帧数合成不同程度的运动模糊。

week18-REDS-blur

项目地址:http://www.vision.ee.ethz.ch/ntire19/

下载地址:

  1. https://competitions.codalab.org/competitions/21482#participate-get-data
  2. https://competitions.codalab.org/competitions/21483#participate-get-data
  3. https://competitions.codalab.org/competitions/21475#participate-get-data
  4. https://competitions.codalab.org/competitions/21476#participate-get-data
1.1.3 Vimeo90K

Vimeo90K是一个大规模高质量的视频数据集,包含了从vimeo.com下载的89800个视频片段,每个片段包含7帧,每帧size为448x256x3。涵盖了大量不同的场景和动作,转为 视频去噪,视频去块,视频超分,视频插帧 任务设计。

项目地址:http://toflow.csail.mit.edu/

下载地址:https://github.com/anchen1011/toflow

1.1.4 Vid4

Vid4是视频超分领域广泛使用的测试集,视频超分文章中效果展示的图片均来自于此。其中包含 日历,城市,树叶,行人四组视频片段。

GT spatial size (720 x 576 x 3), (704 x 576 x 3), (720 x 480 x 3), (720 x 480 x 3)
frame of each clip 41, 34, 49, 47
testing samples 171

下载地址:https://drive.google.com/drive/folders/10-gUO6zBeOpWEamrWKCtSkkUFukB9W5m

1.1.5 DBNSet

DBNSet是通过手持摄像头捕获得到的数据集,主要用于去运动模糊。其模糊帧通过平均多张高速率(240fps)的帧得到。其中图片大小为1280x720x3,共包含71个视频片段,其中训练片段61个,测试片段10个,总共6708帧图像。

项目地址:http://www.cs.ubc.ca/labs/imager/tr/2017/DeepVideoDeblurring/

下载链接:http://www.cs.ubc.ca/labs/imager/tr/2017/DeepVideoDeblurring/#dataset

1.1.6 其它测试集

开始提到的Set5[4], Set14[1],B100[5],Urban100[6],Manga109[7]等常用于图片超分的测试。图片超分中展示的效果图均选自这些测试集。

2 SHVC

之前通过简单的10层卷积加全局残差实现了一个简单的去噪网络,在此基础上将原来的10层卷积替换成了16层残差块重新训练更大的网络进行去噪。训练集使用原来blind的数据集,即QP19-QP37,size为42x42的图片(训练集和测试集均为42x42)。

原来的简单网络,训练集和测试集的提升在均在0.6db左右,BasketballDrive码流测试结果提升0.1–0.2db(具体值看下表),换用16层残差替换之后的网络训练集和测试集的提升均在0.8db左右,但BasketballDrive码流测试结果反而下降。

上面结果显示,训练集和测试集提升异常地高,而码流测试结果退化严重。针对以上结果,我和宋师兄讨论之后分析原因有以下两点

  1. 训练图片size太小,仅有42x42,所以训练集和测试集感受野为整张图大小,而实际测试大图时则不同。
  2. 训练集特殊的制作方式 (先裁剪后编码) 不适合去噪任务,实际使用时为先编码后分割进行测试。

最后采用之前的简单网络(测试码流有0.1–0.2db的提升)进行了码流测试,测试结果如下:

week18-SNR-RESULT

结果显示,在去噪效果不好的情况下,码流下降情况依然可观,接下来便可以重新制作数据集进行SNR相关的工作。

参考资料

  1. Zeyde, R., Elad, M., Protter, M.: On single image scale-up using sparse-
    representations. In: Curves and Surfaces, pp. 711{730. Springer (2012)
  2. R. Timofte, E. Agustsson, L. Van Gool, M.-H. Yang,
    L. Zhang, et al. Ntire 2017 challenge on single image superresolution:
    Methods and results. In CVPR 2017 Workshops.
  3. Seungjun Nah, Sungyong Baik, Seokil Hong, Gyeongsik
    Moon, Sanghyun Son, Radu Timofte, and Kyoung Mu
    Lee. Ntire 2019 challenges on video deblurring and superresolution:
    Dataset and study. In CVPRW, June 2019.
  4. Bevilacqua, M., Roumy, A., Guillemot, C., Alberi-Morel, M.L.: Low-complexity
    single-image super-resolution based on nonnegative neighbor embedding. In:
    BMVC. (2012)
  5. Martin, D., Fowlkes, C., Tal, D., Malik, J.: A database of human segmented natural
    images and its application to evaluating segmentation algorithms and measuring
    ecological statistics. In: ICCV. (2001)
  6. Huang, J.B., Singh, A., Ahuja, N.: Single image super-resolution from transformed
    self-exemplars. In: CVPR. (2015)
  7. Matsui, Y., Ito, K., Aramaki, Y., Fujimoto, A., Ogawa, T., Yamasaki, T., Aizawa,
    K.: Sketch-based manga retrieval using manga109 dataset. Multimedia Tools and
    Applications (2017)
  8. C. Liu and D. Sun. A bayesian approach to adaptive video
    super resolution. In CVPR, 2011.
  9. Tianfan Xue, Baian Chen, Jiajun Wu, Donglai Wei, and
    William T Freeman. Video enhancement with task-oriented
    flow. arXiv preprint arXiv:1711.09078, 2017.
  10. Su, Shuochen, et al. “Deep video deblurring for hand-held cameras.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2017.
  11. https://xinntao.github.io/open-videorestoration/rst_src/datasets_deblur.html
Share Comments

2019-周报16

本周阅读VR和全景图的相关论文[1] [2] 初步了解了此领域的相关研究工作,重点阅读了全景图编解码的相关标准文件[3] [4] [5]。了解了JEVT关于全景图编码的测试工具包360Lib [6] [7] , 以及360o 视频到平面视频的投影算法ERP[8],阅读了师兄之前关于VR实时编码的论文[9] [10],对360o 视频编码有了初步的了解。针对之前SVC的试验,使用新的网络重新训练并得出了结果。除此之外最近在补专业相关的数学知识。

1. 360o 视频编码

通过在谷歌学术上搜索关键词 Virtual Realitypanorama 阅读引用量最多的文献,大致了解了VR和全景图领域的主要研究内容。Virtual Reality 的搜索结果大多是概念性的东西,以及各种相关的专利,没有太大的参考价值。panorama 大多研究内容是围绕全景图片的拼接,立体图片拼接相关的研究。

重点调查了有关VR编码方向的相关标准,主要参考了JVET common test conditions and evaluation procedures for 360° videoSubjective testing method for 360° Video projection formats using HEVC 两个文件。

1.1 编码流程

week16-VideoTestingProcedure

编码流程如上图所示,VR投影方式采用等距柱状投影(Equi-Rectangular Projection, ERP)。和传统编解码相比仅仅多了投影的步骤,将立体图投影为平面图进行编解码。JVET官方提供了 360Lib 工具包来实现投影操作,并且支持与 H265/H266等测试工具结合使用。

2. SVC新增试验结果

week16-QPcompare

SVC新增试验结果如上图所示,最短收敛最快的曲线为论文中使用网络的结果(因为加载了预训练参数,所以开始收敛很快,且总训练Epoch最少)。另外两条曲线,最蓝色的曲线为超分部分使用WDSR替代之后的结果,橙色最长的曲线为去噪超分分别使用DnCNN和WDSR替代之后的结果。观察曲线可以基本可以得到以下两个结果。

  1. 超分部分使用更强的WDSR替代之后,psnr相比之前提高0.3-0.5db
  2. 去噪部分使用DnCNN替代之后没有明显差别

参考文献

[1]. Defining virtual reality : Dimensions determining telepresence

[2]. Recognising panoramas

[3]. Common Test Conditions 360 (JVET-L1012)

[4]. N16892, Subjective testing method for 360° Video projection formats using HEVC

[5]. N16702 Common Test Conditions and Evaluation Procedures for 360 Video Coding

[6]. 360Lib

[7]. JVET专家组下360Lib全景视频投影格式测试平台

[8]. 360Lib中的坐标系

[9]. Scalable video coding based on user’s view for real-time virtual reality applications

[10]. Scalable Video Coding Based on the User’s View for Real-Time Virtual Reality Applications

Share Comments

2019-周报15

这周对训练好的网络的输出进行测试,在测试的过程中不断发现了新的问题,在对问题进行分析,补充试验,观察结果之后成功找到了问题的原因。

以下是整个过程中发现的问题,解决思路,以及试验结果,结果分析。

问题一:

问题描述:网络输出替换后EL码流升高

本周测试最终编码结果时发现使用网络输出替换之后,EL层的码流不降反升(几乎升高了两倍)。进一步测试发现网络输出的图像不如直接使用SHM插值器放大效果好。训练网络的时候将网络的输出与bicubic的放大结果比较,确实获得了

问题分析:数据集的制作方式

按照常识来说用网络替换SHM插值器之后效果不可能不升反降。分析SHM测试中的数据特征知道,使用SHM提供的下采用工具 TAppDownConvert.exe 下采样得到的小图经SHM上采用效果好于经过 bicubic 上采样效果(记此特性为特性A) ,所以我们的训练集同样应该满足这样的特性。但经过测试发现训练的数据并不满足此特性,说明训练小图(41x41)到大图(82x82)之间的映射关系与最终测试basketball数据的小图(540x960) 到大图(1080x1960)之间的映射关系不同。

训练使用数据的制作方式及测试结果如下图所示,可知下采样之后的的图片满足特性A,但在裁剪成小图的过程中会使其不满足特性A。

图1.数据制作方式1

解决方式:重做数据集

分析可知上面数据制作过程中的切图过程毁坏了图片的特性,于是想到在裁剪得Sr_label 后再进行下采样与重建,修改之后的数据制作过程如下图

图1.数据制作方式2

由于新的数据制作方式重建部分是对 Lr_label 进行编解码,而 41x41 尺寸的图片不能编码,会有以下错误提示,所以将输入尺寸改为了 42x42 与 84x84。

1
2
3
4
5
6
7
8
yuv  [info]: 41x41 fps 30000/1000 i420p8 frames 0 - 0 of 1
raw [info]: output file: t25.h265
x265 [info]: HEVC encoder version 2.6+14-f09f3b4a2115
x265 [info]: build info [Windows][MSVC 1900][64 bit][noasm] 8bit
x265 [info]: using cpu capabilities: none!
x265 [error]: Picture width must be an integer multiple of the specified chroma subsampling
x265 [error]: Picture height must be an integer multiple of the specified chroma subsampling
x265 [error]: failed to open encoder

试验结果:

使用重新制作的数据集进行训练,训练和测试的结果都超过了SHM放大的效果。如下图所示,红框圈中的三个psnr分别是网络放大结果,bicubic放大结果,SHM插值器放大结果。可以看出SHM插值器效果好于bicubic,网络效果好于SHM插值器。测试集的图片尺寸和训练集相同,小图42x42,大图 84x84 。

图三.测试结果

本以为试验到这儿就顺利结束了,但是在测试编码用的BasketballDrive_960x540_500.yuv视频时结果却很糟糕,结果如下图 (红框圈中的三个psnr分别是网络放大结果,bicubic放大结果,SHM插值器放大结果)。

图4.篮球视频测试结果

以上试验结果表明,网络对42x42放大到84x84效果很好,但是不能泛化到大图。使用网络将 960x540图片 放大到 1920x1080 时效果极差。

问题二:

问题描述:网络不能泛化到大图

问题一试验结果显示使用 42x42 与 84x84的数据训练与测试结果都很好,但是放大 960x540的图片到1920x1080时效果极差。

问题分析1:感受野导致

小图到大图效果差别显著,与师兄讨论之后可能是由于感受野导致的问题,所以想着改变网络感受野观察试验结果。

解决方案 1.1:减小网络层数

通过减小网络层数缩小感受野,缩小每个像素点的参考范围。由于这个方案试验起来最简单,所以首先试验了此方案。

试验结果 1.1

减小网络层数之后,结果同问题一几乎相同,小图的训练集与测试集效果都很好,但是测试大图时效果极差。

解决方案 1.2 :调大训练集图片尺寸

试验1.1失败之后,继续从训练集部分寻找原因,重新制作训练集,将图片尺寸从之前的 42x4284x84 扩大到了96x96192x192

试验结果 1.2

结果与上面相同,大图结果极差

问题分析2

经过上面一系列试验失败之后开始重新思考整个问题。根据已有知识,既然是超分网络就不可能存在小图与大图之间有如此显著的差别。

之前的解决方案都是针对网络后半部分的超分网络进行改进,有没有可能是网络前半部分 (去噪部分) 导致的问题?于是将中间部分的输出保存下来,观察处理之后的效果,结果如下 (左边为原图,右边为去噪部分输出 )

图5.去噪结果对比

大图去噪之后图片发生了肉眼明显可见的变化 (训练与测试集的小图均没有这种问题,去噪之后psnr均提高0.2–0.6 ) 。

解决方案 2.1

问题分析二部分表明,大图泛化差的问题主要是前面去噪部分导致。首先想到的解决方法就是除去去噪部分,做一个存粹的超分网络。

试验结果 2.1

在原网络中去除中间标签,训练网络。发现在没有中间标签的情况下网络的参数朝着完全不同的方向演变,最后训练结果,原去噪部分的输出与小图毫无关系。

使用原网络情况下去除中间标签,网络的收敛速度变慢,由于急于看最终结果,所以改了一下EDSR直接做超分训练。最终小图大图结果都正常,且相比SHM结果有 2db 左右的增益 (qp21 – qp25 )。下图是basketball视频的测试结果 (红框圈中的三个psnr分别是网络放大结果,bicubic放大结果,SHM插值器放大结果)。

图6.edsr测试结果

总结

照理来说,去噪网络也是能够泛化到大图的,可能是在放大与超分混合之后导致这部分出现了问题,这部分试验比简单,单独做个去噪网络查看泛化到大图的结果就行了。

目前整个试验的结果都没有问题,剩下的就是补全剩下的试验。

Share Comments

2019-周报14

我们论文中使用的网络仅对YUV图像的Y通道进行放大,所以测试性能的时候需要得到SHM中原插值器放大后的重构参考图像,将其中Y通道的值替换为我们网络的输出,UV通道不变,使用替换后的YUV数据作为参考层编码EL层,并进行对比。SHM工程中并没有将此插值器编译为可执行文件给我们使用,所以需要学习SHM工程,更改其中插值器部分源码进行试验。好在有蒋昊师兄之前的工作参考,节省了很多时间。

本周完成了测试数据的准备,清楚了测试的整个流程,剩下的工作预计能在接下来的一周完成。

SHM源码学习

测试使用的SHM版本为 12.0,开发环境为Visual Studio 2012。SHM是在HM的基础上进行扩展得到,整个工程包含十个项目,我们主要使用其中的TAppEncoder进行试验,所以重点阅读了此部分代码。

打开TAppEncoder项目的encmain.cpp文件,首先能够看到的是三个重要的类,TAppEncTop, TAppEncCfg, TAppEncLayerCfg。 其关系如UML图所示,TAppEncTop为最顶层类,所有编码功能均能由此类完成,其继承了TAppEncCfg类,该类用于解析输入的配置文件。TAppEncLayerCfg为以上两类的友元类,TAppEncCfg将配置文件的解析结果存入此类

图1.UML-Enc

在参数解析完毕后调用TAppEncTop中的encode()函数开始编码,这也是整个工程的核心。进入该编码函数,在进行了一系列初始化之后进入了 compressGOP() 函数,随后再是compressSlice(),对每一个LCU进行编码,每编完一个LCU进行一次更新,LCU的大小根据图片的信息的复杂度不同而不同。

而我们测试需要更改的是TComPrediction::upsampleBasicPic()部分,此部分对BL层进行放大作为增强层的预测信息。

数据处理

数据处理部分主要包括以下几个部分

  • 基础层重构数据(BL reconstructed image)获取
  • 基础层重构数据Y通道提取输入超分网络放大
  • 使用SHM插值器得到放大后的YUV数据
  • 将通过网络放大的Y通道数据与通过自带插值器放大的UV数据结合
  • 将组合之后的数据作为EL层参考数据,编码EL层

目前完成了数据处理的前三部分

Share Comments

2019-周报13

本周试验结果显示,网络去噪部分加入BN层之后,以5个QP为一组进行训练,去噪部分psnr0.2–0.3db的提升,超分部分psnr0.8–1.2db的提升(与bicubic放大对比)。目前已经完成了QP21–QP25, QP26–QP30两组数据的训练,剩下的两组正在等待训练。分析试验结果,仅超分部分的增益而言,与目前的经典超分网络相比显得不足(优酷超分比赛中使用EDSR进行四倍放大有4db左右的提升),我们使用的网络结构相对简单,应该还有提升空间。

由于网络训练集的改变,论文中的数据都需要重新测试,现在正在熟悉SHM通过参考BL层对EL层编码的过程。如果网络结构不更改的话剩下的就是大量的测试工作。以下是试验的具体结果

SHVC

下图为使用QP26–QP30训练集进行训练的截图,训练到这个时候增益便已经稳定,通过调低学习率增益也没有明显的增长。可以看出,去噪部分的增益稳定在 0.2–0.3db,超分部分增益稳定在0.8–1.2db。泛化效果很好,测试集结果和训练集几乎相同。

图1.训练前后对比

YOUKU

直接使用EDSR的结构进行四倍放大,最后psnr稳定在38附近,使用bicubic放大psnr大概在32附近。

图2.优酷训练结果

总结

现在论文上的主要任务是使用我们的网络代替SHM中的Interpolator进行对比,补全对比部分的数据

Share Comments

2019-周报12

本周针对 SHVC 论文中QP问题进行了试验,实验中将QP分为四组,分别为21-25,26-30,31-35,36-40。以下是相关细节和目前为止的训练结果。除此之外和吴畅一块儿参加了天池优酷的超分比赛。

1 数据集介绍

根据网络结构,我们的每组数据由一个输入和两个标签组成,分别记为 input_lr label_lr label_sr 。其中 label_sr为高分辨原图,大小为82x82。 label_lr 为高分辨图通过bicubic下采样得到的低分辨图,大小为41x41。 input_lr 为低分辨图通过不同qp编码解码之后得到的噪声图。每五个QP为一组制作一个数据集,每个取96000张图,一组共480000张图。图片均通过BSDS500数据集裁剪增强得到。

2 网络结构

训练使用的是师兄之前设计的网络结构,由去噪和超分两部分组成。去噪部分由9层卷积层组成,深度为64,卷积核为3x3,激活函数均使用ReLU。超分部分由14层卷积层组成,深度为64,卷积核为3x3,激活函数均使用ReLU。去噪与超分均使用全局残差。

3 结果分析

实验结果表明将数据集由之前的单个QP改为现在五个QP混合的情况下,依然使用原网络并不能得到很好的效果。

3.1 混合训练

首先是将超分部分与去噪部分混合训练,各自权重均为0.5。

3.1.1 去噪部分

由于使用了全局残差,去噪部分在一个epoch不到便达到饱和,psnr不再上涨,psnr值变化情况如下

图1.train_QP21_psnr_lr

但是同原始输入图片数据对比易知,去噪部分并没有发挥出相应的作用。如下图红色框内所示,括号外面为去噪网络输出与标签图片之间的psnr值,括号内部为输入的噪声图片与标签之间的psnr值(下图使用数据集QP范围为21-25,所以带噪声图片psnr就已经很高)。结果表明去噪之后的图片psnr值并没有得到提升。

图2.train_QP21_psnr_lr_compare

3.1.2 超分部分

超分部分一直训练不上去,下图为QP 36-40之间时超分的psnr变化曲线。在现有的结构下改变网络的深度依然不能解决此问题。

图3.train_QP36_psnr_sr

3.2 单独训练

单独训练即超分部分loss的反向传播不影响到去噪部分的网络参数,结果与混合训练差别不大

3.2.1 去噪部分

单独训练时去噪部分收敛速度快于混合训练,收敛结果无明显差别

3.2.2 超分部分

超分部分与混合训练无明显差别

4 总结

训练过程中对网络进行修改激活函数,修改网络参数大小,修改学习率,修改超分网络与去噪网络的权重等操作,结果并没有得到明显的改善。

暂时计划尝试一下其他网络结构,将去噪与超分部分单独训练,两部分均有不错效果的情况下再进行组合实验。

Share Comments

2019-周报11

本周学习了VAE-GAN, B iGAN等理论知识,针对之前说的利用GAN做unpaired的网络,阅读了论文Unsupervised Image Super-Resolution using Cycle-in-Cycle Generative Adversarial Networks 并进行了实现,由于实验室显卡使用紧张,训练了10个epoch,得到了不错的效果。同时,在FlyAI上报名了比赛,在事情较少的时候开始做做比赛,检验水平。

1 CinCGAN

CinCGAN将去噪网络与超分网络结合,去噪部分使用cycleGAN的结构,将去噪后的结果输入训练之后的EDSR 超分网络得到超分图像,再通过一个生成网络生成低分辨带噪声图像与最初输入图像之间计算损失。整个网络结构相当于一个大的cycleGAN中再加入一个cycleGAN,所以起名为CinCGAN(cycle in cycle GAN),网络共有三个Generator,两个Discriminator,一个EDSR,整体网络结构如下。

图1.CinCGAN

网络使用NTIRE2018 Super-Resolution Challenge 比赛提供的高清数据集DIV2K进行训练,其中包含800张训练图片和100张测试图片。其中低清图片直接使用 bicubic 下采用得到,噪声图片在下采样基础上加噪得到。并通过旋转,裁剪来扩张数据。

1.1 网络结构

上面提到网络共有三个Generator,两个Discriminator,一个EDSR。其中生成器与判别器的网络结构各自相同,如下图所示。

图2.生成器&判别器结构

1.2 训练过程

网络的训练主要分为两个部分单独训练,也即是网络中的两个cycleGAN。首先训练网络中的LR -> clean LR 去噪网络,在去噪网络训练完成之后再训练整个大的超分网络。

  • STEP1 (内部去噪网络):
    1. 从bicubic下采样训练集中取样m个(一个batch)样本作为real样本
    2. 从加噪训练集中取样m个样本,输入G1得到输出作为fake样本
    3. 使用real样本,fake样本更新判别器D1
    4. G1网络输出张量输入判别器D1计算log损失函数 $LogLoss$
    5. G1网络输入加噪图片,计算去噪之后的 $TVLoss$
    6. G1网络输入bicubic下采样图片,计算输入前后的$L1loss$
    7. 计算G2网络的输出与G1网络输入之间的 $MSEloss$
    8. 总损失$ Loss = LogLoss + 0.5TVLoss + 5 L1loss + 10*MSEloss$
    9. 更新生成器 G1 G2
  • STEP2 (超分网络):
    1. STEP1更新
    2. 从训练集中采样高清图m个作为real样本
    3. EDSR输出作为fake样本
    4. 更新D2
    5. EDSR网络输出张量输入判别器D2计算log损失函数 $LogLoss$
    6. 对EDSR网络输出张量计算 $TVLoss$
    7. 计算EDSR网络的输出与高清图片之间的 $MSELoss1 $
    8. 计算G3网络输出与G1网络输入之间的 $MSELoss2 $
    9. 总损失 $ Loss = LogLoss + 2TVLoss + 5 L1loss + 10*MSEloss$
    10. 更新生成器 G1 G2 G3

1.3 参考资料

2 图像去锯齿

研究生阶段多数时间在学习深度学习的图像处理,传统的图像处理很少用过,看到这个小测试就很有兴趣。查阅书籍之后决定使用简单方法进行实现,实现步骤大概为以下三个步骤

  • 有锯齿区域提取 (ROI)
  • 对锯齿区域模糊处理
  • 对锯齿区域锐化
1. 锯齿区域提取

图2.区域提取

如上图所示,锯齿区域提取主要包括灰度提取,边缘提取,边缘筛选,膨胀扩大边缘区域四个部分。在测试过sobel 边缘提取,prewitt 边缘提取,Laplasian of Gaussian 边缘提取,canny 边缘提取之后,根据结果选择了canny 算子进行边缘提取。

2.滤波锐化

对上面提取的区域进行掩膜滤波,使用高斯模糊再进行sobel 锐化得到处理前后的对比图如下

图3.结果对比

附处理代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
I_ori = imread('4.png');     % 读取图片
I = I_ori(:,:,2);
imshow(I,[]);
%I = imbinarize(I);

cannyBW=edge(I,'canny'); % 边缘提取
figure;
imshow(cannyBW);
title('canny Edge');

% Test
p = regionprops(cannyBW, 'Perimeter', 'PixelIdxList');
%[test, longest] = max([p.Perimeter]);
[~,Index] = sort([p.Perimeter],'descend');
%[~, longest] = max([p.Perimeter]);
BW2 = zeros(size(cannyBW));
SortLongestG = SortLongest(1:20);
for i = 1:10
%j = int8(i);
j = Index(i);
PixelIdxList = p(j).PixelIdxList;
BW2(PixelIdxList) = 1;
end


figure;
imshow(BW2)

% logBW_dilate = imdilate(logBW, [1 1 1;1 1 1;1 1 1]); % 提取 ROI
logBW_dilate = imdilate(BW2, [0 0 1 0 0;0 1 1 1 0;1 1 1 1 1;0 1 1 1 0;0 0 1 0 0]);
% logBW_dilate = imdilate(logBW, [1 1 1 1 1;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1]);
% logBW_dilate = imdilate(logBW, [1 1 1 1 1;1 1 1 1 1;1 1 1 1 1]);
% logBW_dilate = imdilate(logBW, [1 1 1 1;1 1 1 1;1 1 1 1]);
% logBW_dilate = imdilate(logBW, [1 1;1 1;1 1;1 1;1 1;1 1]);
figure;
imshow(logBW_dilate);
title('dilate of Laplasian of canny Edge');

G = fspecial('gaussian', [5 5], 2); % ROI 区域进行高斯模糊
blurI = I_ori;
blurI(:,:,1) = roifilt2(G,I_ori(:,:,1),logBW_dilate);
blurI(:,:,2) = roifilt2(G,I_ori(:,:,2),logBW_dilate);
blurI(:,:,3) = roifilt2(G,I_ori(:,:,3),logBW_dilate);
figure;
imshow(blurI);
title('gaussian blur on roi');

imwrite(blurI, '5_out.png');

S = fspecial('sobel'); % ROI 区域进行 sobel 锐化
sobelI = blurI;
sobelI(:,:,1) = roifilt2(S, blurI(:,:,1), logBW_dilate);
sobelI(:,:,2) = roifilt2(S, blurI(:,:,2), logBW_dilate);
sobelI(:,:,3) = roifilt2(S, blurI(:,:,3), logBW_dilate);
sobelI = uint8(sobelI) + uint8(blurI);
title('sobel sharpen on roi of blurI');
Share Comments

2019-周报10

本周继续学习了CycleGAN,重点学习并总结了深度学习中常用的各种卷积之间的区别与联系。调试修复了视频编解码中的部分bug,完成了双路同步编解码的功能。

1 视频编解码项目现状说明

测试发现,现在编码解码部分虽然都使用GPU完成,但是中间拼接部分却是在CPU中进行的,整个过程的内存使用情况如下

图1.CodecMemoryV1.png

所以拼接部分目前实际是在内存中完成,针对此部分的改进方法目前有两种方案

  • ffmpeg + CUDA
  • ffmpeg + OpenCV

使用opencv只能针对拼接部分进行改进,即将内存中的帧转移到显存使用GPU拼接,中间有显存->内存->显存 的转移过程。

使用ffmpeg + CUDA或许能够完成整个解码,拼接,编码过程均在显卡中完成,目前还未实践。

2 深度学习常用卷积总结

深度学习在图像领域的操作主要依赖卷积操作,根据不同场景不同目的产生了各种不同的卷积方式。常用的二维卷积,三维卷积,转置卷积,增大感受野的扩张卷积,减小参数的可分卷积,模型并行的分组卷积,以及用于超分辨的亚像素卷积等等,选择不同的卷积对网络的性能,参数都会有很大的影响。

2.1 2DConv, 3DConv

使用二维卷积时,卷积核的深度等于被卷积图像的深度,所以卷积时在深度方向不移动,最后卷积的结果为二维特征。而三维卷积时,卷积核的深度小于被卷积图像的深度,所以卷积时除了横向纵向移动之外还会在深度上移动,所以被称为三维卷积,卷积结果为三维特征,如下图所示

2.2 转置卷积

转置卷积可以当作上面卷积的逆操作,在卷积操作之前通过在周围补零的方式达到卷积之后的size大于卷积之前的size,通常用于上采样。

当卷积核与其转置卷积相乘结果为单位矩阵时,卷积与转置卷积是完全互逆的,但不满足此条件时,卷积与转置卷积不是可逆的。

2.3 扩张卷积 (dilated convolutions)

扩张卷积的主要优点是在不增加模型参数的情况下扩大感受野,参数 I(扩张率) 表示希望将核加宽的程度,通常是在核元素之间插入 I-1 个空格实现。当 I=0 时,和普通卷积一样。

2.4 可分卷积

深度学习中使用的可分卷积通常指深度可分卷积,谷歌提出的MobileNet中便是使用的这种卷积。深度可分卷积主要是在卷积的深度上进行了创新,通过单层卷积与 1x1 卷积将最开始的卷积操作拆成两步进行。

先使用深度为 1 的卷积核进行卷积操作,于是卷积的输入输出拥有相同的深度,再使用 1x1 卷积扩大深度。通过这样的操作减小训练的参数。具体操作方法见参考资料。

2.5 分组卷积

分组卷积即将卷积操作分组进行,如将 255x255x16 数据分为两组 255x255x8 的数据各自进行卷积操作从而实现模型并行操作。模型并行不仅拥有数据并行的加速功能,因为能够将模型部署在不同GPU中,还能节省显存,从而能够增大训练的batch。分组卷积还能大大减小模型参数,分为 n 组,参数便能减小为原来的 $1/n$

初此之外,分组卷积甚至能改进模型,上面提到分组卷积能够减小模型参数,因此具有稀疏过滤器的功能,效果类似于dropout。

2.6 亚像素卷积

在做超分网络时,使用转置卷积上采样会造成棋盘效应,而亚像素卷积能很好地克服棋盘效应。其实现也很简单,就是将很深的低分辨率特征组装成高分辨图像,如下图所示。

图3.subpixConv

2.7 参考资料

Share Comments

2019-周报9

以往深度学习模型训练测试大多都是在别人的模型上稍微修改便拿来用,本周开始自己从头构建模型代码进行训练,注意到了很多之前没有注意的实现细节。本周的主要工作有以下两点

1 对抗样本

对抗样本一直是机器学习中一个难题,刻意地在样本中加入特定扰动便能大大降低模型的识别准确率,如下图所示,便能使网络将熊猫识别为长臂猿。图1.FGSM panda example

制造对抗样本的方法中最有名的方法之一便是上图中使用的 FGSA(fast gradient sign attack)。一直以来大家都知道对抗样本问题的存在,但是对于引起这种现象的原因却并不明了。现在业界对此的共识是输入特征维度过高和模型的线性性质导致 。只要找到特定的方向,图像的每个像素点都朝特定的方向前进一小步,就会导致整个图片的特征发生很大的改变从而跨过决策层。

1.1 对抗样本的防御

目前对抗样本的生成远比防御更加容易,大多对抗样本的生成都是利用了其梯度信息。最容易想到的防御方法便是将生成的对抗样本一块儿加入训练集中进行训练,这种方法可以有效地防御样本攻击,但是只能针对用于训练的对抗样本有效,除此之外还有defensive distillation梯度隐藏 等方法。但相比攻击来说,防御并没有做得足够好。

1.2 总结

对抗样本的出现对理解深度学习有很大的帮助,在很多领域深度学习识别率都大大超越了人类水平,但对抗样本的出现算是找到了深度学习的一处盲点,目前还没有很好的方法完全解决这一问题。

1.3 参考资料

2 GAN

2.1 实践部分

本周继续学习了GAN的相关知识,在参考了许多经典模型之后开始自己动手编写模型。在自己编写模型的过程中注意到了很多之前忽视的实现上的细节知识,加强了对深度学习框架的熟悉程度。

自己实现模型需要关注的东西更多,从数据的读取,预处理,到网络的构建,优化器的选择,训练,测试的过程。比起在已有的代码中更改网络模型进行训练,手动实现整个过程有助于观察到更多的细节部分。之前已经跑过相应的代码,目前自己从头编写的代码仅实现了一部分,还未全部完成。

2.2 理论部分

GAN的相关理论发展主要在对真实样本与生成样本之间分布的测量部分,Goodfellow最开始论文中使用的是 JS-divergence 来度量分布之间的距离。但这种距离的测量不是很容易,而且两个分布在没有任何交集的情况下距离都相同,也就是距离的远近不影响测量值,这样不利于训练。

在这之后逐渐提出了很多种不同的度量方式,如 f-GAN中便进行了推广,利提出了多种不同的测量方式如下图2.F-divergence

随后在W-GAN中又提出了新的测量方式 Earth Mover’s distance 更好得解决了两个分布无任何交集情况下得距离问题,其中的理论知识都挺复杂,一时半会很难搞懂。

2.3 参考资料

Share Comments

2019-周报8

本周主要工作如下:

  • 总结了深度学习中常用的损失函数
  • 学习了GAN, DCGAN, CGAN, cycleGAN等常用GAN网络
  • 翻译了pytorch官方文档中DCGAN的教程,训练生成人脸图像
  • 继续完善视频编解码代码,发现了新的bug,正在调试中

1 常用损失函数

损失函数的作用是衡量实际输出与预计输出之间的差异,损失函数的设计是深度学习中十分重要的部分,不仅会影响到训练的速度,还会影响隐含层中数据的分布情况。目前仅仅是总结了部分常用损失函数的计算方法,其中涉及很多统计学最优化知识,对此仅仅是浅尝辄止,其中更多的原理还需要以后慢慢总结体会,以下仅简要记录其计算方法。

1.1 MSE

均方误差算是最简单也是最经典的一种计算损失的方法,其中 $\hat y$ 为实际输出,$y$ 为标签。
$$
mse_loss =\frac{1}{N} \sum _{i=1} ^N (y_i - \hat y_i)^2
$$

1.2 CrossEntropy

交叉熵是从KL散度中引出,用于衡量两个分布之间差异的大小,其值总是大于等于0,两个分布越相似其值越接近于0。训练时的标签可以当成一种分布,实际输出堪称另一种分布,常与softmax层结合用于分类模型。
$$
CrossEntropy_loss = -\sum _i y_i·log\hat y_i
$$

1.3 log损失函数

log损失通常用于逻辑回归,是二分类中常用的损失函数,若二分类中使用mse损失会造成最后优化函数为非凹函数,不利于训练。其中 $x$ 表示输出该特征,$y$ 表示所属类别, $p(1/x)$ 表示输入特征 $x$ 属于类别 $1$ 的概率。
$$
log_loss = \begin{cases}
-log(p(1/x)), &&&y=1 \
-log(1-p(1/x)),&&&y=0
\end{cases}
$$
将上面分类书写的形式变换一下,便得到了BCE_loss,只不过是换了一个名字而已,效果与上式相同
$$
BCE_loss = -y·log(p(y/x)) - (1-y)·log(1 - p(y/x))
$$
逻辑回归是分类网络中基础又重要的一个网络,GAN网络中的discriminator便是使用这种二分类网络。比较GAN网络的损失函数便会发现相似之处
$$
\mathop{min} \limits_G\mathop{max} \limits_ D V(G,D) = E_{x∼pdata(x)}[logD(x)]+E_{z∼pz(z)}[log(1−D(G(x)))]
$$

1.4 Smooth L1

smooth L1是何凯明提出的优化的MSE损失,能有有效地优化梯度爆炸问题。这个例子表明我们可以根据我们网络的具体表现适当调节我们的损失函数从而解决特定的训练问题。
$$
smooth_l1_loss = \begin{cases}
0.5(x_i - y_i)^2, &&&\mbox{if }&|x_i - y_i|<1 \
|x_i - y_i| - 0.5,&&&otherwise
\end{cases}
$$

1.5 F-divergence

F-divergence是一个大的类,其中 $F$ 表示特定的函数,当函数 $F$ 不同便表示的不同的散度,上面提到的交叉熵便是 KL散度即 KL-divergence。其中KL使用的 $F$ 为 $t·logt$ 。F-divergence损失函数如下:
$$
D_f (P_{data}||P_g) = \int_x P_g(x)f(\frac{P_{data}(x)}{P_g(x)})\, dx
$$
目前还有很多损失函数没有总结,比如用于人脸识别的TripletMarginLoss 比起一般的损失函数能够很好地将不同的人脸特征分开。总之损失函数对深度学习的影响非常重要,很多时候使用一种损失导致训练崩坏而换一种损失便能得到不错的效果。

2 GAN

作为目前生成网络中的老大,GAN的发展十分迅猛而且应用场景很多,十分有趣。阅读了GAN的论文,翻译了 PyTorch教程之DCGAN 并学习CGAN, CycleGAN等优秀的GAN模型。

GAN网络解决了很多之前没能解决的问题,不光对生成网络贡献巨大,也为非监督学习领域带来了重大的突破。在此之前的生成模型领域有一个很难解决的问题便是如何对生成的图像做评估,而GAN使用 discriminator网络来对生成图片做评估很好地解决了这一问题。

2.1 DCGAN

DCGAN即deep convolution GAN第一次将GAN网络应用到图像处理领域。输入为服从高斯分布的随机噪声,输出目标图像,其主要的改进如下:

  1. 取消了所有的pooling层,在判别器网络中使用strided convolutions层代替,在生成器中使用fractional-strided convolutions代替
  2. 在生成器与判别器中都加入了 batchnorm 层
  3. 移除了隐藏层中的全连接层
  4. 生成器中所有隐含层中使用ReLU激活函数,输出层使用Tanh激活函数
  5. 判别器中激活函数都使用 LeakyReLU

DCGAN使得GAN网络在图像处理得到了良好的训练,但是其输入输出并没有建立良好的联系,而很多实际应用中需要将输入 $z$ 与输出图像之间建立联系,而非随机生成。例如输入文字,产生相应图像,输入语言,产生相应的图像,于是CGAN应运而生。

2.2 CGAN

CGAN即 conditional GANs,在网络中引入了条件信息,使得GAN网络生成的图片能和输入之间联系起来。CGAN的应用场景十分广泛,图像修复,图像匹配………..。其最初的训练步骤如下

图1.CGAN训练结构

但现在在此基础上有了更多新的结构产生,大多是对生成器与判别器进行改进而来。如上图所示通常来说只有一个判别器,目前新的结构通过引入更多的判别器,一个判断生成的图像是否realistic,另一个判断生成的图像是否match。引入的条件也越来越多,文字,语言,图像等都是常用的条件信息。

2.3 CycleGAN

CycleGAN的这种环形结构并不新鲜,在之前的AutoEncoder中就有这种类似的结构,CycleGAN将这种环形结构与GAN相结合,更好地解决了对生成后图像的评价问题。

图2.CycleGAN结构

CGAN的训练需要很多很多成对的数据,通常这是很难获取的,而CycleGAN则完全为非监督学习,不需要成对的数据 (unpaired image-to-image)。这使得更多的训练任务变得可能,特别是在风格转换领域得到了广泛的应用。

近几年GAN的发展十分迅速,其相关的理论研究也在不断完善。除了通过结构对网络进行优化,还有很多在距离的度量方式上的重大突破,例如 LS-GAN, EB-GAN, WGAN, FisherGAN 等很多网络。这方面的理论知识相对更加复杂。

2.4 参考资料

Share Comments