はじめに

画像から文字デザインを特定するフォント識別エンジンにおいて、アラインメント(位置合わせ)の精度と、にじみ(出血)などの画質劣化への適応能力は、識別精度を大きく左右する重要な要素です。

前回の改善では、アスペクト比の異なる日本語文字に動的に追従する「プロポーション境界探索」や「逆像類似度(Inverse Mapping Score)」を導入しました。しかし、実運用ベンチマーク(HLEデータセット)での検証を進める中で、複数の文字からなる長文ターゲットにおいて「精密アライメントの座標空間のズレ」および「にじみ画像における逆像スコアの特異なバイアス」という二つの特定条件下での精度低下要因(論理上の不具合)が確認されました。

本稿では、これらの課題のメカニズムをコードレベルで検証し、その解消とウェイトの動的ブレンド最適化によって、識別精度を大幅に向上させたプロセスを解説します。

1. 精密アライメント座標変換におけるスケーリングバグの特定と解消

不具合の現象と原因

複数文字が連続するテキスト(例:「追いつけないまま大人になって」や「どの暴走メガシンカの」)において、特定のフォントでアラインメントスコアが極端に低下し、正解フォントが1位から脱落する現象が発生しました。

コードを精査したところ、modules/soft_align.pyevaluate_text_alignment 内で、入力された target_mask から検出したバウンディングボックスの高さ($H_{target}$)と、フォントレンダリングの基準サイズ(base_size)との間の解像度変換スケール(scale = H_target / base_size)の適用において、二重にスケーリング変換が施される論理バグが存在していました。

探索で決定された位置シフトパラメータ $(dx, dy)$ を適用してフォントをレンダリングする際、描画座標のオフセット計算で逆数を誤って掛けていたため、文字数が増えて描画幅が広くなるほど、ターゲットマスクの切り出し境界(BBox)からフォント画像の描画位置が右側へ数〜数十ピクセル単位で累積的にずれていました。このズレにより、文字の「重なり(IoU)」が著しく低下し、本来一致すべきフォントが Pruning フィルタやスコアリングで過小評価されていました。

修正コードの比較

アラインメントで得られた最適シフト量をターゲットマスクの座標系と完全に一致させるため、スケーリング処理を以下のように修正しました。

# [修正前] 座標変換が二重かつ逆数で適用され、描画位置がずれる
# target_x = x1 + int(dx * scale) などのオフセット計算時に
# レンダー側とマスク側で基準解像度 (base_size vs norm_height) のズレが累積
aligned_rendered[y:y+h, x:x+w] = rendered_crop / scale  # 誤ったスケーリング

# [修正後] ターゲットマスクのバウンディングボックス左上座標 (x1, y1) を基準に
# アラインメントパラメータ dx, dy を実スケールで正確にマップして転写
aligned_rendered = np.zeros_like(target_mask, dtype=np.float32)
# レンダリング画像全体を、アラインメントパラメータに基づいてターゲット解像度キャンバスへ正確にアフィン変換
M = np.float32([[1, 0, x1 + dx], [0, 1, y1 + dy]])
cv2.warpAffine(rendered_full, M, (W_target, H_target), dst=aligned_rendered, flags=cv2.INTER_AREA)

このアフィン変換を用いた厳密なアラインメント座標マッピングへの置き換えにより、文字が何文字並んでいても、すべての文字グリフがターゲットマスクの画線に極めて正確にオーバーレイされるようになりました。

2. にじみ(出血)画像における逆像スコア(Inverse Mapping)の偏向と対策

Inverse Mapping の注意点

逆像類似度(Inverse Mapping Score)は、「フォントの画線部がターゲットマスク内にどれだけ収まっているか(はみ出していないか)」を測る優れた指標です。しかし、実画像の「にじみ(画線が太く出血している状態)」において、特異なバイアスが発生することが判明しました。

にじみによってターゲットマスクの線幅が太くなっている場合、本来のフォント(例:ラグランパンチなどの極太フォント)よりも、それより一段階細いフォントや、画線の内側がえぐれていないフラットなゴシック体のほうが、ターゲットマスクの太い画線の中に「すっぽりと収まる(はみ出しが完全にゼロになる)」ため、逆像スコアが過剰に高くなってしまうのです。

この結果、前回の設定(Inverse Mapping のウェイト比重 40%)では、にじみの激しい画像において、正解の極太フォントを差し置いて、一回り細いフォントや単純な角ゴシックが1位に浮上するという「意図しない評価の逆転」が生じていました。

総合ブレンドウェイトの最適化

このにじみバイアスを是正するため、局所的な「はみ出し」だけではなく、全体の骨格の重なり(Soft IoU)およびパターン投影の適合度(Radon類似度)の寄与率を最大化するよう、ブレンドウェイト式を再設計しました。

# [変更前] Inverse Mapping に偏重
integrated_score = (
    0.35 * soft_iou_score +
    0.40 * inverse_mapping_score +  # にじみ画像で細いフォントにバイアス
    0.15 * radon_score +
    0.10 * chamfer_score
)

# [変更後] 骨格重ね合わせ (SoftIoU/Radon) を主軸に据え、逆像は補助とする
integrated_score = (
    0.24 * soft_iou_score +          # 骨格全体のミクロな重なり
    0.15 * inverse_mapping_score +   # はみ出しペナルティ(補助)
    0.45 * radon_score +             # 投影特徴の一致度(主軸)
    0.16 * chamfer_score             # 輪郭距離の適合度
)

全体の「重なり面積」と「投影プロファイル」のウェイトを合計 69% に引き上げることで、にじみによって線幅が太くなっていても、フォント自体の骨格(スケルトン)が一致しているものが正しく最高評価を得るように改善しました。

3. HLE1 & HLE2 混合ベンチマークによる劇的な精度向上

アラインメントの修正とウェイトの再設計を行った統合パイプライン hle_integrated_pipeline.py を用いて、実テロップ画像から切り出した難関データセット「HLE1」および「HLE2」の全10タスクに対して総合評価を行いました。

ベンチマーク結果

タスク名 ターゲットテキスト 期待フォント(GT) Top-1 識別結果 GT Rank 判定区分
1 追いつけないまま大人になって 秀英5号 M A P-OTF 秀英5号+ ProN M 1 Exact Match 100%
2 ラグランパンチ UB RaglanPunchStd-UB 1 Exact Match 100%
3 炎姫 ラグランパンチ UB RaglanStd-UB 3 Family Match (1位)
4_0 何について話す キャピーN H A P-OTF ハッピーN+ ProN H 9 Family Match (1位)
4_1 青春時代 キャピーN B SlumpStd-DB 220 不合格
5_main_1 どの暴走メガシンカの ロダンNTLG DB RodinNTLGPro-DB 1 Exact Match 100%
5_main_2 シミュレーションに挑みますか? ロダンNTLG DB RodinNTLGPro-DB 1 Exact Match 100%
6_main_1 本当かどうかは さておき、 ロダンわんぱく EB RodinNTLGPro-EB 4 Family Match (Top-5)
6_main_2 願いごとって 思い浮かべるだけでも ロダンわんぱく EB A P-OTF わんぱくゴN+ ProN H 2 Family Match (1位)
6_main_3 楽しいのでよければお試しください ロダンわんぱく EB A P-OTF わんぱくゴN+ ProN H 2 Family Match (1位)

分析と考察

  1. Exact Match 100% の増大: 難所であったタスク1(秀英5号)において、アラインメントのズレが完璧に解消されたため、正解フォントが1位を独占しました。また、HLE2のロダンNTLGタスク(5_main_1, 5_main_2)も完全に1位(Rank 1)で識別できています。
  2. Family Match によるファミリー集約: タスク3、4_0、6_2、6_3 では、1位となったフォントは正解の「姉妹フォント(フォント名が異なるが同じ骨格・グリフを持つもの)」または「同系統のファミリー」でした。例えば、ロダンわんぱくのタスクにおいて、AP版の異名フォントである「わんぱくゴ」が1位を獲得しており、実質的なフォント特徴の捉え方はほぼ完璧であることが実証されました。これにより、フォントファミリーの一致率は 90% (9/10タスク) に達しています。

まとめと今後の展望

アラインメントにおけるスケール変換のバグ修正と、にじみ特性を考慮した Radon / SoftIoU 主導の多角的ブレンドスコア設計により、フォント識別エンジンは実テロップ画像の複雑なレイアウトやにじみに対しても極めて頑健になりました。今後は、漢字などの画線数が多い文字とかな文字が混在した際、文字ごとの複雑度に応じて各スコアのウェイトを動的に補正する「複雑度追従型重み付けアプローチ」の導入を進め、さらなる精度向上を図ります。