需要数据小伙伴们,登录阿里云天池比赛,报名后可以将数据下载。
零基础入门CV赛事- 街景字符编码识别
以一张图片为例,读取数据集中的信息。
1 数据标签
在数据集中,训练每张图片将给出对应的编码标签,和具体的字符框的位置。
field | description |
---|---|
top | 左上角坐标X |
height | 字符高度 |
left | 左上角坐标Y |
width | 字符宽度 |
label | 字符编码 |
import numpy as np
import json
import cv2
import matplotlib.pyplot as plt
train_json = json.load(open('C:/Users/Administrator/jupyter_work/input/mchar_train.json')) # mchar_train.json 存放的路径
print("未处理前的000000.png字符款的位置信息: ", train_json['000000.png']) # 调用字典中的数据
输出的结果为:
未处理前的000000.png字符框的位置信息: {
'height': [219, 219], 'label': [1, 9], 'left': [246, 323], 'top': [77, 81], 'width': [81, 96]}
输出的结果与我们想要的形式不同,对数据的标注进行处理。
# 数据标注处理
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('C:/Users/Administrator/jupyter_work/input/mchar_train/000000.png')
# cv2.imshow("img", img)
# cv2.waitKey()
# cv2.destroyAllWindows()
arr = parse_json(train_json['000000.png'])
print("进行数据处理后的000000.png字符框的位置信息:", arr)
print("arr shape = " + str(arr.shape))
输出结果为:
进行数据处理后的000000.png字符框的位置信息: [[ 77 81]
[219 219]
[246 323]
[ 81 96]
[ 1 9]]
arr shape = (5, 2)
arr shape = (5, 2),说明图片000000.png中含有两个字符。
3 打印出原始图片和字符框选字符图片
# 显示000000.png
plt.figure(figsize=(10, 10))
plt.subplot(1, arr.shape[1] + 1, 1)
plt.imshow(img)
plt.axis('off') # 将横纵坐标轴关闭
# 将000000.png中的数字框选出来
for i in range(arr.shape[1]):
plt.subplot(1, arr.shape[1] + 1, i + 2)
plt.imshow(img[arr[0, i]: arr[0, i] + arr[1,i], arr[2, i]: arr[2, i] + arr[3, i]])
plt.title(arr[4, i])
plt.axis('off') # 将横纵坐标轴关闭
plt.show()
输出的图像为:
matplotlib和cv2读取图片通道的顺序是不同的:
matplotlib 读取顺序是:R -> G -> B
cv2 读取顺序是:B -> G -> R
上面代码:读取图像是使用cv2.imread();图像显示使用的是plt.imshow(), 所以图像的RGB通道发生了变化。
以下代码将cv2.imrea()读取图像的顺序更改为 R -> G -> B
imgRGB = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
# 显示000000.png RGB
plt.figure(figsize=(10, 10))
plt.subplot(1, arr.shape[1] + 1, 1)
plt.imshow(imgRGB)
plt.axis("off")
for i in range(arr.shape[1]):
plt.subplot(1, arr.shape[1] + 1, i + 2)
plt.imshow(imgRGB[arr[0, i]: arr[0, i] + arr[1,i], arr[2, i]: arr[2, i] + arr[3, i]])
plt.title(arr[4, i])
plt.axis('off') # 将横纵坐标轴关闭
plt.show()
输出的图像为:
这就我使用零基础入门CV赛事- 街景字符编码识别数据集中的一张图片提取框选的字符。
总有一个遗忘的过程,记录一下为以后查找方便。