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

基于PyTorch搭建FasterRCNN实现目标检测

基于PyTorch搭建FasterRCNN实现目标检测

1. 图像分类 vs. 目标检测

图像分类是一个我们为输入图像分配类标签的问题。例如,给定猫的输入图像,图像分类算法的输出是标签“猫”。

在目标检测中,我们不仅对输入图像中存在的对象感兴趣。我们还对它们在输入图像中的位置感兴趣。从这个意义上说,目标检测超越了图像分类。

1.1 图像分类与目标检测:使用哪一个?

图像分类非常适合图像中只有一个对象的应用。可能有多个类(例如猫、狗等),但通常图像中只有该类的一个实例。

在大多数输入图像中有多个对象的应用中,我们需要找到对象的位置,然后对它们进行分类。在这种情况下,我们使用目标检测算法。

目标检测可能比图像分类慢数百倍。因此,在图像中对象的位置不重要的应用中,我们使用图像分类。

2. 目标检测

简单来说,目标检测是一个两步过程:

  • 查找包含对象的边界框,使得每个边界框仅包含一个对象。
  • 对每个边界框内的图像进行分类并为其分配标签。

在接下来的几节中,我们将介绍 Faster R-CNN 目标检测架构开发的步骤。

2.1 滑动窗口方法

大多数用于目标检测的经典计算机视觉技术(例如 HAAR 级联和 HOG + SVM)都使用滑动窗口方法来检测目标。

在这种方法中,滑动窗口在图像上移动。该滑动窗口内的所有像素都被裁剪掉并发送到图像分类器。

如果图像分类器识别出已知对象,则存储边界框和类标签。否则,将评估下一个窗口。

滑动窗口方法的计算量非常大。为了检测输入图像中的对象,需要在图像中的每个像素处评估不同尺度和纵横比的滑动窗口。

由于计算成本,仅当我们检测具有固定纵横比的单个对象类时才使用滑动窗口。例如,OpenCV 中基于 HOG + SVM 或 HAAR 的人脸检测器使用滑动窗口方法。有趣的是,著名的 Viola Jones 人脸检测使用滑动窗口。对于人脸检测器,复杂性是可控的,因为仅在不同尺度下评估方形边界框。

2.2 R-CNN目标检测

在基于 CNN 的方法赢得 2012 年 ImageNet 大规模视觉识别挑战赛 (ILSVRC) 后,基于卷积神经网络 (CNN) 的图像分类器开始流行。

由于每个目标检测器的核心都有一个图像分类器,因此基于 CNN 的目标检测器的发明就变得不可避免。

有两个挑战需要克服:

  • 与 HOG + SVM 或 HAAR 级联等传统技术相比,基于 CNN 的图像分类器的计算成本非常昂贵。
  • 计算机视觉社区变得越来越雄心勃勃。人们希望构建一个多类对象检测器,除了能够处理不同的尺度之外,还可以处理不同的纵横比。

研究人员开始研究训练机器学习模型的新想法,该模型可以提出包含对象的边界框的位置。这些边界框称为区域提议或对象提议。

Ross Girshick 等人提出的第一个使用区域提议的方法被称为 R-CNN(具有 CNN 特征的区域的缩写)。

他们使用一种称为“选择性搜索”的算法来检测 2000 个区域提案,并在这 2000 个边界框上运行基于 CNN + SVM 的图像分类器。

当时 R-CNN 的精度是最先进的,但速度仍然很慢(GPU 上每张图像 18-20 秒)

2.3 Fast R-CNN目标检测

在 R-CNN 中,每个边界框由图像分类器独立分类。有 2000 个区域提案,图像分类器为每个区域提案计算一个特征图。这个过程是昂贵的。

在 Ross Girshick 的后续工作中,他提出了一种名为 Fast R-CNN 的方法,可以显着加快目标检测速度。

这个想法是为整个图像计算单个特征图,而不是为 2000 个区域提案计算 2000 个特征图。对于每个候选区域,感兴趣区域(RoI)池化层从特征图中提取固定长度的特征向量。每个特征向量随后用于两个目的:

  • 将区域分类为某一类(例如狗、猫、背景)。
  • 使用边界框回归器提高原始边界框的准确性。

2.4 Faster R-CNN目标检测

在 Fast R-CNN 中,尽管共享了对 2000 个区域提案进行分类的计算,但生成区域提案的算法部分并未与执行图像分类的部分共享任何计算。

在名为 Faster R-CNN 的后续工作中,主要见解是计算区域提议和图像分类这两个部分可以使用相同的特征图,从而共享计算负载。

卷积神经网络用于生成图像的特征图,同时用于训练区域提议网络和图像分类器。由于这种共享计算,目标检测的速度有了显着的提高。

3. PyTorch实现目标检测

在本节中,我们将学习如何将 Faster R-CNN 目标检测器与 PyTorch 结合使用。我们将使用 torchvision 中包含的预训练模型。 PyTorch 中所有预训练模型的详细信息可以在 torchvision.models 中找到

3.1 输入和输出

我们将要使用的预训练 Faster R-CNN ResNet-50 模型期望输入图像张量采用 [n, c, h, w] 形式,最小尺寸为 800px,其中:

  • n 是图像数量
  • c 是通道数,对于 RGB 图像,其为 3
  • h 是图像的高度
  • w 是图像的宽度

模型将返回

  • 边界框 [x0, y0, x1, y1] 形状为 (N,4) 的所有预测类别,其中 N 是模型预测的图像中存在的类别数量。
  • 所有预测类别的标签。
  • 每个预测标签的分数。

3.2 预训练模型

使用以下代码从 torchvision 下载预训练模型:

import torchvisionmodel = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
model.eval()

定义PyTorch官方文档给出的类名

	
COCO_INSTANCE_CATEGORY_NAMES = ['__background__', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'N/A', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'N/A', 'backpack', 'umbrella', 'N/A', 'N/A', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'N/A', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'N/A', 'dining table', 'N/A', 'N/A', 'toilet', 'N/A', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'N/A', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']

我们可以在列表中看到一些 N/A,因为后来的论文中删除了一些类。我们将使用 PyTorch 给出的列表。

3.3 模型预测

我们定义一个函数来获取图像路径并通过模型获得图像的预测。

from PIL import Image
from torchvision import transforms as Tdef get_prediction(img_path, threshold):"""get_predictionparameters:- img_path - path of the input image- threshold - threshold value for prediction score"""img = Image.open(img_path)transform = T.Compose([T.ToTensor()])img = transform(img)pred = model([img])pred_class = [COCO_INSTANCE_CATEGORY_NAMES[i] for i in list(pred[0]['labels'].numpy())]pred_boxes = [[(int(i[0]), int(i[1])), (int(i[2]), int(i[3]))] for i in list(pred[0]['boxes'].detach().numpy())]pred_score = list(pred[0]['scores'].detach().numpy())pred_t = [pred_score.index(x) for x in pred_score if x > threshold][-1]pred_boxes = pred_boxes[:pred_t + 1]pred_class = pred_class[:pred_t + 1]return pred_boxes, pred_class
  • 从图像路径获取图像
  • 使用 PyTorch 的 Transforms 将图像转换为图像张量
  • 图像通过模型来获得预测
  • 获得类、框坐标,但仅选择预测分数>阈值。

3.4 定义目标检测方法

接下来我们将定义一个方法来获取图像路径并获取输出图像。

import cv2
from matplotlib import pyplot as pltdef object_detection_api(img_path, threshold=0.5, rect_th=3, text_size=3, text_th=3):boxes, pred_cls = get_prediction(img_path, threshold)# Get predictionsimg = cv2.imread(img_path)# Read image with cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# Convert to RGBfor i in range(len(boxes)):cv2.rectangle(img, boxes[i][0], boxes[i][1],color=(0, 255, 0), thickness=rect_th)# Draw Rectangle with the coordinatescv2.putText(img,pred_cls[i], boxes[i][0], cv2.FONT_HERSHEY_SIMPLEX, text_size, (0,255,0),thickness=text_th)# Write the prediction classplt.figure(figsize=(20,30))# display the output imageplt.imshow(img)plt.xticks([])plt.yticks([])plt.show()
  • 预测是从 get_prediction 方法获得的
  • 对于每个预测,都会绘制边界框并写入文本
    与opencv
  • 显示最终图像

3.5 运行测试

相关文章:

基于PyTorch搭建FasterRCNN实现目标检测

基于PyTorch搭建FasterRCNN实现目标检测 1. 图像分类 vs. 目标检测 图像分类是一个我们为输入图像分配类标签的问题。例如,给定猫的输入图像,图像分类算法的输出是标签“猫”。 在目标检测中,我们不仅对输入图像中存在的对象感兴趣。我们还…...

线性表应用(非递减合并、分解链表、删除线性表)

将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间&#xff0c;不另外占用其它的存储空间。表中允许有重复的数据。 #include<iostream> using namespace std; typedef struct list {int data;list* next; }list,*linklist;…...

【C++面向对象侯捷下】1.导读

文章目录 来源&#xff1a;我的百度网盘 百科全书 专家书籍 C标准库 C编译器...

Ubuntu22.04 vnc远程黑屏

一、原因 原因是Ubuntu22.04使用的gnome启用了Wayland。vnc、teamviewer、向日葵、todesk等均无法使用或者远程黑屏等。 简单的说vnc、teamviewer、向日葵、todesk等均基于xorg实现&#xff08;xorg太流行&#xff09;&#xff0c;并不兼容Wayland&#xff0c;所以vnc无法正常…...

【1区TOP】Elsevier旗下CCF推荐,仅3个月左右录用!

01 期刊简介 CCF推荐人工智能类SCIE&EI 【期刊概况】IF&#xff1a;8.0-9.0&#xff0c;JCR1区&#xff0c;中科院2区TOP&#xff1b; 【版面类型】正刊&#xff1b; 【检索情况】SCIE&EI双检&#xff0c;CCF推荐&#xff1b; 【数据库收录年份】1992年&#xff…...

CentOS下安装Python3

一、电脑有网络&#xff1a; 1、直接使用yum包管理安装&#xff1a; yum是CentOS的默认包管理器&#xff0c;在安装软件时非常方便。要安装Python3&#xff0c;可以使用以下命令&#xff1a; sudo yum install python3等待安装完成后&#xff0c;查看python3是否安装完成 //不…...

微信小程序底部安全区域高度获取

CSS 属性 safe-area-inset-bottom safe-area-inset-bottom 就是安全区的高度 padding-bottom:env(safe-area-inset-bottom); wx.getSystemInfoSync() wx.getSystemInfoSync()可以获取系统信息 let system wx.getSystemInfoSync() let bottomSafe system.screenHeight -…...

虚拟机部署linux网络连接配置

1、虚拟机安装linux后&#xff0c;配置网络访问 虚拟机网络设置为NAT模式 linux网络配置好IP&#xff0c;主要是以下网络配置 2、linux没有ifconfig命令&#xff0c;ifconfig命令是在net-tools.x86_64包里 yum install net-tools.x86_64安装...

2591. 将钱分给最多的儿童(Java)

给你一个整数 money &#xff0c;表示你总共有的钱数&#xff08;单位为美元&#xff09;和另一个整数 children &#xff0c;表示你要将钱分配给多少个儿童。 你需要按照如下规则分配&#xff1a; 所有的钱都必须被分配。 每个儿童至少获得 1 美元。 没有人获得 4 美元。 请你…...

c++23中的新功能之十五类tuple类型的完全支持

一、std::tuple和std::pair 在传统的C里一直有一个问题让开发者不爽&#xff0c;就是无法返回多个值。一般来说&#xff0c;返回多个都建议采用封装的模式&#xff0c;比如弄一个结构体或者类啥的。这样做一定时没有问题的&#xff0c;但对于一些只返回一些简单值并且只在偶尔…...

iPhone15线下购买,苹果零售店前门店排长队

今年的苹果新品发布会于北京时间 9 月 13 日凌晨举行&#xff0c;并于 9 月 15 日&#xff08;周五&#xff09;开启订购&#xff0c;9 月 22 日&#xff08;周五&#xff09;起正式发售。 据多位网友反馈&#xff0c;首批苹果 iPhone15 系列手机、Apple Watch Ultra 2 / Seri…...

Vue3如何优雅的加载大量图片?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 表妹一键制作自己的五星红旗国庆头像&#xff0c;超好看 最近开发了一个功能&#xff0c;页面首页会加载大量的图片&#xff0c;初次进入页面时&#xff…...

Go语言开发环境搭建指南:快速上手构建高效的Go开发环境

Go 官网&#xff1a;https://go.dev/dl/ Go 语言中文网&#xff1a;https://studygolang.com/dl 下载 Go 的语言包 进入官方网站 Go 官网 或 Go 语言中文网&#xff1a; 选择下载对应操作系统的安装包&#xff1a; 等待下载完成&#xff1a; 安装 Go 的语言包 双击运行上…...

flex布局与float布局

float布局 俩栏 三栏 flex布局...

【C语言】字符函数和字符串函数(含模拟)

前言&#xff1a; 在做OJ题或阅读代码时或多或少会遇到一些字符函数和字符串函数&#xff0c; 如果不认识或不熟悉就会造成不便&#xff0c; 本篇文章主要是为了这方面而存在&#xff0c; 此篇介绍各个字符串的功能与使用方法&#xff0c; 下一篇会讲解如何模拟这些函数 重点&a…...

基于YOLOv8模型的条形码二维码检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的条形码二维码检测系统可用于日常生活中检测与定位条形码与二维码目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测…...

2023/09/22 制作demo期间心得

A*的估价函数&#xff1a;例如A->C&#xff0c;会计算A到B的距离B到C的距离作为成本&#xff0c;雕刻不会导致全局路线的重新计算&#xff0c;凸多边形是一个内部为凸集的简单多边形。 简单多边形的下列性质与其凸性等价&#xff1a;1、所有内角小于等于180度。 2、任意两个…...

高阶数据结构——图

图 图的基本概念 图的基本概念 图是由顶点集合和边的集合组成的一种数据结构&#xff0c;记作 G ( V , E ) G(V, E)G(V,E) 。 有向图和无向图&#xff1a; 在有向图中&#xff0c;顶点对 < x , y >是有序的&#xff0c;顶点对 < x , y > 称为顶点 x 到顶点 y 的…...

高性能AC算法多关键词匹配文本功能Java实现

直接上测试结果&#xff1a; 1000000数据集。 1000000关键词&#xff08;匹配词&#xff09; 装载消耗时间&#xff1a;20869 毫秒 匹配消耗时间&#xff1a;6599 毫秒 代码和测试案例&#xff1a; package com.baian.tggroupmessagematchkeyword.ac;import lombok.Data;im…...

如何在没有第三方.NET库源码的情况,调试第三库代码?

大家好&#xff0c;我是沙漠尽头的狼。 本方首发于Dotnet9&#xff0c;介绍使用dnSpy调试第三方.NET库源码&#xff0c;行文目录&#xff1a; 安装dnSpy编写示例程序调试示例程序调试.NET库原生方法总结 1. 安装dnSpy dnSpy是一款功能强大的.NET程序反编译工具&#xff0c;…...

混合量子计算:qumode与qubit协同架构解析

1. 混合量子计算基础概念解析 量子计算领域正在经历一场静默的革命——连续变量(qumode)与离散变量(qubit)的混合架构正突破传统计算范式的边界。这种混合架构不是简单的技术叠加&#xff0c;而是通过量子态的精妙耦合&#xff0c;在信息容量与计算稳定性之间建立起全新的平衡点…...

量子计算在供应链风险模拟中的革命性应用

1. 量子计算在供应链风险模拟中的革命性突破零售供应链风险管理正面临前所未有的挑战。2021年全球半导体短缺导致汽车行业损失2100亿美元&#xff0c;而疫情期间超市缺货率超过15%——这些危机暴露了传统风险模型的根本缺陷&#xff1a;它们假设供应链节点故障是独立事件&#…...

AI助手自我进化框架:异步复盘与技能固化工程实践

1. 项目概述&#xff1a;一个让AI助手学会自我进化的“内功心法”如果你用过Claude、ChatGPT或者国内的一些大模型&#xff0c;肯定有过这样的体验&#xff1a;你跟它聊得挺好&#xff0c;让它帮你写个代码、分析个文档&#xff0c;它都能干。但聊着聊着&#xff0c;你发现它好…...

SAP顾问实战笔记:手把手配置OBYC,搞定采购收货到发票校验的自动记账

SAP财务自动化实战&#xff1a;从采购收货到发票校验的OBYC全链路配置指南 当财务部门每月需要处理上千笔采购业务时&#xff0c;手工记账不仅效率低下&#xff0c;还容易出错。SAP系统中的OBYC配置正是解决这一痛点的关键——它能实现从采购收货到发票校验的全自动会计凭证生成…...

无线广域网技术演进与5G物联网应用解析

1. 无线广域网技术演进全景图作为一名在通信行业深耕十余年的技术专家&#xff0c;我见证了无线广域网(Wireless WAN)从最初的模拟信号传输到如今5G时代的完整演进历程。无线广域网本质上是利用无线电波实现地理分散系统互联的技术集合&#xff0c;其核心价值在于突破有线网络的…...

85个实用UserScript脚本:提升浏览器效率与网页交互体验

1. 项目概述与核心价值如果你和我一样&#xff0c;是个重度浏览器用户&#xff0c;每天要在各种网页上处理信息、查找资料&#xff0c;那你肯定也遇到过这些烦心事&#xff1a;想快速回到页面顶部&#xff0c;得疯狂滚鼠标滚轮&#xff1b;想复制个链接&#xff0c;结果网页自作…...

长曜创新获数千万元 A+ 融资,Tron Ultra 割草机器人年中全球发售破行业难题

硬氪获悉&#xff0c;智能庭院机器人公司「长曜创新」近日完成数千万元 A 融资&#xff0c;此前 A 轮融资也已在 2025 年 12 月完成&#xff0c;半年累计超亿元。其最新产品 Tron Ultra 系列将在年中全球发售。融资情况与发展方向长曜创新近日完成数千万元 A 轮融资&#xff0c…...

2025年液冷全产业链解析:AI时代散热革命,各环节下的价值拆解

&#x1f393;作者简介&#xff1a;科技自媒体优质创作者 &#x1f310;个人主页&#xff1a;莱歌数字-CSDN博客 &#x1f48c;公众号&#xff1a;莱歌数字&#xff08;B站同名&#xff09; &#x1f4f1;个人微信&#xff1a;yanshanYH 211、985硕士&#xff0c;从业16年 从…...

linux学习进展 I/O复用函数——poll详解

在前几篇笔记中&#xff0c;我们学习了I/O复用的基础概念以及select函数的使用&#xff0c;了解到select通过监视多个文件描述符的读写状态&#xff0c;实现了单进程处理多I/O事件的需求。但select存在明显的局限性&#xff0c;比如最大文件描述符数量限制、参数传递繁琐、内核…...

Node js 服务端应用如何集成 Taotoken 实现多模型对话

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Node.js 服务端应用如何集成 Taotoken 实现多模型对话 在构建需要智能对话能力的 Node.js 后端服务时&#xff0c;开发者常常面临两…...