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:
- Problemas encontrados al ejecutar el código fuente
- PSNR (Relación señal/ruido de pico de imagen)
- Inicialización de parámetros de convolución por parámetros en vdsr.py
- Resultados del entrenamiento con un dataset de 91 imágenes
- posdata:
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
- 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)
复制代码
-
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
复制代码
- Cómo especificar una GPU durante el entrenamiento (mejor si su computadora tiene una GPU)
- 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
- 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.py
和eval.py
可以出结果,总是报一堆SourceChangeWarning
,很明显是网络源有了更改,但结果和GitHub及论文里公布的差不多,我本以为这样就算成功了。
但正是由于我的强迫症,于是打算自己重新训练一下,用自己训练出来的模型进行测试,果然模型训练出来了,这些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
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:
- “Deep Learning” teórico, para entender el concepto de deep learning desde la perspectiva de las matemáticas y la ingeniería
- Lea la documentación de PyTorch
- 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
- Lea el código para ver el sistema, el entrenamiento, la arquitectura de prueba, cómo construir funciones de pérdida, etc.
- Intente escribirlo usted mismo en lugar de simplemente eliminarlo y ejecutar el código.
- 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 ~