2151 文字
11 分
ComfyUI(Flux)でブログのアバターを作り直した — 最後の仕上げはAIではなく図形だった

このブログのアバターを作り直しました。元はこれです。

作り直す前のアバター。山吹色の背景に、太い黒フチで描いた茶色一色の狼の顔。目は細いつり目

左右対称の狼の顔に、太いフチとつり目。アイコンとしては分かりやすいのですが、茶色一色で平坦なうえに 300px しかなく、サイドバーいっぱいに広がる PC 表示ではボケていました。「もうちょっとかっこよく」したい、というのが出発点です。

作業は AI(Claude) に相談しながら進めました。画像の生成には、手元の Mac(M5 / 32GB)で動かしている ComfyUI と flux1-schnell-fp8 を使っています。

60枚並べても決まらない#

最初は SVG で手描きした4案を比べましたが、決めきれませんでした。そこで方向性そのものを探すために、ComfyUI でまとめて生成しました。

  • 768×768、4 steps、cfg 1.0、euler / simple
  • 1枚あたり約22秒(スタイルが変わって最初の1枚だけ約70秒)

「かっこいい系」は、フラットなエンブレム、ローポリ、eスポーツのマスコット、ネオンなど8スタイル × 3シードで24枚。確かにかっこいいのですが、並べるとスポーツチームのロゴに見えてきます。ブログの顔としては強すぎました。

次に、デフォルメした「かわいい系」を6スタイル × 3シードで18枚。ここで AI 側は「オレンジの毛色のせいで、狐や柴犬に見える」と判断して、毛色を変えた作り直しを提案しました。

狼に見えないという意見ですが、全然狼に見えています。

orangeVaper

見る側がそう見えているなら、それが正解です。この時点で「狼に見えるか」は検討から外れました。

決め手は「キティーの世界観」#

かっこよくしたい、でもかっこよさを追うとスポーツチームになる。その板挟みを抜けたのは、この一言でした。

ハローキティーの世界観の狼にできませんか?

orangeVaper

サンリオのキャラクターは、目が点で、鼻が小さく、口がないことが多い。今のアバターの「左右対称・太いフチ・山吹色×茶色」を残したまま、顔のパーツだけを極端に簡素にする、という方向がここで決まりました。プロンプトに in the style of classic sanrio characters と入れて、目の描き方を変えた6スタイル × 3シードを生成し、その中から選んだのがこれです。

kcool_22。サンリオ風にデフォルメした茶色の狼。目は閉じ気味の切れ長で、まつ毛が描かれている

kcool_22(クール目のシード22)。輪郭も配色もほぼ理想でしたが、目にまつ毛が付いていました。これを取りたい。

目だけ AI で直そうとして失敗した#

目以外は完成しているので、目の部分だけマスクして描き直す(インペイント)のが素直な手です。SetLatentNoiseMask で目の周りだけにノイズを乗せ、denoise 0.9 で生成しました。

結果は2つの問題が出ました。

  • まつ毛が残る。 プロンプトに no eyelashes と書いたのに、しっかりまつ毛が描かれる
  • 目の周りがぼやける。 マスクの範囲が、周りより明るいにじみとして残る

1つ目は、否定の言葉が効かないパターンです。Flux は cfg 1.0 で動かすのでネガティブプロンプトも使えず、eyelashes という単語を書いた時点で、かえってまつ毛を呼び込んでしまいます。

そこで、目を毛の色で塗りつぶしてから denoise 1.0 にし、プロンプトも「黒く塗りつぶした線の目」のように肯定形だけで書き直しました。それでもまつ毛は戻ってきて、にじみも消えませんでした。「サンリオ風のかわいい顔」という指示自体が、まつ毛の方向に引っ張っているようです。

図形で描いたほうが早かった#

ここで方針を変えました。元の絵はフラットな塗りなので、目はただの黒い図形です。AI に描かせるより、図形として描いてしまえばいい。

手順は単純です。

  1. 目の周りを、毛の色で塗りつぶして消す
  2. 4倍の解像度で目のポリゴンを描き、縮小してアンチエイリアスをかける
  3. 片目だけ描いて、左右反転でもう片方を作る(完全に左右対称になる)

Python の Pillow だけで済み、1枚の出力は一瞬です。形・角度・大きさを数値で指定できるので、「もう少し丸く」「1.2倍に」といった注文にそのまま応えられます。AI の生成は毎回別の絵になりますが、図形なら変えたいところだけが変わります。

ここからは1か所ずつ詰めていきました。線の目、アーモンド形、三角形、角を丸めた鋭い目……と試すうちに、最終的に選んだのは元のアバターの目でした。300px の旧アバターから目の形をしきい値で切り出し、16倍に拡大して、新しい顔に移植しています。

目のバリエーションの変遷。左から k22r_big、k22r_round、k22o_round2、k22o_small、k22s_smalllong。後半3つは旧アバターの目を移植して、角の丸みと長さを調整したもの

角を丸めるのは、形をぼかしてからしきい値で2値に戻す方法です。ここで一度、目の両端が垂直にスパッと切れる不具合が出ました。切り出した目の形が画像の端ぎりぎりまであったので、ぼかしたときに画像の外が端の色で埋まり、先端が伸びて切れたのが原因です。周りに余白を足してからぼかすと直りました。

pad = eye.width // 5
padded = Image.new("L", (eye.width + 2 * pad, eye.height + 2 * pad), 0)
padded.paste(eye, (pad, pad))
rounded = padded.filter(ImageFilter.GaussianBlur(r)).point(lambda v: 255 if v > 128 else 0)

眉と耳を足し引きする#

目が決まってから、顔の他の部分も整理しました。

仕上げの流れ。左から、目を決めた k22s_smalllong、白い眉を消した k22n、耳の内側の黒い毛とグレーを消した k22c、眉を戻した k22b

  • 眉を消す:額の白い眉マークを毛の色で塗りつぶした
  • 耳の中を無地にする:耳の内側にあった黒いギザギザの毛とグレーの影を、クリーム色一色にした
  • 眉を戻す:無地の耳のまま、眉だけ戻した

耳の黒い毛は、耳のフチ(同じ黒)と区別する必要があります。ここは「黄色い背景から離れている黒」だけを選びました。フチは必ず背景のすぐ隣にあり、耳の中の毛は背景から遠い、という位置の違いを使っています。

眉は一度消してみて、やっぱり戻しました。消すと顔はすっきりしますが、表情が少し平坦になります。こういう判断は、実際に両方を並べて見るまで分かりません。一覧ページに全部並べて、見比べながら決めました。

最終的に選んだのは k22b_smalllong です。600px のアバター、light / dark の各サイズのファビコン、記事内の吹き出しアイコン(この記事の右側に出ているもの)まで、すべてこの画像から作っています。

教訓#

  • AI は「方向を探す」のに強い。 60枚並べたことで、かっこいい系がスポーツチームになること、デフォルメなら狼らしさが残ることが見えた
  • 細部の修正は、AI に頼むより図形で描くほうが早いことがある。 フラットな絵なら、目は黒い図形にすぎない。数値で直せば、変えたいところだけが変わる
  • 決め手は人の一言だった。 「キティーの世界観の狼」も「狼に見えています」も、生成結果をいくら眺めても出てこない判断だった

あとからなんですけど狼というか狐でしたw

orangeVaper
この記事は AI(Claude) を活用して書いています
アイキャッチ画像は ComfyUI + Flux.1 で生成しています
ComfyUI(Flux)でブログのアバターを作り直した — 最後の仕上げはAIではなく図形だった
https://orangevaper.dev/posts/blog-avatar-comfyui-flux-redesign/
作者
orangeVaper
公開日
2026-09-22
ライセンス
CC BY-NC-SA 4.0