毕设总结五--杂项

本科毕设题目为《基于深度学习的图像去雾方法研究与实现》

毕设总结系列:

1. 前言

上一篇文章中,介绍了笔者在毕设中所采用的去雾方法及其代码实现。这一篇算是总结一些在毕设过程中的一些杂项事物,以及收尾吧。

2. 一些杂项

2.1 去雾新想法

  • CycleGan的思想其实也很有趣,但是我没有去实现了,算是一个思路吧。
  • DeBlurGan中可以尝试把ResBlock改为DenseBlock,但是注意DenseBlock很容易显存爆炸,我当初是实现了DenseBlock的,但是无奈显存直接爆炸了。曾经看过Pytorch似乎可以解决DenseBlock显存爆炸的问题,但是keras暂时还没有。显存爆炸的原因我已经忘记了,所以无法贴出相关链接。但是当时是在Github的issue上看到的,算是一条线索吧。

2.2 展望与不足

  • 虽然没有实际测试服务器的去雾速度,但是个人感觉还是很快的。那么这样其实可以做一个视频实时去雾的应用,比如在咱们重庆高速公路上雾天天气还是蛮频繁的,做一个实时去雾处理可以大大降低车祸事故率。什么?担心上传雾图下载雾图速度慢?5G都要来了,咱应该不怕这个。更何况也可以把网络迁移到硬件设备上去,参考TensorFlow Lite

---

-------------下段话已过时。-------------

如果有读过我的代码的小伙伴,肯定知道不论是train还是test,我都把整个网络的输入固定了size,这就造成了整个网络只接受固定size的图片,其余size的图片需要做resize处理,resize肯定会失真,这是一个缺点。修复这个缺点的重点有两个:

  1. 把判别网络后两个FC层改为多个卷积层,那就实现了整个网络(包括生成网络和判别网络)为全卷积网络,如此一来可以接收任意size的图片了。
  2. 据个人所知,Keras和TensorFlow这两种框架必须固定输入size,要想实现任意size,可用matlab(matlab是基于操作来实现的,所以肯定可以实现全卷积),其余框架如caffe,pytorch等等我没有学习,无法给出确定答案。

---

2019/8/27更新

感谢评论区@lihanyu1204的提醒,理论上keras和tensorflow是可以接收任意size的输入的(前提是你的网络为全卷积)。个人试验后也的确如此,不过建议train时还是要固定size,test可不固定。另外,如果固定了输入size来train,判别网络也就不用将后两个FC层更改为卷积层了。代码实现如下:

 if mode == 'train':
        inputs = Input(shape=image_shape)
    elif mode == 'test':
        inputs = Input(shape=(None,None,3))

其中image_shape是固定的图片大小,在我的代码里为(256,256,3)

当然了,这只是理论上可以接收任意size,实际情况还要看你的网络结构,由于我的网络设计已经固定,在不修改网络结构的情况下只能接收图片宽高能整除4的这类图片。因为我的网络结构最前两层卷积降维,最后两层升维,且单次升降仅让图片size乘2或除2。如果遇到输入不能整除4的情况,会造成输入输出的size不一致。例如输入为450, 经过第一层为225,第二层为113(padding='same'的情况下,向上取整),倒数第二层为226,最后一层输出为452。所以我的网络只能接收能整除4的。

如果你要考虑接收任意size,则要考虑好网络结构。

---

新问题

不过这样又会引发一个新问题,那就是在keras的predict函数中所接受的输入需要具有相同的shape,否则会报错。个人的解决方案是采用循环predict,每次循环仅predict一张图片。不知道keras有不有相应的predict函数能够适应不同的输入大小。

2.3 Android app展示去雾?

看过本系列四的同学,应该注意到我在文末贴了一个视频,演示的是Android App上传图片到服务器,服务器处理回传后Android显示的效果。请注意那个时候Android app和服务器并不是在一个局域网内,因为我做这个app的初衷是为了答辩演示,答辩的时候肯定和寝室的台式机不在一个局域网内,于是做了内网穿透。关于这段实现过程,可参见我的另一篇博文

2.4 Latex 写毕设论文?

说到Latex,我真的是又爱又恨。爱的是他的简单美观,恨的是他的复杂难看。看到这里的小伙伴一定觉得我疯了,说了一堆反义词。但是Latex就是这样,如果有提供好的Latex模板,那写起来就很舒服,就像一个程序你只用给它一个简单输入,它在后台帮你把所有排版、公式编号、插图等等全部安排好。如果没有提供好的模板,那就要自己去实现,我花了一个星期的时间努力搞出本校的模板,但是我放弃了,太多细节的东西没法修复实现(全怪自己是Latex的弱鸡)。后来Latex对我来说的唯一作用就是拿来写公式,再转到word中去。

所以一条建议:先去TexStudio工作室搜搜有不有你本校的模板,没有的话尽量就用word编排,当然如果你对自己的Latex能力有信心,那就做一份吧,还能为你本校的后辈们留点东西,方便后辈们写论文咯。

2.5 其他参考资料

3. 结语

总算是写到了本系列的最后一篇文章了,这个系列的结束,基本上意味着我在学校的最后工作也做完了,感谢在毕设5个月来一直帮助我的师兄,
接下来就是浪咯,好久没玩游戏了,最近应该也不会更新博文了吧,去放松一把啦。

Last modification:August 27th, 2019 at 10:35 am
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment

12 comments

  1. lihanyu1204

    深度学习可以测试任意尺寸的图片,无论是TensorFlow还是keras。test image 中间的hw维度设置为none,然后注意处理网络当中卷积步长。
    博主,为什么我的GAN训练的出来的去雾图像都是白色,请问这是什么原因?谢谢

    1. Raven
      @lihanyu1204

      感谢你的回答。之后回去验证一下,我记得当初在建立网络时,如果不指定具体的input_shape会报错,因为没办法推算出后面layer的shape。
      至于你训练的结果都为白色。这个我也无法给你确切的解决方案,如果网络结构建立没问题的话,可以看看训练数据集是否一一匹配,可以把输入size放缩到-1 ~ 1之间,optimizer尽量用adam等。gan的确很难训练,我当初也是各种尝试。

      1. lihanyu1204
        @Raven

        训练和测试使用不同的程序。input_shape当然要指定h和w的大小。测试时候的test_shape, hw就不用指定了。
        我是用我之前图像增强的GAN结构,同样的结构想训练个去雾模型。你说的trick我之前都用了,好像没什么用。
        损失函数,我用的是non-saturating GAN loss和spectral normalization。问个无趣的问题对于GAN的损失函数来说,G loss 7千多,D loss 1.0 算正常吗

        1. Raven
          @lihanyu1204

          好的,size的问题我待会测试一下。至于loss的问题,这个我也不清楚了。

          1. lihanyu1204
            @Raven

            谢谢了

            1. Raven
              @lihanyu1204

              我这边才是该感谢您了。刚才试验了一下,确实可以任意size test。

              1. lihanyu1204
                @Raven

                动手能力很强啊

                1. Raven
                  @lihanyu1204

                  谢谢夸奖 。祝老哥好运。

  2. lihanyu1204

    请问下,那个安卓app是怎么制作的?我在这方面没有做过

    1. Raven
      @lihanyu1204

      你好,Android的代码已经开源:https://github.com/raven-dehaze-work/DeblurGanToDehaze
      不过我不是将去雾的模型移植到Android的,只是将PC作为了服务端,Android作为客户端来使用的。如果要将模型移植到Android端可以参考TensorFlow Lite。

      1. lihanyu1204
        @Raven

        多谢了,顺便问下你去哪个学校深造哦

        1. Raven
          @lihanyu1204

          不客气,现在在家里蹲大学,