html完整网站开发,wordpress 根分类,网站编辑器,企业网站建设属于什么科目SE-SSD模型训练 1 基于Det3d搭建SE-SSD环境2 自定义数据准备2.1 自定义数据集标注2.2 训练数据生成2.3 数据集分割 3 训练KITTI数据集3.1 数据准备3.2 配置修改3.3 模型训练 1 基于Det3d搭建SE-SSD环境
Det3D环境搭建参考#xff1a;【3D目标检测】环境搭建#xff08;OpenP… SE-SSD模型训练 1 基于Det3d搭建SE-SSD环境2 自定义数据准备2.1 自定义数据集标注2.2 训练数据生成2.3 数据集分割 3 训练KITTI数据集3.1 数据准备3.2 配置修改3.3 模型训练 1 基于Det3d搭建SE-SSD环境
Det3D环境搭建参考【3D目标检测】环境搭建OpenPCDet、MMdetection3d、Det3d
SE-SSD源码链接https://github.com/Vegeta2020/SE-SSD 首先激活Det3d环境上述链接已经搭建好的环境
conda activate det3d新建3_det3d_projects文件夹(自定义名称)用于储存基于Det3D架构的模型源码项目将SE-SSD源码存储在里面 目录结构如下 SE-SSD环境部署指令
cd ~/3_det3d_projects
git clone https://github.com/Vegeta2020/SE-SSD.git
cd ./SE-SSD/det3d/core/iou3d
python setup.py install
cd ./SE-SSD
pip install ipykernel nbconvert numba0.48 -i https://pypi.tuna.tsinghua.edu.cn/simple
python setup.py build developgit clone https://github.com/jackd/ifp-sample.git
pip install -e ifp-sample成功安装如下: 以下未说明均在SE-SSD目录下
2 自定义数据准备
2.1 自定义数据集标注
参考链接【3D目标检测】OpenPCDet自定义数据集训练
2.2 训练数据生成
官方参考链接https://github.com/V2AI/Det3D/blob/master/GETTING_STARTED.md 数据组织结果如下
# For KITTI Dataset
└── SE-SSD/data/kitti├── training -- 7481 train data├── image_2 -- for visualization├── calib├── label_2├── velodyne└── velodyne_reduced -- empty directory└── testing -- 7580 test data├── image_2 -- for visualization├── calib├── velodyne└── velodyne_reduced -- empty directory# KITTI
python tools/create_data.py kitti_data_prep --root_pathKITTI_DATASET_ROOT2.3 数据集分割 2024.03.21
author:alian
数据预处理操作
1.数据集分割import os
import random
import shutil
import numpy as npdef get_train_val_txt_kitti_det3d(src_path):3D算法库:Det3D数据格式:KITTI# For KITTI Dataset└── KITTI_DATASET_ROOT├── training -- 7481 train data| ├── image_2 -- for visualization| ├── calib| ├── label_2| ├── velodyne| └── velodyne_reduced -- empty directory└── testing -- 7580 test data├── image_2 -- for visualization├── calib├── velodyne└── velodyne_reduced -- empty directorysrc_path: KITTI_DATASET_ROOT kitti文件夹# 1.自动生成数据集划分文件夹ImageSetsset_path %s/ImageSets/%src_pathif os.path.exists(set_path): # 如果文件存在shutil.rmtree(set_path) # 清空原始数据os.makedirs(set_path) # 重新创建else:os.makedirs(set_path) # 自动新建文件夹# 2.训练样本分割 生成train.txt val.txt trainval.txttrain_list os.listdir(os.path.join(src_path,training,velodyne))random.shuffle(train_list) # 打乱顺序随机采样# 设置训练和验证的比例train_p 0.8# 开始写入分割文件f_train open(os.path.join(set_path, train.txt), w)f_val open(os.path.join(set_path, val.txt), w)f_trainval open(os.path.join(set_path, trainval.txt), w)for i,src in enumerate(train_list):if iint(len(train_list)*train_p): # 训练集的数量f_train.write(src[:-4] \n)f_trainval.write(src[:-4] \n)else:f_val.write(src[:-4] \n)f_trainval.write(src[:-4] \n)# 3.测试样本分割 生成test.txttest_list os.listdir(os.path.join(src_path,testing,velodyne))f_test open(os.path.join(set_path, test.txt), w)for i,src in enumerate(test_list):f_test.write(src[:-4] \n)if __name____main__:src_path: 数据目录src_path /media/ll/L/llr/a2023_my_3d/Det3D/data/customget_train_val_txt_kitti_det3d(src_path)输入数据集路径 输出在输入的数据集路径下生成 └── ImageSets├── train.txt├── val.txt├── test.txt└── trainval.txt3 训练KITTI数据集
先训练公开数据集验证代码可行性
3.1 数据准备
tools/creat_data.py
import copy
from pathlib import Path
import pickleimport firefrom det3d.datasets.kitti import kitti_common as kitti_ds
from det3d.datasets.utils.create_gt_database import create_groundtruth_database
from det3d.torchie import Configdef kitti_data_prep(root_path):kitti_ds.create_kitti_info_file(root_path)kitti_ds.create_reduced_point_cloud(root_path)create_groundtruth_database(KITTI, root_path, Path(root_path) / kitti_infos_train.pkl)if __name__ __main__:# 数据集目录kitti_data_prep(/media/ll/L/llr/a2023_my_3d/3_det3d_projects/SE-SSD/data/kitti)运行指令
Python tools/creat_data.py其中kitti_infos_train.pkl的数据信息如下 储存了所有数据的信息以文件为单位 包括图像、点云、标定、标签信息 其中图像和点云信息如下 其中标签信息如下 标注信息解析 第1列字符串代表物体类别type 总共有9类分别是Car、Van、Truck、Pedestrian、Person_sitting、Cyclist、Tram、Misc、DontCare。 其中DontCare标签表示该区域没有被标注比如由于目标物体距离激光雷达太远。为了防止在评估过程中主要是计算precision将本来是目标物体但是因为某些原因而没有标注的区域统计为假阳性(false positives)评估脚本会自动忽略DontCare区域的预测结果。 第2列浮点数代表物体是否被截断truncated 数值在0非截断到1截断之间浮动数字表示指离开图像边界对象的程度。 第3列整数代表物体是否被遮挡occluded 整数0、1、2、3分别表示被遮挡的程度。 第4列弧度数物体的观察角度alpha 取值范围为-pi ~ pi单位rad它表示在相机坐标系下以相机原点为中心相机原点到物体中心的连线为半径将物体绕相机y轴旋转至相机z轴此时物体方向与相机x轴的夹角(如下图所示y轴垂直与屏幕) 第5~8列浮点数物体的2D边界框大小bbox 四个数分别是xmin、ymin、xmax、ymax单位pixel表示2维边界框的左上角和右下角的坐标。 第9~11列浮点数3D物体的尺寸dimensions 分别是高、宽、长单位米 第12-14列浮点数3D物体的位置location 分别是x、y、z单位米特别注意的是这里的xyz是在相机坐标系下3D物体的中心点位置。 第15列弧度数3D物体的空间方向rotation_y 取值范围为-pi ~pi单位rad它表示在照相机坐标系下物体的全局方向角物体前进方向与相机坐标系x轴的夹角如下图所示。 第16列浮点数检测的置信度score 其中dbinfos_train.pkl的数据信息如下 根据类别来划分样本实例
重要说明 当准备数据集时./Det3d/det3d 当训练模型时./Det3d/0det3d 原因解释 数据准备时使用Det3d的det3d 模型训练时则用回SE-SSD的det3d └── 3_det3d_projects├── SE-SSD├── det3d└── ......└── ......
└── Det3D├── 0det3d(数据集准备好后改变名字否则后续使用SE-SSD会找不到自己的det3d)└── ......3.2 配置修改
修改examples/second/configs/config.py配置 主要修改三个部分 数据集目录权重保存目录预训练权重目录 import itertools
import logging
from pathlib import Pathfrom det3d.builder import build_box_coder
from det3d.utils.config_tool import get_downsample_factor
import glob# norm_cfg dict(typeSyncBN, eps1e-3, momentum0.01)
norm_cfg Nonetasks [dict(num_class1, class_names[Car],),]class_names list(itertools.chain(*[t[class_names] for t in tasks]))# training and testing settings
box_coder dict(typeground_box3d_coder, n_dim7, linear_dimFalse, encode_angle_vectorFalse,)# exp_sesssd_release_v0_0: based on v1_0, remove sada
# exp_sesssd_release_v1_0: default settings of sesssd# torch.set_printoptions(precision4, sci_modeFalse)
my_paras dict(batch_size4,data_modetrain, # train or trainval: the set to train the model;enable_sslTrue, # Ensure False in CIA-SSD trainingeval_training_setFalse, # True: eval on data_mode set; False: eval on validation set.[Ensure False in training; Switch in Testing]# unusedenable_difficulty_levelFalse,remove_difficulty_pointsFalse, # act with neccessary condition: enable_difficulty_levelTrue.gt_random_drop-1,data_aug_random_drop-1,far_points_firstFalse,data_aug_with_context-1, # enlarged size for w and l in data aug.gt_aug_with_context-1,gt_aug_similar_typeFalse,min_points_in_gt-1,loss_iouNone,
)# model settings
model dict(typeVoxelNet,pretrainedNone,readerdict(typeVoxelFeatureExtractorV3, num_input_features4, norm_cfgnorm_cfg,),backbonedict(typeSpMiddleFHD, num_input_features4, ds_factor8, norm_cfgnorm_cfg,),neckdict(typeSSFA,layer_nums[5,],ds_layer_strides[1,],ds_num_filters[128,],us_layer_strides[1,],us_num_filters[128,],num_input_features128,norm_cfgnorm_cfg,loggerlogging.getLogger(RPN),),bbox_headdict(typeMultiGroupHead,mode3d,in_channelssum([128,]),norm_cfgnorm_cfg,taskstasks,weights[1,],box_coderbuild_box_coder(box_coder),encode_background_as_zerosTrue,loss_normdict(typeNormByNumPositives, pos_cls_weight1.0, neg_cls_weight1.0,),loss_clsdict(typeSigmoidFocalLoss, alpha0.25, gamma2.0, loss_weight1.0,),use_sigmoid_scoreTrue,loss_bboxdict(typeWeightedSmoothL1Loss, sigma3.0, code_weights[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], codewiseTrue, loss_weight2.0, ),encode_rad_error_by_sinTrue,loss_auxdict(typeWeightedSoftmaxClassificationLoss, namedirection_classifier, loss_weight0.2,),direction_offset0.0,#loss_ioumy_paras[loss_iou],),
)target_assigner dict(typeiou,anchor_generators[dict(typeanchor_generator_range,sizes[1.6, 3.9, 1.56], # w, l, hanchor_ranges[0, -40.0, -1.0, 70.4, 40.0, -1.0],rotations[0, 1.57],matched_threshold0.6,unmatched_threshold0.45,class_nameCar,),],sample_positive_fraction-1,sample_size512,region_similarity_calculatordict(typenearest_iou_similarity,),pos_area_threshold-1,taskstasks,
)assigner dict(box_coderbox_coder,target_assignertarget_assigner,out_size_factor8,debugFalse,enable_similar_typeTrue,
)train_cfg dict(assignerassigner)test_cfg dict(nmsdict(use_rotate_nmsTrue,use_multi_class_nmsFalse,nms_pre_max_size1000,nms_post_max_size100,nms_iou_threshold0.01,),score_threshold0.3,post_center_limit_range[0, -40.0, -5.0, 70.4, 40.0, 5.0],max_per_img100,
)# dataset settings----------------------------------------------------------------------------------
data_root_prefix /media/ll/L/llr/a2023_my_3d/3_det3d_projects/SE-SSD/data/kitti # 数据集目录
dataset_type KittiDatasetdb_sampler dict(typeGT-AUG,enableTrue,db_info_pathglob.glob(%s/dbinfos_train.pkl%data_root_prefix)[0],sample_groups[dict(Car15,),],db_prep_steps[dict(filter_by_min_num_pointsdict(Car5,)),dict(filter_by_difficulty[-1],), # todo: need to check carefully],global_random_rotation_range_per_object[0, 0],rate1.0,gt_random_dropmy_paras[gt_random_drop],gt_aug_with_contextmy_paras[gt_aug_with_context],gt_aug_similar_typemy_paras[gt_aug_similar_type],
)
train_preprocessor dict(modetrain,shuffle_pointsTrue,gt_loc_noise[1.0, 1.0, 0.5],gt_rot_noise[-0.785, 0.785],global_rot_noise[-0.785, 0.785],global_scale_noise[0.95, 1.05],global_rot_per_obj_range[0, 0],global_trans_noise[0.0, 0.0, 0.0],remove_points_after_sampleTrue,gt_drop_percentage0.0,gt_drop_max_keep_points15,remove_environmentFalse,remove_unknown_examplesmy_paras.get(remove_difficulty_points, False),db_samplerdb_sampler,class_namesclass_names, # Carsymmetry_intensityFalse,enable_similar_typeTrue,min_points_in_gtmy_paras[min_points_in_gt],data_aug_with_contextmy_paras[data_aug_with_context],data_aug_random_dropmy_paras[data_aug_random_drop],
)val_preprocessor dict(modeval,shuffle_pointsFalse,remove_environmentFalse,remove_unknown_examplesFalse,
)voxel_generator dict(range[0, -40.0, -3.0, 70.4, 40.0, 1.0],voxel_size[0.05, 0.05, 0.1],max_points_in_voxel5,max_voxel_num20000,far_points_firstmy_paras[far_points_first],
)train_pipeline [dict(typeLoadPointCloudFromFile),dict(typeLoadPointCloudAnnotations, with_bboxTrue, enable_difficulty_levelmy_paras.get(enable_difficulty_level, False)),dict(typePreprocess, cfgtrain_preprocessor),dict(typeVoxelization, cfgvoxel_generator),dict(typeAssignTarget, cfgtrain_cfg[assigner]),dict(typeReformat),# dict(typePointCloudCollect, keys[points, voxels, annotations, calib]),
]
test_pipeline [dict(typeLoadPointCloudFromFile),dict(typeLoadPointCloudAnnotations, with_bboxTrue),dict(typePreprocess, cfgval_preprocessor),dict(typeVoxelization, cfgvoxel_generator),dict(typeAssignTarget, cfgtrain_cfg[assigner]),dict(typeReformat),
]
training_pipeline test_pipeline if my_paras[eval_training_set] else train_pipelinedata_root data_root_prefix # 数据集目录
train_anno glob.glob(%s/*_infos_train.pkl%data_root_prefix)[0]
val_anno glob.glob(%s/*val.pkl%data_root_prefix)[0]
test_anno glob.glob(%s/*test.pkl%data_root_prefix)[0]
trainval_anno glob.glob(%s/*trainval.pkl%data_root_prefix)[0]data dict(samples_per_gpumy_paras[batch_size], # batch_size: 4workers_per_gpu2, # default: 2traindict(typedataset_type,root_pathdata_root,info_pathtrain_anno,class_namesclass_names,pipelinetraining_pipeline,),valdict(typedataset_type,root_pathdata_root,info_pathval_anno,class_namesclass_names,pipelinetest_pipeline,),testdict(typedataset_type,root_pathdata_root,info_pathtest_anno,class_namesclass_names,pipelinetest_pipeline,),trainvaldict(typedataset_type,root_pathdata_root,info_pathtrainval_anno,class_namesclass_names,pipelinetest_pipeline,),train_unlabel_valdict(typedataset_type,root_pathdata_root,info_pathval_anno,class_namesclass_names,pipelinetrain_pipeline,labeledFalse,),train_unlabel_testdict(typedataset_type,root_pathdata_root,info_pathtest_anno,class_namesclass_names,pipelinetrain_pipeline,labeledFalse,),
)# for cia optimizer
optimizer dict(typeadam, amsgrad0.0, wd0.01, fixed_wdTrue, moving_averageFalse,)
optimizer_config dict(grad_clipdict(max_norm35, norm_type2))
lr_config dict(typeone_cycle, lr_max0.003, moms[0.95, 0.85], div_factor10.0, pct_start0.4,) # learning policy in training hookscheckpoint_config dict(interval1)
log_config dict(interval10,hooks[dict(typeTextLoggerHook),],) # dict(typeTensorboardLoggerHook)# runtime settings-----------------------------------------------------------------------------------------
TAG exp_se_ssd_v1_1 # 权重文件保存目录
work_dir /media/ll/L/llr/a2023_my_3d/3_det3d_projects/SE-SSD/examples/second/ TAG
total_epochs 60
device_ids range(8)
dist_params dict(backendnccl, init_methodenv://)
log_level INFO
# 预训练权重文件
load_from /media/ll/L/llr/a2023_my_3d/3_det3d_projects/SE-SSD/examples/second/pre_trained_model/cia-ssd-model.pth
resume_from None
workflow [(train, 60), (val, 1)] if my_paras[enable_ssl] else [(train, 60), (val, 1)]
save_file False if TAG debug or TAG exp_debug or Path(work_dir, Det3D).is_dir() else True3.3 模型训练
下载预训练权重文件 SE-SSE预训练权重https://drive.google.com/file/d/1M2nP_bGpOy0Eo90xWFoTIUkjhdw30Pjs/view?uspsharing CIA-SSD预训练权重https://drive.google.com/file/d/1SElYNQCsr4gctqLxmB6Fc4t7Ed8SgBgs/view?uspsharing
修改tools/train.py配置文件的路径 大概在29行
def parse_args():parser argparse.ArgumentParser(descriptionTrain a detector)# 修改这里parser.add_argument(--config, default/media/ll/L/llr/a2023_my_3d/3_det3d_projects/SE-SSD/examples/second/configs/config.py, helptrain config file path)parser.add_argument(--work_dir, helpthe dir to save logs and models)parser.add_argument(--resume_from, helpthe checkpoint file to resume from)parser.add_argument(--validate, actionstore_true, helpwhether to evaluate the checkpoint during training,)parser.add_argument(--gpus, typeint, default1, helpnumber of gpus to use (only applicable to non-distributed training),)parser.add_argument(--seed, typeint, defaultNone, helprandom seed)parser.add_argument(--launcher,choices[none, pytorch, slurm, mpi],defaultnone,helpjob launcher,)parser.add_argument(--local_rank, typeint, default0)parser.add_argument(--autoscale-lr,actionstore_true,helpautomatically scale lr with the number of gpus,)parser.add_argument(--save_file, typebool, defaultTrue, helpwhether save code files as backup, )args parser.parse_args()if LOCAL_RANK not in os.environ:os.environ[LOCAL_RANK] str(args.local_rank)return args训练指令
python tools/train.py以上就实现了SE-SSD在KITTI数据上的训练