街道字符识别赛题理解

这算是我的第一篇的CV笔记,CV方面了解的不多,这次的街道字符识别算是一个正式的入门吧,下面简要介绍一下我对本次赛题的一些个人理解。

1、赛题数据

赛题以街道字符为赛题数据,来源于SVHN街道字符(The Street View House Numbers (SVHN) Dataset),训练集数据包括3W张照片,验证集数据包括1W张照片,每张照片包括颜色图像和对应的编码类别和具体位置;测试集A包括4W张照片,测试集B包括4W张照片。
街道字符识别赛题理解_第1张图片
如上图所示,都是原始数据。在分辨率和颜色上存在差异性的图片,在字符级别上带有边界框。(蓝色的边框只是起说明作用,边框并不是直接画在图片上,而是保存在digitStruct.mat文件中)  
注:数据集来源自SVHN,网页链接http://ufldl.stanford.edu/housenumbers/,并进行匿名采样处理

2、数据标签

训练图片的编码标签和具体的字符框的位置(训练集、验证集都给出字符位置):
街道字符识别赛题理解_第2张图片
街道字符识别赛题理解_第3张图片

3、评测指标

提交结果与实际图片的编码进行对比,以编码整体识别准确率为评价指标。任何一个字符错误都为错误,最终评测指标结果越大越好,具体计算公式如下:

Score=编码识别正确的数量/测试集图片数量

4、数据读取

JSON中标签的读取方式:

import json
train_json = json.load(open('../input/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('../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([])

5、解题思路

问题本质是分类问题,需对图片字符进行识别。

定长字符识别:
大多图像中字符个数为2-4个,最多为6个。故我们可以将此不定长字符识别问题转化为定长字符识别问题,先将每个字符都扩展成6位XXXXXX,例如字符14填充为14XXXX,字符123填充为123XXX。这样就成了6个字符的分类问题,每个字符的分类中会进行11个类别(0-9,X)的分类,若分类为填充字符,则表明该字符为空。

不定长字符识别:
现今基于深度学习的端到端OCR技术有两大主流技术:CRNN OCR和attention OCR。CRNN字符识别模型应用的更加广泛。
街道字符识别赛题理解_第4张图片
网络结构包含三部分,从下到上依次为:

  1. 卷积层,使用CNN,作用是从输入图像中提取特征序列;
  2. 循环层,使用RNN,作用是预测从卷积层获取的特征序列的标签(真实值)分布;
  3. 转录层,使用CTC,作用是把从循环层获取的标签分布通过去重整合等操作转换成最终的识别结果;
    街道字符识别赛题理解_第5张图片
    题中给定的图像数据都比较规整,可以视为一个单词或者一个句子。

检测再识别:
首先构建字符检测模型,对测试集中的字符进行识别。
可利用SSD、YOLO等常见目标检测算法先检测出字符的边界框,再通过模型识别字符所表示的数字。

6、总结

题目本身是简单的字符识别问题,解决过程中可以使用到多个CV中的模型算法,通过后续学习,可以逐渐加深对计算机视觉的理解和掌握。

你可能感兴趣的:(计算机视觉,深度学习)