
漢字LoRAへ挑戦したけれど
タイトルの通り挑戦しました。挑戦したのは事実ですが、成功したとは書いていないのですw
ただ、一応作りはしたので今回記事に書いてみます。
何をやろうとしたのか?
タイトル通り漢字のLoRAを作ろうとしました!今回対象としたのはPonyです。
現在Flux, SD3 & 3.5, Imagen3はかなりの精度で英文を出せます。
実際私は動画コンテストに出した作品のタイトルロゴをFluxで作っています。

Imagenだとロゴのフォントを指定した上で、絵の雰囲気に合わせたかっこいいロゴまで作れたり!懐かしのナムコゲーム「ドラゴンバスター」のポスターの再現を試みてみたのですが、どれもかっこいいんですよ。特に左上のはDのところにドラゴンの頭がある!

また、一応SDXLでも文字はここまでのレベルではないけど出せて、次の画像は「DEATH」と書いたTシャツを着た女の子です。Illustrious系のモデルで作っています。Eがちょっと多めですが。

ただ、Flux, SD3 & 3.5, Imagen3そしてSDXLのどれもが日本語で画像内に文字を出せるかというと全然できません。これはFluxで「今」という漢字をTシャツに出そうとしたもの。

そんなわけで、精度は高くないとはいえ一応は文字が出せて、なおかつLoRAが作りやすいSDXL系モデルで漢字が出せるLoRAに挑戦してみようかと。
作成方針
単に画像の中に漢字があるだけじゃうれしくないんですよね。角度に応じて傾いたりパースがついたりしてほしい。そこで、今回は服の上に文字を出すことにしました。特に胸で漢字がゆがむのができないかとw
また、英文が出せているモデルでのプロンプトは「says "英語フレーズ"」の形になっているので、タグ付けもその形式て行っています。このダブルクオーテーションの中に自由に漢字が書けると良いなぁ。
まずは一文字を再現するところから始めます。漢字は「命」で。
まずは漢字一文字から
Googleスライドのワードアートでデカい文字(1024x1024)を作ります。フォントは毛筆っぽいYuji Maiで。ところで、私はAI画像作成時にGoogleスライドを使いまくりなんですが、あまり他でそういう人を聴きません。なぜだろう?

画像も入れた素材がこちら。イラストはPony系のanitoonXLで作成し、Googleスライドで上記のワードアートを重ねました。それだけですが、それっぽいですよね。胸が平らな方が違和感なく重ねられるので男性と子供中心です。文字色は黒のみにしました。

プロンプトは全部載せるときりがないので上の01.pngと02.pngのみ載せるとこんな感じです。
01.pngは"命"のみ。ちょっと傾けた01t.pngはこれに「tilt」を付けています。
"命"
ちょっと傾けたものを入れいている理由はこちら。
02.pngはこんな感じです。ポーズや写っている範囲、髪の色等も入れています。
white t-shirt says "命", boy, waist shot , arms at sides, brunette, brown eyes
ベースモデルはPony系のanitoonXLです。
で、私は普段SDXL系のLoRAを作る際はfp8チェックを入れてLearning Rateを0.00001にしています。ところが、漢字のように細かいところでも変わるとおかしくなっちゃうものだと、再現がいまいちなんですよね。
上記の素材でLearning Rateを0.00001でLoRAを作るとこんな感じ。文字が再現されているといえるものがありません。

そこでLearning Rateを0.0001と10倍にしてみました。おお、これは良くなりました!

胸があるお姉さんの時もちゃんと命が出ているし、右下の横向き画像ではいい感じに命の字も角度がついています!
ただ、黒文字しか学習させていないのに、ときどき文字が白くなっているのが気になりますね。そこで、素材画像には白い命の字も加えることにしました。また、出来の良かった右下の横向きも入れます。また、服の外に字が書かれてしまう現象も出たので、壁に命の字が書かれた画像は削除しました。
こんな感じの素材にしています。

おお、これはかなり良い感じじゃないでしょうか?

正面の画像はほぼ完ぺき。横を向いた画像は左下の女の子はちょっと化けていますが良い感じで出ています。特に注目は右下の乳袋になっている胸の谷間が服の上に出ている画像!谷間で字が途切れるという解釈で出てきてくれています。命が巨乳で分断されるというのはまなびがありますね!
白い字も足しておく方が再現が良いんですねぇ。
漢字二文字の場合
今度は漢字二文字の「生命」でLoRAを作ってみます。字をすべて「生命」に置き換えています。また、「命」の素材はここには入れていません。

キャプションでは「says "生命"」にしています。
white t-shirt says "生命", boy, waist shot , arms at sides, brunette, brown eyes
LoRAを試してみると……。

きれいに出ているものもありますが、命の一文字だった時よりは明らかに再現度合いが落ちています。特に横向きは壊滅。命の時はたまたま横から見てきれいに出ていたものを素材に入れることができたのも大きいですが。
これは命だけの素材、生だけの素材も合わせればもっときれいに出るんじゃないか?そう思っていた時期が私にもありました。
とりあえず、「命」と「生」の素材を足してLoRAを作成します。タグ付けはそれぞれ「says "命"」「says "生"」「says "生命"」になるように。

あれ?なんだかさっきより悪くなったぞ!

というわけで、「says "〇〇"」で漢字を覚えさせていって、漢字で文を作れるところまで行くのは難しそうです。一文字から二文字の固定された文字でLoRAを作るという形になるかなぁと。
ところで、最近話題のillustrious系の方が良いのではないかという意見もありそうなので、「生命」の二文字素材で「命」と「生」の素材を含まないものでillustriousをベースにLoRAを作ったもので検証してみます。タグ付けは一緒です。

きれいに出ているものも混ざっているんですが、全体的にanitoonXLがベースのものより再現が悪いです。
なぜillustriousで漢字LoRAを作ると再現が悪くなるかですが、そのカギは一番最後の画像にあると思っています。実はillustriousは結構きれいに「謹賀新年」と出せるんですよ。最後の画像はもろに「謹賀新年」ぽさが出ています!「謹賀新年」に関係するキーワードなんて何も入れてないのに!
ほかの画像でも年が出ていたり、人や牛が出ていたりするので、illustriousにすでに学習されている漢字が邪魔になっているのかもしれません。
まとめ
SDXLで漢字LoRAに挑戦したまとめです。
英文表示と同じように「says "〇〇"」の形では文字列が固定出ない限りはSDXL用漢字LoRAを作るのは難しい
Learning Rateは高め(0.0001)にする
文字をLoRAに学習させる際は、白い文字でも学習させておく方が良い
漢字LoRAと言えるほどのものにはなってないけど、漢字が胸で歪むところまでは行けたので私としてはよかったですw
FluxやSD3.5で学習させる場合はまた別と思います。とりあえず、漢字LoRAが出るのを楽しみにしています!