035、目标检测-物体和数据集

之——物体检测和数据集

目录

之——物体检测和数据集

杂谈

正文

1.目标检测

2.目标检测数据集

3.目标检测和边界框

4.目标检测数据集示例


杂谈

        目标检测是计算机视觉中应用最为广泛的,之前所研究的图片分类等都需要基于目标检测完成。

        在图像分类任务中,我们假设图像中只有一个主要物体对象,我们只关注如何识别其类别。 然而,很多时候图像里有多个我们感兴趣的目标,我们不仅想知道它们的类别,还想得到它们在图像中的具体位置。 在计算机视觉里,我们将这类任务称为目标检测(object detection)或目标识别(object recognition)。

        以下是一些主流的目标检测算法。请注意,领域中的进展可能导致新的算法和方法的出现,因此建议查阅最新的文献和研究以获取最新信息。

  1. Faster R-CNN (Region-based Convolutional Neural Network): Faster R-CNN是一种经典的目标检测框架,它引入了区域提议网络(Region Proposal Network,RPN)来生成候选区域,然后使用分类器和回归器来完成目标检测。

  2. YOLO (You Only Look Once): YOLO是一种实时目标检测算法,通过将图像划分为网格并在每个网格上预测边界框和类别,实现了高效的目标检测。YOLO的多个版本,如YOLOv2、YOLOv3、YOLOv4,都在改进性能和精度方面进行了优化。

  3. SSD (Single Shot Multibox Detector): SSD是一种单阶段的目标检测算法,它直接在图像中预测多个边界框和类别,具有高效性能和较好的准确度。

  4. Mask R-CNN: Mask R-CNN是在Faster R-CNN的基础上扩展而来,不仅可以进行目标检测,还可以生成目标的精确分割掩码。这使得它在实例分割任务中表现优异。

  5. RetinaNet: RetinaNet引入了一种名为Focal Loss的损失函数,用于解决目标检测中类别不平衡的问题。这个框架在同时保持高召回率的情况下提高了检测框的精度。

  6. EfficientDet: EfficientDet是一种基于EfficientNet的轻量级目标检测算法,通过优化模型结构和参数,实现了高效的目标检测性能。

  7. CenterNet: CenterNet通过预测目标的中心点,然后通过回归得到目标的边界框,具有简单而强大的设计,适用于多种场景。

  8. Cascade R-CNN: Cascade R-CNN通过级联使用多个检测器,每个检测器都在前一个阶段的基础上进行细化,从而提高了检测性能。

        这些算法都在不同的任务和场景中取得了良好的效果,选择最适合特定应用的算法通常取决于实际需求、计算资源和准确度要求。请注意,领域中的研究和发展一直在进行,因此可能有新的算法和技术已经问世。


正文

1.目标检测

        图片分类和目标检测:

         无人车的实时目标识别应用:

        边缘框:

在目标检测中,我们通常使用边界框(bounding box)来描述对象的空间位置。 边界框是矩形的,由矩形左上角的以及右角的x和y坐标决定。 另一种常用的边界框表示方法是边界框中心的(x,y)轴坐标以及框的宽度和高度。 


2.目标检测数据集

        经典的目标检测数据集,就是已经框好的:

        COO(Common Objects in Context)数据集是一个用于计算机视觉任务的大规模图像数据集,由微软研究院创建和维护。COCO数据集的目的是为目标检测、分割、图像标注等计算机视觉任务提供丰富多样的图像数据和标注信息。

以下是COCO数据集的一些关键特点:

  1. 图像数量: COCO数据集包含33w张图像,每张图像包括多个物体,总共有150w个物体,这些图像来自于不同的场景和情境。

  2. 对象类别: 数据集涵盖了80多个不同的对象类别,包括人、动物、交通工具、家具等,多为人造物体。这种多样性使得COCO数据集适用于亲民的目标检测和分类任务。

  3. 图像标注: 每张图像都有详细的标注信息,包括对象的边界框和对象的语义分割标签。这使得COCO数据集成为训练和评估目标检测、分割等模型的理想选择。

  4. 场景复杂性: 数据集中的图像通常具有复杂的场景,包括多个对象的重叠和各种遮挡。这使得模型在处理真实世界场景时更具挑战性。

  5. 用途广泛: COCO数据集被广泛用于评估计算机视觉模型的性能,特别是在目标检测、分割和图像生成等任务上。很多研究论文和竞赛中都使用了COCO数据集。

  6. 年度挑战赛: COCO每年都举办一个挑战赛,邀请研究人员提交他们在该数据集上训练的模型,并评估这些模型在不同任务上的性能。

        COCO数据集的贡献在于为计算机视觉社区提供了一个丰富而具有挑战性的数据集,推动了目标检测、分割和其他相关任务的研究和发展。


3.目标检测和边界框

        定义两种框的表示方法:

#左上右下表示法与中间高宽表示法的转换
#boxes是传入的多个框tenser
def box_corner_to_center(boxes):
    """从(左上,右下)转换到(中间,宽度,高度)"""
    x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
    cx = (x1 + x2) / 2
    cy = (y1 + y2) / 2
    w = x2 - x1
    h = y2 - y1
    boxes = torch.stack((cx, cy, w, h), axis=-1)
    return boxes


def box_center_to_corner(boxes):
    """从(中间,宽度,高度)转换到(左上,右下)"""
    cx, cy, w, h = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
    x1 = cx - 0.5 * w
    y1 = cy - 0.5 * h
    x2 = cx + 0.5 * w
    y2 = cy + 0.5 * h
    boxes = torch.stack((x1, y1, x2, y2), axis=-1)
    return boxes

# bbox是边界框的英文缩写
dog_bbox, cat_bbox = [60.0, 45.0, 378.0, 516.0], [400.0, 112.0, 655.0, 493.0]


#%%
boxes = torch.tensor((dog_bbox, cat_bbox))
print(box_center_to_corner(box_corner_to_center(boxes)) == boxes)

        画边界框:

#画边界框
def bbox_to_rect(bbox, color):
    # 将边界框(左上x,左上y,右下x,右下y)格式转换成matplotlib格式:
    # ((左上x,左上y),宽,高)
    return d2l.plt.Rectangle(
        xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0], height=bbox[3]-bbox[1],
        fill=False, edgecolor=color, linewidth=2)

fig = d2l.plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox, 'blue'))
fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'));

         显示结果:


4.目标检测数据集示例

        目前没有特别小的目标检测数据集用于示例,大的数据集跑起来都太慢了,感谢d2l团队搞了个香蕉数据集用于学习:

        拍摄了一组香蕉的照片,并生成了1000张不同角度和大小的香蕉图像。 然后,我们在一些背景图片的随机位置上放一张香蕉的图像。 最后,我们在图片上为这些香蕉标记了边界框。

         下载数据集:

import os
import pandas as pd
import torch
import torchvision
from d2l import torch as d2l

#@save
d2l.DATA_HUB['banana-detection'] = (
    d2l.DATA_URL + 'banana-detection.zip',
    '5de26c8fce5ccdea9f91267273464dc968d20d72')

#%%
#读取香蕉检测数据集。
# 该数据集包括一个的CSV文件,内含目标类别标签和位于左上角和右下角的真实边界框坐标
def read_data_bananas(is_train=True):
    """读取香蕉检测数据集中的图像和标签"""
    data_dir = d2l.download_extract('banana-detection')
    csv_fname = os.path.join(data_dir, 'bananas_train' if is_train
                             else 'bananas_val', 'label.csv')
    csv_data = pd.read_csv(csv_fname)
    csv_data = csv_data.set_index('img_name')
    images, targets = [], []
    for img_name, target in csv_data.iterrows():
        images.append(torchvision.io.read_image(
            os.path.join(data_dir, 'bananas_train' if is_train else
                         'bananas_val', 'images', f'{img_name}')))
        # 这里的target包含(类别,左上角x,左上角y,右下角x,右下角y),
        # 其中所有图像都具有相同的香蕉类(索引为0)
        targets.append(list(target))
    return images, torch.tensor(targets).unsqueeze(1) / 256

        自定义dataset,读取:

class BananasDataset(torch.utils.data.Dataset):
    """一个用于加载香蕉检测数据集的自定义数据集"""
    def __init__(self, is_train):
        self.features, self.labels = read_data_bananas(is_train)
        print('read ' + str(len(self.features)) + (f' training examples' if
              is_train else f' validation examples'))

    def __getitem__(self, idx):
        return (self.features[idx].float(), self.labels[idx])

    def __len__(self):
        return len(self.features)

def load_data_bananas(batch_size):
    """加载香蕉检测数据集"""
    train_iter = torch.utils.data.DataLoader(BananasDataset(is_train=True),
                                             batch_size, shuffle=True)
    val_iter = torch.utils.data.DataLoader(BananasDataset(is_train=False),
                                           batch_size)
    return train_iter, val_iter
#%%
batch_size, edge_size = 32, 256
train_iter, _ = load_data_bananas(batch_size)
batch = next(iter(train_iter))
#0是feature,批量大小,RGB通道,图片大小;1是label,批量大小,物体数,标号+四个坐标
print(batch[0].shape, batch[1].shape)

         展示:

#演示
#拿出前十个图像,换下维度
imgs = (batch[0][0:10].permute(0, 2, 3, 1)) / 255
axes = d2l.show_images(imgs, 2, 5, scale=2)
#每个框
for ax, label in zip(axes, batch[1][0:10]):
    #因为之前归一化到了0~1,所以要乘回来
    d2l.show_bboxes(ax, [label[0][1:5] * edge_size], colors=['w'])

         满天飞的香蕉:

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

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

相关文章

动手学深度学习——循环神经网络的从零开始实现(原理解释+代码详解)

文章目录 循环神经网络的从零开始实现1. 独热编码2. 初始化模型参数3. 循环神经网络模型4. 预测5. 梯度裁剪6. 训练 循环神经网络的从零开始实现 从头开始基于循环神经网络实现字符级语言模型。 # 读取数据集 %matplotlib inline import math import torchfrom torch import …

机器学习算法——集成学习

目录 1. Bagging 1. Bagging Bagging(bootstrap aggregating:自举汇聚法)也叫装袋法,其思想是通过将许多相互独立的学习器的结果进行结合,从而提高整体学习器的泛化能力,是一种并行集成学习方法。 工作流…

计算机msvcp120.dll丢失?msvcp120.dll丢失5种简单的解决方法分享

你们是否在电脑操作过程中常看到一段类似“msvcp120.dll缺失或损坏”的报错信息?这可能会干扰大家的日常应用程序使用,怎么办呢?别担心,接下来就是一篇详细的步骤来教你如何应对这种情况,让你们的电脑运作如初&#xf…

Cadence virtuoso drc lvs pex 无法输入

问题描述:在PEX中的PEX options中 Ground node name 无法输入内容。 在save runset的时候也出现无法输入名称的情况 解决办法: copy一个.bashrc文件到自己的工作目录下 打开.bashrc文件 在.bashrc中加一行代码:unset XMODIFIERS 在终端sour…

无需API开发,伯俊科技实现电商与客服系统的无缝集成

伯俊科技的无代码开发实现系统连接 自1999年成立以来,伯俊科技一直致力于为企业提供全渠道一盘货的服务。凭借其24年的深耕零售行业的经验,伯俊科技推出了一种无需API开发的方法,实现电商系统和客服系统的连接与集成。这种无代码开发的方式不…

【Proteus仿真】【STM32单片机】防火防盗GSM智能家居设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用声光报警模块、LCD1602显示模块、DS18B20温度、烟雾传感器模块、按键模块、PCF8591 ADC模块、红外检测模块等。 主要功能: 系统运行…

Linux--初识和几个简单的指令(1)

目录 前言 0.什么是操作系统 0.1 搭建 Linux 环境 0.2搭建 Linux 环境小结 1.使用 XShell 远程登录 Linux 1.1关于 Linux 桌面 1.2下载安装 XShell 1.3查看 Linux 主机 ip 1.4XShell 下的复制粘贴 2.Linux下基本指令 2.1 pwd命令 2.2 ls命令 2.3 mkdir指令 2.4 cd…

vue2项目封装axios(vite打包)

1.安装 npm i axios 2.封装axios 说明:request.js文件 //对axios进行二次封装 import axios from "axios" import "nprogress/nprogress.css"// 当前模块中引入store // import store from "/store"// 引入进度条import nprogress f…

【C++】泛型编程 ⑥ ( 类模板 | 类模板语法 | 代码示例 )

文章目录 一、类模板1、类模板引入2、声明类模板语法3、调用类模板语法 二、代码示例 - 类模板1、代码示例2、执行结果 一、类模板 1、类模板引入 类模板 与 函数模板 的 作用类似 , 当 多个类 功能相同 , 只是数据类型不同 , 此时可以 定义一个类模板 代替 定义多个类 ; 借助…

Python (十) 元组

元组 元组与列表类似,不同之处在于元组的元素不能修改。 元组使用小括号 ( ),列表使用方括号 [ ]。 元组创建只需要在括号中添加元素,并使用逗号隔开即可。 访问 tup1 (hello,Java,Python,123,456) print(type(tup1)) print(tup1[1])#输出 …

微信个人号api

简要描述: 登录E云平台 请求URL: http://域名地址/member/login域名地址开发者账号密码:后台系统自助开通 请求方式: POST 请求头Headers: Content-Type:application/json 参数: 参数名必选类型说…

F. Alex‘s whims Codeforces Round 909 (Div. 3) 1899F

Problem - F - Codeforces 题目大意:有q次询问,每次询问给出一个数x,要求构造一棵n个点的树,使得对于每次询问,树上都有一条简单路径的长度等于x,同时每次询问前可以对树进行一次操作,即将一个…

ForkLift:macOS文件管理器/FTP客户端

ForkLift 是一款macOS下双窗口的文件管理器,可以代替本地的访达。ForkLift同时具备连接Ftp、SFtp、WebDav以及云服务器。 ForkLift还具备访达不具备的小功能,比如从文件夹位置打开终端,显示隐藏文件,制作替换等功能。ForkLift 是一…

css继承属性

在css中,继承是指的是给父元素设置一些属性,后代元素会自动拥有这些属性 关于继承属性,可以分成: 字体系列属性文本系列属性元素可见性表格布局属性列表属性引用光标属性 继承中比较特殊的几点: a 标签的字体颜色不…

Python采集智联招聘网站数据实现可视化数据

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python Pycharm模块使用: selenium --> pip install selenium3.141.0 time csv驱动下载地址: https://googlechromelabs.github.io/chrome-for-te…

MATLAB中std函数用法

目录 语法 说明 示例 矩阵列的标准差 三维数组的标准差 指定标准差权重 矩阵行的标准差 数组页的标准差 排除缺失值的标准差 标准差和均值 标准差 std函数的功能是得到标准差。 语法 S std(A) S std(A,w) S std(A,w,"all") S std(A,w,dim) S std(A…

ExcelBDD PHP Guideline

在PHP里面支持利用Excel的BDD,也支持利用Excel进行参数化测试 ExcelBDD Use Excel file as BDD feature file, get example data from Excel files, support automation tests. Features The main features provided by this library are: Read test data acco…

1334. 阈值距离内邻居最少的城市/Floyd 【leetcode】

1334. 阈值距离内邻居最少的城市 有 n 个城市,按从 0 到 n-1 编号。给你一个边数组 edges,其中 edges[i] [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold。 返回能通过某些路径…

Spring学习②__IOC分析

目录 IOC控制反转IOCIOC理论案例IOC的思想(注入)IOC底层什么是 IOCIOC 底层原理 总结 IOC 控制反转IOC ①控制反转,把对象创建和对象之间的调用过程,交给Spring进行 ②使用IOC目的:为了耦合度降低 IOC理论案例 控制…

基于算术优化算法优化概率神经网络PNN的分类预测 - 附代码

基于算术优化算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于算术优化算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于算术优化优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…