この記事では深度マップから画像を生成できるFLUX.1 depth devというモデルのComfyUIにおける使い方を説明します。
はじめに
FLUX.1 depthとは、2024年11月にFLUX.1の開発者であるBlack Forest Labsによって公開されたFLUX.1 Toolsの一つです。
前回の記事で紹介したFLUX.1 fillもその一つです。
今回の記事も同様にComfyUIでの使い方を説明します。
FLUX.1 fillと同様に、有料版のproモデルと無料版のdevがありますが、devだけ説明します。
又この記事は以前書いた入門記事を読んだという前提で書いていますので、まだ読んでいない方はよろしければどうぞ。
今回のFLUX.1 depthは深度マップという遠近を表現する絵を元にして画像を生成するという機能を持っています。
Stable Diffusionではcontrolnetを使ってこれができます。本来深度マップを使うという方法はcontrolnetで実装したことでよく知られるようになりましたね。FLUX.1も同じようにcontrolnetがありますが、controlnetとは別でもっと簡単に使える方法があります。
FLUX.1 depth devモデルは2つあります。専用のunet拡散モデルと、既存のモデルと組み合わせるloraです。どれも説明します。
FLUX.1 Depth devのunetモデルで使う
まずはモデルとして使う方法を説明します。
公式ではこのモデルが配布されています。モデルをダウンロードするのにhuggingfaceにログインする必要があります。
ただし実際に使う時軽量化番はおすすめです。この記事の例では主にfp8軽量化版を使って説明します。
ワークフローはこんな感じです。
このワークフローのjson。
{
"1": {
"inputs": {
"clip_name1": "clip_l.safetensors",
"clip_name2": "t5xxl_fp8_e4m3fn_scaled.safetensors",
"type": "flux",
"device": "default"
},
"class_type": "DualCLIPLoader"
},
"2": {
"inputs": {
"unet_name": "flux1-depth-dev-fp8.safetensors",
"weight_dtype": "default"
},
"class_type": "UNETLoader"
},
"3": {
"inputs": {
"vae_name": "ae.safetensors"
},
"class_type": "VAELoader"
},
"4": {
"inputs": {
"image": "biang.png"
},
"class_type": "LoadImage"
},
"5": {
"inputs": {
"from_translate": "auto",
"to_translate": "english",
"add_proxies": false,
"proxies": "",
"auth_data": "",
"service": "GoogleTranslator",
"text": "",
"Show proxy": "proxy_hide",
"Show authorization": "authorization_hide",
"clip": ["1", 0]
},
"class_type": "DeepTranslatorCLIPTextEncodeNode"
},
"6": {
"inputs": {
"guidance": 10,
"conditioning": ["5", 0]
},
"class_type": "FluxGuidance"
},
"7": {
"inputs": {
"positive": ["6", 0],
"negative": ["5", 0],
"vae": ["3", 0],
"pixels": ["4", 0]
},
"class_type": "InstructPixToPixConditioning"
},
"8": {
"inputs": {
"seed": 73933883153180,
"steps": 20,
"cfg": 1,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": ["2", 0],
"positive": ["7", 0],
"negative": ["7", 1],
"latent_image": ["7", 2]
},
"class_type": "KSampler"
},
"9": {
"inputs": {
"samples": ["8", 0],
"vae": ["3", 0]
},
"class_type": "VAEDecode"
},
"10": {
"inputs": {
"filename_prefix": "ComfyUI",
"file_type": "JPEG",
"remove_metadata": false,
"images": ["9", 0]
},
"class_type": "SaveImagePlus"
}
}
LoadImage(画像を読み込む)ノードに深度マップの画像を入力します。
今回の例で使ってみたいのはこの画像です。これは有名なビャンビャン麺の文字ですね。
プロンプトは「砂」と入力してみたらこんな画像ができます。
まるで砂浜で文字を書いたという感じですね。
深度マップでは「黒」が「遠い」で「白」が「近い」ので黒で描いたところは深いと感じますね。
試しにImageInvert(画像を反転)ノードでも挿入して白黒を逆にしたら結果はこうなります。
これも綺麗ですね。
FLUX.1 Depth dev loraで使う
上述のflux1-depth-devモデルを使った方法はそのモデルしか使えないので、柔軟性が低いです。他に特定の好きなモデルのスタイルとかがあったらこの方法ができません。その場合、FLUX.1 Depth dev loraを使っていいです。
loraはここからダウンロードできます。同様にhuggingfaceのログインが必要です。サイズは1.24MBでloraにしては大きいのですが、既存のモデルに使えます。
実はこの方法のワークフローは公式のテンプレートにも入っているので、これも参考に。
上の例と同じように私なりにワークフローを組んでみたらこうなります。
{
"1": {
"inputs": {
"clip_name1": "clip_l.safetensors",
"clip_name2": "t5xxl_fp8_e4m3fn_scaled.safetensors",
"type": "flux",
"device": "default"
},
"class_type": "DualCLIPLoader"
},
"2": {
"inputs": {
"unet_name": "flux1-krea-dev_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"class_type": "UNETLoader"
},
"3": {
"inputs": {
"vae_name": "ae.safetensors"
},
"class_type": "VAELoader"
},
"4": {
"inputs": {
"image": "biang.png"
},
"class_type": "LoadImage"
},
"5": {
"inputs": {
"from_translate": "auto",
"to_translate": "english",
"add_proxies": false,
"proxies": "",
"auth_data": "",
"service": "GoogleTranslator",
"text": "",
"Show proxy": "proxy_hide",
"Show authorization": "authorization_hide",
"clip": ["1", 0]
},
"class_type": "DeepTranslatorCLIPTextEncodeNode"
},
"6": {
"inputs": {
"lora_name": "flux1-depth-dev-lora.safetensors",
"strength_model": 0.95,
"model": ["2", 0]
},
"class_type": "LoraLoaderModelOnly"
},
"7": {
"inputs": {
"guidance": 10,
"conditioning": ["5", 0]
},
"class_type": "FluxGuidance"
},
"8": {
"inputs": {
"positive": ["7", 0],
"negative": ["5", 0],
"vae": ["3", 0],
"pixels": ["4", 0]
},
"class_type": "InstructPixToPixConditioning"
},
"9": {
"inputs": {
"seed": 73933883153180,
"steps": 20,
"cfg": 1,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": ["2", 0],
"positive": ["8", 0],
"negative": ["8", 1],
"latent_image": ["8", 2]
},
"class_type": "KSampler"
},
"10": {
"inputs": {
"samples": ["9", 0],
"vae": ["3", 0]
},
"class_type": "VAEDecode"
},
"11": {
"inputs": {
"filename_prefix": "ComfyUI",
"file_type": "JPEG",
"remove_metadata": false,
"images": ["10", 0]
},
"class_type": "SaveImagePlus"
}
}
普通のFLUX.1 devなどは勿論ですが、FLUX.1 krea devも使えます。今回もこのモデルを使います。
同じ画像を使ってプロンプトに「黄金」と入力して実行してみたらこんな結果です。
綺麗な黄金の看板ですね。
又これはloraなのでLoraLoaderModelOnly(LoRAローダーモデルのみ)ノードのstrength_model(モデルの強度)を変更して、どれくらいきつく深度をコントロールするかを調整できます。
元画像のdepthで生成
自分で深度マップを作るよりも、普段は既存の加増から深度マップを作って又似た画像を生成する、という場合の方が多いですね。
深度マップの作成は色々ありますが、よく使われているのはcomfyui_controlnet_auxのDepthAnythingPreprocessor(Depth Anything)ノードです。
このように深度マップが作成できます。
このノードも組み合わせて既存の画像から似た画像を生成するワークフローができます。
{
"1": {
"inputs": {
"clip_name1": "clip_l.safetensors",
"clip_name2": "t5xxl_fp8_e4m3fn_scaled.safetensors",
"type": "flux",
"device": "default"
},
"class_type": "DualCLIPLoader"
},
"2": {
"inputs": {
"unet_name": "flux1-krea-dev_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"class_type": "UNETLoader"
},
"3": {
"inputs": {
"vae_name": "ae.safetensors"
},
"class_type": "VAELoader"
},
"4": {
"class_type": "LoadImage"
},
"5": {
"inputs": {
"lora_name": "flux1-depth-dev-lora.safetensors",
"strength_model": 0.95,
"model": ["2", 0]
},
"class_type": "LoraLoaderModelOnly"
},
"6": {
"inputs": {
"from_translate": "auto",
"to_translate": "english",
"add_proxies": false,
"proxies": "",
"auth_data": "",
"service": "GoogleTranslator",
"text": "",
"Show proxy": "proxy_hide",
"Show authorization": "authorization_hide",
"clip": ["1", 0]
},
"class_type": "DeepTranslatorCLIPTextEncodeNode"
},
"7": {
"inputs": {
"ckpt_name": "depth_anything_vitl14.pth",
"resolution": 1024,
"image": ["4", 0]
},
"class_type": "DepthAnythingPreprocessor"
},
"8": {
"inputs": {
"guidance": 10,
"conditioning": ["6", 0]
},
"class_type": "FluxGuidance"
},
"9": {
"inputs": {
"positive": ["8", 0],
"negative": ["6", 0],
"vae": ["3", 0],
"pixels": ["7", 0]
},
"class_type": "InstructPixToPixConditioning"
},
"10": {
"inputs": {
"seed": 123456789,
"steps": 20,
"cfg": 1,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": ["5", 0],
"positive": ["9", 0],
"negative": ["9", 1],
"latent_image": ["9", 2]
},
"class_type": "KSampler"
},
"11": {
"inputs": {
"samples": ["10", 0],
"vae": ["3", 0]
},
"class_type": "VAEDecode"
},
"12": {
"inputs": {
"filename_prefix": "ComfyUI",
"file_type": "JPEG",
"remove_metadata": false,
"images": ["11", 0]
},
"class_type": "SaveImagePlus"
},
"13": {
"inputs": {
"images": ["7", 0]
},
"class_type": "PreviewImage"
}
}
今回の元画像。
「アニメ、桜の木の下で青髪少女」というプロンプトでできた画像。
服装に関して指定していないが、鎧と似た形のドレスになりましたね。
textoverlayで好きな文字のお洒落
上の例では準備した文字の画像を使ったが、もしComfyUIの中で簡単な文字を入れることができたらその方が便利ですね。
これはComfyUI-TextOverlayのText Overlayノードでできます。
ただし日本語などを表示したい場合フォントの準備が必要です。まず好きなフォントのファイルをComfyUIフォルダの中のcustom_nodes/ComfyUI-TextOverlay/fontsフォルダに入れます。
例えばここではmeiryoub.ttcを使っています。
このようにワークフローを作ることができます。
{
"1": {
"inputs": {
"clip_name1": "clip_l.safetensors",
"clip_name2": "t5xxl_fp8_e4m3fn_scaled.safetensors",
"type": "flux",
"device": "default"
},
"class_type": "DualCLIPLoader"
},
"2": {
"inputs": {
"unet_name": "flux1-krea-dev_fp8_scaled.safetensors",
"weight_dtype": "default"
},
"class_type": "UNETLoader"
},
"3": {
"inputs": {
"vae_name": "ae.safetensors"
},
"class_type": "VAELoader"
},
"4": {
"inputs": {
"width": 200,
"height": 200,
"red": 0,
"green": 0,
"blue": 0
},
"class_type": "Image Blank"
},
"5": {
"inputs": {
"lora_name": "flux1-depth-dev-lora.safetensors",
"strength_model": 0.8,
"model": ["2", 0]
},
"class_type": "LoraLoaderModelOnly"
},
"6": {
"inputs": {
"from_translate": "auto",
"to_translate": "english",
"add_proxies": false,
"proxies": "",
"auth_data": "",
"service": "GoogleTranslator",
"text": "蕎麦",
"Show proxy": "proxy_hide",
"Show authorization": "authorization_hide",
"clip": ["1", 0]
},
"class_type": "DeepTranslatorCLIPTextEncodeNode"
},
"7": {
"inputs": {
"text": "蕎麦",
"font_size": 80,
"font": "meiryoub.ttc",
"fill_color_hex": "#FFFFFF",
"stroke_color_hex": "#FFFFFF",
"stroke_thickness": 0,
"padding": 0,
"horizontal_alignment": "center",
"vertical_alignment": "top",
"x_shift": 0,
"y_shift": 0,
"line_spacing": 3.2,
"image": ["4", 0]
},
"class_type": "Text Overlay"
},
"8": {
"inputs": {
"guidance": 10,
"conditioning": ["6", 0]
},
"class_type": "FluxGuidance"
},
"9": {
"inputs": {
"target_width": 1024,
"target_height": 1024,
"padding_color": "black",
"interpolation": "area",
"image": ["7", 0]
},
"class_type": "ResizeAndPadImage"
},
"10": {
"inputs": {
"positive": ["8", 0],
"negative": ["6", 0],
"vae": ["3", 0],
"pixels": ["9", 0]
},
"class_type": "InstructPixToPixConditioning"
},
"11": {
"inputs": {
"seed": 501005671272849,
"steps": 20,
"cfg": 1,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": ["5", 0],
"positive": ["10", 0],
"negative": ["10", 1],
"latent_image": ["10", 2]
},
"class_type": "KSampler"
},
"12": {
"inputs": {
"samples": ["11", 0],
"vae": ["3", 0]
},
"class_type": "VAEDecode"
},
"13": {
"inputs": {
"filename_prefix": "ComfyUI",
"file_type": "JPEG",
"remove_metadata": false,
"images": ["12", 0]
},
"class_type": "SaveImagePlus"
},
"14": {
"inputs": {
"images": ["7", 0]
},
"class_type": "PreviewImage"
}
}
例えば「蕎麦」という文字で「蕎麦」画像を生成させてみたらこうなります。
「蕎麦」の文字は綺麗にできて、周りの画像とも馴染んでいますね。他にも適当で読めない文字が生成されていますが、関係ない部分だから相変わらず仕方ないです。
又何回も生成してみて結果は大きく変わりますね。このような蕎麦屋のロゴを生成することもできます。
何かのロゴを作りたい時に使えそうです。凄いですね。
このようにFLUX.1 depth devは色々できて便利です。













