当前位置: 首页 > news >正文

软件手机站网络营销属于什么专业类型

软件手机站,网络营销属于什么专业类型,中小学网站建设论文,中铁建设集团有限公司招聘3.2 目标检测数据集VOC 本文来自开源组织 DataWhale #x1f433; CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容#xff0c;教程中涉及的代码也可以在项目中找到#xff0c;后续会持续更新更多的优质内容#xff0c;欢迎⭐️。 如果…3.2 目标检测数据集VOC 本文来自开源组织 DataWhale CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容教程中涉及的代码也可以在项目中找到后续会持续更新更多的优质内容欢迎⭐️。 如果使用我们教程的内容或图片请在文章醒目位置注明我们的github主页链接https://github.com/datawhalechina/dive-into-cv-pytorch 3.2.1 VOC数据集简介 VOC数据集是目标检测领域最常用的标准数据集之一几乎所有检测方向的论文如faster_rcnn、yolo、SSD等都会给出其在VOC数据集上训练并评测的效果。因此我们我们的教程也基于VOC来开展实验具体地我们使用VOC2007和VOC2012这两个最流行的版本作为训练和测试的数据。 数据集类别 VOC数据集在类别上可以分为4大类20小类其类别信息如图3-5所示。 图3-5 VOC数据集目标类别划分数据集量级 VOC数量集图像和目标数量的基本信息如下图3-6所示: 图3-6 VOC数据集数据量级对比其中Images表示图片数量Objects表示目标数量 数据集下载 VOC官网经常上不去为确保后续实验准确且顺利的进行大家可以点击这里的百度云链接进行下载 VOC百度云下载链接 解压码(7aek) 下载后放到dataset目录下解压即可 下面是通过官网下载的步骤 进入VOC官网链接http://host.robots.ox.ac.uk/pascal/VOC/ 在图3-7所示区域找到历年VOC挑战赛链接比如选择VOC2012. 图3-7 VOC官网页面在VOC2012页面找到图3-8所示区域点击下载即可。 图3-8 VOC2012数据集下载页面VOC2007同理进行下载即可 数据集说明 将下载得到的压缩包解压可以得到如图3-9所示的一系列文件夹由于VOC数据集不仅被拿来做目标检测也可以拿来做分割等任务因此除了目标检测所需的文件之外还包含分割任务所需的文件比如SegmentationClass,SegmentationObject这里我们主要对目标检测任务涉及到的文件进行介绍。 图3-9 VOC压缩包解压所得文件夹示例1.JPEGImages 这个文件夹中存放所有的图片包括训练验证测试用到的所有图片。 2.ImageSets 这个文件夹中包含三个子文件夹Layout、Main、Segmentation Layout文件夹中存放的是trainvalidtest和trainvalid数据集的文件名 Segmentation文件夹中存放的是分割所用trainvalidtest和trainvalid数据集的文件名 Main文件夹中存放的是各个类别所在图片的文件名比如cow_val表示valid数据集中包含有cow类别目标的图片名称。 3.Annotations Annotation文件夹中存放着每张图片相关的标注信息以xml格式的文件存储可以通过记事本或者浏览器打开我们以000001.jpg这张图片为例说明标注文件中各个属性的含义见图3-10。 图3-10 VOC数据集000001.jpg图片左和标注信息右猛一看去内容又多又复杂其实仔细研究一下只有红框区域内的内容是我们真正需要关注的。 filename图片名称 size图片宽高 depth表示图片通道数 object表示目标包含下面两部分内容。 首先是目标类别name为dog。pose表示目标姿势为lefttruncated表示是否是一个被截断的目标1表示是0表示不是在这个例子中只露出狗头部分所以truncated为1。difficult为0表示此目标不是一个难以识别的目标。 然后就是目标的bbox信息可以看到这里是以[xmin,ymin,xmax,ymax]格式进行标注的分别表示dog目标的左上角和右下角坐标。 一张图片中有多少需要识别的目标其xml文件中就有多少个object。上面的例子中有两个object分别对应人和狗。 3.2.2 VOC数据集的dataloader的构建 1. 数据集准备 根据上面的介绍可以看出VOC数据集的存储格式还是比较复杂的为了后面训练中的读取代码更加简洁这里我们准备了一个预处理脚本create_data_lists.py。 该脚本的作用是进行一系列的数据准备工作主要是提前将记录标注信息的xml文件(Annotations)进行解析并将信息整理到json文件之中这样在运行训练脚本时只需简单的从json文件中读取已经按想要的格式存储好的标签信息即可。 注: 这样的预处理并不是必须的和算法或数据集本身均无关系只是取决于开发者的代码习惯不同检测框架的处理方法也是不一致的。 可以看到create_data_lists.py脚本仅有几行代码其内部调用了utils.py中的create_data_lists方法 pythoncreate_data_listsfrom utils import create_data_listsif __name__ __main__:# voc07_pathvoc12_path为我们训练测试所需要用到的数据集output_folder为我们生成构建dataloader所需文件的路径# 参数中涉及的路径以个人实际路径为准建议将数据集放到dataset目录下和教程保持一致create_data_lists(voc07_path../../../dataset/VOCdevkit/VOC2007,voc12_path../../../dataset/VOCdevkit/VOC2012,output_folder../../../dataset/VOCdevkit)设置好对应路径后我们运行数据集准备脚本: tiny_detector_demo$ python create_data_lists.py 很快啊dataset/VOCdevkit目录下就生成了若干json文件这些文件会在后面训练中真正被用到。 不妨手动打开这些json文件看下都记录了哪些信息。 下面来介绍一下parse_annotation函数内部都做了什么json中又记录了哪些信息。这部分作为选学不感兴趣可以跳过只要你已经明确了json中记录的信息的含义。 代码阅读可以参照注释建议配图3-11一起食用 pythonxml文件解析 import json import os import torch import random import xml.etree.ElementTree as ET #解析xml文件所用工具 import torchvision.transforms.functional as FT#GPU设置 device torch.device(cuda if torch.cuda.is_available() else cpu)# Label map #voc_labels为VOC数据集中20类目标的类别名称 voc_labels (aeroplane, bicycle, bird, boat, bottle, bus, car, cat, chair, cow, diningtable,dog, horse, motorbike, person, pottedplant, sheep, sofa, train, tvmonitor)#创建label_map字典用于存储类别和类别索引之间的映射关系。比如{1aeroplane 2bicycle......} label_map {k: v 1 for v, k in enumerate(voc_labels)} #VOC数据集默认不含有20类目标中的其中一类的图片的类别为background类别索引设置为0 label_map[background] 0#将映射关系倒过来{类别名称类别索引} rev_label_map {v: k for k, v in label_map.items()} # Inverse mapping#解析xml文件最终返回这张图片中所有目标的标注框及其类别信息以及这个目标是否是一个difficult目标 def parse_annotation(annotation_path):#解析xmltree ET.parse(annotation_path)root tree.getroot()boxes list() #存储bboxlabels list() #存储bbox对应的labeldifficulties list() #存储bbox对应的difficult信息#遍历xml文件中所有的object前面说了有多少个object就有多少个目标for object in root.iter(object):#提取每个object的difficult、label、bbox信息difficult int(object.find(difficult).text 1)label object.find(name).text.lower().strip()if label not in label_map:continuebbox object.find(bndbox)xmin int(bbox.find(xmin).text) - 1ymin int(bbox.find(ymin).text) - 1xmax int(bbox.find(xmax).text) - 1ymax int(bbox.find(ymax).text) - 1#存储boxes.append([xmin, ymin, xmax, ymax])labels.append(label_map[label])difficulties.append(difficult)#返回包含图片标注信息的字典return {boxes: boxes, labels: labels, difficulties: difficulties}看了上面的代码如果还不太明白试试结合这张图理解下: 图3-11 xml解析流程图接下来看一下create_data_lists函数在做什么建议配图3-12一起食用 python分别读取train和valid的图片和xml信息创建用于训练和测试的json文件def create_data_lists(voc07_path, voc12_path, output_folder):Create lists of images, the bounding boxes and labels of the objects in these images, and save these to file.:param voc07_path: path to the VOC2007 folder:param voc12_path: path to the VOC2012 folder:param output_folder: folder where the JSONs must be saved#获取voc2007和voc2012数据集的绝对路径voc07_path os.path.abspath(voc07_path)voc12_path os.path.abspath(voc12_path)train_images list()train_objects list()n_objects 0# Training datafor path in [voc07_path, voc12_path]:# Find IDs of images in training data#获取训练所用的train和val数据的图片idwith open(os.path.join(path, ImageSets/Main/trainval.txt)) as f:ids f.read().splitlines()#根据图片id解析图片的xml文件获取标注信息for id in ids:# Parse annotations XML fileobjects parse_annotation(os.path.join(path, Annotations, id .xml))if len(objects[boxes]) 0: #如果没有目标则跳过continuen_objects len(objects) #统计目标总数train_objects.append(objects) #存储每张图片的标注信息到列表train_objectstrain_images.append(os.path.join(path, JPEGImages, id .jpg)) #存储每张图片的路径到列表train_images用于读取图片assert len(train_objects) len(train_images) #检查图片数量和标注信息量是否相等相等才继续执行程序# Save to file#将训练数据的图片路径标注信息类别映射信息分别保存为json文件with open(os.path.join(output_folder, TRAIN_images.json), w) as j:json.dump(train_images, j)with open(os.path.join(output_folder, TRAIN_objects.json), w) as j:json.dump(train_objects, j)with open(os.path.join(output_folder, label_map.json), w) as j:json.dump(label_map, j) # save label map tooprint(\nThere are %d training images containing a total of %d objects. Files have been saved to %s. % (len(train_images), n_objects, os.path.abspath(output_folder)))#与Train data一样目的是将测试数据的图片路径标注信息类别映射信息分别保存为json文件参考上面的注释理解# Test datatest_images list()test_objects list()n_objects 0# Find IDs of images in the test datawith open(os.path.join(voc07_path, ImageSets/Main/test.txt)) as f:ids f.read().splitlines()for id in ids:# Parse annotations XML fileobjects parse_annotation(os.path.join(voc07_path, Annotations, id .xml))if len(objects) 0:continuetest_objects.append(objects)n_objects len(objects)test_images.append(os.path.join(voc07_path, JPEGImages, id .jpg))assert len(test_objects) len(test_images)# Save to filewith open(os.path.join(output_folder, TEST_images.json), w) as j:json.dump(test_images, j)with open(os.path.join(output_folder, TEST_objects.json), w) as j:json.dump(test_objects, j)print(\nThere are %d test images containing a total of %d objects. Files have been saved to %s. % (len(test_images), n_objects, os.path.abspath(output_folder)))同样建议配图食用 图3-12 数据准备流程图以train_dataset为例到这里我们的训练数据就准备好了接下来开始一步步构建训练所需的dataloader吧 2.构建dataloader 在这里我们假设你对Pytorch的 Dataset 和 DataLoader 两个概念有最基本的了解。 如果没有也不必担心你可以先阅读一下第2-1节数据读取与数据扩增进行简单的了解。 下面开始介绍构建dataloader的相关代码: 1.首先了解一下训练的时候在哪里定义了dataloader以及是如何定义的。 以下是train.py中的部分代码段 #train_dataset和train_loader的实例化train_dataset PascalVOCDataset(data_folder,splittrain,keep_difficultkeep_difficult)train_loader torch.utils.data.DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue,collate_fntrain_dataset.collate_fn, num_workersworkers,pin_memoryTrue) # note that were passing the collate function here可以看到首先需要实例化PascalVOCDataset类得到train_dataset然后将train_dataset传入torch.utils.data.DataLoader进而得到train_loader。 2.接下来看一下PascalVOCDataset是如何定义的。 代码位于 datasets.py 脚本中可以看到PascalVOCDataset继承了torch.utils.data.Dataset然后重写了__init__ , __getitem__, __len__ 和 collate_fn 四个方法这也是我们在构建自己的dataset的时候需要经常做的工作配合下面注释理解代码 pythonPascalVOCDataset具体实现过程import torch from torch.utils.data import Dataset import json import os from PIL import Image from utils import transformclass PascalVOCDataset(Dataset):A PyTorch Dataset class to be used in a PyTorch DataLoader to create batches.#初始化相关变量#读取images和objects标注信息def __init__(self, data_folder, split, keep_difficultFalse)::param data_folder: folder where data files are stored:param split: split, one of TRAIN or TEST:param keep_difficult: keep or discard objects that are considered difficult to detect?self.split split.upper() #保证输入为纯大写字母便于匹配{TRAIN, TEST}assert self.split in {TRAIN, TEST}self.data_folder data_folderself.keep_difficult keep_difficult# Read data fileswith open(os.path.join(data_folder, self.split _images.json), r) as j:self.images json.load(j)with open(os.path.join(data_folder, self.split _objects.json), r) as j:self.objects json.load(j)assert len(self.images) len(self.objects)#循环读取image及对应objects#对读取的image及objects进行tranform操作数据增广#返回PIL格式图像标注框标注框对应的类别索引对应的difficult标志(True or False)def __getitem__(self, i):# Read image#*需要注意在pytorch中图像的读取要使用Image.open()读取成PIL格式不能使用opencv#*由于Image.open()读取的图片是四通道的(RGBA)因此需要.convert(RGB)转换为RGB通道image Image.open(self.images[i], moder)image image.convert(RGB)# Read objects in this image (bounding boxes, labels, difficulties)objects self.objects[i]boxes torch.FloatTensor(objects[boxes]) # (n_objects, 4)labels torch.LongTensor(objects[labels]) # (n_objects)difficulties torch.ByteTensor(objects[difficulties]) # (n_objects)# Discard difficult objects, if desired#如果self.keep_difficult为False,即不保留difficult标志为True的目标#那么这里将对应的目标删去if not self.keep_difficult:boxes boxes[1 - difficulties]labels labels[1 - difficulties]difficulties difficulties[1 - difficulties]# Apply transformations#对读取的图片应用transformimage, boxes, labels, difficulties transform(image, boxes, labels, difficulties, splitself.split)return image, boxes, labels, difficulties#获取图片的总数用于计算batch数def __len__(self):return len(self.images)#我们知道我们输入到网络中训练的数据通常是一个batch一起输入而通过__getitem__我们只读取了一张图片及其objects信息#如何将读取的一张张图片及其object信息整合成batch的形式呢#collate_fn就是做这个事情#对于一个batch的imagescollate_fn通过torch.stack()将其整合成4维tensor对应的objects信息分别用一个list存储def collate_fn(self, batch):Since each image may have a different number of objects, we need a collate function (to be passed to the DataLoader).This describes how to combine these tensors of different sizes. We use lists.Note: this need not be defined in this Class, can be standalone.:param batch: an iterable of N sets from __getitem__():return: a tensor of images, lists of varying-size tensors of bounding boxes, labels, and difficultiesimages list()boxes list()labels list()difficulties list()for b in batch:images.append(b[0])boxes.append(b[1])labels.append(b[2])difficulties.append(b[3])#(3,224,224) - (N,3,224,224)images torch.stack(images, dim0)return images, boxes, labels, difficulties # tensor (N, 3, 224, 224), 3 lists of N tensors each 3.关于数据增强 到这里为止我们的dataset就算是构建好了已经可以传给torch.utils.data.DataLoader来获得用于输入网络训练的数据了。 但是不急构建dataset中有个很重要的一步我们上面只是提及了一下那就是transform操作(数据增强)。 也就是这一行代码 image, boxes, labels, difficulties transform(image, boxes, labels, difficulties, splitself.split)这部分比较重要但是涉及代码稍多对于基础较薄弱的伙伴可以作为选学内容后面再认真读代码。你只需知道同分类网络一样训练目标检测网络同样需要进行数据增强这对提升网络精度和泛化能力很有帮助。 需要注意的是涉及位置变化的数据增强方法同样需要对目标框进行一致的处理因此目标检测框架的数据处理这部分的代码量通常都不小且比较容易出bug。这里为了降低代码的难度我们只是使用了几种比较简单的数据增强。 transform 函数的具体代码实现位于 utils.py 中下面简单进行讲解 pythontransform操作是训练模型中一项非常重要的工作其中不仅包含数据增强以提升模型性能的相关操作也包含如数据类型转换(PIL to Tensor)、归一化(Normalize)这些必要操作。import json import os import torch import random import xml.etree.ElementTree as ET import torchvision.transforms.functional as FT 可以看到transform分为TRAIN和TEST两种模式以本实验为例在TRAIN时进行的transform有 1.以随机顺序改变图片亮度对比度饱和度和色相每种都有50的概率被执行。photometric_distort 2.扩大目标expand 3.随机裁剪图片random_crop 4.0.5的概率进行图片翻转flip *注意a. 第一种transform属于像素级别的图像增强目标相对于图片的位置没有改变因此bbox坐标不需要变化。但是2345都属于图片的几何变化目标相对于图片的位置被改变因此bbox坐标要进行相应变化。在TRAIN和TEST时都要进行的transform有 1.统一图像大小到(224,224)resize 2.PIL to Tensor 3.归一化FT.normalize()注1: resize也是一种几何变化要知道应用数据增强策略时哪些属于几何变化哪些属于像素变化 注2: PIL to Tensor操作normalize操作必须执行 def transform(image, boxes, labels, difficulties, split):Apply the transformations above.:param image: image, a PIL Image:param boxes: bounding boxes in boundary coordinates, a tensor of dimensions (n_objects, 4):param labels: labels of objects, a tensor of dimensions (n_objects):param difficulties: difficulties of detection of these objects, a tensor of dimensions (n_objects):param split: one of TRAIN or TEST, since different sets of transformations are applied:return: transformed image, transformed bounding box coordinates, transformed labels, transformed difficulties#在训练和测试时使用的transform策略往往不完全相同所以需要split变量指明是TRAIN还是TEST时的transform方法assert split in {TRAIN, TEST}# Mean and standard deviation of ImageNet data that our base VGG from torchvision was trained on# see: https://pytorch.org/docs/stable/torchvision/models.html#为了防止由于图片之间像素差异过大而导致的训练不稳定问题图片在送入网络训练之间需要进行归一化#对所有图片各通道求mean和std来获得mean [0.485, 0.456, 0.406]std [0.229, 0.224, 0.225]new_image imagenew_boxes boxesnew_labels labelsnew_difficulties difficulties# Skip the following operations for evaluation/testingif split TRAIN:# A series of photometric distortions in random order, each with 50% chance of occurrence, as in Caffe reponew_image photometric_distort(new_image)# Convert PIL image to Torch tensornew_image FT.to_tensor(new_image)# Expand image (zoom out) with a 50% chance - helpful for training detection of small objects# Fill surrounding space with the mean of ImageNet data that our base VGG was trained onif random.random() 0.5:new_image, new_boxes expand(new_image, boxes, fillermean)# Randomly crop image (zoom in)new_image, new_boxes, new_labels, new_difficulties random_crop(new_image, new_boxes, new_labels,new_difficulties)# Convert Torch tensor to PIL imagenew_image FT.to_pil_image(new_image)# Flip image with a 50% chanceif random.random() 0.5:new_image, new_boxes flip(new_image, new_boxes)# Resize image to (224, 224) - this also converts absolute boundary coordinates to their fractional formnew_image, new_boxes resize(new_image, new_boxes, dims(224, 224))# Convert PIL image to Torch tensornew_image FT.to_tensor(new_image)# Normalize by mean and standard deviation of ImageNet data that our base VGG was trained onnew_image FT.normalize(new_image, meanmean, stdstd)return new_image, new_boxes, new_labels, new_difficulties4.最后构建DataLoader 至此我们已经将VOC数据转换成了dataset接下来可以用来创建dataloader这部分pytorch已经帮我们实现好了我们只需将创建好的dataset送入即可注意理解相关参数。 pythonDataLoader#参数说明 #在train时一般设置shufleTrue打乱数据顺序增强模型的鲁棒性 #num_worker表示读取数据时的线程数一般根据自己设备配置确定如果是windows系统建议设默认值0防止出错 #pin_memory在计算机内存充足的时候设置为True可以加快内存中的tensor转换到GPU的速度具体原因可以百度哈~ train_loader torch.utils.data.DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue,collate_fntrain_dataset.collate_fn, num_workersworkers,pin_memoryTrue) # note that were passing the collate function here3.2.3 小结 到这里这一小节的内容就介绍完了。 回顾下本节中我们首先介绍了VOC数据集的基本信息以及如何下载随后我们介绍了和读取VOC数据集的相关代码。 万事俱备只欠模型
http://www.pierceye.com/news/185625/

相关文章:

  • 重庆忠县网站建设公司推荐国内公关公司
  • 给彩票网站做代理违法吗wordpress文章与页面关联
  • 网站标题加后缀模拟ip访问网站
  • 临清网站建设费用什么是网络营销的基础
  • 街道办的网站由谁做的企业首次建设网站的策划流程
  • 优化大师免费版下载一键优化下载安装
  • 网站建设近五年出版的书籍甘肃省工程建设信息官方网站
  • 杭州网站现场备案项目营销策划方案
  • 网站打包成app软件php网站 上传
  • 行业网站建设策划方案系部网站开发计划书
  • 建设部网站投诉核查做网站一般几个人
  • 360网站推广官网网址怎样在网站做咨询医生挣钱
  • 重庆市建设银行网站一站式网站建设有哪些
  • 自学设计软件的免费网站免费ppt模板简约
  • 申请个人网站怎么申请网站类型有哪些
  • 做网站推广托管注意哪个网站做推广好
  • 大竹网站建设泗阳城乡建设局网站
  • 山东省住房和城乡建设厅服务网站做网站的注意点
  • 网站排名优化软件江西网站备案要求
  • 桐柏县建设局网站邢台建设局网站
  • 网站域名变更怎么查英国做网站的人
  • 嘉兴公司的网站设计wordpress 送女友
  • 10个免费的黑科技网站电子元器件商城网站建设
  • 动画型网站做免费推广的平台
  • 购物网站怎么创建深圳地区5g微波网站建设计划
  • 安做省民改厅网站网站带支付模板
  • 做什么网站吸引人建设网站模板
  • 微信官网网站模板京东云网站建设
  • python 网站开发 前端利用vps做网站
  • 网站做下载功能南昌专业做网站的