測量我們的數獨照片辨識器後學到的事
更新於 2026年11月5日
怎樣才算辨識正確
只有81格全部正確,一道謎題才算辨識正確:只要錯一個數字,就成了另一道謎題。因此我們計算的是整道謎題,而不是方格。兩者可能呈現非常不同的結果,本頁即可看出:在印刷照片上,辨識器現在能正確辨識98.9%的方格,但整道謎題的正確比例幾乎沒有變動,因為大部分錯誤的方格集中在少數幾張難辨識的圖片裡。
我們也計算最危險的錯誤:辨識錯誤、卻仍恰好只有一個解的謎題。真正的數獨只有一個解,所以無解或多解的辨識結果會立刻被發現。辨識錯誤但只有一個解的謎題看起來沒有問題,因此解題器會標出每一個它沒有把握的方格,並請你在解題前把這些方格與你的謎題對照。
只有200張圖片時,結果的精確度有限。主要結果我們附上95%的範圍(Wilson 區間):200張圖片中的89.5%,代表真實比率最可能落在84.5%到93.0%之間。
我們用來測試的圖片
我們從兩個公開資料集開始。Lexski 的 Sudoku Image Recognition 資料集(CC0)共有1,400張圖片,大多是大家在網路上分享的截圖與照片:各種風格的 App、深色主題、鉛筆標記,以及在紙上解到一半的謎題。Baptiste Wicht 與 Jean Hennebert 的資料集(CC BY 4.0)收錄用手機拍攝的報紙數獨,其中一些已用筆手寫填完。
在做任何修改之前,我們先保留了三個測試集:200張 Lexski 圖片、40張報紙照片,以及40道手寫填完的報紙謎題。工作期間,我們既不用它們訓練,也不查看它們。每項決策都根據另外200張 Lexski 圖片(即調校集)做出,而測試集只在最後讀取一次。
起點
10月31日的第一版在200張 Lexski 圖片中完全正確辨識了101張,在40張報紙照片中辨識了34張,40道已填完的謎題則一道也沒有。它的問題大多發生在辨識數字之前。它把最大的近似正方形墨跡當作盤面,而在截圖上,這個形狀常常把標題列或數字鍵盤也包了進去,深色主題中細細的灰色格線則完全被漏掉。在調校集的200張圖片中,它只有118次把網格定位在正確位置。
我們逐步做了哪些修改
每一列代表一項修改,數字是修改後200張調校圖片中完全正確辨識的張數。最後三列屬於第二輪。
| 修改 | 完全正確辨識的調校圖片(共200張) |
|---|---|
| 第一版,10月31日 | 99 |
| 以格線找出網格:每個方向十條等距線 | 129 |
| 並列比較網格;嘗試位移一格 | 136 |
| 利用淡細的格線找出網格 | 138 |
| 完整切出方格;從真實方格學習數字 | 161 |
| 小型神經網路標出盤面位置 | 162 |
| 在紙頁彎曲處沿著線條追蹤 | 163 |
| 改良數字辨識網路,鉛筆標記自成一類 | 173 |
| 平均三個數字辨識網路 | 177 |
| 審慎的唯一解規則;已填完的盤面整體辨識 | 177 |
| 第二輪:原尺寸照片縮小前先減半 | 178 |
| 第二輪:矮而淡的墨跡視為鉛筆標記 | 179 |
| 第二輪:橫向照片由三個網路共同判斷 | 179 |
大部分的進步來自三項修改。網格現在是靠格線找出的:對盤面的每一個推測,都會對齊到每個方向上十條等距的線,再並列比較評判,另外還有一個負責標出盤面位置的小型神經網路參與投票。每一格都完整切出,因此鉛筆標記在角落裡仍然很小,而深色方塊上的淺色數字看起來就像紙上的墨跡。此外,數字辨識網路是從 Lexski 訓練圖片中切出的真實方格學習的,鉛筆標記自成一類。現在由三個分開訓練的小型神經網路辨識每一格,並取它們答案的平均,因為它們出錯的方格各不相同。
已填完的謎題會得到額外協助。當盤面上有79個以上的數字時,辨識器會尋找最可能的完整盤面,使每一橫列、每一直行和每一宮都填有1到9。逐格辨識時,40道手寫測試謎題中只有7道完全正確;當作已完成的數獨整體辨識時,40道全部正確。
第二輪加入了三項較小的修改。原尺寸的手機照片在縮小之前會先逐步減半,讓細線和鉛筆筆畫被平均納入,而不是被跳過。若某一格的墨跡比盤面上有把握的數字矮得多、也淡得多,就會被視為可能是鉛筆標記。此外,橫向照片的旋轉方向改由三個神經網路共同判斷,而不是只靠一個。

沒有幫助的做法
以下做法我們同樣在調校集上測量過,最後沒有採用:
- 更大的數字辨識網路:以59,000個權重取代42,000個,只多正確辨識一張調校圖片,在瀏覽器中的執行速度卻慢了3.8倍。
- 3,000張生成的 App 截圖,含鉛筆標記與深色主題:無論加不加入,分數都一樣。
- 改讀彩色而非灰階,讓紅筆跟黑色墨水一樣深:多正確辨識兩張調校圖片,但手寫字的辨識變差。
- 把訓練用的數字扭曲變形,使其更像手寫:手寫字的辨識變差。
- 讓唯一解規則修改更多方格:正確辨識的謎題變多,但危險的「辨識錯誤卻只有一個解」的謎題也變多。
- 用新資料重新訓練三個神經網路,或改用四個或六個:差異在雜訊範圍內,因此保留了最初的那幾個。
- 對於被畫面邊緣截斷的盤面,把圖片邊緣當作盤面邊緣:變對的圖片和變錯的圖片一樣多。
第一批測試集的結果
各測試集中完全正確辨識的謎題數,分別為第一版與目前版本辨識器的結果:
| 測試集 | 10月31日 | 現在 |
|---|---|---|
| 網路上分享的截圖與照片(Lexski)圖片數: 200 | 10150.5% | 17989.5% |
| 報紙照片(Wicht 與 Hennebert)圖片數: 40 | 3485.0% | 40100.0% |
| 手寫填完的報紙謎題(Wicht 與 Hennebert)圖片數: 40 | 00.0% | 40100.0% |
在 Lexski 圖片上,辨識器從50.5%提升到89.5%(84.5%到93.0%),辨識錯誤卻只有一個解的謎題則從7道降到4道。這4道中有3道,多出來的那一個數字正是該格應有的數字,所以謎題仍會導向正確的解答;第4道則是一個印得很清楚的1,但資料集把那一格標為空白。179道中有177道是在第一輪結束時達成的。最後兩道是在第二輪、我們研究過失敗案例之後才達成的,因此這個測試集已不再是未經接觸的。
40道全對聽起來很完美,但40張圖片只能證明真實比率高於約91%。還有一項我們早該先做的檢查:40張報紙測試照片中有4張也出現在該資料集的訓練集中,其中2張連像素都完全相同。排除這些照片後,結果是36張中36張正確。
新的測試:任何版本都沒見過的200張照片
那時第一批測試集已經讀取過,失敗案例也已研究過,因此它們再也無法告訴我們辨識器在從未遇過的圖片上表現如何。我們在 Hugging Face、Kaggle、GitHub、Zenodo、Figshare 和 AIcrowd 上搜尋更多附標註的數獨照片。大部分資料集是生成的盤面、單一數字,或 Wicht 照片的副本。有三個 GitHub 收藏包含真實的標註照片,而且全是印刷謎題:一本公開謎題書的100張照片(NatalijaPetric/SudokuDataset)、80張大多拍攝報紙的照片(mineshpatel1/sudoku-solver,已剔除49張其實是 Wicht 本身的照片以及1張重複的副本),以及布加勒斯特大學一門電腦視覺課程專題的20張印刷紙本(danielsociu/SudokuRecognition)。
這三個來源都沒有註明授權條款,因此我們只用它們來測量:從不拿來訓練,也不在本頁展示。圖片清單在做任何修改之前,就已依規則根據檔案雜湊值與標註選定並儲存,而且在第二輪的最後一項修改完成之前,這些圖片從未被打開過。之後,每個版本的辨識器各讀取一次。表格計算的是完全正確辨識的謎題數。
| 來源 | 10月31日 | 第一輪 | 現在 |
|---|---|---|---|
| 公開謎題書(NatalijaPetric)照片數: 100 | 7979.0% | 7676.0% | 7878.0% |
| 大多為報紙(mineshpatel1)照片數: 80 | 6581.3% | 6885.0% | 6986.3% |
| 印刷紙本(布加勒斯特大學課程)照片數: 20 | 20100.0% | 20100.0% | 20100.0% |
| 全部200張照片數: 200 | 16482.0% | 16482.0% | 16783.5% |
在辨識器從未見過的印刷謎題上,兩輪的所有努力帶來的改變不大。第一版完全正確辨識了其中82.0%,目前版本為83.5%(77.7%到88.0%):新增14道正確,同時失去11道。真正進步的是方格:正確辨識的方格從94.2%提升到98.9%,網格也在每一張照片中都被找到,而不是200張中只有195張。辨識錯誤卻只有一個解的謎題:當時5道,現在6道。
這些損失有明確的原因。為了辨識鉛筆標記和深色主題,現在每一格都完整切出,淡淡的墨跡也會被計入。在較薄的報紙上,背面的內容會透過來,顯得淡且呈鏡像,新的辨識器會把這些影子讀成數字;第一版只看每一格中最大的墨跡形狀,所以從來不會看到它們。在捲曲的書頁上,盤面的外框線或宮線可能落入某一格內,而被辨識成1。
其中兩道失誤其實是標註錯誤:一張照片中是3和9的地方,標註寫成9和8;另一張照片中是4的地方,標註寫成2。按正確答案計算,目前的辨識器達到84.5%。
仍會出錯的地方
在200張新照片中,有33張未能完全正確辨識。其中22張是那本公開謎題書的書頁:靠近書脊處,書頁的捲曲超出辨識器能追蹤的程度,因此有線條落入方格內而被辨識成1,或是角落方格的切割範圍橫跨了一條線。7張是背面內容透過來的報紙。其餘是一張帶有摩爾紋的螢幕翻拍照片、一處被辨識成1的盤面邊緣,以及那兩個標註錯誤。
在200張 Lexski 圖片中,有21張未能完全正確辨識:鉛筆標記被辨識成數字,包括擦掉後仍留下淡淡數字痕跡的鉛筆字(7張);多出一個數字,大多是單獨的鉛筆標記被當成填入的數字(5張);網格位置錯誤或找不到網格,發生在方格之間沒有線條的 App 主題或手繪網格上(5張);以及不尋常的方塊樣式與顏色(4張)。
為什麼沒達到97%,以及接下來的計畫
一切都在你的瀏覽器中執行:一個224 KB的模型和約850行 JavaScript,在筆記型電腦上每張照片的處理時間中位數約為300毫秒,若把處理器放慢四倍(就像在較慢的手機上),則約為1.2秒。在這樣的預算內,更大的神經網路並沒有幫助。剩下的是長尾問題:捲曲的書頁、背面透印、鉛筆標記,以及不尋常的 App 樣式。我們找到的每一個公開標註資料集現在都已用過或看過,因此下一輪需要我們自己拍攝並標註的照片,並在這些照片上修正和測量淡墨跡與書頁捲曲的問題。
想要掃描得最好
- 把手機拿在謎題正上方,讓整個網格都在畫面中。
- 把書或報紙壓平:在印刷謎題上,大多數辨識失誤都來自捲曲的紙頁。
- 如果報紙很薄,在那一頁後面墊一張空白紙,避免背面內容透過來。
- 在謎題上寫鉛筆標記之前先掃描。
- 開始解題前,把解題器標示出的方格和你的謎題對照一下。
資料與來源
- Lexski, Sudoku Image Recognition (Hugging Face), CC0 1.0
- Wicht, B. and Hennebert, J., Sudoku dataset (GitHub), CC BY 4.0; "Camera-based Sudoku recognition with deep belief network", SoCPaR 2014
- NatalijaPetric, SudokuDataset (GitHub), 未標明授權,僅用於量測
- mineshpatel1, sudoku-solver (GitHub), 未標明授權,僅用於量測
- danielsociu, SudokuRecognition (GitHub), University of Bucharest course project, 未標明授權,僅用於量測
- 解題工具如何逐步讀取照片 (English)