Tech Teardown · Vol.03

Balloon Fit Doesn't Come Out
as Balloon Fit

Our LoRA project started with this one sentence

What StyleRoom sells to sellers is "a photo of someone wearing this garment." Upload a photo of the clothing, and you get back an on-model shot.

These photos go on product detail pages, so there is one standard they have to meet. The garment in the photo has to match the real thing.

But with certain garments, the same thing kept happening.

01 · The Balloon

Balloon fit comes out as straight-leg
Three photos of black pants side by side. Left: the actual product, a balloon silhouette that swells at the thigh and curves inward at the hem. Center: the generated on-model shot, where the same pants became ordinary straight-leg pants. Right: the shot restored with Fine-tune, with the balloon curve back.
Actual productGenerated resultRestored with Fine-tune
On the left is the actual product. It balloons out at the thigh and the hem curves back in: a balloon (jar-shaped) silhouette. In the middle is an on-model shot made from that garment. The curve is gone, and it has turned into plain straight-leg pants.

The color is right. The fabric looks right. The length reaches the ankle, just as it should. Only the silhouette is wrong.

And it isn't wrong in a random direction. It drifted toward the most common kind of pants. The same thing happened again and again with cocoon silhouettes, ultra-wide legs and below-the-knee crops. Every time, an extreme shape converged into a moderate one.

Sellers spot this difference at a glance. And shape can't be offset by anything else: no matter how good the color and fabric are, if the silhouette is different, that shot doesn't get used.

02 · Never Seen

It can't draw clothes it has never seen

So why is it only the shape that goes off? The answer lies in what the model grew up looking at.

Large models learned the internet's average clothing. Most pants have straight side seams, a moderate leg width, and a silhouette that follows the body. Balloon, cocoon and ultra-wide are almost absent from that pool. These are shapes you only find at a handful of designer brands.

It isn't that the model can't draw them. It simply doesn't know them. It's like asking someone to pronounce a word that isn't in their dictionary. And that one fact explains everything else.

Why color and fabric work

Because they sit inside the average. Black sweatshirt fabric and elastic waistbands are everywhere on the internet. The model already knows them, so when you call for them, they show up.

🔴 Why it gets worse the more extreme the shape

The more extreme the shape, the fewer the examples. So the result gets pulled toward the closest thing the model does know. Ask for balloon and you get straight-leg; ask for ultra-wide and you get "reasonably wide." The middle photo above is exactly that kind of result.

03 · The Words Were There

It wasn't a lack of words

When the result is off, the first suspect is usually the description. So we opened up that garment's description. Its first sentence read like this.

A balloon (jar-shaped) fit that falls fully in a curved line from thigh to hem, creating a sculptural, striking avant-garde look.

Balloon, jar, curve, full (벌룬, 항아리, 곡선, 풍성): every word it needs is already there. This sentence was a draft written automatically by image analysis, and when the seller reviewed it, they didn't change a single character. In other words, it was a description a human agreed was correct.

The straight-leg pants above are what came out when we put that exact description in.

Words can only call up what is already there; they can't create what isn't. If the model has almost no visual prototype for balloon to point to, the word gets buried as one of twenty-odd description tokens. And a familiar shape fills the gap.

We should add that when a shot like this comes out, the way to rescue it already exists inside StyleRoom. With StyleRoom's Fine-tune feature, you select just the pants area and put the same sentence in again, and the curve comes back (the right-hand photo above). In a small area, the word doesn't get buried.

That path, though, only starts once the seller notices the mismatch, selects the area and re-enters the instruction. Every single output picks up that round trip.

04 · Show, Don't Tell

What the model doesn't know, you have to show it

If words don't work, the only way left is to teach by example. You pair photos of this brand's clothing with on-model shots of those same garments, show the model a number of them, and let it pick up the rule between them on its own.

There's one more reason this has to be training. Each brand needs a different answer. "Loose fit" means a different garment at every brand. At one it's dropped shoulders and wide sleeves; at another it's a roomy body with the shoulder line right where it normally sits. No matter how finely you split the vocabulary (oversized, semi-oversized, relaxed, balloon, cocoon), every new brand brings one more version of "loose fit."

What we need isn't a better description. It's something that exists separately for each brand.

05 · But We Can't Build Models

But we can't build a large model ourselves

Training being the answer doesn't mean any training will do. There's something we need to admit up front: we can't build an image generation model ourselves.

Here's who is in this game right now.

Built byModelWeights
OpenAIGPT Image · DALL·EClosed
GoogleImagen · Gemini imageClosed
MidjourneyMidjourneyClosed
AdobeFireflyClosed
ByteDanceSeedreamClosed
Black Forest LabsFLUXPartly open
Stability AIStable DiffusionOpen
AlibabaQwen-ImageOpen

These were built on internet-scale image data, running GPUs by the thousands for weeks at a time. We don't have that much data, that many GPUs, or the capital to support it. We can't catch up either: while we run for a year, they keep running too.

The bottom three in the table, however, have open weights. That means that even if we can't build them, we can take them and use them, and that's where a path opens up.

So the question becomes this: how do we take an open model and put something of our own on top of it? There are three ways, and the first two don't work.

1 · Keep explaining with prompts

That's the approach we just saw. It already fails on this very request: the request where we wrote "balloon" is the one that produced straight-leg pants. Words can't call up a shape the model doesn't know.

On top of that, nothing accumulates. Explain it a hundred times, and on the hundred-and-first you have to start over from scratch. You end up redoing, every time, something that fails every time.

2 · Retrain the whole model

We've got an open model, so why not just retrain the whole thing? That doesn't work either.

First come the practical walls. Retraining an entire model takes a matching amount of GPU power, every brand ends up with its own copy of a model weighing tens of GB, and while it learns new things, it forgets what it used to know. It learns balloon fit and then can't draw a shirt anymore.

The bigger problem, though, is how it gets taught.

Open up the entire model and teach it with a brand dataset of a few dozen garments, and the model won't bother looking for a rule. Memorizing those few dozen images outright is far easier.

It's like an exam covering 100 questions: if you can memorize every answer, nobody studies the underlying principles. It reproduces the garments in the training set perfectly, but with a garment it has never seen, it can't do anything. What we wanted was the rule "this brand uses this kind of curve." What we got was "that photo of those pants."

🔴 3 · Leave the image as is, change only the fit

Here we flip the question. The images large models produce are, honestly, mostly good. The color, fabric, lighting, background and pose are all at a level we could never build ourselves. Only one thing goes off: the silhouette.

In that case, there's no reason to rebuild the model. All we need is this one thing.

Could we keep everything it draws well, and swap in just this brand's fit?

Without touching the model as a whole, you write down only "this brand uses this kind of curve" on the side, and add just that when the image is drawn. That's LoRA (Low-Rank Adaptation), and it's the only one of the three that works. In the next section we'll look at how that's possible.

06 · What It Is

Leave the original alone and attach a correction note beside it

So how do you actually do "same image, just the fit"? Let's start with an analogy.

One very thick manual

Think of the model as a very thick manual on how to draw. Draw clothes like this, wrinkles like this, light like this: billions of lines of instructions like that. Rewriting all of it is the "retrain the whole thing" from the previous section, and that doesn't work.

So we don't change a single letter of the manual. Instead, we attach one thin correction note next to it. It's a sheet with only the differences on it, like "this brand's pants balloon out this much more, right here."

When drawing, the model reads the manual and the note together. It draws exactly by the manual, except for what the note says to do differently.

That's LoRA. The manual is W, the note is two sheets, A and B, and training writes only on the note.

W The original manual Billions of lines · as is Not a letter touched + s strength × B A Training writes only here Far thinner than the manual 450MB per file W + s·BA Manual + note = a model that knows this brand Combined at draw time
The manual on the left is never touched. Training writes only on the two note sheets in the middle, and when drawing, they are applied at strength s and combined. At s = 0 the note is ignored, so the output is identical to the original.

The note has three important properties.

1 · It starts out blank

Before training, the note has nothing written on it. So at first, the result is exactly the same as the original. As training goes on, it fills in line by line, and how much has been written is how much has been learned. We use this value later to check whether training is going well.

2 · You can decide how much to apply

When drawing, a single number sets how strongly the note is applied. This is called s (LoRA scale).

At s = 0 the note isn't read at all, so you get the original as is. At s = 1 it's applied exactly as written, and at s = 1.3 it's applied 1.3 times more strongly than written.

🔴 3 · The note has to be small

This is where the problem from the previous section turns around. If the note were as thick as the manual, it could copy down the training photos wholesale. And we'd be back to memorization.

If the note is thin, there's no room for that. It can't write down every one of the few dozen garments, so it ends up recording only what those garments have in common. That's exactly the "this brand's curve" we wanted.

Small isn't just cheap. Small is what makes it learn.

450MBSize of the note
for one brand
20Checkpoints saved
along one training run
5 hoursTime it takes
to train one brand

07 · Ownership

The same method splits two ways

There are two ways to make the note. And this choice changes the nature of the business.

Option A · Hand it to someone else's tuning service

Think of the tuning feature in Google's Vertex AI. You upload your data, and they adjust their model to fit you. It's convenient, and the results are good.

But the tuned result stays on their servers. We can call that model and use it, but we can't take it with us.

🔴 Option B · Take an open model and train it ourselves

We take a model with open weights, like the bottom three in the earlier table, and make the note on our own GPUs. It takes more work.

In return, the finished note file stays in our own storage. We choose it, we build it up, and we use it.

A · Tuning serviceB · Open model + LoRA
TrainingWorksWorks
Resulting weights🔴 Stay with themStay in our storage
Our data🔴 Makes their model betterBuilds up as our asset
Outcome🔴 We train the other side on our weaponThe gap builds up on our side

What "our weapon" means matters here. Large models learn from what has already piled up in the world. The clothes have to sell, the photos have to pile up, those photos have to become training data, and a training run has to happen before the model knows.

6-12 monthsTime for large models
to learn a new trend
2-3 monthsHow far ahead of the market
sellers bring us their clothes
8-15 monthsThe window in between
that only we have

Sellers bring their clothes to us before they sell. They shoot the samples, revise the descriptions and pick which shots to use. Every one of those actions is a judgment: "this is how this garment has to look to sell."

What large models will learn half a year from now, we receive today, straight from sellers' hands. What we have isn't a bigger model. It's earlier data. If we used that data to improve someone else's model, the advantage would disappear.

08 · Fit

It fits both things we want to build up

What we want to build up comes in two very different kinds. LoRA is a form that fits both.

Brand DNA: stable and cumulative

A brand's fit and silhouette rarely change. So per-brand adapters accumulate. The more garments come in, the better that brand's adapter gets, and the better it gets, the harder it is to move elsewhere. One file is one brand, so even at 100 brands there is still just one model.

Leading trends: fleeting and refreshed

What's hot now won't be hot in six months. So you have to train again and swap it out. With LoRA, training takes a few hours and the files are small, so swapping is realistic. If the setup required retraining the whole model, this axis would be flat-out impossible.

And this axis can't be caught up on later. What sellers brought in over the past six months won't appear just because you start collecting now. It's data made by time, and money can't bring it forward.

09 · Operationally

Two things this approach makes possible

Strategy aside, the note approach makes two things possible in day-to-day work. Without either of them, the experiments themselves wouldn't be possible.

1 · You can attach and detach the note

Draw without the note (s = 0) and you get the untrained original. Draw with it and you get the trained result.

That means you can generate "before training" and "after training" side by side, with the same garment, same background and same pose. Only one condition differs, so if there's a difference, it comes from the training.

Without this, even when the result looks good, you can't tell whether the training worked or that garment was just easy.

2 · You can keep several snapshots from mid-training

Because the note file is small, during training we save a copy of its intermediate state twenty times. A note that has learned a little, one that has learned about half, one that has learned all the way: twenty sheets in total.

When training is done, we try all twenty and pick the best one. There's no guarantee that the one trained to the very end is the best, and in practice there were cases where a middle one was better.

If we were retraining the whole model, we'd have to store twenty copies weighing tens of GB each, so this wouldn't be possible.

10 · The Handles

There are five values we get to set

These are the values a person sets when kicking off training. Let's go through what each one means.

max_pixels: how large the photos are when learning

This sets how many pixels of each photo the model looks at while learning. Photos larger than this are scaled down. Looking at them small makes learning faster but smudges fine detail like the weave of the fabric; looking at them large is slower but picks up that detail too.

step: how many times to revise

This is how many times the note gets revised. Think of it as the total amount of training. Too few and it learns less; more and it learns more, but past a certain point it actually gets worse (it starts memorizing).

s (scale): how strongly to apply the note

This is how strongly the finished note is applied when drawing. Since it's set after training is done, you can try different values without retraining.

r (rank): how many lines the note has

This is the thickness of the note. More lines let it record more, but too many let it copy down the training garments wholesale, so memorization gets easier. It has to be reasonably thin so that it only records what they have in common.

lr: how big each revision is

This is how big a change each revision of the note makes. Big changes learn fast but overshoot; small changes are stable but take a long time.

Here's how these five have behaved in our experiments so far.

ValueIn our experiments
max_pixelsChanged the results the most
stepThere's a best range; go past it and results get worse
sChanging it didn't change the results
rFixed at 32. We also ran 64 but didn't keep a comparison
lrWe've never set it. It runs on the default

11 · Step

Training means revising the note, bit by bit

Let's look at how training actually proceeds.

We show the model a few photos of clothing and have it try drawing them. We compare against the answer (the real on-model shot) and revise the note a little by however much it was off. One round of this is 1 step.

Show it every garment you have once, and that's 1 epoch. The same garments are shown over and over, much like a person working through the same problem book several times.

How long it actually takes

Show 155 garments 16 times each and you get 2,480 steps. Each step takes about 8 seconds, so 5 hours in total.

If the model learns from photos twice as large, each step takes longer. Once training is done, the time to generate one image also goes up from 90 seconds to 140 seconds.

🔴 This is where we got fooled once

When we first trained on small photos, the results were best at around 1,375 steps. So when we retrained with photos twice as large, we figured we'd just look around the same point.

But the results at that point were terrible. With larger photos there is more to take in at once, so at the same number of steps, the model had learned far less.

We kept it running, and it kept improving even past 2,000 steps. "Same number of steps, so it must have learned about the same" turned out to be wrong.

12 · How Far

How to measure how much it has learned

So how do you know how much it has learned at any given point? Earlier we said the note starts out blank. That means how much is written on the note is how much has been learned.

Add up the size of all the numbers written on the note into a single value, and it grows as training goes on. The point where that value stops rising and levels off was usually the point where the results were best.

That said, this is "how much was written," not "how well it was written." It may have written a lot of the wrong thing. So we use this value only as a signal that says "time to look at the results around here," and decide good or bad by looking at the generated images with our own eyes.

Wrap-up

In one line

Balloon Fit Doesn't Come Out as Balloon Fit. It isn't because the description falls short: every word it needed was already written, and a human had even reviewed it. The large model has almost never seen clothes like that, so it got pulled toward the closest shape it knows.

What the model doesn't know, you have to show it. But we can neither build a large model nor catch up with one. So we take it as it is and put what only we know on top of it.

LoRA is not a way to beat large models, but a way to use them while keeping something of our own. We see, every day, the clothes large models don't know. Turn those clothes into notes, and they build up in our own storage.

This is the direction StyleRoom is heading. Large models will keep getting better, and that's good news for us. We just put our notes on top of better images.

Meanwhile, we keep adding one note for each brand. Every time a seller brings in a new garment, that note gets thicker, and the thicker it gets, the harder it is for anyone else to imitate. We borrow the model, but what builds up on top of it is ours.