2025-12-19 06:11:54 +08:00
# Image-To-Image
2025-12-17 17:40:45 +08:00
2025-12-19 06:11:54 +08:00
Source <https://github.com/vllm-project/vllm-omni/tree/main/examples/online_serving/image_to_image>.
2025-12-17 17:40:45 +08:00
This example demonstrates how to deploy Qwen-Image-Edit model for online image editing service using vLLM-Omni.
2025-12-22 21:29:40 +08:00
For **multi-image** input editing, use **Qwen-Image-Edit-2509** (QwenImageEditPlusPipeline) and send multiple images in the user message content.
2025-12-17 17:40:45 +08:00
## Start Server
### Basic Start
```bash
vllm serve Qwen/Qwen-Image-Edit --omni --port 8092
```
2026-02-11 06:00:43 +08:00
!!! note
If you encounter Out-of-Memory (OOM) issues or have limited GPU memory, you can enable VAE slicing and tiling to reduce memory usage, --vae-use-slicing --vae-use-tiling
2025-12-22 21:29:40 +08:00
### Multi-Image Edit (Qwen-Image-Edit-2509)
```bash
vllm serve Qwen/Qwen-Image-Edit-2509 --omni --port 8092
```
2025-12-17 17:40:45 +08:00
### Start with Parameters
2025-12-19 06:11:54 +08:00
2025-12-17 17:40:45 +08:00
Or use the startup script:
```bash
bash run_server.sh
```
2025-12-22 21:29:40 +08:00
To serve Qwen-Image-Edit-2509 with the script:
```bash
MODEL = Qwen/Qwen-Image-Edit-2509 bash run_server.sh
```
2025-12-17 17:40:45 +08:00
## API Calls
### Method 1: Using curl (Image Editing)
```bash
# Image editing
bash run_curl_image_edit.sh input.png "Convert this image to watercolor style"
# Or execute directly
IMG_B64 = $( base64 -w0 input.png)
2026-01-04 20:45:28 +08:00
cat <<EOF > request.json
{
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "Convert this image to watercolor style"},
{"type": "image_url", "image_url": {"url": "data:image/png;base64,$IMG_B64"}}
]
}],
"extra_body": {
"height": 1024,
"width": 1024,
"num_inference_steps": 50,
"guidance_scale": 1,
"seed": 42
}
}
EOF
curl -s http://localhost:8092/v1/chat/completions -H "Content-Type: application/json" -d @request.json | jq -r '.choices[0].message.content[0].image_url.url' | cut -d',' -f2 | base64 -d > output.png
2025-12-17 17:40:45 +08:00
```
### Method 2: Using Python Client
```bash
python openai_chat_client.py --input input.png --prompt "Convert to oil painting style" --output output.png
2025-12-22 21:29:40 +08:00
# Multi-image editing (Qwen-Image-Edit-2509 server required)
python openai_chat_client.py --input input1.png input2.png --prompt "Combine these images into a single scene" --output output.png
2025-12-17 17:40:45 +08:00
```
### Method 3: Using Gradio Demo
```bash
python gradio_demo.py
# Visit http://localhost:7861
```
## Request Format
### Image Editing (Using image_url Format)
```json
{
"messages" : [
{
"role" : "user" ,
"content" : [
{ "type" : "text" , "text" : "Convert this image to watercolor style" },
{ "type" : "image_url" , "image_url" : { "url" : "data:image/png;base64,..." }}
]
}
]
}
```
### Image Editing (Using Simplified image Format)
```json
{
"messages" : [
{
"role" : "user" ,
"content" : [
{ "text" : "Convert this image to watercolor style" },
{ "image" : "BASE64_IMAGE_DATA" }
]
}
]
}
```
### Image Editing with Parameters
Use `extra_body` to pass generation parameters:
```json
{
"messages" : [
{
"role" : "user" ,
"content" : [
{ "type" : "text" , "text" : "Convert to ink wash painting style" },
{ "type" : "image_url" , "image_url" : { "url" : "data:image/png;base64,..." }}
]
}
],
"extra_body" : {
"height" : 1024 ,
"width" : 1024 ,
"num_inference_steps" : 50 ,
"guidance_scale" : 7.5 ,
"seed" : 42
}
}
```
2025-12-22 21:29:40 +08:00
### Multi-Image Editing (Qwen-Image-Edit-2509)
Provide multiple images in `content` (order matters):
```json
{
"messages" : [
{
"role" : "user" ,
"content" : [
{ "type" : "text" , "text" : "Combine these images into a single scene" },
{ "type" : "image_url" , "image_url" : { "url" : "data:image/png;base64,..." } },
{ "type" : "image_url" , "image_url" : { "url" : "data:image/png;base64,..." } }
]
}
]
}
```
2025-12-17 17:40:45 +08:00
## Generation Parameters (extra_body)
2025-12-19 06:11:54 +08:00
| Parameter | Type | Default | Description |
| ------------------------ | ----- | ------- | ------------------------------------- |
| `height` | int | None | Output image height in pixels |
| `width` | int | None | Output image width in pixels |
| `size` | str | None | Output image size (e.g., "1024x1024") |
| `num_inference_steps` | int | 50 | Number of denoising steps |
| `guidance_scale` | float | 7.5 | CFG guidance scale |
| `seed` | int | None | Random seed (reproducible) |
| `negative_prompt` | str | None | Negative prompt |
| `num_outputs_per_prompt` | int | 1 | Number of images to generate |
2025-12-17 17:40:45 +08:00
## Response Format
```json
{
"id" : "chatcmpl-xxx" ,
"created" : 1234567890 ,
"model" : "Qwen/Qwen-Image-Edit" ,
"choices" : [{
"index" : 0 ,
"message" : {
"role" : "assistant" ,
"content" : [{
"type" : "image_url" ,
"image_url" : {
"url" : "data:image/png;base64,..."
}
}]
},
"finish_reason" : "stop"
}],
"usage" : { ... }
}
```
## Common Editing Instructions Examples
2025-12-19 06:11:54 +08:00
| Instruction | Description |
| ---------------------------------------- | ---------------- |
| `Convert this image to watercolor style` | Style transfer |
| `Convert the image to black and white` | Desaturation |
| `Enhance the color saturation` | Color adjustment |
| `Convert to cartoon style` | Cartoonization |
| `Add vintage filter effect` | Filter effect |
| `Convert daytime scene to nighttime` | Scene conversion |
2025-12-17 17:40:45 +08:00
## File Description
2025-12-19 06:11:54 +08:00
| File | Description |
| ------------------------ | ---------------------------- |
| `run_server.sh` | Server startup script |
| `run_curl_image_edit.sh` | curl image editing example |
| `openai_chat_client.py` | Python client |
| `gradio_demo.py` | Gradio interactive interface |
2025-12-17 17:40:45 +08:00
## Example materials
??? abstract "gradio_demo.py"
``````py
2025-12-19 06:11:54 +08:00
--8<-- "examples/online_serving/image_to_image/gradio_demo.py"
2025-12-17 17:40:45 +08:00
` `````
??? abstract "openai_chat_client.py"
` `````py
2025-12-19 06:11:54 +08:00
--8<-- "examples/online_serving/image_to_image/openai_chat_client.py"
2025-12-17 17:40:45 +08:00
` `````
2026-01-06 22:32:46 +08:00
??? abstract "run_curl_image_edit.sh"
` `````sh
--8<-- "examples/online_serving/image_to_image/run_curl_image_edit.sh"
` `````
2025-12-17 17:40:45 +08:00
??? abstract "run_server.sh"
` `````sh
2025-12-19 06:11:54 +08:00
--8<-- "examples/online_serving/image_to_image/run_server.sh"
2025-12-17 17:40:45 +08:00
` `````