LoSealL / VideoSuperResolution

A collection of state-of-the-art video or single-image super-resolution architectures, reimplemented in tensorflow.
MIT License
1.61k stars 295 forks source link

VirtualFile里面关于file move backward #113

Closed ylz1104 closed 3 years ago

ylz1104 commented 4 years ago

self.read_pointer -= reminder self.cur_fd.close() self.cur_fd = self.read_file[-1].open('rb') self.file.insert(0, self.read_file.pop()) 我觉得应该改成 self.read_pointer -= reminder self.cur_fd.close() self.cur_fd = self.read_file[-2].open('rb') self.cur_fd.seek(0,SEEK_END) self.file.insert(0, self.read_file.pop())

LoSealL commented 4 years ago

谢谢,-2那里似乎是笔误? 确实应该继续加上当前文件的偏移量。我看了一下,似乎得改成:

# move backward
      reminder = self.cur_fd.tell()
      while self.read_pointer - reminder > target:
        self.read_pointer -= reminder
        self.cur_fd.close()
        self.cur_fd = self.read_file[-1].open('rb')
        self.file.insert(0, self.read_file.pop())
        reminder = self.cur_fd.tell()
      self.cur_fd.seek(target - self.read_pointer, SEEK_CUR)
      self.read_pointer = target
ylz1104 commented 4 years ago
  1. 我测试了一下,-2应该是没什么问题,正常来说,cur_fd和read_pointer在当前文件夹的位置应该是一致的啊,只是对应关系是read_pointer=n_frame.length+cur_fd。

2.之前原来的代码做了一个判断,一个可以理解为target在最后一个文件里,另一个是target在之前的文件里,那么如果target在之前的文件里,最起码应该从read_file的-2的文件开始查找,而最后一个文件会被pop到file里。

3.我不知道我描述的够不够清楚,感觉您的代码也是稍微有点复杂,处理data的时候感觉内存应用会很大; 而且我看到文件处理用的是线程,对python来说用进程会不会更好的处理数据。

LoSealL commented 4 years ago

VirtualFile的初衷用来处理3种情况:

多线程(mt)处理IO并发足够了,如果是进程(mp)的话,不同进程在通过pickle传输子进程图像数据的时候反而造成性能瓶颈。 通过预读文件进内存来加速单个epoch的训练,使瓶颈不在文件IO上。从速度来看远远大于pytorch的Dataset挨个解码,或者带压缩的lmdb等数据结构。

ylz1104 commented 4 years ago
LoSealL commented 4 years ago
ylz1104 commented 4 years ago
LoSealL commented 4 years ago

除了莽,还可以思考

  1. 为什么SRCNN,ESPCN这种轻量级模型不行,不行在哪里,能不能正面解决。为什么low-level的任务都是上百万甚至千万的参数量。
  2. Real-world偏移的问题。

前几周的Loader有一些重复处理,在训练上效率很低,我现在的vespcn也远大于3个卷积层,不知道是不是这方面的原因。 单从数据加载的角度应该不会有10倍的差距,我下来看一看。pillow和opencv包括tensorflow.image的底层实现都差不多,解码png都是libpng,差别不会太大。

ylz1104 commented 4 years ago
LoSealL commented 4 years ago

回到这个问题本身,这部分代码段仅针对RawFile类型。对于RawFile类型,有且仅有一个文件FD,所以这里的逻辑是:

当seek到文件头之前,重新回到文件头而已。

不应该存在多个文件连续seek的情况。