活動介紹
本賽題是由Datawhale組織的組隊自學活動,感興趣的都可以報名參加。本次自學活動是通過進行街道字符識別比賽來進行的,目標導向明確。學習期限一個月,通過博客方式進行學習總結來打卡,是非常好的學習機會。
賽題介紹
街道字符識別是識別街道圖片中的字符,本題是識別數字。和最基本的手寫數字識別不同,街道圖片字符識別需要定位到字符的位置,並且字符長度不固定。數據集來源自SVHN。
字符表示
爲了降低賽事難度,Datawhale舉辦方將數據集進行了簡化,標註了街道圖片中字符的位置,通過json格式進行組織
Field | Description |
---|---|
top | 左上角座標X |
left | 左上角最表Y |
height | 字符高度 |
width | 字符寬度 |
label | 字符標籤 |
每張圖片會有多個字符,多個字符的json表示爲:
比如height,這個對象數組裏的元素分別是每個字符的表示。
多字符的情況
評測標準
評價標準爲準確率,選手提交結果與實際圖片的編碼進行對比,以編碼整體識別準確率爲評價指標,結果越大越好,具體計算公式如下:
數據集
數據集圖片:mchar_train.zip(3萬張)
數據集圖片標籤:mchar_train.json
驗證集圖片:mchar_val.zip(1萬張)
驗證集標籤:mchar_val.json
測試集:mchar_test_a.zip(4萬張)
最後提交格式:mchar_sample_submit_A.csv
解題思路
- 簡單的不定長字符轉成定長
比如最長的字符爲6位,那麼不滿6位的用特殊字符補齊。
比如
12->12XXXXXX
12345->12345X - 用CRNN對不定長字符進行識別
- 先檢測字符再識別
數據讀取
可以根據座標信息把圖片中的數字提取出來。
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([])