news 2026/10/8 19:15:48

PV-RCNN 点-体素特征集抽象:在 mmdetection3d 中复现与配置 KITTI 3D 目标检测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PV-RCNN 点-体素特征集抽象:在 mmdetection3d 中复现与配置 KITTI 3D 目标检测
  • 人工智能
  • 计算机视觉
  • 深度学习
  • 自动驾驶

【免费下载链接】mmdetection3d

OpenMMLab's next-generation platform for general 3D object detection.

项目地址:https://gitcode.com/gh_mirrors/mm/mmdetection3d
点击查看免费下载

导读

PV-RCNN(Point-Voxel RCNN)是 3D 目标检测领域的代表性两阶段算法,其核心贡献在于将体素表征的高效计算与点云表征的精细感受野统一到同一框架中:第一阶段用稀疏 3D 卷积在体素空间高效提取多尺度特征并生成 3D 候选框,第二阶段通过"点-体素特征集抽象"(Point-Voxel Feature Set Abstraction)把体素特征反哺到原始点云的关键点上,进而对候选框做精细化分类与回归。本文以 mmdetection3d 仓库中 PV-RCNN 的官方实现为对象,逐层解读 configs/pv_rcnn/pv_rcnn_8xb2-80e_kitti-3d-3class.py 这一完整配置:从数据增强管线、体素化与稀疏编码器,到VoxelSetAbstraction点特征融合、RPN 与 RoI Head 的损失配置,再到 KITTI 上的复现结果与训练/测试/推理命令。读完本文,你将能够从源码级理解 PV-RCNN 在 mmdetection3d 中的完整数据流,并能在自己的 KITTI 数据上直接复现、调参或改造。

一、算法背景:为什么需要"点-体素"融合

1.1 问题动机

LiDAR 点云是自动驾驶与机器人感知中最主要的 3D 场景信息来源,但原始点云具有稀疏、非规则、分布不均的特点,直接在其上做特征学习存在两大矛盾:

  • 体素化方案的矛盾:将点云离散为规则体素后可以使用高效的 3D 稀疏卷积(如 SECOND 的 SparseConv)与 BEV 特征图,计算效率高、适合并行,但体素化本身会造成信息损失,且难以感知"点级别"的精细结构;
  • 纯点云方案的矛盾:PointNet++ 这类直接处理原始点的网络保留了几何细节,但全场景的邻域搜索与采样开销大,难以在远距离、大场景(如自动驾驶的 70m 感知范围)中高效工作。

PV-RCNN 论文提出的方案是分治 + 融合:先用体素分支高效编码全场景上下文,再把体素特征"投影"回一组稀疏的关键点上,让后续的候选框细化(refinement)在富含上下文信息的点特征上进行。

1.2 核心组件:Voxel Set Abstraction(VSA)

VSA 是 PV-RCNN 区别于普通两阶段 3D 检测器的核心模块。它先使用FPS(最远点采样)从原始点云中采样固定数量的关键点(本配置为 2048 个),然后让每个关键点通过多组Set Abstraction模块,同时从三类来源聚合特征:

  1. 原始点云:关键点邻域内的原始点特征(rawpoints_sa_cfgs);
  2. 多尺度体素特征:稀疏编码器中间层的多尺度体素中心特征(voxel_sa_cfgs_list,对应 4 个尺度,scale_factor分别为 1/2/4/8);
  3. BEV 特征图:通过双线性插值从 BEV 特征图采样(bev_feat_channel=256,bev_scale_factor=8)。

三类特征拼接后送入一个1x1卷积融合层,压缩为统一的点特征(fused_out_channel=128),供后续 RoI 细化使用。该模块在仓库中的实现见 mmdet3d/models/middle_encoders/voxel_set_abstraction.py 的VoxelSetAbstraction类(从源码结构看,其forward依次执行sample_key_points的 FPS 采样、interpolate_from_bev_features的 BEV 双线性插值,以及rawpoints_sa_layer与voxel_sa_layers两组 SA 聚合,最终经point_feature_fusion_layer融合输出)。

二、mmdetection3d 中的整体实现:PointVoxelRCNN

在 mmdetection3d 中,PV-RCNN 的检测器类名为PointVoxelRCNN,继承自TwoStage3DDetector,源码位于 mmdet3d/models/detectors/pv_rcnn.py。与常规两阶段检测器不同,它的构造参数额外包含三个专用模块:

构造参数配置中的类型作用
voxel_encoderHardSimpleVFE体素内点特征编码(简单 VFE)
middle_encoderSparseEncoder稀疏 3D 卷积编码器,输出多尺度特征与 BEV 特征
points_encoderVoxelSetAbstraction点-体素特征集抽象,产出关键点特征

从前向流程看(pv_rcnn.py 的extract_feat/extract_points_feat/predict/loss),数据流可概括为:

  1. 体素化与点特征编码:Det3DDataPreprocessor(voxel=True)将原始点云转为 voxels;
  2. 第一阶段(RPN):HardSimpleVFE→SparseEncoder(return_middle_feats=True,同时输出多尺度稀疏特征multi_scale_3d_feats与 BEV 特征spatial_feats)→SECOND骨干 →SECONDFPN颈部 →PartA2RPNHead生成 3D 候选框;
  3. 点特征提取:VoxelSetAbstraction采样 2048 个关键点,聚合原始点、多尺度体素与 BEV 三类特征,输出keypoints/keypoint_features/fusion_keypoint_features;
  4. 第二阶段(RoI Head):PVRCNNRoiHead先由ForegroundSegmentationHead做前景语义分割,再用Batch3DRoIGridExtractor在每个候选框内生成6x6x6网格点并聚合关键点特征,最后由PVRCNNBBoxHead完成分类与回归。
原始点云 ──体素化──> HardSimpleVFE ──> SparseEncoder ──> SECOND + SECONDFPN ──> PartA2RPNHead ──> 3D 候选框 │ │ │ │ └──── FPS 采样 2048 关键点 <── 多尺度体素特征 / BEV 特征 / 原始点特征(VoxelSetAbstraction)│ │ PVRCNNRoiHead(前景分割 + 6x6x6 网格 RoI 特征 + 分类回归)<──┘

2.1 体素编码与稀疏中间编码器

配置中voxel_size = [0.05, 0.05, 0.1]、point_cloud_range = [0, -40, -3, 70.4, 40, 1],即感知范围覆盖前方 0~70.4m、横向 -40~40m、高度 -3~1m,体素分辨率为 5cm x 5cm x 10cm,因此稀疏特征空间的形状为[41, 1600, 1408](sparse_shape)。

  • max_num_points=5:每个体素最多容纳 5 个点(max_points_per_voxel);
  • max_voxels=(16000, 40000):训练/测试阶段分别允许的最大非空体素数,用于显存控制;
  • HardSimpleVFE:将每个体素内最多 5 个点的 4 维特征(x, y, z, intensity)做逐点 MLP 后最大池化,得到体素级特征;
  • SparseEncoder的return_middle_feats=True是 PV-RCNN 的关键开关:它让稀疏编码器把 4 个下采样阶段的中间稀疏特征一并返回(multi_scale_3d_feats),供 VSA 模块跨尺度聚合。各阶段的encoder_paddings控制 3D 稀疏卷积的 padding,其中((1, 1, 1), 0, 0)表示仅在 z 维度 pad 1 个格子(体素尺寸在 z 方向为 0.1m,用于将边界外扩)。

2.2 第二阶段:PVRCNNRoiHead 三件套

RoI Head 定义于 mmdet3d/models/roi_heads/pv_rcnn_roi_head.py 的PVRCNNRoiHead,由三个子模块组成:

(1)前景语义分割头ForegroundSegmentationHead(mmdet3d/models/roi_heads/mask_heads/foreground_segmentation_head.py):对 2048 个关键点做二分类前景/背景预测(in_channels=640与 VSA 融合前特征通道数一致),其 sigmoid 输出在后续作为"前景置信门控":fusion_keypoint_features * seg_preds.sigmoid().max(...),即只有被判为前景的关键点特征才参与 RoI 网格聚合,从而抑制背景噪声(见 pv_rcnn_roi_head.py 的_bbox_forward与predict)。分割损失使用mmdet.FocalLoss,reduction='sum'且activated=True。

(2)RoI 网格特征提取器Batch3DRoIGridExtractor(mmdet3d/models/roi_heads/roi_extractors/batch_roigridpoint_extractor.py):对每个候选框在其内部生成6x6x6 = 216个均匀网格点(grid_size=6),用一组StackedSAModuleMSG(radius=(0.8, 1.6),双半径sample_nums=(16, 16),pool_mod='max')从关键点特征中聚合出每个网格点的特征,最终输出(BxN, 6, 6, 6, C)形状的体素化 RoI 特征。

(3)细化头PVRCNNBBoxHead(mmdet3d/models/roi_heads/bbox_heads/pv_rcnn_bbox_head.py):输入为in_channels=128 * 6^3(网格展开),经shared_fc_channels=(256, 256)共享全连接层后,分出分类支路(cls_channels=(256, 256))与回归支路(reg_channels=(256, 256)),dropout_ratio=0.3防止过拟合。关键设置class_agnostic=True表示类别无关的细化(分类分数由 RPN 的labels_3d携带),回归用DeltaXYZWLHRBBoxCoder编码,并额外启用with_corner_loss=True计算 8 个角点的 Huber 损失(get_corner_loss_lidar),以增强框角点的几何约束。

三、完整配置逐段拆解:pv_rcnn_8xb2-80e_kitti-3d-3class.py

3.1 基础继承

该配置继承了三份基础配置(相对路径均从仓库根目录出发):

_base_ = [ '../_base_/datasets/kitti-3d-3class.py', # KITTI 3 类(Pedestrian/Cyclist/Car)数据配置 '../_base_/schedules/cyclic-40e.py', # 余弦退火 + 动量余弦的循环调度 '../_base_/default_runtime.py' # 日志、checkpoint、hook 等运行时默认设置 ]

注意:模型名为pv_rcnn_8xb2-80e_kitti-3d-3class,其中的 "80e" 源于cyclic-40e.py的调度配合RepeatDataset的重复机制(train_cfg中max_epochs=40基础上再循环放大),README 中给出的训练显存 5.4GB、mAP 72.28 即按该设置复现。此外配置将class_names定义为['Pedestrian', 'Cyclist', 'Car']并通过metainfo = dict(CLASSES=class_names)注入。

3.2 数据管线:训练与测试

训练管线(train_pipeline)包含以下依次执行的数据变换,全部定义于 mmdet3d/datasets/transforms 中:

变换关键参数作用
LoadPointsFromFilecoord_type='LIDAR',load_dim=4,use_dim=4读取 LiDAR 坐标点云,保留 x/y/z/intensity 4 维
LoadAnnotations3Dwith_bbox_3d=True, with_label_3d=True加载 3D 框与类别标签
ObjectSampledb_sampler,use_ground_plane=True基于 GT 数据库(kitti_dbinfos_train.pkl)的点云增强采样
RandomFlip3Dflip_ratio_bev_horizontal=0.550% 概率水平翻转
GlobalRotScaleTransrot_range=[-0.7854, 0.7854](±45°),scale_ratio_range=[0.95, 1.05]全局旋转 + 缩放
PointsRangeFilterpoint_cloud_range裁剪点云到感知范围
ObjectRangeFilterpoint_cloud_range剔除范围外的 GT 框
PointShuffle-打乱点顺序
Pack3DDetInputskeys=['points', 'gt_bboxes_3d', 'gt_labels_3d']打包模型输入

其中db_sampler的sample_groups=dict(Car=15, Pedestrian=10, Cyclist=10)控制每帧最多从数据库采样的各类别数量,filter_by_min_points则要求 GT 框内至少包含 5 个点才参与采样。

测试管线(test_pipeline)相对简洁:仅做MultiScaleFlipAug3D包裹的恒等变换(rot_range=[0,0]、scale_ratio_range=[1,1]、flip=False),保证测试时不做随机增强,最后以Pack3DDetInputs打包points。

3.3 模型结构配置

模型model字典的组装顺序与 2.1~2.2 节描述一一对应,核心字段及含义如下:

数据预处理器:

data_preprocessor=dict( type='Det3DDataPreprocessor', voxel=True, voxel_layer=dict( max_num_points=5, # 每个体素最大点数 point_cloud_range=point_cloud_range, voxel_size=voxel_size, max_voxels=(16000, 40000))) # 训练/测试最大非空体素数

体素编码与稀疏编码器:

voxel_encoder=dict(type='HardSimpleVFE'), middle_encoder=dict( type='SparseEncoder', in_channels=4, sparse_shape=[41, 1600, 1408], order=('conv', 'norm', 'act'), encoder_paddings=((0, 0, 0), ((1, 1, 1), 0, 0), ((1, 1, 1), 0, 0), ((0, 1, 1), 0, 0)), return_middle_feats=True) # 关键:返回多尺度中间稀疏特征供 VSA 使用

点-体素特征集抽象(VSA):num_keypoints=2048、fused_out_channel=128。四组voxel_sa_cfgs_list的StackedSAModuleMSG分别对应尺度因子 1/2/4/8,半径随尺度放大((0.4, 0.8) → (0.8, 1.2) → (1.2, 2.4) → (2.4, 4.8)),mlp_channels的输入通道数与前一级稀疏特征通道匹配(16/32/64/64)。rawpoints_sa_cfgs用in_channels=1从原始点(仅坐标)聚合特征。BEV 侧bev_feat_channel=256, bev_scale_factor=8对应 SECOND 骨干输出的 BEV 特征图分辨率。

骨干与颈部:

backbone=dict(type='SECOND', in_channels=256, layer_nums=[5, 5], layer_strides=[1, 2], out_channels=[128, 256]), neck=dict(type='SECONDFPN', in_channels=[128, 256], upsample_strides=[1, 2], out_channels=[256, 256]),

RPN 头:PartA2RPNHead,in_channels=512为 FPN 输出的两路 256 通道拼接。anchor_generator使用Anchor3DRangeGenerator,为三个类别分别定义锚框:

  • ranges:Pedestrian/Cyclist 的中心 z 为 -0.6,Car 为 -1.78;
  • sizes:[0.8, 0.6, 1.73](Pedestrian)、[1.76, 0.6, 1.73](Cyclist)、[3.9, 1.6, 1.56](Car);
  • rotations=[0, 1.57]:每个位置两种朝向(0 与 π/2)。

损失配置:mmdet.FocalLoss(gamma=2.0, alpha=0.25,权重 1.0)做分类;mmdet.SmoothL1Loss(beta=1/9,权重 2.0)做框回归;mmdet.CrossEntropyLoss(权重 0.2)做方向分类(use_direction_classifier=True, dir_offset=0.78539)。assigner_per_size=True与assign_per_class=True意味着每个类别有独立的正负样本分配器。

RoI Head:语义分割头in_channels=640(VSA 聚合前的特征通道:原始点 32 + 四尺度体素 4x(32+32)=256… 由VoxelSetAbstraction累加得到)加extra_width=0.1(GT 框外扩宽度,用于生成前景分割目标);网格提取器grid_size=6;细化头in_channels=128、grid_size=6、class_agnostic=True,loss_bbox与loss_cls均使用reduction='sum'。

3.4 训练与测试配置:分配器、采样器与 NMS

RPN 训练(train_cfg.rpn):三个类别各自独立使用Max3DIoUAssigner(BboxOverlapsNearest3D计算 IoU),Car 的阈值更严格(pos_iou_thr=0.6, neg_iou_thr=0.45),Pedestrian/Cyclist 为0.5/0.35,min_pos_iou与各自 neg 阈值一致。rpn_proposal阶段nms_pre=9000 → nms_post=512 → max_num=512,nms_thr=0.8,使用旋转 NMS(use_rotate_nms=True)。

RoI 训练(train_cfg.rcnn):三个类别的分配器阈值统一(pos_iou_thr=0.55, neg_iou_thr=0.55),IoU 计算改用BboxOverlaps3D且coordinate='lidar';采样器为IoUNegPiecewiseSampler:每 batch 采样num=128个 RoI(pos_fraction=0.5),负样本按 IoU 分两段(neg_piece_fractions=[0.8, 0.2],对应阈值[0.55, 0.1]),return_iou=True使分类目标可以采用软标签——见 pv_rcnn_bbox_head.py 的_get_target_single:当 IoU 处于cls_pos_thr=0.75与cls_neg_thr=0.25之间时,标签被设置为iou * 2 - 0.5的连续值而非 0/1。

测试(test_cfg):RPN 侧nms_pre=1024 → nms_post=100 → max_num=100、nms_thr=0.7;RoI 侧use_rotate_nms=True, use_raw_score=True, nms_thr=0.1, score_thr=0.1。

3.5 优化器与学习率调度

配置覆盖了基础调度中的lr = 0.001,优化器沿用cyclic-40e.py的AdamW(betas=(0.95, 0.99), weight_decay=0.01,梯度裁剪max_norm=10)。调度器为两段余弦退火 + 动量余弦(见 configs/base/schedules/cyclic-40e.py):

  • 0~15 epoch:学习率由 0 升温至lr*10 = 0.01(CosineAnnealingLR,T_max=15,eta_min=lr*10),动量由 0 升温至0.85/0.95;
  • 15~40 epoch:学习率由lr*10余弦退火至lr*1e-4,动量趋向 1。

这种"先热身后冷却"的循环策略是 KITTI 数据集上 SECOND 系列模型的标准做法,配合RepeatDataset可等效实现 80 epoch 的训练。

3.6 Dataloader 与评估

train_dataloader = dict(batch_size=2, num_workers=2, dataset=dict(dataset=dict(pipeline=train_pipeline, metainfo=metainfo))) test_dataloader = dict(dataset=dict(pipeline=test_pipeline, metainfo=metainfo)) eval_dataloader = dict(dataset=dict(pipeline=test_pipeline, metainfo=metainfo))

外层dict(dataset=...)即RepeatDataset包装,metainfo将类别名注入每个 data sample;batch_size=2对应 README 中 5.4GB 显存占用(8 张 A100 GPU 的分布式训练环境下,单卡 2 个样本)。

四、KITTI 上的复现结果

4.1 总览

README 给出的官方复现结果如下(该表同时登记于 configs/pv_rcnn/metafile.yml):

BackboneClassLr schdMem (GB)mAP
SECFPN3 Classcyclic 80e5.472.28

说明:mAP 为 3 类在moderate难度下的AP11结果(KITTI 官方 11 点插值 AP)。

4.2 分难度分类别精度(AP11, 3D)

类别EasyModerateHard
Car89.2083.7278.79
Pedestrian66.6459.8455.33
Cyclist87.2573.2769.61

从结果可以看出:Car 与 Cyclist 在三个难度上表现均衡且精度较高,Pedestrian 相对偏低(小目标、形状多变),这与 KITTI 3D 检测的整体难度分布一致。评估器为 mmdet3d/evaluation/metrics/kitti_metric.py 对应的 KITTI 官方评测协议。

五、训练、测试与推理实操

以下命令均基于仓库自带的 tools/train.py、tools/test.py 与 demo/pcd_demo.py(先按 docs/en/user_guides/dataset_prepare.md 准备 KITTI 数据并生成kitti_infos_train.pkl、kitti_dbinfos_train.pkl)。

单机单卡训练:

python tools/train.py configs/pv_rcnn/pv_rcnn_8xb2-80e_kitti-3d-3class.py

单机多卡分布式训练:

bash tools/dist_train.sh configs/pv_rcnn/pv_rcnn_8xb2-80e_kitti-3d-3class.py 8

测试评估:

python tools/test.py configs/pv_rcnn/pv_rcnn_8xb2-80e_kitti-3d-3class.py \ <checkpoint.pth> --cfg-options '--eval' 'kitti_map'

点云可视化推理:

python demo/pcd_demo.py <point_cloud.bin> \ configs/pv_rcnn/pv_rcnn_8xb2-80e_kitti-3d-3class.py <checkpoint.pth>

需要说明:由于训练显存约 5.4GB/卡,单卡(如 24GB 显存的消费级/专业卡)即可完整训练该模型;分布式脚本中的 GPU 数量应与train_dataloader的batch_size配合考虑,且auto_scale_lr默认关闭。

六、测试验证与实现要点

仓库针对该实现提供了单元测试 tests/test_models/test_detectors/test_pvrcnn.py:

  • 断言mmdet3d.models中存在PointVoxelRCNN模块;
  • 直接从pv_rcnn/pv_rcnn_8xb2-80e_kitti-3d-3class.py读取配置并用MODELS.build构建模型(get_detector_cfg),说明该配置是开箱即用、可被配置系统完整解析的;
  • 在 CUDA 环境下执行mode='predict'与mode='loss'两种前向,验证输出包含bboxes_3d/scores_3d/labels_3d,且六项损失(loss_rpn_cls、loss_rpn_bbox、loss_rpn_dir、loss_semantic、loss_bbox、loss_cls、loss_corner)都能正确计算——这与 pv_rcnn.py 中loss()将 RPN 损失与 RoI 损失合并返回的实现相互印证。

从实现要点上值得注意的工程细节还包括:

  1. 显存优化:max_voxels=(16000, 40000)与num_keypoints=2048是平衡精度与内存的关键旋钮;调大num_keypoints会提升 RoI 特征覆盖但增加 VSA 计算量;
  2. return_middle_feats:去掉该开关将导致VoxelSetAbstraction无法拿到多尺度体素特征,VSA 模块会退化为仅聚合原始点与 BEV 特征;
  3. 前景门控:RoI 特征在送入网格提取器前会乘以前景分割的 sigmoid 分数,这是 PV-RCNN 抑制背景关键点噪声、提升细粒度回归精度的核心机制(见 pv_rcnn_roi_head.py 的_bbox_forward)。

七、扩展阅读

  • 配置文件的模型基础定义可对照 configs/base/models 中的parta2.py、second_hv_secfpn_kitti.py等基础模板理解其继承关系;
  • 与 PV-RCNN 结构相近的两阶段模型(如 Part-A2、PointRCNN)分别位于 mmdet3d/models/detectors/parta2.py 与 mmdet3d/models/detectors/point_rcnn.py,可对比其extract_feat的差异理解不同融合策略;
  • 数据准备、训练测试与模型库索引可参考 docs/en/user_guides/train_test.md、docs/en/user_guides/dataset_prepare.md 与 configs/pv_rcnn/metafile.yml。

引用

若在研究中引用 PV-RCNN,请使用官方 README 提供的 BibTeX:

@article{ShaoshuaiShi2020PVRCNNPF, title={PV-RCNN: Point-Voxel Feature Set Abstraction for 3D Object Detection}, author={Shaoshuai Shi and Chaoxu Guo and Li Jiang and Zhe Wang and Jianping Shi and Xiaogang Wang and Hongsheng Li}, journal={computer vision and pattern recognition}, year={2020} }
  • 人工智能
  • 计算机视觉
  • 深度学习
  • 自动驾驶

【免费下载链接】mmdetection3d

OpenMMLab's next-generation platform for general 3D object detection.

项目地址:https://gitcode.com/gh_mirrors/mm/mmdetection3d
点击查看免费下载

相关推荐

上一篇:WebAssembly模块签名验证终极指南:确保代码安全运行的完整教程
下一篇:Structurae排序结构详解:BinaryHeap与SortedArray使用指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 19:15:21

claude-mem:为Claude Code打造长期记忆的终端AI扩展工具

1. 项目整体设计与思路拆解1.1 为什么需要 claude-mem 这类记忆工具用过 Claude Code 或者经常和 Claude 聊天的人应该都有同感&#xff1a;单次会话里它能记住你交代的上下文&#xff0c;但一旦关闭终端、开启一个新会话&#xff0c;之前聊过的内容就像被格式化了一样&#xf…

作者头像 李华
网站建设 2026/10/8 19:15:18

t3code轻量代码片段管理:SQLite全文检索与CLI实践

1. 从“t3code”这个关键词说起&#xff1a;它到底指什么第一次看到“t3code”这个词&#xff0c;很多人会一头雾水。它不像“Python”“Docker”那样有明确的官方定义&#xff0c;也不像某个大厂框架那样有完整的文档站。我在几个技术社区翻了一圈&#xff0c;发现这个词的用法…

作者头像 李华
网站建设 2026/10/8 19:13:01

题解:洛谷 P1553 数字反转(升级版)

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…

作者头像 李华
网站建设 2026/10/8 19:10:15

TPS259483与STM32L031构建嵌入式电源路径保护系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/8 19:07:30

嵌入式电源路径保护:eFuse与MCU协同的闭环管理方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华