レシート読み取りの精度は何で決まるか
文字認識と意味の解釈という2つの工程
家計簿アプリのレシート読み取りは、「文字を読む」工程と「読んだ文字の意味を判断する」工程に分かれています。金額が10,000円になっていた——という誤りは前者ではなく後者で起きています。精度を左右する要因を、工程ごとに整理します。
読み取りは2つの工程に分かれている
レシートを撮影してから家計簿に記録されるまで、内部では性質の違う2つの処理が動いています。「読み取り精度が低い」と感じるとき、どちらでつまずいたかで原因も対処も変わります。
| 工程 | やっていること | 失敗の例 |
|---|---|---|
| ① 文字認識 | 画像の中の文字を文字列に変換する | 「1,280」が「1.280」になる |
| ② 意味の解釈 | どの文字列が何なのかを判断する | 合計ではなく小計を拾う |
①はよく知られている工程で、OCR(光学文字認識)と呼ばれます。見落とされやすいのは②です。文字は正しく読めているのに、家計簿に入る金額が違う——という現象はここで起きています。
工程①:文字認識の精度を決めるもの
こちらは画像の状態でほぼ決まります。
1文字あたりの画素数
最も影響が大きい要因です。多くのアプリは通信量を抑えるため送信前に画像を縮小するので、レシートが長いほど1文字が小さくなり、下の方から読めなくなります。詳しくは長いレシートが途中で切れる理由で説明しています。
感熱紙の状態
スーパーのレシートはほぼ感熱紙です。熱・光・摩擦で印字が薄くなる性質があり、財布に入れたまま数週間置いたレシートは、撮影時点で文字と背景のコントラストが下がっています。人の目には読めても、機械には境界が判別しにくくなります。
傾きと歪み
斜めから撮ると文字が台形に歪みます。丸まったレシートはカーブ部分で文字が縦につぶれます。どちらも「文字らしい形」から離れるため、認識率が落ちます。
影と反射
自分の影が落ちた部分はコントラストが下がります。逆に感熱紙は強い光を正面から当てると白飛びして印字が消えます。どちらか一方を避ければよい、という話ではない点が厄介です。
工程②:意味の解釈の精度を決めるもの
文字が正しく読めた前提で、次はそれが何なのかを判断します。ここが精度の差になりやすい部分です。
合計を見つける
レシートには金額が何十個も並んでいます。この中から「支払った金額」を1つ選ぶ必要がありますが、合計を示す言葉は店によって違います。
- 「合計」「総合計」
- 「お買上」「お買い上げ」
- 「計」だけ
さらに紛らわしいのが、合計に似ているが違う金額です。
- 小計 — 税抜の金額。これを拾うと支払額より安くなる
- お預り・現金 — 出したお金。1万円札で払えば10,000円と記録される
- お釣り — 受け取った金額
- ポイント残高 — 支払いと無関係
「レシートを撮ったら金額が10,000円になっていた」という誤りは、文字認識の失敗ではなくお預り金額を合計と判断した結果です。
品目とそれ以外を区別する
明細部分にも、商品ではない行が混ざります。
- 登録番号・取引番号・伝票番号
- レジ番号・担当者名
- 買上点数・軽減税率対象の注記
- 営業時間・ポイントの案内
これらを商品として拾うと、品目リストに「登録番号」が並びます。除外の判断が甘いほど、品目の精度が落ちます。
カテゴリを推定する
店名から支出のカテゴリを推定する処理もあります。ドラッグストアで食品を買った場合など、店の業態と買ったものが一致しないケースでは推定が外れます。ここは仕組み上どうしても限界があり、確認して直す前提の項目です。
同じアプリでも店によって精度が変わる理由
ここまでを踏まえると、この現象の説明がつきます。レシートの書式が店ごとに違うためです。
合計を示す語も、品目と金額の並べ方も、値引きの表示方法も統一規格がありません。想定されている書式に近い店では精度が高く、外れた店では落ちます。
だから「このアプリは精度が高い/低い」と一概には言えません。よく行く店のレシートで試してみる以外に、確かめる方法がありません。
精度を上げるために利用者ができること
工程①には効きます。効果が大きい順です。
- レシートを画面いっぱいに写す — 1文字あたりの画素数が増える
- 真上から撮る — 歪みを防ぐ
- 買ったその日に撮る — 感熱紙が薄くなる前に済ませる
- 平らに伸ばす — 本などで押さえる
- 影と正面からの強い光を避ける — 窓際の自然光が扱いやすい
工程②は利用者側では変えられません。できるのは、登録前に結果を確認することだけです。確認すべきは合計金額の1点で十分です。ここが合っていれば、月々の集計はずれません。
カケイシピの場合
カケイシピは工程①に複数のAIを使い、1つが失敗したら次に切り替える構成にしています。それも失敗した場合は、通信せずブラウザの中だけで動くOCRに切り替わります。読み取れないより、精度が落ちても結果を返すことを優先した設計です。
工程②は、合計として扱う語の優先順位、小計・お預り・お釣り・ポイントを除外する判定、商品ではない行を落とす判定を持っています。この記事で挙げた誤りは、すべて実際に起きるものとして対処を入れてあります。
それでも推定である以上、確実ではありません。カケイシピは読み取り結果を登録前に画面で確認・編集できるようにしており、金額・店名・品目のいずれもその場で直せます。「OCR+人の確認」を前提にした作りです。
よくある質問
精度が高いアプリを選べば確認は不要になりますか
なりません。工程②は書式の推定であり、想定外の書式では必ず外れます。合計金額だけ見る習慣にしておけば、確認は数秒で済みます。
手書きの領収書も読めますか
印字されたレシートより難しくなります。文字の形が人によって違い、レイアウトも定型でないため、両方の工程で精度が落ちます。手入力のほうが早い場合が多いです。
古いレシートをまとめて撮っても大丈夫ですか
感熱紙は時間とともに印字が薄くなるので、古いものほど不利です。ためてしまった場合は、薄くなっているものから先に撮ることをおすすめします。
まとめ
- 読み取りは「文字認識」と「意味の解釈」の2工程に分かれる
- 金額が10,000円になるような誤りは文字認識ではなく解釈の失敗(お預り金額を拾っている)
- 店によって精度が変わるのはレシートの書式に統一規格が無いため
- 利用者が改善できるのは工程①。画面いっぱいに・真上から・買った日のうちに
- 工程②は変えられないので、登録前に合計金額だけ確認する