一、深度学习:从 “人工设计” 到 “自动学习”

1.1 深度学习的定位:AI、机器学习与深度学习的关系

  • 人工智能(AI):是一个宽泛的领域,目标是构建能模拟人类智能的系统,涵盖推理、感知、决策等能力。
  • 机器学习(ML):是实现 AI 的核心方法,通过算法让系统从数据中学习规律,而非依赖硬编码规则。例如,传统机器学习需人工设计特征(如 SIFT 特征用于图像匹配),再通过分类器(如 SVM)完成任务。
  • 深度学习(DL):是机器学习的子集,基于人工神经网络实现自动特征提取。与传统 ML 不同,深度学习无需人工设计特征,而是通过多层网络从原始数据中逐层学习高阶特征(如从像素→边缘→纹理→物体部件→完整物体)。

三者关系可概括为:AI 是目标,ML 是路径,DL 是 ML 的进阶工具

1.2 深度学习的核心优势:自动特征提取

传统机器学习的瓶颈在于特征工程—— 依赖领域专家手工设计特征(如用 “颜色直方图 + HOG 特征” 描述车辆),当数据复杂或场景变化时,特征鲁棒性极差。而深度学习通过层级特征学习突破这一限制:

  • 以图像为例,浅层网络学习边缘、纹理等基础特征;
  • 中层网络组合基础特征形成部件(如车轮、车窗);
  • 深层网络进一步抽象为完整物体(如汽车、行人)。

这种 “端到端” 的学习模式,使其在图像、语音、文本等复杂数据上表现远超传统方法。

1.3 主流深度学习框架与 OpenCV 的协同

深度学习框架简化了模型构建与训练流程,而 OpenCV 的dnn模块则专注于模型部署,二者形成 “训练 - 部署” 闭环。主流框架包括:

框架开发者核心优势与 OpenCV 适配性
TensorFlowGoogle生态完善,支持分布式训练支持 TensorFlow 模型直接加载
PyTorchMeta动态计算图,调试便捷通过 ONNX 格式间接支持(推荐)
ONNX Runtime微软 + 社区跨框架兼容,推理高效OpenCV 原生支持 ONNX 模型
飞桨(PaddlePaddle)百度中文文档丰富,产业级工具链支持 Paddle 模型导出为 ONNX 后加载

OpenCV 的dnn模块支持直接读取 ONNX、TensorFlow、Caffe 等格式模型,无需依赖原训练框架,特别适合边缘设备部署(如嵌入式系统、移动端)。

二、神经网络:深度学习的 “基石”

2.1 神经网络的生物学启发

人工神经网络(ANN)灵感源自人脑神经元的连接机制:

  • 生物神经元:通过突触接收信号,整合后传递给其他神经元;
  • 人工神经元:输入信号经加权求和后,通过激活函数产生输出(模拟神经元 “兴奋 / 抑制” 状态)。

2.2 神经网络的核心结构

  • 输入层:接收原始数据(如图像的像素值),神经元数量等于输入特征维度(如 224×224×3 的图像对应 150528 个神经元)。
  • 隐藏层:位于输入层与输出层之间,负责特征提取。层数(深度)和神经元数量是关键超参数(如 ResNet50 有 50 层隐藏层)。
  • 输出层:输出预测结果,神经元数量等于任务维度(如 10 类分类对应 10 个神经元,输出概率分布)。

2.3 神经网络的训练

训练的目标是通过调整权重w和偏置b,使模型预测值接近真实标签。核心流程包括:

  1. 前向传播:输入数据经网络计算得到预测值,通过损失函数(如交叉熵)计算与真实标签的误差。
  2. 反向传播:基于链式法则,从输出层反向计算各权重对损失的梯度(影响程度)。
  3. 参数更新:通过优化器(如 Adam、SGD)根据梯度调整权重,降低损失

经过多轮迭代(Epoch),模型逐渐收敛,最终具备对新数据的泛化能力。

2.4 主流神经网络架构及其应用

神经网络的架构设计需适配任务特性,典型架构包括:

  • 卷积神经网络(CNN):通过卷积层(局部感知 + 权值共享)、池化层(降维)处理网格数据(如图像),是图像分类、目标检测的核心架构(如 VGG、ResNet)。
  • 循环神经网络(RNN):通过时序记忆处理序列数据(如文本、语音),LSTM、GRU 变体解决了长序列梯度消失问题,用于机器翻译、语音识别。
  • Transformer:基于自注意力机制,并行处理序列数据,在 NLP(如 BERT)和计算机视觉(如 Vision Transformer)中全面替代 RNN。
  • 生成对抗网络(GAN):由生成器(造 “假数据”)和判别器(辨 “真假”)对抗训练,用于图像生成(如 Stable Diffusion)、数据增强。

三、图像分类:让机器 “识别” 图像内容

3.1 图像分类的定义与核心流程

图像分类是计算机视觉的基础任务:给定一张图像,输出其对应的类别标签(如 “猫”“狗”“汽车”)。核心流程括:

  1. 数据输入:图像以像素矩阵形式输入(如 256×256×3 的 RGB 图像,含 3 个颜色通道)。
  2. 特征提取:通过模型(如 CNN)自动提取关键特征(如猫的尖耳朵、狗的毛发纹理)。
  3. 分类决策:基于特征匹配到预定义类别,输出标签及置信度(如 “猫,98%”)。

3.2 经典数据集:模型训练的 “基石”

数据集的规模与质量直接决定模型性能,主流图像分类数据集包括:

数据集类别数样本量特点典型应用
MNIST10(手写数字)7 万28×28 灰度图,入门级数字识别教学
CIFAR-10/10010/1006 万 / 6 万32×32 彩色图,小样本轻量级模型测试
ImageNet10001400 万高分辨率,覆盖日常物体模型性能基准(如 ResNet、EfficientNet)
Food-101101(美食)10 万细粒度分类,背景复杂餐饮行业商品识别
CheXpert14(疾病)22 万医疗影像,标签模糊肺炎、肺癌辅助诊断

数据集划分:通常分为训练集(模型学习)、验证集(超参数调优)、测试集(性能评估),比例常见为 7:1:2。

3.3 基于 OpenCV 的图像分类实现:预训练模型的应用

训练一个高精度分类模型需海量数据和算力,实际应用中多采用迁移学习—— 基于预训练模型(如在 ImageNet 上训练的 ResNet、MobileNet)微调。OpenCV 的dnn模块支持直接加载预训练模型,步骤如下:

  1. 模型与标签加载:读取 ONNX 格式的预训练模型(如 MobileNetV2)和类别标签文件(如 ImageNet 的 1000 类标签)。
  2. 图像预处理:通过blobFromImage调整图像尺寸(如 224×224)、归一化(像素值缩放到 [0,1])、通道转换(BGR→RGB,适配模型训练格式)。
  3. 推理与结果解析:模型前向传播得到预测概率,取最大值对应的类别为结果。

示例代码核心片段

void imageGategorizeTest(Mat &src)
{// 1.加载模型文件String modelTxt = "./MobileNetSSD_deploy.prototxt";String modelBin = "./MobileNetSSD_deploy.caffemodel";dnn::Net net = dnn::readNetFromCaffe(modelTxt, modelBin);if (net.empty()){cout << "模型加载失败" << endl;return;}// 2.加载标签文件vector<String> labels;String labelsFile = "./MobileNetSSD_deploy.txt";ifstream ifs(labelsFile.c_str());if (!ifs.is_open()){cout << "标签文件加载失败" << endl;return;}// 3.对本次需要图像分类的图片做预处理// 将图片转成像素值在0-1之间,大小32*32Mat blob = dnn::blobFromImage(src, 1.0, Size(32, 32), Scalar(127.5, 127.5, 127.5), true, false);// 4.将图片输入到模型中进行前向传播net.setInput(blob);// 5.获取模型输出结果Mat output = net.forward();// 6.解析输出结果// 7.将结果显示在图片上
}

3.4 图像分类的挑战与进阶方向

  • 小样本学习:在数据稀缺场景(如稀有物种识别),通过元学习(Meta-Learning)、数据增强(如 Mixup、CutMix)提升性能。
  • 细粒度分类:区分同类别的细微差异(如不同品种的狗),需结合注意力机制聚焦关键特征(如毛色、体型)。
  • 零样本学习:识别训练中未见过的类别,通过语义嵌入(如将 “类别名” 与 “图像特征” 映射到同一空间)实现跨类别迁移。

四、目标检测:让机器 “定位并识别” 多目标

4.1 目标检测与图像分类的差异

图像分类仅输出图像的整体标签,而目标检测需同时完成:

  • 定位:用边界框(Bounding Box)标记图像中所有目标的位置;
  • 分类:为每个边界框分配类别标签。

例如,在一张街景图中,目标检测需输出 “行人(x1,y1,x2,y2)”“汽车(x3,y3,x4,y4)” 等结果,是自动驾驶、安防监控的核心技术。

4.2 目标检测的评价指标

  • IoU(交并比):衡量预测框与真实框的重叠程度,计算公式为\(IoU = \frac{预测框 \cap 真实框}{预测框 \cup 真实框}\),通常以 IoU≥0.5 作为 “检测正确” 的阈值。
  • Precision(精确率):预测为正例的样本中,真正例的比例(\(\text{Precision} = \frac{TP}{TP+FP}\)),反映 “少误判” 能力。
  • Recall(召回率):所有正例中被正确预测的比例(\(\text{Recall} = \frac{TP}{TP+FN}\)),反映 “少漏判” 能力。
  • mAP(平均精度均值):对每个类别计算 P-R 曲线下面积(AP),再取均值,是衡量整体性能的核心指标。
  • FPS(每秒帧率):反映模型推理速度,实时场景需≥24 FPS。

4.3 目标检测算法分类:单阶段与两阶段

两阶段检测算法(Two-Stage)

先生成候选区域(可能含目标的区域),再分类 + 回归边界框,精度高但速度慢。

  • 代表算法:R-CNN(候选区 + CNN 分类)→ Fast R-CNN(共享特征提取)→ Faster R-CNN(用 RPN 生成候选区,端到端训练)。
  • 优势:定位精准,小目标检测性能好;
  • 劣势:步骤复杂,速度难以满足实时需求(如 Faster R-CNN 在 GPU 上约 5 FPS)。
单阶段检测算法(One-Stage)

直接从图像中回归类别与边界框,速度快但精度略低,适合实时场景。

  • 代表算法:YOLO(You Only Look Once)、SSD(Single Shot MultiBox Detector)。
  • 核心思想:通过预设锚框(Anchor Box)覆盖图像,同时预测锚框的类别概率与位置偏移。

4.4 YOLO 算法:单阶段检测的标杆

YOLO 以 “速度快、易部署” 著称,从 v1 到 v8 持续优化,成为工业界首选方案。

YOLOv1:单阶段检测的开创者
  • 核心设计:将图像划分为 7×7 网格,每个网格预测 2 个边界框(含中心坐标、宽高、置信度)和 20 类概率,共输出 7×7×30 的张量。
  • 优势:速度远超两阶段算法(GPU 上 45 FPS);
  • 劣势:小目标、密集目标检测效果差,定位精度低。
YOLOv3:经典版本的平衡之道
  • 核心改进
    • 采用 Darknet-53 主干网络,增强特征提取能力;
    • 多尺度预测(从 3 个不同分辨率特征图检测,适配不同大小目标);
    • 更丰富的锚框设计(9 种尺寸,覆盖多样目标)。
  • 性能:在 COCO 数据集上 mAP 达 57.9%,速度 32 FPS,实现精度与速度的平衡。
YOLOv5:工程化优化的典范
  • 核心改进
    • 基于 PyTorch 实现,支持自动锚框计算、超参数优化;
    • 引入 CSP 结构(跨阶段局部网络),减少计算量;
    • 支持多尺度训练(640×640、1280×1280),提升小目标检测能力。
  • 优势:易用性强,模型轻量化(如 YOLOv5s 在 CPU 上可实时推理),社区支持完善。
YOLOv8:最新升级
  • 引入无锚框(Anchor-Free)设计,动态适配目标形状;
  • 采用 C2f 模块增强特征融合,mAP 较 v5 提升 3%+;
  • 支持分类、检测、分割多任务,部署更灵活。

4.5 基于 OpenCV 的 YOLO 部署

以 YOLOv5 为例,部署步骤如下:

  1. 模型导出:将 PyTorch 训练的.pt模型导出为 ONNX 格式(python export.py --weights yolov5s.pt --include onnx)。
  2. 图像预处理:缩放至 640×640,归一化(像素值 / 255),转换为 RGB 格式。
  3. 推理与后处理:模型输出含类别概率、边界框坐标的张量,通过非极大值抑制(NMS)过滤冗余框,保留高置信度结果。

效果展示:输入一张街景图,YOLOv5 可实时检测出行人、车辆、交通灯等目标,并标记边界框与类别(如 “person: 0.98”“car: 0.95”)。

// 2. YOLO算法
void yoloDetect(Mat &src)
{// 1. 加载 YOLOv3 模型和配置文件String modelCfg = "./yolov3.cfg";String modelWeights = "./yolov3.weights";dnn::Net net = dnn::readNetFromDarknet(modelCfg, modelWeights);// 2. 加载类别标签vector<String> classNames;ifstream ifs("./coco.names");String line;while (getline(ifs, line))classNames.push_back(line);// 3. 创建输入 blobMat blob = dnn::blobFromImage(src, 1 / 255.0, Size(416, 416), Scalar(), true, false);net.setInput(blob);// 4. 获取输出层名称vector<String> outNames = net.getUnconnectedOutLayersNames();vector<Mat> outs;net.forward(outs, outNames);// 5. 解析输出,绘制检测框float confThreshold = 0.5;float nmsThreshold = 0.4;vector<int> classIds;vector<float> confidences;vector<Rect> boxes;for (size_t i = 0; i < outs.size(); ++i){float *data = (float *)outs[i].data;for (int j = 0; j < outs[i].rows; ++j, data += outs[i].cols){Mat scores = outs[i].row(j).colRange(5, outs[i].cols);Point classIdPoint;double confidence;minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);if (confidence > confThreshold){int centerX = (int)(data[0] * src.cols);int centerY = (int)(data[1] * src.rows);int width = (int)(data[2] * src.cols);int height = (int)(data[3] * src.rows);int left = centerX - width / 2;int top = centerY - height / 2;classIds.push_back(classIdPoint.x);confidences.push_back((float)confidence);boxes.push_back(Rect(left, top, width, height));}}}// 非极大值抑制vector<int> indices;dnn::NMSBoxes(boxes, confidences, confThreshold, nmsThreshold, indices);for (size_t i = 0; i < indices.size(); ++i){int idx = indices[i];Rect box = boxes[idx];rectangle(src, box, Scalar(0, 255, 0), 2);String label = format("%.2f", confidences[idx]);if (!classNames.empty()){label = classNames[classIds[idx]] + ":" + label;}putText(src, label, Point(box.x, box.y - 5), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1);}imshow("YOLO检测结果", src);
}

 

五、应用场景与未来趋势

典型应用场景

  • 自动驾驶:实时检测行人、车辆、交通标志,为决策系统提供环境信息(如特斯拉 FSD 采用类似 YOLO 的检测算法)。
  • 安防监控:通过目标检测 + 跟踪,实现异常行为预警(如打架、闯入禁区)。
  • 医疗影像:检测 CT、X 光中的病灶(如肺结节、肿瘤),辅助医生提高诊断效率。
  • 零售电商:无人超市中商品识别、顾客行为分析,优化货架陈列与库存管理。

未来趋势

  • 轻量化模型:通过模型压缩(如剪枝、量化)、专用架构(如 MobileNet、ShuffleNet)适配边缘设备(如手机、摄像头)。
  • 多模态融合:结合视觉、文本、语音数据(如 “图像 + 描述” 联合检测),提升复杂场景鲁棒性。
  • 自监督学习:减少对标注数据的依赖,通过无标签数据预训练(如 MAE、SimCLR),降低落地成本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88993.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88993.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88993.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 镜像推送至 Coding 制品仓库超时问题排查与解决

Docker 镜像推送至 Coding 制品仓库超时问题排查与解决 在将 Docker 镜像推送至 Coding 的制品仓库时&#xff0c;可能会遇到 docker push 命令超时失败的问题。但使用 curl -i http://xxx.coding.xxxx.xx 测试时&#xff0c;连接却能成功建立。以下是排查过程及解决方案。 问题…

https交互原理

Https 交互时序图&#xff1a;HTTPS 通信中结合 RSA 和 AES 加密的流程&#xff0c;本质是利用 RSA 的安全特性交换 AES 密钥&#xff0c;再用高效的 AES 加密实际数据传输。HTTPS 交互核心流程&#xff08;TLS/SSL 握手&#xff09; 1. 建立 TCP 连接 客户端通过 TCP 三次握手…

LSTM入门案例(时间序列预测)| pytorch实现

需求 假如我有一个时间序列&#xff0c;例如是前113天的价格数据&#xff08;训练集&#xff09;&#xff0c;然后我希望借此预测后30天的数据&#xff08;测试集&#xff09;&#xff0c;实际上这143天的价格数据都已经有了。这里为了简单&#xff0c;每一天的数据只有一个价…

WPS、Word加载项开发流程(免费最简版本)

文章目录1 加载项对比2 WPS 加载项2.1 本地开发2.1.1 准备开发环境2.1.2 新建 WPS 加载项项目2.1.3 运行项目2.2 在线部署2.2.1 编译项目2.2.2 部署项目2.2.3 生成分发文件2.2.4 部署分发文件2.3 安装加载项2.4 取消发布3 Word 加载项3.1 本地开发3.1.1 准备开发环境3.1.2 新建…

Flink SQL 性能优化实战

最近我们组在大规模上线Flink SQL作业。首先&#xff0c;在进行跑批量初始化完历史数据后&#xff0c;剩下的就是消费Kafka历史数据进行追数了。但是发现某些作业的追数过程十分缓慢&#xff0c;要运行一晚上甚至三四天才能追上最新数据。由于是实时数仓指标计算上线初期&#…

HTML 树结构(DOM)深入讲解教程

一、HTML 树结构的核心概念 1.1 DOM&#xff08;文档对象模型&#xff09;的定义 DOM&#xff08;Document Object Model&#xff09;是 W3C 制定的标准接口&#xff0c;允许程序或脚本&#xff08;如 JavaScript&#xff09;动态访问和更新 HTML/XML 文档的内容、结构和样式。…

用鼠标点击终端窗口的时候出现:0;61;50M0;61;50M0;62;50M0

在做aws webrtc viewer拉流压测的过程中&#xff0c;我本地打开了多个终端&#xff0c;用于连接EC2实例&#xff1a; 一个终端用于启动 ‘并发master脚本’、监控master端的cpu、mem&#xff1b;一个终端用于监控master端的带宽情况&#xff1b;一个终端用于监控viewer端的cpu、…

C++-linux 5.gdb调试工具

GDB调试工具 在C/C开发中&#xff0c;程序运行时的错误往往比编译错误更难定位。GDB&#xff08;GNU Debugger&#xff09;是Linux环境下最强大的程序调试工具&#xff0c;能够帮助开发者追踪程序执行流程、查看变量状态、定位内存错误等。本章将从基础到进阶&#xff0c;全面讲…

Update~Read PLC for Chart ~ Log By Shift To be... Alarm AI Machine Learning

上图~ 持续迭代 1、增加报警弹窗,具体到哪个值,双边规格具体是多少 2、实时显示当前值的统计特征,Max Min AVG ... import tkinter as tk from tkinter import simpledialog import time import threading import queue import logging from datetime import datet…

es的自定义词典和停用词

在 Elasticsearch 中&#xff0c;自定义词典是优化分词效果的核心手段&#xff0c;尤其适用于中文或专业领域的文本处理。以下是关于 ES 自定义词典的完整指南&#xff1a; 为什么需要自定义词典&#xff1f; 默认分词不足&#xff1a; ES 自带的分词器&#xff08;如 Standard…

微算法科技技术突破:用于前馈神经网络的量子算法技术助力神经网络变革

随着量子计算和机器学习的迅猛发展&#xff0c;企业界正逐步迈向融合这两大领域的新时代。在这一背景下&#xff0c;微算法科技&#xff08;NASDAQ:MLGO&#xff09;成功研发出一套用于前馈神经网络的量子算法&#xff0c;突破了传统神经网络在训练和评估中的性能瓶颈。这一创新…

一文读懂循环神经网络(RNN)—语言模型+读取长序列数据(2)

目录 读取长序列数据 为什么需要 “读取长序列数据”&#xff1f; 读取长序列数据的核心方法 1. 滑动窗口&#xff08;Sliding Window&#xff09; 2. 分段截取&#xff08;Segmentation&#xff09; 3. 滚动生成&#xff08;Rolling Generation&#xff09; 4. 关键信息…

Oracle Virtualbox 虚拟机配置静态IP

Oracle Virtualbox 虚拟机配置静态IP VirtualBox的网卡&#xff0c;默认都是第一个不能自定义&#xff0c;后续新建的可以自定义。 新建NAT网卡、host主机模式网卡 依次点击&#xff1a;管理->工具->网络管理器新建host主机模式网卡 这个网卡的网段自定义&#xff0c;创建…

Linux RAID1 创建与配置实战指南(mdadm)

Linux RAID1 创建与配置实战指南&#xff08;mdadm&#xff09;一、RAID1 核心价值与实战目标RAID1&#xff08;磁盘镜像&#xff09; 通过数据冗余提供高可靠性&#xff1a;当单块硬盘损坏时&#xff0c;数据不丢失支持快速阵列重建读写性能略低于单盘&#xff08;镜像写入开销…

MySQL数据库----函数

目录函数1&#xff0c;字符串函数2&#xff0c;数值函数3&#xff0c;日期函数4&#xff0c;流程函数函数 1&#xff0c;字符串函数 MySQL中内置了很多字符串函数 2&#xff0c;数值函数 3&#xff0c;日期函数 4&#xff0c;流程函数

1.2 vue2(组合式API)的语法结构以及外部暴露

vue2 vue3中可以写vue2的语法&#xff0c;vue2的结构像一个花盆里的根&#xff08;根组件App.vue&#xff09;&#xff0c;根上可以插上不同的枝杈和花朵&#xff08;组件&#xff09;。 组件的结构&#xff1a; // 这里写逻辑行为 <script lang"ts"> export d…

Swift 解 LeetCode 324:一步步实现摆动排序 II,掌握数组重排的节奏感

文章目录摘要描述题解答案题解代码&#xff08;Swift&#xff09;题解代码分析步骤一&#xff1a;排序数组步骤二&#xff1a;左右指针分段步骤三&#xff1a;按位置交错插入示例测试及结果示例 1示例 2示例 3&#xff08;边界情况&#xff09;时间复杂度分析空间复杂度分析总结…

使用SQLMAP的文章管理系统CMS的sql注入渗透测试

SQLMAP注入演示&#xff1a;抓包拿到Cookie:召唤sqlmap&#xff1a;sqlmap -u "http://192.168.1.99:8085/show.php?id34" --cookie "pma_langzh_CN; kbqug_admin_username2621-PL_LxhFjyVe43ZuQvht6MI5q0ZcpRVV5FI0pzQ6XR8; kbqug_siteid2621-PL_LxhFjyVe4yA5…

I3C通信协议核心详解

一、物理层与电气特性双线结构 SCL&#xff08;串行时钟线&#xff09;&#xff1a;主设备控制&#xff0c;支持 推挽&#xff08;Push-Pull&#xff09;输出&#xff08;高速模式&#xff09;和 开漏&#xff08;Open-Drain&#xff09;&#xff08;兼容I2C模式&#xff09;。…

Docker搭建Redis哨兵集群

Redis提供了哨兵机制实现主从集群下的故障转移&#xff0c;其中包含了对主从服务的检测、自动故障恢复和通知。 1.环境 centos7、redis6.2.4、MobaXterm 目的&#xff1a; 搭建redis的主从同步哨兵集群&#xff08;一主一从三哨兵&#xff09; 2.步骤 1.主从集群的搭建 主从…