零基础入门CV赛事—Task2 数据读取与数据扩增

零基础入门CV赛事—Task2 数据读取与数据扩增

本章学习【定长字符识别】来构建模型,逐步讲解解决方案和知识点。
2数据读取过程与扩增

2.1 学习目标
学习Python和Pytorch中图像读取
学会扩增方法和Pytorch读取赛题数据
2.2图像读取
主要学习一下pillow和OpenCV的操作
2.2.1 pillow

from PIL import Image,ImageFilter
im = Image.open('cat.jpg')
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg','jpeg')
#处理结果是应用模糊滤镜

2.2.2 OpenCv

import cv2
# 导入Opencv库
img = cv2.imread('cat.jpg')
img =cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 转换为灰度图
# Canny边缘检测
edges = cv2.Canny(img, 30, 70)
cv2.imwrite('canny.jpg', edges)

2.3数据扩增
2.3.1数据扩增介绍
在深度学习中数据扩增方法非常重要,数据扩增可以增加训练集的样本,同时也可以有效缓解模型过拟合的情况,也可以给模型带来的更强的泛化能力。
训练模型的参数量基本是百万级别的,而训练样本的数量却没有很多。数据扩增可以帮助扩展样本空间,在区分汽车种类的分类中,如果不进行数据扩增,深度模型会从是一个角度来判别,不能区别具体的汽车种类。

  • 从颜色空间、尺度空间到样本空间,同时根据不同任务数据扩增都有相应的区别。
  • 对于图像分类,数据扩增一般不会改变标签;对于物体检测,数据扩增会改变物体坐标位置;对于图像分割,数据扩增会改变像素标签。
    2.3.2 常见的数据扩增方法
  • transforms.CenterCrop 对图片中心进行裁剪
  • transforms.ColorJitter 对图像颜色的对比度、饱和度和零度进行变换
  • transforms.FiveCrop 对图像四个角和中心进行裁剪得到五分图像
  • transforms.Grayscale 对图像进行灰度变换
    在本次赛题中,赛题任务是需要对图像中的字符进行识别,因此对于字符图片并不能进行翻转操作。比如字符6经过水平翻转就变成了字符9,会改变字符原本的含义。

2.4 Pytorch读取数据
在Pytorch中数据是通过Dataset进行封装,并通过DataLoder进行并行读取。所以我们只需要重载一下数据读取的逻辑就可以完成数据的读取。
dataset:是对数据集的封装,提供索引方式的对数据样本进行读取
dataloader:对dataset进行封装,提供批量读取的迭代读取
在这里插入图片描述
代码示例:

class SVHNDataset(Dataset):
    def __init__(self,img_path,img_label,transform=None):
        self.img_path=img_path
        self.img_label=img_label
        if transform is not None:
            self.transform=transform
        else:
            self.transform =None
            
    def __getitem__(self,index):
        img=Image.open(self.img_path[index]).convert('RGB')
        
        if self.transform is not None:
            img = self.transform(img)
        
        #原始SVHM中类别10为数字0
        lbl =np.array(self.img_label[index],dtype = np.int)
        lbl = list(lbl)+(5-len(lbl))*[10]
        
        return img, torch.from_numpy(np.array(lbl[:5]))
    
    def __len__(self):
        return len(self.img_path)
    
train_path = glob.glob('../Desktop/8.CV学习的资料/数据集/mchar_train/*.png')
train_path.sort()
train_json =json.load(open('../Desktop/8.CV学习的资料/数据集/mchar_train.json'))
train_label = [train_json[x]['label']for x in train_json]

                      
                           
# data = SVHNDataset(train_path,train_label,transforms.Compose([
#         transforms.Resize((64,128)),#缩放到固定的大小
#         transforms.ColorJitter(0.2,0.2,0.2),#随机颜色变换
#         transforms.RandomRotation(5),#加入随机旋转
    
# ]))
    

train_loader = torch.utils.data.DataLoader(
        SVHNDataset(train_path,train_label,transforms.Compose([
            transforms.Resize((54,128)),
            transforms.ColorJitter(0.3,0.3,0.2),
            transforms.RandomRotation(5),
            transforms.ToTensor(),
            transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])
            
        ])),
    batch_size = 10,#每批样本个数
    shuffle = False,#是否打乱顺序
    num_workers = 10,#读取的线程数
)  

for data in train_loader:
    break
    
print(train_label[0]) 

在加入DataLoder后,数据按照批次获取,每批次调用Dataset读取单个样本进行拼接。此时data的格式为:
torch.Size([10, 3, 64, 128]), torch.Size([10, 6])
前者为图像文件,为batchsize * chanel * height * width次序;后者为字符标签。

注意一点的理解:

lbl =np.array(self.img_label[index],dtype = np.int)
        lbl = list(lbl)+(5-len(lbl))*[10]
        
        return img, torch.from_numpy(np.array(lbl[:5]))
    

以train_label的000000.png为例,print(train_label[0])的结果为[1,9],所以lbl=array[1,9],第二行lbl = [1, 9] + (5-2)*[10] = [1,9]+[10,10,10] = [1, 9, 10, 10, 10],不足的用10补足。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值