RCAN学习——多帧超分辨率

超分辨率模型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_memory_thread = threading.Thread(
                target=_utils.pin_memory._pin_memory_loop,
                args=(self.worker_result_queue, self.data_queue, self.done_event, self.pin_memory,
                      maybe_device_id))
self.pin_memory_thread.daemon = True
self.pin_memory_thread.start()

6、dataloader.py中第119行

_update_worker_pids(id(self), tuple(w.pid for w in self.workers))
_set_SIGCHLD_handler()

修改为:

_utils.signal_handling._set_worker_pids(id(self), tuple(w.pid for w in self.workers))
_utils.signal_handling._set_SIGCHLD_handler()

6、dataloader.py中第131行

collate_fn=default_collate, pin_memory=False, drop_last=False,
    timeout=0, worker_init_fn=None):

修改为:

collate_fn=_utils.collate.default_collate, pin_memory=False, drop_last=False,
    timeout=0, worker_init_fn=None):

基于RCAN的多帧修改

由于RCAN是SISR方法,在应用在视频超分辨领域其效果不是特别好,于是想将其修改成支持多帧的版本,目的是充分利用前后帧的信息,并提高超分效果。 本文提出的想法是将当前帧与前后帧联合进行输入,并修改网络的输入通道数,若采用前后5帧作为输入,则输入的通道数应改为5*3=15。依据这个思想只需要将srdata.py中的__getitem__()进行修改即可

    def __getitem__(self, idx):
        if (idx % 100 ) > 2 | (idx % 100) < 99:
            lr1, hr1, _  = self._load_file(idx-2)
            lr2, hr2, _  = self._load_file(idx-1)
            lr3, hr3, filename = self._load_file(idx)
            lr4, hr4, _  = self._load_file(idx+1)
            lr5, hr5, _  = self._load_file(idx+2)
        else:
            lr1, hr1, _  = self._load_file(idx)
            lr2, hr2, _  = self._load_file(idx)
            lr3, hr3, filename = self._load_file(idx)
            lr4, hr4, _  = self._load_file(idx)
            lr5, hr5, _  = self._load_file(idx)

        lr1, hr1 = self._get_patch(lr1, hr1)
        lr2, hr2 = self._get_patch(lr2, hr2)
        lr3, hr3 = self._get_patch(lr3, hr3)
        lr4, hr4 = self._get_patch(lr4, hr4)
        lr5, hr5 = self._get_patch(lr5, hr5)
        
        lr = np.concatenate((lr1, lr2, lr3, lr4, lr5),axis=-1)
        hr = hr3
        lr, hr = common.set_channel([lr, hr], self.args.n_colors)
        lr_tensor, hr_tensor = common.np2Tensor([lr, hr], self.args.rgb_range)
        return lr_tensor, hr_tensor, filename

      本文中利用的每一个视频是150个视频,每个视频是100帧,每5帧作为一个输入,即第i-2、i-1、i、i+1、i+2帧的低分辨率图对应于第i帧的高分辨率图像
      上述方法仅为一种简单尝试方法,也可以每次单独处理一帧,在最后的时候使用1个或2个卷积将5帧单独处理得到的图像进行合成

完整版的基于多帧的RCAN可以参考https://github.com/RussellEven/Multi-frame-RCAN

你可能感兴趣的:(Research)