☁️BizyAir M-LSD Lines
Straight-edge detection for architecture and interiors
- image
- IMAGE
M-LSD (Mobile Line Segment Detection) does one specific thing and does it well: it finds straight lines in an image and nothing else. That's a narrower job than a general lineart or Canny extraction, but it's exactly the right narrowness for the scenes that trip up softer edge detectors, building facades, room interiors, furniture, anything with hard architectural geometry where you want the ControlNet condition to respect wall lines and edges precisely rather than treat them as suggestions.
Why you'd pick this over Canny or Lineart
Canny and lineart both extract edges generally, curves, texture boundaries, organic contours included. M-LSD deliberately ignores all of that and detects only line segments, so it produces a much sparser, cleaner map on a scene that's genuinely made of straight lines, and a nearly empty one on a scene that isn't. That's the tradeoff to keep in mind: this is not a general-purpose replacement for lineart, it's a specialist tool. Point it at a person or an organic subject and you'll get back mostly nothing useful; point it at an interior render or an architectural photo and it'll pick out exactly the structural lines you want a ControlNet to hold onto.
The controls
score_threshold (default 0.1) sets the confidence bar a detected line segment has to clear to make it into the output, raise it if the map is coming back cluttered with faint, spurious lines you don't want influencing the generation; lower it if genuine structural lines are getting dropped. dist_threshold (default 0.1) controls how aggressively nearby line segments get merged versus kept separate, useful for cleaning up a map where a single wall edge is coming through as several fragmented pieces. resolution is the standard preprocessing-size tradeoff, 512 by default, worth raising toward 1024 if your final generation is large.
Output is a single IMAGE, the extracted line map, feeding straight into whatever line-conditioned ControlNet loader your base workflow uses.
Wiring it up
M-LSD conditioning tends to sit well with looser weights than a full lineart pass, since the map itself is already sparse, you're usually asking the ControlNet to respect specific structural edges rather than dictate the whole composition. Start around 0.5-0.8 and adjust from there, and as with any structural condition, releasing ControlNet influence partway through the sampling steps rather than running it the whole way tends to give the model more room to fill in realistic detail on top of the held structure.
Installing it
Through ComfyUI Manager: search "BizyAir" and install, then restart. Or clone it directly:
cd ComfyUI/custom_nodes && git clone https://github.com/siliconflow/BizyAir.git
You'll need a BizyAir/SiliconFlow API key set up before this node executes, via the "click to login" prompt the README points to on first use. Signup runs through phone-number verification, and it's worth knowing in advance that some users outside China have reported friction there.
Common issues
An empty or near-empty output on a scene you expected structure from usually means score_threshold is set too high for that image, try lowering it before assuming the preprocessor missed something real. A cluttered, noisy map is the opposite problem and the opposite fix. Remember this node genuinely won't find much on organic, curve-heavy subjects, that's expected behavior, not a bug, reach for lineart or Canny instead if the scene isn't architectural.
As with every node in this pack, a run that stalls or fails outright with no clear workflow-level cause almost always traces back to the API key. Separately: if BizyAir shows up in your custom_nodes folder without you having installed it, that's a known ComfyUI Manager quirk (misresolving an unrelated missing-node error on an older shared workflow), not malware, and safe to remove through the Manager.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| score_thresholdopt | FLOAT | 0.100.01–2 | — |
| dist_thresholdopt | FLOAT | 0.100.01–20 | — |
| resolutionopt | INT | 51264–1024 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |