NDDepth icon indicating copy to clipboard operation
NDDepth copied to clipboard

For training on a custom dataset

Open higash1 opened this issue 9 months ago • 0 comments

Hello, thank you for the great work and for providing access to the normal maps!

Is the normal map generation in your issue from the following repository's code? #4 https://github.com/wassryan/Deeplidar_v2/blob/master/surface_normal/tool.cpp

Could you provide the series of codes from generating the normals from the lidarmap provided by KITTI?

I exected it with the following code. The results are attached. `class NormalMap: def init(self) -> None: self.depth_map = None self.normal_map = None self.util_normal_map = np.zeros((375, 1242, 3), dtype=np.float32) # for the kitti dataset self.original_depth_path = '/home/NDdepth/Estimation/preprocess/0000000005.png' self.original_normal_path = '/home/NDdepth/Estimation/preprocess/normal_0000000005.png'

    self.load_depth_map()
    self.load_original_normal_map()
    # print(self.normal_map[:,:,0].sum(axis=1))
    self.sparse_depth2normal(100)
    # self.convert()
    # self.answer()
    exit()
    # print(self.depth_map.sum(axis=0).sum(axis=0))
    # print(self.normal_map.sum(axis=0).sum(axis=0))

def load_depth_map(self):
    depth_map = cv2.imread(self.original_depth_path, cv2.IMREAD_UNCHANGED)
    depth_map = depth_map.astype(np.float32) / 255.0
    self.depth_map = depth_map

def load_original_normal_map(self):
    normal_map = cv2.imread(self.original_normal_path, cv2.IMREAD_UNCHANGED)
    normal_map = normal_map.astype(np.float32) / 255.0
    self.normal_map = normal_map
    
    # cv2.imwrite('normal.png', self.normal_map)
    cv2.imshow('normal', self.normal_map)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def search_neighbor_x(self, img, i, j, circle_size):
    rows, cols = img.shape
    neighborx = -1
    for idx1 in range(circle_size):
        idx = idx1 + 1
        if i + idx >= rows:
            continue
        else:
            if img[i + idx, j] != 0.0:
                neighborx = i + idx
                break
    return neighborx

def search_neighbor_y(self, img, i, j, circle_size):
    rows, cols = img.shape
    neighbory = -1
    for idx1 in range(circle_size):
        idx = idx1 + 1
        if j + idx >= cols:
            continue
        else:
            if img[i, j + idx] != 0.0:
                neighbory = j + idx
                break
    return neighbory

def sparse_depth2normal(self, circle_size):
    f = 716.88
    cx , cy = 596.5593, 149.854
    # f = 518.8579
    # cx , cy = 607.1928, 161.2157
    normals = np.zeros_like(self.util_normal_map, dtype=np.float32)
    # depth = input.astype(np.float32)

    rows, cols = self.depth_map.shape

    for i in range(rows):
        for j in range(cols):
            if self.depth_map[i, j] != 0.0:
                neighborx = self.search_neighbor_x(self.depth_map, i, j, circle_size)
                neighbory = self.search_neighbor_y(self.depth_map, i, j, circle_size)
                if neighborx == -1 or neighbory == -1:
                    continue
                else:
                    x = (j - cx) * self.depth_map[i, j] / f
                    y = (i - cy) * self.depth_map[i, j] / f
                    z = self.depth_map[i, j]
                    x1 = (neighbory - cx) * self.depth_map[i, neighbory] / f
                    y1 = (i - cy) * self.depth_map[i, neighbory] / f
                    z1 = self.depth_map[i, neighbory]
                    x2 = (j - cx) * self.depth_map[neighborx, j] / f
                    y2 = (i + 1 - cy) * self.depth_map[neighborx, j] / f
                    z2 = self.depth_map[neighborx, j]
                    x3 = np.array([x1-x, y1-y, z1-z])
                    y3 = np.array([x2-x, y2-y, z2-z])
                    d:np.ndarray = np.cross(x3, y3)
                    n = d / np.linalg.norm(d)
                    normals[i, j, :] = n

    res = np.zeros_like(normals)
    res[:, :, 0] = -1.0 * normals[:, :, 0]
    res[:, :, 2] = -1.0 * normals[:, :, 1]
    res[:, :, 1] = -1.0 * normals[:, :, 2]

    mask = np.any(res != 0, axis=2)
    res[mask] += 1.0

    res *= 127.5
    res = res.astype(np.uint8)
    res = cv2.cvtColor(res, cv2.COLOR_BGR2RGB)
    self.util_normal_map = res
    # cv2.imwrite('make_normal.png', self.util_normal_map)
    cv2.imshow('normal', self.util_normal_map)
    cv2.waitKey(0)
    cv2.destroyAllWindows()`

your gt normal normal_0000000005

my gt normal make_normal

Thank you.

higash1 avatar May 14 '24 08:05 higash1