Tensorflow使用教训:被tf.image.resize浪费的60天

How Tensorflow’s tf.image.resize stole 60 days of my life

原文地址:https://hackernoon.com/how-tensorflows-tf-image-resize-stole-60-days-of-my-life-aba5eb093f35?gi=f6c680bed9e0

这是一个对所有计算机视觉工作者的简短警告:请勿使用任何tf.image.resize函数!

为了让增强图像识别的神经网络,使其更快,更大,并为正在开发的API做好准备,我正在重写这一部分的代码库,如同我们以前处理图像生成任务(超分辨率,去模糊等)时,我们确实依赖OpenCv和PIL这样的典型图像处理库。我总是怀疑使用TensorFlow图像处理功能是否合理——理论上来说,它们应该更快。因此,我决定坚持使用dataset.map()函数,将所有的图像处理的运算放入其中。

问题出现了——我的新代码训练出来的超分辨率模型不仅没法state-of-art,甚至还不如我4个月前写的。而最丑陋的部分是,超分辨率本身的结果有时是非常好的,说明网络是working的,尽管没有达到PSNR目标,有时候还有一些奇怪的视觉产物,比如小线条的倍增。


让我们开始debug

我为这个看起来很小的bug奋斗了60天。我的逻辑很简单--网络结构的定义或者训练过程中出现了问题,数据处理绝对没有问题,因为我在Tensorboard中可视化了图像处理过程与结果。

我调整了我能想到的所有东西,使用Keras,Slim,用原生TensorFlow——没有什么卵用。切换TF1.3→1.4→1.5和不同的CUDA版本。我甚至怀疑GPU内存和静态的缺陷。我甚至调整perceptual losses和style losses来寻找原因。每次训练都需要花几天时间才能获得有意义的结果。

就在昨天,我查看Tensorboard的时候发现了bug。几乎是潜意识里觉得图像出了问题。我直接忽略网络的输出,在Photoshop中叠加了目标图像和输入图像(即缩小的目标图像),下图是我得到的:


这看起来很奇怪,两张图像之间发生了位移,完全违背任何逻辑,这是不可能的! 我的代码其实很简单,读取图像,裁剪图像,调整图像大小,所有操作都在TensorFlow中执行。

无论如何,Read The Fucking Manual ,tf.image.resize_bicubic有一个参数——“对齐角落”。这个有着奇怪行为的函数已经存在了很长时间了,他们无法修复他,因为这会破坏大量旧代码和预先训练的网络

我们的tf.image.resize_area函数甚至不等于反射,虽然可以优雅地解决这个问题,但我会担心会破坏旧的模式。

该代码实际将你的图像向左和向上移动一个像素,这个破坏过程甚至在插值中。这是2018年,很难想象这是TensorFlow对缩小尺度的结果。


 无论你偏好什么样的图像处理过程,坚持使用Scipy/OpenCV/numpy/PIL。当我改变了这部分代码,我的网络焕发出了魅力(当我看到训练结果时,实际上是第二天)。


猜你喜欢

转载自blog.csdn.net/yeahDeDiQiZhang/article/details/79550113