一贺归、數(shù)據(jù)類型
訓(xùn)練集的數(shù)據(jù)都是帶標(biāo)注的圖片形式,本質(zhì)是一個(gè)分類問(wèn)題拂酣,預(yù)測(cè)圖片中的數(shù)字。
二婶熬、賽題難點(diǎn)
賽題的目的是識(shí)別圖片中的字符,即input = 圖片赵颅,output = 字符。但是給定的數(shù)據(jù)字符的長(zhǎng)度是不一致的饺谬。解決的方法,暫時(shí)可以考慮三種辦法:
1. 標(biāo)準(zhǔn)化一致的長(zhǎng)度
也就是說(shuō)取所有數(shù)據(jù)中字符長(zhǎng)度最長(zhǎng)為目標(biāo)長(zhǎng)度字符商蕴,比如叠萍,最長(zhǎng)的字符長(zhǎng)度為6绪商,表示為123456辅鲸,那么字符12則需要表示成12XXXX,這樣相當(dāng)于每個(gè)字符都有11種可能格郁。模型訓(xùn)練的時(shí)候相當(dāng)于對(duì)每張圖片都以11個(gè)字符對(duì)待独悴。
這種處理方法比較簡(jiǎn)單,但我覺(jué)得缺陷可能在于訓(xùn)練的模型不能很好的處理更長(zhǎng)的字符刻炒。
2.不定長(zhǎng)字符識(shí)別
CRNN模型暫時(shí)理解不了
3.先檢測(cè)再識(shí)別
三、理解數(shù)據(jù)
1.先導(dǎo)庫(kù)
import os, sys, glob, shutil, json
os.environ["CUDA_VISIBLE_DEVICES"] = '0'
import cv2
from PIL import Image
import numpy as np
from tqdm import tqdm, tqdm_notebook
import torch
import matplotlib.pyplot as plt
torch.manual_seed(0)
torch.backends.cudnn.deterministic = False
torch.backends.cudnn.benchmark = True
import torchvision.models as models
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
from torch.utils.data.dataset import Dataset
import json
2.查看一下json文件
json文件中存放的是訓(xùn)練集所有圖片的標(biāo)注
train_json = json.load(open('C:\\Users\\pc\\Desktop\\tianchi\\mchar_train.json'))
train_json["000000.png"]
{'000000.png': {'height': [219, 219],
'label': [1, 9],
'left': [246, 323],
'top': [77, 81],
'width': [81, 96]},
}
可以看到每張圖片都會(huì)存放5個(gè)標(biāo)注的內(nèi)容树瞭,包括“height”,“l(fā)abel”晒喷,“l(fā)eft”,“top”凉敲,“width”
“l(fā)abel”很好理解,就是每張圖片要識(shí)別的字符是什么爷抓,也就是數(shù)據(jù)的標(biāo)簽
剩下的4個(gè)就是字符的坐標(biāo),可以用一張圖很好的表示
3.理解一下讀取圖片
img = cv2.imread('C:\\Users\\pc\\Desktop\\tianchi\\000000.png')
圖片的讀取這里使用的是openCV的imread函數(shù)進(jìn)行讀取
imread這個(gè)函數(shù)有兩個(gè)參數(shù)蓝撇,即filename和flag
filename就是你的圖片的對(duì)應(yīng)的路徑
flag指的是你讀取圖片采用的模式叮姑,可以有很多選擇
再看看imread返回的是什么
array([[[ 98, 112, 108],
[ 97, 112, 108],
[ 98, 114, 107],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]],
[[100, 114, 110],
[ 99, 114, 110],
[ 99, 115, 108],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]],
[[101, 116, 112],
[101, 116, 112],
[101, 117, 110],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]],
...,
[[ 25, 21, 20],
[ 24, 22, 21],
[ 26, 24, 23],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]],
[[ 24, 23, 19],
[ 23, 24, 20],
[ 22, 23, 19],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]],
[[ 21, 22, 18],
[ 22, 23, 19],
[ 21, 22, 18],
...,
[255, 255, 255],
[255, 255, 255],
[255, 255, 255]]], dtype=uint8)
它返回的是一個(gè)三維數(shù)組
這里就需要補(bǔ)充一點(diǎn)圖像的相關(guān)知識(shí)了,一張圖片有許多的像素點(diǎn)構(gòu)成传透。我們常見(jiàn)的圖片一般是三通道圖片,即由紅朱盐、綠、藍(lán)三個(gè)通道構(gòu)成兵琳,每個(gè)像素點(diǎn)的顏色就可以用三個(gè)數(shù)值表示了骇径,范圍在0~255。imread返回的通道順序是BGR者春,因此很好理解了,imread返回的就是一個(gè)個(gè)像素點(diǎn)钱烟,每個(gè)像素點(diǎn)由三個(gè)值代表該點(diǎn)的顏色,這三個(gè)值可以看成是藍(lán)拴袭、綠、紅的深度的數(shù)值拥刻。
img.shape
(350, 741, 3)
同樣可以知道的是,該圖片是一個(gè)長(zhǎng)350般哼,寬741,三通道的圖片逝她。
我們對(duì)圖片的讀取核心也就是獲得這些信息,這些信息進(jìn)一步處理就可以轉(zhuǎn)換成對(duì)應(yīng)的樣本的特征了黔宛。
另外,img既然可以用一個(gè)三維數(shù)組表示臀晃,這也就意味著我們可以通過(guò)切片的方式對(duì)圖片進(jìn)行截取,同時(shí)根據(jù)圖片對(duì)應(yīng)的標(biāo)注的坐標(biāo)信息徽惋,我們也就可以將對(duì)應(yīng)的字符截取下來(lái)。
plt.subplot(1, 1, 1)
plt.imshow(img[77:77+219,246:246+81])
4.Task01總結(jié)
pytorch安裝以及單個(gè)數(shù)據(jù)讀取都沒(méi)什么問(wèn)題踢京,數(shù)據(jù)理解缺了一點(diǎn)基礎(chǔ)知識(shí),已經(jīng)查閱資料理解了宦棺。第一階段先這樣,接下來(lái)進(jìn)行數(shù)據(jù)的讀取和擴(kuò)增代咸。