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

【计算机视觉实战】第10章 | 单阶段目标检测YOLO与SSD:实时检测的极致追求

欢迎来到《计算机视觉实战》系列教程的第十章。在第九章我们学习了Faster R-CNN等两阶段检测器它们精度高但速度慢。本章我们将学习单阶段检测器One-stage Detector特别是YOLO和SSD它们在保持可观精度的同时实现了实时检测。1. 环境声明Python版本Python 3.12PyTorch版本PyTorch 2.2torchvision版本0.17NumPy版本1.262. 单阶段 vs 两阶段检测器2.1 核心思想对比两阶段检测器Faster R-CNN第一阶段RPN生成候选区域提议第二阶段对每个提议进行分类和边界框精调单阶段检测器YOLO/SSD在单次前向传播中直接预测类别和边界框无需区域提议网络和两步处理defcompare_detectors():单阶段 vs 两阶段检测器对比print(性能对比 (COCO mAP 0.5:0.95):)print(*60)print(f{模型:20}{mAP:10}{FPS:10}{特点:30})print(-*60)print(f{Faster R-CNN:20}{42.0:10}{5:10}{最高精度:30})print(f{RetinaNet:20}{40.8:10}{12:10}{Focal Loss:30})print(f{SSD512:20}{38.5:10}{22:10}{多尺度:30})print(f{YOLOv5m:20}{45.0:10}{120:10}{平衡:30})print(f{YOLOv8n:20}{37.4:10}{300:10}{超实时:30})print(*60)print(\n关键洞察:)print(1. 两阶段检测器精度高但速度慢)print(2. 单阶段检测器速度快适合实时应用)print(3. YOLOv5/v8在速度和精度上取得了很好的平衡)print(4. 现代YOLO版本精度已接近Faster R-CNN)compare_detectors()3. YOLO系列详解3.1 YOLOv1开创性的单阶段检测importtorchimporttorch.nnasnnclassYOLOv1(nn.Module):YOLOv1简化版实现def__init__(self,num_classes20,num_grids7,num_bboxes2):super().__init__()self.num_classesnum_classes self.num_gridsnum_grids self.num_bboxesnum_bboxes# 主干网络 (类似GoogLeNet)self.backbonenn.Sequential(nn.Conv2d(3,64,7,stride2,padding3),nn.LeakyReLU(0.1),nn.MaxPool2d(2,2),# 1/2nn.Conv2d(64,192,3,padding1),nn.LeakyReLU(0.1),nn.MaxPool2d(2,2),# 1/4nn.Conv2d(192,128,1),nn.LeakyReLU(0.1),nn.Conv2d(128,256,3,padding1),nn.LeakyReLU(0.1),nn.MaxPool2d(2,2),# 1/8nn.Conv2d(256,256,1),nn.LeakyReLU(0.1),nn.Conv2d(256,512,3,padding1),nn.LeakyReLU(0.1),nn.MaxPool2d(2,2),# 1/16nn.Conv2d(512,256,1),nn.LeakyReLU(0.1),nn.Conv2d(256,512,3,padding1),nn.LeakyReLU(0.1),nn.Conv2d(512,512,1),nn.LeakyReLU(0.1),nn.Conv2d(512,1024,3,padding1),nn.LeakyReLU(0.1),nn.MaxPool2d(2,2),# 1/32nn.Conv2d(1024,512,1),nn.LeakyReLU(0.1),nn.Conv2d(512,1024,3,padding1),nn.LeakyReLU(0.1),nn.Conv2d(1024,1024,3,stride2,padding1),nn.LeakyReLU(0.1),# 1/64nn.Conv2d(1024,1024,3,padding1),nn.LeakyReLU(0.1),nn.Conv2d(1024,1024,3,padding1),nn.LeakyReLU(0.1),)# 检测头# 输出: S x S x (B*5 C)# 每个格子预测B个边界框每个框有5个值(cx, cy, w, h, conf)# 加上C个类别概率self.detectornn.Sequential(nn.Flatten(),nn.Linear(1024*7*7,4096),nn.LeakyReLU(0.1),nn.Linear(4096,num_grids*num_grids*(num_bboxes*5num_classes)),)defforward(self,x):featuresself.backbone(x)outputself.detector(features)# reshape为 (batch, S, S, B*5C)returnoutput.view(-1,self.num_grids,self.num_grids,self.num_bboxes*5self.num_classes)print(YOLOv1的核心创新:)print(*50)print(1. 将图像划分为S×S网格)print(2. 每个格子预测B个边界框和置信度)print(3. 每个框预测4个坐标值(cx,cy,w,h)和置信度)print(4. 加上C个类别概率)print(5. 单次前向传播完成检测速度极快)print(\n但YOLOv1存在:)print(- 对小物体检测效果差)print(- 召回率较低)print(- 定位精度不如两阶段方法)3.2 YOLOv3多尺度预测importtorchimporttorch.nnasnnclassYOLOv3(nn.Module):YOLOv3简化版 - 使用多尺度预测def__init__(self,num_classes80):super().__init__()self.num_classesnum_classes# 主干网络 (Darknet-53风格)self.backboneself._build_backbone()# 多尺度检测头# 大特征图 - 小物体# 中特征图 - 中等物体# 小特征图 - 大物体self.detect_largenn.Conv2d(256,3*(5num_classes),1)self.detect_mediumnn.Conv2d(512,3*(5num_classes),1)self.detect_smallnn.Conv2d(1024,3*(5num_classes),1)defforward(self,x): 返回三个尺度的检测结果 - 大: (batch, 3*(5C), 13, 13) - 中: (batch, 3*(5C), 26, 26) - 小: (batch, 3*(5C), 52, 52) # 简化的前向传播returnNone,None,Noneprint(YOLOv3的改进:)print(*50)print(1. Darknet-53主干网络更强的特征提取)print(2. FPN多尺度特征金字塔)print(3. 3个不同尺度的检测头)print(4. 使用sigmoid代替softmax支持多标签分类)print(5. 13x13, 26x26, 52x52三种特征图)print(\n改进效果:)print(- 小物体检测大幅提升)print(- 中等和大物体保持高性能)print(- 速度仍然很快 (YOLOv3-608: 20 FPS))3.3 YOLOv5/v8现代YOLOimporttorchdefyolov8_architecture():YOLOv8架构特点print(YOLOv8核心设计:)print(*50)print(1. CSPDarknet主干 PANet颈部)print(2. Anchor-free检测头 (YOLOX开创))print(3. Decoupled检测头 (分类和回归分开))print(4. 新的损失函数: Bbox Loss Distribution Focal Loss)print(5. 数据增强: Mosaic, MixUp, CopyPaste)print(\nYOLOv8 YAML配置 (COCO mAP):)configs{n:{mAP50:37.4,mAP50-95:28.0,params:3.2,FPS:300},s:{mAP50:44.9,mAP50-95:33.7,params:11.2,FPS:200},m:{mAP50:51.2,mAP50-95:39.2,params:25.9,FPS:120},l:{mAP50:53.1,mAP50-95:41.8,params:43.7,FPS:90},x:{mAP50:54.8,mAP50-95:43.4,params:68.2,FPS:60},}print(f{模型:8}{mAP50:12}{mAP50-95:15}{参数量(M):15}{FPS:10})print(-*60)forname,cfginconfigs.items():print(fYOLOv8-{name:4}{cfg[mAP50]:12}{cfg[mAP50-95]:15}{cfg[params]:15}{cfg[FPS]:10})yolov8_architecture()4. SSD多尺度单阶段检测classSSD(nn.Module):SSD (Single Shot MultiBox Detector)def__init__(self,num_classes21):super().__init__()# VGG16主干网络self.vggnn.Sequential(nn.Conv2d(3,64,3,padding1),nn.ReLU(),nn.Conv2d(64,64,3,padding1),nn.ReLU(),nn.MaxPool2d(2,2),nn.Conv2d(64,128,3,padding1),nn.ReLU(),nn.Conv2d(128,128,3,padding1),nn.ReLU(),nn.MaxPool2d(2,2),nn.Conv2d(128,256,3,padding1),nn.ReLU(),nn.Conv2d(256,256,3,padding1),nn.ReLU(),nn.Conv2d(256,256,3,padding1),nn.ReLU(),nn.MaxPool2d(2,2),# 38x38nn.Conv2d(256,512,3,padding1),nn.ReLU(),nn.Conv2d(512,512,3,padding1),nn.ReLU(),nn.Conv2d(512,512,3,padding1),nn.ReLU(),nn.MaxPool2d(2,2),# 19x19nn.Conv2d(512,512,3,padding1),nn.ReLU(),nn.Conv2d(512,512,3,padding1),nn.ReLU(),nn.Conv2d(512,512,3,padding1),nn.ReLU(),nn.MaxPool2d(2,2),# 10x10nn.Conv2d(512,1024,3,padding1),nn.ReLU(),nn.Conv2d(1024,1024,1),nn.ReLU(),# 额外卷积层nn.Conv2d(1024,256,1),nn.ReLU(),nn.Conv2d(256,512,3,stride2,padding1),nn.ReLU(),# 5x5)# 多尺度特征图检测# 38x38, 19x19, 10x10, 5x5, 3x3, 1x1self.detection_headsnn.ModuleList([nn.Conv2d(512,4*(num_classes5),3,padding1),# 38x38nn.Conv2d(1024,6*(num_classes5),3,padding1),# 19x19nn.Conv2d(512,6*(num_classes5),3,padding1),# 10x10nn.Conv2d(256,6*(num_classes5),3,padding1),# 5x5nn.Conv2d(256,4*(num_classes5),3,padding1),# 3x3nn.Conv2d(256,4*(num_classes5),1),# 1x1])print(SSD的设计特点:)print(*50)print(1. VGG16主干网络保留额外卷积层)print(2. 6个不同尺度的特征图)print(3. 每个位置使用多个默认框 (default boxes))print(4. 多尺度特征适合检测不同大小的物体)print(5. 比YOLO稍慢但精度更好)5. RetinaNet与Focal Lossdeffocal_loss():Focal Loss解决单阶段检测器正负样本不均衡问题print(样本不均衡问题:)print(*50)print(- 单阶段检测器需要在所有位置预测)print(- 背景区域远多于物体区域 (如1000:1))print(- 大量易分类的背景样本主导梯度)print(- 难分类的物体样本被忽视)print(\nFocal Loss公式:)print(FL(pt) -αt(1-pt)^γ * log(pt))print(- γ (gamma): 聚焦参数越大越关注难样本)print(- α (alpha): 平衡正负样本的权重)print(- pt: 分类概率)print(\n实验结果:)print(- γ0: 标准交叉熵)print(- γ2, α0.25: Focal Loss)print(- 相比标准交叉熵AP提升约3个点)focal_loss()6. 实战使用YOLOv8importtorchdefuse_yolov8():使用YOLOv8进行目标检测# 实际使用ultralytics库# from ultralytics import YOLOprint(YOLOv8使用示例:)print(*50)print( from ultralytics import YOLO # 加载预训练模型 model YOLO(yolov8n.pt) # nano版本 model YOLO(yolov8s.pt) # small版本 model YOLO(yolov8m.pt) # medium版本 # 推理 results model(image.jpg) # 绘制结果 results[0].show() # 获取检测框 boxes results[0].boxes for box in boxes: x1, y1, x2, y2 box.xyxy[0] conf box.conf[0] cls box.cls[0] print(f类别: {int(cls)}, 置信度: {conf:.2f}, 位置: ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})) )use_yolov8()7. 本章小结通过本章学习我们掌握了单阶段 vs 两阶段理解了两类检测器的核心区别YOLO演进从YOLOv1到YOLOv8的发展历程多尺度预测FPN在单阶段检测中的应用Focal Loss解决样本不均衡的创新方法SSD设计多尺度特征图检测策略一句话总结YOLO系列通过不断的工程优化和算法改进在实时检测领域建立了标杆地位YOLOv8更是将精度和速度做到了极致平衡。下一章预告第11章《图像分割语义分割与实例分割》将带你学习U-Net、Mask R-CNN等分割网络。如果本章内容对你有帮助欢迎点赞、收藏和关注。

相关文章:

【计算机视觉实战】第10章 | 单阶段目标检测YOLO与SSD:实时检测的极致追求

欢迎来到《计算机视觉实战》系列教程的第十章。在第九章我们学习了Faster R-CNN等两阶段检测器,它们精度高但速度慢。本章我们将学习单阶段检测器(One-stage Detector),特别是YOLO和SSD,它们在保持可观精度的同时实现了…...

Phi-4-mini-reasoning实战教程:批量处理CSV数学题库生成标准答案

Phi-4-mini-reasoning实战教程:批量处理CSV数学题库生成标准答案 1. 引言 数学老师们经常面临一个共同挑战:批改大量数学作业和试卷需要花费大量时间。传统方法需要逐题检查,效率低下且容易出错。今天,我们将介绍如何利用Phi-4-…...

豪鹏科技2025年财报透视:毛利率提升5.2个百分点,费用管控成效显著

豪鹏科技2025年财报透视:毛利率提升5.2个百分点,费用管控成效显著豪鹏科技2025年业绩表现亮眼,全年实现营业收入57亿元至60亿元,同比增长11.58%至17.45%;归母净利润1.95亿元至2.2亿元,同比大幅增长113.69%至…...

SEO和SEM对于中小企业的意义是什么_SEO 和 SEM 的报告指标有哪些

SEO和SEM对于中小企业的意义是什么 在当今的数字化时代,中小企业如何在竞争激烈的市场中脱颖而出,已成为每一个企业家关注的焦点。搜索引擎优化(SEO)和搜索引擎营销(SEM)作为两种重要的数字营销手段&#…...

管理员命令提示符 命令提示符 cmd

命令提示符区别...

小型纯电动汽车轮毂电机及大角度转向系统的数字化设计【含catia、solidworks、CAD图纸、答辩PPT、说明书】

小型纯电动汽车轮毂电机与大角度转向系统的数字化设计,是新能源汽车领域的关键技术突破方向。轮毂电机通过将驱动装置集成于车轮内部,实现了动力传递路径的简化与能量利用效率的提升,其分布式驱动特性使车辆具备更灵活的扭矩分配能力&#xf…...

快速部署Python3.10环境:Miniconda镜像实战教学

快速部署Python3.10环境:Miniconda镜像实战教学 1. 为什么选择Miniconda搭建Python环境? 在Python开发中,最让人头疼的问题之一就是环境管理。不同项目可能需要不同版本的Python和依赖库,直接安装会导致版本冲突。Miniconda提供…...

从选型到焊接:一份给嵌入式新手的晶振避坑指南(含32.768KHz实例)

从选型到焊接:嵌入式开发者的晶振实战避坑手册 第一次点亮自己设计的电路板时,那颗小小的晶振就像电子世界的心跳起搏器。记得三年前我为一个智能家居项目调试STM32时,连续三天卡在"晶振不起振"的问题上——电路图反复检查无误&…...

软考软件评测师备考避坑指南:过来人告诉你这5个章节最容易丢分(附2024最新考纲解析)

软考软件评测师备考避坑指南:5个高频失分章节深度解析 第一次打开软件评测师考纲时,我盯着密密麻麻的知识点列表发愣——这哪是考试大纲,分明是软件工程领域的百科全书。作为经历过三次备考最终以87分通过的老考生,我深刻理解那种…...

别再死记硬背了!用C++/Java手把手实现线索二叉树(附完整代码与避坑指南)

从零实现线索二叉树:C/Java双语言实战与陷阱全解析 第一次在面试白板上遇到线索二叉树的实现题时,我的手心全是汗。教科书上的递归图示看起来清晰,但真正要写出无bug的线索化代码时,那些ltag和rtag就像捉迷藏的孩子,总…...

SDXL 1.0电影级绘图工坊:RTX 4090专属,5分钟零基础部署教程

SDXL 1.0电影级绘图工坊:RTX 4090专属,5分钟零基础部署教程 1. 为什么选择SDXL 1.0电影级绘图工坊 如果你正在寻找一款能在RTX 4090上发挥极致性能的AI绘图工具,SDXL 1.0电影级绘图工坊绝对是你的不二之选。这款工具专为4090显卡优化&#…...

ARL灯塔扫不出指纹?手把手教你用Python脚本批量导入指纹库,提升资产识别准确率

ARL灯塔指纹识别优化实战:Python脚本批量导入与精准率提升指南 资产侦察灯塔(ARL)作为渗透测试领域的重要工具,其核心价值在于准确识别目标资产的技术特征。然而许多中级用户发现,默认指纹库在面对特定行业或新型资产…...

数据科学驱动的自动化分析:缠论量化开源工具包的技术实践与价值

数据科学驱动的自动化分析:缠论量化开源工具包的技术实践与价值 【免费下载链接】chanvis 基于TradingView本地SDK的可视化前后端代码,适用于缠论量化研究,和其他的基于几何交易的量化研究。 缠论量化 摩尔缠论 缠论可视化 TradingView TV-SD…...

500套帐篷发往西非:我们凭什么拿下这单?

一句吐槽,让我们抓住了机会年初,天津京路发科技收到一封西非询盘:500套支架帐篷,用于安置点。客户顺带吐槽了一句:“之前的帐篷,没撑过上一个雨季。”我们懂了——价格不是关键,耐造才是。先看气…...

INNISO1接口模块

INNIS01 接口模块INNIS01 是一款应用于工业自动化控制系统中的接口模块,主要用于实现控制系统内部或与外部设备之间的信号连接与数据交互,属于系统中的通信与接口扩展单元。一、基本概述INNIS01 接口模块通常用于连接控制器与现场设备或其他功能模块&…...

GLM-OCR完整教程:部署、使用、API、案例,一篇搞定所有

GLM-OCR完整教程:部署、使用、API、案例,一篇搞定所有 1. GLM-OCR简介与核心优势 GLM-OCR是一款基于先进多模态架构的OCR识别工具,专为解决复杂文档理解问题而设计。与市面上大多数OCR工具不同,它不仅能识别文字,还能…...

别再为联合仿真头疼了!手把手教你用Amesim 2019和Matlab 2022b配置S-Function(Win10环境)

从零搭建Amesim与Matlab联合仿真环境:避坑指南与实战技巧 联合仿真技术已成为多物理场系统设计的黄金标准,但配置过程却让无数工程师在深夜的办公室里抓狂——编译器版本冲突、环境变量设置错误、接口编译失败,每一个环节都可能成为项目进度的…...

Excel 根据A列标签拆分为多个列数据

举例:如下图所示将AB列内容拆分为红色框内的格式方便绘制图表Sub SplitCategoriesToColumns()Dim ws As WorksheetDim lastRow As LongDim startRow As LongDim dict As ObjectDim keyOrder As New CollectionDim i As Long, j As LongDim key As VariantDim val As…...

余姚加工中心编程培训排行榜单

舜龙模具数控培训执行标准:学习进度一对一、培训一人、合格一人、成就一人;舜龙自有模具工厂,全程实战教学,所学贴合岗位实操,毕业即可对接就业。1998年-2026年,舜龙28年匠心传承。舜龙模具数控培训&#x…...

3步搞定黑苹果配置:OpCore-Simplify自动化工具如何解决90%的安装难题

3步搞定黑苹果配置:OpCore-Simplify自动化工具如何解决90%的安装难题 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 开篇:黑苹…...

学习网络安全至少需要什么配置的电脑?

很多同学对于学习 Web 渗透所需的电脑配置仍有疑问,所以老师结合自己的教学经验,总结了关于电脑配置要求的一些内容,遂成此文。当然,对于电脑配置的追求是无上限的,所以有条件的话最好还是搞一台配置强劲的电脑。 一、…...

防爆气象站为什么能够成为化工行业的必备仪器

防爆气象站能够成为化工行业的必备仪器,主要基于其本质安全设计、多参数精准监测、实时预警能力、环境适应性、合规管理支持及生产优化价值六大核心优势,这些特性直接解决了化工行业在安全管控、工艺控制及合规运营中的关键痛点。一、本质安全设计&#…...

EmbeddingGemma-300m部署指南:Ollama镜像+Prometheus监控+日志追踪一体化

EmbeddingGemma-300m部署指南:Ollama镜像Prometheus监控日志追踪一体化 想快速搭建一个功能强大、易于管理的文本向量化服务吗?EmbeddingGemma-300m作为谷歌推出的轻量级嵌入模型,凭借其3亿参数和出色的性能,是构建本地语义搜索、…...

数据仓库核心概念:事实表和维度表详解与实战应用

数据仓库核心概念:事实表和维度表详解与实战应用一、引言二、定义:什么是事实表?什么是维度表?2.1 事实表:定义2.2 维度表:定义三、结构流程图:事实表与维度表关联关系3.1 标准星型模型关联流程…...

Ostrakon-VL 模型推理加速实战:使用 .accelerate 库优化扫描速度

Ostrakon-VL 模型推理加速实战:使用 .accelerate 库优化扫描速度 1. 效果惊艳的开场 最近在测试Ostrakon-VL模型时,我发现了一个令人惊喜的事实:通过.accelerate库的几项简单优化,模型推理速度可以提升3倍以上,同时显…...

深度解析:数据仓库——定义、核心架构与企业核心价值

深度解析:数据仓库——定义、核心架构与企业核心价值一、引言二、定义:什么是数据仓库?2.1 标准定义2.2 核心四大特征(数据仓库基石)三、架构流程:数据仓库的标准工作流程(带流程图)…...

掌握QMK Toolbox的4个实战阶段:开源键盘定制工具从入门到精通的学习路径

掌握QMK Toolbox的4个实战阶段:开源键盘定制工具从入门到精通的学习路径 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox QMK Toolbox是一款专为机械键盘定制开发的开源工具&a…...

Transformer 从0到1:注意力机制的数学形式——Query, Key, Value 三元组

# Transformer 从0到1:注意力机制的数学形式——Query, Key, Value 三元组## 1. 引言:从序列建模的困境到注意力机制的诞生在深度学习的发展历程中,处理序列数据(如文本、音频、时间序列)一直是核心挑战之一。早期的循…...

BI 项目交付 SOP

...

dig (Domain Information Groper):从命令行到自动化运维的DNS探秘

1. 从命令行工具到运维利器的dig进化史 第一次接触dig命令时,我正被一个诡异的域名解析问题困扰。当时作为新手运维,只会用ping和nslookup反复测试,直到同事甩给我一行dig trace example.com——瞬间看到了完整的DNS解析链条,那种…...