openmmlab环境搭建及模拟kitti数据集跑pointpillars模型

点云训练—openmmlab环境搭建及模拟kitti数据集跑pointpillars模型

1 环境搭建

在我的 linux 服务器上,基于ubuntu20.04

参见:开始你的第一步 — MMDetection3D 1.3.0 文档

1.1 本地环境已安装anaconda.

anaconda的安装参见博文:DS6.1-YOLOv5部署 爱吃油淋鸡的莫何 .详解如下:

!!!【执行脚本时不要sudo,否则会安装到root】
进入安装包目录,运行Anaconda脚本
   bash Anaconda3-5.2.0-Linux-x86_64.sh 
或
   bash Anaconda3-2020.02-Linux-x86_64.sh

一路 Enter 或 Yes , 如有是否安装Microsoft VSCode 选择No。

涉及到询问是否切换路径,可以切换安装路径,也可以不管它。

【naconda3 will now be installed into ths location: ...】

将Anaconda添加到用户环境变量中

vim ~/.bashrc  然后“i”表示插入。
添加下面内容
export PATH="/home/mec/anaconda3/bin:$PATH"
然后“Esc”,":wq"退出再回车
source一下
source ~/.bashrc
# 执行 anaconda-navigator有画面生成,成功

再检查是否安装成功

conda --version
conda -V 

【注】 如果复制安装包的时候复制不进去,参照如下

进入DL目录下
sudo su 
ls
chmod 777 -R /home/mec/DL/   # 命令表示对该文件夹设置为可读可写权限

1.2 创建并激活一个conda环境

conda create --name openmmlab python=3.8 -y
conda activate openmmlab

1.3 基于 PyTorch 官方说明安装 PyTorch

我自己的nvidia的安装详情如下:

4090的卡

在这里插入图片描述

由于在pytorch的官网没有找到适配cuda12.0的历史版本。又担心装12.1的对应torch会冒版本不匹配的问题。所以安装了如下版本。命令如下

pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118

装好之后,通过python命令查看,依次输入如下命令:

python

输出如下

Python 3.8.18 (default, Sep 11 2023, 13:40:15)
[GCC 11.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.

导入torch库查看版本

import torch
print(torch.cuda.is_available(),  torch.version.cuda,  torch.__version__)

可以看到,打印的输出如下:

True 10.2 1.9.0+cu102

然后通过 ‘exit()’ 退出python命令行。

1.4 使用 MIM 安装 MMEngine,MMCV 和 MMDetection

依次执行如下命令:

pip install -U openmim

安装好之后,保留一个numpy版本的问题所以重新安装了numpy的版本

pip install numpy==1.23.0

继续使用mim安装

mim install mmengine

安装完成提示如下

uccessfully installed contourpy-1.1.1 cycler-0.12.1 fonttools-4.45.1 importlib-resources-6.1.1 kiwisolver-1.4.5 matplotlib-3.7.4 mmengine-0.10.1 pyparsing-3.1.1 termcolor-2.3.0

继续使用mim安装

mim install 'mmcv>=2.0.0rc4'

安装完成提示如下

Successfully installed mmcv-2.1.0

继续使用mim安装

mim install 'mmdet>=3.0.0'

安装完成提示如下

Successfully installed mmdet-3.2.0 pycocotools-2.0.7 shapely-2.0.2 terminaltables-3.1.10

1.5 安装 MMDetection3D

因为要开发并直接运行 mmdet3d,从源码安装它

# 我拉下来的代码包取自:
# 如下命令是直接通过git拉取源码
# git clone https://github.com/open-mmlab/mmdetection3d.git -b dev-1.x
# "-b dev-1.x" 表示切换到 `dev-1.x` 分支。
cd mmdetection3d
pip install -v -e .
# "-v" 指详细说明,或更多的输出
# "-e" 表示在可编辑模式下安装项目,因此对代码所做的任何本地修改都会生效,从而无需重新安装。

安装完成包含如下:

Successfully installed Flask-3.0.0 PyWavelets-1.4.1 Shapely-1.8.5.post1 absl-py-2.0.0 ansi2html-1.8.0 asttokens-2.4.1 attrs-23.1.0 backcall-0.2.0 black-23.11.0 blinker-1.7.0 cachetools-5.3.2 comm-0.2.0 configargparse-1.7 dash-2.14.2 dash-core-components-2.0.0 dash-html-components-2.0.0 dash-table-5.0.0 decorator-5.1.1 descartes-1.1.0 exceptiongroup-1.2.0 executing-2.0.1 fastjsonschema-2.19.0 fire-0.5.0 flake8-6.1.0 google-auth-2.23.4 google-auth-oauthlib-1.0.0 grpcio-1.59.3 imageio-2.33.0 iniconfig-2.0.0 ipython-8.12.3 ipywidgets-8.1.1 itsdangerous-2.1.2 jedi-0.19.1 joblib-1.3.2 jsonschema-4.20.0 jsonschema-specifications-2023.11.1 jupyter-core-5.5.0 jupyterlab-widgets-3.0.9 lazy_loader-0.3 llvmlite-0.41.1 lyft_dataset_sdk-0.0.8 matplotlib-3.5.3 matplotlib-inline-0.1.6 mccabe-0.7.0 mmdet3d mypy-extensions-1.0.0 nbformat-5.7.0 nest-asyncio-1.5.8 numba-0.58.1 numpy-1.24.4 nuscenes-devkit-1.1.11 oauthlib-3.2.2 open3d-0.17.0 parso-0.8.3 pathspec-0.11.2 pexpect-4.9.0 pickleshare-0.7.5 pkgutil-resolve-name-1.3.10 plotly-5.18.0 pluggy-1.3.0 plyfile-1.0.2 prompt-toolkit-3.0.41 protobuf-4.25.1 ptyprocess-0.7.0 pure-eval-0.2.2 pyasn1-0.5.1 pyasn1-modules-0.3.0 pycodestyle-2.11.1 pyflakes-3.1.0 pyquaternion-0.9.9 pytest-7.4.3 referencing-0.31.0 requests-oauthlib-1.3.1 retrying-1.3.4 rpds-py-0.13.1 rsa-4.9 scikit-image-0.21.0 scikit-learn-1.3.2 scipy-1.10.1 stack-data-0.6.3 tenacity-8.2.3 tensorboard-2.14.0 tensorboard-data-server-0.7.2 threadpoolctl-3.2.0 tifffile-2023.7.10 traitlets-5.14.0 trimesh-4.0.5 werkzeug-3.0.1 widgetsnbextension-4.0.9

1.6 验证安装

为了验证 MMDetection3D 是否安装正确,官方提供了示例代码来执行模型推理。

步骤 1. 下载配置文件和模型权重文件。

mim download mmdet3d --config pointpillars_hv_secfpn_8xb6-160e_kitti-3d-car --dest .

下载将需要几秒钟或更长时间,这取决于您的网络环境。完成后,您会在当前文件夹中发现两个文件 pointpillars_hv_secfpn_8xb6-160e_kitti-3d-car.pyhv_pointpillars_secfpn_6x8_160e_kitti-3d-car_20220331_134606-d42d15ed.pth

步骤 2. 推理验证(方法)。

如果您从源码安装 MMDetection3D,那么直接运行以下命令进行验证:

python demo/pcd_demo.py demo/data/kitti/000008.bin pointpillars_hv_secfpn_8xb6-160e_kitti-3d-car.py hv_pointpillars_secfpn_6x8_160e_kitti-3d-car_20220331_134606-d42d15ed.pth --show

您会看到一个带有点云的可视化界面,其中包含有在汽车上绘制的检测框。

但是我在执行命令后,由于可能是open3D的问题,无法show,(可能是由于我的服务器没有连显示器的原因) 所以我通过如下命令验证推理

python demo/pcd_demo.py demo/data/kitti/000008.bin pointpillars_hv_secfpn_8xb6-160e_kitti-3d-car.py hv_pointpillars_secfpn_6x8_160e_kitti-3d-car_20220331_134606-d42d15ed.pth

之后会提示推理结果保存在了Outputs中

在这里插入图片描述

2 模拟kitti数据集跑pointpillars模型

2.1 先跑kitti_mini数据集

2.1.1 kitti_mini的数据地址:
链接:https://pan.baidu.com/s/1lKP9xViH3jVR1XBbv19VlQ 
提取码:kitt

注意:将文件名kitti_mini修改名称为kitti, 放在mmdetection3d/data/路径下。

2.1.2 修改config文件
mmdetection3d/configs/pointpillars/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class.py

中的相关内容,包含如下:

数据:

# dataset settings
data_root = 'data/kitti/'
class_names = ['Pedestrian', 'Cyclist', 'Car',  'Truck', 'Van', 'Tram', 'Misc']

注意:kitti_mini的数据集中还有一种类型是’DontCare’,它不属于检测的目标,所以不放在class_names列表中。

其它参数:

lr = 0.001
epoch_num = 10
... ...
train_cfg = dict(by_epoch=True, max_epochs=epoch_num, val_interval=15)

注意,我这里设置的val_interval > max_epochs。

2.1.3 训练

首先通过命令生成信息文件

python tools/create_data.py kitti --root-path ./data/kitti --out-dir ./data/kitti --extra-tag kitti

上述create_data.py程序部分打印如下:

在这里插入图片描述

通过如下命令训练

cd ....../mmdetection3d
python ./tools/train.py ./configs/pointpillars/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class.py

若报错缺pandas、typing_extensions包,则通过pip命令安装一下

【1】问题如下

ModuleNotFoundError: No module named 'pandas'
ModuleNotFoundError: No module named 'typing_extensions'

解决如下

pip install pandas
pip install typing_extensions

train运行起来后,会打印环境信息,模型配置参数,数据的信息,过程等
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

训练完成 后,会提示输出。

在这里插入图片描述

可以看到在路径/home/user/hlj/data3D/mmdetection3d/work_dirs/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class/下可以找到 epoch_10.pth的权重文件

注意:上述训练的时候,config中的参数设置的val_interval > max_epochs。

epoch_num = 10
train_cfg = dict(by_epoch=True, max_epochs=epoch_num, val_interval=15)

若设成

epoch_num = 16
train_cfg = dict(by_epoch=True, max_epochs=epoch_num, val_interval=8)

则在训练epoch=8结束之后,会进行验证。

由于数据集标签和./mmdetection3d/mmdet3d/evaluation/functional/kitti_utils/eval.py中的不一致,所以会报一下由于CLASS长度不一致导致的问题

如下过程为遇到的问题及解决的过程:

问题1

File "/mmdet3d/evaluation/functional/kitti_utils/eval.py", line 721, in kitti_eval
    min_overlaps = min_overlaps[:, :, current_classes]
IndexError: index 5 is out of bounds for axis 2 with size 5

问题1解决方法:将eval.py中的700多行添加overlap_0_7_kitimini和overlap_0_7_kitimini,生成新的min_overlaps。同时,class_to_name也需要根据自己在配置文件中的标签设置。

overlap_0_7 = np.array([[0.7, 0.5, 0.5, 0.7, 0.5], 
                        [0.7, 0.5, 0.5, 0.7, 0.5],
                        [0.7, 0.5, 0.5, 0.7, 0.5]])
overlap_0_5 = np.array([[0.7, 0.5, 0.5, 0.7, 0.5],
                        [0.5, 0.25, 0.25, 0.5, 0.25],
                        [0.5, 0.25, 0.25, 0.5, 0.25]])
overlap_0_7_kitimini = np.array([[0.5, 0.5, 0.7, 0.8, 0.7, 0.5, 0.5], 
                                 [0.5, 0.5, 0.7, 0.8, 0.7, 0.5, 0.5],
                                 [0.5, 0.5, 0.7, 0.8, 0.7, 0.5, 0.5]])
overlap_0_5_kitimini = np.array([[0.5,  0.5,  0.7,  0.8,  0.7,  0.5,  0.5],
                                 [0.25, 0.25, 0.5,  0.6,  0.5,  0.25, 0.25],
                                 [0.25, 0.25, 0.5,  0.6,  0.5,  0.25, 0.25]])
    
overlap_0_7, overlap_0_5 = overlap_0_7_kitimini, overlap_0_5_kitimini
min_overlaps = np.stack([overlap_0_7, overlap_0_5], axis=0)

class_to_name_kittimi = {0: 'Pedestrian', 1: 'Cyclist', 2: 'Car', 3: 'Truck', 4: 'Van', 5:'Tram', 6:'Misc'}
    
class_to_name = class_to_name_kittimi

问题2:

 File "/mmdet3d/evaluation/functional/kitti_utils/eval.py", line 39, in clean_data
    current_cls_name = CLASS_NAMES[current_class].lower()
IndexError: list index out of range

问题2解决方法:由于CLASS_NAMES没有匹配训练数据集的标签,将clean_data()函数内部的CLASS_NAMES改一下即可。

def clean_data(gt_anno, dt_anno, current_class, difficulty):
    CLASS_NAMES = ['car', 'pedestrian', 'cyclist']
    CLASS_NAMES_kittimi = ['Pedestrian', 'Cyclist', 'Car',  'Truck', 'Van', 'Tram', 'Misc']
    CLASS_NAMES_my = ['Car', 'Truck', 'Bicycle',]
    CLASS_NAMES = CLASS_NAMES_kittimi

问题3:

... ... ... ...
File "/mmdet3d/evaluation/functional/kitti_utils/eval.py", line 124, in bev_box_overlap
    from .rotate_iou import rotate_iou_gpu_eval
  File "/mmdet3d/evaluation/functional/kitti_utils/rotate_iou.py", line 285, in <module>
    def rotate_iou_kernel_eval(N,
... ... ... ...
File "/home/user/anaconda3/envs/openmmlab/lib/python3.8/site-packages/numba/core/typeinfer.py", line 1086, in propagate
    raise errors[0]
numba.core.errors.TypingError: Failed in cuda mode pipeline (step: nopython frontend)
Failed in cuda mode pipeline (step: nopython frontend)
Failed in cuda mode pipeline (step: nopython frontend)
libNVVM cannot be found. Do 【`conda install cudatoolkit`】:
libnvvm.so: cannot open shared object file: No such file or directory
During: resolving callee type: type(CUDADispatcher(<function devRotateIoUEval at 0x7f3b1d6dedc0>))
During: typing of call at /mmdet3d/evaluation/functional/kitti_utils/rotate_iou.py (335)
... ... ... ...
File "mmdet3d/evaluation/functional/kitti_utils/rotate_iou.py", line 335:
def rotate_iou_kernel_eval(N,
    <source elided>
            dev_iou[offset] = devRotateIoUEval(block_qboxes[i * 5:i * 5 + 5],

问题3解决方法: 上述报错可以看出大致是cuda版本的问题,是在验证的时候,无法使用cuda加速。

通过报错,可以定位到mmdet3d/evaluation/functional/kitti_utils/rotate_iou.py。
考虑是涉及一些cuda的问题。所以把每一个函数前面的修饰器注释掉就可以了
只不过,这样处理的缺点就是在val的时候,没有用到cuda加速,有点可惜

上面的报错中,框了一个中文中括号,安装cudatoolkit,问题解决,可以正常跑val验证了。

conda install cudatoolkit

每次验证结束,会有一堆打印包含如下,同时,epoch_16.pth权重会保存在路径/work_dirs/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class/中。

在这里插入图片描述

由于数据集比较小,验证的时候,基本不出结果。

2.2 跑自己 的数据集

2.2.1 模拟kitti数据格式构建自己的数据集

将自己的数据集命名为kitti_my。数据集路径:

链接:https://pan.baidu.com/s/1ElxDm0Rzjk8M-CSSt53ibQ 
提取码:kitt

统计自己标注的json文件中类型总数如下

labels Statics = {'Car': 193, 'Truck': 57, 'Cyclist': 60}
2.2.1.1 数据集目录树如下:
kitti_my
————ImageSets
————————test.txt   # 文件名(不包含路径和后缀)
————————train.txt  # 文件名(不包含路径和后缀)
————————val.txt    # 文件名(不包含路径和后缀)
————testing
————————calib
————————image_2
————————label_2
————————velodyne
————training
————————calib      # 包含当前点云与相机的转换矩阵(.txt)
————————calibjson  # 自己标注的json文件(.json),这个文件不是在当前目录i西安必备的
————————image_2    # 点云数据对应时刻的拍摄的图片(.png)
————————label_2    # 点云数据的标签(.txt)
————————velodyne   # 点云数据(.bin的格式)

注意:在train之前,需将 kitti_my重命名为kitti。这样的话,不用修改包含数据集路径的相关源码了。如果已经有kitti文件夹,则先将已有的kitti重命名,然后再将 kitti_my重命名为kitti。

2.2.1.2 目录树内容详细介绍如下(截图表示):
calib/000000.txt:

这里的所有txt文件内容都一样(车端车在行走,需不断调整转换矩阵,路端相机,雷达是固定不变的)

在这里插入图片描述

calibjson/000000.json、000001.json、000002.json

在这里插入图片描述

images_2/000000.png、000001.png、000002.png:

每张图的内容都一样(复制来自kitti数据集),因为我们自己没有采集到图片,只有点云,就借助kitti的做一下转换。

在这里插入图片描述

label_2/000000.txt、000001.txt、000002.txt:

通过json文件转换而来

在这里插入图片描述

velodyne:

用于存放训练数据的点云数据

calib、image_2、label_2中的数据生成源码:
if __name__ == '__main__':
    mycloudjson2kitticalibandlabel()

数据集中通过统计json标定文件,获得标签如下:

labels Statics =  {'Car': 193, 'Truck': 57, 'Cyclist': 60}
2.2.2 通过命令生成数据集信息文件

将kitti_my拷贝在/mmdetection3d/data/路径下,并重命名为kitti。通过如下命令生成。

python tools/create_data.py kitti --root-path ./data/kitti --out-dir ./data/kitti --extra-tag kitti

运行结束后,data/kitti/目录下会生成如下文件

文件夹:
kitti_gt_database
文件:
kitti_dbinfos_train.pkl
kitti_infos_test.pkl
kitti_infos_train.pkl
kitti_infos_trainval.pkl
kitti_infos_val.pkl

并会打印如下信息

在这里插入图片描述

若上述打印的信息与自己数据标签的实际类型及数据不匹配,则需做如下调整

# mmdetection3d/mmdet3d/datasets/kitti_dataset.py

在这里插入图片描述

2.2.3 训练
2.2.3.1 修改配置文件参数
cd ./configs/pointpillars/
cp ./pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class.py ./pointpillars_hv_kitti.py

打开pointpillars_hv_kitti.py,修改如下参数

【1】

class_names = my_name = ['Car', 'Truck', 'Cyclist',]
epoch_num = 100
train_cfg = dict(by_epoch=True, max_epochs=epoch_num, val_interval=50)

【2】

在这里插入图片描述

2.2.3.2 修改其它相关文件参数
1 kitti_dataset.py

修改/mmdetection3d/mmdet3d/datasets/kitti_dataset.py的内容

【】修改class KittiDataset(Det3DDataset):
METAINFO = {
    'classes': ('Pedestrian',  'Cyclist', 'Car', 'Van', 'Truck', 'Person_sitting', 'Tram', 'Misc',),
    'palette': [(106, 0, 228),   (119, 11, 32), (165, 42, 42), (0, 0, 192), 
                (197, 226, 255), (0, 60, 100), (0, 0, 142), (255, 77, 255), ]}
2 eval.py

/home/user/hlj/data3D/mmdetection3d/mmdet3d/evaluation/functional/kitti_utils/eval.py

#【1】修改clean_data(gt_anno, dt_anno, current_class, difficulty)函数中内容(约31行):
CLASS_NAMES_my = ['Car', 'Truck', 'Bicycle',]
CLASS_NAMES = CLASS_NAMES_my

#【2】修改def kitti_eval(gt_annos, dt_annos, current_classes, eval_types)函数中内容(约675行):
overlap_0_7_my = np.array([[0.7, 0.7, 0.5], 
                           [0.7, 0.7, 0.5],
                           [0.7, 0.7, 0.5]])
overlap_0_5_my = np.array([[0.7, 0.7, 0.5],
                           [0.5, 0.5, 0.25],
                           [0.5, 0.5, 0.25]])
    
overlap_0_7, overlap_0_5 = overlap_0_7_my, overlap_0_5_my
    
# my_name = ['Car', 'Truck', 'Cyclist',]
class_to_name_my = {0: 'Car', 1: 'Truck', 2: 'Cyclist', }
class_to_name = class_to_name_my

# 【3】修改def kitti_eval_coco_style(gt_annos, dt_annos, current_classes)函数中内容(约900行):
class_to_name = {0: 'Car', 1: 'Truck', 2: 'Cyclist', }
class_to_range = {
        0: [0.5, 0.95, 10],
        1: [0.5, 0.95, 10],
        2: [0.25, 0.7, 10],}
2.2.3.3 使用如下命令训练
python ./tools/train.py ./configs/pointpillars/pointpillars_hv_kitti.py

首先,数据集可以正常加载了,可以看到打印数据信息如下:

在这里插入图片描述

但是包含报错如下,及调试过程:

【问题1】

... ... ... ...
File "/mmdetection3d/mmdet3d/datasets/transforms/transforms_3d.py", line 424, in transform
    sampled_dict = self.db_sampler.sample_all(
File "/mmdetection3d/mmdet3d/datasets/transforms/dbsampler.py", line 251, in sample_all
    sampled_cls = self.sample_class_v2(class_name, sampled_num,
File "/mmdetection3d/mmdet3d/datasets/transforms/dbsampler.py", line 331, in sample_class_v2
    sp_boxes = np.stack([i['box3d_lidar'] for i in sampled], axis=0)
File "<__array_function__ internals>", line 180, in stack
File "/home/user/anaconda3/envs/openmmlab/lib/python3.8/site-packages/numpy/core/shape_base.py", line 422, in stack
    raise ValueError('need at least one array to stack')
ValueError: need at least one array to stack

【问题1解决】这个问题好尴尬,是因为配置文件中包含如下图红色框起的内容的原因,把框起的内容注释掉可以正常运行。

在这里插入图片描述

【问题1解决说明】

db_sampler用于进行数据增强和样本平衡。它是一个数据采样器,用于在训练过程中从原始数据集中生成采样样本。如果注释掉的话,就是不做数据增强处理。

数据增强:db_sampler可以在训练过程中对原始数据进行增强,以扩充训练数据集。它可以通过随机选择、缩放、旋转、平移等操作来生成多样化的数据样本。这有助于提高模型的鲁棒性和泛化能力。
样本平衡:db_sampler还可以用于样本平衡,特别是在存在类别不平衡的情况下。它可以根据样本的类别标签进行采样,以使得各个类别的样本数量相对均衡。这有助于避免模型对于少数类别的偏好,提高整体的分类性能。
在配置文件中,db_sampler通常作为数据加载器的一部分出现,它会在每个训练迭代中生成采样样本,并将其提供给模型进行训练。通过配置不同的采样策略和参数,可以灵活地控制数据增强和样本平衡的效果,以适应具体的数据集和任务要求。

此时,可以看出模型正常训练完成,并在mmdetection3d/work_dirs/pointpillars_hv_kitti/目录下生成了epoch_80.pth的模型。同级目录下的pointpillars_hv_kitti.py是模型训练的配置文件。

【问题1最终解决】

哪位大神解决了麻烦留言一下,如果我解决了也会更新哟。

注释掉可以正常运行。

[外链图片转存中…(img-cECPihSd-1701654847560)]

【问题1解决说明】

db_sampler用于进行数据增强和样本平衡。它是一个数据采样器,用于在训练过程中从原始数据集中生成采样样本。如果注释掉的话,就是不做数据增强处理。

数据增强:db_sampler可以在训练过程中对原始数据进行增强,以扩充训练数据集。它可以通过随机选择、缩放、旋转、平移等操作来生成多样化的数据样本。这有助于提高模型的鲁棒性和泛化能力。
样本平衡:db_sampler还可以用于样本平衡,特别是在存在类别不平衡的情况下。它可以根据样本的类别标签进行采样,以使得各个类别的样本数量相对均衡。这有助于避免模型对于少数类别的偏好,提高整体的分类性能。
在配置文件中,db_sampler通常作为数据加载器的一部分出现,它会在每个训练迭代中生成采样样本,并将其提供给模型进行训练。通过配置不同的采样策略和参数,可以灵活地控制数据增强和样本平衡的效果,以适应具体的数据集和任务要求。

此时,可以看出模型正常训练完成,并在mmdetection3d/work_dirs/pointpillars_hv_kitti/目录下生成了epoch_80.pth的模型。同级目录下的pointpillars_hv_kitti.py是模型训练的配置文件。并打印如下相关信息,由于数据较少,验证貌似没出结果
在这里插入图片描述
在这里插入图片描述

【问题1最终解决】

哪位大神解决了麻烦留言一下,如果我解决了也会更新哟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/215127.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 基本语句_14_信号灯实验

原理&#xff1a; Send进程通过建立共享内存区域&#xff0c;并向其中写入数据&#xff0c;Recive通过与共享内存连接读取其中的数据。 但是如果进程进行读取操作的时候其他进程再次写入会产生数据丢失&#xff0c;产生竞态&#xff0c;为了确保在某段时间内只有一个操作&…

Leetcode—1038.从二叉搜索树到更大和树【中等】

2023每日刷题&#xff08;四十九&#xff09; Leetcode—1038.从二叉搜索树到更大和树 算法思想 二叉搜索树的中序遍历&#xff08;左根右&#xff09;结果是一个单调递增的有序序列&#xff0c;我们反序进行中序遍历&#xff08;右根左&#xff09;&#xff0c;即可以得到一…

基于Java SSM框架实现母婴儿用品网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现母婴儿用品网站系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 母婴用品网站&#xff0c;主要的模块包括管理员&#xff1b;主页、个人中心、用户管理、商品分…

wireshark自定义协议插件开发

目录 脚本代码 报文显示 脚本代码 local NAME "test" test_proto Proto("test", "test Protocol") task_id ProtoField.uint16("test.task_id", "test id", base.DEC) cn ProtoField.uint8("test.cn", &qu…

数学建模-数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度

数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度 整体求解过程概述(摘要) 伴随着数据要素化进程的不断加深&#xff0c;对于数据如何作用于经济发展&#xff0c;数据与其他要素结合产生的动能应该如何测度的研究愈发重要。本文将数据新动能分…

最热门超声波清洗机有哪些?热门超声波清洗机推荐

眼镜党朋友第一次接触超声波清洗机应该是在眼镜店的时候&#xff0c;把眼镜拿给老板他几分钟就搞定眼镜清洗的&#xff0c;是的没有错&#xff0c;那个机器叫超声波清洗机&#xff0c;不需要自己动手就可把眼镜清洗干净的一款智能清洁工具&#xff0c;它的出现可以说是方便了我…

计算机网络扫盲(4)——时延

一、概述 在这里&#xff0c;我们考虑分组交换网的情况&#xff0c;因特网可以被看成是一种基础设施&#xff0c;该基础设施为运行在端系统上的分布式应用提供服务。在理想情况下&#xff0c;我们希望因特网服务能够在任意两个端系统之间随心所欲地移动数据而没有任何数据地丢失…

软信天成:数据泄露日趋严重 “资产”保护何去何从

随着数据应用的逐渐深入&#xff0c;越来越多的企业意识到&#xff1a;数据作为信息的载体&#xff0c;可以成为企业知识产权、收益流和具备竞争优势的基础资产。然而&#xff0c;当包含大量敏感信息的数据被视作资产时&#xff0c;亦将直面信息被“窃取”、“泄露”和“滥用”…

CrapApi部署手册( maven+tomcat+idea)

目录 一、本章节所用到的资源共享&#xff0c;嫌麻烦的可以直接下载本地配置好运行使用二、idea maven tomcat启动&#xff0c;我的maven和tomcat的配置三、遇到的问题四、项目运行后效果图转载请标明出处&#xff0c;写作不易如果有用请给个赞~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

跨网文件摆渡系统:安全、可控的数字传输桥梁

在企业高度信息化的时代&#xff0c;数据的流通与共享已经成为企业、组织乃至个人之间不可或缺的沟通方式。然而&#xff0c;在数据流通的过程中&#xff0c;我们经常会遇到各种难题和挑战&#xff0c;尤其是当涉及到不同网络环境之间的文件传输。这不仅需要保证文件的安全性&a…

基于Java SSM框架实现人才小区公寓社区物业管理系统项目【项目源码+论文说明】

基于java的SSM框架实现人才小区公寓社区物业管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个人才公寓管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff…

MySQL练习题,学生成绩查询练习题,附带答案

题目 (一) 新建以下几个表 student(学生表)&#xff1a; snosnamesexdeptbirthagePhone 其中约束如下&#xff1a; &#xff08;1&#xff09; 学号不能存在相同的 sno int auto_increment primary key &#xff08;2&#xff09; 名字为非空 sname varchar(20) not nu…

Excel如何设置在未打印时显示虚线打印时不显示虚线

记得之前分享过一个BOM表模板&#xff0c;但是在我打印时&#xff0c;发现明明是留空白的地方却打印出来的虚线 后来&#xff0c;看了自己的页面布局&#xff0c;原来是网格线设置错误了 当我设置为查看时显示网格线&#xff0c;打印时不显示网格线&#xff0c;这样就正常了

二百一十、Hive——Flume采集的JSON数据文件写入Hive的ODS层表后字段的数据残缺

一、目的 在用Flume把Kafka的数据采集写入Hive的ODS层表的HDFS文件路径后&#xff0c;发现HDFS文件中没问题&#xff0c;但是ODS层表中字段的数据却有问题&#xff0c;字段中的JSON数据不全 二、Hive处理JSON数据方式 &#xff08;一&#xff09;将Flume采集Kafka的JSON数据…

maven篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、什么是Maven的坐标?二、讲一下maven的生命周期三、说说你熟悉哪些maven命令?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的…

C# OpenVINO 模型信息查看工具

目录 效果 支持模型 项目 代码 下载 C# OpenVINO 模型信息查看工具 效果 支持模型 ONNX format (*.onnx) PDPD (*.pdmodel) TF (*.pb) TFLite (*.tflite) 项目 代码 using Sdcb.OpenVINO; using System; using System.Collections.Generic; using System.Text; using…

怎么理解回流和重绘?

回流&#xff08;reflow&#xff09;和 重绘&#xff08;repaint&#xff09;是浏览器渲染过程中的两个关键概念。 一、概念&#xff1a; 回流指的是浏览器在计算文档流布局&#xff08;layout&#xff09;时&#xff0c;重新计算元素的位置和大小的过程。当页面中的元素发生尺…

spring boot 事件机制

目录 概述实践监听spring boot ready事件代码 源码初始化流程调用流程 结束 概述 spring boot 版本为 2.7.17 。 整体看一下spring及spring boot 相关事件。 根据下文所给的源码关键处&#xff0c;打上断点&#xff0c;可以进行快速调试。降低源码阅读难度。 实践 spring…

传媒行业CRM:打造高效客户管理,提升品牌影响力

传媒行业充满竞争和变化&#xff0c;传媒企业面临着客户管理不透明、业务流程混乱、销售数据分析不足&#xff0c;无法优化营销策略和运营管理等问题。CRM系统是企业实现数智化管理的神器&#xff0c;可以有效解决这些问题。下面说说&#xff0c;传媒行业CRM系统推荐。 1、建立…

webGL开发VR和AR应用

开发 WebVR&#xff08;虚拟现实&#xff09;和 WebAR&#xff08;增强现实&#xff09; 应用需要使用 WebXR 技术&#xff0c;结合 WebGL 以实现高质量的图形渲染。以下是开发这类应用的一般技术方案&#xff0c;希望对大家有所帮助。 1.WebXR API: 使用 WebXR API&#xff0…