雰囲気は完璧なのに、文字だけ読めない
画像生成AIに「夏のセール、青い海、さわやかなポスター」と頼んだら、色も構図も写真の雰囲気もかなりいい。なのに、肝心の「SUMMER SALE」が「SUMMFR SAIE」みたいな、読めそうで読めない文字になることないですか? 日本語でも同じで、漢字が微妙に崩れて、見たことのない漢字になっていることもありますよね。
最近のモデルはかなり文字に強くなりました。それでも、長い文や小さな文字、珍しい固有名詞になると、一画だけ足りない、似た字に入れ替わる、途中で文字列が溶ける、という崩れが残ります。絵の難しいところは描けているのに、なぜ文字だけでつまずくんでしょう。
「細部が苦手」だけでは足りない
画像生成は細部を間違えることもある、という話ではあるわけですが、文字の崩れ方には妙な偏りがあります。たとえば「A」の横棒が少し傾いても、画像全体の見た目はほぼ変わりません。でも、その一本が消えて別の記号に見えた瞬間、文字としては完全にアウトです。絵では小さなズレなのに、言葉では大きな間違いになる。ここに、2種類の「近さ」が衝突しています。
なめらかに直す世界と、一字ずつ合せる世界
画像生成が扱うのは、色や形が少しずつ変わる連続的な世界です。赤を少し薄くする、線を少し曲げる、輪郭を数ピクセル動かす。変化量を小さくすれば、画像の違いもだいたい小さくなります。モデルは実装によって異なりますが、拡散モデルなら画像に少しずつ足したノイズを予測して取り除く、という手順で画像へ戻していきます。このとき最小化しているのは「予測したノイズと実際のノイズのズレ(たとえば二乗誤差)」で、なめらかな数値の誤差を減らす学習が中心になります。
一方、文字列は離散的です。「SALE」の3文字目はLであって、少しだけLに近い別の字、という正解はありません。線の形そのものは連続的に変わっても、そこから読み取られるラベル(この線はLか、Iか)は、ある境界を越えたところで一段、パチンと切り替わります。画像としてはほとんど同じ線でも、読み取り結果がLからIに変われば、文字列の誤りは一気に1文字分増えます。
この現象を、「連続量の距離」と「離散記号の距離」のずれとして解釈できるか、やってみましょう。画像側のものさしでは十分に近いのに、文字側のものさしでは境界をまたいで遠くなる。モデルがポスター全体をかなり良くしたまま、文字だけを読めない形で残す余地は、ここから生まれます。
同じズレが、採点方法で別物になる
似た衝突は音声にもあります。音の波形が少し違っても同じ言葉に聞こえることがある一方、「橋」と「箸」のように、ごく小さな違いが意味を変えることもある。QRコードも、全体では数マスの違いしかなくても、誤り訂正の限界や重要な領域を越えれば読めなくなります。画像、音、記号は同じ「少し違う」でも、正解を決める単位が違います。
そして、複数の条件を同時に満たすほど、どこかが薄まるという別の問題も重なります。構図、配色、人物、質感、文字列を一度に要求すれば、それぞれを良くする方向が完全には一致しないことがあります。
この条件同士のせめぎ合いは、こちらの記事で別の画像生成あるあるから扱っています。

数式で2つの距離を比べる
まず、生成画像を $I$、理想の画像を $I^*$ として、画像側の違いを単純化して書くと、
$$L_{\mathrm{image}} = \|\phi(I)-\phi(I^*)\|_2^2$$
と表せます。$\phi(I)$ は画像を色・輪郭・配置などの特徴の並びに変えたもの、$\|\cdot\|_2^2$ はその特徴同士のズレを二乗して足した値です。これは実際のモデルの損失関数をそのまま表す式ではありません。あくまで「見た目の差を連続量で測るとどうなるか」を眺めるためのイメージ的な模型だと思ってください。線をほんの少し動かせば、この値もほんの少し動きます。
文字側は、理想の文字列を $s^*$、画像から読める文字列を $s$ として、編集距離
$$L_{\mathrm{text}} = d_{\mathrm{edit}}(s,s^*)$$
で見てみます。$d_{\mathrm{edit}}$ は、一方の文字列をもう一方に直すのに必要な「挿入・削除・置換」の最小回数です。「SALE」が「SAIE」なら、LをIへ置換する1回なので距離は1。Lの縦線がほんの少し変わっただけでも、読み取りがIへ切り替わった瞬間に0から1へ跳びます。なお編集距離は、できあがった文字列を後から採点するための「評価の指標」です。学習そのものを回すときの損失(たとえば交差エントロピーやCTC損失)とは別物で、ここでは「文字の正解・不正解を測るものさし」の代表として使っています。
つまり、ある変形 $\varepsilon$ に対し、画像の損失は $\varepsilon$ とともになめらかに増えても、文字の損失は認識境界を越えたところで段差のように跳ねることがある。画像側で「あと少し」の改善が、文字側では「まだ不正解」のまま残るんです。

もちろん、現代の画像生成モデルには文字を明示的に扱う仕組み(たとえば文字列を専用のトークン埋め込みとして別ルートで渡す設計)や、言語理解を強めた設計もあり、この弱点は固定ではありません。ただ、最終的に必要なのが一字一句の完全一致なら、画像生成だけに任せず、背景や装飾を生成した後で文字を組版ツールから重ねるのが堅い。これはAIを諦める話ではなく、連続量が得意な工程と離散記号が得意な工程を分ける設計です。
どの誤りをゼロで止めるか
画像として95点でも、商品名を一字間違えればポスターとしては使えない。総合点を上げ続けるより、「文字だけは1文字も違えない」という別のものさしを後段に置くほうが効くことがあります。だとしたら、AIへの指示を工夫するだけでなく、どの誤りを連続的に減らし、どの誤りを最後にゼロへ固定するかを工程ごとに分けると、生成物の完成度を一段上げられるかもしれませんね?
