目标检测笔记No.1概念与数据集

这篇博客介绍了目标检测的基本概念,包括定位和分类两个任务,以及目标框的两种定义。文章详细讲解了IoU(交并比)及其在模型训练中的重要性。此外,还阐述了VOC数据集的特点和使用方法,以及如何在Pytorch中使用Dataset和DataLoader类处理数据。最后,讨论了环境配置,如CUDA和cuDNN的安装与检测。
摘要由CSDN通过智能技术生成


很有幸参加Datawhale 十二月组队学习,本次笔记参考链接: 动手学CV-Pytorch第三章目标检测3.1-3.2部分,并在此基础上做出一些补充。

环境配置

版本型号

Ubuntu version -18.04.4
CUDA version -10.1.105
cuDNN version -765

加速包说明

CUDA和cuDNN 是 NVIDIA提供的软件包,它们是用来为神经网络加速的。就是使在GPU上实现高性能现代并行计算。
链接: NVIDIA官网

查询命令

#CUDA:
cat /usr/local/cuda/version.txt
#cuDNN:
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

Linux下载流程笼统版

1.下载安装包 硬件系统版本对应,GPU 型号考虑算力,cnDNN 要与CUDA版本匹配
2. 终端命令行安装
3. 测试是否安装成功

目标检测概念

什么是目标检测

目标检查:图像中用框选择目标对象,然后进行分类。包含两个任务,一个是定位,另一个是图像分类。

目标框两种定义

目标检测框两种定义说明
利用numpy库对上述两种目标检测框转换进行实现。

import numpy as np
# 目标框两种定义相互转换
def xy_to_xcyc(xy):
    return np.concatenate([(xy[:,2:]+xy[:,:2])*0.5,xy[:,2:]-xy[:,:2]],1)
def xcyc_to_xy(xcyc):
    return np.concatenate([xcyc[:,:2]-0.5*xcyc[:,2:],xcyc[:,:2]+0.5*xcyc[:,2:]],1)
# 测试
x2y2 = np.array([[1,1,5,5],[2,2,6,6]])
xcyc = xy_to_xcyc(x2y2)
if xcyc_to_xy(xcyc).all()==x2y2.all():
    print('Two functions are Successful!')
# 要用网络的话要将numpy格式转换为torch

评价指标IoU

IoU示意图
这里明确在图片处理过程中,以左上角坐标为原点,向下方向为y轴正方向,右侧为x轴正方向。IoU的全称是交并比(Intersection over Union),表示两个目标框的交集占其并集的比例。
IoU = S黄/(S红+S绿-S黄) 其中,S表是长方形面积,具体指向以颜色为准。程序实现的关键是黄色区域面积计算。

def find_intersection(set_1, set_2):
    """ 
    找到重叠的区域
    :参数 set_1: set 1, a tensor of dimensions (n1, 4)                                                                                                           
    :参数 set_2: set 2, a tensor of dimensions (n2, 4)
    :输出: 每一个在 set 1 中的框与每一个在 set 2中的框的重叠区域, a tensor of dimensions (n1, n2)
    """
    # PyTorch auto-broadcasts singleton dimensions
    lower_bounds = torch.max(set_1[:, :2].unsqueeze(1), set_2[:, :2].unsqueeze(0))  # (n1, n2, 2)
    upper_bounds = torch.min(set_1[:, 2:].unsqueeze(1), set_2[:, 2:].unsqueeze(0))  # (n1, n2, 2)
    intersection_dims = torch.clamp(upper_bounds - lower_bounds, min=0)  # (n1, n2, 2)
    return intersection_dims[:, :, 0] * intersection_dims[:, :, 1]  # (n1, n2)
# 代码参考github:https://datawhalechina.github.io/dive-into-cv-pytorch/

torch. unsqueeze(1) 在一维度上增加

red = torch.Tensor([[4,4,8,8],[1,1,5,5]])
print(red.size())  # out = (2,4)
print(red.unsqueeze(1) .size()) # out = (2,1,4)

注意:在目标检测中,IoU的计算贯穿整个模型的训练测试和评价过程,是非常重要的概念。

数据集_以VOC为例

公开数据包括ImageNet数据集、PASCAL VOC数据集、COCO(Common Objects in Context)等。

VOC 说明

VOC数据集在类别上可以分为4大类(交通工具、家具、动物、人),20小类。图片大小约为500×375像素。

下载

Created with Raphaël 2.2.0 开始 进入VOC官网链接 找到历年VOC挑战赛链接,主要07,12年的 在Development kit 点击下载训练、验证data即可 结束

链接: VOC官网链接
在linux系统终端,可以将下载连接,使用wget命令进行下载。
在window上,可以选择下载软件下载,速度会快些。

目录说明

目录说明
JPEGImages所有图片(训练、测试)
ImageSets包含Layout、Main、Segmentation子文件;Layout存放的是train,valid,test和train+valid数据集的文件名;Segmentation中存放的是分割所用文件名;Main中存放的是各个类别所在图片的文件名
Annotations标签说明,xml格式(目标、框、检测难度)

另外还有两个 SegmentationClass,SegmentationObject 是用来语义分割这里先不做叙述。
Annotations标注信息,以xml格式文件存储,可以用记事本和浏览器查阅
VOC31图
上图以VOC2007数据集中图片31为例。object:表示目标,其中,pose表示目标姿势为unspecified,truncated表示是否是一个被截断的目标,1表示是,0表示不是,difficult表示这个目标是否难检测,bndbox表示框定义这里是用第一种定义,方框左上坐标+右下坐标。

数据集如何使用

使用Pytorch为基本框架,数据集一般使用其中的Dataset类与DataLoader类,前者是将文件中的数据集导入程序中,后者是定义批次等属性便于之后模型训练。

Pytorch中Dataset类

import torch.utils.data.dataset as Dataset
class MyDataset(Dataset): # 继承Dataset的类
   # 初始化,定义数据内容和标签
    def __init__(self, ):
        pass
   # 得到数据内容和标签
    def __getitem__(self, ):
        pass
   # 返回数据集大小
    def __len__(self):
        pass

Pytorch中DataLoader类

在train.py中,加载数据程序部分,注意类的实例化

from datasets import MyDataset
from utils import *
import torch

data_folder = '../../../dataset/VOCdevkit'  # data files root path
keep_difficult = True  # use objects considered difficult to detect?
batch_size = 32  # batch size
workers = 4  # number of workers for loading data in the DataLoader

# Custom dataloaders
# 类实例化
train_dataset = PascalVOCDataset(data_folder,
                                 split='train',
                                 keep_difficult=keep_difficult)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True,
                                           collate_fn=train_dataset.collate_fn, num_workers=workers,
                                           pin_memory=True)  # note that we're passing the collate function here

调用函数与加载文件路径问题

调用下级目录
# 导入函数
import xxx.xxx # 以. 连接 表示 文件夹.子文件
# 文件夹中要包含 __init__.py 文件

# 导入文件 相对路径
path = 'xxx.json'

调用上级目录
# 导入函数
import sys
sys.path.append("..")  # 返回上一级
import xxx

# 导入文件
path = '/../xxx.json' # 上一级文件夹下的xxx.json
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值