1 项目理解
- 项目来源于Datawhale与天池联合发起的零基础入门系列赛事第二场 —— 零基础入门CV赛事之街景字符识别。
- 赛题以计算机视觉中字符识别为背景,要求选手预测真实场景下的字符识别,这是一个典型的字符识别问题。通过这道赛题可以引导大家走入计算机视觉的世界,主要针对竞赛选手上手视觉赛题,提高对数据建模能力。
- 基本啰嗦就到这里,下面开始小白的干货
1.1 项目数据
赛题数据来源于Google街景图像中的门牌号数据集(The Street View House Numbers Dataset, SVHN),并经过匿名采样和噪音处理。该数据集来自真实场景的门牌号,因此具有不同颜色、样式、长短的数码组成。训练集数据包括3W张照片,验证集数据包括1W张照片,并且每张照片包括颜色图像和对应的编码类别和具体位置。
首先观察数据的特点和规律,此图中的门牌号图片的样式。可以了解到以下几点:
1、图片中的数字组合为0-9的组合,数码的位数不一,且数字的大小也不一样。以及在图片中的位置也是不一样的。
2、图片上的数字组合,数码之间的距离有的紧密,有的稀疏。数码边界不一样。
3、图片上的数字的清晰度不一样,简单的说就是有1080P、720P、480P以及360P的图片。
4、图片上的数码组合都有一个矩形框来界定这个数字的边界范围。
1.2 数据标签
自白:数据标签是数据的名字?独特的名字?是数据的特征。反正就是迷迷糊糊
1、项目中所有的数据(训练集、验证集和测试集)的标注使用的是JSON格式,并使用文件名进行索引。
2、每一个数据都给出了该数字的矩形框所在图片上的位置。并且其位置的信息用如下的数据方式表示,来界定这一数字组合的特征。
3、另外在数据格式中加入了边框信息
1.3 评测指标
评价标准为准确率,选手提交结果与实际图片的编码进行对比,以编码整体识别准确率为评价指标,结果越大越好,具体计算公式如下:
1. 4 数据读取
在赛题中给出了JSON标签中的数据读取格式:
import json
train_json = json.load(open('../input/train.json'))
<div STYLE="page-break-after: always;"></div>
# 数据标注处理ྞ
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('../input/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([])
1.5 解题思路
由观察到的规律:数码组合由0-9之间的数字组合成。数字的位数不同。则在识别的过程中会出现字符总数不定的情况,则给出的参考方法一种,则利用补全法来简化识别。