mirror of
https://github.com/leejet/stable-diffusion.cpp.git
synced 2026-11-11 11:26:34 +00:00
144 lines
7.4 KiB
Markdown
144 lines
7.4 KiB
Markdown
# ADetailer
|
||
|
||
`sd-cli` can run a YOLOv8 object detector on an existing or newly generated
|
||
image, and `sd-server` can run it after image generation. Both perform a cropped
|
||
inpaint pass for every detected object. The implementation supports YOLOv8
|
||
detection checkpoints. YOLOv8 segmentation and MediaPipe models are not
|
||
supported yet.
|
||
|
||
## Convert a detector
|
||
|
||
Ultralytics checkpoints must be converted before use. The converter fuses
|
||
BatchNorm into convolution layers and writes a safetensors file with the weight
|
||
names expected by the native GGML implementation.
|
||
|
||
```bash
|
||
python scripts/convert_yolov8_to_safetensors.py face_yolov8n.pt face_yolov8n.safetensors
|
||
```
|
||
|
||
The converter requires Python packages `ultralytics`, `torch`, and
|
||
`safetensors`.
|
||
Only YOLOv8 detection checkpoints are accepted.
|
||
PyTorch checkpoints use pickle internally, so only convert `.pt` files from a
|
||
trusted source.
|
||
|
||
## Repair an existing image
|
||
|
||
Use the dedicated `adetailer` mode to detect and repair objects in an existing
|
||
image:
|
||
|
||
```bash
|
||
./bin/sd-cli \
|
||
-M adetailer \
|
||
-m model.safetensors \
|
||
-i input.png \
|
||
-o repaired.png \
|
||
-p "detailed portrait photo" \
|
||
--negative-prompt "deformed face" \
|
||
--steps 24 \
|
||
--cfg-scale 6 \
|
||
--strength 0.4 \
|
||
--sampling-method dpm++2m \
|
||
--scheduler karras \
|
||
--ad-model face_yolov8n.safetensors \
|
||
--extra-ad-args "confidence=0.3,inpaint_padding=32,mask_blur=4"
|
||
```
|
||
|
||
This mode reuses the normal image-generation options for the detail pass:
|
||
|
||
- `--init-img`, `--output`, `--prompt`, and `--negative-prompt`
|
||
- `--steps`, `--cfg-scale`, `--sampling-method`, and `--scheduler`
|
||
- `--strength`, `--seed`, LoRA settings, VAE tiling, and backend assignments
|
||
- `--width` and `--height`, which also resize the input when specified
|
||
|
||
`--ad-prompt` and `--ad-negative-prompt` optionally override the normal prompts.
|
||
Values provided in `--extra-ad-args`, such as `steps`, `cfg_scale`,
|
||
`denoising_strength`, or `inpaint_width`, take precedence over inherited values.
|
||
|
||
## Repair generated images
|
||
|
||
ADetailer can also run automatically after normal image generation:
|
||
|
||
```bash
|
||
./bin/sd-cli \
|
||
-m model.safetensors \
|
||
-p "portrait photo" \
|
||
--ad-model face_yolov8n.safetensors \
|
||
--ad-prompt "[PROMPT], detailed face" \
|
||
--ad-negative-prompt "" \
|
||
--extra-ad-args "confidence=0.3,denoising_strength=0.4,inpaint_width=512,inpaint_height=512"
|
||
```
|
||
|
||
The same options can be supplied when starting `sd-server`. When `--ad-model` is set, its detector runs after OpenAI-compatible and native asynchronous image generation. SDAPI requests enable ADetailer through `alwayson_scripts`, as described below. If no object is detected, the original image is returned unchanged. RGBA output keeps its original alpha channel, including when detected regions are repaired. Detector initialization or detail-pass failures are reported as request failures.
|
||
|
||
Server image-generation requests limit base, hires, and detail-pass dimensions to 4096 pixels per side. ADetailer step overrides are limited to 1–100; `steps=0` in `extra_ad_args` keeps inheriting the main generation steps. These limits also apply to inherited dimensions and `extra_ad_args` overrides. Requests exceeding the limits return a parameter error before generation. CLI limits are unchanged.
|
||
|
||
### SDAPI requests
|
||
|
||
`/sdapi/v1/txt2img` and `/sdapi/v1/img2img` accept the WebUI ADetailer argument format:
|
||
|
||
```json
|
||
{
|
||
"prompt": "portrait photo",
|
||
"alwayson_scripts": {
|
||
"ADetailer": {
|
||
"args": [true, false, {
|
||
"ad_model": "face_yolov8n.pt",
|
||
"ad_prompt": "[PROMPT], detailed face",
|
||
"ad_use_steps": true,
|
||
"ad_steps": 20
|
||
}]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
The detector must be configured at server startup with `--ad-model`. `ad_model` must match that file's basename; the original `.pt` basename is also accepted for a converted detector. Requests cannot load arbitrary detector paths. Omitting the script, setting its first argument to `false`, selecting `"None"`, or setting `ad_tab_enable` to `false` disables detailing. Dictionary-only argument arrays are also accepted. Multiple enabled dictionaries run in order using the configured detector.
|
||
|
||
Supported settings include prompts, confidence, mask filtering by area or confidence, mask count and area ratios, dilation/erosion, offsets, mask merging/inversion, blur, denoising strength, masked or full-image inpainting, padding, and optional overrides for inpaint dimensions, steps, CFG, sampler/scheduler, and CLIP skip. The corresponding `ad_use_*` flags control whether overrides apply. Otherwise dimensions, steps, CFG, sampler, scheduler, and CLIP skip inherit the main request. Denoising strength defaults to `0.4`. Pixel mask settings are limited to the larger output dimension, with a minimum limit of 32 and a maximum of 16384 pixels.
|
||
|
||
Model/VAE switching, non-default noise multipliers, face restoration, ControlNet, and skipping the initial img2img pass are not supported; active requests for these features return an error. Unknown settings and invalid active values also return errors. During detailing, `/sdapi/v1/progress` remains active with an `adetailer` job; its percentage and preview stay fixed until detailing finishes.
|
||
|
||
An empty ADetailer prompt inherits the main prompt. `[PROMPT]` inserts the main
|
||
prompt, `[SEP]` assigns different prompts to consecutive masks, and `[SKIP]`
|
||
skips the corresponding mask.
|
||
|
||
All settings other than the detector path and prompts are passed through
|
||
`--extra-ad-args` as a comma-separated `key=value` list:
|
||
|
||
| Key | Default | Description |
|
||
| --- | ---: | --- |
|
||
| `input_size` | `640` | Square YOLO input size; must be a multiple of 32 |
|
||
| `confidence` | `0.3` | Detection confidence threshold |
|
||
| `nms` | `0.45` | NMS IoU threshold |
|
||
| `max_detections` | `100` | Maximum detections retained after NMS |
|
||
| `mask_k_largest` | `0` | Keep only the largest K masks; zero keeps all |
|
||
| `mask_filter_method` | `area` | Rank retained masks by `area` or `confidence` |
|
||
| `mask_min_ratio` | `0` | Minimum bbox area relative to the image |
|
||
| `mask_max_ratio` | `1` | Maximum bbox area relative to the image |
|
||
| `dilate_erode` | `4` | Positive values dilate; negative values erode |
|
||
| `x_offset`, `y_offset` | `0` | Mask offset in pixels; positive Y moves upward |
|
||
| `mask_mode` | `none` | `none`, `merge`, or `merge_invert` |
|
||
| `merge_masks`, `invert_mask` | `false` | Boolean alternatives to `mask_mode` |
|
||
| `mask_blur` | `4` | Final composite feather radius |
|
||
| `inpaint_padding` | `32` | Padding around the detected region |
|
||
| `inpaint_only_masked` | `true` | Crop to the detected region; `false` uses the full image with the detection mask |
|
||
| `inpaint_width`, `inpaint_height` | mode-specific | `512x512` after generation; input/output size in `adetailer` mode |
|
||
| `denoising_strength` | mode-specific | `0.4` after generation; inherits `--strength` in `adetailer` mode |
|
||
| `steps` | `0` | Detail steps; zero inherits the main generation |
|
||
| `cfg_scale` | `-1` | Detail CFG; a negative value inherits the main generation |
|
||
| `sample_method` | inherited | Detail sampler name |
|
||
| `scheduler` | inherited | Detail scheduler name |
|
||
| `sort_by` | `none` | `none`, `left_to_right`, `center_to_edge`, or `area` |
|
||
|
||
Multiple masks are processed serially. Each completed inpaint becomes the input
|
||
for the next mask, and the seed is incremented by the mask index. Use
|
||
`mask_mode=merge` to process all detections in one inpaint pass.
|
||
|
||
The detector uses the `detector` backend module. For example, keep detection on
|
||
the CPU while diffusion runs on CUDA:
|
||
|
||
```bash
|
||
--backend "diffusion=cuda0,detector=cpu"
|
||
```
|