sylviaHoch commited on
Commit
f71bf9c
·
verified ·
1 Parent(s): f461bf3

Upload folder using huggingface_hub

Browse files
Files changed (4) hide show
  1. .gitattributes +35 -35
  2. README.md +150 -3
  3. config.json +51 -0
  4. 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