<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: LeGo build</title>
    <description>The latest articles on DEV Community by LeGo build (@dlss).</description>
    <link>https://dev.to/dlss</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4137297%2Fc1accfdd-1f58-4763-90e7-182aaff45969.jpeg</url>
      <title>DEV Community: LeGo build</title>
      <link>https://dev.to/dlss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dlss"/>
    <language>en</language>
    <item>
      <title>From Photos to Brick Designs: 2D Mosaics, 3D Models, and Buildability</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Thu, 08 Oct 2026 03:43:25 +0000</pubDate>
      <link>https://dev.to/dlss/from-a-photo-to-a-brick-mosaic-a-local-first-python-pipeline-1ok6</link>
      <guid>https://dev.to/dlss/from-a-photo-to-a-brick-mosaic-a-local-first-python-pipeline-1ok6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; This article was written by an AI assistant and checked against the linked source code and a local test run. The open-source 2D mosaic repository and the separate browser-based 3D website are different projects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9paoy0vdqqh4n2tc8pi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9paoy0vdqqh4n2tc8pi.png" alt="Image2LEGO concept collage: pets, places and original worlds" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fypzqktn89qqejv6cwr47.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fypzqktn89qqejv6cwr47.gif" alt="Animated concept gallery of pet, city, castle and original mecha themes" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;These are original concept illustrations for subject ideas—not screenshots of generated output or verified physical builds.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A photo of a dog, a portrait, a city street, a landscape, or a sketch of an imaginary machine can all be a starting point for a brick design. But the interesting engineering question is not “can AI draw it with studs?” It is what information the design actually contains: an editable model, a parts estimate, steps, and the unresolved checks between a digital proposal and a physical build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Many subjects, different design problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;People and portraits:&lt;/strong&gt; preserve a recognizable silhouette and facial cues while simplifying colors and small details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pets and other animals:&lt;/strong&gt; balance recognizable pose against thin legs, tails and unsupported shapes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buildings and vehicles:&lt;/strong&gt; a single photo hides back surfaces and structure; perspective can distort proportions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Landscapes:&lt;/strong&gt; turn continuous terrain, water and foliage into layers that still read clearly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Original worlds:&lt;/strong&gt; imaginative references are useful, but a plausible image is not automatically a feasible model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So “almost any subject can start the process” is a creative invitation, not a claim that every input produces a ready-to-assemble set. To make the distinction concrete, I use a small, auditable 2D mosaic pipeline below, then explain the separate 3D workflow and the checks it still needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reproducible 2D baseline
&lt;/h2&gt;

&lt;p&gt;A brick-looking image and a usable brick plan are different things. An image model can paint plausible studs without telling you which grid cells are occupied, how many pieces you need, or whether a color can actually be bought. For a flat mosaic, a small deterministic pipeline is often a better starting point than asking a generative model to invent the whole result.&lt;/p&gt;

&lt;p&gt;This local-first Python implementation turns an image into a grid, a preview, a printable pattern and an &lt;em&gt;approximate&lt;/em&gt; parts count. It does &lt;strong&gt;not&lt;/strong&gt; claim to produce a physically verified build.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reproducible example
&lt;/h2&gt;

&lt;p&gt;The repository includes a rocket illustration and a generated mosaic:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fciabhu1vmxk3fc76dije.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fciabhu1vmxk3fc76dije.gif" alt="Animated storyboard of the actual rocket input and 2D mosaic" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This animation uses the repository’s actual input illustration and 2D mosaic; it is not a 3D product demo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuo0ulfuc8lgm6fqr8pht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuo0ulfuc8lgm6fqr8pht.png" alt="Input rocket illustration" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcrolw6x07hqjtdgcp0gb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcrolw6x07hqjtdgcp0gb.png" alt="32 by 32 brick mosaic preview" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this post, the included CLI was run on that source image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brickmosaic examples/rocket.png &lt;span class="nt"&gt;--width&lt;/span&gt; 32 &lt;span class="nt"&gt;--max-colors&lt;/span&gt; 10 &lt;span class="nt"&gt;-o&lt;/span&gt; output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The run reported a &lt;strong&gt;32 × 32 grid, 1,024 occupied cells and 10 colors&lt;/strong&gt;. The 1,024 figure describes this opaque example image; it is not a general result for photos with transparent backgrounds. The project's 11 automated tests also passed in the local environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four decisions that make the output inspectable
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Normalize and sample the image
&lt;/h3&gt;

&lt;p&gt;The loader applies EXIF orientation before converting to RGBA. The image is then resized to the requested grid dimensions with Pillow's BOX resampling. If height is omitted, it follows the source aspect ratio. Width and height are each limited to 1–128 studs so an accidental input does not create a huge pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Treat transparency as an empty cell
&lt;/h3&gt;

&lt;p&gt;A cell below the configurable alpha threshold becomes &lt;code&gt;None&lt;/code&gt; in the grid. That sounds minor, but it means a transparent PNG can produce a shaped mosaic instead of a solid rectangular background. Optional local background removal is available for photographs, but segmentation is fallible: a model can remove a thin antenna or keep part of the background. A transparent image with a clean cutout is the more predictable input.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Match colors in Lab space, then limit the palette
&lt;/h3&gt;

&lt;p&gt;Raw RGB distance is a poor proxy for perceived color difference. The implementation converts sRGB to CIE Lab (D65) and selects nearest palette entries using squared Delta E 1976 distance. It first assigns each opaque cell to the full palette, chooses the most frequent &lt;code&gt;max_colors&lt;/code&gt; entries, then reassigns every opaque cell within that smaller set.&lt;/p&gt;

&lt;p&gt;That two-pass step is important: merely dropping less frequent colors would leave holes or inconsistent counts. The palette is an approximate visual reference, &lt;strong&gt;not&lt;/strong&gt; a certified catalogue of manufacturer part/color combinations.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Export data as well as a preview
&lt;/h3&gt;

&lt;p&gt;The pipeline writes &lt;code&gt;mosaic.png&lt;/code&gt;, &lt;code&gt;pattern.svg&lt;/code&gt;, &lt;code&gt;parts.csv&lt;/code&gt; and &lt;code&gt;plan.json&lt;/code&gt;. The PNG is for a quick look; the numbered SVG is more useful at a workbench. CSV and JSON let you inspect totals and build your own downstream tooling. A test checks that the CSV count and JSON total agree with the grid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI helps—and where it does not
&lt;/h2&gt;

&lt;p&gt;Optional AI background removal runs locally through U²-Net's &lt;code&gt;u2netp&lt;/code&gt; variant. The first AI run downloads model weights; the input image is processed on the user's machine. The segmentation result is only a mask, not a proof of correct bricks or parts availability. The core resize, color assignment and exports are deterministic and work without the AI extra.&lt;/p&gt;

&lt;p&gt;A flat 1×1-stud grid still needs a suitable base, real color/part availability checks, and human review. It says nothing about legal connections, load-bearing support or assembly order for a 3D object. Those claims should stay separate instead of calling every brick-style picture “buildable.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The jump to a 3D proposal
&lt;/h2&gt;

&lt;p&gt;A 2D grid records visible cells. A 3D design must additionally decide depth, hidden surfaces, connections, support, parts and assembly order. Those choices vary by subject: a pet needs pose and support; a building needs walls and a roof; a landscape needs readable terrain layers. One image alone cannot establish every unseen surface.&lt;/p&gt;

&lt;p&gt;The separate Image2LEGO browser workflow accepts a reference image and presents an &lt;strong&gt;editable 3D brick-model proposal&lt;/strong&gt;, with model inspection, steps, a parts view and export options. That makes it a broader starting point for portraits, pets, architecture, landscapes and original concepts. It does not mean every proposed connection is legal, stable, or stocked in real colors. Review the model and parts before buying anything.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/wangsheng1991/brickmosaic-ai" rel="noopener noreferrer"&gt;open-source 2D implementation&lt;/a&gt; contains the CLI, example images and tests. For a &lt;strong&gt;separate browser-based 3D proposal workflow&lt;/strong&gt;, see the &lt;a href="https://image2lego.com/photo-to-bricks/" rel="noopener noreferrer"&gt;photo-to-bricks guide&lt;/a&gt;. That website is not the source code of the 2D repository, and its digital proposals also need manual buildability checks before anyone buys parts.&lt;/p&gt;

&lt;p&gt;Which subject would you try first—and what would you validate before calling its digital proposal a real build?&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>tutorial</category>
      <category>ai</category>
    </item>
    <item>
      <title>Qwen-Image-2.1 on public prompts: the 4/7 was protocol, not capability</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Fri, 25 Sep 2026 05:08:10 +0000</pubDate>
      <link>https://dev.to/dlss/qwen-image-21-on-public-prompts-the-47-was-protocol-not-capability-411a</link>
      <guid>https://dev.to/dlss/qwen-image-21-on-public-prompts-the-47-was-protocol-not-capability-411a</guid>
      <description>&lt;p&gt;There is one sentence in Qwen-Image-2.1's official README that is very easy to scroll past: &lt;strong&gt;use the official prompt-rewriting models to expand short prompts into detailed descriptions&lt;/strong&gt;. In our first round, we followed none of it.&lt;/p&gt;

&lt;p&gt;That produced an awkward result: asked to draw "a photo of two clocks" using GenEval's original prompt text, it drew one clock. The two other models on the same machine, same card, same seed went 7 for 7.&lt;/p&gt;

&lt;p&gt;The point of this article is that &lt;strong&gt;the 4/7 was not a capability ceiling — it was the way we were feeding the model&lt;/strong&gt; — and that chasing this down explains why the advertised numbers and hands-on experience disagree.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6bbbhxo8bdz2lf6r2ka.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6bbbhxo8bdz2lf6r2ka.gif" alt="The live report page: the headline, the four summary numbers and the nine-domain table" width="560" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Most of the gap is about &lt;em&gt;protocol&lt;/em&gt;, not about the model.&lt;/p&gt;

&lt;p&gt;The recommended pipeline is three things stacked: &lt;strong&gt;prompt rewriter + 2048² + 40 steps&lt;/strong&gt;. Round one used &lt;strong&gt;raw short prompts + 1024² + 20 steps&lt;/strong&gt; — none of the three. Rewrite the prompts into enhancer-style long descriptions and &lt;strong&gt;both object-dropping failures pass immediately&lt;/strong&gt;, at the same resolution, the same seed, on the same machine, with the prompt as the only variable that moved.&lt;/p&gt;

&lt;p&gt;Two things follow. First, this model does not eat terse requests: GenEval's prompts are written for automated scorers and happen to be the worst-case input for the recommended pipeline. Second, estimating your real experience from a leaderboard score means ignoring a whole set of pipeline defaults that sit in between.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round one
&lt;/h2&gt;

&lt;p&gt;Three models on one machine, one GPU, one prompt set: the text is verbatim from public benchmarks (GenEval / DPG-Bench / LongText-Bench), same seed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Qwen-Image-2.1&lt;/th&gt;
&lt;th&gt;SenseNova-U1.5&lt;/th&gt;
&lt;th&gt;FLUX.2-klein-KV&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shape&lt;/td&gt;
&lt;td&gt;7B DiT + Qwen3-VL text encoder, RGBA VAE&lt;/td&gt;
&lt;td&gt;8B+8B MoT, 8 steps&lt;/td&gt;
&lt;td&gt;9B distilled + INT4 KV, 4 steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1024² per image (median)&lt;/td&gt;
&lt;td&gt;52.1 s (20 steps)&lt;/td&gt;
&lt;td&gt;9.8 s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.6 s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2048² per image&lt;/td&gt;
&lt;td&gt;102–111 s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;not supported (≤1536)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text rendering · char accuracy&lt;/td&gt;
&lt;td&gt;74.6%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.5%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;40.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text rendering · line hits&lt;/td&gt;
&lt;td&gt;25/35&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;26/35&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4/35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chinese long text, line hits&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;18/20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;18/20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0/20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;English long text, line hits&lt;/td&gt;
&lt;td&gt;7/15&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8/15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4/15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GenEval compositional (7)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4/7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7/7&lt;/td&gt;
&lt;td&gt;7/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DPG-Bench long description (4)&lt;/td&gt;
&lt;td&gt;2 good / 2 flawed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 good&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 good&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native transparent RGBA&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✅ unique&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The three-way contact sheet:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3kvmtgynwc6h2yfytyec.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3kvmtgynwc6h2yfytyec.jpg" alt="GenEval three-way" width="800" height="1530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qwen's three failures are specific: &lt;code&gt;a photo of two clocks&lt;/code&gt; drew one clock; &lt;code&gt;a photo of a purple wine glass and a black apple&lt;/code&gt; dropped the apple entirely; &lt;code&gt;a photo of a bench&lt;/code&gt; collapsed structurally at 1024².&lt;/p&gt;

&lt;p&gt;It also owns two categories outright. &lt;strong&gt;Chinese long text: 18/20 line hits, level with SenseNova&lt;/strong&gt;, where FLUX scores 0/20 — its Chinese comes out as a solid block of garbage. And &lt;strong&gt;native transparent RGBA is Qwen-only&lt;/strong&gt;; if you need cut-out assets, that alone decides the choice.&lt;/p&gt;

&lt;p&gt;One failure mode worth remembering: on dense small text, Qwen &lt;strong&gt;invents entire blocks of plausible-looking fake words&lt;/strong&gt;. A chalkboard menu comes out neatly laid out and, up close, entirely fabricated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the gap actually comes from
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source of the gap&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Missing prompt rewriter; raw short prompts used&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;largest&lt;/td&gt;
&lt;td&gt;ablation fixes 2/2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Incommensurable metrics&lt;/strong&gt;: vendor composite vs per-prompt pass rate&lt;/td&gt;
&lt;td&gt;large&lt;/td&gt;
&lt;td&gt;their board is a total with no GenEval / DPG split&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Different opponent&lt;/strong&gt;: INT4 4-step distill vs full FLUX&lt;/td&gt;
&lt;td&gt;medium&lt;/td&gt;
&lt;td&gt;the klein-KV we ran against is not on that board&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sampling and scoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;medium&lt;/td&gt;
&lt;td&gt;1 image/prompt, single seed; judged by eye, not Mask2Former&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resolution / steps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;large for structural failures, small for text&lt;/td&gt;
&lt;td&gt;bench: broken at 1K, fine at 2K; long-text scores flat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The second row is worth spelling out: the "small model, big performance" claim rests on &lt;strong&gt;Qwen-Image-Bench, a self-published *composite total&lt;/strong&gt;&lt;em&gt;, with **no GenEval or DPG breakdown&lt;/em&gt;* — it is not commensurable with "4 of 7 prompts passed".&lt;/p&gt;

&lt;p&gt;The official README, meanwhile, is explicit:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For best results, we recommend using the official &lt;strong&gt;prompt rewriting models&lt;/strong&gt; to expand short prompts into detailed, high-quality descriptions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and states its defaults plainly: &lt;code&gt;num_inference_steps = 40&lt;/code&gt;, &lt;code&gt;2048 × 2048&lt;/code&gt;. &lt;strong&gt;Round one followed none of them.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ablation: only the prompt changes
&lt;/h3&gt;

&lt;p&gt;Same machine, same GPU, &lt;strong&gt;2048², 20 steps, seed 42&lt;/strong&gt;. The only change is rewriting GenEval's original text into an enhancer-style long description.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnuq8mjpzkj6n718yvr5s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnuq8mjpzkj6n718yvr5s.jpg" alt="Only the prompt changed" width="800" height="618"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;a photo of two clocks&lt;/code&gt; → original text &lt;strong&gt;still draws one clock&lt;/strong&gt;; long description → &lt;strong&gt;exactly two&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;a photo of a purple wine glass and a black apple&lt;/code&gt; → apple missing with the original; long description → &lt;strong&gt;both present, colours bound correctly&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One caveat must travel with this: the right-hand descriptions were &lt;strong&gt;hand-written in the enhancer's style&lt;/strong&gt;, and are &lt;strong&gt;not&lt;/strong&gt; real output from the official rewriter (a fine-tuned Qwen3.5-VL 9B checkpoint we never deployed). So the result shows that prompt &lt;em&gt;form&lt;/em&gt; matters enormously — not that the official rewriter would necessarily recover the score.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do not treat 2K/40 steps as a cure
&lt;/h3&gt;

&lt;p&gt;Re-running the four long-text prompts with the official recipe (2048²/40 steps), with SenseNova at 2048² as a control:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LongText-Bench prompt&lt;/th&gt;
&lt;th&gt;Qwen 1024²/20 steps&lt;/th&gt;
&lt;th&gt;Qwen 2048²/40 steps (official)&lt;/th&gt;
&lt;th&gt;SenseNova 2048²&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;English chalkboard menu&lt;/td&gt;
&lt;td&gt;20.5% · 2/7&lt;/td&gt;
&lt;td&gt;13.7% · 3/7&lt;/td&gt;
&lt;td&gt;63.4% · 3/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;English festival poster&lt;/td&gt;
&lt;td&gt;94.4% · 4/5&lt;/td&gt;
&lt;td&gt;80.6% · 2/5&lt;/td&gt;
&lt;td&gt;73.3% · 1/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chinese slide&lt;/td&gt;
&lt;td&gt;81.5% · 12/12&lt;/td&gt;
&lt;td&gt;81.1% · 12/12&lt;/td&gt;
&lt;td&gt;76.9% · 11/12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chinese festival poster&lt;/td&gt;
&lt;td&gt;90.2% · 3/5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98.6% · 4/5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;97.3% · 4/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;mean (char accuracy · line hits)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;71.7% · 72.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;68.5% · 72.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;77.7% · 65.5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Text rendering did not improve, and the cost is 172 s/image against 52 s/image at 1024²/20 steps.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An honest qualifier: OCR is not fully comparable across resolutions (smaller, more decorative type at 2K — the poster's 94.4% → 80.6% is the font style eating it), so the fair reading is &lt;strong&gt;"no measurable gain"&lt;/strong&gt;, not "2K is worse".&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Structural&lt;/em&gt; failures, on the other hand, really are a configuration problem — the bench that collapsed at 1024² is fine at 2048²:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyoiyi1hsuq74ljwhsq9s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyoiyi1hsuq74ljwhsq9s.jpg" alt="2K re-test" width="799" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So keep the two goals apart: for compositional prompts the lever is prompt rewriting, not resolution; for correct text the lever is the model, and more steps buy nothing.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A second prompt set: 26 vertical prompts
&lt;/h2&gt;

&lt;p&gt;Public leaderboards measure general capability, which does not answer &lt;em&gt;"which model should take this job"&lt;/em&gt;. So we wrote our own: &lt;strong&gt;9 domains, 26 prompts&lt;/strong&gt;, each carrying its own checkpoints, every model at two sizes (a uniform 1024² for cross-model comparison, plus each model's recommended size) — &lt;strong&gt;156 images&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;th&gt;Key finding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Architecture · exterior&lt;/td&gt;
&lt;td&gt;any of the three&lt;/td&gt;
&lt;td&gt;SenseNova 1024 and FLUX 1536 &lt;strong&gt;hallucinate large signage on glass curtain walls&lt;/strong&gt;; Qwen does not&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture · interior&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SenseNova&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Most stable light layering. At 1024² Qwen drops mood constraints: a night bedroom comes out as daylight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portrait&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;SenseNova&lt;/strong&gt; (close-ups) / any (group)&lt;/td&gt;
&lt;td&gt;The elderly close-up shows the biggest gap: SenseNova is photographic, Qwen visibly smoother&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App · UI&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SenseNova&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The only one that renders a correct Chinese UI already at 1024²&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product · e-commerce&lt;/td&gt;
&lt;td&gt;any of the three&lt;/td&gt;
&lt;td&gt;Qwen missed "two bottles" at 1024², but its label text is the most accurate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Game · icons&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Qwen&lt;/strong&gt; (single icon)&lt;/td&gt;
&lt;td&gt;Single icons are commercial-grade from all three; &lt;strong&gt;"12 style-consistent line icons" breaks all three&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anime · 2D&lt;/td&gt;
&lt;td&gt;Qwen / SenseNova (FLUX out)&lt;/td&gt;
&lt;td&gt;On the Chinese poster both write title, subtitle, slot and studio correctly; FLUX garbles the whole block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comic · storyboard&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SenseNova&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Four-panel comic: only it puts each Chinese line &lt;strong&gt;in its own panel&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Illustration · picture book&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SenseNova&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chinese ink-wash: Qwen comes out too faint at both sizes — the negative space swallows the mountains&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The App·UI group is the clearest proof that you cannot pick a model from a leaderboard:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl5rsihqfctq3wvefr6go.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl5rsihqfctq3wvefr6go.jpg" alt="App UI contact sheet" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At 1024² Qwen &lt;strong&gt;shrinks the whole mockup into a small block in the middle with ghosting&lt;/strong&gt;, recovering only at 2048² (line hits 5/12 → 11/12, char accuracy 63.0% → 86.4%). SenseNova is 12/12 at that size to begin with.&lt;/p&gt;

&lt;p&gt;The four-panel comic shows the other thing — on one image, two metrics say different things:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9hsvl8s23ehfmxbjik0u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9hsvl8s23ehfmxbjik0u.jpg" alt="Comic contact sheet" width="799" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qwen &lt;strong&gt;writes all four lines&lt;/strong&gt; (4/4 line hits) but &lt;strong&gt;attaches them to the wrong panels&lt;/strong&gt; and mixes in garbled characters, so char accuracy is 34.8%. SenseNova is 100% · 4/4. &lt;strong&gt;Hit rate answers "was the sentence written", char accuracy answers "are the characters right" — this prompt needs both.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Latency
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Median of the first 18 prompts&lt;/th&gt;
&lt;th&gt;Qwen-Image-2.1&lt;/th&gt;
&lt;th&gt;SenseNova-U1.5&lt;/th&gt;
&lt;th&gt;FLUX.2-klein-KV&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1024²&lt;/td&gt;
&lt;td&gt;53.2 s&lt;/td&gt;
&lt;td&gt;9.8 s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.5 s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;native size&lt;/td&gt;
&lt;td&gt;113.1 s (2048²)&lt;/td&gt;
&lt;td&gt;13.2 s (2048²)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;3.8 s&lt;/strong&gt; (1536²)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 8 vertical prompts &lt;strong&gt;added later are not in this table and must not be compared&lt;/strong&gt;: card 3 was held by a render-farm job while they ran, so the Qwen arm moved to a borrowed card and used the more memory-frugal &lt;code&gt;sequential&lt;/code&gt; offload mode throughout — 97 s at 1024² / 208 s at 2048², roughly 2× round one's &lt;code&gt;model&lt;/code&gt; mode. Offload only changes when weights are staged in and out, not the sampling math, so image quality is unaffected at the same seed, but &lt;strong&gt;the timings are not comparable&lt;/strong&gt;, hence excluded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations — read these with the numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One image per prompt, single seed.&lt;/strong&gt; A spot check, not a leaderboard score; at n=4–7 a single prompt is ±14%.&lt;/li&gt;
&lt;li&gt;Compositional and long-description prompts were judged &lt;strong&gt;by eye&lt;/strong&gt;, not by GenEval's Mask2Former or DPG's mPLUG+CLIP.&lt;/li&gt;
&lt;li&gt;The ablation's long descriptions are hand-written stand-ins, &lt;strong&gt;not&lt;/strong&gt; real rewriter output.&lt;/li&gt;
&lt;li&gt;The three models &lt;strong&gt;did not run the same step count&lt;/strong&gt; (Qwen 20 / SenseNova 8 / FLUX 4) — "best configuration", not "equal budget".&lt;/li&gt;
&lt;li&gt;The 26 vertical prompts are &lt;strong&gt;self-authored&lt;/strong&gt;, not a public benchmark; same one-image-per-prompt caveat.&lt;/li&gt;
&lt;li&gt;The FLUX arm is an &lt;strong&gt;INT4 4-step distilled deployment&lt;/strong&gt;, not the full FLUX 2 Pro / Max on that leaderboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you only want the verdict
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Renders / portraits / UI mockups / comic panels&lt;/strong&gt; → SenseNova, and it is usable at 1024², more than 5× faster than Qwen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anime posters with a big Chinese title, or transparent-background PNGs&lt;/strong&gt; → Qwen; it owns both&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compositionally complex scenes in Qwen&lt;/strong&gt; → turn on prompt rewriting first; do not ask with a terse sentence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strictly consistent multi-element sets&lt;/strong&gt; (12 icons, say) → none of the three; plan on post-processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not estimate real output quality from a leaderboard total&lt;/strong&gt; — a whole set of pipeline defaults sits in between&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prompt text, every generated image, timings and OCR scores are public in &lt;a href="https://github.com/wangsheng1991/qwen-image-2.1-bench" rel="noopener noreferrer"&gt;qwen-image-2.1-bench&lt;/a&gt;, alongside an &lt;a href="https://wangsheng1991.github.io/qwen-image-2.1-bench/" rel="noopener noreferrer"&gt;HTML report&lt;/a&gt; and the &lt;a href="https://github.com/wangsheng1991/qwen-image-2.1-bench/tree/main/scripts" rel="noopener noreferrer"&gt;reproduction scripts&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/QwenLM/Qwen-Image-2.1/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/blog/prompt-rewrite-ablation.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/blog/prompt-rewrite-ablation.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;raw.githubusercontent.com — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/qwen-image-2.1-bench/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Picking an image model is not the expensive part&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The useful lesson here is not which model won. It is that the same model scores differently depending on how you feed it — between a leaderboard total and the job on your desk sits a whole set of pipeline defaults. If the job is an interior render, that step is already done for you: RenVi turns one room photo and one style description into a finished render, with the model, resolution and step count handled server-side.&lt;/p&gt;

&lt;p&gt;Upload a room photo, get one render free: &lt;a href="https://www.houseplusplus.com/?ref=qwen-image-2-1-bench" rel="noopener noreferrer"&gt;https://www.houseplusplus.com/?ref=qwen-image-2-1-bench&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>image</category>
      <category>benchmark</category>
    </item>
    <item>
      <title>An ID photo spec table where every number carries the sentence it came from</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Thu, 24 Sep 2026 02:42:04 +0000</pubDate>
      <link>https://dev.to/dlss/an-id-photo-spec-table-where-every-number-carries-the-sentence-it-came-from-2map</link>
      <guid>https://dev.to/dlss/an-id-photo-spec-table-where-every-number-carries-the-sentence-it-came-from-2map</guid>
      <description>&lt;h2&gt;
  
  
  What it solves
&lt;/h2&gt;

&lt;p&gt;The photo you hand in with a document application is a pile of millimetre figures.&lt;/p&gt;

&lt;p&gt;The two most common Russian formats are 3 × 4 cm — medical records, student IDs, passes, military IDs — and 35 × 45 mm, for passports and visa paperwork. It sounds simple until you actually have to crop one: how tall is the head, how much space above it, how white is the background, how many pixels are enough?&lt;/p&gt;

&lt;p&gt;Search for any of those and every page gives a different answer.&lt;/p&gt;

&lt;p&gt;Not because anyone is careless, but because these numbers live in sources of different ages that copy each other: a government page states one part, a photo studio's instructions state another, a visa agency copies both and rewords one. There is no way to tell which figure has a source behind it and which is something a person typed in passing.&lt;/p&gt;

&lt;p&gt;So I did something deliberately dumb: &lt;strong&gt;every number carries the sentence it appeared in.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdtae16msb2hq64fytlp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdtae16msb2hq64fytlp.png" alt="The tool: choose a specification → upload and align → adjust the crop → download" width="800" height="871"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;blockquote class="bluesky-embed"&gt;
&lt;p&gt;What cropping to a spec actually looks like: pick the row, drag the crown and chin onto the guide lines, export a printable 10 × 15 cm sheet.

The photo never leaves the browser.

https://wangsheng1991.github.io/content-engine/topics/passport-photo/&lt;/p&gt;— &lt;a href="https://bsky.app/profile/did:plc:3ga6ca2xxlcvoocope6etxyc?ref_src=embed" rel="noopener noreferrer"&gt; (@wangsheng199.bsky.social)&lt;/a&gt; &lt;a href="https://bsky.app/profile/did:plc:3ga6ca2xxlcvoocope6etxyc/post/3mwdlyx3kn52r?ref_src=embed" rel="noopener noreferrer"&gt;2026-09-25T10:50:56.709Z&lt;/a&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  What a row actually is
&lt;/h2&gt;

&lt;p&gt;A row is not "3 × 4 = 30 × 40 mm". It is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;size in millimetres&lt;/li&gt;
&lt;li&gt;a head-height band&lt;/li&gt;
&lt;li&gt;a headroom band (the space above the head)&lt;/li&gt;
&lt;li&gt;background colour&lt;/li&gt;
&lt;li&gt;minimum DPI&lt;/li&gt;
&lt;li&gt;which sheets it can be laid out on (10 × 15 cm, 4 × 6 in, A4)&lt;/li&gt;
&lt;li&gt;a status: &lt;code&gt;verified&lt;/code&gt; / &lt;code&gt;single-source&lt;/code&gt; / &lt;code&gt;disputed&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;and, for every figure, the source URL and the verbatim sentence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first two rows came out like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Фото 3 × 4 см&lt;/strong&gt; — 30 × 40 mm, head (to the top of the hair) 26 mm, 2–4 mm from the top edge to the hair, white background, at least 600 dpi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Фото на паспорт РФ, 35 × 45 мм&lt;/strong&gt; — 35 × 45 mm, head 32–36 mm (70–80% of the photo's height), 4–6 mm of headroom, white background, at least 300 dpi.&lt;/p&gt;

&lt;p&gt;Behind each figure sits a sentence like this one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;необходимо фото размером 30.00mm × 40.00mm с разрешением не менее 600 dpi. Фон должен быть белый, без посторонних предметов и теней.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Source, sentence, date read. The point is that &lt;strong&gt;a stranger can re-read that sentence months later instead of trusting me.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three rules
&lt;/h2&gt;

&lt;h3&gt;
  
  
  One: a figure whose sentence cannot be read does not enter the table
&lt;/h3&gt;

&lt;p&gt;This is the most important rule and the easiest one to break. A number shows up, it looks reasonable, it appears in several places — but if I cannot find the sentence itself, it does not go in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two: a contradicting figure is not deleted — it stays, with the reason it lost
&lt;/h3&gt;

&lt;p&gt;This is the counter-intuitive one.&lt;/p&gt;

&lt;p&gt;One source puts the head height for 3 × 4 at &lt;strong&gt;11–13 mm&lt;/strong&gt;. Three others say 26 mm. An 11–13 mm head inside a 40 mm frame is a third of the height, which no acceptance desk takes — and the same page says "не менее 70–80%" three entries above.&lt;/p&gt;

&lt;p&gt;Normally you delete that as noise.&lt;/p&gt;

&lt;p&gt;It is still in the table, with its source and a note on why it was rejected.&lt;/p&gt;

&lt;p&gt;Because the next person re-reading that page will hit the same 11–13 mm and have the same moment of doubt. Shown only a clean table, they will assume the scrape was wrong or their reading was, and spend an afternoon re-deriving what I already derived. Left there with the reason, they reach the same conclusion in five seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A rejected judgement is still data; it is just a different shape.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Three: a row with a single source is not shipped
&lt;/h3&gt;

&lt;p&gt;The table holds a third format: the newer 35 × 45 for application forms, head 25–30 mm, headroom 3 mm ± 1 mm.&lt;/p&gt;

&lt;p&gt;Exactly one page describes it. The format is still being phased in and there is very little public material.&lt;/p&gt;

&lt;p&gt;Its status is &lt;code&gt;single-source&lt;/code&gt;, and it never appears on the live site — pages are generated only from &lt;code&gt;verified&lt;/code&gt; rows.&lt;/p&gt;

&lt;p&gt;The reason is plain: &lt;strong&gt;one source is not evidence, it is a claim.&lt;/strong&gt; The same figure written independently in two unrelated places is what makes it dependable. That rule is hard, and it does not bend because a number looks sensible or because someone is impatient for that size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the photo goes
&lt;/h2&gt;

&lt;p&gt;All of the above is about checking figures. The tool's half has one rule: &lt;strong&gt;the photo does not go to a server.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftc6er5l1d3vjl9klv95p.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftc6er5l1d3vjl9klv95p.gif" alt="The tool in use: choose the spec → align the head guides → export the printable sheet" width="620" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The file is read into a canvas through &lt;code&gt;FileReader&lt;/code&gt;, cropped to the chosen spec, annotated with the head-height guide lines so you can check them yourself, laid out into a printable sheet, and downloaded directly with &lt;code&gt;canvas.toBlob&lt;/code&gt;. No upload, no backend on this path, no account.&lt;/p&gt;

&lt;p&gt;You can open the page, disconnect from the network, and it still works.&lt;/p&gt;

&lt;p&gt;The reason for taking this seriously: &lt;strong&gt;a document photo is the highest-stakes image most people ever handle.&lt;/strong&gt; It carries their face, their name usually sits elsewhere in the same application, and it exists in order to be handed to an institution. Making someone upload it to an unfamiliar server just to change its size is indefensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not do
&lt;/h2&gt;

&lt;p&gt;Honesty beats a feature list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It does not find your face.&lt;/strong&gt; You align the guide; it draws the head-height limits so you can check them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The background is replaced with a flat colour, not segmented hair by hair.&lt;/strong&gt; Fine edges will not be perfect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It will happily produce a photo that gets rejected for reasons it cannot see&lt;/strong&gt; — expression, glasses glare, shadows, a face turned slightly away. It is a layout tool, not a compliance oracle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We do not claim "meets visa requirements".&lt;/strong&gt; Every desk adds its own rule. The tool can vouch for two things — the dimensions and the head proportion — against the source it quotes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check it yourself
&lt;/h2&gt;

&lt;p&gt;The cheapest test: print the exported sheet at 100% and measure it. 30 × 40 mm is 30 × 40 mm, and the top of the head sits inside a 4–6 mm band.&lt;/p&gt;

&lt;p&gt;To check the figures themselves, every source link is in &lt;code&gt;source.yaml&lt;/code&gt; and every sentence is in &lt;code&gt;evidence.json&lt;/code&gt;, verbatim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;photo-visa.online — &lt;a href="https://photo-visa.online/s/foto-na-3-na-4-onlayn" rel="noopener noreferrer"&gt;https://photo-visa.online/s/foto-na-3-na-4-onlayn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;photo-visa.online — &lt;a href="https://photo-visa.online/s/foto-na-3-na-4-onlayn" rel="noopener noreferrer"&gt;https://photo-visa.online/s/foto-na-3-na-4-onlayn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;pasporta.org — &lt;a href="https://pasporta.org/zagranpasport/foto-na-zagranpasport/" rel="noopener noreferrer"&gt;https://pasporta.org/zagranpasport/foto-na-zagranpasport/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;pasporta.org — &lt;a href="https://pasporta.org/zagranpasport/foto-na-zagranpasport/" rel="noopener noreferrer"&gt;https://pasporta.org/zagranpasport/foto-na-zagranpasport/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;visa-guru.ru — &lt;a href="https://visa-guru.ru/blog/zagranpassport/foto-na-zagranpasport" rel="noopener noreferrer"&gt;https://visa-guru.ru/blog/zagranpassport/foto-na-zagranpasport&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;39mm.ru — &lt;a href="https://39mm.ru/requirement.html" rel="noopener noreferrer"&gt;https://39mm.ru/requirement.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;The photo never has to leave your device&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article is about how the specs were verified. If what you actually need is to turn the photo in your phone into a 3 × 4 print, that step needs no install and no upload: pick the size, align the head-height guide and export a printable sheet, all of it on your own device. The photo does not leave the tab, and every size in the table carries the sentence it came from.&lt;/p&gt;

&lt;p&gt;Open the passport photo tool (free, no upload): &lt;a href="https://www.dlss5nvidia.com/tools/passport-photo?ref=passport-photo" rel="noopener noreferrer"&gt;https://www.dlss5nvidia.com/tools/passport-photo?ref=passport-photo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>tools</category>
      <category>webdev</category>
      <category>image</category>
    </item>
    <item>
      <title>Image-to-video in three parameters: how a 5-second clip costs twice what it should</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Tue, 22 Sep 2026 10:09:33 +0000</pubDate>
      <link>https://dev.to/dlss/image-to-video-in-three-parameters-how-a-5-second-clip-costs-twice-what-it-should-27ll</link>
      <guid>https://dev.to/dlss/image-to-video-in-three-parameters-how-a-5-second-clip-costs-twice-what-it-should-27ll</guid>
      <description>&lt;p&gt;一张 1024×768 的室内效果图，一句运动提示词，五秒后拿到一段可以发出去的镜头。这是图生视频里最省事的一档，也是我们六月份给渲见（RenVi）做营销素材时走的那条路。&lt;/p&gt;

&lt;p&gt;结论先放这里：&lt;strong&gt;模型本身没坑，坑在两个参数的默认值上。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyv5x8ez2xnuh63o8379e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyv5x8ez2xnuh63o8379e.jpg" alt="输入：一张 1024×768 的效果图" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  我们实际跑出来的东西
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;实测值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;模型&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wan2.6-i2v-flash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输入&lt;/td&gt;
&lt;td&gt;一张效果图，以 data URI 内联&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;请求参数&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;resolution: 720P&lt;/code&gt;、&lt;code&gt;duration: 5&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输出&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1108×830、5.007 秒、H.264、约 5.5 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;附带音轨&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;有，AAC 立体声 44.1 kHz&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单条成本&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;¥1.50&lt;/strong&gt;（本该是 ¥0.75）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;那个 AAC 音轨不是我们要的 —— 是&lt;strong&gt;没人告诉模型不要&lt;/strong&gt;。下面三节就是那三个参数。&lt;/p&gt;

&lt;p&gt;首尾两帧放在一起是这样，五秒里只有一次缓慢的推镜：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxpht8v5n60cat9o0qb8k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxpht8v5n60cat9o0qb8k.jpg" alt="首帧与末帧" width="799" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  一、&lt;code&gt;audio&lt;/code&gt; 默认是开着的，价格正好翻倍
&lt;/h2&gt;

&lt;p&gt;官方文档在 &lt;code&gt;audio&lt;/code&gt; 这一栏写的是：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;可选值：true：默认值，输出有声视频。false：输出无声视频。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;而价格页同一行模型是这样标的：&lt;strong&gt;720P 有声 0.3 元/秒，无声 0.15 元/秒&lt;/strong&gt;；1080P 有声 0.5 元/秒，无声 0.25 元/秒。&lt;/p&gt;

&lt;p&gt;也就是说，&lt;strong&gt;不写 &lt;code&gt;audio&lt;/code&gt; 就是按有声计费&lt;/strong&gt;。五秒的有声 720P 是 ¥1.50，无声是 ¥0.75 —— 差的这一块钱，买到的是一段你根本没打算用的 AI 环境音。&lt;/p&gt;

&lt;p&gt;我们那批素材就是这么付的：三条片子的文件里都带着音轨，因为当时的脚本 &lt;code&gt;parameters&lt;/code&gt; 里只有 &lt;code&gt;resolution&lt;/code&gt; 和 &lt;code&gt;duration&lt;/code&gt;。复现脚本现在默认 &lt;code&gt;audio: false&lt;/code&gt;，要声音得显式写 &lt;code&gt;--audio true&lt;/code&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  二、&lt;code&gt;resolution&lt;/code&gt; 不是清晰度开关，是像素预算 —— 而且默认 1080P
&lt;/h2&gt;

&lt;p&gt;文档里这句话值得读两遍：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;模型根据选择的分辨率档位，自动缩放至相近总像素，视频宽高比将尽量与输入图像 img_url 的宽高比保持一致。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;所以选 720P 拿到的不一定是 1280×720。我们的输入是 4:3（1024×768），输出就是 &lt;strong&gt;1108×830&lt;/strong&gt; —— 91.96 万像素，和 1280×720 的 92.16 万几乎一样。它是「给够这么多像素，形状跟着你的图走」，不是「裁成 16:9」。&lt;/p&gt;

&lt;p&gt;更要紧的是同一段文档的另一句：&lt;code&gt;wan2.6-i2v-flash&lt;/code&gt; 的 &lt;strong&gt;&lt;code&gt;resolution&lt;/code&gt; 默认值是 1080P&lt;/strong&gt;。不写它，就按 1080P 的价钱算，哪怕你的输入图只有 1024 宽、根本喂不出真 1080P 的细节。&lt;/p&gt;

&lt;h2&gt;
  
  
  三、&lt;code&gt;duration&lt;/code&gt; 是 2–15 的整数，不是 5/10 两档
&lt;/h2&gt;

&lt;p&gt;网上关于图生视频的笔记很多写「只有 5 秒和 10 秒」，那说的是 &lt;code&gt;wan2.6-i2v-us&lt;/code&gt;。flash 这一档的文档原文是：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;取值为[2, 15]之间的整数。默认值为 5。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;也就是说 7 秒、9 秒、13 秒都可以，单价按秒线性计费。做产品展示时，比「五秒切下一张」好看得多的用法是&lt;strong&gt;一张图 12 秒慢慢推&lt;/strong&gt;，成本仍然是一秒一秒算的。&lt;/p&gt;

&lt;h2&gt;
  
  
  接口只有一个模式：异步
&lt;/h2&gt;

&lt;p&gt;这个接口没有同步调用这一回事。请求必须带上 &lt;code&gt;X-DashScope-Async: enable&lt;/code&gt;，否则直接报错 —— 原文是「HTTP 请求只支持异步，必须设置为 enable」，缺少这个头会返回 &lt;code&gt;current user api does not support synchronous calls&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;拿到 &lt;code&gt;task_id&lt;/code&gt; 之后轮询，状态就六种：&lt;code&gt;PENDING&lt;/code&gt;、&lt;code&gt;RUNNING&lt;/code&gt;、&lt;code&gt;SUCCEEDED&lt;/code&gt;、&lt;code&gt;FAILED&lt;/code&gt;、&lt;code&gt;CANCELED&lt;/code&gt;、&lt;code&gt;UNKNOWN&lt;/code&gt;。&lt;strong&gt;&lt;code&gt;UNKNOWN&lt;/code&gt; 不是「还没好」，是「任务不存在」&lt;/strong&gt; —— 任务 ID 只保留 24 小时，结果链接也是：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;链接有效期 24 小时，可通过此 URL 下载视频。视频格式为 MP4（H.264 编码）。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;所以「提交完先去干别的，回头再下载」这种做法，隔夜就失效了。脚本里轮询完成立刻落盘，不是洁癖，是必须。&lt;/p&gt;

&lt;h2&gt;
  
  
  复现
&lt;/h2&gt;

&lt;p&gt;脚本在这个仓库里，零依赖，只用 Node 和 DashScope 的接口：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;QWEN_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-...     &lt;span class="c"&gt;# 或 DASHSCOPE_API_KEY&lt;/span&gt;
node scripts/wan-i2v.mjs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--image&lt;/span&gt; room.jpg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"slow cinematic dolly-in through the cozy renovated living room, gentle smooth camera motion, soft warm natural light, photorealistic, stable, no people"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resolution&lt;/span&gt; 720P &lt;span class="nt"&gt;--duration&lt;/span&gt; 5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--log&lt;/span&gt; run.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;默认 &lt;code&gt;--audio false&lt;/code&gt;（省钱那档），要声音加 &lt;code&gt;--audio true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;图片直接读本地文件转 data URI，不需要对象存储，也不需要先把图传到公网&lt;/li&gt;
&lt;li&gt;每 8 秒轮询一次，最多 40 次；&lt;strong&gt;超时和 &lt;code&gt;FAILED&lt;/code&gt; 都会报错退出，不会留下一段空文件&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;跑完把 &lt;code&gt;task_id&lt;/code&gt;、轮询次数、实际耗时、文件大小写进 &lt;code&gt;run.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我们那批素材的量测日志在 &lt;a href="https://github.com/wangsheng1991/content-engine/blob/main/research/wan-i2v/measured-2026-09-22.json" rel="noopener noreferrer"&gt;research/wan-i2v/measured-2026-09-22.json&lt;/a&gt;，每条片子都带 sha256，尺寸、时长、音轨、字节数都可以自己复算。&lt;/p&gt;

&lt;h2&gt;
  
  
  这四个参数的取舍
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;默认&lt;/th&gt;
&lt;th&gt;建议&lt;/th&gt;
&lt;th&gt;为什么&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;audio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt;（有声）&lt;/td&gt;
&lt;td&gt;显式写 &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;无声 720P ¥0.15/秒，有声 ¥0.3/秒，正好一倍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;resolution&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1080P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;按输入图的实际像素选&lt;/td&gt;
&lt;td&gt;720P 和 1080P 是 ¥0.15 / ¥0.25 每秒；输入只有 1024 宽时，1080P 是白付的钱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2–15 的整数，按内容节奏选&lt;/td&gt;
&lt;td&gt;按秒计费，镜头需要多久就给多久&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watermark&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;保持 &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;商用素材不该带「AI 生成」角标&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  这条链能做到哪、做不到哪
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;能做&lt;/strong&gt;：把一张已经满意的静图变成有镜头运动的短视频，用于商品页、社媒、效果图转视频。成本是每条几毛到一块多。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不做&lt;/strong&gt;：长视频、多镜头叙事（那是 &lt;code&gt;shot_type: multi&lt;/code&gt;，另一档模型）、把糟糕的图救回来 —— 输入决定上限，模型只负责给它加运动。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;一个真实的边界&lt;/strong&gt;：我们这次是拿 AI 生成的效果图当首帧。真实照片同样可以，但房间的结构、透视关系会跟着动，出现金属反射、灯光逻辑错误时，多半要减小运动幅度重跑，而不是加大提示词。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;五秒的镜头，成本七毛五。这个价钱意味着可以&lt;strong&gt;为每个风格各出一条&lt;/strong&gt;，而不是精挑细选只做一条 —— 营销素材的供给量，比单条质量更容易做出差别。&lt;/p&gt;

&lt;h2&gt;
  
  
  证据
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;图生视频接口只支持异步调用：请求必须带 X-DashScope-Async: enable。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;缺少异步请求头时接口直接报错，不存在同步等待视频的用法。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;resolution 决定的是总像素预算，输出宽高比会尽量跟随输入图，而不是固定裁成 16:9。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;wan2.6-i2v-flash 的 resolution 可选 720P / 1080P，默认值是 1080P（也就是贵的那一档）。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;wan2.6-i2v-flash 的 duration 取值是 [2, 15] 之间的整数，默认 5 秒，而不是只有 5 秒和 10 秒两档。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;audio 的默认值是 true，也就是默认输出有声视频；想要无声必须显式写 false。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;官方文档写明 audio 直接影响费用，有声与无声按不同价格计费。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;结果视频的下载链接只有 24 小时有效期，格式为 MP4（H.264 编码）。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;异步任务的状态枚举包含 PENDING、RUNNING、SUCCEEDED、FAILED、CANCELED 和 UNKNOWN，其中 UNKNOWN 表示任务不存在而非尚未完成。 — &lt;a href="https://help.aliyun.com/zh/model-studio/image-to-video-api-reference" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/image-to-video-api-reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;北京地域 wan2.6-i2v-flash 按输出秒数计费：720P 有声 0.3 元/秒、无声 0.15 元/秒；1080P 有声 0.5 元/秒、无声 0.25 元/秒。 — &lt;a href="https://help.aliyun.com/zh/model-studio/model-pricing" rel="noopener noreferrer"&gt;https://help.aliyun.com/zh/model-studio/model-pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;1024×768 的输入图，在 720P 档位下产出的是 1108×830（91.96 万像素，与 1280×720 的 92.16 万相当），印证了「相近总像素 + 跟随输入宽高比」。 — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;我们那批片子每条都带 AAC 立体声音轨，因为当时的请求没有传 audio，默认按有声生成（并计费）。 — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;量测出的成片时长是 5.007 秒，与请求的 5 秒一致。 — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/content-engine/main/research/wan-i2v/measured-2026-09-22.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;复现脚本每 8 秒轮询一次，最多 40 次。 — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/content-engine/main/scripts/wan-i2v.mjs" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/content-engine/main/scripts/wan-i2v.mjs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;复现脚本显式发送 audio: false，不把「贵一倍」交给服务端的默认值。 — &lt;a href="https://raw.githubusercontent.com/wangsheng1991/content-engine/main/scripts/wan-i2v.mjs" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/wangsheng1991/content-engine/main/scripts/wan-i2v.mjs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;一张照片进去，几秒后出来一张能用的效果图&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;上面那条链的起点，是渲见（RenVi）里最常见的一个动作：把家里的房间照片传上去，选一个风格，等几秒。 效果图满意了，再往「变成镜头」这一步走。 视频只是素材的一种形态；真正决定转化的是第一张图好不好看、要等多久。&lt;/p&gt;

&lt;p&gt;上传房间照片，免费出一张效果图: &lt;a href="https://www.houseplusplus.com/?ref=wan-i2v-first-frame" rel="noopener noreferrer"&gt;https://www.houseplusplus.com/?ref=wan-i2v-first-frame&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>video</category>
      <category>tutorial</category>
      <category>cost</category>
    </item>
    <item>
      <title>SHARP：单张图的秒级 3D 高斯视图合成</title>
      <dc:creator>LeGo build</dc:creator>
      <pubDate>Tue, 22 Sep 2026 09:48:32 +0000</pubDate>
      <link>https://dev.to/dlss/sharpdan-zhang-tu-de-miao-ji-3d-gao-si-shi-tu-he-cheng-9a1</link>
      <guid>https://dev.to/dlss/sharpdan-zhang-tu-de-miao-ji-3d-gao-si-shi-tu-he-cheng-9a1</guid>
      <description>&lt;p&gt;单目视图合成要解决的问题很直接：给你一张照片，生成它附近视角的新画面，而且要看起来像真的。难的地方在于，一张照片没有视差，深度、遮挡、反射都缺信息。此前的做法往往要在「更真」和「更快」之间做取舍。&lt;/p&gt;

&lt;p&gt;Apple 的 SHARP 给出的答案是把取舍绕开：不一步步重建场景，而是让神经网络把整张照片直接读成一份 3D 表示。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd5orb1dylrvly8eqdl4p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd5orb1dylrvly8eqdl4p.jpg" alt="一张照片 → 一份可实时渲染的 3D 高斯表示" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SHARP 在做什么
&lt;/h2&gt;

&lt;p&gt;按官方仓库 README 的描述，SHARP 接收一张照片，回归出这个场景的 3D 高斯（3D Gaussian）表示参数。整个过程是一次神经网络前馈，在标准 GPU 上耗时不到 1 秒。生成的 3D 高斯表示随后可以被实时渲染，输出附近视角的高分辨率写实图像。&lt;/p&gt;

&lt;p&gt;README 还提到两点对开发者很关键：&lt;/p&gt;

&lt;p&gt;第一，这个表示是 metric 的，带绝对尺度，因此支持米制相机运动——你给出的相机位移是有物理单位的，而不是一个随意缩放的相对量。&lt;/p&gt;

&lt;p&gt;第二，坐标约定遵循 OpenCV（x 向右、y 向下、z 向前），而 3DGS 场景中心大致位于 (0, 0, +z)。这意味着把 &lt;code&gt;.ply&lt;/code&gt; 交给第三方渲染器时，需要自己缩放和旋转，把场景重新居中。&lt;/p&gt;

&lt;p&gt;按 README 的描述，整个过程不针对单个场景做迭代优化，而是一次前馈就把参数吐出来。这一点对工程上的意义很直接：推理路径短，你不需要为每张新图重新跑一轮训练式的流程。&lt;/p&gt;

&lt;h2&gt;
  
  
  关键数字一览
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;此前最佳模型&lt;/th&gt;
&lt;th&gt;SHARP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LPIPS&lt;/td&gt;
&lt;td&gt;README 未给出绝对值，作为对比基准&lt;/td&gt;
&lt;td&gt;相对降低 25–34%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DISTS&lt;/td&gt;
&lt;td&gt;README 未给出绝对值，作为对比基准&lt;/td&gt;
&lt;td&gt;相对降低 21–43%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合成耗时&lt;/td&gt;
&lt;td&gt;README 未给出绝对值，作为对比基准&lt;/td&gt;
&lt;td&gt;降低三个数量级；标准 GPU 上不到 1 秒&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生成方式&lt;/td&gt;
&lt;td&gt;README 未说明&lt;/td&gt;
&lt;td&gt;单次前馈（single feedforward pass）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输出形式&lt;/td&gt;
&lt;td&gt;README 未说明&lt;/td&gt;
&lt;td&gt;3D 高斯泼溅（3DGS），&lt;code&gt;.ply&lt;/code&gt; 文件，兼容公共渲染器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;泛化能力&lt;/td&gt;
&lt;td&gt;README 未说明&lt;/td&gt;
&lt;td&gt;论文称具备跨数据集的鲁棒零样本泛化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;表格里凡是 README 没写的，就空着，不替论文补数字。这些百分比描述的是相对此前最佳模型的改善幅度，不是绝对分值——LPIPS 和 DISTS 都是越低越好，所以「降低」是好事，但 README 没有给出绝对分值，这里也就不做换算。&lt;/p&gt;

&lt;h2&gt;
  
  
  从仓库到第一条预测命令
&lt;/h2&gt;

&lt;p&gt;README 给出的上手路径很常规：建环境、装依赖、跑 CLI。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda create &lt;span class="nt"&gt;-n&lt;/span&gt; sharp &lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.13
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
sharp &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;权重不需要手动准备：第一次运行时模型 checkpoint 会自动下载，并缓存在 &lt;code&gt;~/.cache/torch/hub/checkpoints/&lt;/code&gt;。如果你更想自己管理权重，README 也给了直接下载 &lt;code&gt;.pt&lt;/code&gt; 文件的方式，再用 &lt;code&gt;-c&lt;/code&gt; 参数把本地 checkpoint 指给命令。&lt;/p&gt;

&lt;p&gt;真正的推理只有一行：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sharp predict &lt;span class="nt"&gt;-i&lt;/span&gt; /path/to/input/images &lt;span class="nt"&gt;-o&lt;/span&gt; /path/to/output/gaussians
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;输出目录里是 3D 高斯泼溅文件。如果你还想额外拿到一条相机轨迹的视频，加上 &lt;code&gt;--render&lt;/code&gt;；也可以从中间结果出发单独渲染：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sharp predict &lt;span class="nt"&gt;-i&lt;/span&gt; /path/to/input/images &lt;span class="nt"&gt;-o&lt;/span&gt; /path/to/output/gaussians &lt;span class="nt"&gt;--render&lt;/span&gt;
sharp render &lt;span class="nt"&gt;-i&lt;/span&gt; /path/to/output/gaussians &lt;span class="nt"&gt;-o&lt;/span&gt; /path/to/output/renderings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  适合谁用，以及现在还不能做什么
&lt;/h2&gt;

&lt;p&gt;按 README 的描述，它的定位是「单张图进、附近视角出」：适合照片量少、没有多视角采集条件，但又想要可自由换视角画面的场景，也适合把已有图像资产快速转成可实时渲染的 3D 资产。因为表示带绝对尺度，涉及真实位移的场景也能对得上单位。&lt;/p&gt;

&lt;p&gt;另一个按 README 可以合理推断的好处来自耗时：既然单次前馈不到 1 秒，这一步就有可能放进交互式流程里，而不用当成一次离线批处理任务。不过 README 没有给出吞吐、并发或显存方面的数据，真要拿它做线上服务，还是得自己压测。&lt;/p&gt;

&lt;p&gt;局限同样来自 README，写清楚比夸大更有用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;高斯预测本身在 CPU、CUDA、MPS 上都能跑，但用 &lt;code&gt;--render&lt;/code&gt; 渲染相机轨迹视频目前要求 CUDA GPU，也就是说只有 CUDA 机器能直接出视频；&lt;/li&gt;
&lt;li&gt;gsplat 渲染器首次启动时初始化要等一会儿；&lt;/li&gt;
&lt;li&gt;接第三方 3DGS 渲染器需要按上面的坐标系约定缩放旋转、重新居中；&lt;/li&gt;
&lt;li&gt;README 把定量与定性评估都指向论文和项目页，本页只复述 README 与摘要里的数字，不做额外推断。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  自己跑一遍
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda create &lt;span class="nt"&gt;-n&lt;/span&gt; sharp &lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.13
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
sharp &lt;span class="nt"&gt;--help&lt;/span&gt;
sharp predict &lt;span class="nt"&gt;-i&lt;/span&gt; /path/to/input/images &lt;span class="nt"&gt;-o&lt;/span&gt; /path/to/output/gaussians
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;把 &lt;code&gt;-i&lt;/code&gt; 换成你自己的图片目录，权重会在首次运行时自动下载。如果你的目标只是先把手里图片的质量提上去，也可以直接在线试 AI 图像增强，不必先跑通本地环境。&lt;/p&gt;

&lt;h2&gt;
  
  
  证据
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SHARP 通过单次前馈在标准 GPU 上以不到 1 秒的时间回归出场景的 3D 高斯表示参数。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SHARP 产出的 3D 高斯表示可以被实时渲染，生成附近视角的高分辨率写实图像。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;该表示是 metric 的，带绝对尺度，支持米制的相机运动。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;实验结果展示了 SHARP 跨数据集的鲁棒零样本泛化能力。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;在多个数据集上，SHARP 相对此前最佳模型把 LPIPS 降低 25–34%、DISTS 降低 21–43%，同时把合成耗时降低三个数量级。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;预测结果是以 3D 高斯泼溅（3DGS）形式存放在输出目录中的可渲染结果。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;官方 CLI 的预测入口是 sharp predict，用 -i 指定输入图像目录、-o 指定输出高斯目录。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;模型权重在第一次运行时自动下载，并缓存到 ~/.cache/torch/hub/checkpoints/。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;高斯预测在 CPU、CUDA 和 MPS 上都能工作，但通过 --render 渲染相机轨迹视频目前需要 CUDA GPU。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;输出的 3DGS 遵循 OpenCV 坐标约定（x 右、y 下、z 前），场景中心大致在 (0, 0, +z)，接第三方渲染器时需要自行缩放与旋转来重新居中。 — &lt;a href="https://raw.githubusercontent.com/apple/ml-sharp/main/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/apple/ml-sharp/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;图像的鲁棒表示已经有了，你的照片也可以先变清楚&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SHARP 展示了一件值得记住的事：一张普通照片里，本来就藏着足够多的信息，只要有一个足够鲁棒的表示方式把它读出来。 在你自己的照片上，最实用的第一步往往不是重建 3D，而是先把图像本身的质量拉起来。 DLSS 5 是一个在线 AI 图像编辑器，把手里已有的图画上传上去，就能试试我们的 AI 超分与画质增强。&lt;/p&gt;

&lt;p&gt;上传图片，试试 AI 增强: &lt;a href="https://www.dlss5nvidia.com/?ref=ml-sharp" rel="noopener noreferrer"&gt;https://www.dlss5nvidia.com/?ref=ml-sharp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>3dvision</category>
      <category>gaussiansplatting</category>
      <category>viewsynthesis</category>
      <category>apple</category>
    </item>
  </channel>
</rss>
