zoukankan      html  css  js  c++  java
  • SfMLearner 记录

    -->   博客答疑说明 链接【置顶】<--

    2019年7月12日18:42:34

    写了个更细致的公式推导和代码解释的 sfmlearner剖析

    2019年3月2日09:29:54

    正在看SfMLearner的pytorch源码,意识到无监督的深度估计最重要的是利用实体的一致性

    来建立loss。

    对于一个不移动的物体,相机从一个pose到另一个pose,那个东西一直在那,可以通过

    三维结构、光照 等不会突变来建立loss。

    对于移动的刚性物体,比如汽车,可以先检测出来,再做一致性的约束。

    对于移动的非刚性物体,比如人啊、狗啊之类的,还需要另外的模型来描述。我记得是有

    不少这方面的优秀的工作的。

    可以做的比 生成一个检测运动区域的mask 更近一步。

    2019年3月6日15:55:31

    又看到了arxiv上好几篇无监督的单目深度估计论文看起来还不错...

    深度学习加slam的方向发展太快了...

    2019年3月11日19:05:37

    static_frames.txt 是采集数据的 车子停下来 的画面的图像编号。

    看了一天的sfmlearner和struct2depth的 tf 代码。struct2depth报了个错,还没跑起来。

    忽然想到把单目深度估计发展出来的技巧用到双目上,岂不是又可以提升一波?

    想要重构一下 tf 的代码以方便调试,发现 tf 根本就没有什么操作空间啊!tf 真的是反人类!

    真的有 茴字的四种写法 这个问题。。。

    2019年3月13日09:11:46 

    看的是下面这个库里的代码:

    https://github.com/ClementPinard/SfmLearner-Pytorch 

    因为要训练自己拍的视频,所以要了解data_loader。自己的数据集肯定没有kitti那么复杂,

    就是拍了视频,然后分解成图片。就 000001.jpg、000002.jpg、...... 加上一个内参

     1 首先是读入了图片并resize到 128 x 416大小
     2 # 在 kitti_raw_loader.py   load_image 函数
     3 img = scipy.misc.imread(img_file)
     4 zoom_y = self.img_height/img.shape[0]  # 这里把原始图片resize到指定尺寸了
     5 zoom_x = self.img_width/img.shape[1]   # self.img_height = 128  self.img_width = 416
     6 
     7 img = scipy.misc.imresize(img, (self.img_height, self.img_width))
     8 return img, zoom_x, zoom_y  # 返回的是长宽的比例系数
     9 
    10 然后是读入了原始的相机矩阵P,并乘以上面的缩放系数
    11 # get_P_rect 函数
    12 filedata = self.read_raw_calib_file(calib_file)
    13 P_rect = np.reshape(filedata['P_rect_' + scene_data['cid']], (3, 4)) 
    14 # 这里读入了 投影矩阵 P 并 reshape 成了 3 x 4 的矩阵
    15 # P_rect_02:
    16 # [[ 7.183351e+02  0.000000e+00  6.003891e+02  4.450382e+01]
    17 # [ 0.000000e+00  7.183351e+02  1.815122e+02 -5.951107e-01]
    18 # [ 0.000000e+00  0.000000e+00  1.000000e+00  2.616315e-03]]
    19 
    20 P_rect[0] *= zoom_x  # 对第一行和第二行乘以一个比例系数
    21 P_rect[1] *= zoom_y
    22 return P_rect
    23 
    24 然后是做了 
    25 scene_data['intrinsics'] = scene_data['P_rect'][:,:3] # 只取前3列,得到内参
    26 得到缩放后的内参
    27 
    28 这样的话,图片也缩放到了指定尺寸,内参也缩放了,可以送入网络了
    29 自己的数据也要做一样的操作。
    30 
    31 然后是 sequence_folders.py
    32 for i in range(demi_length, len(imgs)-demi_length): # 1,321-1
    33     sample = {'intrinsics': intrinsics, 'tgt': imgs[i], 'ref_imgs': []}
    34     for j in shifts: # shifts = [-1, 1]
    35         sample['ref_imgs'].append(imgs[i+j])  # tgt 是 i   ref 是 i-1 和 i+1
    36 
    37 到了实际要输入网络的时候,再__getitem__读入图片并做 transform
    38 custom_transforms.py里也有对图片做随机裁剪时内参要做什么操作的代码。

    2019年3月22日13:12:11 

    之前训练了一个晚上的sfmlearner,1600张图片,跑了200个epoch,valid loader误用了

    train_transform,不过应该没什么大碍,但是最后看效果相当不好,只能简单的区分出远近,

    而且预测出来的深度闪来闪去。这个纯当练手了,不打算继续训练了。

    需要注意的一点是:手机拍摄自己的训练视频时,尽量走快一点,不要停留!

    我手机拍的视频,绕着建筑物走一圈,拍了差不多五分钟,8100张图片,

    但是看图片的话帧间运动有点小,所以每隔5帧抽一帧出来训练,所以只有1600张图片。

    还简单训练了下LKVO,或者叫DDVO,收敛的确比较快,但是运动部分和黑色区域的预测简直

    就是反的!离的近的预测成了离的远!可能是我迭代次数不够。后续有时间再细读代码。

    搞 struct2depth 去了。

  • 相关阅读:
    架构设计的方法学 【转】
    异常处理
    Java中---HashSet中的Set()方法不能加重复值的原因,唯一性
    java中Set集合
    java中foreach语法和总结
    泛型的处理
    迭代器错误处理
    防重复提交
    mqtt安装和使用
    字符串正则替换
  • 原文地址:https://www.cnblogs.com/shepherd2015/p/10459748.html
Copyright © 2011-2022 走看看