【阿里天池新人赛】之街景字符识别(1)
正式赛时间:2020.5.14-2020.6.24
比赛网址:https://tianchi.aliyun.com/competition/entrance/531795/introduction
1.赛题数据
赛题来源自Google街景图像中的门牌号数据集(The Street View House Numbers Dataset, SVHN),并根据一定方式采样得到比赛数据集。
数据集报名后可见并可下载,该数据来自真实场景的门牌号。训练集数据包括3W张照片,验证集数据包括1W张照片,每张照片包括颜色图像和对应的编码类别和具体位置;为了保证比赛的公平性,测试集A包括4W张照片,测试集B包括4W张照片。
2.数据标签
所有的数据(训练集、验证集和测试集)的标注使用JSON格式,并使用文件名进行索引。如果一个文件中包括多个字符,则使用列表将字段进行组合。
3.解题思路
赛题思路分析:赛题本质是分类问题,需要对图片的字符进行识别。但赛题给定的数据图片中不同图片中包含的字符数量不等,如下图所示。有的图片的字符个数为2,有的图片字符个数为3,有的图片字符个数为4。
1.简单入门思路:定长字符识别
2.专业字符识别思路:不定长字符识别
3.专业分类思路:检测再识别
4.数据下载(download_data.py)
注册后,官方提供一个包含所有数据下载链接的.csv文件,借助python文件可以实现一键下载。
import pandas as pd
import os
import requests
import zipfile
import shutil
# 查看基本信息
links = pd.read_csv('data/mchar_data_list_0515.csv')
print(links.head())
# 下载文件
for i, link in enumerate(links['link']):
file_name = links['file'][i]
print(file_name, '\t', link)
file_name = 'data/' + file_name
if not os.path.exists(file_name):
response = requests.get(link, stream=True)
# 分块下载
with open(file_name, 'wb') as f:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
zip_list = ['mchar_train', 'mchar_test_a', 'mchar_val']
# 解压文件
for little_zip in zip_list:
if not os.path.exists('data/' + little_zip):
zip_file = zipfile.ZipFile('data/' + little_zip + '.zip', 'r')
zip_file.extractall(path='data/')
# 解压后的_MACOSX文件夹里边的内容不可读,这是上传者的mac压缩文件时自动生成的,无用,删去即可
if os.path.exists('data/' + '/' + '__MACOSX'):
shutil.rmtree('data/' + '/' + '__MACOSX')
5.标注信息查看(check_mask.py)
数据下载完后,我们可以简单的尝试看看json的标注文件如何对应标签。
import json
import numpy as np
import cv2
import matplotlib.pyplot as plt
train_json = json.load(open('data/mchar_train.json'))
# 数据标注处理
def parse_json(d):
arr = np.array([d['top'], d['height'], d['left'], d['width'], d['label']])
arr = arr.astype(int)
return arr
# 读取图像
img = cv2.imread('data/mchar_train/000000.png')
arr = parse_json(train_json['000000.png'])
plt.figure(figsize=(10, 10))
plt.subplot(1, arr.shape[1]+1, 1)
plt.imshow(img)
plt.xticks([])
plt.yticks([])
for idx in range(arr.shape[1]):
plt.subplot(1, arr.shape[1]+1, idx+2)
plt.imshow(img[arr[0, idx]:arr[0, idx]+arr[1, idx], arr[2, idx]:arr[2, idx]+arr[3, idx]])
plt.title(arr[4, idx])
plt.xticks([])
plt.yticks([])
plt.show()