Esempio n. 1
0
 def update_supervised(self, imL_src, imR_src, dispL):
     assert len(imL_src.shape) == 4
     bn, c, h0, w0 = imL_src.shape
     sw, sh, ew, eh = mycrop(w0, h0, self.size_crop, size_cell=64)
     # image prepare
     imL = imL_src[:, :, sh:eh, sw:ew]
     imR = imR_src[:, :, sh:eh, sw:ew]
     dispL = dispL[:, :, sh:eh, sw:ew]
     imL = to_tensor(imL, volatile=False, requires_grad=False)
     imR = to_tensor(imR, volatile=False, requires_grad=False)
     dispL = to_tensor(dispL, volatile=False, requires_grad=False)
     # disp estimate
     scale_dispLs, dispLs = self.predict(imL, imR)
     # compute loss and backward
     args = {
         "disp_gt": dispL,
         "disps": dispLs,
         "scale_disps": scale_dispLs,
         "flag_smooth": True,
     }
     loss = self.lossfun(args)
     self.optim.zero_grad()
     loss.backward()
     self.optim.step()
     self.updated += 1
     self.lr_adjust()
     return loss.data[0]
Esempio n. 2
0
def test():
    dirpath = r"/media/qjc/D/data/testimgs_stereo/"
    #    img1 = load_image(dirpath + "im0.png").transpose(2, 0, 1)[None]/255.0
    #    img2 = load_image(dirpath + "im1.png").transpose(2, 0, 1)[None]/255.0
    #    disp1 = load_disp(dirpath + "disp0.pfm")[None, None]/1.0
    #    disp2 = load_disp(dirpath + "disp1.pfm")[None, None]/1.0
    img1 = load_image(dirpath + "im2.ppm").transpose(2, 0, 1)[None] / 255.0
    img2 = load_image(dirpath + "im6.ppm").transpose(2, 0, 1)[None] / 255.0
    disp1 = load_disp(dirpath + "disp2.pgm")[None, None] / 8.0
    disp2 = load_disp(dirpath + "disp6.pgm")[None, None] / 8.0
    #    img1 = load_image(dirpath + "10L.png").transpose(2, 0, 1)[None]/255.0
    #    img2 = load_image(dirpath + "10R.png").transpose(2, 0, 1)[None]/255.0
    #    disp1 = load_disp(dirpath + "disp10L.png")[None, None]
    #    disp2 = load_disp(dirpath + "disp10R.png")[None, None]
    im1 = to_tensor(img1)
    im2 = to_tensor(img2)
    d1 = to_tensor(disp1)
    d2 = to_tensor(disp2)
    im1t = imwrap_BCHW(im2, -d1)
    im2t = imwrap_BCHW(im1, d2)
    ssim = SSIM(window_size=11)
    ssim1 = ssim(im1, im1t)
    ssim2 = ssim(im2, im2t)
    ssim3 = ssim(im1, im2)
    abs1 = torch.abs(im1 - im1t).sum(dim=1, keepdim=True)
    abs2 = torch.abs(im2 - im2t).sum(dim=1, keepdim=True)
    print ssim1.shape, ssim2.shape
    print ssim1.mean().data[0], ssim2.mean().data[0], ssim3.mean().data[0]
    imsplot_tensor(im1, im2, im1t, im2t, 1 - ssim1, 1 - ssim2, abs1, abs2)
    plt.show()
Esempio n. 3
0
 def update_self(self, imL_src, imR_src):
     assert len(imL_src.shape) == 4
     bn, c, h0, w0 = imL_src.shape
     sw, sh, ew, eh = mycrop(w0, h0, self.size_crop, size_cell=64)
     # image prepare
     imL = imL_src[:, :, sh:eh, sw:ew]
     imR = imR_src[:, :, sh:eh, sw:ew]
     imL = to_tensor(imL, volatile=False, requires_grad=False)
     imR = to_tensor(imR, volatile=False, requires_grad=False)
     # disp estimate
     dispLs = self.model(imL, imL)
     dispRs = self.model(imR, imR)
     # compute loss and backward
     loss = 0
     for disp in dispLs:
         loss = loss + disp.mean()
     for disp in dispRs:
         loss = loss + disp.mean()
     self.optim.zero_grad()
     loss.backward()
     self.optim.step()
Esempio n. 4
0
 def update_selfsupervised(self, imL_src, imR_src):
     assert len(imL_src.shape) == 4
     if (torch.is_tensor(imL_src)):
         imL_src = imL_src.numpy()
         imR_src = imR_src.numpy()
     bn, c, h0, w0 = imL_src.shape
     sw, sh, ew, eh = mycrop(w0, h0, self.size_crop, size_cell=64)
     # image prepare
     imL = imL_src[:, :, sh:eh, sw:ew]
     imR = imR_src[:, :, sh:eh, sw:ew]
     imL1 = np.flip(imR, axis=-1).copy()
     imR1 = np.flip(imL, axis=-1).copy()
     imL = to_tensor(imL, volatile=False, requires_grad=False)
     imR = to_tensor(imR, volatile=False, requires_grad=False)
     imL1 = to_tensor(imL1, volatile=False, requires_grad=False)
     imR1 = to_tensor(imR1, volatile=False, requires_grad=False)
     # disp estimate
     scale_dispLs, dispLs = self.predict(imL, imR)
     scale_dispL1s, dispL1s = self.predict(imL1, imR1)
     # compute loss and backward
     if (self.lossfun.flag_mask):
         imR_src = to_tensor(imR_src, requires_grad=False)
         imR1_src = to_tensor(np.flip(imL_src, axis=-1).copy(),
                              requires_grad=False)
         LeftTop = [sw, sh]
         LeftTop1 = [w0 - ew, sh]
     else:
         imR_src = imR
         imR1_src = imR1
         LeftTop = [0, 0]
         LeftTop1 = [0, 0]
     args = {
         "imR_src": imR_src,
         "imL": imL,
         "dispLs": dispLs,
         "scale_dispLs": scale_dispLs,
         "LeftTop": LeftTop,
         "imR1_src": imR1_src,
         "imL1": imL1,
         "dispL1s": dispL1s,
         "scale_dispL1s": scale_dispL1s,
         "LeftTop1": LeftTop1,
     }
     loss = self.lossfun(args)
     assert loss.data[0] > 0
     self.optim.zero_grad()
     loss.backward()
     self.optim.step()
     self.updated += 1
     self.lr_adjust()
     return loss.data[0]
Esempio n. 5
0
    def augment_color_pair(self, left_image, right_image):
        # randomly augment image
        bn, c = left_image.shape[:2]
        # randomly shift gamma
        do_augment = torch.rand(1)[0]
        if (do_augment > 0.5):
            random_gamma = to_tensor(torch.rand(bn) * 0.4 + 0.8)
            left_image = (left_image.transpose(0, -1)**random_gamma).transpose(
                0, -1)
            random_gamma = to_tensor(torch.rand(bn) * 0.4 + 0.8)
            right_image = (right_image.transpose(0,
                                                 -1)**random_gamma).transpose(
                                                     0, -1)

        # randomly shift brightness
        do_augment = torch.rand(1)[0]
        if (do_augment > 0.5):
            random_brightness = to_tensor(torch.rand(bn) * 1.5 + 0.5)
            left_image = (left_image.transpose(0, -1) *
                          random_brightness).transpose(0, -1)
            random_brightness = to_tensor(torch.rand(bn) * 1.5 + 0.5)
            right_image = (right_image.transpose(0, -1) *
                           random_brightness).transpose(0, -1)

        # randomly shift color
        do_augment = torch.rand(1)[0]
        if (do_augment > 0.5):
            random_colors = torch.rand(bn, c) * 0.4 + 0.8
            color_image = (torch.ones(left_image.shape).permute(2, 3, 0, 1) *
                           random_colors).permute(2, 3, 0, 1)
            left_image = left_image * to_tensor(color_image)
            random_colors = torch.rand(bn, c) * 0.4 + 0.8
            color_image = (torch.ones(left_image.shape).permute(2, 3, 0, 1) *
                           random_colors).permute(2, 3, 0, 1)
            right_image = right_image * to_tensor(color_image)

        # saturate
        do_augment = torch.rand(1)[0]
        if (do_augment > 0.5):
            left_image = left_image.clamp(0, 1)
            right_image = right_image.clamp(0, 1)

        return left_image, right_image
Esempio n. 6
0
 def estimate(self, imL, imR):
     imL = to_tensor(imL, volatile=True, requires_grad=False)
     imR = to_tensor(imR, volatile=True, requires_grad=False)
     _, dispLs = self.model(imL, imR)
     return to_numpy(dispLs[0])
Esempio n. 7
0
import matplotlib.pyplot as plt
from util.util import to_tensor, imsplot_tensor
from dataloader.imagerw import load_image, load_disp #, save_image
from loss import losses

if __name__ == "__main__":
    dirpath = r"/media/qjc/D/data/testimgs_stereo/"
#    img1 = load_image(dirpath + "im0.png").transpose(2, 0, 1)[None]/255.0
#    img2 = load_image(dirpath + "im1.png").transpose(2, 0, 1)[None]/255.0
#    disp1 = load_disp(dirpath + "disp0.pfm")[None, None]/1.0
#    disp2 = load_disp(dirpath + "disp1.pfm")[None, None]/1.0
    img1 = load_image(dirpath + "im2.ppm").transpose(2, 0, 1)[None]/255.0
    img2 = load_image(dirpath + "im6.ppm").transpose(2, 0, 1)[None]/255.0
    disp1 = load_disp(dirpath + "disp2.pgm")[None, None]/8.0
    disp2 = load_disp(dirpath + "disp6.pgm")[None, None]/8.0
    img1t = to_tensor(np.flip(img2, axis=-1).copy())
    img2t = to_tensor(np.flip(img1, axis=-1).copy())
    img1 = to_tensor(img1, requires_grad=True)
    img2 = to_tensor(img2, requires_grad=True)
    disp1 = to_tensor(disp1, requires_grad=True)
    disp1t = to_tensor(np.flip(disp2, axis=-1).copy(), requires_grad=True)
   
    lossfun = losses(loss_name="depthmono")
    "imR_src, imL, dispLs, scale_dispLs, LeftTop, imR1_src, imL1, dispL1s, scale_dispL1s, LeftTop1"
    args = {
        "imR_src": img2, "imL": img1, "dispLs": [disp1], "scale_dispLs": [0], "LeftTop": [0, 0], 
        "imR1_src": img2t, "imL1": img1t, "dispL1s": [disp1t], "scale_dispL1s": [0], "LeftTop1": [0, 0], 
        }
    loss = lossfun(args)
    loss.backward(retain_graph=True)
    print loss.data[0]