|
|
@ -106,57 +106,6 @@ class Worker(torchext.Worker): |
|
|
|
out = net(self.data['im0']) |
|
|
|
out = net(self.data['im0']) |
|
|
|
return out |
|
|
|
return out |
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
|
|
|
def find_corr_points_and_F(left, right): |
|
|
|
|
|
|
|
sift = cv2.SIFT_create() |
|
|
|
|
|
|
|
# find the keypoints and descriptors with SIFT |
|
|
|
|
|
|
|
kp1, des1 = sift.detectAndCompute(cv2.normalize(left, None, 0, 255, cv2.NORM_MINMAX).astype('uint8'), None) |
|
|
|
|
|
|
|
kp2, des2 = sift.detectAndCompute(cv2.normalize(right, None, 0, 255, cv2.NORM_MINMAX).astype('uint8'), None) |
|
|
|
|
|
|
|
# FLANN parameters |
|
|
|
|
|
|
|
FLANN_INDEX_KDTREE = 1 |
|
|
|
|
|
|
|
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) |
|
|
|
|
|
|
|
search_params = dict(checks=50) |
|
|
|
|
|
|
|
flann = cv2.FlannBasedMatcher(index_params, search_params) |
|
|
|
|
|
|
|
matches = flann.knnMatch(des1, des2, k=2) |
|
|
|
|
|
|
|
pts1 = [] |
|
|
|
|
|
|
|
pts2 = [] |
|
|
|
|
|
|
|
# ratio test as per Lowe's paper |
|
|
|
|
|
|
|
for i, (m, n) in enumerate(matches): |
|
|
|
|
|
|
|
if m.distance < 0.8 * n.distance: |
|
|
|
|
|
|
|
pts2.append(kp2[m.trainIdx].pt) |
|
|
|
|
|
|
|
pts1.append(kp1[m.queryIdx].pt) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pts1 = np.int32(pts1) |
|
|
|
|
|
|
|
pts2 = np.int32(pts2) |
|
|
|
|
|
|
|
F, mask = cv2.findFundamentalMat(pts1, pts2, cv2.FM_LMEDS) |
|
|
|
|
|
|
|
# We select only inlier points |
|
|
|
|
|
|
|
pts1 = pts1[mask.ravel() == 1] |
|
|
|
|
|
|
|
pts2 = pts2[mask.ravel() == 1] |
|
|
|
|
|
|
|
return pts1, pts2, F |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def calc_sgbm_gt(self): |
|
|
|
|
|
|
|
sgbm_matcher = cv2.StereoSGBM_create() |
|
|
|
|
|
|
|
disp_gt = [] |
|
|
|
|
|
|
|
# cam_view = np.array(np.array_split(self.data['im0'].detach().to('cpu').numpy(), 4)[2:]) |
|
|
|
|
|
|
|
# for i in range(self.data['im0'].shape[0]): |
|
|
|
|
|
|
|
for i in range(1): |
|
|
|
|
|
|
|
cam_view = self.data['im0'].detach().to('cpu').numpy()[i, 0] |
|
|
|
|
|
|
|
pattern = self.pattern_proj.to('cpu').numpy()[i, 0] |
|
|
|
|
|
|
|
pts_l, pts_r, F = self.find_corr_points_and_F(cam_view, pattern) |
|
|
|
|
|
|
|
H_l, _ = cv2.findHomography(pts_l, pts_r) |
|
|
|
|
|
|
|
H_r, _ = cv2.findHomography(pts_r, pts_l) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
left_rect = cv2.warpPerspective(cam_view, H_l, cam_view.shape) |
|
|
|
|
|
|
|
right_rect = cv2.warpPerspective(pattern, H_r, pattern.shape) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
transform = transforms.ToTensor() |
|
|
|
|
|
|
|
disparity_gt = transform(cv2.normalize( |
|
|
|
|
|
|
|
sgbm_matcher.compute(cv2.normalize(left_rect, None, 0, 255, cv2.NORM_MINMAX).astype('uint8'), |
|
|
|
|
|
|
|
cv2.normalize(right_rect, None, 0, 255, cv2.NORM_MINMAX).astype('uint8')), None, |
|
|
|
|
|
|
|
alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F).T) |
|
|
|
|
|
|
|
disp_gt.append(disparity_gt) |
|
|
|
|
|
|
|
return disp_gt |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def loss_forward(self, out, train): |
|
|
|
def loss_forward(self, out, train): |
|
|
|
out, edge = out |
|
|
|
out, edge = out |
|
|
|
if not (isinstance(out, tuple) or isinstance(out, list)): |
|
|
|
if not (isinstance(out, tuple) or isinstance(out, list)): |
|
|
@ -181,24 +130,8 @@ class Worker(torchext.Worker): |
|
|
|
edge0 = 1 - torch.sigmoid(edge[0]) |
|
|
|
edge0 = 1 - torch.sigmoid(edge[0]) |
|
|
|
val = 0 |
|
|
|
val = 0 |
|
|
|
if isinstance(out[0], tuple): |
|
|
|
if isinstance(out[0], tuple): |
|
|
|
# val = self.disparity_loss(out[0][1], edge0) |
|
|
|
# NOTE use supervised disparity loss |
|
|
|
# FIXME disparity_loss ist unsupervised, wir wollen supervised(?) |
|
|
|
|
|
|
|
# warum nicht einfach so die GT die wir eh schon haben? |
|
|
|
|
|
|
|
# gt = self.data[f'disp0'].type('torch.LongTensor') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val += self.sup_disp_loss(out[0][1], self.data['disp0']) |
|
|
|
val += self.sup_disp_loss(out[0][1], self.data['disp0']) |
|
|
|
# disp_gt = self.calc_sgbm_gt() |
|
|
|
|
|
|
|
# if len(disp_gt) > 1: |
|
|
|
|
|
|
|
# disparity_gt = torch.stack(disp_gt).to('cuda') |
|
|
|
|
|
|
|
# # val += self.sup_disp_loss(out[0][1], disparity_gt) |
|
|
|
|
|
|
|
# else: |
|
|
|
|
|
|
|
# disparity_gt = disp_gt[0].to('cuda') |
|
|
|
|
|
|
|
# val += self.sup_disp_loss(out[0][1][0], disparity_gt) |
|
|
|
|
|
|
|
# print(disparity_gt) |
|
|
|
|
|
|
|
# print(disparity_gt.shape) |
|
|
|
|
|
|
|
# print(out[0][1]) |
|
|
|
|
|
|
|
# print(out[0][1].shape) |
|
|
|
|
|
|
|
if isinstance(out[0], tuple): |
|
|
|
|
|
|
|
val += self.disparity_loss(out[0][0], edge0) |
|
|
|
val += self.disparity_loss(out[0][0], edge0) |
|
|
|
else: |
|
|
|
else: |
|
|
|
val += self.disparity_loss(out[0], edge0) |
|
|
|
val += self.disparity_loss(out[0], edge0) |
|
|
|