赛事介绍
比赛连接:https://tianchi.aliyun.com/competition/entrance/531795/introduction
一、赛题数据
赛题来源自Google街景图像中的门牌号数据集(The Street View House Numbers Dataset, SVHN),该数据来自真实场景的门牌号。训练集数据包括3W张照片,验证集数据包括1W张照片,每张照片包括颜色图像和对应的编码类别和具体位置;为了保证比赛的公平性,测试集A包括4W张照片,测试集B包括4W张照片。所有的数据(训练集、验证集和测试集)的标注使用JSON格式,并使用文件名进行索引。如果一个文件中包括多个字符,则使用列表将字段进行组合。
!!!需要注意的是本赛题需要选手识别图片中所有的字符。
二、评测标准
评价标准为准确率,选手提交结果与实际图片的编码进行对比,以编码整体识别准确率为评价指标,结果越大越好,具体计算公式如下:
score= 编码识别正确的数量/测试集图片数量
数据下载连接:
file | link |
---|---|
mchar_train.zip | http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_train.zip |
mchar_train.json | http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_train.json |
mchar_val.zip | http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_val.zip |
mchar_val.json | http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_val.json |
mchar_test_a.zip | http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_test_a.zip |
mchar_sample_submit_A.csv | http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531795/mchar_sample_submit_A.csv |
环境准备
拟使用pytorch搭建识别模型,选择docker进行环境部署,下载python3.6+pytorch镜像;同时配置对应的安装包,使用commit改变对应镜像。此次的模型中需要额外配置的包有:tqdm,torch,torchvision。
数据获取与数据扩增
数据获取,下载第一部分数据连接中数据信息,并放到对应的目录下;
数据获取与处理方式参考baseline中的数据获取方法。
数据包
import os, sys, glob, shutil, json
os.environ["CUDA_VISIBLE_DEVICES"] = '0'
import cv2
from PIL import Image
import numpy as np
from tqdm import tqdm, tqdm_notebook
%pylab inline
import torch
torch.manual_seed(0)
torch.backends.cudnn.deterministic = False
torch.backends.cudnn.benchmark = True
import torchvision.models as models
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
from torch.utils.data.dataset import 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)
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)
定义好训练集和验证集的dataloder
train_path = glob.glob('../input/train/*.png')
train_path.sort()
train_json = json.load(open('../input/train.json'))
train_label = [train_json[x]['label'] for x in train_json]
print(len(train_path), len(train_label))
train_loader = torch.utils.data.DataLoader(
SVHNDataset(train_path, train_label,
transforms.Compose([
transforms.Resize((64, 128)),
transforms.RandomCrop((60, 120)),
transforms.ColorJitter(0.3, 0.3, 0.2),
transforms.RandomRotation(10),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])),
batch_size=40,
shuffle=True,
num_workers=10,
)
val_path = glob.glob('../input/val/*.png')
val_path.sort()
val_json = json.load(open('../input/val.json'))
val_label = [val_json[x]['label'] for x in val_json]
print(len(val_path), len(val_label))
val_loader = torch.utils.data.DataLoader(
SVHNDataset(val_path, val_label,
transforms.Compose([
transforms.Resize((60, 120)),
# 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=40,
shuffle=False,
num_workers=10,
)
小推广:这个比赛是Datawhale与天池联合发起的零基础入门系列赛事第二场 —— 零基础入门CV赛事之街景字符识别。我是2019年接触到datawhale的,缘分来自一次错误的公众号查找,但偶然发现里面有很多但干货,而且不像其他公众号各种软广,就一直关注着。Datawhale是一个公益性的组织,会经常组织一些免费的前沿培训,分享一些数据分析、机器学习、深度学习的内容。如果有问题,里面的伙伴还会帮忙解答,,,嗯,一群很有意思的人,一起做着有意义的事情,真的很棒!微信号: Datawhale 有需要的小伙伴可以添加一下呦。
未完待续。。。