月別アーカイブ: 2026年9月

一文字の壁

AI自動採点の開発記録

手書き答案をAIで自動採点する機能を自作のデジタル採点プログラムに搭載した。性能のテストを繰り返す中で思っても見なかった不思議な現象に気がついた。それは「英単語や四字熟語」等はよく推論できるのに「かな1文字・数字や記号1文字」の推論精度が伸びないこと。なんで文字列より単一文字の推論という「より簡単」に思えることが出来ないのか? その原因を追いかけた記録です。

AI自動採点機能を追加

【もくじ】

1.5段構えで読む、という仕組み
2.見えてきた壁:文字列は良いのに、一文字が伸びない
3.はずれた仮説、当たった仮説
4.最大の気づき:賢く読ませるより、選べる範囲を絞る
5.安全側に倒す設計
6.技術スタックとライセンス
7.正解率
8.お願いとお断り

【AI自動採点機能の搭載について】

このプログラムは、紙のテストをスキャンして採点・集計する「デジタル採点プログラム」に、 手書きの解答をAIが自動で読み取って正誤判定する機能を載せたものだ。 クラウドのAPIには、データの判定を一切投げていない。生徒の答案という個人情報を含むデータを 外に出したくなかったので、文字認識のモデルはすべて手元のPCで動かしている。

「AI自動採点」機能を搭載後、実際の手書き答案のデータを用いての動作検証を繰り返し行った。単語や短い文章の解答はかなり実用的な精度で自動採点できており、英単語や難読漢字などの採点では、正直、予想以上の精度で動作することに驚いた。ところが「あ」「イ」「3」「○」のような1文字だけの解答になると、 とたんに雲行きが怪しくなる。採点結果が「要確認(人の目で見る)」に回される量が多く、さらに不正解の解答を誤って正解と推論してしまうこともあった。『なんでより簡単に思えることが出来ないのか?』この記事は、その原因を追いかけて 潰していった記録です。

1.5段構えで読む、という仕組み

手書き文字のAI自動採点では、1文字の解答は、次の5段階を順番に試し、どこかで模範解答と一致した時点で 自動採点が確定する仕組み。5段階すべてが不一致なら、無理に推論せず(○×を付けず)に、人の目視確認へ回す安全策付き。

図1 — 1文字の解答は最大5段の判定を順に試す。どこかで一致すればその時点で自動採点が確定し、 5段すべて不一致なら、無理に推論せず(○×を付けず)に人の確認へ回す。今回の主役は ③の「手書き文字データで学習した専用の小さな分類モデル」で、 汎用OCRが漢字と誤読しやすい孤立した1文字を、ここで正しく拾うのが役目。

2.見えてきた壁:文字列は良いのに、一文字が伸びない

実際の答案で動作検証した結果を集計すると、単語・短文の解答のAI自動採点はヒトの目視による要確認に回される割合が低く、採点の誤りも少なかった。一方で1文字の解答だけを解答欄から取り出すと、専用学習モデルが模範解答を正しく推論できる割合は、当初2割に届かない水準だった。 「賢い漢字OCR」と「専用の手書き分類モデル」という二段構えのはずが、単一文字・記号専用学習モデルのほうが足を引っ張っている——というのが今回のチャレンジの出発点だった。

【文字列の推論】

模範解答を次のように設定して採点。全て正しく推論できた。(法的な問題から画像は掲載しません)

正解データの入力画面(英単語の場合は大文字始まりを指定しての採点も可能)

【文字の推論】

例:カタカナの「ク」など(法的な問題から画像は掲載しません)

AI自動採点による推論が失敗し、ヒトの目視による採点へ回されたデータが多数出現。
加えて、明らかに正解のデータでも推論に失敗し、不正解にされたデータが多数出現。

3.はずれた仮説、当たった仮説

いったい、これはどういうことなのか? 常識的に考えて、より困難に思える “Monday” の推論には完全に成功し、「ク」の推論には「失敗&判定回避」のデータが多数出現するなんて・・・。

最初に疑ったのは「専用学習モデルの答えを採用する基準(確信度のしきい値)が 他の照合段より厳しすぎるのでは」という点だった。実際、他の4段にはすべて 確信度の下限が入っているのに、専用学習モデルの段だけそれが抜けていた欠陥を発見、これを修正した。しかし、実データで測り直すと、ほぼ効果がなかった。いったいこれはどういうことなのか? 非correctになっていた答案を一つずつ確認すると、専用学習モデルは低い確信度で 正解を出していたのではなく、高い確信度で別の字を答えていた。 つまり、問題は「自信のなさ」ではなく「自信満々の誤読」であることが判明した。

そこで、専用学習モデルに渡す直前の画像そのものを見てみることにした。すると、 解答欄の枠線が答案の切り出し範囲に写り込み、肝心の手書き文字が 画像の隅に数ピクセルほどしか残っていないケースが半数近くあることがわかった。

図2 — 破線は「文字として検出した範囲」。左右とも解答欄の紙面(外枠と罫線)と 手書きの線そのものは同じもの。変更前は罫線を文字の一部と誤認し、 枠線ごと広く検出範囲を取っていたため、専用モデルに渡す時点で 手書き文字が縮んで潰れていた。罫線を検出から正しく除外するよう直したのが 変更後で、同じ手書きでも文字だけを大きく捉えられるようになった。さらに文字の下の罫線も除去できるよう、プログラムを修正。

この手書き文字の切り出し処理を直しただけで、専用モデルが模範解答を正しく言い当てる割合は 2倍近くまで伸びた。加えて、解答欄に印刷された小問番号 例:(3) などが 手書き文字と同じマスに同居しているケースでは、その印刷文字ごと1つの塊として 切り出されてしまう不具合もあり、これも小問番号と手書き文字を正しく切り分けて、手書き文字の画像のみ取得できるように修正。

図3 — 実際の試験の答案(1文字解答18問・約800件)を使い、専用モデルが 模範解答を正しく言い当てた件数の割合を段階ごとに測定したもの。 最後の一段が、次の章で説明する「選択肢を絞る」対策実施後の推論結果。

4.最大の気づき:賢く読ませるより、選べる範囲を絞る

手書き文字のみ正しく切り出せるようにプログラムを修正してもなお、正答率が伸び悩む設問がいくつか残ってしまった。いったいナニが原因なのか? 実際、文字「ア」ならほぼ期待通りに採点してくれるようになったのに、これが文字「ク」だと極端に推論に失敗するケースが増えてしまう。

「ク」の手書き文字画像を、じっと見て考えた。そしてあることに気づいた。それは何かというと、正解を伏せた状態、つまり、これは「ク」だと考えずに各文字を眺めてみたところ、「ク」に読めず「ケ」に感じるものや、数字の「7」に見えるものが多数あったのだ。つまり 人間が見ても一意に読めないことにここで初めて気づいた。ある「ク」は、見ようによって 候補のうちの複数の字のどれにでも見える——つまり、その1文字の画像だけでは「決め手になる情報が欠けている」ことが誤判定の根本的な原因であることにようやく気づけたのだ。

ならば、どうしたら、いいのか?

いちばん最初に考えたのは、学習データをさらに増やすことだ。正直、作業量を考えるとウンザリしたが、最も効果的に思えるのは良い学習モデルを作ること。これに勝る対策はないはず。そう考えて信頼する AI に確認すると、なんと回答は不推奨。「ク」のような「ケ」や「7」によく似た文字は、学習データを増やしても良い結果になかなか結びつかないらしい。これは機械学習モデルの限界というより、似た文字を区別するための特徴量が本質的に弱いために起きる、当然と言えば当然の現象。対策として、「局所的な識別領域を強調すると類似文字の認識精度が向上する」という情報があるにはあったが、まさか「ク」だけにそれを実行するわけにもいかない! やるなら、すべての文字についてその類似文字を挙げ、局所的な識別領域を強調して学習モデルを作る処理を実装しなければならない。コトがデカすぎる・・・。ということで、この処理の実装はあきらめることに。

あーでもない。こーでもないと、さんざん考えてようやくたどりついた結論は、発想そのものを逆転させることだった。つまり、学習データを増やしてモデルを賢くする方向ではなく、 その設問に実際に用意されていた選択肢という、人間の採点者なら 当たり前に持っている手がかりを、推論時に学習モデルにも渡してやればいい。すなわち、正解が「ク」なら、推論の対象は「カキクケコ」の中の1文字とすることで、少なくても数字の「7」は除外できる。

そう思って作成した仕組みがコレ。

図4 推論対象の文字種を予め指定できるようにした!

一括して設定できるようにさらに改良。実装としては、模範解答を入力する画面に「この設問の選択肢はこれです」と 教員が明示的に書けるようにし、専用モデルの判定範囲をその文字だけに絞る、 という形にした。効果は大きく、ある設問では自動正解が1桁台から 40件台(43名中)まで伸びた。

考え方として、まとめれば・・・

図5 — 左と右のインクの形はまったく同じもの(とりあえず「イ」に近い文字とする)。左のように候補が 約150文字種のままだと確信を持って選べないが、右のようにその設問の 本当の選択肢(この例では5つ)まで絞ると、同じ画像でもはっきり1つに決まる。 文字の形から読み取れる情報量は変わらない。決め手は「文脈」の側にあった。

実は当初、「模範解答から選択肢を自動で推測できないか」も試してみた。しかし、この方法で実測すると 精度がおよそ半分しか出ず、しかも適切でない設定も「設定済み」に見えてしまうぶん、かえって 入力し忘れに気づきにくくなってしまうことに気づいた。なので、いい加減に推測するくらいなら空欄のままにして、 入力を促す方が安全と判断し、自動推測は採用しなかった。

また、ふと思い立って、正解「ク」に対して、「選択肢:カキクケコ」ではなく、「選択肢:ク」と設定して実行してみたところ、なんと どの答案画像も正解と判定されてしまう 恐るべき抜け穴を発見。原因は単純で、選べる文字が1種類しかないと「候補の中でどれが 一番それらしいか」という確率計算が、常に100%に丸まってしまう仕様上の性質だった。もちろん、あわてて「選択肢が2文字未満なら、この絞り込み自体を 無効化する」という安全策を追加した。

5.安全側に倒す設計

一連の改善で最後まで譲らなかった基準もある。それは「自動採点する件数を 増やす」ことよりも「誤って正解(○)にしてしまう件数を増やさない」ことを優先する という基準だ。判定に迷うくらいなら、敢えて強行推論せず( ○ × を付けず)に人による目視確認へ回す。これは 最初の5段カスケードの設計思想そのものだ。こうすることで、より安全で安心なプログラムとすることができるのではないかと考えた。

プログラムを改良するたびに実データで前後の採点結果を突き合わせ、この数字が動いていないかを 毎回確認することにした。加えて、しきい値や画像処理を変更するたびに手を動かして 再確認するのは限界があるので、実際の答案画像と目視で確定した正解ラベルを 使った小さな回帰テストを用意した。数秒で走り、設定を1つ戻す実験をしたところ 実際に数値の悪化として検知できることも確かめた。

6.技術スタックとライセンス

認識エンジンはすべてローカルで完結する構成にした。汎用の文字認識には ONNX Runtime上で動かす軽量なOCRモデルを、1文字判定には独自に収集した 手書き文字の画像データで学習した小さな分類モデル(隠れ層2層の多層パーセプトロン)を 使っている。どちらもクラウドへは一切接続しない。

今回紹介した「AI自動採点機能」を追加する前のデジタル採点プログラムは MS_Reader V3 という名称で、このブログの過去記事内でMITライセンスで公開しています。

今回紹介した「AI自動採点機能」付きのデジタル採点プログラムは、実際の高校現場の定期考査でさらなる動作検証を重ねて行い、今後、しかるべき時期に、このブログからダウンロード出来るようにする予定です。

「モデルが賢くない」と思っていた不調のかなりの部分が、実はモデルに渡す前の 画像処理と、モデルに与える文脈情報の不足だった——というのが、今回得られた一番の収穫だった。次にまとまった時間が取れたら、採点記号(○△×)や数字の学習データを もう少し厚くする作業に取りかかりたいと思っている。それが出来たら、次は数式の自動採点にチャレンジだ!

7.正解率

(1)記号

誤って×と判定した件数(自動×)は3記号すべてで0件。要確認になった4件はすべて安全側に倒れており、誤った自動採点はなかった。
設問1 No.35:分類器が「△」寄りに読み違え、確信度0.00で要確認へ(真実は、元の画像の状態そのものがよくない)
設問2 No.27:インク量が少なく「空欄」判定
設問2 No.28・32・34:標準モデルが「二」「□」「0」等と誤読した一方、高精度モデル(server_rec)は正しく「△」と読み、両者の結論が割れたため安全側で要確認に回った(合議機能が正しく機能した例)
△(三角形)だけやや正解率が低い(90.0%)点は、○や×に比べて手書きのバリエーション(頂点の丸み・傾き等)が大きく、分類器にとって判別しづらい形状特性である可能性がある。

(2)数字

全体正解率77.3%
要確認63件の内訳を精査:21件は「標準読みと高精度読みの結論が割れて安全側に回された」もの(実は正解と一致していた=安全弁の作動であって誤りではない)、13件は筆跡はあるが判読不能、残り29件が純粋な誤読
空欄23件は無解答、自動×はわずか5件(設問7の「7→n」など)

(3)アルファベット(大文字のみ)

全体正解率 62.7%(自動○251/自動×11/要確認82/空欄56、対象400)。数字・記号より明確に低い結果である。
空欄56件(14%)が突出して多い — 記号(1件)・数字(23件)と比べ異常値。原因は抽出元シートに薄い鉛筆筆跡のサンプルが多かったこと。実際に設問9 No.10で使われた元画像を確認したところ、薄いながらも「I」の筆跡は存在しており、判読以前の空欄判定に誤って回されたケースが含まれている。
設問6「F」(42.5%):標準OCRの大半が「E」に誤読。高精度読みは正しく「F」と一致しているため安全弁で要確認止まりになっている(誤りではなく安全側判定)
設問9「I」(30.0%)・設問10「J」(22.5%):制約なしの再読段が「T」など全く別の英字に固定されがちで、専用分類器自体は高確信度で正しく読めているケースが多いのに反映されていない
数字のケースと違い、今回は選択肢制約(52字→10字)が実際に効いている設問ですが、字形の似た大文字同士(E/F、I/T、B/D)の系統的な混同と、薄い筆跡による誤空欄判定が正解率を押し下げている。

(4)ひらがな・カタカナ(あ~こ・ア~コ)

全体正解率 64.4%(自動○515/自動×6/要確認231/空欄48、対象800)
最高:設問14「エ」(87.5%) 最低:設問12「イ」(17.5%)
要確認231件の大半は「標準OCRの読み取りが数字・漢字・英字などかな以外の記号列になり判読不能」というパターン(例:「あ」を「南」「新」「本」等の漢字に誤読)
専用分類器自身の予測も、特定の字(え・お・キ・エ・コ等)に偏って外れることが多く、模範解答と一致していても確信度不足や標準読みとの不一致で要確認止まりになるケースが目立つ
記号・数字の検証で見られた「選択肢制約が無効化される」「空欄の誤検出が異常に多い」といった手法固有の問題とは異なり、これはひらがな・カタカナ単文字そのものの認識難度の高さを反映した結果で、進行中の単文字採点精度改善ロードマップが対象とする課題と一致する。

【正解率まとめ】

この結果から見る限り、実用レベルになるのは記号( ○・△・× )の自動採点でしょうか?

ただ、単一文字のAI自動採点ではなく、英単語や難読漢字(四字熟語)などの採点はそれなりに推論に成功していますので、こちらは実用レベルで使えそうです。

8.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。記載した内容を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。

答案画像の手書き文字をここに掲載した場合、当該文字画像が意図せず広く出回ることへの配慮等、様々な観点から検討した結果、この記事では、たとえ記事の信頼性を損なう結果となっても 実際の手書き文字の画像そのものは掲載しない 方針としました。本文中の図はすべて、説明のために新たに描き起こした模式的なイラストであり、実在するいかなる人物の筆跡でもありません。