物体检测和数据集

目标检测和图片分类的区别

图片分类:

  • 在图像分类任务中,假设图像中只有一个主要物体对象,目标是识别出这个主要物体对象的类别(其他东西相对来说就不那么重要了)

目标检测:

  • 在目标检测任务中,一张图像里往往不只一个感兴趣的物体对象,目标不仅仅是识别图像中所有感兴趣的物体(找出所有感兴趣的物体),还要找出它们在图像中所在的具体位置(通过方框来表示)

目标检测相对于图片分类来讲所做的工作更多,它需要找出所有感兴趣的物体,当图片中只有一个物体时,可以将目标检测看成是图像分类,把图像中最主要的物体当作是图片的类别,但是当图片中有多个物体的时候,目标检测不仅能将所有的物体都检测出来,还能将他们所在的位置标注出来,所以目标检测的应用场景相对来讲更多

目标检测的应用

  • 无人驾驶:通过识别拍摄到的视频图像中的车辆、行人、道路和障碍物的位置来规划行进路线
  • 无人售后:通过目标检测识别客户选购的物品
  • 机器人通常通过目标检测来检测感兴趣的目标
  • 安防领域使用目标检测来检测异常目标,比如歹徒或者炸弹

边缘框(boundingbox)

  • 在目标检测中,通常使用边界框来描述对象的空间位置
  • 边界框是矩形

边缘框可以用四个数字来定义(两种常用的表示方法)

  • (左上x,左上y,右下x,右下y)
  • (中心x,中心y,宽,高)

正方向

  • 对于 x 轴来说,向右为 x 轴的正方向,即 x 的值从左到右依次增大
  • 对于 y 轴来说,向下为 y 轴的正方向,y 的值从上到下依次增大

目标检测数据集

  • 目标检测领域没有像MNISTFashion-MNIST那样的小数据集
  • 目标检测的数据集通常来说比图片分类的数据集小很多,因为标注的成本很高
  • 对于图片分类来说,最简单的就是给定一个CSV文件(图片与标号一一对应)或者是给定一个文件夹(每个类对应一个子文件夹,对应标号的图片放在子文件夹下)
  • 对于目标检测来说就不能简单的用文件夹的形式,因为一张图片中可能存在多个类,所以就不能放在子文件夹中,所以通常来说目标检测的数据集的标号需要额外存储
  • 假设使用文本文件存储的话,每一行表示一个物体,每一行分别由图片文件名(因为一张图片中可能有多个物体,所以同一个文件名可能会出现多次)、物体类别(标号)、边缘框(图片中物体的位置)组成,每一行一共有6(1+1+4)个值

COCO数据集

  • 目标检测中比较常见的数据集,类似于Imagenet在图片分类中的地位
  • 访问地址:https://cocodataset.org/#home
  • COCO数据集中有 80 个类别330k 图片1.5M 物体(每张图片中有多个物体)

数据集的读取

读取小批量的时候,图像的小批量的形状为(批量大小、通道数、高度、宽度),与图像分类任务中的相同

标签的小批量的形状为(批量大小,m,5)

  • m:数据集的任何图像中边界框可能出现的最大数量
  • 5:每个边界框的标签将被长度为 5 的数组表示:数组的第一个元素是边界框中对象的类别,其中 -1 表示用于填充的非法边界框;数组的其余 4 个元素是边界框左上角和右下角(x,y)坐标值

小批量计算虽然高效,但是要求每张图像含有相同数量的边界框,以便放在同一个批量中

  • 通常图像可能拥有不同数量个边界框,所以,在达到 m 之前,边界框少于 m 的图像将被非法边界框填充

总结

  • 物体检测不仅能够识别图片所有感兴趣的物体的类别,还能够识别他们的位置,该位置通常由矩形边框表示
  • 位置通常用边缘框表示(通常有四个数字
  • 用于目标检测的数据加载与图像分类的数据加载类似,但是,在目标检测中,标签还包含真实边界框的信息,它不出现在图像分类中

代码:

%matplotlib inline
import torch
from d2l import torch as d2ld2l.set_figsize()
img = d2l.plt.imread('01_Data/1664187097901.jpg')
d2l.plt.imshow(img)# 定义在这两种表示之间进行转换的函数
def box_corner_to_center(boxes):"""从(左上,右下)转换到(中间,宽度,高度)"""x1, y1, x2, y2 = boxes[:,0], boxes[:,1], boxes[:,2], boxes[:,3]     cx = (x1 + x2) / 2cy = (y1 + y2) / 2w  = x2 - x1h  = y2 - y1boxes = torch.stack((cx,cy,w,h),axis = -1)return boxesdef box_center_to_corner(boxes):"""从(中间,宽度,高度)转换到(左上,右下)"""cx, cy, w, h = boxes[:,0], boxes[:,1], boxes[:,2], boxes[:,3]x1 = cx - 0.5 * wy1 = cy - 0.5 * hx2 = cx + 0.5 * w y2 = cy + 0.5 * hboxes = torch.stack((x1,y1,x2,y2),axis = -1)return boxesdog_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))
# boxes 转中间表示,再转回来,等于自己
box_center_to_corner(box_corner_to_center(boxes)) == boxes # 将边界框在图中画出
def bbox_to_rect(bbox,color):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'))

目标检测数据集代码:

%matplotlib inline
import os
import pandas as pd
import torch
import torchvision
from d2l import torch as d2ld2l.DATA_HUB['banana-detection'] = (d2l.DATA_URL + 'banana-detection.zip','5de25c8fce5ccdea9f91267273465dc968d20d72')   # 读取香蕉检测数据集
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}')))targets.append(list(target))print("len(targets):",len(targets))print("len(targets[0]):",len(targets[0]))print("targets[0][0]....targets[0][4]:",targets[0][0], targets[0][1], targets[0][2], targets[0][3], targets[0][4])    print("type(targets):",type(targets))print("torch.tensor(targets).unsqueeze(1).shape:",torch.tensor(targets).unsqueeze(1).shape) # unsqueeze函数在指定位置加上维数为一的维度   print("len(torch.tensor(targets).unsqueeze(1) / 256):", len(torch.tensor(targets).unsqueeze(1) / 256))   print("type(torch.tensor(targets).unsqueeze(1) / 256):", type(torch.tensor(targets).unsqueeze(1) / 256))   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))
# ([32,1,5]) 中的1是每张图片中有几种类别,这里只有一种香蕉要识别的类别
# 5是类别标号、框的四个参数
batch[0].shape, batch[1].shape# 示例
# pytorch里permute是改变参数维度的函数,
# Dataset里读的img维度是[batch_size, RGB, h, w],
# 但是plt画图的时候要求是[h, w, RGB],所以要调整一下# 做图片的时候,一般是会用一个ToTensor()将图片归一化到【0, 1】,这样收敛更快
print("原始图片:\n", batch[0][0])
print("原始图片:\n", (batch[0][0:10].permute(0,2,3,1)))
print("归一化后图片:\n", (batch[0][0:10].permute(0,2,3,1)) / 255 )
imgs = (batch[0][0:10].permute(0,2,3,1)) / 255
#imgs = (batch[0][0:10].permute(0,2,3,1))
# d2l.show_images输入的imgs图片参数是归一化后的图片
axes = d2l.show_images(imgs, 2, 5, scale=2)
for ax, label in zip(axes, batch[1][0:10]):d2l.show_bboxes(ax, [label[0][1:5] * edge_size], colors=['w'])

0926物体检测和数据集相关推荐

  1. 分享 | 物体检测和数据集

    因为最近学习任务比较紧(但也不妨碍元旦摆烂三天),所以中间有几个实战Kaggle比赛就跳过了,等以后有时间再回头来看看.物体检测和数据集这一节花了有一天的时间,一直有一个bug困扰,后来改了代码把bo ...

  2. 深度学习笔记 —— 物体检测和数据集 + 锚框

    任务:识别我们所有感兴趣的物体,同时将每个物体的位置找出来 import torch from d2l import torch as d2l import matplotlib.pyplot as ...

  3. [深度学习]Object detection物体检测之概述

    一.Object detection物体检测与其他计算机视觉问题的区别与联系 在这里.有必要解释一下几大计算机视觉问题的区别与联系.说起物体检测是,那是计算机视觉之中一个比较热门的问题. 而它与图像识 ...

  4. 人工智能:物体检测之Faster RCNN模型

    人工智能:物体检测之Faster RCNN模型 物体检测 Faster RCNN模型 简介 卷积层 RPN Roi Pooling Classifier 物体检测 什么是物体检测 物体检测应用场景 物 ...

  5. 63万张!旷视发布最大物体检测数据集Objects365 | 技术头条

    编辑 | 琥珀 来源 | AI科技大本营(id:rgznai100) 昨日,在旷视科技联合北京智源人工智能研究院举办的发布会上,旷视研究院发布了物体检测数据集 Objects365,包含 63 万张图 ...

  6. CBGS : 三维点云物体检测的类平衡分组和采样(新自动驾驶数据集nScenes第一名算法)...

    作者丨Geek@知乎 来源丨https://zhuanlan.zhihu.com/p/80086809 编辑丨3D视觉工坊 <Class-balanced Grouping and Sampli ...

  7. 数据集超越MS COCO,2020智源x旷视Objects365物体检测挑战赛开赛

    2020智源x旷视Objects365物体检测挑战赛正式启动上线.2019年北京智源人工智能研究院联合旷视科技共同推出了两个检测任务的新基准:Objects365和CrowdHuman,并同步开放了两 ...

  8. 63万张!旷视发布最大物体检测数据集Objects365,物体检测竞赛登陆CVPR

    郭一璞 发自 北京会议中心  量子位 报道 | 公众号 QbitAI 比ImageNet大的图像数据集来了. 在4月16日的智源学者计划启动暨联合实验室发布会上,旷视科技发布了通用物体检测数据集Obj ...

  9. EfficientDet训练自己的物体检测数据集

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 目标检测能够既准确又快速吗? 我们常常有一个概念,SSD 等单阶段目标检测器很快,但准确性比不 ...

最新文章

  1. 企业支付宝账号开发接口实现
  2. 图解IIS服务器配置教程(asp\php\mysql)
  3. vim插件推荐之indentLine
  4. 阿里云服务器被[kthreaddi]挖矿病毒攻击
  5. Linux系统内存还有剩余就开始使用swap交换区了
  6. 漫画:有趣的 “切蛋糕“ 问题
  7. Visio2007画E-R图
  8. 安卓逆向及JavaScript实战
  9. 学3D建模的电脑配置
  10. [SSL_CHX][2021-08-19]区间和
  11. cout和cerr的区别
  12. 2023秋招大厂经典面试题及答案整理归纳(1-20)校招必看
  13. 医疗知识图谱问答系统探究(一)
  14. 小家伙的第一次露营体验
  15. Fastreport.Net用户手册:打印Bands
  16. Excel中金额小写转大写,职场小技能,值得学习
  17. STM32CubeIDE修改深色主题
  18. 熊逸《唐诗50讲》羁旅篇 - 学习笔记与感想
  19. 杨元庆:联想华为各有所长 不能光看短期结果
  20. 朋友圈可以定时发送吗?

热门文章

  1. 2012意大利之行3:罗马的路和车_我是亲民_新浪博客
  2. 合格的CTO应该是什么样?雷军王海峰王小川等共谈「技术创新」| CNCC2020-1
  3. Speedoffice(excel)如何制作斜线表头
  4. 实验二 利用Excel表格进行掷骰子模拟实验
  5. layui 读取本地excel内容_layui-excel
  6. 加载MSCOMCTL.OCX错误处理的几个关键
  7. 知识付费系统源码下载带课程数据+一键同步功能和更新设置
  8. 二、对HEVC/H.265视频编解码器进行隐写的基本思路
  9. VS:如何离线使用Nuget安装包
  10. 异步FIFO基本原理(基于Verilog的简单实现)