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

news2024/12/26 9:22:43

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.coloradmin.cn/o/1874079.html

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

相关文章

Halcon 文本文件操作,形态学

一文件的读写 *******************************************************向文本文件写入字符串内容*************************************************************read_image (Image, fabrik)threshold (Image, Region, 0, 120)area_center (Region, Area, Row, Column)open_…

Linux启动elasticsearch,提示权限不够

Linux启动elasticsearch,提示权限不够,如下图所示: 解决办法: 设置文件所有者,即使用户由权限访问文件 sudo chown -R 用户名[:新组] ./elasticsearch-8.10.4 //切换到elasticsearch-8.10.4目录同级 chown详细格式…

面对.rmallox勒索病毒:如何有效防范及应对

引言: 在当今数字化社会,网络安全问题日益严重,勒索病毒成为企业和个人不可忽视的威胁之一。最近出现的.rmallox勒索病毒更是给全球各地的用户带来了严重的数据安全问题。本文将探讨.rmallox勒索病毒的特点、感染方式及应对策略,…

format()方法——格式化字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法介绍 format()可以对数据进行格式化处理操作,语法如下: format(value, format_spec) format_spec为格式化解释。当参数…

【代码工厂】简单地图生成

要求 (图片来自codingame) 代码 # 定义一个函数,用于生成模式 def generate_pattern(n, a, border_char): # 初始化一个空列表,用于存储生成地图pattern []# 最上面那一行的处理line n * border_charpattern.append(line)# 遍…

Zabbix如何帮助企业将监控数据转化为竞争优势

By Fernanda Moraes 在我们生活的高度互联世界中,变化以越来越快和激烈的速度发生。这影响了消费者的认知与行为,迫使零售商寻找更有效的方式来吸引客户。Linx 是 StoneCo 集团旗下的一家公司,也是零售技术专家,Linx了解这一点&am…

两张图片怎样拼在一起?将两张图片拼在一起的几种方法介绍

两张图片怎样拼在一起?拼接两张图片是一种常见的编辑技巧,能够将不同的视觉元素融合成一个整体,从而创造出更加生动和丰富的图像效果。无论是为了设计创意作品、制作社交媒体内容,还是简单地为个人相册增添趣味,掌握如…

一个人 三个月 干了二十万

相信很多人是被这个标题吸引进来的,但我并不是标题党,我也很讨厌标题党,这篇文章也不在乎流量,更多的是想记录下。 出来创业三个多月了,给大家汇报一下这段时间的业绩吧。一个人,三个多月,干了…

PlatformIO开发环境

PlatformIO是一个开源的生态系统,用于构建物联网应用,它支持多种微控制器(MCU)和硬件开发板,并且与各种IDE集成良好,如VSCode, Atom等,使得跨平台的固件开发变得更加简单和高效。 ### 平台介绍…

安卓速度下载v1.0.5/聚合短视频解析下载

功能特色 短视频下载与高级管理 – 支持短视频下载,为您提供一系列高级视频管理功能包括视频内容提取、智能防重复技术、视频体积压缩以及视频转换成GIF图片等; 磁-力链接下载升级 – 现支持磁力链接下载,实现边下载边播放的便捷体验&#x…

typescript学习回顾(四)

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

flutter是app跨平台最优解吗?

哈喽,我是老刘 最近在知乎上看到这样一个问题 我们先来解释一下问题中碰到的几个现象的可能原因,然后聊聊跨平台的最优解问题 问题解释 1、跟手、丝滑问题 这个问题其实很多人是有误解的,觉得原生的就丝滑跟手 其实不是这样的 我在做Flut…

【内网安全】组策略同步-不出网隧道上线-TCP转ICMP

目录 域控-防火墙-组策略对象同步演示1、打开组策略管理,新建一个GPO连接 取名fhq(防火墙)2、编辑fhq并设置防火墙状态3、命令:gpupdate/force 更新策略4、域控主机新增规则5、域内用户主机更新规则 域控-防火墙-组策略不出网上线演示 ICMP协议上线&…

CentOS停更无忧,中国操作系统闯入后CentOS时代

国际开源服务器操作系统CentOS停更,引发了中国操作系统火线进化——开源龙蜥操作系统社区涌现出大量的技术创新,相关创新技术迅速转化为商业化产品。2024年6月,浪潮信息与龙蜥社区联合发布服务器操作系统云峦KeyarchOS V5.8 新版本&#xff0…

【秋招突围】2024届秋招笔试-科大笔试题-01-三语言题解(Java/Cpp/Python)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 文章目录 &#x1f4d6…

入门网络安全工程师要学习哪些内容

大家都知道网络安全行业很火,这个行业因为国家政策趋势正在大力发展,大有可为!但很多人对网络安全工程师还是不了解,不知道网络安全工程师需要学什么?知了堂小编总结出以下要点。 网络安全工程师是一个概称,学习的东西很多&…

六、资产安全—信息分级资产管理与隐私保护(CISSP)

目录 1.信息分级 2.信息分级方法 3.责任的层级 4.资产管理 5.隐私数据管理角色 6.数据安全控制 7.数据保护方案 8.使用安全基线 六、资产安全—数据管理(CISSP): 五、身份与访问管理—身份管理和访问控制管理(CISSP): 1.信息分级 信息分级举列: 2.信息分级方…

ingress相关yaml文件报错且相关资源一切正常解决方法

今天在执行ingress相关文件的时候莫名其妙报错了,问了别人得知了这个方法 执行ingress相关文件报错 01.yaml是我自己创建关于ingress的yaml文件 报错信息 且相关资源一切正常 解决方法 kubectl get validatingwebhookconfigurations删除ingress-nginx-admissio…

商城积分系统的代码实现(上)-- 积分账户及收支记录

一、背景 上一系列文章,我们说了积分的数模设计及接口设计,接下里,我们将梳理一下具体的代码实现。 使用的语言的java,基本框架是spring-boot,持久化框架则是Jpa。 使用到的技术点有: 分布式锁&#xf…

AI大模型日报#0628:谷歌开源9B 27B版Gemma2、AI首次实时生成视频、讯飞星火4.0发布

导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE-4.0-8K-latest)生成了今日要点以及每条资讯的摘要。欢迎阅读!《AI大模型日报》今日要点&#xf…