Qwen Image 2.1 can upscale a small or worn picture by itself, but it overdoes it. Skin turns gritty, pores and freckles show up that were not there, faces look older, and the picture shifts a few pixels. I trained this LoRA to soften that harsh upscale. With it the result is a little softer and still detailed, it makes up less, and it stays true to the picture you gave it.
I tested it on 37 pictures I had shrunk myself, so each result could be compared with the full-size picture. With the LoRA the result sat about 0.3 px off. Without it, more than 2 px.
It is a redraw, not a recovery. The fine detail is made up to fit. Plain Qwen 2.1 draws more texture; this LoRA trades some of that for staying true to the picture.
Blurry photos need a lower strength. If your picture is out of focus, shaky, or a frame from a video, set the LoRA to 0.5. At 1.0 it stays true to the blur and the result comes back soft. A small or compressed picture that is in focus is fine at 1.0.
No trigger word. Start at strength 1.0, and lower it for a blurry photo or for more of Qwen's own texture (more on that below). Enlarge your picture to about 2 megapixels first (both sides divisible by 32), give it as image 1, and ask:
Restore the photo: remove blur, noise and compression artifacts and recover sharp, natural detail, keeping the same composition, people and colors.
For scratched or faded prints:
Restore the old photo: remove scratches, dust, fading and grain and recover sharp, natural detail and color, keeping the same composition and people.
I use it with Viggle Turbo at 8 steps. It also works at 25 steps without Turbo. That comes out a little closer and softer.
Also on Civitai: the LoRA page and my Qwen Image 2.1 Tiled Upscale workflow, which uses this LoRA for results over 2 megapixels.
Watch it used: my Turbo video on YouTube, from 6:50.

In each picture: the small input, the result without the LoRA and with it, and the marked section enlarged underneath. All made with the workflow in this repo, same prompt and seed, 8 steps with Viggle Turbo, about 2 MP, shown as rendered. "Without the LoRA" is the same workflow with the Restore row switched off. "px off" is how far the result sits from the full-size picture the input was shrunk from. None of these pictures are in the training set.




For a scratched or faded print, use the old-photo request above. On four held-out old prints (pictures it never trained on, damaged the way the training pairs were), color and brightness sat 15 % off the clean picture before the restore, 7 % off after it with the normal request and 4 % off with the old-photo request. Scratches, dust and grain went with either request.
A kind of fading it has not seen can stay. In a second test with a different fade (two pictures, in tiles), the scratches went and the faded color stayed.

At 0 you get all the harsh detail Qwen adds. Turn the LoRA up and the picture gets softer and stays truer to your input.
Blurry photos are where it matters most. I ran 26 real low-resolution photos (old selfies and phone pictures) at 1.0, 0.75 and 0.5. On the 6 blurriest ones, 1.0 came back soft, 0.75 barely helped, and 0.5 came back sharp. On the other 20 all three worked, and 1.0 was the smoothest. The face stayed closest to the input at 1.0 and 0.75 (face match 0.94) and a little less at 0.5 (0.91).
Redrawing a soft photo bigger also helped. Three of them, taken to 8 megapixels in tiles, came back sharp with the LoRA still at 1.0.
| file | notes |
|---|---|
qwen-image-2.1-restore.safetensors | step 1,500, start here. The closest in my test, and the one I liked best on my test pictures. Skin comes out a little smooth. |
qwen-image-2.1-restore-1250.safetensors | step 1,250. Draws more fine detail and keeps more skin texture on noisy phone pictures. A little less close. |
Rank 32, ComfyUI key format, loads onto the Comfy-Org Qwen Image 2.1 weights.
Eight of my own pictures, shrunk to 512 or 560 px on the long side and saved as JPEG (quality 70). The full-size picture is "the original" below. Every number is measured against it, and the model never sees it. Each small picture was enlarged to about 2 MP and restored with the same seed, LoRA at 1.0, CFG 1, euler / simple. Nothing is done to the result afterwards.
| no LoRA, 8 steps | with it, 8 steps | no LoRA, 25 steps | with it, 25 steps | |
|---|---|---|---|---|
| how far the result sits from the original (worst corner, median) | 2.35 px | 0.26 px | 1.59 px | 0.15 px |
| the same, worst of the eight | 3.83 px | 0.38 px | 3.25 px | 0.26 px |
| close to the original (SSIM, 1 = identical) | 0.578 | 0.766 | 0.743 | 0.812 |
| PSNR | 23.2 dB | 28.0 dB | 26.3 dB | 29.3 dB |
| color and brightness shift | 2.05 % | 0.97 % | 1.72 % | 1.04 % |
| same face (face recognition, 1 = identical) | 0.821 | 0.905 | 0.837 | 0.901 |
| fine detail, against the original's | 121 % | 78 % | 58 % | 36 % |
The 8-step columns use Viggle Turbo. The 25-step columns do not.
29 more pictures, the same test at 8 steps: 0.28 px off with the LoRA against 2.16 px without (it moved less on all 29), same face 0.88 against 0.79 (closer on all 28 that have a face), color and brightness shift 0.94 % against 1.88 %, SSIM 0.777 against 0.611.
Every kind of damage. 57 held-out pairs, damaged the way the training pairs were, on pictures it never trained on. One pass, 8 steps, the normal request. SSIM is against the clean picture, px off is the median.
| kind of damage | pictures | SSIM, the damaged picture | SSIM, no LoRA | SSIM, with it | px off, no LoRA | px off, with it |
|---|---|---|---|---|---|---|
| small web picture | 15 | 0.772 | 0.524 | 0.716 | 2.53 | 0.31 |
| phone smoothing | 5 | 0.836 | 0.565 | 0.857 | 2.65 | 0.17 |
| video still | 5 | 0.771 | 0.578 | 0.745 | 2.77 | 0.50 |
| saved and re-saved | 5 | 0.816 | 0.560 | 0.794 | 2.21 | 0.24 |
| blur and noise | 5 | 0.496 | 0.521 | 0.678 | 2.48 | 0.24 |
| low-resolution JPEG | 5 | 0.777 | 0.531 | 0.763 | 3.16 | 0.23 |
| heavy mix | 5 | 0.735 | 0.646 | 0.746 | 1.28 | 0.25 |
| old print | 4 | 0.551 | 0.437 | 0.749 | 2.46 | 0.19 |
| banding | 4 | 0.915 | 0.463 | 0.843 | 2.34 | 0.17 |
| low-resolution PNG | 4 | 0.873 | 0.636 | 0.847 | 3.39 | 0.15 |
| all | 57 | 0.756 | 0.544 | 0.762 | 2.70 | 0.23 |
With the LoRA the result was closer to the clean picture than without it on all 57, and it moved less on all 57. On several kinds the damaged picture itself scores higher than any restore, because a soft picture is close on average.
Strength, on the 29 pictures above, without the LoRA / at 0.5 / at 0.75 / at 1.0: px off 2.16 / 1.31 / 0.37 / 0.28, same face 0.794 / 0.858 / 0.875 / 0.880, color and brightness shift 1.88 / 1.26 / 1.05 / 0.94 %, fine detail against the original's 102 / 81 / 77 / 72 %.
The step 1,250 file on the first test at 8 steps: 0.26 px, 0.750, 27.3 dB, same face 0.899, fine detail 108 %.
Drawings. It was trained on photos, and it holds on drawings too. On six test drawings (anime, a poster with lettering, watercolor, a 3D cartoon, manga, an oil painting), shrunk the same way, it kept the style and the lettering: SSIM 0.714 against 0.491 without the LoRA, 0.27 px off against 2.65.
I also put 12 portraits through three kinds of old phone and camera damage (36 pictures, colors matched back to the input afterwards). Same face was 0.76 without the LoRA and 0.85 with it. The damaged picture itself scores 0.84, so it sharpens these and keeps the person. It does not get closer to them than the damaged picture was.
Before I released this I ran the other tools I could find for the same job, on the same pictures, with the same measurements. They are not all built for the same thing. Some are made to add detail. This LoRA is made to stay on the picture. So the numbers answer one question: how close does the result stay to the original?
Tested on 2026-10-07:
Every number per picture is in comparison_numbers.csv.
29 small pictures, the same test as above: shrunk, saved as JPEG, restored at about 2 MP, 8 steps unless noted.
| off the original | same face | color and brightness shift | SSIM | |
|---|---|---|---|---|
| Qwen Image 2.1 alone | 2.16 px | 0.79 | 1.88 % | 0.611 |
| SeedVR2 | 0.42 px | 0.82 | 0.44 % | 0.771 |
| Deblur anything | 0.39 px | 0.85 | 1.42 % | 0.702 |
| Detail Enhancer, same graph as this LoRA | 2.07 px | 0.76 | 2.94 % | 0.673 |
| Detail Enhancer, its own workflow, 25 steps | 12.45 px | 0.71 | 4.16 % | 0.590 |
| this LoRA | 0.28 px | 0.88 | 0.94 % | 0.777 |


At 25 steps without Turbo, 13 of those pictures:
| off the original | same face | color and brightness shift | SSIM | |
|---|---|---|---|---|
| Qwen Image 2.1 alone | 2.09 px | 0.85 | 1.58 % | 0.793 |
| Detail Enhancer, same graph as this LoRA | 1.99 px | 0.79 | 3.20 % | 0.762 |
| Detail Enhancer, its own workflow | 12.32 px | 0.73 | 4.17 % | 0.655 |
| this LoRA | 0.17 px | 0.90 | 0.76 % | 0.860 |
Real photos. 31 real low-resolution photos (the 26 from the strength section and 5 more), one pass at about 2 MP, 8 steps. There is no sharp version of these, so each result is compared with its own input. Fine detail is against this LoRA at 1.0.
| same face | color and brightness shift | off the input | fine detail | |
|---|---|---|---|---|
| Qwen Image 2.1 alone | 0.85 | 3.93 % | 2.72 px | 2.5 x |
| SeedVR2 | 0.79 | 0.53 % | 0.28 px | 1.9 x |
| Detail Enhancer | 0.73 | 7.33 % | 2.85 px | 2.6 x |
| Deblur anything | 0.94 | 1.08 % | 0.33 px | 1.0 x |
| this LoRA at 0.5 | 0.91 | 2.25 % | 0.98 px | 1.6 x |
| this LoRA at 0.75 | 0.94 | 1.14 % | 0.33 px | 1.2 x |
| this LoRA at 1.0 | 0.94 | 0.88 % | 0.25 px | 1.0 x |
In tiles, to 4 and 8 MP. Seven pictures with grain, noise, heavy JPEG or half the size, through my Qwen Image 2.1 Tiled Upscale workflow. SeedVR2 ran at the same output size.
| same face | color and brightness shift | off the original | SSIM | time | |
|---|---|---|---|---|---|
| SeedVR2 | 0.87 | 0.67 % | 0.22 px | 0.813 | 7 s |
| Detail Enhancer, its own workflow (to 4 MP) | 0.70 | 4.21 % | 12.88 px | 0.551 | 66 s |
| tiles, no LoRA | 0.82 | 1.30 % | 0.89 px | 0.576 | 43 s |
| tiles, Detail Enhancer | 0.77 | 1.83 % | 0.58 px | 0.682 | 43 s |
| tiles, this LoRA | 0.88 | 0.72 % | 0.16 px | 0.793 | 40 s |


One seed per picture, one RTX 5090. If you make one of these tools and think I ran it wrong, tell me and I will run it again.
The first instruction above was on about two thirds of the training pairs. The others say the same thing in other words.
About 60 % of the captions also carried Scene: and a description of the clean picture, so you
can add one after the instruction. On an earlier run of this LoRA it made no measurable difference,
and a wrong description did harm: "an old man with a gray beard" painted stubble on a young woman.
The instruction alone is enough.
workflows/qwen-image-2.1-restore.json has it set up:
load your image and press Run. It is one pass at about 2 megapixels, with a Fast switch (8 steps
with Viggle Turbo, or 25 steps without it). It uses my nodes
(AusBoss, 2.8.0 or newer) and needs ComfyUI 0.38
or newer.
The same workflow is on the Civitai LoRA page, inside its example pictures.
For a result over 2 megapixels, my Qwen Image 2.1 Tiled Upscale workflow redraws the picture in tiles with this LoRA (AusBoss nodes 2.9.0 or newer). The pack's Upscale + Restore example is the same graph.
To add the LoRA to your own Qwen Image 2.1 edit graph:
image_1, resolution 0, and the
instruction as the prompt.latent output: CFG 1, euler / simple, denoise 1. 8 steps
with Viggle Turbo at 1.0, or 25 steps without it.Scene: plus a description of the
clean picture written by Qwen3-VL 8B. Caption dropout 0.arch: qwen_image_2, Comfy-Org INT8
convrot base, reference kept at the target's size (match_target_res), rank 32 / alpha 32,
AdamW8bit, LR 1e-4 constant, batch 1, shift timesteps, resolution: 1408 (targets of 1 to 2 MP
on the 32 px grid), a checkpoint every 250 steps.A LoRA for Qwen Image 2.1, which is released under the Qwen Research License; use of the base model, and of this LoRA with it, follows that license.