当前位置: 首页 > article >正文

从LeNet到EfficientNet:手把手带你复现CNN进化史上的几个关键‘拐点’模型

从LeNet到EfficientNet代码实战CNN架构演进的关键突破在计算机视觉领域卷积神经网络CNN的进化史堪称一部微缩的深度学习发展史。每当一个新的架构出现往往伴随着性能的显著提升或计算效率的突破。对于真正希望理解CNN精髓的开发者来说仅仅知道这些模型的名称和基本结构是远远不够的——我们需要亲手搭建它们观察训练过程中的指标变化比较不同架构在参数量、计算效率和准确率上的差异。本文将带您用代码重现CNN发展史上最具代表性的四个里程碑开创性的LeNet-5、掀起深度学习革命的AlexNet、解决深度网络训练难题的ResNet以及平衡精度与效率的EfficientNet。我们不仅会解释每个模型的核心创新点更重要的是提供完整的PyTorch实现代码并分享实际训练中的技巧和注意事项。1. 环境准备与基础工具在开始构建CNN模型之前我们需要配置合适的开发环境。推荐使用Python 3.8和PyTorch 1.10这些版本在稳定性和功能支持上都有良好表现。# 基础环境安装 pip install torch torchvision torchmetrics pip install matplotlib seaborn # 可视化工具为了公平比较不同架构的性能我们将统一使用CIFAR-10数据集进行训练和评估。这个数据集包含60,000张32x32的彩色图像分为10个类别复杂度适中适合快速验证模型效果。from torchvision import datasets, transforms # 数据预处理流程 train_transform transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomCrop(32, padding4), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261)) ]) test_transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261)) ]) # 加载数据集 train_set datasets.CIFAR10(root./data, trainTrue, downloadTrue, transformtrain_transform) test_set datasets.CIFAR10(root./data, trainFalse, downloadTrue, transformtest_transform)提示在实际项目中建议使用DataLoader的多进程加载(num_workers0)来加速数据读取特别是在使用SSD存储时效果更明显。2. LeNet-5CNN的起点1998年由Yann LeCun提出的LeNet-5是最早成功的CNN应用之一最初用于银行支票上的手写数字识别。虽然结构简单但它确立了CNN的基本组成单元卷积层、池化层和全连接层的交替堆叠。LeNet-5的核心创新使用卷积核共享权重大幅减少参数数量通过下采样池化逐步降低空间分辨率最后使用全连接层进行分类下面是LeNet-5的PyTorch实现我们对其原始结构做了微小调整以适配CIFAR-10的32x32彩色图像import torch.nn as nn class LeNet5(nn.Module): def __init__(self, num_classes10): super(LeNet5, self).__init__() self.features nn.Sequential( nn.Conv2d(3, 6, kernel_size5), # 原始使用1输入通道我们改为3 nn.ReLU(), nn.AvgPool2d(kernel_size2, stride2), nn.Conv2d(6, 16, kernel_size5), nn.ReLU(), nn.AvgPool2d(kernel_size2, stride2) ) self.classifier nn.Sequential( nn.Linear(16*5*5, 120), nn.ReLU(), nn.Linear(120, 84), nn.ReLU(), nn.Linear(84, num_classes) ) def forward(self, x): x self.features(x) x x.view(x.size(0), -1) x self.classifier(x) return x训练这个模型时有几个关键点需要注意学习率设置由于模型较浅可以使用较大的初始学习率(如0.01)优化器选择SGD配合动量(momentum0.9)通常表现不错训练周期50-100个epoch足够收敛在CIFAR-10上这个调整后的LeNet-5能达到约65%的测试准确率。虽然现在看来这个成绩平平但要知道这是在仅有6万个参数的情况下实现的——现代网络的一个卷积层可能就有这么多参数。3. AlexNet深度学习的引爆点2012年AlexNet在ImageNet竞赛中以巨大优势夺冠将CNN带入了深度学习的时代。相比LeNet-5AlexNet有几个关键创新使用ReLU激活函数缓解梯度消失问题引入Dropout减少过拟合采用数据增强提升泛化能力使用GPU加速训练当时是新颖的做法以下是AlexNet的简化实现原始版本是为ImageNet设计的更大网络class AlexNet(nn.Module): def __init__(self, num_classes10): super(AlexNet, self).__init__() self.features nn.Sequential( nn.Conv2d(3, 64, kernel_size11, stride4, padding2), nn.ReLU(inplaceTrue), nn.MaxPool2d(kernel_size3, stride2), nn.Conv2d(64, 192, kernel_size5, padding2), nn.ReLU(inplaceTrue), nn.MaxPool2d(kernel_size3, stride2), nn.Conv2d(192, 384, kernel_size3, padding1), nn.ReLU(inplaceTrue), nn.Conv2d(384, 256, kernel_size3, padding1), nn.ReLU(inplaceTrue), nn.Conv2d(256, 256, kernel_size3, padding1), nn.ReLU(inplaceTrue), nn.MaxPool2d(kernel_size3, stride2), ) self.avgpool nn.AdaptiveAvgPool2d((6, 6)) self.classifier nn.Sequential( nn.Dropout(), nn.Linear(256 * 6 * 6, 4096), nn.ReLU(inplaceTrue), nn.Dropout(), nn.Linear(4096, 4096), nn.ReLU(inplaceTrue), nn.Linear(4096, num_classes), ) def forward(self, x): x self.features(x) x self.avgpool(x) x x.view(x.size(0), -1) x self.classifier(x) return x训练AlexNet时需要注意学习率策略使用阶梯下降如每30个epoch乘以0.1权重衰减L2正则化系数设为5e-4Batch Size由于显存限制可能需要设为128或更小在CIFAR-10上这个简化版AlexNet能达到约80%的准确率。虽然参数量增加到约5700万主要是全连接层的贡献但性能相比LeNet-5有显著提升。注意原始AlexNet有两个并行支路以适应当时的GPU内存限制现代实现通常简化为单支路。4. ResNet深度网络的突破随着网络加深研究人员遇到了梯度消失/爆炸和退化(degradation)问题——更深的网络反而表现更差。2015年提出的ResNet通过残差连接(residual connection)解决了这一难题使训练数百甚至上千层的网络成为可能。残差块的核心思想输出 F(x) x其中F(x)是卷积层的变换x是原始输入。这种设计让梯度可以直接回传到浅层极大缓解了梯度消失问题。以下是基本的残差块实现class BasicBlock(nn.Module): expansion 1 def __init__(self, in_planes, planes, stride1): super(BasicBlock, self).__init__() self.conv1 nn.Conv2d( in_planes, planes, kernel_size3, stridestride, padding1, biasFalse) self.bn1 nn.BatchNorm2d(planes) self.conv2 nn.Conv2d(planes, planes, kernel_size3, stride1, padding1, biasFalse) self.bn2 nn.BatchNorm2d(planes) self.shortcut nn.Sequential() if stride ! 1 or in_planes ! self.expansion*planes: self.shortcut nn.Sequential( nn.Conv2d(in_planes, self.expansion*planes, kernel_size1, stridestride, biasFalse), nn.BatchNorm2d(self.expansion*planes) ) def forward(self, x): out F.relu(self.bn1(self.conv1(x))) out self.bn2(self.conv2(out)) out self.shortcut(x) out F.relu(out) return out基于这个基础块我们可以构建不同深度的ResNet。以下是ResNet-18的实现框架class ResNet(nn.Module): def __init__(self, block, num_blocks, num_classes10): super(ResNet, self).__init__() self.in_planes 64 self.conv1 nn.Conv2d(3, 64, kernel_size3, stride1, padding1, biasFalse) self.bn1 nn.BatchNorm2d(64) self.layer1 self._make_layer(block, 64, num_blocks[0], stride1) self.layer2 self._make_layer(block, 128, num_blocks[1], stride2) self.layer3 self._make_layer(block, 256, num_blocks[2], stride2) self.layer4 self._make_layer(block, 512, num_blocks[3], stride2) self.linear nn.Linear(512*block.expansion, num_classes) def _make_layer(self, block, planes, num_blocks, stride): strides [stride] [1]*(num_blocks-1) layers [] for stride in strides: layers.append(block(self.in_planes, planes, stride)) self.in_planes planes * block.expansion return nn.Sequential(*layers) def forward(self, x): out F.relu(self.bn1(self.conv1(x))) out self.layer1(out) out self.layer2(out) out self.layer3(out) out self.layer4(out) out F.avg_pool2d(out, 4) out out.view(out.size(0), -1) out self.linear(out) return out def ResNet18(): return ResNet(BasicBlock, [2,2,2,2])训练ResNet时的一些技巧使用He初始化卷积层权重Batch Normalization极大帮助了训练稳定性学习率预热(warmup)对非常深的网络有帮助标签平滑(label smoothing)可以提升泛化能力ResNet-18在CIFAR-10上能达到约95%的准确率而参数量仅为1100万左右展示了残差连接的高效性。5. EfficientNet精度与效率的平衡随着移动设备和边缘计算的兴起模型效率变得愈发重要。EfficientNet通过神经架构搜索(NAS)找到了在参数量、计算量和准确率之间的最优平衡点。其核心创新是复合缩放(compound scaling)方法统一缩放网络的深度、宽度和分辨率。EfficientNet的关键组件MBConv块包含深度可分离卷积和Squeeze-and-Excitation模块复合缩放系数φ值统一控制深度、宽度和分辨率的缩放比例渐进式下采样策略以下是MBConv块的实现class MBConvBlock(nn.Module): def __init__(self, in_channels, out_channels, expansion4, stride1, se_ratio0.25): super(MBConvBlock, self).__init__() expanded_channels in_channels * expansion self.stride stride self.use_residual stride 1 and in_channels out_channels # 扩展阶段 self.expand nn.Sequential( nn.Conv2d(in_channels, expanded_channels, 1, biasFalse), nn.BatchNorm2d(expanded_channels), nn.SiLU() ) if expansion ! 1 else nn.Identity() # 深度可分离卷积 self.depthwise nn.Sequential( nn.Conv2d(expanded_channels, expanded_channels, 3, stridestride, padding1, groupsexpanded_channels, biasFalse), nn.BatchNorm2d(expanded_channels), nn.SiLU() ) # Squeeze-and-Excitation squeeze_channels max(1, int(in_channels * se_ratio)) self.se nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(expanded_channels, squeeze_channels, 1), nn.SiLU(), nn.Conv2d(squeeze_channels, expanded_channels, 1), nn.Sigmoid() ) # 输出阶段 self.project nn.Sequential( nn.Conv2d(expanded_channels, out_channels, 1, biasFalse), nn.BatchNorm2d(out_channels) ) def forward(self, x): residual x out self.expand(x) out self.depthwise(out) out self.se(out) * out # SE模块 out self.project(out) if self.use_residual: out residual return out基于这个基础块我们可以构建EfficientNet-B0基础版本class EfficientNet(nn.Module): def __init__(self, num_classes10): super(EfficientNet, self).__init__() # 初始卷积层 self.stem nn.Sequential( nn.Conv2d(3, 32, 3, stride2, padding1, biasFalse), nn.BatchNorm2d(32), nn.SiLU() ) # MBConv块堆叠 self.blocks nn.Sequential( MBConvBlock(32, 16, expansion1, stride1), MBConvBlock(16, 24, stride2), MBConvBlock(24, 24), MBConvBlock(24, 40, stride2), MBConvBlock(40, 40), MBConvBlock(40, 80, stride2), MBConvBlock(80, 80), MBConvBlock(80, 112), MBConvBlock(112, 112), MBConvBlock(112, 192, stride2), MBConvBlock(192, 192), MBConvBlock(192, 320), ) # 分类头 self.head nn.Sequential( nn.Conv2d(320, 1280, 1, biasFalse), nn.BatchNorm2d(1280), nn.SiLU(), nn.AdaptiveAvgPool2d(1), nn.Flatten(), nn.Dropout(0.2), nn.Linear(1280, num_classes) ) def forward(self, x): x self.stem(x) x self.blocks(x) x self.head(x) return x训练EfficientNet时需要注意使用RMSprop优化器配合衰减学习率添加Dropout和权重衰减防止过拟合数据增强特别重要推荐使用AutoAugment或RandAugment学习率预热和余弦退火能提升最终性能在CIFAR-10上EfficientNet-B0能达到约95.5%的准确率而参数量仅为约500万计算量(FLOPS)也远低于ResNet-18展现了极高的效率。6. 模型对比与演进趋势为了直观展示CNN架构的演进我们对上述四个模型在CIFAR-10上的表现进行了对比模型参数量(M)FLOPs(M)准确率(%)训练时间(epoch/min)LeNet-50.0610.265.30.5AlexNet57.0727.380.12.1ResNet-1811.2557.495.01.8EfficientNet-B05.3390.595.51.5从这些数据可以看出CNN架构的几个明显演进趋势精度提升从LeNet-5的65%到现代网络的95%参数效率提高AlexNet到ResNet参数量减少但精度提升计算效率优化EfficientNet在更低计算量下达到更高精度结构创新残差连接、深度可分离卷积等创新带来质的飞跃在实际项目中模型选择需要权衡多个因素计算资源受限考虑EfficientNet或MobileNet等轻量架构追求最高精度ResNet、DenseNet或更大的EfficientNet变体需要快速原型从ResNet-18等中等规模模型开始提示在部署到移动设备时可以考虑使用模型量化技术进一步减小模型大小和加速推理这对EfficientNet等架构特别有效。

相关文章:

从LeNet到EfficientNet:手把手带你复现CNN进化史上的几个关键‘拐点’模型

从LeNet到EfficientNet:代码实战CNN架构演进的关键突破 在计算机视觉领域,卷积神经网络(CNN)的进化史堪称一部微缩的深度学习发展史。每当一个新的架构出现,往往伴随着性能的显著提升或计算效率的突破。对于真正希望理…...

tcpdump 抓包工具实战技巧与高级过滤指南(下)

1. 逻辑运算符的高级组合技巧 在真实网络环境中,我们经常需要同时满足多个条件才能精准捕获目标数据包。tcpdump支持三种基本逻辑运算符:and(与)、or(或)、not(非)。这些运算符可以组…...

为什么越来越多的程序员都转岗网络安全,网络安全好在哪里?

相信百分之99%的人都不知道程序员为什么要转行学网络安全,将程序员与渗透人员进行对比,你就清楚了。 业内都知道程序员的35岁下岗门槛,日常加班严重,996是常事,竞争压力大,一个岗位几十人投递,…...

保姆级教程:用PNNX将PyTorch模型一键转成NCNN(附动态输入配置)

深度学习模型高效部署指南:PyTorch到NCNN的无缝转换实战 在移动端和边缘计算设备上部署深度学习模型时,开发者常面临框架兼容性和性能优化的双重挑战。本文将详细介绍如何通过PNNX工具链,将训练好的PyTorch模型高效转换为NCNN格式&#xff0c…...

Allpairs+Deepseek组合测试实战:5分钟搞定正交表用例生成(附常见报错解决方案)

AllpairsDeepseek组合测试实战:5分钟搞定正交表用例生成(附常见报错解决方案) 在软件测试领域,组合测试一直是提高测试效率的关键技术。传统测试方法在面对多因素组合场景时,往往会产生用例数量爆炸的问题,…...

S7-200Smart恒压供水与485通讯及触摸屏程序样例合集:案例解析与参数设置

S7-200Smart 恒压供水程序样例485通讯样例 触 摸屏样例子。 1.此程序样例为一拖二恒压供水样例,采用S7-200Smart PLC和smart 700触摸屏人机与abb变频器485通讯执行变频器PID实现恒压供水,商品同样包含S7-200PLC程序 2.程序为实际操作项目案例程序&…...

三菱PLC与变频器Modbus通讯实战:从原理到应用

三菱FX1N PLC 485与三菱变频器modbus通讯可直接拿来实用了,三菱FX PLC与三菱变频器通讯 采用器件:三菱FX1N PLC,FX1N485BD板,1台三菱E740变频器,三菱FX2N FX2N 485BD板同样适用,中间触摸屏采用昆仑通态MCGS…...

电池材料行业数据管理新突破:AI4S驱动的科学数据平台正在重塑电池材料开发范式

电池行业背景描述:电池材料行业是新能源汽车、储能设备等新能源领域的基础产业,近年来随着全球能源转型和电动汽车等新能源应用的快速发展,电池材料行业得到了快速发展。在我国,锂电池作为主要电池类型,其产业链不断完…...

PDF表格数据处理避坑指南:为什么你的pdfplumber提取不到数据?

PDF表格数据提取实战:避开pdfplumber的5大隐形陷阱 第一次用pdfplumber提取PDF表格时,我盯着屏幕上那堆错位的文字和缺失的边框,差点以为下载了假的Python库。直到后来才发现,问题从来不在工具本身,而在于PDF这种"…...

InceptionV3网络设计精要:从1x1卷积到多尺度融合的工程智慧

InceptionV3架构解密:1x1卷积与多尺度特征融合的工程艺术 在计算机视觉领域,卷积神经网络(CNN)的设计一直面临着两个核心挑战:如何高效捕捉多尺度特征,以及如何在计算资源有限的情况下最大化模型性能。Google团队提出的InceptionV…...

MAKINO牧野PRO3维修设定操作全知道

MAKINO 牧野 PRO3 维修设定操作 A55 PRO3操作说明书 日文.pdf A55卧加工作台旋转后加工原点计算.xlsx A61_SPECS.pdf MAKINO PRO3 V55-Operation-Guide 英文.pdf MAKINO S 系列PRO5 使用说明书PIC-Makino-S33-S56-0209.pdf MAKINO 培训课程Schulung_英文.pdf MAKINO-F3F5安装手…...

CVPR2017目标跟踪神器ECO:从零配置到实战避坑指南(附Matlab代码)

CVPR2017目标跟踪神器ECO:从零配置到实战避坑指南(附Matlab代码) 在计算机视觉领域,目标跟踪一直是一个极具挑战性的研究方向。2017年CVPR会议上提出的ECO算法,以其高效的性能和出色的准确率迅速成为研究热点。本文将带…...

nestjs实战(五): 连接达梦数据库的两种方式(完整实战教程)

还在为 NestJS 项目接入达梦数据库发愁?想用 TypeORM 优雅操作国产数据库,却不知道如何配置?今天这篇教程,全程围绕 NestJS 与达梦数据库的集成展开,从原生驱动连接到 TypeORM 整合,详细解释每一步流程和核…...

单片机/C/C++八股:(十八)C/C++ 中 sizeof 和 strlen 的区别

上一篇下一篇C 中指针和引用的区别C/C 中 sizeof 和 strlen 的区别 本质不同&#xff1a; sizeof&#xff1a;是一个编译时运算符&#xff0c;用于获取 变量或类型所占的字节数&#xff08;包括 \0 &#xff09;。 strlen&#xff1a;是一个函数&#xff08;定义在 <stri…...

单片机/C/C++八股:(十七)C++ 中指针和引用的区别

上一篇下一篇C 中 malloc/free 和 C 中 new/delete 有什么区别&#xff1f;C 中指针和引用的区别 指针&#xff08;Pointer&#xff09;和引用&#xff08;Reference&#xff09;是 C 中两种用于间接访问对象的机制&#xff0c;但它们在本质、行为和使用规则上有根本区别。 本质…...

4μm精度+0.02mm点距:先临三维OptimScan Q12 HD计量级蓝光三维扫描仪为精密测量而生

在精密制造领域&#xff0c;工件几何尺寸的偏差直接影响产品良率&#xff1b;在高端文博领域&#xff0c;高精度三维数据是文物数字化保护与研究的基础。先临三维推出OptimScan Q12 HD计量级蓝光三维扫描仪&#xff0c;以4μm测量精度与细微特征高保真还原为核心优势&#xff0…...

金属+连续纤维+陶瓷3D打印全自主!协同高科30余个高端应用案例展示

协同高科是专注于连续纤维、金属、陶瓷三大材料的综合3D打印解决方案提供商。2026年TCT亚洲展&#xff0c;协同高科发布了多款新设备&#xff0c;并首次展出了30余个高端应用案例。该公司特别指出&#xff0c;基于与众远新材料达成的合作&#xff0c;协同高科已补齐金属材料自主…...

【2026年最新600套毕设项目分享】基于SpringBoot心晴疗愈社平台(14210)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告/任务书&#xff09;远程调试控屏包运行一键启动项目&…...

一篇代码速通 Python 基础语法 | 新手直接上手

这篇文章是我短时间内学习Python基础的总结&#xff0c;个人认为有其他语法基础的同学看了这篇文章可以做到快速上手py语法&#xff0c;不过我相信没有语法基础的同学看了这篇文章也会有所收获。 全文分为 15 个模块&#xff0c;每个知识点独立一段代码 运行结果&#xff0c;…...

Instruct-4DGS: Efficient Dynamic Scene Editing via 4D Gaussian-based Static-Dynamic Separation

4D高斯静态和动态分离实现高效的动态场景编辑一、核心摘要与研究动机核心问题&#xff1a;现有的4D动态场景编辑方法受限于 迭代数据集更新 的范式。如图1(a)所示&#xff0c;它们需要逐帧编辑用于场景合成的成千上万张2D图像&#xff08;T个时间步 M个相机视角&#xff09;&a…...

二分匹配

匹配一、二分图的概念二分图又称作二部图&#xff0c;是图论中的一种特殊模型。设G(V,E)是一个无向图。如顶点集 V 可分割为两个互不相交的子集&#xff0c;并且图中每条边依附的两个顶点都分属两个不同的子集。则称图 G 为二分图。简单解析&#xff1a;也就是设 G ( V,E) 是一…...

蓝牙耳机音质排行榜:全场景音质标准解析与热门机型推荐

在无线音频技术飞速发展的今天&#xff0c;用户对蓝牙耳机的需求早已摆脱了单纯的“听个响”&#xff0c;转而追求更高层次的听觉体验。根据中国电子音响行业协会&#xff08;CAIA&#xff09;的评测标准&#xff0c;音质评价需要结合客观检测与主观听感&#xff0c;涵盖高频、…...

FreeRTOS 锁(信号量)

目录 临界区&#xff08;critical sections&#xff09; 互斥量&#xff08;Mutex&#xff09; 优先级继承性 code示例 递归互斥量 code示例 二值信号量&#xff08;Binary Semaphore&#xff09; 同步功能 code示例 计数信号量&#xff08;Counting Semaphore&#…...

STL---vector详解(从使用到底层)

前言在我的C专栏里有一篇讲解string的文章&#xff0c;里边的各种接口讲解的比较详细&#xff0c;大家对使用有疑惑的可以去我的专栏里看&#xff0c;重复的接口相似的使用我就不再过多介绍了&#xff0c;本文主要讲vector的底层。vector简介vector就是一个会自动扩容的顺序表。…...

【优化升级版】2026在线工具箱源码系统|含字典/成语/查询工具+独立后台管理

温馨提示&#xff1a;文末有联系方式产品核心定位 【优化升级版】2026在线工具箱源码系统&#xff0c;是当前市面上功能最全、稳定性最强的PHP工具聚合平台之一。 本版本由专业团队深度修复并持续迭代&#xff0c;不仅兼容主流建站环境&#xff0c;更强化了SEO结构与蜘蛛抓取友…...

力扣Hot100系列21(Java)——[多维动态规划]总结(不同路径,最小路径和,最长回文子串,最长公共子序列, 编辑距离)

文章目录前言一、不同路径1.题目2.代码3.例子二、最小路径和1.题目2.代码3.例子三、最长回文子串1.题目2.代码3.例子四、最长公共子序列1.题目2.代码3.例子五、 编辑距离1.题目2.代码3.例子前言 本文记录力扣Hot100里面关于多维动态规划的五道题&#xff0c;包括常见解法和一些…...

AI应用架构师助力智能金融系统设计迈向新高度

AI应用架构师&#xff1a;如何重构智能金融系统的“技术基因”&#xff1f; 引言&#xff1a;传统金融系统的“智能焦虑”&#xff0c;你有吗&#xff1f; 凌晨3点&#xff0c;某银行风控部门的张经理还在盯着屏幕——今天又有3笔欺诈交易漏判了。传统的规则引擎已经堆了1000多…...

装修预算装修预算

软装 18000&#xff1a; 沙发 2000 边几 1000 窗帘 5000 餐桌 餐椅 2000 床2 8000 家电 34500&#xff1a; 冰箱 4000 电视机 3000 油烟机灶台热水器 7000 洗碗机 3000 洗衣机 烘干机 4500 扫地机器人 2500 空调3小1大 8000 灯 2500 其他消费3万&#x…...

Ubuntu 22.04外接NVIDIA显卡驱动安装

我的NUC缺一个强大的图形处理硬件, 于是把之前吃灰的显卡坞翻了出来, 发挥点余热, 但是在此之前, 因为开源驱动 nouveau 驱动只能提供基础显示功能&#xff0c;无法调用GPU的加速能力。所以我还需要 彻底禁用nouveau驱动 nouveau是Ubuntu默认的开源驱动&#xff0c;必须禁用&am…...

opencv4.2.0源码安装

git config --global url."https://github.com".insteadOf git://github.comsudo apt update sudo apt upgrade -y# 安装编译工具和依赖库 sudo apt install -y \build-essential \cmake \git \pkg-config \libgtk-3-dev \libavcodec-dev \libavformat-dev \libswsca…...