在 Yolo v3 Darknet 中测量检测到的对象的 X、Y、Z 坐标
Posted
技术标签:
【中文标题】在 Yolo v3 Darknet 中测量检测到的对象的 X、Y、Z 坐标【英文标题】:Measuring X,Y,Z Coordinates of a detected object in Yolo v3 Darknet 【发布时间】:2021-04-26 14:01:49 【问题描述】:我已经训练了一个 Yolo 网络,以使用在 python 实现的 Darknet 环境中运行的 Yolo v3 检测道路上的物体。
我正在使用 Intel Realsense L515 和 Intel Realsense D435i。
如何获取检测到的物体的 X、Y、Z 坐标以及相机到物体本身的距离?
非常感谢任何帮助!
【问题讨论】:
在你知道他的大小的相机场上是否有可见的参考对象? 不是真的,目的是依靠激光雷达相机来测量距离并返回坐标,但我不确定如何使用 RealSense 和 YoLo 来实现。 【参考方案1】:基本上,您要进行的转换是投影的反向操作。我相信唯一重要的信息是你有一个深度相机和一个物体检测器产生的预测。您拥有的信息是 UV 坐标(在图像平面中)和深度(Z 坐标)。并且您想将 UVZ(像素坐标)转换为 XYZ(世界坐标)。注意 Z 在转换过程中不会改变。通用 Z 坐标允许您执行转换。
转换基于针孔相机型号https://en.wikipedia.org/wiki/Pinhole_camera_model。您需要知道捕获图像的相机的内在参数。这些参数是焦距f和主点。
您可能还想访问https://en.wikipedia.org/wiki/Camera_resectioning。您将在那里找到如何使用从焦距和主点创建的投影矩阵进行此转换。请注意,它们描述了从世界到像素坐标的投影。您需要计算逆投影矩阵来进行像素到世界的转换。
我还在 Tensorflow 中包含了一个使用投影矩阵的示例。
self.intrinsic_matrix = tf.constant([[self.focal_length[0], 0, self.principal_point[0], 0],
[0, self.focal_length[1], self.principal_point[1], 0],
[0, 0, 1, 0],
[0, 0, 0, 1]], dtype=tf.float32)
self.invr_projection_matrix = tf.linalg.inv(self.projection_matrix)
multiplied_uv = points_uvz[..., 0:2] * points_uvz[..., 2:3]
ones = tf.ones([points_uvz.shape[0], points_uvz.shape[1], 1], dtype=points_uvz.dtype)
multiplied_uvz1 = tf.concat([multiplied_uv, points_uvz[..., 2:3], ones], axis=-1)
tranposed_xyz = tf.matmul(self.invr_projection_matrix, multiplied_uvz1, transpose_b=True)
xyz = tf.transpose(tranposed_xyz, [0, 2, 1])[..., :3]
【讨论】:
谢谢,我将尝试在 python 中创建相同的解决方案。我唯一的问题是我希望能够执行您描述的转换,但使用 Python 和 Darknet(不是 Tensorflow)和/或通过使用 ROS。有什么想法吗?以上是关于在 Yolo v3 Darknet 中测量检测到的对象的 X、Y、Z 坐标的主要内容,如果未能解决你的问题,请参考以下文章