在阿里天池拿到任务,总体判断大赛目标和走向。街景字符编码识别,从题目看就是计算机视觉的赛题。下面聊聊,我从拿到题目下来对赛题的理解。
1.赛题数据与实际的理解
从天池平台下载下来包括3个zip压缩文件,两个json文件,和一个CSV数据文件。zip压缩文件是一些png的图片文件,也是机器学习的主要文件,分别为训练集,验证集,和预测集。大概看了一下图片,数字的大小,数量,位置,方向各不一样。不过,好处就在大赛为了降低难度,已经用json文件告知你图片的大小,位置和图片的内容的范围。如下000000.png图片及json内容:
{"000000.png": {"height": [219, 219], "label": [1, 9], "left": [246, 323], "top": [77, 81], "width": [81, 96]}}
做个解释:
- height:字符的高度;
- label:字符的内容范围;
- left:字符的左边距;
- top:字符的上边距;
- width:字符的宽度
不过有一点需要判断的难点在于,字符的数量。
2.需要用到的Python模块
这里大概介绍一下,这里可能需要用到的主要模块。
numpy :提供了python对多维数组对象的支持:ndarray,具有矢量运算能力,快速、节省空间。numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。这里主要针对图片字符位置的矢量运算。
torch:自称为神经网络界的 Numpy, 因为他能将 torch 产生的 tensor 放在 GPU 中加速运算 (前提是你有合适的 GPU), 就像 Numpy 会把 array 放在 CPU 中加速运算. 所以神经网络的话, 当然是用 Torch 的 tensor 形式数据最好
torchvision:torchvision包是服务于pytorch深度学习框架的,用来生成图片,视频数据集,和一些流行的模型类和预训练模型。我认为这个是最关键的模块
OpenCV(import时候是cv2):一款强大的跨平台的计算机视觉库,使用它能完成我们对于图像和视频处理的很多功能。它以电信号的方式加以捕捉、记录、处理、储存、传送与重现的各种技术。这里主要是用来对图片的处理
json:这个就是json的读写库,处理json文件的
3.代码思路
import numpy as np
import cv2
import matplotlib.pyplot as plt
import json
train_json = json.load(open('cv/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('cv/mchar_train/mchar_train/000001.png')
arr = parse_json(train_json['000001.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()
如上代码,实现图片字符的读取,但是字符数量需要考虑的问题。处理思路有3种:
- 将不定长字符转化为定长处理,不足部分用标记为代替
- 按照不定长字符处理
- 将不定长字符分类在进行处理
总结:
总的来说,还不错,大概清楚解题思路,是一次自我提高的过程。