CNN基础全解析:从卷积原理到PyTorch图像分类实战
1. 为什么我劝你别急着调参先搞懂CNN基础CNN基础也就是卷积神经网络的核心知识是我见过最多人“用得很勤、懂得很浅”的一块内容。你随便打开一个招聘JD图像算法岗上面都写着“熟悉CNN、RNN、Transformer”但真到面试和做项目的时候能一口气讲清楚卷积层里面到底发生了什么的人真的不多。我最早接触卷积神经网络是在做一个图像分类Demo的时候用的是别人写好的模型结构跑通之后感觉自己“会了”。后来换了一个数据集识别效果崩得一塌糊涂我连问题出在哪一层都不知道。那时候才意识到不把CNN基础吃透换个场景就得重新碰一次壁。这篇内容我给你拆得尽量细从卷积是怎么“看”图像的、为什么池化能省算力、到激活函数怎么选、BN层放在哪里、以及一个能直接跑的完整工程每一步我都会拿实际经验告诉你“这里为什么要这么做”而不是只给你一堆公式和概念。适合谁看零基础想入门深度学习的同学、转行做算法工程的开发者、以及那些“模型能跑但说不清原理”的半吊子选手。看完之后你不会变成调参大师但至少能把CNN基础的地基打扎实遇到问题知道往哪一层去查。2. 卷积神经网络到底在干什么2.1 从全连接到卷积我们被参数量逼出来的改变要知道CNN基础为什么长得是现在这个结构得先看它之前的标准做法是什么。传统全连接网络处理图像是把一张图拉成一个一维向量然后把每个像素都连接到下一层的每个神经元上。听起来没什么问题但算一笔账就明白了一张224乘224的三通道彩色图片展平之后就是十五万个像素值。如果第一个隐藏层放两千个神经元那这一层的参数就是三亿个。这种规模在显存里根本训练不动还会带来极其严重的过拟合。卷积神经网络的核心思路就一句话不让你每个像素都跟每个神经元打交道而是让一小块一小块的局部区域共享同一组权重。这就叫“局部连接”和“权值共享”。用生活里的比方全连接是全班同学互相认识每一对人都有一个独立的关系记录那数据量是爆炸的。卷积是只看一个班级里前后桌之间的小群体关系而且这个“小群体的判断规则”全班通用效率自然就上去了。所以说CNN基础最本质的思想其实是在“参数的利用效率”上做文章。它没有变得更聪明只是变得更能算、更划算。2.2 卷积操作像手电筒一样扫过整张图卷积操作听起来高深本质上就是用一个叫“卷积核”的小矩阵在图像上按固定步长滑动每滑到一个位置就把核里的数值跟对应位置的像素值做逐元素相乘再求和输出一个数值。这个数值代表的是这个局部区域跟当前核的响应程度。举个例子一个3乘3的卷积核在5乘5的输入上滑动步长为1不填充的话输出就是3乘3。这里的输出矩阵就是“特征图”每一个值都对应原图某个位置局部的一种特征响应。你可以把这个过程想象成用手电筒在黑暗的房间里扫过每一个角落每次只照亮一小块区域然后记下这个区域带给你的“感觉”。关键问题在于卷积核里的那些数字是从哪来的答案是训练学出来的。初始是随机数通过反向传播不断调整最后网络会自己学会“识别边缘的核”“识别纹理的核”“识别某种形状的核”不需要人手工设计。这就是卷积神经网络最迷人的地方特征提取不是人为定义的而是数据驱动出来的。2.3 通道、步长、填充三个绕不开的基础参数学CNN基础迟早要面对这三个概念。不理解它们后面改网络结构的时候会非常难受。通道数比较容易理解输入图像的RGB三个通道卷积层输出多少个特征图就代表有多少个不同的卷积核在同时扫描。第一批卷积层往往输出32或64个通道意思是用32或64种不同的“视角”去看这张图。到深层网络通道数会涨到256甚至512因为深层要表达的特征更抽象、更复合。步长决定每次滑动多远。步长为1输出尺寸基本不变步长为2则输出尺寸缩小一半常用于替代池化做降采样。填充技术说白了就是在输入图边缘补一圈0目的是维持输出尺寸让卷积核能覆盖到边缘像素。很多新手会问为什么不算边缘就不行因为边缘像素参与计算的次数天然比中间少信息容易被“边缘化”补0能缓解这个问题。我个人的经验是看到一篇文章里说“same padding”、“stride2”别急着往下看先在草稿纸上把输出尺寸的公式写一遍。(输入-核 2倍填充) 除以步长再加1。这个公式是CNN基础里最不该忽略的东西调网络结构的时候全靠它估算feature map尺寸。3. 池化、激活、BNCNN里每个组件的“为什么”光有卷积还不够一个完整的CNN基础模块通常还包含池化层、激活函数、批归一化层以及最后的全连接层。很多教程把这几样并排摆出来就完事了根本没讲清楚它们各司什么职我来补上这块。3.1 池化不是偷懒是要“总结性信息”池化做的事情非常简单在特征图上一小块区域内取一个代表性数值。最常见的是最大池化取区域内最大值还有平均池化取平均值。池化第一个作用是降维把一个2乘2的区域压缩成1个值特征图尺寸减半后续计算量直接降到四分之一。第二个作用是轻微的抗平移性。比如一个3乘3的最大池化窗口只要特征值出现在窗口内任意位置池化结果都一样这对“目标在图像里稍位移了一点”的情况具有一定的容忍能力也就是平移不变性。但这里我要给你一条实战建议不要无脑堆池化。现在的很多网络设计里会用“步长为2的卷积”来替代池化做降采样因为池化会丢掉一些细节位置信息而卷积降采样是可学习的信息损失更可控。经典结构里池化用得很多但近几年的模型里它地位已经下降了。3.2 激活函数没有它多深的网络都白搭激活函数的作用实际上是给网络引入非线性。如果没有激活函数每一层都是线性变换叠多少层本质上还是一层线性变换那深度网络就没有意义了。在CNN基础里最常用的激活函数是ReLU公式是max(0,x)。为什么选ReLU而不是老牌的sigmoid最核心的原因是梯度消失问题。sigmoid在输入很大或很小的时候曲线趋于平坦梯度趋近于0反向传播时链式法则一乘梯度传到浅层基本上就没了。ReLU正区间梯度恒为1传得深远得多。我实际训练下来还有个直观体会ReLU让网络“稀疏激活”。因为它会把负数直接置为0意味着很多神经元在特定输入下是不工作的只对特定特征敏感。这反而让特征表达更清晰。不过ReLU有一个坑神经元“坏死”。如果学习率设得太大某个神经元的输入长期是负数梯度一直是0它就再也不会被更新了直接废掉。遇到这种情况可以考虑LeakyReLU这类变体给负数区域一个极小的泄漏斜率比如0.01不让神经元完全死掉。3.3 批归一化放在哪、为什么能让训练飞起来批归一化做的事情是把每一层的输出做标准化让它的均值接近0、方差接近1然后再通过两个可学习参数做缩放和平移。作用主要两个第一是抑制内部协变量漂移让每层输入的分布相对稳定训练收敛更快第二是它带一点正则化效果因为每个batch的均值方差都在变化相当于给网络引入了轻微扰动。做一个类比你要爬山找最低点如果山路坑坑洼洼、坡度忽大忽小你很容易走歪。BN做的事情相当于把每一段山路都修成比较匀称的坡度让你能按稳定的步伐往下走。放置位置需要注意。在经典CNN基础结构里常见的组合是“卷积 - BN - ReLU - 池化”。BN放在激活函数之前因为在卷积输出之后、进入非线性变换之前做标准化信息更稳定。也有“卷积 - ReLU - BN”的写法尤其是在一些现代结构里有分歧但我个人用下来无论是收敛速度还是最终精度前者都更加舒适。3.4 全连接层分类体位的“最后一段路”经过多层卷积、池化之后特征图变成了一系列抽象特征。全连接层在这里扮演“汇聚”的角色把这些特征整合起来输出一个类别得分向量。它的作用可以理解成前面卷积层负责“看”而全连接层负责“表态”。不过全连接层有一个大问题参数量极大。比如最后一个卷积层输出7乘7乘512的特征图展平是25088个值接一个1024节点的全连接层参数量就是两千多万。所以现代网络倾向于用全局平均池化替代全连接层直接把每个通道取平均值再接输出层参数量直接清零。如果你想快速上手CNN基础全连接层暂时踩着用没关系但心里要清楚它往往是模型里最“臃肿”的部分后续优化基本都从这里动手。4. 完整实操用PyTorch从零实现一个CNN图像分类器讲了很多概念下面进入真正有意思的部分。我会带你从零写一个CNN模型用MNIST手写数字数据集做训练和验证。所有代码都可以直接运行重点是让你看到每个步骤为什么存在。4.1 环境准备与数据加载先说明我的运行环境避免你在环境上踩坑。我用的是PyTorch 2.x版本Python 3.10显卡是入门级显卡训练MNIST这种小数据集完全够用。如果你没有GPU用CPU跑也行MNIST图片只有28乘28像素训练几分钟也能收敛。数据加载直接用TorchVision内置的datasets模块它会自动下载MNIST数据集。MNIST有6万张训练图片和1万张测试图片灰度图0到9共10个类别。代码是python的import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torch.utils.data import DataLoader # 数据预处理转为Tensor并归一化 transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) # 加载MNIST train_dataset torchvision.datasets.MNIST( root./data, trainTrue, downloadTrue, transformtransform ) test_dataset torchvision.datasets.MNIST( root./data, trainFalse, downloadTrue, transformtransform ) train_loader DataLoader(train_dataset, batch_size64, shuffleTrue) test_loader DataLoader(test_dataset, batch_size1000, shuffleFalse)两个细节需要单独说。第一是归一化的两个数值0.1307和0.3081这是MNIST全量数据的像素均值和标准差是数据集自带的统计量你查文档能查到不要瞎填填了等于没归一化。第二是DataLoader的shuffle参数训练集必须打乱顺序如果数据顺序固定网络很容易走向诡异的方向。4.2 网络结构设计与参数计算我们采用一个经典的CNN结构两个卷积块加一个全连接输出层。class SimpleCNN(nn.Module): def __init__(self, num_classes10): super(SimpleCNN, self).__init__() # Conv Block 1: 1 - 32 channels self.conv1 nn.Conv2d(1, 32, kernel_size3, stride1, padding1) self.bn1 nn.BatchNorm2d(32) self.pool1 nn.MaxPool2d(kernel_size2, stride2) # Conv Block 2: 32 - 64 channels self.conv2 nn.Conv2d(32, 64, kernel_size3, stride1, padding1) self.bn2 nn.BatchNorm2d(64) self.pool2 nn.MaxPool2d(kernel_size2, stride2) # 全局平均池化 输出层 self.global_pool nn.AdaptiveAvgPool2d((1, 1)) self.fc nn.Linear(64, num_classes) def forward(self, x): x self.pool1(torch.relu(self.bn1(self.conv1(x)))) x self.pool2(torch.relu(self.bn2(self.conv2(x)))) x self.global_pool(x) x torch.flatten(x, 1) x self.fc(x) return x来动手算一遍特征图尺寸的变化这是CNN基础必须会的功夫。输入是28乘28。第一个卷积层kernel3、padding1、stride1输出尺寸还是28乘28。池化核2乘2、步长2尺寸减半变成14乘14。第二个卷积层再操作一次14乘14保持不变池化后变7乘7。深度方向第一个卷积输出32个通道第二个输出64个通道。全连接层输入就是7乘7乘64但这里用了全局平均池化所以先压到1乘1乘64再展平就是64维向量。这个设计直接把传统全连接层尾部的千万量级参数量砍掉了。4.3 训练循环loss、优化器、学习率的选择训练代码看起来模式化但每个选择背后都是有理由的。device torch.device(cuda if torch.cuda.is_available() else cpu) model SimpleCNN(num_classes10).to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr1e-3) def train_one_epoch(epoch): model.train() total_loss 0 correct 0 total 0 for images, labels in train_loader: images, labels images.to(device), labels.to(device) optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() total_loss loss.item() _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() avg_loss total_loss / len(train_loader) acc 100.0 * correct / total print(fEpoch {epoch}: Loss {avg_loss:.4f}, Train Acc {acc:.2f}%) # 训练10个epoch for epoch in range(1, 11): train_one_epoch(epoch)几点实操心得先说清楚。优化器选的是Adam而不是传统的SGD。Adam自带自适应学习率对新手极其友好不用费劲调momentum。它的效果在大部分任务是“够好”但你要是在追求极致精度后面可以换成SGD加momentum配合学习率衰减通常能略胜一筹。损失函数用CrossEntropyLoss这里要注意PyTorch的这个损失函数已经把softmax内置了所以你模型最后一层千万不用再加softmax。你要是加了训练速度会变慢精度反而下降。学习率1e-3是Adam的默认推荐值在MNIST上用这个值起步完全合理。我试过从1e-2开始loss发散得一塌糊涂从1e-4开始收敛慢得着急。实践下来1e-3就是该类的甜点值。4.4 验证与测试一个千万不能错的小细节训练完后需要在测试集上评估模型泛化能力。这里的评估代码和训练代码有一点微妙区别新手经常在这里翻车。def evaluate(loader, model): model.eval() correct 0 total 0 with torch.no_grad(): for images, labels in loader: images, labels images.to(device), labels.to(device) outputs model(images) _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() return 100.0 * correct / total test_acc evaluate(test_loader, model) print(fTest Accuracy: {test_acc:.2f}%)注意model.eval()和torch.no_grad()这两行。model.eval()会让BatchNorm层使用训练阶段统计好的均值和方差而不是用当前batch重新计算。如果不加这一行同一份代码训练时和测试时行为不一致测试精度会莫名其妙地抖动。torch.no_grad()则是不让PyTorch记录梯度测试时不需要反向传播不关掉会白占显存和算力数据量一大甚至直接爆显存。用这个结构配合上面代码MNIST测试精度稳定在98.8%到99.2%区间。这个成绩不算惊艳但足够证明结构本身是合理且有效的。要想提升到99.5%以上可以加一层卷积、加dropout、用数据增强、或换SGD仔细调参但作为CNN基础入门这个效果已经很能说明问题了。5. 训练过程中最常踩的坑和排查经验这个部分我整理一下自己跑CNN踩出来的问题按出现频率从高到低排。5.1 loss不降反涨先看学习率模型训练好一会儿loss不仅没降还一路往上涨最常见原因就是学习率太大导致参数在损失函数曲面上震荡甚至发散。排查方式很直接把学习率降到当前值的十分之一再试。如果依然发散再降一个数量级。我见过不少人拿默认的1e-3去跑别的网络结构或者别的数据集结果不收敛。我的做法是用未知数据集时第一轮训练前先看几组不同学习率的起始loss变化很快就能锁定合理的量级。另一方面就是梯度爆炸问题。如果loss出现剧烈的“锯齿状”波动除了降学习率还可以用梯度裁剪PyTorch里一句话就能做常见用法是把梯度模长截断到1.0以内。5.2 训练精度高但测试精度低过拟合怎么破训练集精度99%测试集只有90%过拟合无疑。这种问题在CNN基础小结构上也很常见尤其是样本量少时。这里是常见的应对清单加数据增强随机旋转、随机平移、随机裁剪增加训练数据的多样性加Dropout在卷积或全连接层后面加nn.Dropout(p0.5)让神经元随机失活减小模型容量降低通道数或减少卷积层数让模型没那么多参数硬记训练集提前停止监控验证集loss连续几个epoch不下降就停止训练之前带一个入门同学调一个医学影像分类任务它训练集准确率非常漂亮测试集只有七成。一查就是模型里第四个卷积块通道数开到256而数据集总共只有两千张图严重过拟合。砍到64通道加一个Dropout层测试集直接涨了十多个点。5.3 输入尺寸和tensor形状不匹配这类报错几乎是每一个写CNN的人必经之路。常见错误形如“Expected input batch_size 64 but got 32”、“size mismatch for fc”。核心原因是你在定义网络的时候特征图尺寸和你脑子里的不一致。解决办法就是按前面“输出尺寸公式”老老实实地算一遍各层卷积、池化之后特征图到底多大展平后是多少维。我也碰到过因为忘记改全连接层输入维度网络初始化直接报错的情况。这种问题最笨也最有效的排查方法是在forward里打印x.shape加一个调试print运行一次就一目了然。5.4 显存不足显存溢出也是一个高频问题。MNIST这种小图还好一旦换成高分辨率大图就很容易爆。我常用的排查顺序看batch_size是否过大32不行就1616不行就8看模型结构是否存在不必要的中间层缓存看测试阶段是否开了梯度计算确认用了torch.no_grad()产生多余显存占用高分辨率图考虑做切片或缩放后再训练还有一种偷懒但有效的做法是开启梯度累积每过几个batch再更新一次梯度效果近似于扩大了batch_size同时单次显存占用不变。| 常见问题 | 核心原因 | 排查方向 | 解决办法 | | 触发因素 | 具体场景 | 观察指标 | 调整手段 | | loss发散 | 学习率过大 / 梯度爆炸 | loss曲线、梯度模长 | 调低学习率、梯度裁剪、换优化器 | | 过拟合 | 模型容量大于数据量 | 训练与测试精度差距 | 数据增强、Dropout、降低通道数、早停 | | shape报错 | 特征图尺寸算错 | 各层输出shape | 手动推导尺寸、打印shape调试 | | 显存溢出 | batch过大或占用量过高 | 显存监控 | 减小batch、清理多余梯度、梯度累积 |6. 用更好的视角看待CNN基础下一步往哪走当你把上面代码跑通、把每个组件的意义搞明白了CNN基础这块就已经吃透了。接下来可以自然地往下推进方向大概有这么几个尝试经典网络结构比如VGG、ResNet理解残差连接为什么能训练更深的网络接触目标检测领域把CNN当作骨干网络来用理解特征金字塔这些概念往轻量化方向走学习深度可分离卷积这种改造思路部署到移动端。我个人建议下一步优先搞懂ResNet。它不复杂但残留连接的思想影响深远后续很多模型都建立在它之上。从它的结构你会明白CNN基础里卷积、池化、BN这些组件在一个更深的网络里是如何各司其职、协同配合的。如果你做的方向偏图像分类恭喜你这条路线相对成熟如果你偏目标检测或分割也别慌这是从分类到像素级理解的自然延伸你现在掌握的这些做特征提取的能力正是那些大模型的底座。CNN基础打牢之后再往上面的任务层走你会发现自己学任何新结构都很快因为所有的注意力可以放在任务设计上而不是纠结基础模块为什么这么摆放。对着CNN基础时候我有过一个体会各个组件的名称和公式死记硬背根本留不长。真正让我记住并会用的是亲手把一个模型从零写出来、亲手把它训练崩一次、再亲手把问题排查掉。所以我特别建议你也这样做一遍别只用别人写好的网络结构。纸上得来终觉浅这句话放在卷积神经网络这里再贴切不过了。

相关新闻

NodeMCU中文下发乱码排查:网页到串口监视器全链路解析

NodeMCU中文下发乱码排查:网页到串口监视器全链路解析

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

2026/10/17 5:55:32 阅读更多 →
C语言高效解析CSV:状态机、内存映射与常见坑位排查

C语言高效解析CSV:状态机、内存映射与常见坑位排查

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

2026/10/17 5:54:31 阅读更多 →
用知识树搞定技术面试:从零散记忆到系统复习

用知识树搞定技术面试:从零散记忆到系统复习

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

2026/10/17 5:54:31 阅读更多 →

最新新闻

用 qui 快速管理多个 qBittorrent 实例的完整指南

用 qui 快速管理多个 qBittorrent 实例的完整指南

用 qui 快速管理多个 qBittorrent 实例的完整指南 【免费下载链接】qui A fast, single-binary qBittorrent web UI: manage multiple instances, automate torrent workflows, and cross-seed across trackers. 项目地址: https://gitcode.com/GitHub_Trending/qui3/qui …

2026/10/17 6:30:56 阅读更多 →
foobox-cn 完整指南:为 foobar2000 换上现代 DUI 皮肤,外观与效率一次到位

foobox-cn 完整指南:为 foobar2000 换上现代 DUI 皮肤,外观与效率一次到位

foobox-cn 完整指南:为 foobar2000 换上现代 DUI 皮肤,外观与效率一次到位 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 用了多年 foobar2000 的人都知道,它的界…

2026/10/17 6:30:56 阅读更多 →
Win11Debloat 开始菜单模板实操指南:3 种场景统一所有用户的开始菜单

Win11Debloat 开始菜单模板实操指南:3 种场景统一所有用户的开始菜单

Win11Debloat 开始菜单模板实操指南:3 种场景统一所有用户的开始菜单 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and…

2026/10/17 6:30:56 阅读更多 →
HBase Region合并实战:从概念、评估、操作到踩坑排查一次讲透

HBase Region合并实战:从概念、评估、操作到踩坑排查一次讲透

接手过集群的人应该都有这种经历:业务表读写量并不算大,但Region数量莫名其妙涨到上千,Master UI上一片飘红,某台RegionServer上的Region数远超其他机器,读请求延迟开始忽高忽低,元数据服务也时不时告警。这…

2026/10/17 6:30:56 阅读更多 →
Android MVP架构详解:从分层原理到面试避坑

Android MVP架构详解:从分层原理到面试避坑

1. 面试中的MVP:为什么几乎每一轮技术面都会问做客户端开发这几年,我发现一个很有意思的现象:不管你是去面初级、中级还是高级岗位,只要聊到架构设计,MVP几乎躲不掉。就算职位描述里写的是MVVM、MVI或者Jetpack全家桶&…

2026/10/17 6:30:56 阅读更多 →
TDA7050 双通道音频功率放大器

TDA7050 双通道音频功率放大器

一、产品概述TDA7050 是一款双通道低电压音频功率放大器集成电路,专为电池供电的便携式音频设备设计。该芯片采用高度集成化架构,内部集成偏置电路、前置放大器、双通道功率输出级及保护电路,无需任何外部元件即可构成完整的音频放大系统。产…

2026/10/17 6:29:56 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →