接续上篇文章nuScenes数据集3Dbounding box的更新,本篇文章主要讲解如何从图像的3dbox转到2dbox(内附源码)
注意:在nuScenes源码文件下有一个get_2d_annotation_as_json.py,运行之后可以直接得到2d注释信息,但是小编在运行得到后,发现会有遗漏,也就是多个相机下的sanples数量不等。因此加以改进得到所有的注释信息。
代码如下:
def view_points(points: np.ndarray, view: np.ndarray, normalize: bool) -> np.ndarray:
# points就是我们的3d框的8个角坐标;view就是我们所需要用到对应相机的相机内参。
assert view.shape[0] <= 4
assert view.shape[1] <= 4
assert points.shape[0] == 3
viewpad = np.eye(4)
viewpad[:view.shape[0], :view.shape[1]] = view
nbr_points = points.shape[1]
points = np.concatenate((points, np.ones((1, nbr_points))))
points = np.dot(viewpad, points)
points = points[:3, :]
if normalize:
points = points / points[2:3, :].repeat(3, 0).reshape(3, nbr_points)
return points
def post_process_coords(corner_coords: List,
imsize: Tuple[int, int] = (1600, 900)) -> Union[Tuple[float, float, float, float], None]:
polygon_from_2d_box = MultiPoint(corner_coords).convex_hull # 多边形
img_canvas = box(0, 0, imsize[0], imsize[1]) # 图像的画布 box(minx,miny,maxx,maxy)左上右下
if polygon_from_2d_box.intersects(img_canvas): # 如果相交
img_intersection = polygon_from_2d_box.intersection(img_canvas)
intersection_coords = np.array([coord for coord in img_intersection.exterior.coords])
min_x = min(intersection_coords[:, 0])
min_y = min(intersection_coords[:, 1])
max_x = max(intersection_coords[:, 0])
max_y = max(intersection_coords[:, 1])
return min_x, min_y, max_x, max_y
else:
return None
在生成2dbox的时候,加入了id信息。
从上面相连的两帧可以看出,同一个物体的id号是没有改变的,可以很好的应用到数据集的检测、跟踪过程。
放一个场景下的一段GIF图:
从这里可以更清楚的看到一个scene下,目标的id是始终保持一致的。
源码链接
获取源码后,需要更改dataroot,确保数据集的路径准确。在pycharm上直接运行draw_2d_box.py即可;另外一个py文件是把同一场景下的6个摄像机的图片放在一起。