✨ Skin Retouching AI (OreX)
A Skin Smoother That Isn't a Diffusion Pass — Use It Gently
- image
- mask
- result
Ask "how do I remove acne from a high-res photo" in any SD forum and you get the same three answers: img2img at low denoise (which re-rolls the face), a dedicated inpaint checkpoint (which leaves marks on skin), or Photoshop's healing brush (not in your pipeline). This node is the fourth answer. It's not diffusion at all - it's a small ModelScope UNet trained for exactly one job, wrapped with a strength dial, so nothing about your subject gets re-rolled.
Where it earns its place: real photos of real people, and generated portraits where you want a specific patch of skin cleaned up without burning an inpaint pass. Where it bites: crank it and you get the thing this whole ecosystem complains about, because too-smooth skin is the single most-cited giveaway that an image isn't a photo. Point it at the problem; don't leave it at 1.0.
How it works
The node wraps damo/cv_unet_skin_retouching_torch (revision v1.0.2) through ModelScope's skin-retouching-torch pipeline. The model finds the face itself - you're not sending it a crop - and returns the retouched frame. The node flips the channel order back, resizes the result to your input's dimensions if they disagree, applies density, then blends: output = original × (1 − amount) + retouched × amount. Without a mask, amount is just strength. With one, amount becomes strength × mask per pixel, so the effect fades with your mask instead of switching on at a hard edge.
Weights land in ComfyUI/models/modelscope/, deliberately not inside the pack and not in ModelScope's global ~/.cache/modelscope. Clearing the global cache doesn't trigger a re-download; deleting models/modelscope/ does. The pipeline is cached on the class, so it loads once per session - the first run after a restart is download-and-load slow, everything after that isn't.
The inputs that matter
image- required. This is a face-and-skin network, so if the face in your frame is 200 pixels tall, crop in first with whatever crop node you like; you're otherwise pushing a lot of pixels through a model that only cares about a small region.strength(0–1, default 1.0) - the dial that decides whether this looks like retouching or like a beauty filter. The author's tooltip: "1.0 = full model effect, lower is softer." For blemish rescue on a photo, 0.6–1.0 is defensible. On an AI-generated portrait, start at 0.35 and go up only if you mean it - at full strength on already-smooth synthetic skin you're cosplaying a skincare ad.density(−0.2 to 0.2, default 0) - brightness compensation, applied only inside the affected area. The model sometimes comes back a touch brighter than the original; negative values darken it back.mask(optional) +mask_feather(0–150, default 15). The mask restricts where the effect lands; feather Gaussian-blurs its edge by that many pixels. The tooltip here is the best guidance you'll get, and it's the author being straight with you: since the model finds the face on its own, a whole-face mask drawn with some margin is fine - but the moment your mask boundary runs across skin (only the cheek, not the jaw), feathering isn't optional. Skip it and you'll see exactly where your mask ended.- Output:
result, one IMAGE. No mask passthrough, no saved file - it's not an output node, so put a Preview or Save Image after it.
Installing it
Manager, search comfyui-OreX (Orex Nodes), or:
cd ComfyUI/custom_nodes
git clone https://github.com/orex2121/comfyui-OreX
Restart, and note that requirements.txt includes modelscope - the pip library this node needs - pulled in along with Pillow, soundfile, pydub and pyloudnorm. The first execution downloads weights from modelscope.cn (Alibaba's hub, the same place Wan and Qwen-Image first-party weights come from), so it needs network access at that moment.
One genuinely nice property: this node is plain Python with ordinary widgets and no custom JavaScript - the least fragile thing in a pack that otherwise ships hundreds of kilobytes of hand-drawn node canvases, the class of node that gets broken when ComfyUI changes its frontend.
Where it goes wrong
ModuleNotFoundError: No module named 'modelscope'. The dependency didn't install - run pip install -r requirements.txt from the pack folder or reinstall through Manager.
First run looks frozen. It's downloading weights and building the pipeline. Watch the console rather than killing the queue.
Everything looks plasticky, or the face looks "corrected". That's strength at or near 1.0. Back it off. This is the node's own biggest failure mode, and it's the same failure the whole photorealism conversation is about.
A visible edge where the retouching stops. Increase mask_feather. If the boundary crosses skin at all, treat feathering as required rather than nice-to-have.
You wired a mask and the effect hit the whole image anyway. Two known paths. A completely black mask is treated as "no mask" on purpose - an empty mask almost always means nothing was painted, not "edit nothing". And a mask whose shape the node can't make sense of is ignored with a console warning (unexpected mask shape ... ignoring mask) instead of crashing. If the whole face got retouched, read the console before rewiring.
A batch of 24 images feels like a batch of 24. The node loops the model one image at a time; there's no batched inference. Fine for a portrait, noticeable on a folder.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Исходное изображение. / Source image. | |
| strength | FLOAT | 1.000–1 | Сила эффекта: смешивание оригинала с результатом нейросети. 1.0 = полный эффект модели, ниже — мягче. / Effect strength: blends the original with the neural network's result. 1.0 = full model effect, lower is softer. |
| density | FLOAT | 0.00-0.2–0.2 | Компенсация яркости результата (модель иногда делает картинку чуть светлее оригинала). Отрицательные значения притемняют, применяется только в зоне эффекта. / Brightness compensation for the result (the model sometimes makes the image slightly brighter than the original). Negative values darken; only applied within the affected area. |
| maskopt | MASK | Ограничивает эффект областью маски. / Restricts the effect to the mask's area. | |
| mask_featheropt | INT | 150–150 | Растушёвка края маски. Модель сама определяет лицо, поэтому при выделении лица целиком маску можно выделять с запасом — но при выделении только части лица (граница маски проходит по коже), растушёвка обязательна, иначе будет заметен перепад. / Feathers the mask edge. The model detects the face itself, so when selecting the whole face the mask can be drawn with margin — but when selecting only part of the face (the mask border crosses skin), feathering is essential, or a visible seam will appear. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| result | IMAGE | — |