【mmdetection】使用kitti数据集进行训练

MMDetection3d对KITT数据集的训练与评估介绍 KITTI数据集中easy、moderate、hard根据标注框是否被遮挡、遮挡程度和框的高度进行定义的简单:最小边界框高度:40像素,最大遮挡级别:完全可见,最大截断:15%中等:最小边界框高度:25像素,最大遮挡水平:部分遮挡,最大截断:30%困难:最小边界框高度:25像素,最大遮挡级别:难以看到,最大截断:50%1. MMDet3d官方文档#1853. KITTI数据集3d目标检测的评价的含义4. 机器学习算法评估指标——3D目标检测5. 点云感知算法面试知识点(一) 阅读详情

目录

一、环境配置

二、Kitti数据集准备

三、仓库中需要修改的文件

3.1 mmdet/datasets中添加kitti.py,内容如下

3.2 修改mmdet/datasets/__init__.py,修改位置已注释标出

3.3 configs/_base_/datasets中添加kitti_detection.py,内容如下

3.4 修改mmdet\core\evaluation文件夹中的class_names.py文件

3.5 修改mmdet\core\evaluation/__init__.py文件,修改位置已注释标出

3.6 修改configs文件夹中需要使用的配置文件

四、训练

五、可视化

5.1 修改mmdet\apis文件夹中的inference.py文件

5.2 使用visualization.py(见下)可视化。(注:需要将visualization.py放在到mmdetection目录下)

5.3 或者使用DetVisGUI可视化

六、参考

七、附录

7.1 kitti标签类别合并

7.2 kitti转voc(可能有问题,不建议使用)


写在前面:官方给了一个demo程序将Kitti转为COCO格式,但是加载数据、修改配置、训练、测试、可视化这些东西都都放在一起总觉得不舒服,用那个比较好,于是把官方的示例改成了一个新的数据集kitti。

一、环境配置

mmdet 2.7.0

mmcv 1.2.1

克隆仓库中的源码,并在目录下创建data文件夹。按照get_started.md文件进行配置,不再赘述。

二、Kitti数据集准备

按照以下文件夹结构准备数据。

mmdetection
├── mmdet
├── tools
├── configs
├── data
│   ├── kitti
│   │   ├── training
│   │   │   ├── image_2
│   │   │   ├── label_2
│   │   ├── train.txt
│   │   ├── val.txt
│   │   ├── trainval.txt

三、仓库中需要修改的文件

3.1 mmdet/datasets中添加kitti.py,内容如下

import os.path as osp

import mmcv
import numpy as np

from mmdet.datasets.builder import DATASETS
from mmdet.datasets.custom import CustomDataset


@DATASETS.register_module()
class KittiDataset(CustomDataset):
    CLASSES = ('Car', 'Pedestrian', 'Cyclist')

    def load_annotations(self, ann_file):
        cat2label = {k: i for i, k in enumerate(self.CLASSES)}
        # load image list from file
        image_list = mmcv.list_from_file(self.ann_file)

        data_infos = []
        # convert annotations to middle format
        for image_id in image_list:
            filename = f'{self.img_prefix}/{image_id}.png'
            image = mmcv.imread(filename)
            height, width = image.shape[:2]

            data_info = dict(filename=f'{image_id}.png', width=width, height=height)

            # load annotations
            label_prefix = self.img_prefix.replace('image_2', 'label_2')
            lines = mmcv.list_from_file(osp.join(label_prefix, f'{image_id}.txt'))

            content = [line.strip().split(' ') for line in lines]
            bbox_names = [x[0] for x in content]
            bboxes = [[float(info) for info in x[4:8]] for x in content]

            gt_bboxes = []
            gt_labels = []
            gt_bboxes_ignore = []
            gt_labels_ignore = []

            # filter 'DontCare'
            for bbox_name, bbox in zip(bbox_names, bboxes):
                if bbox_name in cat2label:
                    gt_labels.append(cat2label[bbox_name])
                    gt_bboxes.append(bbox)
                else:
                    gt_labels_ignore.append(-1)
                    gt_bboxes_ignore.append(bbox)

            data_anno = dict(
                bboxes=np.array(gt_bboxes, dtype=np.float32).reshape(-1, 4),
                labels=np.array(gt_labels, dtype=np.long),
                bboxes_ignore=np.array(gt_bboxes_ignore,
                                       dtype=np.float32).reshape(-1, 4),
                labels_ignore=np.array(gt_labels_ignore, dtype=np.long))

            data_info.update(ann=data_anno)
            data_infos.append(data_info)

        return data_infos

3.2 修改mmdet/datasets/__init__.py,修改位置已注释标出

from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset
from .cityscapes import CityscapesDataset
from .coco import CocoDataset
from .custom import CustomDataset
from .dataset_wrappers import (ClassBalancedDataset, ConcatDataset,
                               RepeatDataset)
from .deepfashion import DeepFashionDataset
from .lvis import LVISDataset, LVISV1Dataset, LVISV05Dataset
from .samplers import DistributedGroupSampler, DistributedSampler, GroupSampler
from .utils import replace_ImageToTensor
from .voc import VOCDataset
from .wider_face import WIDERFaceDataset
from .xml_style import XMLDataset
from .kitti import KittiDataset            #新加

__all__ = [
    #下面的KittiDataset为新加
    'KittiDataset','CustomDataset', 'XMLDataset', 'CocoDataset', 'DeepFashionDataset',
    'VOCDataset', 'CityscapesDataset', 'LVISDataset', 'LVISV05Dataset',
    'LVISV1Dataset', 'GroupSampler', 'DistributedGroupSampler',
    'DistributedSampler', 'build_dataloader', 'ConcatDataset', 'RepeatDataset',
    'ClassBalancedDataset', 'WIDERFaceDataset', 'DATASETS', 'PIPELINES',
    'build_dataset', 'replace_ImageToTensor'
]

3.3 configs/_base_/datasets中添加kitti_detection.py,内容如下

# dataset settings
dataset_type = 'KittiDataset'
data_root = 'data/kitti/'
img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations', with_bbox=True),
    dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
    dict(type='RandomFlip', flip_ratio=0.5),
    dict(type='Normalize', **img_norm_cfg),
    dict(type='Pad', size_divisor=32),
    dict(type='DefaultFormatBundle'),
    dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),
]
test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(
        type='MultiScaleFlipAug',
        img_scale=(1333, 800),
        flip=False,
        transforms=[
            dict(type='Resize', keep_ratio=True),
            dict(type='RandomFlip'),
            dict(type='Normalize', **img_norm_cfg),
            dict(type='Pad', size_divisor=32),
            dict(type='ImageToTensor', keys=['img']),
            dict(type='Collect', keys=['img']),
        ])
]
data = dict(
    samples_per_gpu=8,
    workers_per_gpu=8,
    train=dict(
        type=dataset_type,
        ann_file=data_root + 'train.txt',
        img_prefix=data_root + 'training/image_2',
        pipeline=train_pipeline),
    val=dict(
        type=dataset_type,
        ann_file=data_root + 'val.txt',
        img_prefix=data_root + 'training/image_2',
        pipeline=test_pipeline),
    test=dict(
        type=dataset_type,
        ann_file=data_root + 'val.txt',
        img_prefix=data_root + 'training/image_2',
        pipeline=test_pipeline))
evaluation = dict(interval=1, metric='mAP')

3.4 修改mmdet\core\evaluation文件夹中的class_names.py文件

###添加一个函数
def kitti_classes():
    return ['Car', 'Pedestrian', 'Cyclist']

###修改dataset_aliases
dataset_aliases = {
    'kitti':['kitti'],        #添加kitti数据集
    'voc': ['voc', 'pascal_voc', 'voc07', 'voc12'],
    'imagenet_det': ['det', 'imagenet_det', 'ilsvrc_det'],
    'imagenet_vid': ['vid', 'imagenet_vid', 'ilsvrc_vid'],
    'coco': ['coco', 'mscoco', 'ms_coco'],
    'wider_face': ['WIDERFaceDataset', 'wider_face', 'WDIERFace'],
    'cityscapes': ['cityscapes']
}

3.5 修改mmdet\core\evaluation/__init__.py文件,修改位置已注释标出

from .class_names import (cityscapes_classes, coco_classes, dataset_aliases,
                          get_classes, imagenet_det_classes,
                          imagenet_vid_classes, voc_classes,
                          kitti_classes)    #新加
from .eval_hooks import DistEvalHook, EvalHook
from .mean_ap import average_precision, eval_map, print_map_summary
from .recall import (eval_recalls, plot_iou_recall, plot_num_recall,
                     print_recall_summary)

__all__ = [
    'kitti_classes',        #新加
    'voc_classes', 'imagenet_det_classes', 'imagenet_vid_classes',
    'coco_classes', 'cityscapes_classes', 'dataset_aliases', 'get_classes',
    'DistEvalHook', 'EvalHook', 'average_precision', 'eval_map',
    'print_map_summary', 'eval_recalls', 'print_recall_summary',
    'plot_num_recall', 'plot_iou_recall'
]

3.6 修改configs文件夹中需要使用的配置文件

这里使用的是configs/fcos/fcos_r50_caffe_fpn_4x4_1x_coco.py,只需要将_base_中的coco_detection.py改成kitti_detection.py,然后将类别数修改为3类即可。

四、训练

训练参考传送门,初步尝试使用的命令如下

CUDA_VISIBLE_DEVICES=6 nohup python tools/train.py configs/fcos/fcos_r50_caffe_fpn_4x4_1x_coco.py --gpus=1 --work-dir=fcos_output/TEST>fcos_r50_caffe_fpn_4x4_1x_coco.log 2>&1 &

五、可视化

5.1 修改mmdet\apis文件夹中的inference.py文件

###将第48行
model.CLASSES = get_classes('coco')
###修改为
model.CLASSES = get_classes('kitti')

5.2 使用visualization.py(见下)可视化。(注:需要将visualization.py放在到mmdetection目录下)

from mmdet.apis import init_detector, inference_detector, show_result_pyplot
import mmcv

config_file = 'configs/fcos/fcos_r50_caffe_fpn_4x4_1x_coco.py'
# download the checkpoint from model zoo and put it in `checkpoints/`
checkpoint_file = 'fcos_output/fcos_r50_caffe_fpn_4x4_1x_coco/epoch_12.pth'

# build the model from a config file and a checkpoint file
model = init_detector(config_file, checkpoint_file, device='cuda:2')

# test a single image
img = 'demo.jpg'
result = inference_detector(model, img)
#print(result)
# show the results
show_result_pyplot(model, img, result)

5.3 或者使用DetVisGUI可视化

我使用的是DetVisGUI_test.py,直接显示模型预测结果,需要做的修改如下所示,然后运行下面命令即可。(注:需要将DetVisGUI_test.py、epoch_9.pth和data中的test_images文件夹拷贝到mmdetection下)

python DetVisGUI_test.py configs/fcos/fcos_r50_caffe_fpn_4x4_1x_coco.py epoch_9.pth data/test_images
###添加类
class KITTI_dataset:

    def __init__(self, cfg, args):
        self.dataset = 'KITTI'
        self.img_root = args.img_root
        self.config_file = args.config
        self.checkpoint_file = args.ckpt
        self.mask = False
        self.device = args.device

        # according json to get category, image list, and annotations.
        self.img_list = self.get_img_list()

        # coco categories
        self.aug_category = aug_category(['Car', 'Pedestrian', 'Cyclist'])


    def get_img_list(self):
        img_list = list()
        for image in sorted(os.listdir(self.img_root)):
            img_list.append(image)

        return img_list

    def get_img_by_name(self, name):
        img = Image.open(os.path.join(self.img_root, name)).convert('RGB')
        return img

    def get_img_by_index(self, idx):
        img = Image.open(os.path.join(self.img_root,
                                      self.img_list[idx])).convert('RGB')
        return img

###vis_tool的init中COCO改为新加的KITTI
#self.data_info = COCO_dataset(cfg, self.args)
self.data_info = KITTI_dataset(cfg, self.args)

六、参考

https://blog.youkuaiyun.com/gaoyi135/article/details/90613895

https://blog.youkuaiyun.com/xiangxianghehe/article/details/89812058#commentsedit

https://blog.youkuaiyun.com/jesse_mx/article/details/65634482

https://blog.youkuaiyun.com/yapifeitu/article/details/105884203?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-5.control

七、附录

7.1 kitti标签类别合并

kitti包括九个类别,分别是'Car', 'Van', 'Truck','Pedestrian', 'Person_sitting', 'Cyclist','Tram',  'Misc' or  'DontCare',这里将 ‘Van’, ‘Truck’, ‘Tram’ 合并到 ‘Car’ 类别中去,将 ‘Person_sitting’ 合并到 ‘Pedestrian’ 类别中去,‘Misc’ 和 ‘Dontcare’ 这两类直接忽略,最终只保留三个类别,分别是'Car', 'Pedestrian'和'Cyclist'。

这里使用的是这位博主博客中的modify_annotations_txt.py工具,源码如下,注意!!!该工具直接在标签txt文件上修改,使用之前做好备份!!!。运行工具之前需要将kitti中的label_2文件夹拷贝到data/VOCdevit/VOC2007当中并重命名为Labels,modify_annotations_txt.py工具同样置于此文件夹下,然后执行如下命令:python modify_annotations_txt.py,就可以将类别合并,该博主博客中有运行前后对比,这里不再附加。

# modify_annotations_txt.py
import glob
import string

txt_list = glob.glob('./Labels/*.txt') # 存储Labels文件夹所有txt文件路径
def show_category(txt_list):
    category_list= []
    for item in txt_list:
        try:
            with open(item) as tdf:
                for each_line in tdf:
                    labeldata = each_line.strip().split(' ') # 去掉前后多余的字符并把其分开
                    category_list.append(labeldata[0]) # 只要第一个字段,即类别
        except IOError as ioerr:
            print('File error:'+str(ioerr))
    print(set(category_list)) # 输出集合

def merge(line):
    each_line=''
    for i in range(len(line)):
        if i!= (len(line)-1):
            each_line=each_line+line[i]+' '
        else:
            each_line=each_line+line[i] # 最后一条字段后面不加空格
    each_line=each_line+'\n'
    return (each_line)

print('before modify categories are:\n')
show_category(txt_list)

for item in txt_list:
    new_txt=[]
    try:
        with open(item, 'r') as r_tdf:
            for each_line in r_tdf:
                labeldata = each_line.strip().split(' ')
                if labeldata[0] in ['Truck','Van','Tram']: # 合并汽车类
                    labeldata[0] = labeldata[0].replace(labeldata[0],'Car')
                if labeldata[0] == 'Person_sitting': # 合并行人类
                    labeldata[0] = labeldata[0].replace(labeldata[0],'Pedestrian')
                if labeldata[0] == 'DontCare': # 忽略Dontcare类
                    continue
                if labeldata[0] == 'Misc': # 忽略Misc类
                    continue
                new_txt.append(merge(labeldata)) # 重新写入新的txt文件
        with open(item,'w+') as w_tdf: # w+是打开原文件将内容删除,另写新内容进去
            for temp in new_txt:
                w_tdf.write(temp)
    except IOError as ioerr:
        print('File error:'+str(ioerr))

print('\nafter modify categories are:\n')
show_category(txt_list)

7.2 kitti转voc(可能有问题,不建议使用)

格式转换参考另一位博主的博客,我只是将JPEGImages中的图片格式由jpg改为了png,另外我的存储标记信息的文件夹是Labels,也在下面代码中有体现。我将其命名为kitti2voc.py,与Labels位于同一目录下,执行以下命令即可完成转换:python kitti2voc.py

'''author:nike hu'''
# -*- coding: utf-8 -*-

import shutil
import os
import cv2

headstr = """\
<annotation>
    <folder>VOC2007</folder>
    <filename>%06d.png</filename>
    <source>
        <database>My Database</database>
        <annotation>PASCAL VOC2007</annotation>
        <image>flickr</image>
        <flickrid>NULL</flickrid>
    </source>
    <owner>
        <flickrid>NULL</flickrid>
        <name>company</name>
    </owner>
    <size>
        <width>%d</width>
        <height>%d</height>
        <depth>%d</depth>
    </size>
    <segmented>0</segmented>
"""
objstr = """\
    <object>
        <name>%s</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>%d</xmin>
            <ymin>%d</ymin>
            <xmax>%d</xmax>
            <ymax>%d</ymax>
        </bndbox>
    </object>
"""

tailstr = '''\
</annotation>
'''




def writexml(idx, head, bbxes, tail):
    filename = ("Annotations/%06d.xml" % (idx))
    f = open(filename, "w")
    f.write(head)
    for bbx in bbxes:
        f.write(objstr % (bbx[-1], bbx[0], bbx[1], bbx[0] + bbx[2], bbx[1] + bbx[3]))
    f.write(tail)
    f.close()


def clear_dir():
    if shutil.os.path.exists(('Annotations')):
        shutil.rmtree(('Annotations'))
    if shutil.os.path.exists(('ImageSets')):
        shutil.rmtree(('ImageSets'))
    # if shutil.os.path.exists(('JPEGImages')): # 因为我们已经将所有图片放到这个文件夹里面了,所以不需要再创建了
    #     shutil.rmtree(('JPEGImages'))

    shutil.os.mkdir(('Annotations'))
    shutil.os.makedirs(('ImageSets/Main'))
    # shutil.os.mkdir(('JPEGImages'))


def excute_datasets():
    '''在Main文件夹下面要创建四个文件,trainval是总样本的百分之九十,train是总数据的百分之七十,val是总数据样本的百分之20,剩下的百分之10是测试样本'''
    ftrainval = open(('ImageSets/Main/' + 'trainval' + '.txt'), 'a')
    ftrain = open(('ImageSets/Main/' + 'train' + '.txt'), 'a')
    fval = open(('ImageSets/Main/' + 'val' + '.txt'), 'a')
    ftest = open(('ImageSets/Main/' + 'test' + '.txt'), 'a')
    images = './JPEGImages/' # 这是存储图片的位置
    txtfile = './Labels/' # 这个是是存储标记信息的文件夹
    txtlist = os.listdir(txtfile)
    lenfile = len(txtlist) # 这个是标记的信息的总的文件数量
    count = 1 # 统计正在处理的数量
    for txtname in txtlist:
        txt_path = os.path.join(txtfile, txtname)
        image_path = os.path.join(images, txtname.split('.')[0] + '.png')  # 这里是图片的路径
        im = cv2.imread(image_path)  # 读取图片
        if im is None:  # 如果不存在这张照片,跳过
            continue
        head = headstr % (int(txtname.split('.')[0]), im.shape[1], im.shape[0], im.shape[2]) # xml文件的头部分
        boxes = []
        with open(txt_path, 'r') as f:
            while True:
                txt_content = f.readline().split(' ')
                if txt_content[0] == '':
                    break
                label_name = txt_content[0]
                if label_name == 'Misc' or label_name == 'DontCare': # 如果是这两类就去掉
                    continue
                box = [float(x) for x in txt_content[4:8]] # 这个是坐标
                box.append(label_name) # 把每个坐标对应的标签加入
                boxes.append(box)
        writexml(int(txtname.split('.')[0]), head, boxes, tailstr)
        if count < 0.9 * lenfile: # 总样本的百分之90部分存到trainval
            ftrainval.write('%06d\n' % (int(txtname.split('.')[0])))
            if count < 0.7 * lenfile: # 总样本的百分之70存入train
                ftrain.write('%06d\n' % (int(txtname.split('.')[0])))
            else: # 在0.7到0.9之间的数据存入val文件
                fval.write('%06d\n' % (int(txtname.split('.')[0])))
        else:
            ftest.write('%06d\n' % (int(txtname.split('.')[0])))
        count += 1
    ftrain.close() # 运行的时候出现过没有存进去的情况,原因是数据在内存中,还没有存在磁盘中,一般程序运行完会将数据放到磁盘中,或者用close语句
    ftest.close()
    ftrainval.close()
    fval.close()



if __name__ == '__main__':
    clear_dir()
    idx = excute_datasets()
    print('Complete...')


在MMdetection3D上使用KITTI数据集训练及性能评估 以下是我在MMdetection3D上使用KITTI数据集训练模型和评估模型性能的方法和详细步骤。 阅读详情

相关推荐

【MMDetection3D】环境搭建,使用PointPillers训练&测试&可视化KITTI数据集

MMDetection3D环境搭建,使用PointPillers训练&测试&可视化KITTI数据集

weixin_43799388的博客 2万+

win10 OpenPCDet 训练KITTI以及自己的数据集

win10 OpenPCDet 训练KITTI以及自己的数据集

m0_68312479的博客 1万+

避坑指南:在MMDetection3D上,用KITTI数据集训练CenterPoint模型时,我踩过的那些源码坑

本文分享了在MMDetection3D框架中使用KITTI数据集训练CenterPoint模型时遇到的五个典型问题及其解决方案,包括环境配置、数据维度不匹配、张量尺寸问题等,帮助开发者快速定位和解决源码中的常见错误。

cuanchuwei1207的博客 405

mmdetection3d基于kitti数据集训练pointpillars模型

当mmdetection3d环境安装成功后,可看上一篇如何安装mmdetection3d 1 准备工作 kitti数据集下载,下面是我的百度网盘里的kitti数据集,有需要的自取 链接: https://pan.baidu.com/s/1QlgVfl3vBbGEfF0QCo8N6A 提取码: milu 1.1 创建数据目录: mkdir -p data/kitti/ImageSets data/kitti/testing data/kitti/training 也可以不通过终端输入命令,直接

qq_46127597的博客 5706

MMDetection3D实战:从零开始用PointPillars训练KITTI数据集(附可视化避坑指南)

本文详细介绍了如何使用MMDetection3D框架从零开始训练PointPillars模型处理KITTI数据集,包括环境配置、数据预处理、模型训练和结果可视化等关键步骤。通过实战指南和避坑技巧,帮助开发者快速掌握3D目标检测技术,提升在自动驾驶领域的应用能力。

weixin_33724046的博客 649

【mmdetection3d】——3D 目标检测 KITTI 数据集

3D 目标检测 KITTI 数据集 本页提供了有关在 MMDetection3D 中使用 KITTI 数据集的具体教程。 注意:此教程目前仅适用于基于雷达和多模态的 3D 目标检测的相关方法,与基于单目图像的 3D 目标检测相关的内容会在之后进行补充。 数据准备 您可以在这里下载 KITTI 3D 检测数据并解压缩所有 zip 文件。 像准备数据集的一般方法一样,建议将数据集根目录链接到 $MMDETECTION3D/data。 在我们处理之前,文件夹结构应按如下方式组织: mmdetection3d ├─

m0_45388819的博客 6016

基于MMDetection的atss模型在kitti数据集上进行训练

首先先对COCO数据集的格式做一个介绍,coco数据集的目录结构如下:cocoimages:一个list,里面每个元素是一个字典,包含file_name,height,width,id等内容annotations:一个list,里面每个元素也是一个字典,包含segmentation, area, iscrowd, image_id, bbox, category_id, id等内容。其中对于目标检测任务有用的字段有id, image_id, category_id, bbox, area。

kybabcde的博客 1677

mmdetection3d 训练

mmdetection3d 训练 ​ 本节以SECOND算法为例,简要介绍mmdetection3d second算法训练过程,含数据和python源码详细介绍。 1 mmdetection3d环境安装 mmdetection3d环境详细安装和调试请参考:【mmdetection3d】mmdetection3d安装详细步骤_Coding的叶子的博客-优快云博客。 2 KITTI数据集准备 mmdetection3d的kitti原始数据集主要由三部份组成,......

叶子的博客 8365

基于Kitti数据集实现MMDetection3D点云物体检测训练

基于Kitti数据集实现MMDetection3D点云物体检测训练 贵在坚持!

DATABALL 的博客 627

opencv实践项目-图片拼接之缝合线算法

opencv 图片缝合线算法

wyw0000的博客 2624

DEAP数据集实战指南:从脑电信号到情绪分类的完整流程解析

本文提供了DEAP数据集在脑电信号情绪识别领域的完整实战指南。详细解析了数据下载、结构理解、频带功率特征提取等核心步骤,并演示了如何构建和评估机器学习分类模型,为研究者实现从原始脑电信号到情绪分类的完整流程提供了清晰路径。

jj890的博客 903

MMDetection3D框架下KITTI数据集训练技巧:如何优化PointPillars算法性能

本文深入探讨了在MMDetection3D框架下,针对KITTI数据集优化PointPillars算法性能的实战技巧。从数据预处理、体素化参数调优、批次大小与学习率协同,到多GPU训练效率瓶颈分析与高级优化策略(如混合精度训练),提供了系统性的调优指南,旨在帮助开发者显著提升3D目标检测模型的精度与训练效率。

weixin_28235513的博客 401

STM32 ADC精准采集12V电池电压:从分压电路到软件校准全解析

本文详细解析了STM32 ADC精准采集12V电池电压的全过程,涵盖分压电路设计、电阻选型、ADC配置优化及软件校准方法。针对电池电压监测中的噪声、温漂等挑战,提供了硬件滤波与软件过采样等实战技巧,确保测量精度达到1%以内,满足嵌入式设备对电源管理的严苛要求。

tech5的博客 1015

virtuoso-bridge-lite 确定性原理图规划器源码解析:Python 规划层如何实现可复现的器件布局

本文深入解析开源项目 **virtuoso-bridge-lite**(连接 LLM Agent 与 Cadence Virtuoso 的轻量桥梁)中的**确定性原理图规划器**:一个纯 Python 规划层如何把"器件 + 连接 + 布局约束"翻译成可复现的器件布局,让同一份拓扑元数据永远生成同一张原理图。全文基于源码 [src/virtuoso_bridge/virtuoso/schemati

gitblog_01118的博客 415

Anaconda/Miniconda的删除和安装

要在 MacBook 上删除 Anaconda 或 Miniconda,并重新安装它,您可以按照以下步骤进行操作。

qq_27390023的博客 3029

【DeepSeek开发入门】DeepSeek API 开发初体验

在人工智能蓬勃发展的时代,DeepSeek作为一款功能强大的AI大模型,为开发者提供了丰富的接口和便捷的开发体验。本文将基于DeepSeek的几个关键接口,带你快速入门,开启DeepSeek开发的探索之旅。通过本文,你已经初步了解了DeepSeek开发中几个重要接口的使用方法,包括列出模型、对话补全和查询余额接口,以及开发过程中的常见问题及解决办法。这是你踏入DeepSeek开发领域的第一步。在后续的学习中,你可以深入研究模型的参数调优,探索不同模型在各种场景下的应用,如利用模型实现更复杂的推理对话功能。

寻道AI,探索AI无限可能! 2758

不只是跑Demo:用MMDetection3D和KITTI数据集完成你的第一个3D检测模型训练与可视化分析

本文详细介绍了如何使用MMDetection3D框架和KITTI数据集完成3D目标检测模型的训练与可视化分析。从环境配置、数据预处理到SECOND模型训练与优化,提供全流程实战指南,帮助开发者快速掌握3D检测技术,适用于自动驾驶、机器人导航等领域。

weixin_29073241的博客 372

YOLOv12改进策略【模型轻量化】| 替换骨干网络为EfficientNet v1 高效的移动倒置瓶颈结构

本文记录的是基于。采用了创新性的方法,通过精心平衡网络和来提升性能。本文将的设计优势融入YOLOv12中,提升YOLOv12的性能与效率,使其在目标检测任务中表现更为出色。本文配置了原模型中的共种不同大小的模型结构,以满足不同的需求。

Limiiiing的博客 964

win10 mmdetection3d 训练KITTI

win10 mmdetection3d 训练KITTI

m0_68312479的博客 2692

一文搞懂自适应激光控制技术,开启光学新时代

自适应激光控制技术作为现代光学领域的关键技术,以其独特的原理和高效的工作机制,在科研、工业等众多领域展现出了巨大的应用价值。通过对激光波前的实时测量与补偿,它成功克服了激光在传输和应用过程中面临的诸多挑战,显著提升了激光的光束质量和应用效果。在科研领域,它助力天文观测突破大气湍流的限制,让我们得以更清晰地窥探宇宙的奥秘;在激光核聚变研究中,为实现高效的核聚变反应提供了关键支持,为解决能源问题带来了新的希望。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2529

【2025年阿里云暑期实习(算法岗)-4月24日-第一题(100分)- 小红听歌】(题目+思路+Java&C++&Python解析+在线测试)

小红正在听歌,屏幕上同时展示着歌词和对应的播放进度条。s1t101ti​0iti​1i小红每次可以操作快进或回退一个歌词(即将播放指针向右或向左移动一个位置),数据初始时和操作过程均保证已经播放的歌词是s的一个前缀(可为空串)。她的目标是:以尽可能少的操作次数,使得字符串s中未播放状态的歌词是"幸运串"。请你计算,为了达到该目标,至少需要多少次操作?(数据保证可以在有限次内完成操作目标)【幸运串】每种字母出现的次数为指定的次数,可为空串,具体可查看输入描述。

m0_73659489的博客 115

用MMDetection3D跑通KITTI数据集:从数据下载、预处理到训练PointPillars模型全流程

本文详细介绍了如何使用MMDetection3D框架在KITTI数据集上训练PointPillars模型的全流程,包括环境配置、数据预处理、模型训练与优化。特别针对工程实践中的常见问题提供解决方案,帮助开发者快速掌握3D目标检测技术,提升自动驾驶场景下的检测精度。

weixin_30301449的博客 241

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

mmdetection3D系列--(2)数据集准备

mmdetection3d支持很多数据集,比如说kitti,NuScenes,waymo,Lyft,S3DIS、ScanNet 和 SUN RGB-D。这里要根据自己的任务去选择相应的数据集,是作2d/3d检测的,还是作分割的,都是不一样的。但是这些数据由于格式和规则的不同,很可能带来麻烦,所以mmdetection准备了一些脚本,来把下载好的数据转换成训练/测试脚本能识别的格式。从而在该数据集上进行后续的工作。

qq_45783225的博客 2085

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

qq_42835363的博客 4570

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MMdetection3D学习系列(二)——KITTI数据集训练测试及可视化

mmdet3d对kitti数据集的训练测试及可视化

onepunch_k的博客 3722
上一篇: OpenPCDet在Xavier上的环境配置
下一篇: 目标检测之Label Assignment
阿瓜瓜瓜
博客等级 码龄9年 18粉丝 51原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值