飞桨领航团AI达人创造营——数据获取与处理(CV)

目录

  • 数据的获取途径
  • 数据处理与标注
    • 官方数据集处理成VOC或COCO格式
      • COCO和VOC数据集介绍
      • 数据标注——Object Keypoint类型
        • 常见的标注工具
  • 数据预处理方法
    • 数据增强

数据的获取途径

通常,我们的数据来源于各个比赛平台。首先是AIStudio中的数据集,大部分经典数据集例如百度AI Studio ,Kaggle、天池、讯飞等平台(通过关键词搜索获取需要的数据集),或者是Github。还有一些小的平台,需要大家自己去看。通常来说,数据集用于学术目的,有些数据需要申请才能获得链接。

数据处理与标注

官方数据集处理成VOC或COCO格式

很多弹幕会问,为什么要处理成VOC和COCO,这里补充一下我个人的理解。
我第一次做目标检测项目的时候,用的是YOLOv3+DarkNet53模型,当然目标检测的经典模型有很多,之所以选择这个,是随缘。(当然,后来就会学到如何选择模型)。这个模型的实现就是基于VOC数据集的,当你把代码勉强看懂了之后,兴高采烈的准备用自己的数据集训练的时候,你就会发现,要么你根据自己的数据集改代码,要么根据代码改自己的数据集格式。很明显,我觉得绝大多数人都是选择该数据集,只要把数据集弄成VOC格式的,代码就跑通了,如果改代码的话,鬼知道又会出现什么bug。
 
后来,当我看了很多论文后,学了很多模型后,我发现,在论文中,模型的效果都是基于COCO、VOC、ImageNet之类的数据集。我认为,这是由于这些数据集的国际影响力比较大的缘故吧。
 
所以,学会把任何cv数据集改成国际通用的数据集,是很重要的!

COCO和VOC数据集介绍

COCO数据集不是奶茶的名字啦!!!

COCO数据集是Microsoft制作收集用于Detection + Segmentation + Localization + Captioning的数据集,作者收集了其2017年的版本,一共有25G左右的图片和600M左右的标签文件。 COCO数据集共有小类80个,大类12个。
 
Pascal 的全称是模式分析,静态建模和计算学习(Pattern Analysis, Statical Modeling and Computational Learning)。PASCAL VOC 挑战赛是视觉对象的分类识别和检测的一个基准测试,提供了检测算法和学习性能的标准图像注释数据集和标准的评估系统。从2005年至今,该组织每年都会提供一系列类别的、带标签的图片,挑战者通过设计各种精妙的算法,仅根据分析图片内容来将其分类,最终通过准确率、召回率、效率。

COCO格式,文件夹路径样式:

COCO_2017/
    ├── val2017     # 总的验证集
    ├── train2017    # 总的训练集
    ├── annotations    # COCO标注
	│   ├── instances_train2017.json     # object instances(目标实例) ---目标实例的训练集标注 
	│   ├── instances_val2017.json        # object instances(目标实例) ---目标实例的验证集标注
	│   ├── person_keypoints_train2017.json     # object keypoints(目标上的关键点) ---关键点检测的训练集标注
	│   ├── person_keypoints_val2017.json       # object keypoints(目标上的关键点) ---关键点检测的验证集标注
	│   ├── captions_train2017.json    # image captions(看图说话) ---看图说话的训练集标注
	│   ├── captions_val2017.json      # image captions(看图说话) ---看图说话的验证集标注

VOC格式,文件夹路径样式:

VOC_2017/
  ├── Annotations	# 每张图片相关的标注信息,xml格式
  ├── ImageSets
  │   ├── Main	# 各个类别所在图片的文件名
  ├── JPEGImages	# 包括训练验证测试用到的所有图片  
  ├── label_list.txt	# 标签的类别数
  ├── train_val.txt	#训练集 
  ├── val.txt   	# 验证集

数据标注——Object Keypoint类型

{
"info": info,
"licenses": [license],
"images": [image],
"annotations": [annotation],
"categories": [category]
}

Object Keypoint类型解析:
共享的 结构体/类型:info、licenses、images
不共享的 结构体/类型:annotations、categories
在不同的json文件中,共享的类型是一样的,不共享的类型是不一样的。
新增的keypoints是一个长度为3k的数组,其中k是category中keypoints的总数量。每一个keypoint是一个长度为3的数组,第一和第二个元素分别是x和y坐标值,第三个元素是个标志位v,v为0时表示这个关键点没有标注(这种情况下x=y=v=0),v为1时表示这个关键点标注了但是不可见(被遮挡了),v为2时表示这个关键点标注了同时也可见。 um_keypoints表示这个目标上被标注的关键点的数量(v>0),比较小的目标上可能就无法标注关键点。
最后,对于每一个category结构体,相比Object Instance中的category新增了2个额外的字段,keypoints是一个长度为k的数组,包含了每个关键点的名字;skeleton定义了各个关键点之间的连接性(比如人的左手腕和左肘就是连接的,但是左手腕和右手腕就不是)。 目前,COCO的keypoints只标注了person category (分类为人)。

常见的标注工具

目前比较流行的数据标注工具是labelimg、labelme,分别用于检测任务与分割任务的标注。

数据预处理方法

图像分为位图矢量图
位图由像素点定义(放大会模糊),文件体积较大,色彩表现丰富逼真。
矢量图由超矢量定义(放太不模糊),文件体积较小,表现力差。

数据增强

是因为很多深度学习的模型复杂度太高了,且在数据量少的情况下,比较容易造成过拟合(通俗来说就是训练的这个模型它太沉浸在这个训练样本当中的一些特质上面了),表现为的这个模型呢受到了很多无关因素的影响。 所得出的结果就是在没有看到过的样本上对它做出预测呢就表现的不太好。

import paddle
import paddlex as pdx
import numpy as np
import paddle.nn as nn
import paddle.nn.functional as F
import PIL.Image as Image
import cv2 
import os

from random import shuffle
from paddlex.det import transforms as T
from PIL import Image, ImageFilter, ImageEnhance

import matplotlib.pyplot as plt # plt 用于显示图片

path='dataset/MaskCOCOData/JPEGImages/maksssksksss195.png'
img = Image.open(path)
plt.imshow(img)          #根据数组绘制图像
plt.show()               #显示图像


# 灰度图
img = np.array(Image.open(path).convert('L'), 'f')
plt.imshow(img,cmap="gray")          #根据数组绘制图像
plt.show()               #显示图像

# 小Tips:jupyter notebook中plt显示灰度图异常,需要使用plt.imshow(gray,cmap="gray")方法正常显示灰度图。

#原图
img = cv2.imread(path)
plt.subplot(221)
plt.imshow(img,cmap="gray")
# matplotlib 按照RGB顺序展示原图
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) 
plt.subplot(222)
# cv2默认的GBR显示图
plt.imshow(img)
plt.subplot(223)
# 32*32的缩略图
plt.imshow(cv2.resize(img, (32, 32)))

#图像处理示例  目标视野里比较多重叠,或者有点模糊的适用 
path='dataset/MaskCOCOData/JPEGImages/maksssksksss443.png'
img = Image.open(path)
plt.imshow(img)        
plt.show()  


#锐化
img = img.filter(ImageFilter.SHARPEN)
img = img.filter(ImageFilter.SHARPEN)
plt.imshow(img)        
plt.show()          

#亮度变换
bright_enhancer = ImageEnhance.Brightness(img)    # 传入调整系数亮度
img = bright_enhancer.enhance(1.6)
plt.imshow(img)        
plt.show() 

#提高对比度
contrast_enhancer = ImageEnhance.Contrast(img)    # 传入调整系数对比度
img = contrast_enhancer.enhance(1.9)
plt.imshow(img)        
plt.show() 

你可能感兴趣的:(飞桨领航团,人工智能)