Superresolución de imagen [CVPR2016]-Reproducción de código VDSR-PyTorch

Este artículo ha participado en el evento "Ceremonia de creación de recién llegados" para comenzar juntos el camino de la creación de oro.

Superresolución de imagen [CVPR2016]-Reproducción de código VDSR-PyTorch

Prefacio:

Implementación del documento CVPR2016: "Superresolución de imagen precisa utilizando redes convolucionales muy profundas" ( cv.snu.ac.kr/research/VD… ) en PyTorch

El autor original del artículo escribió el código en matlab, y hay grandes en GitHub que lo reprodujeron con PyTorch, lo que nos brinda comodidad. Pero después de todo, han pasado cinco años y se han encontrado muchos problemas durante el proceso de reproducción y, por supuesto, he aprendido mucho de él.

Problemas encontrados al ejecutar el código fuente

  1. principal_vdsr:
UserWarning: torch.nn.utils.clip_grad_norm is now deprecated in favor of torch.nn.utils.clip_grad_norm_.
  nn.utils.clip_grad_norm(model.parameters(),opt.clip)
复制代码

Una diferencia particularmente sutil, se agrega un guión bajo después del método de función

# 修改前
nn.utils.clip_grad_norm(model.parameters(),opt.clip)	
# 修改后
nn.utils.clip_grad_norm_(model.parameters(),opt.clip)	
复制代码
  1. demo.py:

    ImportError: no se puede importar el nombre 'imread' de 'scipy.ndimage', desde scipy1.3.0, imread se eliminó de este módulo

from scipy.ndimage import imread
ImportError: cannot import name 'imread' from 'scipy.ndimage' (D:\Anaconda\envs\pytorch\lib\site-packages\scipy\ndimage\__init__.py)
复制代码
# 修改前
from scipy.ndimage import imread
# 修改后
from imageio import imread
复制代码
  1. Cómo especificar una GPU durante el entrenamiento (mejor si su computadora tiene una GPU)
  2. Veo que en cada py, siempre hay muchos parser.add_argument() para establecer parámetros al principio.¿Qué hace esto? Uso de parser.add_argument() de python: opciones de línea de comandos, parámetros y analizador de subcomandos
  3. Resuelva el error: los objetos h5py no se pueden decapar, esto se debe a que se utilizan subprocesos múltiples al cargar el conjunto de entrenamiento

PSNR (Relación señal/ruido de pico de imagen)

¿Qué es PSNR? ¿Por qué se mide el resultado con este parámetro?

Inicialización de parámetros de convolución por parámetros en vdsr.py

        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                # 打印下来看了看
                # print(m.kernel_size[0], m.kernel_size[1], m.out_channels)
                n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
                m.weight.data.normal_(0, sqrt(2. / n))
复制代码

把以上报错以及一些小错误解决之后,代码终于跑通了!用作者给的model_epoch_50.pth重新跑demo.pyeval.py可以出结果,总是报一堆SourceChangeWarning,很明显是网络源有了更改,但结果和GitHub及论文里公布的差不多,我本以为这样就算成功了。

imagen-20211119220213159

但正是由于我的强迫症,于是打算自己重新训练一下,用自己训练出来的模型进行测试,果然模型训练出来了,这些warning也不在了,结果令我震惊,好像白训练了,PSNR和双三次插值的基本没差别,这是什么问题呢?

想找一下解决方案也搜不到,找了好久,就在自己想要放弃的时候,在GitHub的Issues下发现了同样的问题:使用提供的train.h5按照main_vdsr.py中的超参数进行重新训练,经过50个epochs后得到的结果却是和bicubicu的值差不多,请问这是什么原因?

这下就不奇怪了,原来大家也遇到这问题了。还好作者耐心解答,我也根据作者提供的matlab源码,用91张图片重新生成了训练用的数据。然后白嫖Google Colab的Tesla K80进行训练,原本训练50个epochs不到30分钟,现在训练了将近两天(而且Google还要限制使用时长)。最后顺利用2G数据集训练出来的第50个epoch测试,得到了和论文、GitHub中接近的结果。

用91张图片数据集训练的结果

From left to right are ground truth, bicubic and vdsr inserte la descripción de la imagen aquí

After 50 epochs of training, performance on set5:

Scala PSNR_bicubic PSNR_predicted PSNR_paper Time
2x 33.69 37.32 37.53 2.54s
3x 30.41 33.52 33.66 2.14s
4x 28.41 31.22 31.35 2.03s

后记:

Aunque este código se ha reproducido con éxito, solo se encuentra en la etapa de ejecución del código y solo comprende la red. Obligarme a reescribirlo ahora es realmente imposible de escribir. El Sr. Liu de la estación b dijo que para mejorar la capacidad debe ser el siguiente proceso:

  1. “Deep Learning” teórico, para entender el concepto de deep learning desde la perspectiva de las matemáticas y la ingeniería
  2. Lea la documentación de PyTorch
  3. Quiere escribir redes complejas: lea la documentación de PyTorch

Es inútil ejecutar el código clásico, cómo refinar la capacidad: leer código -> escribir código -> aprender código , seguir iterando

  1. Lea el código para ver el sistema, el entrenamiento, la arquitectura de prueba, cómo construir funciones de pérdida, etc.
  2. Intente escribirlo usted mismo en lugar de simplemente eliminarlo y ejecutar el código.
  3. Expansión de horizontes: puntos ciegos del conocimiento, deficiencias en la práctica del código

Mi código: github.com/Eppp/pytorc…

La última palabra : no es fácil de escribir, si te gusta o te ayuda, recuerda dar me gusta + seguir o favorito ~

Supongo que te gusta

Origin juejin.im/post/7086358514360123406
Recomendado
Clasificación