檢)
跑量出圖有個(gè)繞不開(kāi)的問(wèn)題一次出三百?gòu)埲斯ぬ魣D比出圖還累。而且很多廢圖的特征是固定的——純色、糊、尺寸不對(duì)、明顯失敗這類完全可以讓代碼先篩一遍。這篇講在甜甜圈APIdashengfenshen.cn上批量調(diào)圖像生成接口之后怎么用幾十行代碼把明顯不能用的自動(dòng)踢掉。一、先篩便宜的再篩貴的質(zhì)檢要按成本從低到高排能用文件屬性判掉的就別去解碼像素1. 字節(jié)數(shù)太小 → 幾乎必然是失敗圖 最便宜 2. 尺寸/比例不對(duì) → 讀文件頭就知道 3. 純色或接近純色 → 需要解碼但只看縮略圖 4. 清晰度不足 → 解碼 計(jì)算 5. 內(nèi)容對(duì)不對(duì) → 要調(diào)模型最貴 最后再上前四步能刷掉八九成廢圖剩下的再人工看或送模型判斷。二、前三步的實(shí)現(xiàn)用 sharpnpm i sharpconst sharp require(sharp); async function quickCheck(buf, { minBytes 20 * 1024, ratio 1, ratioTol 0.02 } {}) { // 1) 字節(jié)數(shù)正常一張 1K 圖不會(huì)小于 20KB太小基本是出錯(cuò)了 if (buf.length minBytes) return { ok: false, why: 文件過(guò)小 ${(buf.length / 1024).toFixed(0)}KB }; const meta await sharp(buf).metadata(); if (!meta.width || !meta.height) return { ok: false, why: 讀不到尺寸文件可能損壞 }; // 2) 比例電商主圖要求正方形偏差超過(guò) 2% 就不合格 const r meta.width / meta.height; if (Math.abs(r - ratio) / ratio ratioTol) { return { ok: false, why: 比例不對(duì) ${meta.width}x${meta.height} }; } // 3) 純色檢測(cè)縮到 16x16 再看標(biāo)準(zhǔn)差比全圖統(tǒng)計(jì)快幾十倍 const { channels } await sharp(buf).resize(16, 16, { fit: fill }).stats(); const maxStd Math.max(...channels.map((c) c.stdev)); if (maxStd 6) return { ok: false, why: 畫(huà)面接近純色stdev ${maxStd.toFixed(1)} }; return { ok: true, meta }; }純色檢測(cè)先縮到 16×16是關(guān)鍵——全圖算統(tǒng)計(jì)量在幾百?gòu)埖牧考?jí)上會(huì)很慢而判斷是不是一片空白用縮略圖完全夠。三、清晰度拉普拉斯方差糊圖的特征是邊緣響應(yīng)弱。經(jīng)典做法是算拉普拉斯算子的方差async function sharpness(buf) { const { data, info } await sharp(buf) .greyscale().resize(512, 512, { fit: inside }) .raw().toBuffer({ resolveWithObject: true }); const { width: w, height: h } info; let sum 0, sum2 0, n 0; for (let y 1; y h - 1; y) { for (let x 1; x w - 1; x) { const i y * w x; // 拉普拉斯四鄰域之和減去 4 倍中心 const v data[i - 1] data[i 1] data[i - w] data[i w] - 4 * data[i]; sum v; sum2 v * v; n; } } return sum2 / n - (sum / n) ** 2; // 方差越大越清晰 }閾值要自己標(biāo)定先跑一批已知好圖和已知糊圖看方差分布在哪兒分開(kāi)別抄別人的數(shù)字——不同題材、不同模型的分布差很多。四、串起來(lái)async function screen(items, { workers 8 } {}) { const pass [], fail []; let next 0; await Promise.all(Array.from({ length: workers }, async () { while (next items.length) { const it items[next]; try { const buf await fetchBuf(it.url); const q await quickCheck(buf); if (!q.ok) { fail.push({ ...it, why: q.why }); continue; } const s await sharpness(buf); if (s 60) { fail.push({ ...it, why: 偏糊 ${s.toFixed(0)} }); continue; } pass.push({ ...it, sharpness: s }); } catch (e) { fail.push({ ...it, why: 處理異常 e.message }); } } })); // 按清晰度排序人工只看前面幾十張就夠了 pass.sort((a, b) b.sharpness - a.sharpness); console.log(通過(guò) ${pass.length} / 廢棄 ${fail.length}); return { pass, fail }; }別直接刪廢圖先留著看why的分布。如果偏糊占比特別高多半是提示詞或模型選得不對(duì)該回去調(diào)生成而不是調(diào)篩選。五、生成階段就能減少?gòu)U圖質(zhì)檢是補(bǔ)救源頭才是關(guān)鍵同一提示詞多出幾版再挑比反復(fù)調(diào)提示詞更省時(shí)間跑量用nano-banana28 積分/次挑中的再用nano-banana-pro或gpt-image-2出終稿提示詞里寫(xiě)清構(gòu)圖和背景正方形構(gòu)圖、純白背景、商品居中比事后篩有效得多模型代碼定位消耗nano-banana2跑量草稿8 積分/次nano-banana-pro終稿支持 1K/2K/4K10 積分/次gpt-image-2細(xì)節(jié)質(zhì)感按次計(jì)費(fèi)ttq-cutout摳圖10 積分/次六、小結(jié)批量出圖的自動(dòng)質(zhì)檢四層字節(jié)數(shù) → 尺寸比例 → 純色 → 清晰度成本從低到高前三層就能刷掉大部分廢圖。閾值必須自己標(biāo)定別抄。甜甜圈APIdashengfenshen.cn并發(fā)高跑量篩選這套流程才跑得起來(lái)模型全nano banana pro、gpt-image-2、Veo 3.1、Sora 2、價(jià)格便宜、出圖快、穩(wěn)定。文檔地址https://dashengfenshen.cn 。