目标检测笔记No.1概念与数据集
很有幸参加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
这里明确在图片处理过程中,以左上角坐标为原点,向下方向为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像素。
下载
链接: VOC官网链接
在linux系统终端,可以将下载连接,使用wget命令进行下载。
在window上,可以选择下载软件下载,速度会快些。
目录说明
目录 | 说明 |
---|---|
JPEGImages | 所有图片(训练、测试) |
ImageSets | 包含Layout、Main、Segmentation子文件;Layout存放的是train,valid,test和train+valid数据集的文件名;Segmentation中存放的是分割所用文件名;Main中存放的是各个类别所在图片的文件名 |
Annotations | 标签说明,xml格式(目标、框、检测难度) |
另外还有两个 SegmentationClass,SegmentationObject 是用来语义分割这里先不做叙述。
Annotations标注信息,以xml格式文件存储,可以用记事本和浏览器查阅
上图以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