1. 深度学习与计算机视觉到底在解决什么问题1.1 从两个热搜词说起为什么这两个词总被绑在一起深度学习与计算机视觉这两个词在搜索框里几乎是连体婴。你搜“计算机视觉入门”下面必然跟着“深度学习”你搜“深度学习项目”十个里有八个是图像识别。这不是巧合而是过去十年里这两个领域互相成就的结果。先说计算机视觉要干什么。简单讲就是让机器“看懂”图像和视频。传统方法靠人工设计特征——边缘检测、角点提取、SIFT、HOG工程师得告诉机器“什么是边缘”“什么是纹理”。这套方法在受控环境下能用但换一个光照、换一个角度效果就崩了。深度学习的出现改变了这个局面不再由人告诉机器该看什么而是让机器自己从大量数据里学出该看什么。卷积神经网络CNN就是这场变革的核心工具。所以这两个词绑在一起本质上是因为深度学习是目前计算机视觉最有效的方法论而计算机视觉是深度学习最成熟、最直观的落地场景之一。你如果打算入门CV绕不开深度学习你如果打算学深度学习CV是最好的练手场。1.2 适合谁来读这篇内容这篇内容面向三类人。第一类是刚接触这个方向的学生或转行者面对“深度学习环境配置”“计算机视觉学习路线”这些热搜词不知道从哪下手。第二类是有一定编程基础、想做大作业或项目的开发者需要一套能跑通的思路和避坑指南。第三类是已经在做传统图像处理、想了解深度学习能带来什么改变的工程师。我不打算写成教科书而是按一个实际做过多个CV项目的人的经验来组织。该讲原理的地方讲清楚为什么该给代码的地方给能跑的代码该提醒坑的地方绝不客气。你读完应该能自己搭起环境、理解CNN的核心机制、跑通一个图像分类项目并且知道后续往哪个方向深入。2. 核心概念拆解深度学习、机器学习、LLM到底什么关系2.1 机器学习与深度学习的区别不是“新旧”而是“特征由谁来找”热搜里常出现“计算机视觉和机器学习区别”“深度学习算法”这类问题。很多人把机器学习、深度学习、计算机视觉当成三个并列的东西其实它们是包含关系。机器学习是一个大框架给定数据让算法自动找到从输入到输出的映射。传统机器学习算法包括决策树、支持向量机、随机森林等。这些算法在处理结构化数据表格、数值时非常有效但处理图像这种高维非结构化数据时需要先做特征工程——也就是人工把图像转换成一组有意义的数值特征再喂给算法。深度学习是机器学习的一个子集它的核心特点是用多层神经网络自动完成特征提取。你不需要告诉它“先找边缘再找角点再找轮廓”它自己从原始像素开始一层一层抽象出越来越高级的特征。浅层学到边缘和颜色中层学到纹理和局部形状深层学到物体部件甚至整个物体。计算机视觉则是一个应用领域目标就是让机器理解图像。它可以用传统方法做也可以用深度学习方法做。目前主流是后者。用一个生活类比传统机器学习像是你请了一个助手你得先教他“看到圆形、有柄、有盖的东西叫杯子”他才能识别杯子。深度学习像是你直接把一堆杯子照片扔给他他自己总结出杯子的特征。你省了教的过程但需要给他足够多的照片和足够强的“脑子”。2.2 LLM算不算深度学习一个被热搜问烂了的问题“llm是否属于深度学习”这个问题搜索量很高说明很多人对概念边界不清楚。答案是LLM大语言模型属于深度学习而且是深度学习中基于Transformer架构的一类模型。深度学习不等于CNN。CNN只是深度学习在图像领域最常用的架构。深度学习还包括循环神经网络RNN、Transformer、生成对抗网络GAN、扩散模型等。LLM就是Transformer架构在自然语言处理领域的规模化应用。所以LLM和CNN是“兄弟关系”都属于深度学习这个大家族只是擅长的数据类型不同——CNN擅长图像Transformer擅长序列文本、语音、时间序列。理解这一点很重要因为现在很多CV项目开始引入Transformer架构如ViTVision Transformer把图像切成小块当成序列来处理。如果你只学CNN看到ViT会懵如果你理解深度学习的通用框架就能平滑过渡。2.3 深度学习里的parameter到底是不是MB热搜里有个很有意思的问题“深度学习里的parameter应该不是mb吧”。这个问题看似小白但问到了点子上。Parameter参数和MB兆字节是两个维度的东西。Parameter指的是模型中可学习的权重和偏置单位是“个”。比如一个CNN有100万个参数意思是它有100万个需要训练调整的数值。MB是存储单位衡量这些参数占多大磁盘或显存。一个参数通常是32位浮点数float32占4字节。所以100万参数约占4MB100万×4字节÷1024÷1024。如果做量化到16位或8位占用会更小。所以parameter是“数量”MB是“体积”。你看到“模型有7B参数”指的是70亿个可学习数值你看到“模型文件13GB”指的是这些数值加上其他结构占的存储空间。两者通过数据类型和数量换算关联但不是一回事。3. 计算机视觉的核心任务与深度学习如何介入3.1 图像分类、目标检测、语义分割从粗到细的三级台阶计算机视觉的任务可以按输出粒度分成几个层次。最粗的是图像分类给一张图判断它是什么类别比如猫还是狗。输出是一个类别标签。这是CV的入门任务也是理解CNN的最佳起点。往细一层是目标检测不仅要知道图里有什么还要知道每个物体在哪。输出是一组边界框加类别标签。经典模型有YOLO系列、Faster R-CNN等。再往细是语义分割给每个像素分配一个类别标签比如这张图里哪些像素是路、哪些是车、哪些是人。输出是一张和输入同尺寸的掩码图。更细的还有实例分割区分同一类别的不同个体。深度学习介入的方式是端到端训练。传统方法做目标检测需要手工设计候选框生成策略、特征描述子、分类器流程长且每步都可能出错。深度学习把大部分环节统一到一个网络中输入图像输出检测结果中间的特征提取和决策都由网络自己学。3.2 几何偏置CNN为什么天生适合处理图像热搜里有个词叫“计算机视觉几何偏置”这其实是理解CNN的关键。几何偏置指的是CNN架构中内置的对图像几何变换的假设。具体来说有三个核心特性局部连接每个神经元只连接输入图像的一个小区域而不是全图。这符合图像的局部相关性——相邻像素关系密切远处像素关系弱。权重共享同一个卷积核在整张图上滑动用同一组权重处理不同位置。这意味着如果网络在左上角学会了识别猫耳朵它在右下角也能识别。平移等变性物体在图中移动网络的响应也跟着移动而不是完全失效。这三个特性合起来就是CNN的几何偏置。它大幅减少了参数数量相比全连接网络提高了数据效率让CNN在图像任务上远超普通神经网络。你可以把这理解为给网络“预装”了关于图像结构的先验知识它不需要从零学“相邻像素更相关”这件事。3.3 从LeNet到ViT架构演进的几个关键节点CNN的演进有几个里程碑。LeNet-5在1998年用于手写数字识别是最早的卷积网络之一。AlexNet在2012年ImageNet竞赛中大幅领先引爆了深度学习在CV的应用。VGG用更深的网络证明深度的重要性。ResNet引入残差连接解决了深层网络训练困难的问题让上百层的网络成为可能。后来Transformer从NLP跨界到CVViTVision Transformer把图像切成16×16的块当成序列输入Transformer。在足够大的数据集上ViT能超过最好的CNN。但ViT缺少CNN的几何偏置需要更多数据来弥补。后续的Swin Transformer、ConvNeXt等工作试图结合两者优势。对入门者来说我的建议是先把CNN吃透。CNN的直觉更贴近图像本质调试起来也更容易理解。ViT可以作为进阶内容等你对注意力机制有感觉了再上手。4. 环境配置从零搭起能跑深度学习的环境4.1 硬件选择CPU、GPU、NPU到底怎么选“深度学习环境搭建cpu版”“npu电脑部署深度学习环境”这些热搜说明很多人在硬件选择上纠结。我的经验是入门阶段CPU完全够用但一旦开始训练稍大的模型GPU是刚需。CPU版环境适合跑通代码、调试逻辑、做小规模实验。PyTorch和TensorFlow都支持CPU运行安装也简单。但训练一个ResNet-50在CPU上可能要几小时甚至几天在GPU上可能只要几分钟。如果你只是学习概念、跑通流程CPU版起步没问题。如果你要做课程大作业或实际项目建议至少有一块入门级GPU。NPU神经网络处理单元是近年一些电脑上集成的AI加速芯片。部署NPU环境需要厂商提供的驱动和推理框架目前生态不如CUDA成熟。如果你用的是带NPU的电脑可以尝试但遇到问题可参考的资料相对少。我的建议是入门优先选NVIDIA GPU CUDA资料最全踩坑最少。4.2 Python环境管理Miniconda为什么是首选“miniconda深度学习”这个热搜说明很多人已经意识到环境隔离的重要性。深度学习项目依赖复杂不同项目可能需要不同版本的PyTorch、CUDA、Python。如果你把所有包都装在系统Python里迟早会遇到版本冲突。Miniconda是Anaconda的轻量版只包含conda和Python不预装大量科学计算包。你可以为每个项目创建独立环境conda create -n cv_env python3.10 conda activate cv_env这样每个项目的依赖互不干扰。我习惯给每个项目单独建环境名字带项目缩写比如cv_basic、cv_detection。环境建好后安装PyTorch# CPU版本 pip install torch torchvision torchaudio # GPU版本CUDA 11.8示例 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118具体CUDA版本要根据你的显卡驱动来选。用nvidia-smi查看驱动支持的CUDA版本然后去PyTorch官网找对应安装命令。这一步很多人卡住核心就是版本要对齐显卡驱动→CUDA→PyTorch三者版本不匹配就会报错。4.3 IDE选择VS Code和PyCharm装哪个“学习计算机视觉需要visual studio code 和pycharm 安装哪个”这个问题没有标准答案但我可以给你一个决策依据。PyCharm专业版对科学计算和远程开发支持很好尤其是远程连接服务器调试深度学习代码很方便。社区版免费但功能受限。VS Code轻量、插件生态丰富配合Python插件和Jupyter插件可以很好地做数据科学和深度学习开发。VS Code的远程开发功能也很成熟。我的实际用法是本地小项目用VS Code需要远程连服务器跑大模型时用PyCharm专业版。如果你刚开始学VS Code免费且够用装好Python、Jupyter、Pylance插件就能开工。等你需要更强大的调试和远程功能时再考虑PyCharm。5. 动手环节用PyTorch跑通第一个图像分类项目5.1 数据集准备与预处理为什么归一化是必须的我们以CIFAR-10为例这是一个包含10类、6万张32×32彩色图像的数据集适合入门。PyTorch的torchvision提供了直接下载和加载的接口。预处理有两个关键步骤转Tensor和归一化。转Tensor把PIL图像或numpy数组转成PyTorch张量并把像素值从0-255缩放到0-1。归一化则是把每个通道的数值减去均值、除以标准差使数据分布接近标准正态。为什么要归一化因为神经网络对输入尺度敏感。如果输入值范围差异大梯度更新会不稳定训练收敛慢甚至发散。归一化让所有特征处于相近尺度优化器能更稳定地更新参数。CIFAR-10的常用均值是(0.4914, 0.4822, 0.4465)标准差是(0.2023, 0.1994, 0.2010)这是从训练集统计出来的。import torch import torchvision import torchvision.transforms as transforms transform_train transforms.Compose([ transforms.RandomCrop(32, padding4), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) trainset torchvision.datasets.CIFAR10(root./data, trainTrue, downloadTrue, transformtransform_train) trainloader torch.utils.data.DataLoader(trainset, batch_size128, shuffleTrue, num_workers2)这里加了随机裁剪和随机水平翻转这是数据增强的常用手段能提升模型泛化能力。注意测试集不要做随机增强只做归一化。5.2 定义一个简单CNN每一层到底在干什么下面是一个适合CIFAR-10的CNN结构import torch.nn as nn import torch.nn.functional as F class SimpleCNN(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(3, 32, 3, padding1) self.conv2 nn.Conv2d(32, 64, 3, padding1) self.conv3 nn.Conv2d(64, 128, 3, padding1) self.pool nn.MaxPool2d(2, 2) self.fc1 nn.Linear(128 * 4 * 4, 256) self.fc2 nn.Linear(256, 10) self.dropout nn.Dropout(0.5) def forward(self, x): x self.pool(F.relu(self.conv1(x))) # 32x32 - 16x16 x self.pool(F.relu(self.conv2(x))) # 16x16 - 8x8 x self.pool(F.relu(self.conv3(x))) # 8x8 - 4x4 x x.view(-1, 128 * 4 * 4) x F.relu(self.fc1(x)) x self.dropout(x) x self.fc2(x) return x逐层解释第一层卷积把3通道输入变成32通道特征图每个3×3卷积核在图像上滑动提取局部特征。ReLU激活引入非线性让网络能拟合复杂函数。最大池化把空间尺寸减半保留最显著的特征同时减少计算量。三层卷积后特征图从32×32降到4×4通道数从3升到128。然后展平成一维向量通过全连接层做分类。Dropout在训练时随机丢弃一半神经元防止过拟合。5.3 训练循环与参数选择学习率、批次大小、轮数怎么定训练循环的核心是前向传播算输出计算损失反向传播算梯度优化器更新参数。import torch.optim as optim device torch.device(cuda if torch.cuda.is_available() else cpu) net SimpleCNN().to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(net.parameters(), lr0.001) for epoch in range(30): running_loss 0.0 for i, data in enumerate(trainloader, 0): inputs, labels data[0].to(device), data[1].to(device) optimizer.zero_grad() outputs net(inputs) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() print(fEpoch {epoch1}, Loss: {running_loss/len(trainloader):.4f})参数选择经验学习率0.001是Adam的常用起点太大容易震荡太小收敛慢。批次大小128在显存够用的情况下比较稳太小梯度噪声大太大泛化可能变差。轮数30对CIFAR-10够用你可以观察损失曲线如果验证损失不再下降就停。注意optimizer.zero_grad()必须在反向传播前调用否则梯度会累加。这是新手最常见的错误之一。6. 常见问题与排查技巧实录6.1 环境配置类问题速查问题现象可能原因解决方法torch.cuda.is_available()返回FalseCUDA版本不匹配或驱动问题用nvidia-smi查驱动支持的CUDA版本重装对应PyTorch安装PyTorch时下载极慢默认源在国外使用国内镜像源或离线安装包ImportError: libcudart.soCUDA运行时库缺失检查CUDA安装设置LD_LIBRARY_PATHconda环境切换后包找不到环境未激活或装错环境conda activate后确认which python路径显存不足OOM批次太大或模型太大减小batch_size用梯度累积或换更小模型6.2 训练过程中的典型坑损失不下降先检查数据标签是否对应正确再检查学习率是否过大或过小。可以先用一个极小数据集比如10张图看模型能否过拟合如果连10张都学不会说明代码有bug。训练准确率高但验证准确率低典型过拟合。增加数据增强、加Dropout、加权重衰减、减小模型容量。如果训练集本身很小考虑迁移学习。损失变成NaN通常是学习率太大导致梯度爆炸。降低学习率或加梯度裁剪torch.nn.utils.clip_grad_norm_。GPU利用率低可能是数据加载成为瓶颈。增大num_workers或把数据预处理放到GPU上做。6.3 几个我踩过的坑第一个坑忘记把模型和数据放到同一设备。模型在GPU上数据在CPU上运行时报错。养成习惯定义device后模型.to(device)每批数据也.to(device)。第二个坑测试时忘记切换eval模式。Dropout和BatchNorm在训练和测试时行为不同。测试前必须net.eval()测试完如果要继续训练再net.train()。第三个坑数据增强用错位置。随机裁剪、翻转只应该用在训练集测试集用确定性的中心裁剪或直接resize。如果把随机增强用到测试集评估结果会不稳定。第四个坑盲目追求大模型。入门阶段用小模型快速迭代理解每个组件的作用比直接上ResNet-152更有价值。小模型训练快调试周期短学习效率高。7. 学习路线与后续方向7.1 一条可执行的入门路线如果你从零开始我建议按这个顺序走先花一周把Python和NumPy基础打牢重点是数组操作和矩阵运算。然后花一周理解深度学习基本概念张量、梯度、反向传播、损失函数、优化器。接着用两周跑通CIFAR-10分类理解CNN的每一层。再用两周做迁移学习用预训练的ResNet在自定义数据集上微调。最后选一个方向深入目标检测、语义分割、或图像生成。“动手深度学习”那本书配合PyTorch官方教程是很好的组合。书讲原理教程给代码两者对照着看。遇到不懂的概念先搜中文资料建立直觉再回去看英文原文加深理解。7.2 几个值得关注的方向轻量化模型MobileNet、ShuffleNet等工作让模型能在手机和嵌入式设备上跑。如果你对部署感兴趣这个方向实用性强。自监督学习不依赖人工标注让模型从数据本身学特征。SimCLR、MoCo等工作在CV领域很活跃。标注数据昂贵自监督是降低成本的路径。多模态CLIP等工作把图像和文本联合训练让模型能理解图文关系。这是当前最热的方向之一和LLM的结合点很多。深度强化学习热搜里出现“深度强化学习算法”这是让智能体通过与环境交互来学习策略。在游戏、机器人控制、自动驾驶规划中有应用。入门门槛比监督学习高建议先打好监督学习基础。7.3 关于数学基础的个人看法很多人问学深度学习要不要先学完线性代数和概率论。我的经验是边做边补。你不需要先成为数学专家再动手。先跑代码建立直觉遇到不懂的数学再回去查。卷积本质上就是滑动窗口的点积反向传播本质就是链式法则这些概念在动手过程中会逐渐清晰。当然如果你想深入做研究数学功底决定了你能走多远。但对入门和做项目来说够用就行不必被数学吓住。我在实际项目中的体会是深度学习最难的往往不是数学而是工程细节数据质量、超参数调试、环境配置、结果复现。这些没有教科书会详细讲只能靠动手积累。所以别光看跑起来。
企业数字化 ERP 产品动态
相关推荐
IntelliJ IDEA入门指南:从安装到高效Java开发 1. IntelliJ IDEA 基础开发入门 作为一名使用IntelliJ IDEA多年的Java开发者,我深知这款IDE的强大之处。第一次打开IDEA时,你可能会被它丰富的功能所震撼,但别担心,掌握基础开发流程后,你会发现它极大地提升了编码效率… · 2026/11/3 12:18:37
动态规划与Trie树优化:高效解决单词拆分问题 1. 问题背景与核心挑战 "单词拆分"是算法领域一个经典问题,题目通常给出一个字符串s和一个单词字典wordDict,要求判断s是否能被拆分成一个或多个字典中出现的单词。这个问题看似简单,却涉及动态规划、回溯算法、前缀树等多种解法&a… · 2026/11/3 12:17:36
2026无缓存泛目录站群程序架构解析与优化 1. 项目概述:2026年最新泛目录站群程序源码解析 这套开源站群程序最吸引我的地方在于"无缓存版"设计。传统站群系统为了追求性能,往往采用预生成静态页面的方式,但这会导致内容更新延迟。而无缓存架构意味着所有页面都是实时动态生… · 2026/11/3 12:17:36
AHB/APB/AXI总线选型:带宽、流水线与SoC桥接实践 把一个 DMA 控制器挂到 APB 上,然后发现实测带宽只有预期的十分之一——这是我早年在一套图像处理系统里真实踩过的坑。当时为了图省事,觉得"反正都是总线,接上能通就行",结果整条链路被 APB 那两个周期的握手节奏死死卡… · 2026/11/3 23:48:10
LLM引导的分子编辑序列:把可合成性嵌进药物分子优化流程 做药物分子生成这几年,我一直被同一个问题反复折磨:模型跑出来的分子在纸面上漂亮得很,QED、logP、活性预测分数全都好看,可一旦把结构式发给合成化学家,对方回一句"这东西做不出来",项目就卡住了… · 2026/11/3 23:48:10
Nginx+Tomcat反向代理与多项目路径转发配置指南 1. 为什么非要在 Tomcat 前面加一层 Nginx很多人第一次接触这套组合,都是从"端口怎么变成 80 了"这个疑问开始的。我手上这套环境最初的形态很朴素:三个业务项目各自打包成 war,扔进同一个 Tomcat 的 webapps 目录,访问… · 2026/11/3 23:48:10
C#基础学习路线与视频课程设计:运行时、异步、LINQ与项目实战 我最早带人学 C# 的时候,犯过一个很典型的错误:把语法清单从头到尾念了一遍,变量、循环、类、继承、接口,一个不落,学员笔记记得满满当当,结果让他写一个「读一个文本文件、按某列排序、输出到另一个文件」… · 2026/11/3 23:48:10
OIF-CEI-05.2详解:高速互连的电气合规性标尺 简介:本资源为光学互联论坛(OIF)于2024年1月正式发布的最新版CEI高速电气接口标准——OIF-CEI-05.2实施协议官方PDF文档,面向芯片设计、高速互连系统开发、光模块与交换机硬件工程师及通信标准研究人员。该标准定义了6Gbps至112Gb… · 2026/11/3 23:48:10
OpenAI 700个智能体潜伏Hugging Face:智能体安全与检测盲区 最近AI圈有个挺有意思的事件——OpenAI被曝出在Hugging Face平台上投放了约700个智能体,这些智能体在平台上悄无声息地"做一道考题",持续了整整两个多月才被外界察觉。乍一看这像是一条攻击事件的新闻,但把细节拆开会发现ÿ… · 2026/11/3 23:47:09
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46