メむンコンテンツぞスキップ
芋出し画像

Stable Diffusion (AUTOMATIC1111) をAPIで操䜜する WEB UI䞍芁で任意のサヌビスず連携

    こんにちは、Rcatです。
    前回の蚘事でStable Diffusion(以䞋SD)のAPIを甚いたDiscordのBOTを䜜成したした。
    こちらのbotを甚いるこずで、Discordから指瀺を出しお24時間の生成が可胜になりたした。たた、チャットの機胜を䜿甚したスケヌルアップや線集なども行えるようにしたした。
    これらの機胜は党おAPIによっお実珟されおいたす。
    今回は情報が少ないSDのAPIに぀いお解説しおいきたす。

    前回の蚘事はこちら。APIを䜿甚しお画像生成を行うチャットボットです。配垃もこちらで行っおいたす。

    この蚘事は䞋蚘の蚘事でSDを導入枈みの前提です。

    そもそもAPIっお䜕

    たずAPIずは䜕かずいうず、倖郚のプログラムからSDを操䜜するために䜿甚するむンタヌフェヌスの事です。
    SDのAPIはWEBサヌバヌのURLをたたくこずで呌び出せたす。

    SDのAPIに぀いお

    SDのAPIを甚いるず䜕ができるようになるのか、それはWebUIを䜿わずに画像の生成ができるようになりたす。
    ぀たり、任意のプログラムず連携するこずが可胜になるわけですね。

    最初にAPIのドキュメントがどこにあるか説明しおおきたす。
    通垞WebUIを䜿っおいる状態で、さらに/docs䞭に実はAPIのドキュメントがありたす。URLで蚀えば䞋蚘のようになるでしょうか。
    http://localhost:7860/docs
    こちらのペヌゞを開くず䜿甚できるすべおのAPIのURLや䜿い方が蚘茉されおいたす。ただちょっず痒いのが、匕数たでは曞いおあるんですが、その匕数が䜕を意味するのかたで曞いおないずころでしょうか

    画像

    䟋えば以䞋が画像を生成するためのAPIなのですが、各項目がずらっず䞊んでいお、匕数にはデフォルトの倀たで入っおいたすがそれが䜕を意味するかたでは曞いおいたせん。WebUIを䜿っおいればなんずなく分かる郚分でもあるんですが、名前が違うや぀はちょっず分からないですね。
    この蟺りは情報も少なかったので、自分で詊行錯誀し぀぀確かめた郚分もありたす。今回はそういった郚分を解説できればず思っおたす。

    画像

    ずりあえずAPIで画像を生成しおみる

    テストコヌド

    いきなり䜿い方の説明や、私の䜜った最終圢を出しおも分かりづらいず思うので、たず最初にずりあえず画像の生成をしおみたす。
    基本的にURLを叩ければいいのでどんな蚀語でも構いたせんが、今回はPythonを甚いたす。
    なお、SDは同じパ゜コンで既に立ち䞊がっおいる前提です。

    import requests,base64,io
    
    def Main():
    	Imgsetting = {
    	"prompt": "(masterpiece:1.1),(best quality:1.0),(super fine cel anime:1.2),cute girl,blouse,no background,flat background",
    	"negative_prompt":"(worst quality, low quality:1.2),ugly,error,lowres,blurry,multipul angle, split view, grid view,text,signature,watermark,bad anatomy",
    	"steps": 20,
    	"sampler_index":"DPM++ 2M Karras",
    	"width": 256,
    	"height": 384,
    	"cfg_scale": 7,
    	"seed": -1,
    	}
    	resp = requests.post(url=f'http://localhost:7860/sdapi/v1/txt2img', json=Imgsetting)
    	json = resp.json()
    	imgdata = json["images"][0]
    	with open("test1.png","wb") as f:
    		buf = base64.b64decode(imgdata)
    		f.write(buf)
    	return
    
    if __name__ == '__main__':
    	Main()

    こちらを実行するず、今回は䞋蚘のような画像が生成されたした。

    画像

    テストコヌドの解説

    たずは䞀番最初の蚭定の郚分から解説したす

    画像

    こちらはWebUIで蚀えば䞋蚘の画面の蚭定内容をAPIに茉せお叩くための蚭定ずなりたす。

    画像

    党おの蚭定は数が倚く、ずおもじゃないですが制埡しおいられないので䞻芁な郚分だけ蚭定しおいきたす。

    • prompt
      知っおの通り、プロンプトを入力したす。入力内容はWebUIの時ず同じです。

    • negative_prompt
      こちらも同じくネガティブプロンプトを入力したす。

    • steps
      UIだずスラむダヌになっおいるサンプリングステップのこずです。
      䜿甚するサンプラに応じお最適な数倀を蚭定しおください。

    • sampler_index
      どのサンプラヌを䜿甚するか名前で指定したす。
      "DPM++ 2M Karras"や"DDIM"など。面倒なのが䞀時䞀句間違えずに入れなきゃいけないずころでしょうか
      ただし、サンプラヌの名前を取埗するためのAPIもあるので、そこからコテするこずで䜕を入力すればいいかはわかるず思いたす。

    • width/height
      画像のサむズを指定したす。

    • cfg_scale
      cfgスケヌルを蚭定したす。あたり倉えないず思うのでデフォルトでもいいず思いたすが、䞀応入れおありたす。

    • seed
      -1でランダム。特定のシヌドで詰めおいく堎合はシヌド倀を入力

    以䞋ドキュメント抜粋。暪に曞かれおいる数倀や文字列がデフォルトの倀のようです。
    少なくずも"string"になっおいるずころは蚭定しないずたずい気がしたす。
    ステップも50ずかちょっず倚いですね。

    {
      "enable_hr": false,
      "denoising_strength": 0,
      "firstphase_width": 0,
      "firstphase_height": 0,
      "hr_scale": 2,
      "hr_upscaler": "string",
      "hr_second_pass_steps": 0,
      "hr_resize_x": 0,
      "hr_resize_y": 0,
      "prompt": "",
      "styles": [
        "string"
      ],
      "seed": -1,
      "subseed": -1,
      "subseed_strength": 0,
      "seed_resize_from_h": -1,
      "seed_resize_from_w": -1,
      "sampler_name": "string",
      "batch_size": 1,
      "n_iter": 1,
      "steps": 50,
      "cfg_scale": 7,
      "width": 512,
      "height": 512,
      "restore_faces": false,
      "tiling": false,
      "negative_prompt": "string",
      "eta": 0,
      "s_churn": 0,
      "s_tmax": 0,
      "s_tmin": 0,
      "s_noise": 1,
      "override_settings": {},
      "override_settings_restore_afterwards": true,
      "script_args": [],
      "sampler_index": "Euler",
      "script_name": "string"
    }

    次に蚭定を甚意したら、APIを叩いお画像を取埗したす。
    以䞋がその郚分の凊理になりたす。

    画像

    今回はプロンプトから画像を生成するので叩くAPIは"/sdapi/v1/txt2img"になりたす。
    ドキュメントでもを曞いおある通り、こちらのAPIはjosnで蚭定をくっ぀けた状態でpostするこずで叩くこずができたす。
    応答はドキュメントより、䞋蚘のような圢匏のようです。

    {
      "images": [
        "string"
      ],
      "parameters": {},
      "info": "string"
    }

    むメヌゞの郚分がstringになっおいたすが、基本的にりェブで画像を送信する堎合は、base64ずいう文字列に゚ンコヌドしおから送受信するのでそのこずです。

    画像

    最埌にこの郚分で画像を保存しおいたす。入手したjsonの䞭の"images"が画像のデヌタなのでそれを取埗埌、base64をデコヌドしおバむナリにしおからそれを保存しおいたす。base64の蟺りがわからない堎合はちょっず調べおみおください。
    これでAPIによる画像の生成の基本は完了です。
    特に特別なラむブラリは必芁ないので、SDが同じパ゜コンで立ち䞊がっおいる状態であればコピペで動䜜するはずです。
    別のパ゜コンで動かしおいる堎合は、接続先をロヌカルホストではなく察象のIPアドレスにしおください。
    時間がかかる堎合タむムアりトするので、タむムアりトを長めにしおください。

    画像のアップスケヌルを行う

    この蟺の情報が党く出おこなくお困ったので自力で怜蚌したした。
    今回行うアップスケヌルはWebUIで蚀うず以䞋の郚分になりたす。

    画像

    パラメヌタヌの蚭定

    この蚭定を行うためにパラメヌタヌを远加で指定したす。
    最初に生成した画像を拡倧したいため、シヌド倀を最初の画像から持っおきおいたす

    	Imgsetting = {
    	"prompt": "(masterpiece:1.1),(best quality:1.0),(super fine cel anime:1.2),cute girl,blouse,no background,flat background",
    	"negative_prompt":"(worst quality, low quality:1.2),ugly,error,lowres,blurry,multipul angle, split view, grid view,text,signature,watermark,bad anatomy",
    	"steps": 20,
    	"sampler_index":"DPM++ 2M Karras",
    	"width": 256,
    	"height": 384,
    	"cfg_scale": 7,
    	"seed": 412220144,
    	"save_images":False,
    	"enable_hr":True,
    	"hr_scale": 2,
    	"hr_upscaler": "R-ESRGAN 4x+ Anime6B",
    	"denoising_strength":0.5
    	}

    ポむントずしおは"enable_hr"ずいうパラメヌタヌがTrueになっおいるずころです。このパラメヌタを远加した䞊でTrueにしおおくずアップスケヌラヌが起動するようになりたす。その他のパラメヌタヌは次の通りです。

    • hr_scale
      画像拡倧の倍率を指定したす
      システムのスペックに応じお最適な倀を遞んでください。

    • hr_upscaler
      アップスケヌラヌの名前を指定したす。
      こちらもサンプラのずきず同じく、名前を1字1句間違えずに入力する必芁がありたす。

    • denoising_strength
      ノむズ陀去匷床です。
      䜿っおみおわかったこずですが、webuiのノむズ陀去匷床ずはちょっず違うのかもしれたせん。
      WebUIの堎合、これが足りないずがやけた画像になるのですが、APIから実行するずのっぺり匕き䌞ばした感が出るようになりたす。
      たぁ、こだわっおも仕方がないので远及はしない物ずしおいたす。

    実行結果

    実行結果は䞋蚘の通りです。最初に生成した画像を拡倧するこずができたした。

    画像
    オリゞナル
    画像
    アップスケヌル2倍埌

    様々なAPI

    進捗状況を取埗する

    WebUIを䜿っおいるずプログレスバヌで進捗ず画像が衚瀺されたすよねそれもAPIに備わっおいたす。

    ドキュメントを確認するず、プログレスのAPIは以䞋のようになっおいたす。パラメヌタヌずしおスキップがあるようですが、こちらの動䜜は確認できおいたせん

    画像

    実行結果がこちら
    䞊から順番にパヌセンテヌゞ。残り時間、その他ステヌタスです。
    䞀番䞋にあるカレントむメヌゞはWebUIでも出おくる生成途䞭の画像のこずだず思いたす。デコヌドたではしおないので分かりたせんが。
    私の䜜成したbotはこちらを取埗しおステヌタスメッセヌゞに衚瀺したす。

    画像

    サンプラヌを取埗する

    サンプラヌの蚭定は䞀字䞀句間違えおはいけたせん。
    ずなるず遞択肢があるず助かるんですが、それを提䟛するのがこちらです。

    画像

    実行結果がこちら
    サンプラによっおは耇雑なパラメヌタヌも持っおいるようなので、若干構造が耇雑ですが、䞊から順番にリストを開いお行っおnameを取埗すれば良さそうです。

    画像

    アップスケヌラヌを取埗する

    こちらもサンプラず同様です。

    画像

    構造をほが同じなので、サンプラヌず同様のプログラムで抜出が可胜かず思われたす。

    画像

    保存されおいるモデルを取埗する

    フォルダ内に栌玍しおあるモデルの䞀芧を取埗するこずができたす。

    画像

    実行結果がこちら
    䜕持っおるかバレバレですね。うたく動かないのもあるんですけど

    画像

    モデルを蚭定する

    モデルの蚭定が䞀番意味のわからんずころにありたす。
    蚭定はオプションになっおおり、バラメヌタヌ"sd_model_checkpoint"で蚭定されたす。

    画像

    ちなみにここで指定すべき名前はモデルで取埗した時に出おくる"title"の郚分になりたす。間違っおも"model_name"ではありたせん。
    モデルをチェンゞしおから画像を生成するように゜ヌスを改倉したした。

    import requests,base64,io
    
    def Main():
    	ChangeModel()
    	Imgsetting = {
    	"prompt": "(masterpiece:1.1),(best quality:1.0),(super fine cel anime:1.2),cute girl,blouse,no background,flat background",
    	"negative_prompt":"(worst quality, low quality:1.2),ugly,error,lowres,blurry,multipul angle, split view, grid view,text,signature,watermark,bad anatomy",
    	"steps": 20,
    	"sampler_index":"DPM++ 2M Karras",
    	"width": 256,
    	"height": 384,
    	"cfg_scale": 7,
    	"seed": 412220144,
    	"save_images":False,
    	"enable_hr":False,
    	"hr_scale": 2,
    	"hr_upscaler": "R-ESRGAN 4x+ Anime6B",
    	"denoising_strength":0.5
    	}
    	resp = requests.post(url=f'http://localhost:7860/sdapi/v1/txt2img', json=Imgsetting)
    	json = resp.json()
    	imgdata = json["images"][0]
    	with open("test1.png","wb") as f:
    		buf = base64.b64decode(imgdata)
    		f.write(buf)
    	return
    
    
    
    def ChangeModel():
    	option_payload = {
    	"sd_model_checkpoint": "HimawariMix-v8.safetensors",
    	}
    	resp = requests.post(url=f'http://localhost:7860/sdapi/v1/options', json=option_payload)
    

    実行結果がこちら
    巊偎が最初に生成した画像で右偎がモデルを倉曎しお曞いた画像です
    モデルの倉曎がきちんず適甚されおいるこずがわかりたす。

    画像

    たずめ

    今回はSDのAPIを䜿甚しお画像を生成しおいきたした。
    䟿利なWebUIがあるので、あたりAPIを䜿甚するずいう人はいないのかもしれたせんが、自䜜のサヌビスを連携させたいず思ったら非垞に䟿利なものですので、是非詊しおみおください。
    なお、APIを䜿甚しお私が䜜成したDiscordのbotは䞋蚘の蚘事から配垃䞭ですので、ぜひぜひ䜿甚しおみおください。

    䟋えば今回お話ししおいたせんが、APIを叩くためのクラスを䜜っおいたり非同期のリク゚ストを䜿っおAPIを叩いおいたりしたす。
    蚘事が出おしばらくの間はRcatもはたっおいるず思うので、アップデヌトが期埅できたす。
    それではたたお䌚いしたしょう


     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ