在win10 pycharm中复现代码报错
源代码:https://github.com/cv-rits/MonoScene
环境变量设置:
数据集文件格式:
eval_monoscene.py代码:
if __name__ == '__main__':
import sys
import os
sys.path.append(sys.path[0]+'/../..')
from pytorch_lightning import Trainer
from monoscene.models.monoscene import MonoScene
from monoscene.data.NYU.nyu_dm import NYUDataModule
from monoscene.data.semantic_kitti.kitti_dm import KittiDataModule
import hydra
from omegaconf import DictConfig
import torch
import os
from hydra.utils import get_original_cwd
@hydra.main(config_name="../config/monoscene.yaml")
def main(config: DictConfig):
torch.set_grad_enabled(False)
if config.dataset == "kitti":
config.batch_size = 1
n_classes = 20
feature = 64
project_scale = 2
full_scene_size = (256, 256, 32)
data_module = KittiDataModule(
root=config.kitti_root,
preprocess_root=config.kitti_preprocess_root,
frustum_size=config.frustum_size,
batch_size=int(config.batch_size / config.n_gpus),
num_workers=int(config.num_workers_per_gpu * config.n_gpus),
)
elif config.dataset == "NYU":
config.batch_size = 2
project_scale = 1
n_classes = 12
feature = 200
full_scene_size = (60, 36, 60)
data_module = NYUDataModule(
root=config.NYU_root,
preprocess_root=config.NYU_preprocess_root,
n_relations=config.n_relations,
frustum_size=config.frustum_size,
batch_size=int(config.batch_size / config.n_gpus),
num_workers=int(config.num_workers_per_gpu * config.n_gpus),
)
trainer = Trainer(
sync_batchnorm=True, deterministic=True, gpus=config.n_gpus, accelerator="ddp"
)
if config.dataset == "NYU":
model_path = os.path.join(
get_original_cwd(), "trained_models", "monoscene_nyu.ckpt"
)
else:
model_path = os.path.join(
get_original_cwd(), "trained_models", "monoscene_kitti.ckpt"
)
model = MonoScene.load_from_checkpoint(
model_path,
feature=feature,
project_scale=project_scale,
fp_loss=config.fp_loss,
full_scene_size=full_scene_size,
)
model.eval()
data_module.setup()
val_dataloader = data_module.val_dataloader()
trainer.test(model, test_dataloaders=val_dataloader)
if __name__ == "__main__":
main()
kitti_dataset.py 代码:
import torch
import os
import glob
from torch.utils.data import Dataset
import numpy as np
from PIL import Image
from torchvision import transforms
from monoscene.data.utils.helpers import (
vox2pix,
compute_local_frustums,
compute_CP_mega_matrix,
)
class KittiDataset(Dataset):
def __init__(
self,
split,
root,
preprocess_root,
project_scale=2,
frustum_size=4,
color_jitter=None,
fliplr=0.0,
):
super().__init__()
self.root = root
self.label_root = os.path.join(preprocess_root, "labels")
self.n_classes = 20
splits = {
"train": ["00", "01", "02", "03", "04", "05", "06", "07", "09", "10"],
"val": ["08"],
"test": ["11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21"],
}
self.split = split
self.sequences = splits[split]
self.frustum_size = frustum_size
self.project_scale = project_scale
self.output_scale = int(self.project_scale / 2)
self.scene_size = (51.2, 51.2, 6.4)
self.vox_origin = np.array([0, -25.6, -2])
self.fliplr = fliplr
self.voxel_size = 0.2 # 0.2m
self.img_W = 1220
self.img_H = 370
self.color_jitter = (
transforms.ColorJitter(*color_jitter) if color_jitter else None
)
self.scans = []
for sequence in self.sequences:
calib = self.read_calib(
os.path.join(self.root, "dataset", "sequences", sequence, "calib.txt")
)
P = calib["P2"]
T_velo_2_cam = calib["Tr"]
proj_matrix = P @ T_velo_2_cam
glob_path = os.path.join(
self.root, "dataset", "sequences", sequence, "voxels", "*.bin"
)
for voxel_path in glob.glob(glob_path):
self.scans.append(
{
"sequence": sequence,
"P": P,
"T_velo_2_cam": T_velo_2_cam,
"proj_matrix": proj_matrix,
"voxel_path": voxel_path,
}
)
self.normalize_rgb = transforms.Compose(
[
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]
),
]
)
def __getitem__(self, index):
scan = self.scans[index]
voxel_path = scan["voxel_path"]
sequence = scan["sequence"]
P = scan["P"]
T_velo_2_cam = scan["T_velo_2_cam"]
proj_matrix = scan["proj_matrix"]
filename = os.path.basename(voxel_path)
frame_id = os.path.splitext(filename)[0]
rgb_path = os.path.join(
self.root, "dataset", "sequences", sequence, "image_2", frame_id + ".png"
)
data = {
"frame_id": frame_id,
"sequence": sequence,
"P": P,
"T_velo_2_cam": T_velo_2_cam,
"proj_matrix": proj_matrix,
}
scale_3ds = [self.output_scale, self.project_scale]
data["scale_3ds"] = scale_3ds
cam_k = P[0:3, 0:3]
data["cam_k"] = cam_k
for scale_3d in scale_3ds:
# compute the 3D-2D mapping
projected_pix, fov_mask, pix_z = vox2pix(
T_velo_2_cam,
cam_k,
self.vox_origin,
self.voxel_size * scale_3d,
self.img_W,
self.img_H,
self.scene_size,
)
data["projected_pix_{}".format(scale_3d)] = projected_pix
data["pix_z_{}".format(scale_3d)] = pix_z
data["fov_mask_{}".format(scale_3d)] = fov_mask
target_1_path = os.path.join(self.label_root, sequence, frame_id + "_1_1.npy")
target = np.load(target_1_path)
data["target"] = target
target_8_path = os.path.join(self.label_root, sequence, frame_id + "_1_8.npy")
target_1_8 = np.load(target_8_path)
CP_mega_matrix = compute_CP_mega_matrix(target_1_8)
data["CP_mega_matrix"] = CP_mega_matrix
# Compute the masks, each indicate the voxels of a local frustum
if self.split != "test":
projected_pix_output = data["projected_pix_{}".format(self.output_scale)]
pix_z_output = data[
"pix_z_{}".format(self.output_scale)
]
frustums_masks, frustums_class_dists = compute_local_frustums(
projected_pix_output,
pix_z_output,
target,
self.img_W,
self.img_H,
dataset="kitti",
n_classes=20,
size=self.frustum_size,
)
else:
frustums_masks = None
frustums_class_dists = None
data["frustums_masks"] = frustums_masks
data["frustums_class_dists"] = frustums_class_dists
img = Image.open(rgb_path).convert("RGB")
# Image augmentation
if self.color_jitter is not None:
img = self.color_jitter(img)
# PIL to numpy
img = np.array(img, dtype=np.float32, copy=False) / 255.0
img = img[:370, :1220, :] # crop image
# Fliplr the image
if np.random.rand() < self.fliplr:
img = np.ascontiguousarray(np.fliplr(img))
for scale in scale_3ds:
key = "projected_pix_" + str(scale)
data[key][:, 0] = img.shape[1] - 1 - data[key][:, 0]
data["img"] = self.normalize_rgb(img)
return data
def __len__(self):
return len(self.scans)
@staticmethod
def read_calib(calib_path):
"""
Modify from https://github.com/utiasSTARS/pykitti/blob/d3e1bb81676e831886726cc5ed79ce1f049aef2c/pykitti/utils.py#L68
:param calib_path: Path to a calibration text file.
:return: dict with calibration matrices.
"""
calib_all = {}
with open(calib_path, "r") as f:
for line in f.readlines():
if line == "\n":
break
key, value = line.split(":", 1)
calib_all[key] = np.array([float(x) for x in value.split()])
# reshape matrices
calib_out = {}
# 3x4 projection matrix for left camera
calib_out["P2"] = calib_all["P2"].reshape(3, 4)
calib_out["Tr"] = np.identity(4) # 4x4 matrix
calib_out["Tr"][:3, :4] = calib_all["Tr"].reshape(3, 4)
return calib_out
PS F:\Studying\CY-Workspace\MonoScene-master> python monoscene/scripts/eval_monoscene.py dataset=kitti kitti_root=$KITTI_ROOT kitti_preprocess_root=$KITTI_PREPROCESS n_gpus=1 batch_size=1
GPU available: True, used: True
TPU available: False, using: 0 TPU cores
IPU available: False, using: 0 IPUs
n_relations 4
Using cache found in C:\Users\DELL/.cache\torch\hub\rwightman_gen-efficientnet-pytorch_master
Loading base model ()...Done.
Removing last two layers (global_pool & classifier).
Building Encoder-Decoder model..Done.
Traceback (most recent call last):
File "monoscene/scripts/eval_monoscene.py", line 71, in main
data_module.setup()
File "F:\anaconda\envs\monoscene\lib\site-packages\pytorch_lightning\core\datamodule.py", line 440, in wrapped_fn
fn(*args, **kwargs)
File "F:\Studying\CY-Workspace\MonoScene-master\monoscene\scripts/../..\monoscene\data\semantic_kitti\kitti_dm.py", line 34, in setup
color_jitter=(0.4, 0.4, 0.4),
File "F:\Studying\CY-Workspace\MonoScene-master\monoscene\scripts/../..\monoscene\data\semantic_kitti\kitti_dataset.py", line 55, in __init__
os.path.join(self.root, "dataset", "sequences", sequence, "calib.txt")
File "F:\Studying\CY-Workspace\MonoScene-master\monoscene\scripts/../..\monoscene\data\semantic_kitti\kitti_dataset.py", line 188, in read_calib
with open(calib_path, "r") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'dataset\\sequences\\00\\calib.txt'
Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace.
数据集路径问题?
环境变量设置问题?
文件路径不对。引用的图片地址不对,用绝对路径吧。