2020版cs231n卷积神经网络笔记:从原理到实战的完整复盘
1. 为什么2020年的cs231n笔记至今仍值得翻出来看如果你正在入门深度学习或者已经跑过几个Demo但总觉得脑子里缺一张完整的图那2020年这一版cs231n的卷积神经网络部分大概率是你绕不开的一份材料。我自己是在做完两个图像分类的小项目之后回头把这一块重新啃了一遍才发现之前很多“能跑就行”的操作其实背后都有一层没搞明白的原理。这篇笔记就是那次复盘的产物不是课程讲义的搬运而是把卷积神经网络这条线从“它到底在算什么”到“我该怎么把它跑起来”完整串一遍。先说说这份内容适合谁。如果你完全没接触过神经网络只看过几篇科普那建议你先补一下全连接网络和反向传播的基础否则直接看卷积部分会有点吃力。如果你已经会用框架搭一个简单的分类模型但说不清楚卷积核为什么能提取特征、池化到底丢了什么信息、BatchNorm在训练和推理时行为为什么不一样那这篇就是写给你的。我会尽量用生活化的类比把概念讲透同时给出可以直接复现的代码片段和参数设置让你不只是“看懂了”而是“能上手”。卷积神经网络的核心价值在于它把“图像的空间结构”这件事真正利用起来了。全连接网络处理一张图片时会把所有像素拉平成一个长向量相邻像素之间的关系在拉平的那一刻就丢了。卷积的做法完全不同它用一个小的窗口在图像上滑动每次只看局部但整张图共享同一组权重。这个设计带来的直接好处是参数数量大幅下降同时模型对图像中物体位置的微小移动变得不那么敏感。2020年这一版课程在讲这部分时把感受野、权值共享、平移不变性这几个概念拆得很细这也是我建议从这一版入手的原因——它没有默认你已经懂了。还有一个现实原因2020年前后正是深度学习框架从静态图向动态图全面过渡的阶段课程里用的PyTorch代码风格和现在主流的写法已经非常接近。你照着敲一遍不会遇到那种“教程里的API早就废弃了”的尴尬。下面我就按自己复盘时的思路从卷积的数学本质开始一路讲到训练技巧和调参经验中间会穿插我当时踩过的坑和后来总结出来的做法。2. 卷积到底在算什么从滑窗到特征图2.1 用一个生活场景理解卷积核很多人第一次看卷积的公式会觉得抽象其实你可以把它想象成用一块带花纹的印章在图片上逐块盖过去。假设你手里有一个3x3的印章印章上的数字就是卷积核的权重。你把印章对准图片左上角把印章覆盖的9个像素值和印章上的9个权重分别相乘再相加得到一个数这个数就是输出特征图左上角的值。然后你把印章往右挪一格重复同样的操作直到盖完整张图。这个过程里有两个关键点。第一印章上的权重在整个滑动过程中是不变的这就是权值共享。第二每次只看3x3的局部区域这就是局部连接。这两个特性加起来使得卷积层处理一张224x224的彩色图片时如果输出通道是64、卷积核是3x3那这一层的参数量只有3x3x3x64加上64个偏置总共不到两千个参数。如果换成全连接层输入是224x224x3约15万个像素输出哪怕只取64维参数量也会超过九百万。这个差距就是卷积能在图像任务上碾压全连接的根本原因。但权值共享也带来一个限制同一个卷积核在整张图上提取的是同一种特征。如果你需要提取多种不同的特征就得用多个卷积核。比如一个核专门响应水平边缘另一个核专门响应垂直边缘第三个核可能对某种颜色组合敏感。输出通道数就等于这一层卷积核的个数。所以当你看到某个卷积层输出是64通道时意思就是这一层学了64种不同的局部特征探测器。2.2 输出尺寸怎么算一个必须刻在脑子里的公式卷积输出特征图的空间尺寸由输入尺寸、卷积核大小、填充和步长共同决定。公式是输出尺寸等于输入尺寸加上两倍填充减去卷积核大小再除以步长最后加一。这个公式我建议你亲手推一遍不要死记。推的方法很简单想象卷积核在输入上滑动第一个位置覆盖左上角最后一个位置覆盖右下角中间能滑多少步就是输出尺寸。举个例子输入是32x32卷积核5x5填充2步长1。代入公式(32 2x2 - 5) / 1 1 32。也就是说输出还是32x32。这种设置叫“same padding”意思是输出空间尺寸和输入保持一致。填充的作用就是让边缘像素也能被卷积核覆盖到足够的次数。如果没有填充边缘像素只会被覆盖一次而中心像素可能被覆盖很多次这会导致边缘信息被低估。步长的作用则是降采样。步长为2时输出尺寸大约减半。但步长大于1会跳过一些位置可能丢失细节。所以现在主流的做法是用步长为1的卷积配合池化来降采样而不是直接用大步长卷积。不过在一些轻量级网络里用步长为2的卷积替代池化也很常见因为这样可以减少一层操作同时保留更多可学习参数。2.3 感受野为什么深层卷积能看到更大的范围感受野指的是输出特征图上的一个像素对应到输入图像上能“看到”多大区域。单层3x3卷积的感受野就是3x3。但如果你把两个3x3卷积堆起来第二层的一个像素会覆盖第一层的3x3区域而第一层的每个像素又覆盖输入的3x3区域所以第二层对应到输入的感受野就是5x5。三层3x3堆叠的感受野是7x7。这个规律很重要因为它解释了一个经典设计为什么VGG网络全部用3x3卷积堆叠而不是直接用7x7卷积。两个3x3卷积的感受野等价于一个5x5卷积但参数量更少。具体算一下两个3x3卷积假设输入输出通道都是C的参数量是2 x 3x3xCxC 18C²而一个5x5卷积的参数量是25C²。三层3x3堆叠的感受野等价于7x7参数量是27C²而7x7卷积是49C²。所以用小卷积核堆叠既减少了参数又增加了非线性变换的次数因为每层卷积后面都会接激活函数。我在实际调模型时感受野这个概念帮我解决过一个很实际的问题。当时做一个缺陷检测任务缺陷在图像中占的像素很少但模型总是漏检。后来我算了一下到最后一个卷积层时感受野已经覆盖了整张图但缺陷的局部特征在多次下采样后已经被稀释得很厉害。解决办法是把浅层的高分辨率特征通过跳跃连接引到后面这就是后来U-Net那类结构的基本思路。所以理解感受野不只是为了应付面试它直接关系到你设计网络时该在哪一层引出特征。3. 池化层与BatchNorm那些容易被忽略的细节3.1 最大池化和平均池化的取舍池化层的作用是降采样减少空间尺寸同时让特征对微小位移更鲁棒。最大池化取窗口内的最大值平均池化取平均值。最大池化在图像分类里更常用因为它保留了最强烈的特征响应。你可以这样理解如果一个卷积核是边缘检测器那最大池化就是问“这个区域里有没有边缘”而不是“这个区域里边缘的平均强度是多少”。前者对分类更有用。但池化也有代价。最大池化只保留一个值其余全部丢弃这意味着空间信息的精度下降了。在一些需要精确定位的任务里比如语义分割或关键点检测过度池化会导致边界模糊。所以现在很多分割网络会用步长为2的卷积或者空洞卷积来替代池化目的就是在降采样的同时保留更多空间信息。还有一个细节池化层没有可学习参数。它就是一个固定的下采样操作。这意味着反向传播时最大池化只把梯度传给那个最大值对应的位置其余位置的梯度为零。平均池化则把梯度平均分配给窗口内所有位置。这个差异在调试梯度时需要注意如果你发现某些位置的梯度始终为零检查一下是不是被最大池化过滤掉了。3.2 BatchNorm在训练和推理时的行为差异BatchNorm是我见过最容易让人困惑的层之一。训练时它对每个小批量数据计算均值和方差然后做归一化再用两个可学习参数做缩放和平移。推理时它不再计算当前批次的统计量而是使用训练过程中累积的全局均值和方差。这个差异导致一个常见问题如果你在训练时用了很小的批量大小统计量会很不稳定推理效果就会变差。我在一次实验里把批量大小从64降到8结果训练准确率还能到90%以上但验证准确率直接掉到70%左右。排查了很久才发现是BatchNorm的统计量在小批量下波动太大。解决办法有两个一是改用GroupNorm或LayerNorm它们不依赖批量维度二是用同步BatchNorm在多卡上跨卡计算统计量。如果单卡且显存有限GroupNorm是更稳妥的选择。还有一个坑是BatchNorm在微调时的表现。当你加载一个预训练模型并在新数据集上微调时如果新数据集和原数据集分布差异很大BatchNorm的全局统计量可能不再适用。这时候有两种策略一是冻结BatchNorm层让它们保持预训练时的统计量二是解冻并让它们在新数据上重新累积。哪种更好取决于新数据集的大小。如果新数据集很小冻结更安全如果足够大解冻能让模型更好地适应新分布。3.3 Dropout和BatchNorm能不能一起用Dropout在训练时随机丢弃一部分神经元防止过拟合。BatchNorm做归一化加速训练。理论上它们可以一起用但实践中我发现同时用这两个有时会让训练变得不稳定。原因是Dropout改变了激活值的分布而BatchNorm又试图归一化这个分布两者在训练动态上会互相干扰。一个常见的做法是在卷积层后面只用BatchNorm在全连接层后面才用Dropout。因为卷积层的参数共享本身就有一定的正则化效果而全连接层参数量大更容易过拟合。如果你确实需要在卷积层后用Dropout建议把丢弃率设得低一些比如0.1到0.2而不是全连接层常用的0.5。另外Dropout在推理时是关闭的这一点和BatchNorm不同BatchNorm在推理时仍然起作用只是换了一套统计量。4. 从LeNet到ResNet网络设计的演进逻辑4.1 经典架构解决了什么问题LeNet是最早的卷积网络之一用于手写数字识别。它的结构很简单两个卷积层加池化然后接三个全连接层。输入是32x32的灰度图输出是10个类别。LeNet证明了卷积网络可以端到端地学习图像特征但受限于当时的计算能力和数据量它没有引起太大关注。AlexNet在2012年重新点燃了卷积网络的热度。它的改进包括使用ReLU激活函数替代Sigmoid使用Dropout防止过拟合使用数据增强扩充训练集以及利用GPU加速训练。AlexNet的结构比LeNet深有五个卷积层和三个全连接层。它的成功让学术界和工业界意识到深度卷积网络加上足够的数据和算力可以在图像识别上达到前所未有的精度。VGG的核心贡献是证明了深度的重要性。它全部使用3x3卷积和2x2最大池化通过反复堆叠来增加深度。VGG16和VGG19是两种常见配置。VGG的结构非常规整容易理解和实现但它的参数量很大大部分参数集中在最后三个全连接层。这也是后来Network in Network和GoogLeNet用全局平均池化替代全连接层的原因之一。GoogLeNet引入了Inception模块在一个模块内并行使用不同大小的卷积核然后把输出拼接起来。这样做的好处是网络可以在同一层同时提取不同尺度的特征。为了控制计算量Inception模块里用了1x1卷积来做通道降维。1x1卷积虽然不改变空间尺寸但可以改变通道数从而减少后续卷积的计算量。这个技巧后来被广泛使用。ResNet解决了深层网络的退化问题。理论上网络越深表达能力越强但实践中当深度超过一定值后训练误差反而上升。ResNet通过残差连接让梯度可以直接绕过一些层使得训练上百层的网络成为可能。残差连接的形式是输出等于输入加上经过几层变换后的结果。如果那些层的变换学到的是一些微小调整网络就相当于在恒等映射的基础上做微调这比从头学一个恒等映射容易得多。4.2 残差连接为什么能训练超深网络残差连接的核心思想可以用一个简单类比来解释。假设你要教一个人画一只猫如果让他从空白纸开始画他需要学会所有笔画。但如果给他一张猫的草图让他只修改几个地方任务就简单多了。残差连接就是给网络提供了一条“捷径”让它在恒等映射的基础上学习残差。从梯度传播的角度看残差连接让梯度在反向传播时多了一条直接通路。没有残差连接时梯度需要穿过每一层的权重矩阵层数多了之后梯度会指数级衰减或爆炸。有了残差连接梯度可以通过捷径直接传到浅层缓解了这个问题。这也是为什么ResNet可以训练到152层甚至更深而普通网络在20层左右就开始退化。我在复现ResNet时遇到过一个细节问题残差连接要求输入和输出的维度一致才能相加。如果维度不一致需要用1x1卷积调整通道数或者用步长调整空间尺寸。这个调整路径叫投影捷径。在ResNet的原始论文里当维度需要匹配时投影捷径用的是步长为2的1x1卷积。这个细节在实现时容易漏掉导致张量相加时报错。4.3 全局平均池化替代全连接层的理由传统分类网络在最后会用全连接层把特征图映射到类别数。但全连接层的参数量很大容易过拟合。全局平均池化对每个通道的特征图取平均值直接得到一个和通道数相同的向量然后接一个全连接层或直接接Softmax。这样做有两个好处一是大幅减少参数量二是让每个通道对应一个类别增强了可解释性。全局平均池化还有一个隐含的正则化效果。因为每个类别只对应一个通道的平均值网络被迫让每个通道学习一个特定类别的特征。这比全连接层那种全局混合的方式更不容易过拟合。我在一个小数据集上对比过两种做法用全局平均池化的版本验证准确率高出三个百分点左右而且训练更稳定。5. 训练卷积网络的实操细节与调参经验5.1 数据预处理和增强的正确做法图像数据预处理的第一步是归一化。常见做法是减去整个数据集的均值再除以标准差。这两个统计量只在训练集上计算然后应用到验证集和测试集。如果你在验证集上重新计算统计量就相当于泄露了验证集的信息会导致评估结果偏乐观。数据增强是防止过拟合的重要手段。对于图像分类常用的增强包括随机裁剪、随机水平翻转、颜色抖动和随机旋转。随机裁剪时要注意裁剪后的区域仍然包含足够的物体信息。比如在ImageNet上通常从256x256的图像中随机裁剪224x224这样物体基本还在画面内。如果裁剪得太激进可能把物体裁掉一半反而引入噪声。颜色抖动包括调整亮度、对比度、饱和度和色调。这个增强对光照变化大的数据集特别有用。但要注意抖动的幅度不能太大否则可能改变物体的类别特征。比如把红色苹果的色调调到偏蓝模型可能会困惑。我一般把色调抖动范围设在0.1左右亮度和对比度设在0.2左右。还有一个容易被忽略的点数据增强只在训练时进行验证和测试时不做增强只做中心裁剪或直接缩放。如果你在验证时也做随机裁剪评估结果会不稳定因为每次裁剪的区域不同预测结果也会波动。5.2 学习率设置和调度策略学习率是训练卷积网络时最重要的超参数。设得太小收敛慢设得太大损失震荡甚至发散。一个常用的起点是0.1配合SGD优化器。但这个值取决于批量大小和网络结构。批量越大梯度估计越准可以用更大的学习率。批量越小梯度噪声越大学习率要相应减小。学习率调度是指在训练过程中动态调整学习率。常见策略有步长衰减、余弦退火和指数衰减。步长衰减是每隔固定轮数把学习率乘以一个因子比如每30轮乘以0.1。余弦退火让学习率按余弦曲线从初始值降到零训练后期学习率很小有助于模型收敛到更平坦的极小值。我自己的习惯是先用一个较小的轮数做学习率范围测试找出使损失下降最快的学习率区间然后取这个区间的中间值作为初始学习率。这个方法虽然多花一点时间但比盲目试错高效得多。具体做法是让学习率从很小值指数增长到较大值记录每个学习率对应的损失然后画出损失随学习率变化的曲线选择损失下降最陡峭那段对应的学习率。5.3 权重初始化和正则化权重初始化不当会导致训练一开始就发散或停滞。如果权重全初始化为零所有神经元的输出相同反向传播时梯度也相同网络学不到任何东西。如果权重初始化得太大激活值会爆炸太小则激活值会趋近于零梯度消失。Xavier初始化根据输入和输出的维度来调整初始权重的方差使得每一层的输出方差大致相同。He初始化是Xavier的变体专门针对ReLU激活函数因为ReLU会把一半的激活值置零所以需要更大的初始方差来补偿。实践中如果你用的是ReLU或它的变体He初始化是更安全的选择。正则化方面L2正则化通过在损失函数里加上权重的平方和来限制权重的大小。权重衰减系数通常设在1e-4到1e-2之间。这个系数越大正则化越强但太大也会导致欠拟合。我一般从1e-4开始试如果训练集和验证集准确率差距很大再逐步增大。还有一个经验是数据增强本身就是一种正则化。如果你的增强策略很强可以适当减小权重衰减系数。反过来如果增强很弱就需要更强的权重衰减来防止过拟合。这两个超参数需要一起调而不是分开调。6. 我踩过的坑和后来总结的排查思路6.1 损失不下降的几种可能原因训练时最让人头疼的就是损失不下降。我遇到过几次每次原因都不一样。第一次是学习率设得太大损失在最初几个批次就跳到很大的值然后震荡。解决办法是把学习率降低一个数量级再试。第二次是数据标签没对齐图像和标签错位了模型学的是随机映射。这种问题隐蔽性强因为损失确实在缓慢下降但准确率始终在随机水平附近。排查方法是随机抽取几个样本把图像和标签一起可视化出来看。第三次是BatchNorm的动量参数设得太小导致全局统计量更新太慢训练和推理行为差异大。把动量从0.9调到0.99之后问题消失。第四次是权重初始化用了全零这个错误很低级但确实发生过因为当时复制了一段代码忘了改初始化方式。所以每次新建网络时我都会打印第一层权重的标准差确认它不是零也不是异常大的值。还有一种情况是损失函数用错了。比如多分类任务用了二分类的损失函数或者标签的编码方式不对。这类问题可以通过检查损失函数的输入形状和取值范围来发现。我现在的习惯是在训练循环里加一行断言确保预测值和标签的形状匹配且标签在合法范围内。6.2 过拟合和欠拟合的判断与应对过拟合的表现是训练准确率远高于验证准确率且验证准确率不再提升甚至下降。欠拟合则是两者都低且训练准确率也上不去。判断标准不是绝对的但一般来说如果训练和验证准确率差距超过10个百分点就要考虑过拟合了。应对过拟合的手段按优先级排序增加数据增强、增加权重衰减、减小模型容量、增加Dropout。增加数据增强通常是最有效的因为它直接扩充了有效训练集。如果数据增强已经很强了还是过拟合再考虑减小模型容量。减小模型容量可以通过减少通道数或减少层数来实现但要注意不要减得太多导致欠拟合。欠拟合的应对就简单一些增加模型容量、减小正则化、增加训练轮数、提高学习率。但提高学习率要小心可能引入震荡。我一般先检查是不是训练轮数不够因为有些任务需要很多轮才能收敛。如果轮数够了还是欠拟合再考虑增大模型。6.3 显存不够时的取舍策略显存不够是训练卷积网络时的常见问题。最直接的解决办法是减小批量大小但这会影响BatchNorm的统计量稳定性。如果减小批量后验证效果变差可以改用GroupNorm。另一个办法是使用混合精度训练用半精度浮点数存储激活值和梯度显存占用可以减少将近一半同时训练速度也会提升。但混合精度需要处理数值稳定性问题比如在损失缩放上做文章。如果模型本身太大可以考虑用梯度检查点。它的原理是不保存中间激活值而是在反向传播时重新计算。这样显存占用大幅下降但训练时间会增加。梯度检查点适合那些层数很多但每层计算量不大的网络。对于卷积网络通常只在部分层上使用梯度检查点而不是全部层以平衡显存和速度。还有一个策略是减小输入图像的分辨率。如果任务允许把输入从224x224降到128x128显存占用会降到原来的三分之一左右。但这样做可能会损失细节影响精度。所以这是一个需要权衡的选择最好先在小分辨率上验证模型结构是否合理再决定是否用全分辨率训练。7. 把卷积网络用起来从分类到迁移学习7.1 迁移学习的基本流程迁移学习是指利用在一个大规模数据集上预训练好的模型应用到新的任务上。流程通常是加载预训练权重替换最后的分类层然后在新数据集上微调。微调时可以选择冻结前面的层只训练最后的分类层也可以解冻所有层一起训练。选择哪种方式取决于新数据集的大小和与原数据集的相似度。如果新数据集很小且与原数据集相似冻结前面的层只训练分类层就够了。如果新数据集较大且与原数据集差异大解冻所有层并从头微调效果更好。中间情况可以解冻最后几个卷积块前面的层保持冻结。我在实践中发现解冻最后两个卷积块通常能带来明显的精度提升而解冻更多层收益递减还容易过拟合。微调时的学习率要比从头训练时小。因为预训练权重已经在一个好的位置上了太大的学习率会破坏这些权重。我一般把微调的学习率设为从头训练时的十分之一到百分之一。如果只训练分类层学习率可以稍大一些因为分类层是随机初始化的需要更快地学习。7.2 特征提取和微调的区别特征提取是把预训练模型当作一个固定的特征提取器不更新它的权重只把提取的特征用来训练一个新的分类器。微调则是更新预训练模型的权重。特征提取的计算量小适合数据量很小的情况。微调的计算量大但通常能得到更好的精度。特征提取的一个实用技巧是把多个中间层的特征都取出来拼接后训练分类器。因为浅层特征包含更多纹理和边缘信息深层特征包含更多语义信息两者结合有时比只用最后一层特征更好。这个做法在一些细粒度分类任务上效果明显。微调时要注意BatchNorm层的行为。如果新数据集的批量大小很小BatchNorm的统计量会不稳定。这时候可以冻结BatchNorm层让它们保持预训练时的统计量。或者把BatchNorm层替换成GroupNorm但这样就不能直接加载预训练权重了需要重新训练。所以更常见的做法还是冻结BatchNorm层。7.3 模型部署时的注意事项训练好的模型要部署到实际应用中有几个地方需要特别注意。第一是输入预处理必须和训练时完全一致。训练时用了归一化部署时也要做同样的归一化。如果训练时用了特定的颜色通道顺序部署时也要保持一致。这些细节不一致会导致精度大幅下降而且很难排查。第二是BatchNorm和Dropout在推理时的行为。部署前一定要调用模型的评估模式把Dropout关掉让BatchNorm使用全局统计量。如果忘了这一步推理结果会非常不稳定。我见过有人把训练模式的模型直接拿去推理结果每次预测都不一样排查了半天才发现是模式没切换。第三是模型的输入尺寸。卷积网络对输入尺寸有一定灵活性但不是任意的。如果输入尺寸和训练时差异太大特征图的尺寸会变化可能导致后面的全连接层维度不匹配。所以部署时最好把输入缩放到训练时使用的尺寸或者用全卷积网络替代全连接层这样就能接受任意尺寸的输入。8. 一些个人体会和后续可以深入的方向把2020年这一版cs231n的卷积部分完整过了一遍之后我最大的感受是很多当时觉得“理所当然”的操作其实背后都有明确的动机和权衡。比如为什么用3x3卷积而不用5x5为什么BatchNorm放在卷积之后激活之前为什么残差连接能训练超深网络。这些问题在第一次看的时候可能被跳过但当你真正动手调模型时它们会一个一个冒出来。如果你已经跟着这篇笔记把卷积网络的基本原理和实操细节都过了一遍下一步可以往几个方向深入。一个是目标检测和语义分割这两个任务对空间信息的要求更高会逼着你重新思考池化和下采样的设计。另一个是注意力机制和Transformer在视觉中的应用它们和卷积的设计哲学不同但很多思想是互补的。还有一个方向是模型压缩和加速包括剪枝、量化和知识蒸馏这些在部署到资源受限的设备时非常实用。我自己接下来打算把空洞卷积和可变形卷积这部分再仔细看一下因为它们在保持感受野的同时能更灵活地处理几何形变在一些不规则物体的识别任务上很有潜力。如果你也在看这部分欢迎一起交流踩坑经验。

相关新闻

ST电机库V6.2.1 FOC调试实战:从参数辨识到无感启动的避坑指南

ST电机库V6.2.1 FOC调试实战:从参数辨识到无感启动的避坑指南

简介:ST电机库文件V6.2.1是意法半导体面向嵌入式电机控制开发者推出的软件开发包,聚焦磁场定向控制(FOC)算法,适用于无刷直流电机与交流感应电机的驱动开发。资源面向具备C/C与嵌入式基础的工程师,帮助其快…

2026/10/15 12:17:50 阅读更多 →
LWIP TCP连接状态机解析与优化实践

LWIP TCP连接状态机解析与优化实践

1. LWIP TCP连接状态机解析 在嵌入式网络开发中,理解TCP连接的状态流转是构建稳定通信的基础。LWIP作为轻量级TCP/IP协议栈,其状态机实现直接影响着资源受限设备在网络异常时的恢复能力。去年调试工业物联网网关时,我就因为没吃透状态转换规则…

2026/10/15 12:16:50 阅读更多 →
CloudCompare点云处理:关闭视图十字标记的3种方法

CloudCompare点云处理:关闭视图十字标记的3种方法

1. 问题背景与现象描述最近在使用CloudCompare处理点云数据时,发现每次加载点云文件后,视图中心总会显示一个醒目的十字光标。这个十字虽然能帮助定位中心点,但在进行精细的点云编辑或测量时,反而会干扰视线。特别是在处理高密度点…

2026/10/15 12:16:50 阅读更多 →

最新新闻

Hyper-Frames:无标签视频+里程计自监督预训练,实现低成本运动预测

Hyper-Frames:无标签视频+里程计自监督预训练,实现低成本运动预测

做自动驾驶、移动机器人、无人机导航的同行,应该都有一段被数据集标注反复折磨的经历。最近 Waymo Research 放出的 Hyper-Frames 框架,让我终于看到一条不太一样的路:不用一开始就堆人天去标框、标轨迹、标地图,用无标签视频加里…

2026/10/15 12:59:25 阅读更多 →
Wand图像批处理实战:ImageMagick的Python绑定与PIL替代方案

Wand图像批处理实战:ImageMagick的Python绑定与PIL替代方案

1. 为什么我要认真聊聊Wand这个模块 第一次接触Wand是在处理一批商品图的时候。运营那边丢过来三百多张图片,要求统一裁成正方形、加白色边框、压缩到指定体积以下,还要把每张图的平均色提取出来做配色统计。我当时第一反应是用PIL,但写着写着…

2026/10/15 12:59:25 阅读更多 →
轴承行业竞价内卷加剧,杭州巨宇科技GEO优化让品牌被AI看见

轴承行业竞价内卷加剧,杭州巨宇科技GEO优化让品牌被AI看见

当空压机设备厂商向豆包提问"空压机轴承生产厂家哪家靠谱",向DeepSeek询问"精密轴承供应商推荐、高速轴承哪个品牌好",向Kimi搜索"轴承型号怎么对应、P4级精度是什么水平"时,AI给出的专业回答里,你…

2026/10/15 12:59:25 阅读更多 →
CHAN、Taylor、AOA定位算法实战:从公式到融合避坑指南

CHAN、Taylor、AOA定位算法实战:从公式到融合避坑指南

简介:这份资源围绕无线通信与导航系统中的经典定位算法展开,面向从事物联网、雷达、卫星导航及无线网络定位开发的学习者与研究人员,重点讲解CHAN、Taylor与AOA三种基本方法的原理与实现思路。压缩包共37个文件,以m脚本与mat文件为…

2026/10/15 12:59:25 阅读更多 →
Logstash数据入库MySQL/PostgreSQL:logstash-output-jdbc在线与离线安装全攻略

Logstash数据入库MySQL/PostgreSQL:logstash-output-jdbc在线与离线安装全攻略

Logstash的数据要写进MySQL或者PostgreSQL,很多人在第一步就卡住了:官方自带的输出插件只有elasticsearch、file、stdout这些,偏偏没有关系型数据库。社区里用得最多的补位方案就是logstash-output-jdbc。这个插件本身不难装,但“…

2026/10/15 12:59:25 阅读更多 →
C++结构体详解:定义、使用与最佳实践

C++结构体详解:定义、使用与最佳实践

1. 结构体基础概念解析在C编程中,结构体(struct)是一种将不同类型的数据组合成一个整体的复合数据类型。它允许我们将多个相关的变量打包成一个逻辑单元,这在处理复杂数据时特别有用。比如要记录一个班级的学生信息,每个学生有学号、姓名、成…

2026/10/15 12:58:24 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/15 9:49:14 阅读更多 →