动手学深度学习(Pytorch版)代码实践 -计算机视觉-44目标检测算法综述:R-CNN、SSD和YOLO

41~44目标检测算法综述:R-CNNSSDYOLO

1. 区域卷积神经网络 (R-CNN 系列)
1.1 R-CNN
  • 使用启发式搜索算法来选择锚框。
  • 使用预训练模型对每个锚框提取特征(每个锚框视为一张图片,使用 CNN 提取特征)。
  • 训练 SVM 进行类别分类(在神经网络之前进行)。
  • 训练线性回归模型预测边界框偏移(bounding box prediction)。
  • 利用兴趣区域(RoI)池化层:
    • 给定一个锚框,均匀分割成 n x m 块,输出每块的最大值(max pooling)。
    • 无论锚框大小,总是输出 n x m 个值。
    • 目的是将每个锚框转换为固定形状。
# 提取特征
def extract_features(image, boxes, model):features = []for box in boxes:cropped_image = image[box[1]:box[3], box[0]:box[2]]resized_image = cv2.resize(cropped_image, (224, 224)) # 假设使用的是 224x224 的输入尺寸feature = model.predict(resized_image)features.append(feature)return features# 训练 SVM 分类器
svm = SVM()
svm.fit(features, labels)
1.2 Fast R-CNN
  • R-CNN 需要对每个锚框进行 CNN 运算,这些特征提取计算存在重复且计算量大。
  • Fast R-CNN 改进了这种计算量大的问题:
    • 使用 CNN 对整张图片提取特征(关键在于提高速度)。
    • 使用 RoI 池化层对每个锚框(将在原图片中搜索到的锚框映射到 CNN 结果上)生成固定长度的特征。
# 使用整图进行特征提取
feature_map = cnn_model(image)# RoI 池化层
roi_pooling = RoIPoolingLayer(pool_size=(7, 7), num_rois=num_rois)
pooled_features = roi_pooling([feature_map, rois])

在这里插入图片描述

1.3 Faster R-CNN
  • 在 Fast R-CNN 的基础上进一步提速。
  • 使用区域提议网络 (RPN) 取代启发式搜索以获得更好的锚框:
    • 将 CNN 结果输入到卷积层,然后用锚框圈定区域,这些锚框很多有好有坏,然后进行预测。二元预测用于预测锚框的好坏,即是否有效圈住物体。bounding box prediction 用于对锚框进行改进,最后使用 NMS(非极大值抑制)对锚框进行合并。

具体步骤如下:

1. 使用 3x3 卷积层变换 CNN 输出,并将输出通道数记为 c。这样,CNN 为图像抽取的特征图中的每个单元均得到一个长度为 c 的新特征。
2. 以特征图的每个像素为中心,生成多个不同大小和宽高比的锚框并标注它们。
3. 使用锚框中心单元长度为 c 的特征,分别预测该锚框的二元类别(含目标或背景)和边界框。
4. 使用非极大值抑制,从预测类别为目标的预测边界框中移除相似结果。最终输出的预测边界框即是兴趣区域汇聚层所需的提议区域。
# RPN 网络
rpn_conv = Conv2D(512, (3, 3), padding='same', activation='relu')(base_layers)
rpn_class = Conv2D(num_anchors * 2, (1, 1), activation='softmax')(rpn_conv)
rpn_bbox = Conv2D(num_anchors * 4, (1, 1))(rpn_conv)# 非极大值抑制
proposals = proposal_layer([rpn_class, rpn_bbox, anchors], num_proposals)

在这里插入图片描述

1.4 Mask R-CNN
  • 如果有像素级别的标注,使用全卷积网络 (FCN) 利用这些信息可以提升性能。
  • RoI 对齐 (RoI align):避免 RoI 池化中的取整误差,使用 RoI align 对每个像素值进行按比例分配。具体来说,Mask R-CNN 将兴趣区域汇聚层替换为兴趣区域对齐层,使用双线性插值保留特征图上的空间信息,适用于像素级预测。输出包含所有与兴趣区域形状相同的特征图,用于预测每个兴趣区域的类别和边界框,并通过额外的全卷积网络预测目标的像素级位置。
# RoI align
roi_align = RoiAlignLayer(pool_size=(14, 14), num_rois=num_rois)
aligned_features = roi_align([feature_map, rois])# 全卷积网络
mask_conv1 = Conv2D(256, (3, 3), padding='same', activation='relu')(aligned_features)
mask_output = Conv2D(num_classes, (1, 1), activation='sigmoid')(mask_conv1)

在这里插入图片描述

1.5 总结
  • R-CNN 是最早也是最有名的一类基于锚框和 CNN 的目标检测算法。
  • Fast R-CNN 和 Faster R-CNN 持续提升性能。
  • Faster R-CNN 和 Mask R-CNN 常用于高精度要求的场景,但速度相对较慢。
2. 单发多框检测 (SSD)
  • 生成锚框:
    • 对每个像素生成多个以其为中心的锚框。
    • 给定 n 个大小 s 1 , . . . , s n s_1,...,s_n s1,...,sn和m个高宽比,生成n+m-1个锚框,其大小和高宽比分别为: ( s 1 , r 1 ) , ( s 2 , r 1 ) . . . , ( s n , r 1 ) , ( s 1 , r 2 ) , . . . , ( s 1 , r m ) (s_1,r_1),(s_2,r_1)...,(s_n,r_1),(s_1,r_2),...,(s_1,r_m) (s1,r1),(s2,r1)...,(sn,r1),(s1,r2),...,(s1,rm)
  • SSD 模型:
    • 对多个分辨率下的卷积特征生成锚框并进行预测。
    • 使用一个基础网络提取特征,然后用多个卷积层来减半高宽。
    • 在每个层生成锚框:
      • 底部层拟合小物体。
      • 顶部层拟合大物体。
    • 对每个锚框预测类别和边界框。
# 锚框生成
def generate_anchors(feature_map_shape, scales, ratios):anchors = []for scale in scales:for ratio in ratios:width = scale * np.sqrt(ratio)height = scale / np.sqrt(ratio)for i in range(feature_map_shape[0]):for j in range(feature_map_shape[1]):center_x = (j + 0.5) / feature_map_shape[1]center_y = (i + 0.5) / feature_map_shape[0]anchors.append([center_x, center_y, width, height])return np.array(anchors)# SSD 网络
base_model = SSDBaseNetwork(input_shape=(300, 300, 3))
feature_maps = base_model.extract_features(image)for feature_map in feature_maps:anchors = generate_anchors(feature_map.shape, scales, ratios)predictions = predict_bboxes_and_classes(feature_map, anchors)

在这里插入图片描述

总结
  • 速度快但精度较低。虽然作者没有持续提升,但 SSD 启发了一系列后续工作,实现上相对简单。
  • SSD 通过单神经网络进行检测(single shot)。
  • 以像素为中心产生多个锚框,在多个层的输出上进行多尺度检测。
3. YOLO (You Only Look Once)
  • SSD 中锚框大量重复,浪费计算资源。
  • YOLO 将图片均分为 S x S 个网格。
  • 每个网格预测 B 个边界框(防止多个物体出现在一个网格内)。
  • 后续版本 YOLOv2、YOLOv3 和 YOLOv4 持续改进,非锚框算法。
# YOLO 网络
def yolo_model(input_shape, num_classes, num_bboxes):inputs = Input(shape=input_shape)x = Conv2D(32, (3, 3), padding='same', activation='relu')(inputs)x = MaxPooling2D(pool_size=(2, 2))(x)# 添加更多卷积和池化层x = Flatten()(x)x = Dense(4096, activation='relu')(x)outputs = Dense(S * S * (num_classes + 5 * num_bboxes), activation='sigmoid')(x)model = Model(inputs, outputs)return model# 预测
yolo = yolo_model((448, 448, 3), num_classes, num_bboxes)
predictions = yolo

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

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

相关文章

计算机体系结构 量化研究方法

在第一章中看到关于微处理器中dynamic energy 和 dynamic power的定义觉得有些奇怪,特别记录一下。 上面的定义是取决于上下文的:动态能量可以理解为在一个时钟周期内,由电容充放电消耗的能量总和,而动态功率则是这种能量消耗在单…

Vite脚手架+Vant组件库初始化前端项目

脚手架概念: 在前端开发中,脚手架(Scaffold)是指一个用于快速搭建项目基础结构的工具或模板。脚手架包含了项目所需的基本文件结构、配置文件、依赖管理等内容,使开发者能够更快速地开始项目开发,而不必从…

常微分方程算法之编程示例四(龙格-库塔法)

目录 一、算例一 1.1 研究问题 1.2 C++代码 1.3 计算结果 二、算例二 2.1 研究问题 2.2 C++代码 2.3 计算结果 一、算例一 本节我们采用龙格-库塔法(Runge-Kutta法)求解算例。 龙格-库塔法的原理及推导请参考: 常微分方程算法之龙格-库塔法(Runge-Kutta法)…

经验分享之会员 SaaS 系统

前言 2018年,这是不平凡的一年;互联网行业的中台战略、会员经济等模式如火如荼,同时也逐渐地走入我们公司每个人的视野。在南海集团的战略规划背景下,当时我所在的公司作为集团的研发中心,承担了对会员 SaaS 系统的建…

【小程序静态页面】猜拳游戏大转盘积分游戏小程序前端模板源码

猜拳游戏大转盘积分游戏小程序前端模板源码, 一共五个静态页面,首页、任务列表、大转盘和猜拳等五个页面。 主要是通过做任务来获取积分,积分可以兑换商品,也可用来玩游戏;通过玩游戏既可能获取奖品或积分也可能会消…

赛盈分销谈烧烤市场的未来,论创新与差异化出海的重要性!

过去几年里,海外旅游市场格外热闹,不仅景点火爆,露营烧烤活动也更加频繁,而这也催生了烧烤设备的市场增长。 全球烧烤用具市场在去年就达到了265.8亿美元,同比增长20.3%,Statista数据预测到2027年将超过515…

MySQL事务——Java全栈知识(31)

1、事务的特性 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。 隔离…

typescript学习回顾(四)

今天来分享下ts中的类,关于ts中的类的概念,面向对象的一种思想,以及类里面的一些属性成员,一些基础的用法,后面会有一个小练习。 类 基本概念 我的理解:类是编程语言中面向对象的一种思想,一…

ChatTTS超真实自然的语音合成模型

项目介绍 ChatTTS是一款专为优化对话场景而生的语音生成模型,尤其匹配大型语言模型(LLM)的交互需求,以及生成对话式音频、视频旁白等应用场景,无缝覆盖中英文双语。 通过汲取约100,000小时的高质量中英语音数据进行深…

RedHat9 | podman容器

1、容器技术介绍 传统问题 应用程序和依赖需要一起安装在物理主机或虚拟机上的操作系统应用程序版本比当前操作系统安装的版本更低或更新两个应用程序可能需要某一软件的不同版本,彼此版本之间不兼容 解决方式 将应用程序打包并部署为容器容器是与系统的其他部分…

鸿蒙北向开发 ubuntu20.04 gn + ninja环境傻瓜式搭建闭坑指南

ninja跟gn都是比较时髦的东西,由歪果仁维护,如果走下载源码并编译这种流程的话需要走github跟google官网下载,国内的用网环境相信各位傻瓜都知道,github跟google这几年基本是属于连不上的状态,好在你看的鸿蒙项目跟国内的一些软件大厂已经帮你爬过梯子了,ninja工具跟gn工具已经…

一文弄懂梯度下降算法

1、引言 在上一篇文章中,我们介绍了如何使用线性回归和成本损失函数为房价数据找到最拟合的线。不过,我们也看到,测试多个截距值可能既繁琐又低效。在本文中,我们将深入探讨梯度下降算法,这是一种更加强大的技术&…

go~缓存设计配合singleFlight

一个缓存设计,配合go的singleFlight 最开始的设计如下 添加分布式缓存 上线后分布式缓存上涨的流量并不等于下游下降的流量,而是下游下降的流量 * 2~3 究其原因,就是采用了go的singleFlight,假定请求缓存时长10ms&a…

学校消防巡检二维码卡如何使用

为了加强和规范学校消防安全管理,预防和减少火灾危害,保障公共财产和教师、职工、学生的生命安全;传统的学校消防巡检都是纸质巡检记录会存在浪费纸张、信息滞后、容易造假、容易丢失、信息更新不及时。 通过凡尔码平台生成学校消防二维码巡…

揭秘:国产化系统加密

随着信息化时代的到来,数据安全已成为国家、企业和个人共同关注的焦点。政府系统国产化作为提高信息安全和自主可控能力的重要举措,正逐步得到广泛实施。在这一过程中,沙箱技术作为一种先进的安全机制,其在国产化系统加密效果方面…

系统设计中的垂直扩展和水平扩展,该如何选择?

在系统设计时,我们需要预估系统的容量,但是,随着系统流量的增大,我们会通过扩容来应对流量,常见的扩容方式是垂直扩展和水平扩展,因此,这本文章,我们将深入探讨这两种扩展策略的优缺…

项目管理中常见的6种度量指标,你知道吗?

在项目管理中,为了有效地监控和控制项目的进展、成本、质量等方面,我们通常会采用一系列的度量指标。这些度量指标不仅可以帮助项目经理了解项目的当前状态,还能预测未来的趋势,从而作出相应的决策。以下是六种常见的项目度量数据…

AI产品活跃用户排名出炉!文心一言APP国内第一,Kimi疯狂掉队

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 6月28日,极光大数据旗下月狐数据发布2024年5月中国生成式AI行业市场热点月度分析报告,披露了国内移动端主流生成式AI应用…

BFS:队列+树的宽搜

一、二叉树的层序遍历 . - 力扣&#xff08;LeetCode&#xff09; 该题的层序遍历和以往不同的是需要一层一层去遍历&#xff0c;每一次while循环都要知道在队列中节点的个数&#xff0c;然后用一个for循环将该层节点走完了再走下一层 class Solution { public:vector<vec…

AUTOSAR以太网之IPv4

系列文章目录 返回总目录 文章目录 系列文章目录一、IPv4报文格式二、主要函数1.IPv4_Init()2.IPv4_Receive()3.IPv4_Transmit() 一、IPv4报文格式 二、主要函数 1.IPv4_Init() 这个函数除了对模块配置进行初始化&#xff0c;如果有分包和组包使能&#xff0c;则会对一些相关…