计算机视觉的应用4-目标检测任务:利用Faster R-cnn+Resnet50+FPN模型对目标进行预测

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用4-目标检测任务,利用Faster Rcnn+Resnet50+FPN模型对目标进行预测,目标检测是计算机视觉三大任务中应用较为广泛的,Faster R-CNN 是一个著名的目标检测网络,其主要分为两个模块:Region Proposal Network (RPN) 和 Fast R-CNN。我将会详细介绍使用 ResNet50 作为基础网络并集成 FPN(Feature Pyramid Network)的 FasterRCNN 模型。这个模型可以写为 fasterrcnn_resnet50_fpn

今天我来实现一下这个功能,每个人都可以操作,代码直接运行。

一、模型结构

1.ResNet50:ResNet是一个深度卷积神经网络,它利用残差块解决了训练过程中的梯度消失问题。ResNet50表示具有50层深度的ResNet模型。这个模型负责从原始图像提取特征。
2.FPN:FPN是一种特征处理架构,它生成多尺度的特征图来处理目标检测中不同大小的物体。FPN在卷积神经网络后面添加额外层来融合不同分辨率的特征,这有助于提高物体检测的准确性。
3.RPN:这是一个小型卷积网络,它在FPN生成的多尺度特征图上运行。RPN的主要目的是为下游的 Fast R-CNN 生成目标的候选框(Region of Interest,简称 RoI)。这是目标检测任务的第一阶段,RPN利用滑动窗口生成多个候选框,它会在不同尺度和纵横比的锚点上生成边界框。
4.Fast R-CNN:该模块接收 RPN 生成的候选框,利用 RoI Align,从不同尺度的特征金字塔图上提取特征,然后使用全连接层进行分类和边框回归。Fast R-CNN 输出检测到的目标类别及其边框位置。

二、模型原理

目标检测过程:特征提取(ResNet50)-> FPN -> RPN -> RoI -> Fast R-CNN。首先,ResNet50 提取原始图像的特征并将这些特征传递给 FPN。接着,FPN生成了多尺度的特征图以适应不同大小的物体。然后,RPN 在由特征金字塔生成的多尺度特征图上运行,生成一系列候选框。RPN的输出会作为 Fast R-CNN 的输入,利用RoI对候选框提取特征后,对结果进行分类和边框回归。

举例说明:

假设我们想将该模型用于自动驾驶场景,检测出行人、汽车和交通信号等。当我们用摄像头获取一帧图像时,首先将这个图像输入到 ResNet50,它会提取出有用的特征供后续进行目标检测。随后,FPN会生成不同尺度的特征图,从而提高对不同大小目标的检测能力。接下来,RPN从这些特征图中生成区域建议(候选框)。这些候选框包含了可能是我们关心物体的区域(行人、汽车等)。最后,Fast R-CNN 利用 RoI 从不同尺度特征图中提取候选框的特征,经过全连接层的处理后,对候选框进行分类和边框回归,最终输出检测结果。在自动驾驶场景下,该模型可以通过分析摄像头捕捉到的图像,快速准确地检测出行人、汽车、交通信号和其他障碍物等,从而帮助车辆做出正确的决策。

三、代码实现

import torchvision
from PIL import Image, ImageDraw, ImageFont
from coco_class import class_names

# 加载COCO数据集预训练模型
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)

# 设置模型为评估模式
model.eval()

# 加载图像并进行预处理
image = Image.open('banana.png')
transform = torchvision.transforms.Compose([
    torchvision.transforms.ToTensor(),
])
image_tensor = transform(image)
image_tensor = image_tensor[:3]
# 利用模型进行预测
predictions = model([image_tensor])

# 处理预测结果并输出
draw = ImageDraw.Draw(image)
font = ImageFont.truetype("arial.ttf", 30) # 设置字体大小和样式
for box, label, score in zip(predictions[0]['boxes'], predictions[0]['labels'], predictions[0]['scores']):
    if score > 0.5:
        draw.rectangle([(box[0], box[1]), (box[2], box[3])], outline='red')
        label_name = class_names[label.item()]
        draw.text((box[0], box[1]), str(label_name), fill='red', font=font) # 在图片上打印分类名称
image.show()

其中coco_class.py文件是加载coco数据集中的类别:

class_names = {
    0: 'background',
    1: 'person',
    2: 'bicycle',
    3: 'car',
    4: 'motorcycle',
    5: 'airplane',
    6: 'bus',
    7: 'train',
    8: 'truck',
    9: 'boat',
    10: 'traffic light',
    11: 'fire hydrant',
    12: 'N/A',
    13: 'stop sign',
    14: 'parking meter',
    15: 'bench',
    16: 'bird',
    17: 'cat',
    18: 'dog',
    19: 'horse',
    20: 'sheep',
    21: 'cow',
    22: 'elephant',
    23: 'bear',
    24: 'zebra',
    25: 'giraffe',
    26: 'N/A',
    27: 'backpack',
    28: 'umbrella',
    29: 'N/A',
    30: 'N/A',
    31: 'handbag',
    32: 'tie',
    33: 'suitcase',
    34: 'frisbee',
    35: 'skis',
    36: 'snowboard',
    37: 'sports ball',
    38: 'kite',
    39: 'baseball bat',
    40: 'baseball glove',
    41: 'skateboard',
    42: 'surfboard',
    43: 'tennis racket',
    44: 'bottle',
    45: 'N/A',
    46: 'wine glass',
    47: 'cup',
    48: 'fork',
    49: 'knife',
    50: 'spoon',
    51: 'bowl',
    52: 'banana',
    53: 'apple',
    54: 'sandwich',
    55: 'orange',
    56: 'broccoli',
    57: 'carrot',
    58: 'hot dog',
    59: 'pizza',
    60: 'donut',
    61: 'cake',
    62: 'chair',
    63: 'couch',
    64: 'potted plant',
    65: 'bed',
    66: 'N/A',
    67: 'dining table',
    68: 'N/A',
    69: 'N/A',
    70: 'toilet',
    71: 'N/A',
    72: 'tv',
    73: 'laptop',
    74: 'mouse',
    75: 'remote',
    76: 'keyboard',
    77: 'cell phone',
    78: 'microwave',
    79: 'oven',
    80: 'toaster',
    81: 'sink',
    82: 'refrigerator',
    83: 'N/A',
    84: 'book',
    85: 'clock',
    86: 'vase',
    87: 'scissors',
    88: 'teddy bear',
    89: 'hair drier',
    90: 'toothbrush'
}

运行结果:

 

 

 

 这里可以识别目标的位置信息和类别信息,后续还要针对视频的进行识别分类。

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

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

相关文章

【Java校招面试】基础知识(六)——计算机网络

目录 前言一、TCP协议 / UDP协议二、HTTP协议后记 前言 本篇主要介绍计算机网络的相关内容。 “基础知识”是本专栏的第一个部分,本篇博文是第六篇博文,如有需要,可: 点击这里,返回本专栏的索引文章点击这里&#xf…

操作系统——操作系统逻辑结构

0.关注博主有更多知识 操作系统入门知识合集 目录 2.1操作系统的逻辑结构 思考题: 2.2CPU的态 思考题: 2.3中断机制 2.1操作系统的逻辑结构 操作系统的结构指的是操作系统的设计和实现思路,按照什么样的结构设计、实现。 操作系统的…

公司新来的00后真是卷王,工作没2年,跳槽到我们公司起薪18K都快接近我了

说00后躺平了,但是有一说一,该卷的还是卷。这不,前段时间我们公司来了个00后,工作都没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 …

通过Python的PIL库给图片添加图片水印

文章目录 前言一、素材准备1.原图2.水印图 二、使用PIL库给图片添加图片水印1.引入库2.定义图片路径3.打开原图4.打开水印图片5.计算水印图片大小6.计算原图大小7.调整水印图片大小7.1调整前7.2调整后 8.计算水印图片位置8.1左上8.2左下8.3右上8.4右下8.5中间 9.添加水印10.保存…

Doris(20):Doris的函数—数学函数

1 查看函数名 show builtin functions in test_db; 2 abs(double a) 功能: 返回参数的绝对值 返回类型:double类型 使用说明:使用该函数需要确保函数的返回值是整数。 3 acos(double a) 功能: 返回参数的反余弦值 返回类型:double类型 MySQL 中反余弦函数 ACOS(…

数据库基础及用户管理授权

数据库概念 关系型数据库 数据结构二维表格 库 -> 表 -> 列(字段):用来描述对象的的一个属性;行:用来描述一个对象的信息 mysql(5.7/8.0) maridb ocracle postgresql sqlserver(windows…

196页11万字智慧水务平台建设方案

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 业务需求分析 3.1 主要业务描述 (1)调度中心主要业务描述 配套工程调度中心为一级调度机构,同时也是水务集团原水供水的统一调度中心。…

Iron Web Scraper 2023.4.13 Crack

Iron Web Scraper 被认为是 C# 的互联网抓取库,它能够让用户和开发者激发和最终的个人浏览行为,以提取文件、内容甚至图片和应用程序。动词作为 .NET 的本机项。IronWebScraper 具有从后台处理礼貌和多线程进程的能力,这使得用户程序很容易简…

SpringCloud学习(七)——统一网关Gateway

文章目录 1. 网关介绍2. 网关搭建2.1 引入依赖2.2 创建启动类2.3 编写配置2.4 测试 3. 路由断言工厂4. 路由过滤器4.1 过滤器配置4.2 全局过滤器4.3 过滤器执行顺序 5. 跨域问题处理 1. 网关介绍 到现在,我们可以使用Nacos对不同的微服务进行注册并管理配置文件&am…

天气预报查询 API 提供个性化的天气服务的设计思路

引言 假设你是一个开发人员或公司,正在考虑开发一款天气应用程序,但你意识到市场上已经有很多竞争者在使用天气预报查询 API 来提供类似的服务,本文将一起探寻一些创新的方法来提高应用程序的竞争力。 扩大竞争力的一些建议 如果市面上已经…

Redis主从复制和哨兵模式

Redis主从复制 概念 主从复制,是指将一台Redis服务器的数据,复制到其他的Reds服务器。前者称为主节点(master / leader),后者称为从节点(slave / follower)。 数据的复制是单向的,只能由主节点到从节点。 Master以写为主,Slave…

spring2:创建和使用

目录 1.创建Spring项目 1.1创建Maven类 1.2添加Spring支持框架 1.3添加启动类 2.存储Bean对象 2.0 spring项目中添加配置文件(第一次) 2.1创建Bean 2.2把Bean注册到容器中 3.获取并使用Bean对象 3.1创建上下文 3.2获取指定Bean对象 getBean()方法 --> 获取什么…

Flutter 组件抽取:日期(DatePicker)、时间(TimePicker)弹窗选择器【仿照】

简介 仿照《Flutter 仿ios自定义一个DatePicker》实行的日期弹窗选择器&#xff08;DatePicker&#xff09;、时间弹窗选择器&#xff08;TimePicker&#xff09; 效果 范例 class _TestPageState extends State<TestPage> {overridevoid initState() {super.initStat…

ros基础笔记

1创建工作空间 catkin_init_workspace 将文件夹初始化成ros文件 编译工作空间catkin_make vi ~/.bashrc 加入环境变量bashrc一下在任何终端都生效 catkin_create_pkg learning_communication通讯机制 std_msgs数据结构 rospy roscpp catkin_create_pkg mbot_description ur…

SpringBoot实现导出Excel功能

1 问题背景 需求要做一个导出excel的功能 2 前言 本篇着重阐述后端怎么实现&#xff0c;前端实现的部分只会粗略阐述。该实现方案是经过生产环境考验的&#xff0c;不是那些拿来练手的小demo。本文阐述的方案可以借鉴用来做毕设或者加到自己玩的项目中去。再次声明&#xff0c;…

题目 3166: 蓝桥杯2023年第十四届省赛真题-阶乘的和--不能完全通过,最好情况通过67.

原题链接&#xff1a; 题目 3166: 蓝桥杯2023年第十四届省赛真题-阶乘的和 https://www.dotcpp.com/oj/problem3166.html 致歉 害&#xff0c;首先深感抱歉&#xff0c;这道题还是没有找到很好的解决办法。目前最好情况就是67分。 这道题先这样跳过吧&#xff0c;当然以后还…

day9 实现UDP通信

目录 socket函数拓展 UDP通信实现过程 代码实现 socket函数拓展 send与recv函数&#xff1a; /*用于发送数据*/ ssize_t send(int sockfd, const void *buf, size_t len,int flags);/*用于接收数据*/ ssize_t recv(int sockfd, void *buf, size_t len,int flags);/*前三个…

【Python习题集5】函数的设计

函数的设计 一、实验内容二、实验总结 一、实验内容 1.编写两个函数分别按单利和复利计算利息&#xff0c;根据本金、年利率、存款年限得到本息和和利息。调用这两个函数计算1000元在银行存3年&#xff0c;在年利率是6%的情况下&#xff0c;单利和复利分别获得的本息和和利息。…

程序员不得不知道的 API 接口常识

1、初识 API 接口 记得在我初学 web 开发的时候&#xff0c;后端框架相关的教程基本都会教学生写渲染模版&#xff08;不分语言&#xff09;&#xff0c;也就是说后端返回的是整个网页的数据&#xff0c;浏览器只负责渲染。 一般这类模版在后端都会对应一个路由&#xff0c;比…

Vue——组合式函数

目录 什么是“组合式函数”&#xff1f;​ 鼠标跟踪器示例​ 异步状态示例​ 约定和最佳实践​ 命名​ 输入参数​ 返回值​ 副作用​ 使用限制​ 通过抽取组合式函数改善代码结构 选项式 API 中使用组合式函数​ 与其他模式的比较​ 和 Mixin 的对比​ 和无渲染…