Instructions to use mnmly/scalelsd-mlx with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use mnmly/scalelsd-mlx with MLX:
# Download the model from the Hub pip install huggingface_hub[hf_xet] huggingface-cli download --local-dir scalelsd-mlx mnmly/scalelsd-mlx
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Atomic Chat
ScaleLSD โ MLX weights
MLX-format weights for ScaleLSD, converted for use with mlx-swift-ScaleLSD on Apple Silicon.
These are converted redistributions of the original checkpoints published at 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
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:
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
StdConv2dSamere-standardises its weight on every forward pass; inference weights are frozen, so the standardised tensor is stored directly. (Note: the hybrid ViT useseps=1e-8, not the class default1e-6.) - conv + BatchNorm folded. The 16
conv(bias=False) -> BatchNorm2dpairs in DPT'sResidualConvUnit_customcollapse into single biased convolutions. nn.Sequentialindices 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.
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. 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.
@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},
}
Quantized
Model tree for mnmly/scalelsd-mlx
Base model
cherubicxn/scalelsd