Как оценить ось Z (глубину) объекта на 2D-изображении?Python

Программы на Python
Ответить
Anonymous
 Как оценить ось Z (глубину) объекта на 2D-изображении?

Сообщение Anonymous »

Я создаю веб-приложение, в котором получаю изображение из внешнего интерфейса, а затем сегментирую объекты внутри изображения с помощью модели сегментации изображения YOLOv9. После обнаружения и сегментации объектов я отправляю обнаруженное объектом изображение и соответствующие данные обратно во внешний интерфейс для отображения.
Затем пользователь может обратиться к другому API из внешнего интерфейса, предоставив изображение и указав какой объект они хотят удалить. В этом API я также пытаюсь вычислить глубину (значение оси Z) указанного объекта. Я попробовал несколько подходов, но не получил точного значения глубины. Это значение имеет решающее значение для рендеринга 3D-объекта во внешнем интерфейсе, чтобы он выглядел так, как будто он существует в реальной среде.
Я использую модель YOLOv9 для сегментации объектов и работаю над этим. оценка глубины (значения оси Z) конкретного объекта на 2D-изображении. У меня есть следующая информация:
2D-ограничивающая рамка или ключевые точки объекта на изображении.
Внутренние параметры камеры, в том числе:
Фокусное расстояние в пикселях.Ширина и высота изображения.
Метаданные Exif, такие как фокусное расстояние в мм, размер сенсора и т. д.
Координаты ограничивающей рамки объекта на изображении (в формате XYXY или XYWH).
Моя цель — оценить значение оси Z (глубину) обнаруженного объекта относительно положения камеры, что важно для реалистичного 3D-рендеринга.
Вопросы:
  • Подходит ли эта формула или подход для оценки значения оси Z в 2D-изображениях?
  • Как можно усовершенствовать этот подход или Есть ли более точный способ получить значение оси Z, используя предоставленные двумерные координаты и внутренние параметры?
  • Должен ли я использовать какой-либо другой метод или инструмент, например, модели оценки глубины, чтобы добиться более точного результата?
  • Можно ли в этом случае использоватьsolvePnP, и если да, то как я могу для него аппроксимировать 3D-точки?
Чего я хочу достичь:
Я хочу оценить значение оси Z (глубину) объекта относительно камеры. У меня нет мировых трехмерных координат, но я хочу вычислить приблизительное значение Z, используя заданные двухмерные координаты и информацию о камере.
Я пробовал:

def depth_map_apple(image_path):
device = 0 if torch.cuda.is_available() else -1
pipe = pipeline(task="depth-estimation", model="depth-anything/Depth-Anything-V2-Small-hf",device=device)
res = pipe(image_path)
predicted_depth=res['predicted_depth']
depth_map_np=predicted_depth.squeeze().numpy()
depth_map_np_normalized = (depth_map_np - depth_map_np.min()) / (depth_map_np.max() - depth_map_np.min())
depth_map_np_normalized = (depth_map_np_normalized * 255).astype(np.uint8)
return depth_map_np_normalized
# I have also tried by extracting the sub_array based on the co-orinate of the object in the map
# sub_array = depth_img[y1:y2, x1:x2]
# height, width = sub_array.shape
# center_y = height // 2
# center_x = width // 2
# z_value = sub_array[int(center_y), int(center_x)]


Я также попробовал то же самое, что и с моделью оценки глубины Midas. Вы можете найти код ниже

def XYZ_index(cordinatesOfObj,image_path):
x1, y1, x2, y2 = cordinatesOfObj[0] ,cordinatesOfObj[1] ,cordinatesOfObj[2] ,cordinatesOfObj[3]
model_type = "MiDaS_small"
midas = torch.hub.load("intel-isl/MiDaS", model_type)
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
midas.to(device)
midas_transforms = torch.hub.load("intel-isl/MiDaS", "transforms")
if model_type == "DPT_Large" or model_type == "DPT_Hybrid":
transform = midas_transforms.dpt_transform
else:
transform = midas_transforms.small_transform
img = cv2.imread(image_path)
input_batch = transform(img).to(device)
with torch.no_grad():
prediction = midas(input_batch)

prediction = torch.nn.functional.interpolate(
prediction.unsqueeze(1),
size=img.shape[:2],
mode="bicubic",
align_corners=False,
).squeeze()

depth_map = prediction.cpu().numpy()
# object_depth_values = depth_map[int(y1):int(y2), int(x1):int(x2)]

# # mean_depth = cv2.minMaxLoc(object_depth_values)
# mean_depth = np.mean(object_depth_values)
return depth_map


Я также пробовал описанные ниже методы
X_center = (cordinatesOfObj[0] + cordinatesOfObj[2]) // 2
y_center = (cordinatesOfObj[1] + cordinatesOfObj[3]) // 2
z_index = ((X_center**2) + (y_center**2))//(1/2)
z_index = np.exp(-(X_center ** 2).sum(1)) XYZ_index(cordinatesOfObj,image_path)
print("image_intance ", image_intance)
z_index = np.sqrt((cordinatesOfObj[0]+cordinatesOfObj[1]+cordinatesOfObj[2]+cordinatesOfObj[3])/4)
z_index = (cordinatesOfObj[0]+cordinatesOfObj[1]+cordinatesOfObj[2]+cordinatesOfObj[3])/4,


Подробнее здесь: https://stackoverflow.com/questions/790 ... a-2d-image
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»