Text-to-Image
Diffusers
Safetensors
English
sar
synthetic-aperture-radar
remote-sensing
stable-diffusion
controlnet
image-generation
synthetic-data
ship-detection
earth-observation
sentinel-1
Instructions to use sylviaHoch/SAR-ControlNet with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Diffusers
How to use sylviaHoch/SAR-ControlNet with Diffusers:
pip install -U diffusers transformers accelerate
from diffusers import ControlNetModel, StableDiffusionControlNetPipeline controlnet = ControlNetModel.from_pretrained("sylviaHoch/SAR-ControlNet") pipe = StableDiffusionControlNetPipeline.from_pretrained( "fill-in-base-model", controlnet=controlnet ) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- Draw Things
- DiffusionBee
Upload folder using huggingface_hub
Browse files- .gitattributes +35 -35
- README.md +150 -3
- config.json +51 -0
- diffusion_pytorch_model.safetensors +3 -0
.gitattributes
CHANGED
|
@@ -1,35 +1,35 @@
|
|
| 1 |
-
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
-
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
-
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
-
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
-
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
|
@@ -1,3 +1,150 @@
|
|
| 1 |
-
---
|
| 2 |
-
license: cc-by-nc-sa-4.0
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: cc-by-nc-sa-4.0
|
| 3 |
+
language:
|
| 4 |
+
- en
|
| 5 |
+
library_name: diffusers
|
| 6 |
+
pipeline_tag: text-to-image
|
| 7 |
+
tags:
|
| 8 |
+
- sar
|
| 9 |
+
- synthetic-aperture-radar
|
| 10 |
+
- remote-sensing
|
| 11 |
+
- stable-diffusion
|
| 12 |
+
- controlnet
|
| 13 |
+
- image-generation
|
| 14 |
+
- synthetic-data
|
| 15 |
+
- ship-detection
|
| 16 |
+
- earth-observation
|
| 17 |
+
- sentinel-1
|
| 18 |
+
---
|
| 19 |
+
|
| 20 |
+
# SAR ControlNet
|
| 21 |
+
|
| 22 |
+
## Overview
|
| 23 |
+
|
| 24 |
+
**ControlNet** for spatially controlled synthesis of **Sentinel-1 SAR** images.
|
| 25 |
+
Published alongside the paper **"Diffusion-Based SAR Training Data Synthesis Controlled by Spatial Annotations"** (GCPR 2026).
|
| 26 |
+
|
| 27 |
+
This model must be used together with the corresponding Stable Diffusion backbone:
|
| 28 |
+
[`sylviaHoch/SAR-StableDiffusion`](https://huggingface.co/sylviaHoch/SAR-StableDiffusion)
|
| 29 |
+
|
| 30 |
+
Spatial control is provided via three-channel one-hot masks (water / ship / land), enabling precise placement of ships in the generated SAR images.
|
| 31 |
+
|
| 32 |
+
---
|
| 33 |
+
|
| 34 |
+
## Database
|
| 35 |
+
The ControlNet was trained on the training set of **OpenSARShip Ship Detection Dataset (OSSDD)** [[dataset]](https://huggingface.co/datasets/sylviaHoch/OpenSARShip-Ship-Detection-Dataset), a Sentinel-1 dataset with 15,161 patches (700 × 700 px) and 64,640 ships, providing rotated bounding boxes (RBBs) and land–water masks. Text captions used during ControlNet training depend on land coverage: open-water patches are captioned *"An aerial view of ships on open water."*, patches with land (> 5 % of pixels) *"An aerial view of a coastal area with ships on the water."* During training, 512 × 512 crops are extracted, amplitude values converted to dB and linearly mapped to `[-1, 1]`.
|
| 36 |
+
|
| 37 |
+
## Architecture
|
| 38 |
+
|
| 39 |
+
| Component | Details |
|
| 40 |
+
|---|---|
|
| 41 |
+
| Type | ControlNet (based on SD 1.5 UNet) |
|
| 42 |
+
| Control input — ship + land | Three-channel one-hot mask `(3, H, W)` — ch0: background, ch1: ship, ch2: land |
|
| 43 |
+
| Required backbone | [`sylviaHoch/SAR-StableDiffusion`](https://huggingface.co/sylviaHoch/SAR-StableDiffusion) |
|
| 44 |
+
|
| 45 |
+
---
|
| 46 |
+
|
| 47 |
+
## Repository Structure
|
| 48 |
+
|
| 49 |
+
```text
|
| 50 |
+
SAR-ControlNet/
|
| 51 |
+
├── config.json
|
| 52 |
+
└── diffusion_pytorch_model.safetensors
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
---
|
| 56 |
+
|
| 57 |
+
## Usage
|
| 58 |
+
|
| 59 |
+
This model can be used directly with the 🤗 [diffusers](https://github.com/huggingface/diffusers) ControlNet pipeline. It requires the corresponding Stable Diffusion backbone ([`sylviaHoch/SAR-StableDiffusion`](https://huggingface.co/sylviaHoch/SAR-StableDiffusion)).
|
| 60 |
+
|
| 61 |
+
**Requirements:**
|
| 62 |
+
- `torch`
|
| 63 |
+
- `diffusers`
|
| 64 |
+
- `peft`
|
| 65 |
+
|
| 66 |
+
**Control input:** The control image must be a three-channel, one-hot encoded mask of size **512 × 512**, i.e. a tensor of shape `(3, 512, 512)` with values in `{0, 1}`. Each pixel is assigned to exactly one class across the three channels:
|
| 67 |
+
|
| 68 |
+
- **Channel 0:** water
|
| 69 |
+
- **Channel 1:** ship (represented as rotated bounding box/ minimal enclosing rectangle)
|
| 70 |
+
- **Channel 2:** land
|
| 71 |
+
|
| 72 |
+
**Output:** `image` is a `torch.Tensor` of shape `(N, C, H, W)` with values in the range `[0, 1]` and dtype `float32`, where `N` is the batch size (here `1`), `C` the number of channels (here `1`, single-channel SAR amplitude), and `H` and `W` the native model resolution.
|
| 73 |
+
|
| 74 |
+
```python
|
| 75 |
+
import torch
|
| 76 |
+
from diffusers import ControlNetModel, StableDiffusionControlNetPipeline, UniPCMultistepScheduler
|
| 77 |
+
from peft import PeftModel
|
| 78 |
+
|
| 79 |
+
SD_MODEL_ID = "sylviaHoch/SAR-StableDiffusion"
|
| 80 |
+
CN_MODEL_ID = "sylviaHoch/SAR-ControlNet"
|
| 81 |
+
|
| 82 |
+
# control_image: torch.Tensor of shape (3, 512, 512), one-hot encoded
|
| 83 |
+
# channel 0: water, channel 1: ship, channel 2: land
|
| 84 |
+
|
| 85 |
+
controlnet = ControlNetModel.from_pretrained(CN_MODEL_ID, torch_dtype=torch.float16)
|
| 86 |
+
|
| 87 |
+
pipeline = StableDiffusionControlNetPipeline.from_pretrained(
|
| 88 |
+
SD_MODEL_ID,
|
| 89 |
+
controlnet=controlnet,
|
| 90 |
+
torch_dtype=torch.float16
|
| 91 |
+
).to("cuda")
|
| 92 |
+
|
| 93 |
+
# Load LoRA text-encoder adapter
|
| 94 |
+
pipeline.text_encoder = PeftModel.from_pretrained(
|
| 95 |
+
pipeline.text_encoder,
|
| 96 |
+
SD_MODEL_ID,
|
| 97 |
+
subfolder="adapter_text_encoder"
|
| 98 |
+
)
|
| 99 |
+
|
| 100 |
+
pipeline.scheduler = UniPCMultistepScheduler.from_config(pipeline.scheduler.config)
|
| 101 |
+
|
| 102 |
+
# Generate
|
| 103 |
+
image = pipeline(
|
| 104 |
+
"An aerial view of ships on open water.",
|
| 105 |
+
control_image,
|
| 106 |
+
num_inference_steps=50,
|
| 107 |
+
guidance_scale=7.5,
|
| 108 |
+
controlnet_conditioning_scale=1.0,
|
| 109 |
+
output_type="pt"
|
| 110 |
+
).images
|
| 111 |
+
```
|
| 112 |
+
|
| 113 |
+
---
|
| 114 |
+
|
| 115 |
+
## Intended Use
|
| 116 |
+
|
| 117 |
+
- Spatially controlled synthesis of Sentinel-1 SAR training data.
|
| 118 |
+
- Ship placement guided by spatial annotations.
|
| 119 |
+
- Training data generation or data augmentation for ship detection models.
|
| 120 |
+
|
| 121 |
+
## Limitations
|
| 122 |
+
|
| 123 |
+
- Tuned specifically to **Sentinel-1** sensor characteristics (in particular Sentinel-1 GRD products in VH polarization).
|
| 124 |
+
- Training scenes are limited to harbour, coastal, and open water scenes.
|
| 125 |
+
- Generated images are synthetic and may not fully capture all real SAR image properties.
|
| 126 |
+
|
| 127 |
+
---
|
| 128 |
+
|
| 129 |
+
## Citation
|
| 130 |
+
|
| 131 |
+
If you use this model, please cite:
|
| 132 |
+
|
| 133 |
+
```bibtex
|
| 134 |
+
@inproceedings{sar_diffusion_gcpr2026,
|
| 135 |
+
title = {Diffusion-Based SAR Training Data Synthesis Controlled by Spatial Annotations},
|
| 136 |
+
booktitle = {German Conference on Pattern Recognition (GCPR)},
|
| 137 |
+
year = {2026},
|
| 138 |
+
note = {accepted, to be published},
|
| 139 |
+
authors = {}
|
| 140 |
+
}
|
| 141 |
+
```
|
| 142 |
+
|
| 143 |
+
---
|
| 144 |
+
|
| 145 |
+
## License
|
| 146 |
+
|
| 147 |
+
This model is released under **CC BY-NC-SA 4.0**.
|
| 148 |
+
Commercial use is not permitted. Derivatives must be shared under the same license.
|
| 149 |
+
See [LICENSE](https://creativecommons.org/licenses/by-nc-sa/4.0/) for details.
|
| 150 |
+
```
|
config.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"_class_name": "ControlNetModel",
|
| 3 |
+
"_diffusers_version": "0.36.0.dev0",
|
| 4 |
+
"act_fn": "silu",
|
| 5 |
+
"addition_embed_type": null,
|
| 6 |
+
"addition_embed_type_num_heads": 64,
|
| 7 |
+
"addition_time_embed_dim": null,
|
| 8 |
+
"attention_head_dim": 8,
|
| 9 |
+
"block_out_channels": [
|
| 10 |
+
320,
|
| 11 |
+
640,
|
| 12 |
+
1280,
|
| 13 |
+
1280
|
| 14 |
+
],
|
| 15 |
+
"class_embed_type": null,
|
| 16 |
+
"conditioning_channels": 3,
|
| 17 |
+
"conditioning_embedding_out_channels": [
|
| 18 |
+
16,
|
| 19 |
+
32,
|
| 20 |
+
96,
|
| 21 |
+
256
|
| 22 |
+
],
|
| 23 |
+
"controlnet_conditioning_channel_order": "rgb",
|
| 24 |
+
"cross_attention_dim": 768,
|
| 25 |
+
"down_block_types": [
|
| 26 |
+
"CrossAttnDownBlock2D",
|
| 27 |
+
"CrossAttnDownBlock2D",
|
| 28 |
+
"CrossAttnDownBlock2D",
|
| 29 |
+
"DownBlock2D"
|
| 30 |
+
],
|
| 31 |
+
"downsample_padding": 1,
|
| 32 |
+
"encoder_hid_dim": null,
|
| 33 |
+
"encoder_hid_dim_type": null,
|
| 34 |
+
"flip_sin_to_cos": true,
|
| 35 |
+
"freq_shift": 0,
|
| 36 |
+
"global_pool_conditions": false,
|
| 37 |
+
"in_channels": 4,
|
| 38 |
+
"layers_per_block": 2,
|
| 39 |
+
"mid_block_scale_factor": 1,
|
| 40 |
+
"mid_block_type": "UNetMidBlock2DCrossAttn",
|
| 41 |
+
"norm_eps": 1e-05,
|
| 42 |
+
"norm_num_groups": 32,
|
| 43 |
+
"num_attention_heads": null,
|
| 44 |
+
"num_class_embeds": null,
|
| 45 |
+
"only_cross_attention": false,
|
| 46 |
+
"projection_class_embeddings_input_dim": null,
|
| 47 |
+
"resnet_time_scale_shift": "default",
|
| 48 |
+
"transformer_layers_per_block": 1,
|
| 49 |
+
"upcast_attention": false,
|
| 50 |
+
"use_linear_projection": false
|
| 51 |
+
}
|
diffusion_pytorch_model.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1e89f9a3711fdde52116811a065d1b9a0e17bacf10aa6ca3d0ce3e573f227c72
|
| 3 |
+
size 1445157120
|