Я работаю над проектом с моделью PointPillars, я пытаюсь добавить к модели маску, которая находится в указанном диапазоне xyz, маска с перебором всех возможных значений и выводом отфильтрованного облака точек. Я добавляю маску в test.py, и до того, как я добавил эту маску, все работало нормально. Я использую вложенный цикл for для перебора всех возможных значений маски со значением шага 0,16. Вот код после добавления маски.
Traceback (most recent call last):
File "test.py", line 158, in
main(args)
File "test.py", line 98, in main
result_filter = keep_bbox_from_image_range(result_filter, tr_velo_to_cam, r0_rect, P2, image_shape)
File "C:\Users\1016b\PointPillars\utils\process.py", line 561, in keep_bbox_from_image_range
lidar_bboxes = result['lidar_bboxes']
TypeError: tuple indices must be integers or slices, not str
Я знаю, что лидар_bboxes = result['lidar_bboxes'] не был проблемой, потому что он был взят из исходного кода, и я его вообще не редактировал. Может ли кто-нибудь помочь мне решить, в чем может быть проблема?
вот исходная ссылка на github Pointpillars: PointPillars
Я подумал, что это может быть потому, что после Я добавил фильтр, который может сгенерировать какой-то пустой результат, и передать его в «lidar_bboxes», поэтому я добавил условие, проверяющее, пуст ли result_filter, но это не сработало, у меня все равно возникла та же проблема.
Я работаю над проектом с моделью PointPillars, я пытаюсь добавить к модели маску, которая находится в указанном диапазоне xyz, маска с перебором всех возможных значений и выводом отфильтрованного облака точек. Я добавляю маску в test.py, и до того, как я добавил эту маску, все работало нормально. Я использую вложенный цикл for для перебора всех возможных значений маски со значением шага 0,16. Вот код после добавления маски. [code]import argparse import cv2 import numpy as np import os import torch import pdb
from utils import setup_seed, read_points, read_calib, read_label, \ keep_bbox_from_image_range, keep_bbox_from_lidar_range, vis_pc, \ vis_img_3d, bbox3d2corners_camera, points_camera2image, \ bbox_camera2lidar from model import PointPillars
def point_range_filter(pts, x_min, x_max, yl, yr, z_max): ''' Applies the XYZ mask to filter points within the given ranges. ''' mask_x = (pts[:, 0] > x_min) & (pts[:, 0] < x_max) mask_y_left = pts[:, 1] > yl mask_y_right = pts[:, 1] < yr mask_z = pts[:, 2] < z_max
def main(args): CLASSES = { 'Pedestrian': 0, 'Cyclist': 1, 'Car': 2 } LABEL2CLASSES = {v:k for k, v in CLASSES.items()} pcd_limit_range = np.array([0, -40, -3, 70.4, 40, 0.0], dtype=np.float32)
if not args.no_cuda: model = PointPillars(nclasses=len(CLASSES)).cuda() model.load_state_dict(torch.load(args.ckpt)) else: model = PointPillars(nclasses=len(CLASSES)) model.load_state_dict( torch.load(args.ckpt, map_location=torch.device('cpu')))
if not os.path.exists(args.pc_path): raise FileNotFoundError pc = read_points(args.pc_path)
for x in np.arange(x_min, x_max, step): for yl in np.arange(y_min, y_max, step): for yr in np.arange(yl + step, y_max, step): for z in np.arange(z_min, z_max, step):
# Apply the mask to the point cloud filtered_pc = point_range_filter(pc, x, x_max, yl, yr, z) #pc, x, x_max, yl, yr, z(for dynamic mask) #pc, x_min=0, x_max=70.4, yl=-39.68, yr=39.68, z_max=1(for fixed mask)
if filtered_pc.size == 0: continue pc_torch = torch.from_numpy(filtered_pc)
if os.path.exists(args.calib_path): calib_info = read_calib(args.calib_path) else: calib_info = None
if os.path.exists(args.gt_path): gt_label = read_label(args.gt_path) else: gt_label = None
if os.path.exists(args.img_path): img = cv2.imread(args.img_path, 1) else: img = None
model.eval() with torch.no_grad(): if not args.no_cuda: pc_torch = pc_torch.cuda()
if calib_info is not None and img is not None: tr_velo_to_cam = calib_info['Tr_velo_to_cam'].astype(np.float32) r0_rect = calib_info['R0_rect'].astype(np.float32) P2 = calib_info['P2'].astype(np.float32)
if calib_info is not None and img is not None: bboxes2d, camera_bboxes = result_filter['bboxes2d'], result_filter['camera_bboxes'] bboxes_corners = bbox3d2corners_camera(camera_bboxes) image_points = points_camera2image(bboxes_corners, P2) img = vis_img_3d(img, image_points, labels, rt=True)
if calib_info is not None and gt_label is not None: tr_velo_to_cam = calib_info['Tr_velo_to_cam'].astype(np.float32) r0_rect = calib_info['R0_rect'].astype(np.float32)
if img is not None: bboxes_corners = bbox3d2corners_camera(bboxes_camera) image_points = points_camera2image(bboxes_corners, P2) gt_labels = [-1] * len(gt_label['name']) img = vis_img_3d(img, image_points, gt_labels, rt=True)
if calib_info is not None and img is not None: cv2.imshow(f'{os.path.basename(args.img_path)}-3d bbox', img) cv2.waitKey(0)
if __name__ == '__main__': parser = argparse.ArgumentParser(description='Configuration Parameters') parser.add_argument('--ckpt', default='pretrained/epoch_160.pth', help='your checkpoint for kitti') parser.add_argument('--pc_path', help='your point cloud path') parser.add_argument('--calib_path', default='', help='your calib file path') parser.add_argument('--gt_path', default='', help='your ground truth path') parser.add_argument('--img_path', default='', help='your image path') parser.add_argument('--no_cuda', action='store_true', help='whether to use cuda') args = parser.parse_args()
main(args)
[/code] но когда я пытался его запустить, выдает эту ошибку [code]Traceback (most recent call last): File "test.py", line 158, in main(args) File "test.py", line 98, in main result_filter = keep_bbox_from_image_range(result_filter, tr_velo_to_cam, r0_rect, P2, image_shape) File "C:\Users\1016b\PointPillars\utils\process.py", line 561, in keep_bbox_from_image_range lidar_bboxes = result['lidar_bboxes'] TypeError: tuple indices must be integers or slices, not str [/code] Я знаю, что лидар_bboxes = result['lidar_bboxes'] не был проблемой, потому что он был взят из исходного кода, и я его вообще не редактировал. Может ли кто-нибудь помочь мне решить, в чем может быть проблема? вот исходная ссылка на github Pointpillars: PointPillars Я подумал, что это может быть потому, что после Я добавил фильтр, который может сгенерировать какой-то пустой результат, и передать его в «lidar_bboxes», поэтому я добавил условие, проверяющее, пуст ли result_filter, но это не сработало, у меня все равно возникла та же проблема.