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

2023-09-18 21:26:05

基于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 torchvision

model = 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 T


def get_prediction(img_path, threshold):
    """
    get_prediction
      parameters:
        - 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 plt


def 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 predictions
    img = cv2.imread(img_path)
    # Read image with cv2
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    # Convert to RGB
    for 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 coordinates
        cv2.putText(img,pred_cls[i], boxes[i][0], cv2.FONT_HERSHEY_SIMPLEX, text_size, (0,255,0),thickness=text_th)
        # Write the prediction class
        plt.figure(figsize=(20,30))
        # display the output image
        plt.imshow(img)
        plt.xticks([])
        plt.yticks([])
        plt.show()
  • 预测是从 get_prediction 方法获得的
  • 对于每个预测,都会绘制边界框并写入文本
    与opencv
  • 显示最终图像

3.5 运行测试

更多推荐

【Redis】深入理解 Redis 持久化机制 —— RDB 和 AOF

文章目录一、Redis的持久化二、RDB持久化机制2.1对RBD的认识RDB的概念RDB持久化机制的优缺点RDB的相关配置2.2RDB的触发时机2.2RDB的触发时机自动触发手动触发:SAVE和BGSAVE2.3RDB文件的处理保存RDB文件压缩RDB文件校验RDB文件三、AOF持久化机制3.1对AOF的认识AOF的概

【SLAM】视觉SLAM简介

【SLAM】视觉SLAM简介task04主要了解了SLAM的主流框架,清楚VSALM中间接法与直接法的主要区别在什么地方,其各自的优势是什么,了解前端与后端的关系是什么1.什么是SLAM2.VSALM中间接法与直接法的主要区别在什么地方,其各自的优势是什么?在SLAM(SimultaneousLocalizationa

Rsync学习笔记1

企业架构Web服务器的文件及时同步:1)能够理解为何要服务器的文件同步;2)能够简单描述实现文件同步的几种方式;3)能够实现服务器文件实时同步的案例;服务器同步文件的必要性:当业务代码发生改变,上传到web服务器的时候,因为架构已经不是单台服务器提供服务,而是由多台Web服务器提供服务,业务代码需要同时上传到多台Web

2023数学建模研赛华为杯E题思路-出血性脑卒中临床智能诊疗建模

E题出血性脑卒中临床智能诊疗建模三、请建模回答如下问题1血肿扩张风险相关因素探索建模。a)请根据“表1”(字段:入院首次影像检查流水号,发病到首次影像检查时间间隔),“表2”(字段:各时间点流水号及对应的HM_volume),判断患者sub001至sub100发病后48小时内是否发生血肿扩张事件。结果填写规范:1是0否

【Spring】BeanName 的自动生成原理

🎈博客主页:🌈我的主页🌈🎈欢迎点赞👍收藏🌟留言📝欢迎讨论!👏🎈本文由【泠青沼~】原创,首发于CSDN🚩🚩🚩🎈由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!🌠个人主页目录🌟一、默认name生成原理🌟二、id和name属性处理原理🌟一、默认name生成原理在

【C++深入浅出】日期类的实现

目录一.前言二.日期类的框架三.日期类的实现3.1构造函数3.2析构函数3.3赋值运算符重载3.4关系运算符重载3.5日期+/-天数3.6自增与自减运算符重载3.7日期-日期四.完整代码一.前言通过前面两期类和对象的学习,我们已经对C++的类有了一定的了解。本期我们的目标是实现一个完整的日期类,通过实现日期类的构造函数

蓝桥杯 题库 简单 每日十题 day7

01啤酒和饮料题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐酒。#include<stdio.h>#include<stdlib.h>intmain()

基于SpringBoot的教师工作量管理系统

目录前言一、技术栈二、系统功能介绍管理员模块的实现教师模块的实现三、核心代码1、登录模块2、文件上传模块3、代码封装前言随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了教师工作量管理系统的开发全过程。通过分析教师工作量管理系统管理的不足,创建了一个计算机管理教师工作量管理系统

深眸科技迭代深度学习算法,以AI机器视觉技术扩围工业应用场景

智能制造是制造业数智化转型升级的发展方向,在当前以高端装备制造为核心的工业4.0时代背景下,越来越多的制造企业意识到机器视觉对于提高效率、降低成本,从而提升企业效益的意义。目前,机器视觉已成为制造业迈向智能制造过程中极其关键的一项技术,且通过融合人工智能,能够实现该技术的再一次升级,以此切入更多差异化工业应用场景,并以

软件设计模式

1.UML1.1类图表示法uml类图中,类使用包含类名、属性、方法属性或方法前的加好和减号表示了这个方法的可见性,可见性的符号有三种:+表示public-表示private#表示protected1.2类与类之间关系关联关系单向关联双向关系自关联聚合关系聚合关系是关联关系的一种,是强关联关系,是整体和部分的关系聚合关系

海艺互娱与亚马逊云科技合作,在生成式AI领域探索更多的训练方向

面对生成式AI(GenerativeAI)新浪潮,如何把握机遇,加速创新发展,智胜蓝海?通过与亚马逊云科技合作,海艺互娱使用云上便捷部署的生成式AI解决方案,快速构建起可以服务全球用户的seaart.ai艺术创作平台,让用户将灵感快速转化为作品的同时,实现成本优化。当前,随着人工智能的快速发展,生成式AI正以其惊人的创

热文推荐