CenterNetを用いた、画像から文字を抽出するモデルは、これまでのテストを踏まえ、 次のようになりました。
コードは、 https://github.com/lithium0003/findtextCenterNet にあります。
入力画像は、512x512x3のカラー画像とします。これより大きい場合は、分割して入力するか、縮小します。
入力画像を、バックボーンネットワークであるEfficientNetV2XLに入れます。その出力(入力の1/32サイズ)と、 途中のブロックで1/4,1/8,1/16サイズとなる出力を引き出します。
バックボーンネットワークからの4つの出力を、それぞれConv2D(kernel5)でチャンネル数を減らし、 UpSampling2Dでそれぞれ256x256のサイズになる様に拡大して、Concatにより結合します。 Conv2D(kernel3)をかけて、特徴量は256x256x64、それ以外の要素はそれぞれの難易度に合わせてチャネル数を設定し、 textlineでは256x256x8とします。 ブロックの出力チャネル数に合わせるためにConv2D(kernel3)をかけて出力とします。
EfficientNetV2XLの出力は、中心位置のヒートマップ、BOX縦横サイズ、中心位置の詳細なオフセットXY、 テキストの連続を示すライン、テキストの分離を示すライン、文字の属性(ふりがな、ふりがなの親文字、圏点、空白の次の文字)、 文字の特徴量をそれぞれ出力するLeafMapネットワークに入力します。
LeafMapは、64次元の文字特徴量ベクトルを求めるものはConcatの後の中間のConvの次元数が64で、 その他は難易度が低そうなものは8次元や16次元としています。
最終的には、64次元の文字特徴量をTransformerに入力して符号化しますが、モデルの学習のために1文字ずつ符号化することを先に学習させます。
64次元の文字特徴量が、Unicodeに変換できるような識別機を後段に付けて、異なる文字同士の文字特徴量が離れ、 同じ文字同士の文字特徴量が近くなるように学習が進むようにします。
文字は、UTF32で1つのコードポイントとして表されるとして、1091,1093,1097での剰余を学習させて、 Chinese remainder theorem により文字コードを表せるようにします。
Unicodeのコードポイントは0x10FFFFまでなので、1114111以下の整数となります。1091,1093,1097の積は、1308131911となり、 1308131911/1114111=1174.15 なので、間違えた符号ポイントに当たる確率は1/1000以下となります。
64次元の文字特徴量を入力とし、Unicodeのコードポイントを出力とするTransformerとします。
EncoderのInputは64次元の文字特徴量とし、DecoderのInputはUnicodeのコードポイントです。
モデルの構成は、次の論文で導入されたB2T Connectionを入れています。 B2T Connection: Serving Stability and Performance in Deep Transformers https://arxiv.org/abs/2206.00330
もくじへ戻る