File size: 4,037 Bytes
8a5b198
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
---
license: apache-2.0
base_model:
  - cherubicxn/scalelsd
tags:
  - mlx
  - mlx-swift
  - line-segment-detection
  - wireframe-parsing
pipeline_tag: image-feature-extraction
library_name: mlx
---

# ScaleLSD — MLX weights

MLX-format weights for [ScaleLSD](https://github.com/ant-research/scalelsd), converted for use
with [**mlx-swift-ScaleLSD**](https://github.com/mnmly/mlx-swift-ScaleLSD) on Apple Silicon.

These are **converted redistributions** of the original checkpoints published at
[cherubicxn/scalelsd](https://huggingface.co/cherubicxn/scalelsd). No retraining or
fine-tuning was performed — the numerical content of the network is unchanged.

## Contents

| folder | LayerScale | parameters | source checkpoint |
|---|---|---|---|
| `scalelsd-vitbase-v1/` | no | 122,525,833 | `scalelsd-vitbase-v1-train-sa1b.pt` |
| `scalelsd-vitbase-v2/` | yes | 122,544,265 | `scalelsd-vitbase-v2-train-sa1b.pt` |

Each folder holds `config.json` + `model.safetensors`. Upstream recommends **v2** by default.

## Usage

```swift
import MLXScaleLSD

// Downloads from this repo on first use, then caches locally.
let directory = try await ModelStore.download(.v2)
let session = try ScaleLSDSession.load(directory: directory)

let image = try ScaleLSDSession.loadImage(at: imageURL)
let result = try session.detect(image)
for segment in result.segments(minimumScore: 10) {
    print(segment.x1, segment.y1, segment.x2, segment.y2, segment.score)
}
```

Or from the command line:

```bash
scalelsd detect -m <directory> -i image.jpg -e png --save-to out/
```

## What was changed in conversion

The original checkpoints are PyTorch pickles, which MLX cannot read. `Scripts/convert.py` in
the Swift repo performs a format conversion plus several inference-only graph simplifications,
each of which is numerically equivalent (verified to ~2e-6 relative against the PyTorch
reference):

- **Weight standardisation baked in.** timm's `StdConv2dSame` re-standardises its weight on
  every forward pass; inference weights are frozen, so the standardised tensor is stored
  directly. (Note: the hybrid ViT uses `eps=1e-8`, not the class default `1e-6`.)
- **conv + BatchNorm folded.** The 16 `conv(bias=False) -> BatchNorm2d` pairs in DPT's
  `ResidualConvUnit_custom` collapse into single biased convolutions.
- **`nn.Sequential` indices renamed** to named submodules, so keys read structurally.
- **Conv weights transposed** from PyTorch `(O, I, kH, kW)` to MLX `(O, kH, kW, I)`.
- **The 1000-class ImageNet classifier head dropped** — ScaleLSD never calls it.

## Accuracy

Verified stage by stage against the PyTorch reference. The final 9-channel HAT field matches to
**1.1e-05** (v1) / **1.4e-05** (v2) maximum relative error. End-to-end on `assets/indoor.jpg`:

| | v1 | v2 |
|---|---|---|
| junctions matched within 0.01 px | 512/512 | 511/512 |
| segments matched within 0.01 px | 1879/1880 | 1581/1590 |

Detections are not bit-exact by construction: the 512-junction cap and the nearest-junction
assignment are discrete choices that a sub-noise perturbation can flip. See
[docs/PARITY.md](https://github.com/mnmly/mlx-swift-ScaleLSD/blob/main/docs/PARITY.md).

## Performance

Apple M5 Max, 512×512 input, Release build, median of 20 runs:

| runtime | per image |
|---|---|
| mlx-swift (this port) | **57 ms** |
| PyTorch 2.13, MPS | 88 ms |
| PyTorch 2.13, CPU | 652 ms |

## License and attribution

Apache-2.0, inherited from the original checkpoints at
[cherubicxn/scalelsd](https://huggingface.co/cherubicxn/scalelsd). The upstream ScaleLSD source
is MIT (Copyright © 2023 Nan Xue). Original work and all model credit belong to the ScaleLSD
authors; this repository contributes only a format conversion.

```bibtex
@inproceedings{ScaleLSD,
    title = {ScaleLSD: Scalable Deep Line Segment Detection Streamlined},
    author = {Zeran Ke and Bin Tan and Xianwei Zheng and Yujun Shen and Tianfu Wu and Nan Xue},
    booktitle = {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
    year = {2025},
}
```