零基础入门CV赛事- 街景字符编码识别Task1

在阿里天池拿到任务,总体判断大赛目标和走向。街景字符编码识别,从题目看就是计算机视觉的赛题。下面聊聊,我从拿到题目下来对赛题的理解。

1.赛题数据与实际的理解

从天池平台下载下来包括3个zip压缩文件,两个json文件,和一个CSV数据文件。zip压缩文件是一些png的图片文件,也是机器学习的主要文件,分别为训练集,验证集,和预测集。大概看了一下图片,数字的大小,数量,位置,方向各不一样。不过,好处就在大赛为了降低难度,已经用json文件告知你图片的大小,位置和图片的内容的范围。如下000000.png图片及json内容:

零基础入门CV赛事- 街景字符编码识别Task1_第1张图片

{"000000.png": {"height": [219, 219], "label": [1, 9], "left": [246, 323], "top": [77, 81], "width": [81, 96]}}

做个解释:

  1. height:字符的高度;
  2. label:字符的内容范围;
  3. left:字符的左边距;
  4. top:字符的上边距;
  5. 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种:

  1. 将不定长字符转化为定长处理,不足部分用标记为代替
  2. 按照不定长字符处理
  3. 将不定长字符分类在进行处理

总结:

总的来说,还不错,大概清楚解题思路,是一次自我提高的过程。

你可能感兴趣的:(python)