Refocus LTX 2.3 IC LoRA
The Refocus IC LoRA for LTX 2.3 makes it possible to bring slightly out-of-focus footage back into clarity. Even in more extreme cases, it can recover detail that would typically be lost, opening up new possibilities for salvaging footage that would otherwise go unused.
ワークフローの内部
ソーステンプレートの読み取り専用プレビューです。Cloud で開くと、ノードを確認して変更できます。
Loading the graph
Open full-size workflow preview- 出力
- 動画
- 作成者
- ComfyUI
コードからこのモデルを呼び出す
以下のリクエストでは、Playground と同じ準備済みグラフと設定を使用します。送信ごとに有料実行が開始される場合があります。結果が不明な送信を自動的に再試行しないでください。
What you need
- Runs on
- Comfy Cloud
- キー
- COMFY_API_KEY
- ファイル
- コードによって URL からアップロードされます
有料の Cloud プランとクレジットが必要です。
# Python 3.10+: pip install comfy-sdk==0.4.0
import os
from comfy_sdk import Comfy
api_key = os.environ.get("COMFY_API_KEY", "").strip()
if not api_key: raise RuntimeError("Set COMFY_API_KEY")
os.environ.setdefault("COMFY_BASE_URL", "https://cloud.comfy.org")
client = Comfy(api_key=api_key)
workflow = client.workflows.from_json({
"5060": {
"class_type": "VHS_LoadVideo",
"inputs": {
"custom_height": 0,
"custom_width": 0,
"force_rate": 0,
"format": "AnimateDiff",
"frame_load_cap": 0,
"select_every_nth": 1,
"skip_first_frames": 0,
"video": "UPLOADED_video_FILENAME"
},
"_meta": {
"title": "Load Video (Upload) 🎥🅥🅗🅢"
}
},
"5069": {
"class_type": "VHS_VideoCombine",
"inputs": {
"audio": [
"5060",
2
],
"crf": 13,
"filename_prefix": "outpaint_comparison",
"format": "video/h264-mp4",
"frame_rate": [
"5151:5137",
5
],
"images": [
"5151:5125",
0
],
"loop_count": 0,
"pingpong": False,
"pix_fmt": "yuv420p",
"save_metadata": True,
"save_output": True,
"trim_to_audio": False
},
"_meta": {
"title": "video_compare"
}
},
"5152": {
"class_type": "VHS_VideoCombine",
"inputs": {
"audio": [
"5060",
2
],
"crf": 13,
"filename_prefix": "outpaint_output",
"format": "video/h264-mp4",
"frame_rate": [
"5151:5137",
5
],
"images": [
"5151:5143",
0
],
"loop_count": 0,
"pingpong": False,
"pix_fmt": "yuv420p",
"save_metadata": True,
"save_output": True,
"trim_to_audio": False
},
"_meta": {
"title": "video_output"
}
},
"5151:5097": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 1920
},
"_meta": {
"title": "target_resolution_w"
}
},
"5151:5098": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 1080
},
"_meta": {
"title": "target_resolution_h"
}
},
"5151:5110": {
"class_type": "LTXVConditioning",
"inputs": {
"frame_rate": [
"5151:5137",
5
],
"negative": [
"5151:5131",
0
],
"positive": [
"5151:5138",
0
]
},
"_meta": {
"title": "LTXVConditioning"
}
},
"5151:5111": {
"class_type": "LTXVConcatAVLatent",
"inputs": {
"audio_latent": [
"5151:5121",
0
],
"video_latent": [
"5151:5142",
2
]
},
"_meta": {
"title": "Concat AV Latent"
}
},
"5151:5112": {
"class_type": "EmptyLTXVLatentVideo",
"inputs": {
"batch_size": 1,
"height": [
"5151:5098",
0
],
"length": [
"5151:5126",
2
],
"width": [
"5151:5097",
0
]
},
"_meta": {
"title": "Empty LTXV Latent Video"
}
},
"5151:5113": {
"class_type": "LTXVCropGuides",
"inputs": {
"latent": [
"5151:5114",
0
],
"negative": [
"5151:5142",
1
],
"positive": [
"5151:5142",
0
]
},
"_meta": {
"title": "LTXVCropGuides"
}
},
"5151:5114": {
"class_type": "LTXVSeparateAVLatent",
"inputs": {
"av_latent": [
"5151:5122",
0
]
},
"_meta": {
"title": "Separate AV Latent"
}
},
"5151:5115": {
"class_type": "CM_FloatToInt",
"inputs": {
"a": [
"5151:5137",
5
]
},
"_meta": {
"title": "FloatToInt"
}
},
"5151:5116": {
"class_type": "CFGGuider",
"inputs": {
"cfg": 1,
"model": [
"5151:5146",
0
],
"negative": [
"5151:5142",
1
],
"positive": [
"5151:5142",
0
]
},
"_meta": {
"title": "CFG Guider"
}
},
"5151:5117": {
"class_type": "RandomNoise",
"inputs": {
"noise_seed": 42
},
"_meta": {
"title": "RandomNoise"
}
},
"5151:5118": {
"class_type": "ManualSigmas",
"inputs": {
"sigmas": "1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0"
},
"_meta": {
"title": "ManualSigmas"
}
},
"5151:5119": {
"class_type": "KSamplerSelect",
"inputs": {
"sampler_name": "euler_ancestral"
},
"_meta": {
"title": "KSamplerSelect"
}
},
"5151:5120": {
"class_type": "LTXVPreprocess",
"inputs": {
"image": [
"5151:5136",
0
],
"img_compression": 18
},
"_meta": {
"title": "LTXV Preprocess"
}
},
"5151:5121": {
"class_type": "LTXVEmptyLatentAudio",
"inputs": {
"audio_vae": [
"5151:5132",
0
],
"batch_size": 1,
"frame_rate": [
"5151:5115",
0
],
"frames_number": [
"5060",
1
]
},
"_meta": {
"title": "Empty LTXV Latent Audio"
}
},
"5151:5122": {
"class_type": "SamplerCustomAdvanced",
"inputs": {
"guider": [
"5151:5116",
0
],
"latent_image": [
"5151:5111",
0
],
"noise": [
"5151:5117",
0
],
"sampler": [
"5151:5119",
0
],
"sigmas": [
"5151:5118",
0
]
},
"_meta": {
"title": "SamplerCustomAdvanced"
}
},
"5151:5124": {
"class_type": "LTXVAudioVAEDecode",
"inputs": {
"audio_vae": [
"5151:5132",
0
],
"samples": [
"5151:5114",
1
]
},
"_meta": {
"title": "LTXV Audio VAE Decode"
}
},
"5151:5125": {
"class_type": "ImageConcanate",
"inputs": {
"direction": "left",
"image1": [
"5151:5143",
0
],
"image2": [
"5151:5130",
0
],
"match_image_size": True
},
"_meta": {
"title": "ImageConcanate"
}
},
"5151:5126": {
"class_type": "GetImageSize",
"inputs": {
"image": [
"5151:5130",
0
]
},
"_meta": {
"title": "Get Image Size"
}
},
"5151:5127": {
"class_type": "PrimitiveBoolean",
"inputs": {
"value": True
},
"_meta": {
"title": "bypass_i2v"
}
},
"5151:5128": {
"class_type": "VAEDecodeTiled",
"inputs": {
"overlap": 64,
"temporal_overlap": 4,
"temporal_size": 512,
"tile_size": 512
},
"_meta": {
"title": "VAE Decode (Tiled)"
}
},
"5151:5129": {
"class_type": "ResizeImageMaskNode",
"inputs": {
"input": [
"5151:5139",
0
],
"resize_type": "scale by multiplier",
"resize_type.multiplier": 0.5,
"scale_method": "lanczos"
},
"_meta": {
"title": "Resize Image/Mask"
}
},
"5151:5130": {
"class_type": "ResizeImageMaskNode",
"inputs": {
"input": [
"5151:5129",
0
],
"resize_type": "scale to multiple",
"resize_type.multiple": 32,
"scale_method": "area"
},
"_meta": {
"title": "Resize Image/Mask"
}
},
"5151:5131": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"5151:5135",
0
],
"text": "pc game, console game, video game, ugly, 3d render, photo, still, static, slow"
},
"_meta": {
"title": "CLIP Text Encode (Negative Prompt)"
}
},
"5151:5132": {
"class_type": "LTXVAudioVAELoader",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev-fp8.safetensors"
},
"_meta": {
"title": "Load LTXV Audio VAE"
}
},
"5151:5133": {
"class_type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev-fp8.safetensors"
},
"_meta": {
"title": "Load Checkpoint"
}
},
"5151:5134": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "ltx-2.3-22b-distilled-lora-384.safetensors",
"model": [
"5151:5133",
0
],
"strength_model": 0.5
},
"_meta": {
"title": "Load LoRA"
}
},
"5151:5135": {
"class_type": "LTXAVTextEncoderLoader",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev-fp8.safetensors",
"device": "default",
"text_encoder": "gemma_3_12B_it.safetensors"
},
"_meta": {
"title": "Load LTXV Audio Text Encoder"
}
},
"5151:5136": {
"class_type": "ResizeImageMaskNode",
"inputs": {
"input": [
"5151:5145",
0
],
"resize_type": "match size",
"resize_type.crop": "center",
"resize_type.match": [
"5151:5130",
0
],
"scale_method": "area"
},
"_meta": {
"title": "Resize Image/Mask"
}
},
"5151:5137": {
"class_type": "VHS_VideoInfo",
"inputs": {
"video_info": [
"5060",
3
]
},
"_meta": {
"title": "Video Info 🎥🅥🅗🅢"
}
},
"5151:5138": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"5151:5135",
0
],
"text": "An aerial view gliding over a terraced stone hill town at golden hour. Clay barrel-tiled rooftops with chipped edges and lichen, weathered sandstone walls, arched windows with wooden shutters, a bell tower, narrow stepped lanes, tall cypress trees and silver-green olive orchards on the slopes. Swallows circle the roofs, laundry moves on a line and a thin curl of smoke rises from a chimney. Warm low sunlight with long crisp shadows, a lilac and apricot sky. Every surface is sharp and finely detailed: individual tiles, stones, leaves and window frames in clear focus."
},
"_meta": {
"title": "CLIP Text Encode (Positive Prompt)"
}
},
"5151:5139": {
"class_type": "ImagePadKJ",
"inputs": {
"bottom": 0,
"color": "0, 0, 0",
"extra_padding": 0,
"image": [
"5060",
0
],
"left": 0,
"pad_mode": "color",
"right": 0,
"target_height": [
"5151:5150",
1
],
"target_width": [
"5151:5149",
1
],
"top": 0
},
"_meta": {
"title": "ImagePad KJ"
}
},
"5151:5140": {
"class_type": "VHS_VideoCombine",
"inputs": {
"audio": [
"5060",
2
],
"crf": 12,
"filename_prefix": "AnimateDiff",
"format": "video/h264-mp4",
"frame_rate": [
"5151:5137",
5
],
"images": [
"5151:5144",
0
],
"loop_count": 0,
"pingpong": False,
"pix_fmt": "yuv420p",
"save_metadata": True,
"save_output": False,
"trim_to_audio": False
},
"_meta": {
"title": "Video Combine 🎥🅥🅗🅢"
}
},
"5151:5141": {
"class_type": "LTXVImgToVideoConditionOnly",
"inputs": {
"bypass": [
"5151:5127",
0
],
"image": [
"5151:5120",
0
],
"latent": [
"5151:5112",
0
],
"strength": 0.7,
"vae": [
"5151:5133",
2
]
},
"_meta": {
"title": "🅛🅣🅧 LTXV Img To Video Condition Only"
}
},
"5151:5142": {
"class_type": "LTXAddVideoICLoRAGuide",
"inputs": {
"crop": "disabled",
"frame_idx": 0,
"image": [
"5151:5144",
0
],
"latent": [
"5151:5141",
0
],
"latent_downscale_factor": 1,
"negative": [
"5151:5110",
1
],
"positive": [
"5151:5110",
0
],
"strength": 1,
"tile_frames": 97,
"tile_overlap": 64,
"tile_size": 256,
"use_streaming": False,
"use_tiled_encode": False,
"vae": [
"5151:5133",
2
]
},
"_meta": {
"title": "🅛🅣🅧 Add Video IC-LoRA Guide"
}
},
"5151:5143": {
"class_type": "Float32ColorCorrect",
"inputs": {
"brightness": 0,
"clamp_output": False,
"contrast": 1,
"exposure": 0,
"gain_b": 1,
"gain_g": 1,
"gain_r": 1,
"gamma": 0.5,
"image": [
"5151:5154",
0
],
"lift_b": 0,
"lift_g": 0,
"lift_r": 0,
"luma_space": "Rec.709 / sRGB",
"saturation": 1
},
"_meta": {
"title": "◎ Radiance Float32 Color Correct"
}
},
"5151:5144": {
"class_type": "Float32ColorCorrect",
"inputs": {
"brightness": 0,
"clamp_output": False,
"contrast": 1,
"exposure": 0,
"gain_b": 1,
"gain_g": 1,
"gain_r": 1,
"gamma": 2,
"image": [
"5151:5156",
0
],
"lift_b": 0,
"lift_g": 0,
"lift_r": 0,
"luma_space": "Rec.709 / sRGB",
"saturation": 1
},
"_meta": {
"title": "◎ Radiance Float32 Color Correct"
}
},
"5151:5145": {
"class_type": "LoadImage",
"inputs": {
"image": "642ef66b933861a25a7a8ad3b46f3a7005c783d53c3971392a84595ae4dd4b04.png"
},
"_meta": {
"title": "Load Image"
}
},
"5151:5146": {
"class_type": "LoraLoaderModelOnly",
"inputs": {
"lora_name": "ltx-2.3-22b-ic-lora-refocus.safetensors",
"model": [
"5151:5134",
0
],
"strength_model": 1
},
"_meta": {
"title": "Load LoRA"
}
},
"5151:5148": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "a / b",
"values.a": [
"5151:5097",
0
],
"values.b": [
"5151:5098",
0
]
},
"_meta": {
"title": "ratio"
}
},
"5151:5149": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "max(a, b * c)",
"values.a": [
"5151:5137",
3
],
"values.b": [
"5151:5137",
4
],
"values.c": [
"5151:5148",
0
]
},
"_meta": {
"title": "target_w"
}
},
"5151:5150": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "max(b, a / c)",
"values.a": [
"5151:5137",
3
],
"values.b": [
"5151:5137",
4
],
"values.c": [
"5151:5148",
0
]
},
"_meta": {
"title": "target_h"
}
},
"5151:5154": {
"class_type": "VAEDecode",
"inputs": {
"samples": [
"5151:5113",
2
],
"vae": [
"5151:5133",
2
]
},
"_meta": {
"title": "VAE Decode"
}
},
"5151:5156": {
"class_type": "ImageResizeKJv2",
"inputs": {
"crop_position": "center",
"device": "cpu",
"divisible_by": 2,
"height": [
"5151:5098",
0
],
"image": [
"5060",
0
],
"keep_proportion": "crop",
"pad_color": "0, 0, 0",
"upscale_method": "lanczos",
"width": [
"5151:5097",
0
]
},
"_meta": {
"title": "Resize Image v2"
}
}
})
workflow.set_input("5060", "video", client.assets.from_url("https://comfy.org/catalog-media/f1376d64-21a8-49e7-8512-2b1bc24b61f8/5d6c7957-e695-487b-b6fe-4ba20072a780"))
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)
for output in job.get_outputs("5152"):
output.to_file(output.name)
for output in job.get_outputs("5069"):
output.to_file(output.name)例を試す
このワークフローについて
This workflow restores soft or slightly out‑of‑focus footage using the Refocus IC LoRA on top of the LTX 2.3 model. It ingests your clip with VHS_LoadVideo, processes each frame through a custom LTX 2.3 + LoRA processor (node UUID: 2e37ecc9-770a-4ac2-972c-e953901f49d3), and then reassembles the enhanced frames back into a video with VHS_VideoCombine. The Refocus IC LoRA biases the LTX 2.3 backbone toward reconstructing fine edges and mid‑frequency detail that typical sharpening filters can’t recover, helping pull subjects back into clarity while minimizing halos and ringing.
Technically, the pipeline works frame‑wise: VHS_LoadVideo decodes your source and outputs frame tensors; the custom node loads the LTX 2.3 base and applies the Refocus IC LoRA weights to guide inference toward crisp, natural detail; and VHS_VideoCombine stitches the processed frames into a finished clip at your chosen frame rate and quality. Because this is model‑driven enhancement rather than a simple unsharp mask, it can plausibly restore subtle textures and edge definition in footage that would otherwise be unusable.
Keep LoRA strength conservative for realism, and iterate to balance sharpness against potential artifacts.
よくある質問
Instead of boosting existing edges, LTX 2.3 with the Refocus IC LoRA uses a learned prior to reconstruct plausible detail. This can recover mid‑frequency structure that simple unsharp masks miss, but overly strong settings can introduce artifacts—keep the LoRA weight moderate.
No. VHS_VideoCombine outputs a video from processed frames only. Export your enhanced clip and reattach the original audio in your NLE or a separate muxing step.
Clips that are slightly soft or marginally out of focus. Extreme defocus or heavy motion blur won’t fully recover—try small increases in LoRA strength and evaluate on a short segment before processing the full video.
Speed depends on resolution, clip length, and GPU VRAM. Processing per-frame with a generative model is compute-heavy; test on a short frame range first and consider batching or downscaling for faster previews.