超分辨率模型RCAN官方代码(pytorch)是参考EDSR代码进行编写,直接运行存在版本问题,目前暂时不支持pytorch1.0及以上,部分代码需要进行修改,本文尽可能比较细的将需要修改的地方进行阐述,并提供一个基于RCAN模型的多帧超分辨率版本的github链接。
RCAN版本更新
直接运行RCAN代码时,报错:
ImportError: cannot import name ‘_worker_manager_loop’
ImportError: cannot import name ‘_update_worker_pids’
原因:Pytorch升级到1.0后,dataloder模块中的_worker_manager_loop函数已被移除并由_pin_memory_loop替代。因此需要将dataloader.py中的_worker_manager_* 修改为_pin_memory_* ,具体修改如下:
1、dataloader.py第10行
from torch._C import _set_worker_signal_handlers, _update_worker_pids, \
_remove_worker_pids, _error_if_any_worker_fails
修改为:
from torch._C import _set_worker_signal_handlers
from torch.utils.data import _utils
2、dataloader.py第15行到第22行
from torch.utils.data.dataloader import ExceptionWrapper
from torch.utils.data.dataloader import _use_shared_memory
from torch.utils.data.dataloader import _worker_manager_loop
from torch.utils.data.dataloader import numpy_type_map
from torch.utils.data.dataloader import default_collate
from torch.utils.data.dataloader import pin_memory_batch
from torch.utils.data.dataloader import _SIGCHLD_handler_set
from torch.utils.data.dataloader import _set_SIGCHLD_handler
修改为:
_use_shared_memory = False
3、dataloader.py第51行
data_queue.put((idx, ExceptionWrapper(sys.exc_info())))
修改为:
data_queue.put((idx, _utils.ExceptionWrapper(sys.exc_info())))
4、dataloader.py第74行
_result_queue = multiprocessing.SimpleQueue()
修改为:
self.worker_result_queue = multiprocessing.Queue()
5、dataloader.py第105到第111行
self.worker_manager_thread = threading.Thread(
target=_worker_manager_loop,
args=(self.worker_result_queue, self.data_queue, self.done_event, self.pin_memory,
maybe_device_id))
self.worker_manager_thread.daemon = True
self.worker_manager_thread.start()
修改为:
self.pin_mem