Category tech.

PNG にはメタデータを保存するチャンクがある。Python からも簡単に読み書き可能なので、ここに prompt を保存しておくと、あとから参照したいときに便利になる

img が PIL の Image だとして、save を呼びだしているとこに pnginfo というのを足してあげる。

from PIL.PngImagePlugin import PngInfo

# ...

metadata = PngInfo()
metadata.add_text("prompt", "foo bar baz")
img.save("./outputs/0.png", pnginfo=metadata)

読み出し

#!/usr/bin/env python
import sys
from PIL import Image
from PIL.PngImagePlugin import PngInfo

img = Image.open(sys.argv[1])
print(img.text['prompt'])
  1. トップ
  2. stablediffusion
  3. Stable Diffusion で prompt 情報を画像に保存しておく
  1. トップ
  2. tech
  3. Stable Diffusion で prompt 情報を画像に保存しておく

AI画家はもちろん顔を描くことはできるのだが、大きなシーンに含まれる顔を描くのは手を抜いた感じになってしまう。これは顔のピクセル数が少なすぎ、情報量が不足していることに起因していると思われる。人間が絵を見るときは特定領域に注視するが、AIは全体を構成する。

顔がそれっぽくなるまで生成しまくるという手や、そもそも後ろ姿にするという手もあるが、どうしても「この構図がいい」という場合に顔だけ修正することを試してみた。

やってることは

  1. 元画像をアップスケールする
  2. 顔の部分を周辺を多少含めて切り抜く
  3. 切り抜きを元に img2img で顔ガチャする
  4. 当たりが出たら Photoshop で合成する

いわゆる inpainting を手動でやるという方法になっている。inpainting がうまくできるものがあれば良さそうだけど、とりあえず見つけられなかった。(basujindal/stable-diffusionにinpainting機能が含まれているがあまり良い成果がでなかった)

元画像

こういう感じで顔がほぼ描画されいない。この画像では試していないが、こうなると steps 数を増やしても時間がかかるだけであまり改善しないことが多い。

アップスケール

約8倍にアップスケールし (NightmareAI/Real-ESRGANをつかっている)、顔部分を周囲を含めて切りにく。

img2img

切りぬいた画像を元に、prompt はあまり変えずに顔を描いてもらう。face close-up とかつけたほうがいいと思うけど、顔ならプロンプトそのままでも割と良さそう。

strength (元画像をどのぐらい残すか) は 0.75 でやった。

合成

アップスケールした画像に顔を乗せる。

Photoshop もこういった合成が進化しており手動でやっても早い。合成写真をすばやく自然に仕上げる方法 というチュートリアルもある。

うまく img2img ができていれば頑張って馴染ませなくても若干ぼかすだけでなじむ。

感想

  • 作風によっては難しいかもしれない
  • 顔だけ大量生成するので効率が良い
  • 顔だから上手くいくが、指の本数が多いとか足が多いとかは無理な気がする
  1. トップ
  2. photoshopped
  3. Stable Diffusion (AI画家) に描いてもらった絵の顔を修正する (半手動)
  1. トップ
  2. stablediffusion
  3. Stable Diffusion (AI画家) に描いてもらった絵の顔を修正する (半手動)
  1. トップ
  2. photo
  3. Stable Diffusion (AI画家) に描いてもらった絵の顔を修正する (半手動)
  1. トップ
  2. tech
  3. Stable Diffusion (AI画家) に描いてもらった絵の顔を修正する (半手動)

うちのミシンは2015年に買った トーヨー JY-1Rという家庭用の安いやつ。(ところでトーヨーはミシン事業を手放したようで、このミシンのサイトは消滅してしまった)

当然(?)、職業用ミシンや工業用ミシンにあるアタッチメント取り付けのねじ穴があいていない。なんとなくアタッチメントで遊んでみたいのでなんとかすることにした。(特に三つ巻きが大量に必要なことがあるわけではない)

針板にねじ穴をつける

養生テープとかで止めるのもよいみたいだけど、つけかえるのが面倒なので、適当にねじ穴をあけることにする。

本来のねじ穴は、針位置から、下に13mm、右に42mm, 56mm ぐらい。ねじは SM 9/64 (T40) だと思う。ねじ外形3.5mmぐらい。持ってないのでちゃんと調べたわけではない。図面も結構検索したが見つからなかったので、適当な写真から距離を測定した。

うちのミシンで該当箇所に穴をあけるのは難しそうだったので、少しずらしてあけることにした。簡単にはずせる針板に、下に13mm、右に35mmのところにφ2.5mmの穴をあけ、M3のタップでねじを切った。M4 だとアタッチメント側の穴がギリギリすぎるので、ミリねじならM3で空けるしかないと思う。

(SMねじというのはミシンねじとかいうインチ系だがUNFでもUNCでもないミシン専用ねじの規格。関わらないことに越したことはない)

取り付けねじ

ノブ付きのM3ねじならなんでもいい。ただ、いまいちいいのが売ってなかったので、オスメスの5mmスペーサーに3Dプリントしたノブをつけてつかっている。

試してみた

Lucky Link8 ミシン 三つ巻き ラッパ 押さえ A11 仕上がり幅 5サイズ セット 工業用 職業用 3mm 6mm 9.5mm 12.5mm 16mm - LuckyLink8

LuckyLink8

4.0 / 5.0

買ったのは2300円ぐらいで 3mm 6mm 9.5mm 12.5mm 16mm の5種類が入っている三つ巻きラッパ。商品ページではミリ表記だが商品本体はインチ表記だった。

3mm にはエッジガイド(?)がない、6mm以上にはある。これがクセモノで、標準の押えだと、3mm はそもそも干渉する部分がなく、9.5mm 以上はエッジガイドが干渉しないぐらい遠くなり、6mm だけどうしても干渉する。

ファスナー押さえなら干渉しないので、最初はこれで試していたが、ラッパ出口から押えまで遠く、全面を押えられないので、ぎりぎりを縫おうとすると、うまく押えられなかった。

結局 2mm 押えだと割と調子が良かった。標準押えが干渉しない他の幅でも、2mm を使ったほうがラッパの出口から押えまでの距離が短いので安定した。

本来は専用の押さえを使うんだと思う。家庭用にはないと思うので、なんらかの妥協がいる。

 -

5.0 / 5.0

コツ?

まだ使いこなしているとは言い難いけど、YouTube とかで軽く使いかたを見てもわからなかった点について書いおく

ラッパの入れかた

YouTube で動画検索して見るのが早い。最初は手で巻き、ラッパを外した状態で少し縫う。押さえを下げたまま、そこからラッパを回転させて入れると特に苦労せず勝手に入る。

ラッパの位置調整

これがわからなかったが、ラッパのエッジガイドを布の端にあわせるのが基準だと思う。つまり最初の最初は、針を落としたあと、ラッパを回転させてエッジガイドと布の端をあわせるように左右位置を調整して固定し、それから布を入れる。それから左右に微調整していく

つまり針を落とす位置は任意でいい。ぎりぎりを縫ってもいいし、少し内側を縫ってもいい。少し内側のほうが安定はする。

送りかた

右手でラッパに十分に布の端が供給されるように多少まるめた状態で一定の幅が入るようにする。案外難しい。

左手で送るときあまり左にひっぱるような形になるとラッパから抜けてしまうので、そうならないようにする。

ラッパから押さえまでが遠いほど、右手はしっかりひっぱって布を張っていないと押さえまでに巻きが解けてしまう。

結構練習してみたけどまっすぐにかつ綺麗に巻くのは難しい。

  1. トップ
  2. tech
  3. 家庭用ミシンにラッパ(三つ巻き)をつける