我們與數字辨識的距離

林晉宏 (Jephian Lin)

此投影片由 Jupyter 製作
原始檔請見下方連結
https://github.com/jephianlin/outreach/blob/master/NSYSU-digits/NSYSU-digits.ipynb

MNIST database

MNIST 手寫數字資料庫

資料集內容

  • 訓練集:60,000 張圖片
  • 測試集:10,000 張圖片
  • idx 格式儲存

MNIST examples

(Source: Wikipedia of MNIST database
author: Josef Steppan)

資料來源

  • 取自 NIST 中的兩個資料集
  • Special Database 3:公務員寫的
  • Special Database 1:中學生寫的
  • MNIST training = 30,000 SD3 + 30,000 SD1
  • MNIST testing = 1,000 SD3 + 1,000 SD1

資料前處理

  • 每張圖大小為 28x28
  • 數字部份包在 20x20 的方框中
  • 白 0 ~ 255 黑
  • 依顏料重心置中

沒辦法中的辦法

  • 亂猜 ~10%
  • 看墨水用量 ~ 22%

各數字的墨水用量分佈
Distribution of ink densities

用墨水猜測的答對率(confusion matrix)

Confusion matrix of ink estimator

將圖片拉平

a = np.array([[1,2],
              [2,3]])
a.reshape(-1)

會得到

[1,2,2,3]

每個圖片都可以看成是 28x28 = 784 維的向量

距離

若 $x = (x_1, \ldots, x_n)$,
$y = (y_1, \ldots, y_n)$

則兩點之間距離為
$\|x-y\| = \sqrt{\sum_{i=1}^n (x_i - y_i)^2}$

k-nearest neighbors

96.8% ~ 99.37%
(10 minutes on i7-8700 12 cores)

k-nearest neighbors

(Source: Wikipedia of k-nearest neighbors algorithm
author: Antti Ajanki)

Linear classifier

88% ~ 92.4%

Linear classifier

Support vector machine

97.9% ~ 99.44% (7 minutes on i7-8700 12 cores)

Kernel function

(Source: Wikipedia of Support vector machine
author: Alisneaky)

Neural network

92% ~ 99.17%

  • 每層神經網路 = 一個矩陣 $W$、一個向量 $b$、一個非線性函數 $\sigma$
  • 輸入 $x$ 和輸出 $y$ 的關係
    $y = \sigma(xW +b)$

距離?

算一下 $x$, $y$, $z$ 之間的距離:

x = [0,1,0,0,1,0,0,1,0]
y = [0,0,1,0,0,1,0,0,1]
z = [1,1,1,1,0,1,1,1,1]

Distance between pictures

Convolution

Convolution

Convolution neural network

97% ~ 99.77%

NSYSU-digits dataset

NSYSU-digits 手寫數字資料集

資料集內容

  • 共 552 張圖片
  • 未區分訓練集及測試集
  • png 格式儲存

NSYSU digits examples

資料來源

  • 來自學生小考考卷
  • 課前詢問學生是否同意以匿名方式貢獻資料
  • 由研究助理加標籤
  • 公開在 GitHub: SageLabTW/auto-grading.git [ LICENSE ]

資料前處理

  • 每張圖大小為 28x28
  • 數字大小不一致
  • 白 0 ~ 255 黑(顏色偏淺)
  • 未置中

MNIST 訓練、NSYSU-digits 測試

  • random: ~10%
  • ink: 6%
  • kNN: 13% (1 minutes)
  • linear: 21%
  • SVM: 27% (5 minutes)
  • NN: 28%
  • CNN: 44% (one epoch) ~ 58%

悲慘世界

NSYSU-digits 3/4 訓練、1/4 測試

  • random: ~10%
  • ink: 19%
  • kNN: 45%
  • linear: 34%
  • SVM: 52%
  • NN: 25%
  • CNN: 32% (one epoch) ~ 75%

整體比較(準確率 in %)

M to M M to N N to N
random 10 10 10
ink 22 6 19
kNN 98.8 13 45
linear 88 21 34
SVM 97 27 52
NN 92 28 25
CNN 97 44 32

M: MNIST
N: NSYSU-digits

資料科學的用意不只在於使用模型
更重要的是在結果不如預期的時候了解可能的原因

Data processing

資料前處理

Comparison of two datasets

可能的選項:加粗、加深、大小統一、置中

加粗

Thicken the data

參數:radius, decay

Thicken illustration
decay = 0.8

加深

Darken the data

參數:thres, ax + b (leveling function)

new_arr[arr > thres] = new_arr[arr > thres] * a + b

大小統一

Resize the data

參數:thres, target (size of the bounding box)

Threshold illustration

參數:thres, target (size of the bounding box)

Resize illustration

置中

Centerize the data

參數:thres

[   0    1    2    3    4    5    6    7    8    9   10   11   12   13  (index)
[   0    0    0    0    0    0    0    0  233 1080  550  310  295  240  (column sum)    

   14   15   16   17   18   19   20   21   22   23   24   25   26   27] (index)
  289  402  542  119    0    0    0    0    0    0    0    0    0    0] (column sum)

加粗、加深、統一大小並置中

M to N M to thicken M to dark M to center M to ???
random 10 10 10 10 10
ink 6 9 7 7 12
kNN 13 27 26 52 87
linear 21 22 25 74 76
SVM 27 38 40 75 91
NN 28 28 29 70 82
CNN 44 45 49 90 95

M: MNIST
N: NSYSU-digits
thicken: thicken NSYSU-digits (rad=2, decay=0.8)
dark: darkened NSYSU-digits (+100)
center: centerized NSYSU-digits (fit to 20x20 and centered by mass)
???: some formula

須要處理的變數

  • thres
  • ax + b (leveling function)
  • radius
  • decay
  • target (size of the bounding box)

這些參數的設定目前看起來不錯
適用於所有狀況嗎?(掃描器、筆...)

其它問題

超出格子、字體歪斜、額外的一點、非預期的答案或空白...

超出格子

Out of box

字體歪斜

Unusual writing

額外的一點

Extra dot

非預期的答案或空白

  • 負數
  • 三位數
  • 空白

Difficulties/Mistakes in the NSYSU-digits project

專案中遇到的困難、犯過的錯誤

I have a dream — an auto-grading system

(Source Giphy)

小考出題自動化

jephianlin/QuizGenerator.git [ sample ]

Sample of quiz

分數採全有全無制、滿分 5 分
小考分數 = 課堂小考、所有補考的平均

如果課堂小考 0 分,但想拿 4.5
就要再寫對 9 張小考
而且在這之中沒有犯錯

驗證碼區位於右下角往左上 (1cm, 1cm) 處
大小為 (2cm, 2cm)

Bottom of a quiz paper

QR code 區位於左下角往右上 (1cm,1cm) 處
大小為 (2cm, 2cm)

Bottom of a quiz paper

Workflow 1

2019F ~ 2020S

在線性代數課中試行小考系統

助教幫我跑程式,發現:

  • 字體大小不一、不置中、有時候截圖還會截到線
  • QR code 有時候會讀不到
  • 預測準確率大約 60%(當時他用 FF design of CNN)

C.-C. Jay Kuo, Min Zhang, Siyang Li, Jiali Duan, Yueru Chen
Interpretable convolutional neural networks via feedforward design
Journal of Visual Communication and Image Representation, 60: 346–359, 2019

我當時相信只要神經網路處理好

字體大小不一、不置中、有時候截圖還會截到線

都不是問題

就這樣擺了一年
整年的考卷其實都是助教人工改的

有好助教的老師像個寶
由衷感謝 <(_ _)>

機械上的誤差

  • 印表機
  • 掃描器
  • 角度大致沒錯、但位差 ~ 2mm
  • 每臺掃描器掃出來的深度也不同

人為的誤差

每個人也不一定會寫在中心位置、大小也不同

Auto-boxing by 潘昶余

Auto-boxing

2020 Summer

一年後我開始準備下一年的課程
決心要在開學前把 auto-grading 搞定

尺寸錯誤

我一直告訴助教驗證碼和 QR code 的位置應該在 (1cm, 1cm) 的位置

Wrong paper size

LaTeX 產出的檔案預設是 US letter
印表機自動縮放印在 A4 的紙上

Wrong paper size

(更精確來說,每一頁的原始檔我有調成 A4,但合併的時候忘了;所以 A4 紙被嵌在 US letter 裡,又被 A4 紙印出來...)

程式碼有錯

圖檔截取出來以後
我開始用各種模型來做數字辨識

每個模型的準確率都只有 ~10%!

匯入資料庫的時候
圖片有重新洗牌一次

程式沒寫好...
圖片和答案分兩次洗牌

答案跟亂數沒兩樣,得到 10% 天經地義

QR code 抓不到

  • 用 pyzbar 這個套件來讀 QR code
  • 常常讀不到
  • 將圖片對比拉大以後有改進
    (let bright = 255 if bright > 100)

QR code fixer by 潘昶余

QR code fixer

加深、補洞
Fill gaps in the QR code

無法克服的障礙

學生的名字或學號
目前還是須要助教輸入 T_T

2020F

自動閱卷系統
掃描 → QR & 辨識 → email 學生
已經幾乎完成

資料沒清洗的狀況下辨識成功率只有 60%

↪ 為了做這投影片才認真清洗
(但目前還是人工辦識)

學號還是沒辦法處理

↪ 目前還是人工

QR code

↪ 出錯一次,程式除錯

不斷修正改進中:)

Summary

總結

關於人工智慧

  • 資料是否前處理過會大幅影響訓練的成果。
  • 前處理仍仰賴人為參數調整。
  • 參數調整取決於設備(掃描器)及資料特性(學生用的筆)

關於專案

  • 所學應該用在生活上;如果有什麼想法,就應該去試試看。
  • 一次完成一件事,才有可能累積更大的成果。
  • 機器在學習、人類也在學習,任何專案都應該是不斷修正的過程。
  • 提升準確率很好,但如何處理(無可避免的)判斷錯誤也很重要。
  • 人工和自動的切換,可增強產品的穩健性。

推薦閱讀

Questions

  1. 用 MNIST 訓練、NSYSU-digits 測試合理嗎?
  2. 目前的資料經過人工前處理後,可以訓練出 95% 的模型;我可以期待這個模型對下一批學生寫出來的字也有同樣的準確率嗎?
  3. 如果是你,你會如何將 NSYSU-digits 資料做前處理?有沒有更智慧的方法調整前處理的參數?