企業の健康管理の現場では、いまも紙やPDFの健診結果がたくさん届きます。健診機関ごとに様式が違い、それを人の手でシステムに打ち込む作業は、産業医や保健スタッフにとって大きな負担です。
WithDrAIでは、健診結果の取り込みから判定支援までを行う仕組みを開発しています。その中で、画像を読めるAIモデルに健診票を読ませる検証をしたところ、AIがエラーを一切出さずに、表を読み落とし、行をずらしていたことが分かりました。今回はその話です。
失敗1:ページ全体を渡すと、最初の表しか読まない
健診票の1ページには、身体計測・血液検査・尿検査など、いくつもの表が並んでいます。ページの画像をそのままAIに渡して「すべての項目を読み取って」と頼むと、最初の表だけを読んで終わってしまうことがありました。5つの表に28行あるページで、返ってきたのは7行だけ、という具合です。
厄介なのは、AIが「残りは読めませんでした」とは言わないことです。しかも、読まなかった行は採点の分母にも入らないので、読めた行だけで計算した一致率はむしろ高く見える。数字だけを見ていると、うまくいっているように錯覚します。
失敗2:空欄が続くと、下の値を繰り上げる
健診票には、受けていない検査の欄が空いていることがよくあります。空欄の行が続くと、AIはその行を飛ばし、下の行の値を上に詰めて返すことがありました。
これは「読めなかった」よりも危険です。別の検査の値が、別の項目の結果として記録されるからです。もっともらしい数字が入っているので、人が見ても気づきにくい。医療の情報では、空欄を空欄のまま残せることが何より大切です。
失敗3:見出しの書き方が、応答の中で揺れる
もう一つは地味ですが、システムを丸ごと止めます。AIの応答の中で、同じ列の見出しが、ある箇所では「今回(受診日)」、別の箇所では「今回」と書かれていました。プログラムが見出しを完全一致で探していたため、一つも当たらず、全部の欄が空になっていました。ここでもエラーは出ません。
「版面はコード、文字はAI」に分けた
3つに共通するのは、表の構造を読み解く仕事をAIに任せていたことです。罫線のある表の位置や行の並びは、本来プログラムで機械的に取り出せます。そこで役割をはっきり分けました。
- 傾きを先に直す:スキャンのわずかな傾きでも、表の幅1,000ピクセルで0.5度傾くと、端では縦に約9ピクセルずれます。行の境目が崩れるので、最初に補正します。
- 表を1つずつ切り出す:罫線から表の外枠を見つけ、表ごとに拡大してAIに渡します。ページ全体は渡しません。
- 行の見出しを先に伝える:様式が分かっている場合は、印字されている行の見出しを順番つきで渡し、「この順で、過不足なく、空欄も飛ばさずに」と指示します。
- 空の表は送らない:何も書かれていない表をAIに見せると、裏写りや印字のかすれを値として拾うことがあるためです。
行を指定すると、今度は空欄に何かを書き込む方向に倒れることもあります。そこは決まった規則で落とし、判断がつかないものは人の確認に回します。
採点の仕方も変えた
精度の測り方も見直しました。空欄も分母に入れることにし、結果を「正しく読めた」「誤って読んだ」「読み落とした」「空欄なのに値を作った」の4つに分けて数えています。最後の「空欄なのに値を作った」は、1件でもあれば不合格としました。
この手当てだけで、AIモデルは同じまま、読み取りの正解率は57.7%から91.0%に上がりました(社内の検証環境で、実際の様式の健診票13ページ分を使って測定。空欄の欄も含めたすべての欄を分母にした値です)。小規模な検証ではありますが、モデルを大きくするより先に、AIに何を任せるかを決め直す方が効いた、ということです。
医療でAIを使うときの教訓
AIは便利ですが、できなかったことを黙って済ませることがあります。医療の現場で使う仕組みでは、
- AIに任せる範囲を狭く、はっきりさせる
- できなかったことを、数字の上でも見えるようにする
- 最後の確認は人が行う
この3つが欠かせません。WithDrAIの健診データの仕組みも、読み取りや判定の結果はあくまで「案」として提示し、最終的な判断は医師が行う前提で設計しています。
紙の健診結果の扱いにお困りでしたら、お気軽にご相談ください。
この記事は note でも発信しています。