动手学深度学习(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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ONLYOFFICE 8.1 版本桌面编辑器测评

在现代办公环境中,办公软件的重要性不言而喻。从文档处理到电子表格分析,再到演示文稿制作,强大且高效的办公软件工具能够极大提升工作效率。ONLYOFFICE 作为一个功能全面且开源的办公软件套件,一直以来都受到广大用户的关注与喜爱…

[物联网专题] - 螺钉式接线端子的选择和辨识

工业设备上大量使用各式各样的端子来连接外部设备和电缆电线,其中用得最多的就是标准的螺钉式端子,其外形如下: 标准端子一般是2位(2个接线端子),端子与端子之间可以级联,组成任意数量的位数。…

SpringCloudAlibaba基础四 微服务调用组件OpenFeign

JAVA 项目中如何实现接口调用? 1)Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 …

Databend db-archiver 数据归档压测报告

Databend db-archiver 数据归档压测报告 背景准备工作Create target databend table启动 small warehouse准备北京区阿里云 ECSdb-archiver 的配置文件准备一亿条源表数据开始压测 背景 本次压测目标为使用 db-archiver 从 MySQL 归档数据到 Databend Cloud, 归档的…

2006年下半年软件设计师【上午题】试题及答案

文章目录 2006年下半年软件设计师上午题--试题2006年下半年软件设计师上午题--答案2006年下半年软件设计师上午题–试题

idea 项目互联网转内网开发 依赖报错问题 maven问题

场景: 这个问题困扰好久,通过分析后,发现是maven配置问题,废话不多说,上干活。 问题描述 项目互联网从转内网开发,提前下载好repository,跟项目一起导入内网,导入后,发…

昇思25天学习打卡营第10天|FCN图像语义分割

一、简介: 本篇博客是昇思大模型打卡营应用实践部分的第一次分享,主题是计算机视觉(CV)领域的FCN图像语义分割,接下来几天还会陆续分享其他CV领域的知识(doge)。 全卷积网络(Fully…

linux-内存映射MMAP-lseek-dup-fifo-通信-IO多路复用

1、内存映射MMap: DMA: 可以用*/[]取代read和write; 限制: 1、文件大小固定不能改变;(ftruncate) 2、只能是磁盘文件; 3、建立映射之前先open mmap函数: mmap第一个…

SpringMVC启动流程

文章目录 引文HandlerHandlerMapperHandlerAdapterRequestMapping方法参数解析RequestMapping方法返回值解析文件上传流程拦截器解析 SpringMVC启动流程如下 引文 我们在使用SpringMVC时,传统的方式是在webapp目录下定义一个web.xml文件,比如&#xff1a…

npm安装依赖报错——npm ERR gyp verb cli的解决方法

1. 问题描述 1.1 npm安装依赖报错——npm ERR! gyp verb cli npm MARN deprecated axiosQ0.18.1: critical security vuLnerability fixed in v0.21.1. For more information, npm WARN deprecated svg001.3.2: This SVGO version is no Longer supported. upgrade to v2.x.x …

秋招突击——第七弹——Redis快速入门

文章目录 引言Redis是什么 正文对象String字符串面试重点 List面试考点 压缩列表ZipList面试题 Set面试题讲解 Hash面试重点 HASHTABLE底层面试考点 跳表面试重点 ZSET有序链表面试重点 总结 引言 在项目和redis之间,我犹豫了一下,觉得还是了解学习一下…

大数据信用报告查询应该选什么样的平台?

随着大数据技术的不断发展,大数据信用报告查询平台也应运而生。这些平台通过数据挖掘和分析,为个人提供有关大数据信用的详细报告,帮助他们在做出决策时获得更多的信息。然而,面对众多的大数据信用报告查询平台,如何选…

使用Apache POI库在Java中导出Excel文件的详细步骤

使用Apache POI库在Java中导出Excel文件的详细步骤 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技…

240628_昇思学习打卡-Day10-SSD目标检测

240628_昇思学习打卡-Day10-SSD目标检测 今天我们来看SSD(Single Shot MultiBox Detector)算法,SSD是发布于2016年的一种目标检测算法,使用的是one-stage目标检测网络,意思就是说它只需要一步,就能把目标检…

hive调优原理详解:案例解析参数配置(第17天)

系列文章目录 一、Hive常问面试函数(掌握) 二、Hive调优如何配置(重点) 文章目录 系列文章目录前言一、Hive函数(掌握)11、JSON数据处理12、炸裂函数13、高频面试题13.1 行转列13.2 列转行 14、开窗函数&a…

免交互和嵌入执行模式

目录 概念 语法格式 统计行数 赋值变量 修改密码​编辑往文件里添加内容 ​编辑​编辑引入变量 整体赋值​编辑 加引号不赋值变量 expect实现免交互 免交互设置密码 免交互切换用户 嵌入执行模式 添加用户并免交互设置密码 免交互登录 传参实现ssh 练习 概念 …

pyqt5 制作视频剪辑软件,切割视频

该软件用于切割视频,手动选取视频片段的起始帧和结束帧并保存为json文件。gui界面如下:包含快进、快退、暂停等功能, 代码如下: # codingUTF-8 """ theme: pyqt5实现动作起始帧和结束帧的定位,将定位到…

python-docx 设置水印字体

本文目录 前言一、水印的XML在哪里1、Word内置水印设置2、自定义XML部件3、Header or Footer二、确认位置三、水印表前解释1、水印XML源代码2、水印结构解析3、关于style的详解三、修改水印样式前言 本文我们来完成一个有趣的玩意儿:在Python中通过操作Word文档的XML来设置整…

Maven - 在没有网络的情况下强制使用本地jar包

文章目录 问题解决思路解决办法删除 _remote.repositories 文件代码手动操作步骤验证 问题 非互联网环境,无法从中央仓库or镜像里拉取jar包。 服务器上搭建了一套Nexus私服。 Nexus私服故障,无法连接。 工程里新增了一个Jar的依赖, 本地仓…

如何利用React和Python构建强大的网络爬虫应用

如何利用React和Python构建强大的网络爬虫应用 引言: 网络爬虫是一种自动化程序,用于通过互联网抓取网页数据。随着互联网的不断发展和数据的爆炸式增长,网络爬虫越来越受欢迎。本文将介绍如何利用React和Python这两种流行的技术&#xff0c…