[{"data":1,"prerenderedAt":429},["ShallowReactive",2],{"content-/image-table-ocr-two-model-crosscheck":3,"all-pages-for-dir":407,"related-/image-table-ocr-two-model-crosscheck":408,"og-image-/image-table-ocr-two-model-crosscheck":428},{"id":4,"title":5,"body":6,"category":388,"concepts":389,"description":390,"extension":391,"meta":392,"navigation":393,"ogImage":389,"path":394,"project_name":395,"published":396,"publishedAt":397,"seo":398,"source":399,"stem":400,"tags":401,"todo":389,"unpublished":396,"updatedAt":389,"__hash__":406},"pages/2026-09/2026-09-15/image-table-ocr-two-model-crosscheck.md","表の画像をCSVに起こすOCRを、Claude CodeとGemini 3.1 Pro（agy）で突き合わせた記録",{"type":7,"value":8,"toc":380},"minimark",[9,13,18,21,24,27,31,34,99,102,105,109,112,128,163,166,170,173,228,231,234,237,240,243,246,354,361,364,367,370,373,376],[10,11,12],"p",{},"表の画像が42枚あり、それをOCRしたCSVもリモートにもう上がっていた。\nただ、そのCSVが画像をどこまで正しく写しているのかは、この時点ではわからなかった。",[14,15,17],"h2",{"id":16},"取り込んだ画像とすでにあったcsv","取り込んだ画像と、すでにあったCSV",[10,19,20],{},"リモートにプッシュされた画像とCSVを Claude Code に同期してもらった。\n取り込んだのは1コミットで、ファイルは43件だった。\nローカルには変更がなかったので、追いつかせるだけで済んだ。",[10,22,23],{},"続けて、この画像と似た内容のCSVをもう持っていないかを確かめてもらった。\nあわせて、画像の読み方も説明した。\n表は青い線で区切られていて、途中に入る黄色の線がたぶん区切りになっている。\n一番右の列の数字がどう並ぶか、その数字が番号のどの桁に当たるかも、実例の番号を挙げて伝えた。",[10,25,26],{},"返ってきた答えによると、似た内容のCSVは今回プッシュされたCSVそのものだった。\n42枚をOCRした結果が、4つの列に分けて5,278行入っている。\nリポジトリ内にほかのCSVはなく、PC全体の検索は時間切れで途中までしか見られていない。",[14,28,30],{"id":29},"自分で打った1回目の-agy","自分で打った1回目の agy",[10,32,33],{},"Gemini でのOCRは、Claude Code の安全チェックに止められて、まだ動いていなかった。\nそこで、agy コマンドを自分でセッションに打ち込んだ。\nモデルは gemini-3.1-pro-high を指定し、指示はフォルダ内の ocr-prompt.txt から読ませる形にした。",[35,36,41],"pre",{"className":37,"code":38,"language":39,"meta":40,"style":40},"language-bash shiki shiki-themes vitesse-light vitesse-light","agy -p \"Read ocr-prompt.txt in this folder and follow its instructions exactly. Output only the CSV.\" \\\n  --model gemini-3.1-pro-high --sandbox --dangerously-skip-permissions --print-timeout 9m > out.txt\n","bash","",[42,43,44,71],"code",{"__ignoreMap":40},[45,46,49,53,57,61,65,68],"span",{"class":47,"line":48},"line",1,[45,50,52],{"class":51},"senZ8","agy",[45,54,56],{"class":55},"snbK4"," -p",[45,58,60],{"class":59},"sMJiu"," \"",[45,62,64],{"class":63},"sdGka","Read ocr-prompt.txt in this folder and follow its instructions exactly. Output only the CSV.",[45,66,67],{"class":59},"\"",[45,69,70],{"class":55}," \\\n",[45,72,74,77,80,83,86,89,92,96],{"class":47,"line":73},2,[45,75,76],{"class":55},"  --model",[45,78,79],{"class":63}," gemini-3.1-pro-high",[45,81,82],{"class":55}," --sandbox",[45,84,85],{"class":55}," --dangerously-skip-permissions",[45,87,88],{"class":55}," --print-timeout",[45,90,91],{"class":63}," 9m",[45,93,95],{"class":94},"stQ0i"," >",[45,97,98],{"class":63}," out.txt\n",[10,100,101],{},"コマンドは120秒のタイムアウトまでに終わらず、バックグラウンドに回った。\n画面には、終わったら知らせるという案内と、出力の書き込み先が出た。\n完了の知らせが来る前に、「これって進んでるんすか？」と聞いた。",[10,103,104],{},"進んでいなかった。\nGemini は画像を読まずに迷子になり、途中で固まっていたので、Claude Code の側で止めたという。\n何が起きていたかは、agy のログと会話記録で確かめてあった。",[14,106,108],{"id":107},"コマンドを実行するなと書き足した2回目","「コマンドを実行するな」と書き足した2回目",[10,110,111],{},"原因を直した指示文を用意してもらい、もう一度自分でコマンドを打った。\n1回目との違いは、少なくとも次の3点ある。",[113,114,115,119,122],"ul",{},[116,117,118],"li",{},"指示文のファイルを、フォルダ内の名前ではなくフルパスで指した",[116,120,121],{},"「Do not run any commands.」を足し、コマンドを実行させない形にした",[116,123,124,127],{},[42,125,126],{},"--add-dir"," で作業フォルダを渡した",[35,129,131],{"className":37,"code":130,"language":39,"meta":40,"style":40},"agy -p \"Open \u003C指示文のフルパス> and follow its instructions exactly. Do not run any commands. Output only the CSV.\" \\\n  --add-dir \"\u003C作業フォルダ>\" ...\n",[42,132,133,148],{"__ignoreMap":40},[45,134,135,137,139,141,144,146],{"class":47,"line":48},[45,136,52],{"class":51},[45,138,56],{"class":55},[45,140,60],{"class":59},[45,142,143],{"class":63},"Open \u003C指示文のフルパス> and follow its instructions exactly. Do not run any commands. Output only the CSV.",[45,145,67],{"class":59},[45,147,70],{"class":55},[45,149,150,153,155,158,160],{"class":47,"line":73},[45,151,152],{"class":55},"  --add-dir",[45,154,60],{"class":59},[45,156,157],{"class":63},"\u003C作業フォルダ>",[45,159,67],{"class":59},[45,161,162],{"class":63}," ...\n",[10,164,165],{},"このコマンドも120秒では終わらず、バックグラウンドに回った。\n今度は、1枚目の読み取り結果まで届いた。",[14,167,169],{"id":168},"_1枚目で3つの読み取りを並べる","1枚目で3つの読み取りを並べる",[10,171,172],{},"1枚目の画像について、3つの読み取りを突き合わせてもらった。",[174,175,176,192],"table",{},[177,178,179],"thead",{},[180,181,182,186,189],"tr",{},[183,184,185],"th",{},"読み取り",[183,187,188],{},"件数",[183,190,191],{},"突き合わせの結果",[193,194,195,207,217],"tbody",{},[180,196,197,201,204],{},[198,199,200],"td",{},"Gemini 3.1 Pro（agy）",[198,202,203],{},"136件",[198,205,206],{},"すべて正解。Claude Code の目視と、数字も並び順も136件中136件一致",[180,208,209,212,214],{},[198,210,211],{},"Claude Code（画像を拡大して目で読む）",[198,213,203],{},[198,215,216],{},"Gemini と一致",[180,218,219,222,225],{},[198,220,221],{},"既存のCSV",[198,223,224],{},"131件",[198,226,227],{},"正しいのは128件（94.1%）",[10,229,230],{},"既存のCSVは、136件のうち8件を正しく拾えていなかった計算になる。",[10,232,233],{},"この結果を見て、「あなたが突合した内容と、Geminiが突合した内容が完全に一致してたってことですよね」と確かめた。\nそのうえで、残り41枚も同じ方法で進めると決めた。\nClaude Code の設定で agy の実行は許可してあるはずだ、とも伝えた。\nGemini の出力をどこに置くかは任せたが、履歴として分けたほうがいいのでは、と添えた。",[14,235,236],{"id":236},"残り41枚の読み取りと利用枠",[10,238,239],{},"14時41分に、残り41枚のOCRが回り始めた。\n3枚ずつ並行で回し、1枚あたり2〜3分かかるとして、42枚すべてが終わるのは15時20分前後の見込みだった。\n今回は、agy の実行が止められなかった。",[10,241,242],{},"ほかの画像には、表の作りが1枚目と違うものがあった。\nそれに合わせて指示文を直したので、1枚目も新しい指示文で読み直してもらった。\n結果は136件すべてが目視と一致し、指示文を直しても精度は落ちていなかった。",[10,244,245],{},"回しているあいだ、件数つきの短い報告がほぼ1枚ごとに届いた。",[174,247,248,261],{},[177,249,250],{},[180,251,252,255,258],{},[183,253,254],{},"枚目",[183,256,257],{},"読み取った件数",[183,259,260],{},"報告に書かれていたこと",[193,262,263,273,284,294,304,314,324,333,343],{},[180,264,265,268,270],{},[198,266,267],{},"1",[198,269,203],{},[198,271,272],{},"新しい指示文でも目視と136件一致",[180,274,275,278,281],{},[198,276,277],{},"2",[198,279,280],{},"132件",[198,282,283],{},"1回で読了",[180,285,286,289,292],{},[198,287,288],{},"3",[198,290,291],{},"135件",[198,293,283],{},[180,295,296,299,301],{},[198,297,298],{},"4",[198,300,203],{},[198,302,303],{},"再試行なし",[180,305,306,309,312],{},[198,307,308],{},"5",[198,310,311],{},"133件",[198,313,303],{},[180,315,316,319,322],{},[198,317,318],{},"6",[198,320,321],{},"138件",[198,323,303],{},[180,325,326,329,331],{},[198,327,328],{},"7",[198,330,311],{},[198,332,283],{},[180,334,335,338,340],{},[198,336,337],{},"8",[198,339,203],{},[198,341,342],{},"既存のCSVは113件で、ここでも抜けがありそう",[180,344,345,348,351],{},[198,346,347],{},"9",[198,349,350],{},"137件",[198,352,353],{},"特記なし",[10,355,356,357,360],{},"9枚目を読み終えたところで、agy の利用枠が切れた。\n枠はモデルに関係なくアカウントで共通なので、3.8 Flash に替えた試行でも同じ429エラーが返った。\n15時に確認した時点で、解除は2026-09-19 09:17ごろの見込みだった。\nここまでの読み取り結果と、続きの計画や進捗をまとめた引き継ぎ書は、コミットしてGitHubにプッシュしてもらった（",[42,358,359],{},"a64ce33","）。",[14,362,363],{"id":363},"並べるまで見えなかったこと",[10,365,366],{},"既存のCSVにも、42枚分のOCR結果が5,278行入っていた。\nそれでも1枚目では131件と136件、8枚目では113件と136件の差があった。\n別の読み取りと並べて、はじめてその差が数字になって出てきた。",[10,368,369],{},"バックグラウンドに回ったコマンドは、黙っていても進んでいるとは限らない。\n1回目の Gemini がそうで、画像を読まないまま固まっていた。",[10,371,372],{},"残り41枚に進むと決めたのは、目視と Gemini の136件がそろって一致したのを、自分の言葉で言い直して確かめたあとだった。",[10,374,375],{},"残り33枚は、利用枠が戻る9月19日の朝まで持ち越しになった。\n表の作りが違う画像を、直した指示文がすべて読み切れるかどうかは、まだわからない。",[377,378,379],"style",{},"html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":40,"searchDepth":73,"depth":73,"links":381},[382,383,384,385,386,387],{"id":16,"depth":73,"text":17},{"id":29,"depth":73,"text":30},{"id":107,"depth":73,"text":108},{"id":168,"depth":73,"text":169},{"id":236,"depth":73,"text":236},{"id":363,"depth":73,"text":363},"dev",null,"表の画像42枚をCSVに起こすため、agyコマンドでGemini 3.1 ProにOCRさせた。固まった1回目のあと指示文を直して再実行し、Claude Codeの目視と136件一致したのを確かめて残りに進めたが、9枚目で利用枠が尽きた。","md",{},true,"/image-table-ocr-two-model-crosscheck","komatsu-sos",false,"2026-09-15T00:00:00.000Z",{"title":5,"description":390},"make-diary","2026-09/2026-09-15/image-table-ocr-two-model-crosscheck",[402,403,404,52,405],"Claude Code","Gemini","OCR","CSV","muZxK-sfWDVo6X-SB8XOqL6rKUqFHBYQxJ46UlL2Fd4",[],[409,413,417,420,424],{"title":410,"path":411,"publishedAt":412},"税務アシスタント開発ログ - 新規クライアント対応・レシートOCR100件超・税区分トグル実装","/tax-assistant-tax-category-2026-02-20","2026-02-20T00:00:00.000Z",{"title":414,"path":415,"publishedAt":416},"税務アシスタント: 手書き売上伝票OCR対応の設計と実装","/tax-assistant-sales-slip-ocr","2026-01-14T00:00:00.000Z",{"title":418,"path":419,"publishedAt":397},"2026年9月15日の開発日記 - 「終わっているはず」を確かめて回った日","/2026-09-15-diary",{"title":421,"path":422,"publishedAt":423},"自炊した入門書を節単位に組み直す（234チャンクを109に）","/book-chunking-by-section","2026-09-13T00:00:00.000Z",{"title":425,"path":426,"publishedAt":427},"サブエージェント5体に138節を分担させて、自炊した教材の作業用ドラフトを仕上げた","/textbook-draft-subagent-parallel","2026-09-05T00:00:00.000Z","https://log.eurekapu.com/og/blog/image-table-ocr-two-model-crosscheck.png?v=2026-09-15T00%3A00%3A00.000Z&title=%E8%A1%A8%E3%81%AE%E7%94%BB%E5%83%8F%E3%82%92CSV%E3%81%AB%E8%B5%B7%E3%81%93%E3%81%99OCR%E3%82%92%E3%80%81Claude%20Code%E3%81%A8Gemini%203.1%20Pro%EF%BC%88agy%EF%BC%89%E3%81%A7%E7%AA%81%E3%81%8D%E5%90%88%E3%82%8F%E3%81%9B%E3%81%9F%E8%A8%98%E9%8C%B2&author=Kei%20Komatsu&sig=9d02022662b5c371",1789529466019]