તમારી પાસે થોડાક સો પ્રોડક્ટ ફોટા, હેડશોટ કે લિસ્ટિંગ ઇમેજનું ફોલ્ડર છે, અને દરેકનું બેકગ્રાઉન્ડ રિમૂવ કરવાનું છે. એડિટરમાં હાથે કરો તો આખો દિવસ ક્લિક કરવામાં જાય. Python માં તે એક લૂપ છે, અને ખરો નિર્ણય એ છે કે લૂપની અંદર શું ચાલે: તમારા પોતાના મશીન પર ઓપન-સોર્સ મોડેલ, કે HTTP API.
આ ગાઇડ બંને બનાવે છે, એવી પૂરી સ્ક્રિપ્ટ સાથે જે તમે આજે જ ફોલ્ડર પર ચલાવી શકો, અને બેચ જોબને વિશ્વસનીય બનાવતા ભાગ આવરે છે: મોડેલની પસંદગી, CPU વિરુદ્ધ GPU, રિટ્રાય, રેટ લિમિટ, idempotency અને ક્રેશ પછી ફરી શરૂ કરવું.
વિકલ્પ A કે વિકલ્પ B?
| લોકલ મોડેલ (rembg) | HTTP API | |
|---|---|---|
| ખર્ચ | ફ્રી સોફ્ટવેર; ખર્ચ હાર્ડવેર અને સમયમાં | ઇમેજ દીઠ |
| સેટઅપ | Python 3.11 થી 3.13, મોડેલ ડાઉનલોડ, વૈકલ્પિક CUDA | એક API કી અને requests |
| ઝડપ | તમારા CPU કે GPU અને મોડેલ પર આધાર | સર્વિસ અને પેરેલલ રિક્વેસ્ટ પર આધાર |
| ક્વોલિટી | તમે પસંદ કરો તે મોડેલ પર આધાર | સર્વિસ પર આધાર |
| પ્રાઇવસી | ઇમેજ ક્યારેય તમારું મશીન છોડતી નથી | ઇમેજ ત્રીજા પક્ષ પાસે અપલોડ થાય છે |
| જાળવણી | મોડેલ, ડ્રાઇવર અને લાઇસન્સ તમે સંભાળો | પ્રોવાઇડર સંભાળે |
| શેના માટે સારું | ઓફલાઇન કામ, સંવેદનશીલ ઇમેજ, પ્રયોગ | પ્રોડક્શન પાઇપલાઇન, GPU વગરનાં સર્વર |
ઘણી ટીમ બંને વાપરે છે: પ્રયોગ અને આંતરિક ટૂલ માટે લોકલ મોડેલ, પ્રોડક્શન માટે API, જ્યાં અનુમાન કરી શકાય તેવી ક્વોલિટી અને GPU સર્વર ન રાખવાં વધુ મહત્વનાં છે.
વિકલ્પ A: rembg, ઓપન-સોર્સ રસ્તો
rembg MIT-લાઇસન્સવાળી Python લાઇબ્રેરી અને CLI છે, જે ઘણાં બેકગ્રાઉન્ડ રિમૂવલ મોડેલને સાથે રાખીને ONNX Runtime થી ચલાવે છે. લખતી વખતે હાલની રિલીઝ 2.0.86 છે, અને તેને Python 3.11 કે પછીનું અને 3.14 પહેલાંનું વર્ઝન જોઈએ.
ઇન્સ્ટોલ
તમારા હાર્ડવેર સાથે મેળ ખાતું બેકએન્ડ પસંદ કરો. CPU બિલ્ડ બધે ચાલે છે:
python -m venv .venv && source .venv/bin/activate
pip install "rembg[cpu]" # library only
pip install "rembg[cpu,cli]" # library plus the rembg commandNVIDIA GPU માટે તેના બદલે rembg[gpu] ઇન્સ્ટોલ કરો. પ્રોજેક્ટ નોંધે છે કે તેના માટે onnxruntime-gpu અને મેળ ખાતાં CUDA તથા cuDNN જોઈએ, અને તે ઇન્સ્ટોલ ન થઈ શકે તો CPU બિલ્ડ પર પાછા જવાનું સૂચવે છે. Linux પર AMD GPU onnxruntime-rocm સાથે rembg[rocm] વાપરે છે.
ONNX Runtime CUDA (કે ROCm) એક્ઝિક્યુશન પ્રોવાઇડરને ઉપલબ્ધ ગણાવે ત્યારે rembg તેને આપમેળે પસંદ કરે છે, અને CPU પર પાછું જાય તો ચેતવણી આપે છે. ONNX Runtime શું જોઈ શકે છે તે તપાસવા:
import onnxruntime
print(onnxruntime.get_available_providers()) # look for CUDAExecutionProviderમોડેલ પસંદ કરો
પહેલા ઉપયોગે મોડેલ ~/.rembg/models/ માં ડાઉનલોડ થાય છે (બદલવા REMBG_HOME સેટ કરો). પ્રોજેક્ટની યાદીમાંથી કેટલાંક ઉપયોગી મોડેલ:
| મોડેલ | નોંધ |
|---|---|
bria-rmbg | ડિફોલ્ટ. BRIA નું RMBG-2.0, આશરે 1.02 GB, 1024 x 1024 પર ચાલે છે. તેનું લાઇસન્સ વ્યાવસાયિક ઉપયોગ માટે પેઇડ કરાર માગે છે. |
birefnet-general | સામાન્ય ઉપયોગનું BiRefNet મોડેલ; સારી નરમ કિનારી |
birefnet-general-lite | સામાન્ય ઉપયોગ માટે હળવું BiRefNet |
birefnet-portrait | લોકો માટે ટ્યુન કરેલું |
isnet-general-use | સામાન્ય ઉપયોગનું IS-Net મોડેલ |
u2net | ક્લાસિક સામાન્ય મોડેલ; ઝડપી, ચોરસ જેવી કિનારી |
u2netp | હળવું u2net; ધીમા મશીન પર ઝડપી ટેસ્ટ માટે |
silueta | u2net જેવું જ, 43 MB સુધી નાનું કરેલું |
બે મુદ્દા દેખાય તેના કરતાં વધુ મહત્વના છે. પહેલો, ડિફોલ્ટ મોડેલ વ્યાવસાયિક ઉપયોગ માટે ફ્રી નથી: મોડેલનાં વેઇટ પોતાનાં લાઇસન્સ ધરાવે છે, rembg ના MIT લાઇસન્સથી અલગ, તેથી તમે જે મોડેલ સાથે કામ ચલાવો તેનો સોર્સ તપાસો. બીજો, નવાં મોડેલ (bria-rmbg, birefnet-*, isnet-general-use) નરમ, સુઘડ આકારની કિનારી આપે છે, જ્યારે જૂનું u2net કુટુંબ વધુ સખત, ચોરસ જેવી કિનારી આપે છે.
કિનારીની ક્વોલિટીના વિકલ્પ
વાળ અને રુવાંટી જેવા નરમ કિનારીના પિક્સેલ સંભાળવા rembg ત્રણ રીત આપે છે:
- ડિફોલ્ટ: પ્રોડક્ટ, કાર અને લોગો જેવા સખત કિનારીવાળા સબ્જેક્ટ માટે બરાબર.
decontaminate=True(CLI પર-dc): જૂનું બેકગ્રાઉન્ડ કિનારીના પિક્સેલમાં જે રંગીન હેલો છોડે છે તે દૂર કરે છે. તે માત્ર રંગ બદલે છે, માસ્કનો આકાર ક્યારેય નહીં, ખર્ચ ખૂબ ઓછો છે, અને આખી બેચ માટે ચાલુ રાખવું સુરક્ષિત છે.alpha_matting=True(-a): માસ્કનો આકાર ખોટો હોય, ઉદાહરણ તરીકે વાળ કપાઈ ગયા હોય, ત્યારે કિનારી જ ફરી ગણે છે. તે ઘણું ધીમું છે અને ક્યારેક કન્વર્જ ન પણ થાય, એ કિસ્સામાં rembg ડિકન્ટેમિનેટ કરેલા કટઆઉટ પર પાછું જાય છે.
દેખરેખ વગરની બેચ માટે પ્રોજેક્ટ -a ને બદલે -dc ની ભલામણ કરે છે કારણ કે તે ઝડપી છે અને નિષ્ફળ ન જઈ શકે. હેલો કેમ થાય છે તે આલ્ફા ચેનલ ગાઇડ સમજાવે છે.
ઝડપી રીત: CLI
rembg p -m birefnet-general -dc photos/ cutouts/rembg p આખું ફોલ્ડર પ્રોસેસ કરે છે; ફોલ્ડર પર નજર રાખીને નવી ફાઇલ આવે તેમ પ્રોસેસ કરવા -w ઉમેરો.
Python સ્ક્રિપ્ટ
આ વર્ઝન મોડેલ એક વાર લોડ કરે છે, પહેલેથી પૂરી થયેલી ફાઇલ છોડી દે છે જેથી તમે રોકીને ફરી શરૂ કરી શકો, અને એક ફાઇલ નિષ્ફળ જાય તો પણ ચાલુ રહે છે:
import sys
from pathlib import Path
from rembg import new_session, remove
EXTS = {".jpg", ".jpeg", ".png", ".webp"}
def main(in_dir: str, out_dir: str, model: str = "birefnet-general") -> None:
src_dir, dst_dir = Path(in_dir), Path(out_dir)
dst_dir.mkdir(parents=True, exist_ok=True)
session = new_session(model) # load the model once, reuse it for every image
files = sorted(p for p in src_dir.iterdir() if p.suffix.lower() in EXTS)
for i, src in enumerate(files, 1):
dst = dst_dir / f"{src.stem}.png"
if dst.exists():
continue # resume where a previous run stopped
try:
out = remove(src.read_bytes(), session=session, decontaminate=True)
dst.write_bytes(out)
print(f"[{i}/{len(files)}] ok {src.name}")
except Exception as e: # one bad file shouldn't stop the batch
print(f"[{i}/{len(files)}] failed {src.name}: {e}")
if __name__ == "__main__":
main(*sys.argv[1:])python batch_rembg.py photos cutouts birefnet-general થી ચલાવો. સેશન એક વાર બનાવવું મહત્વનું છે: મોડેલ લોડ કરવામાં તેને ચલાવવા કરતાં ઘણો વધુ સમય લાગે છે, અને rembg README બેચ પર્ફોર્મન્સ માટે સેશન ફરી વાપરવાની ભલામણ કરે છે. આઉટપુટ હંમેશાં PNG હોય છે કારણ કે પરિણામમાં આલ્ફા ચેનલ હોય છે.
rembg ક્યાં ઓછું પડે છે
- મોડેલ ડાઉનલોડ થતું હોય ત્યારે પહેલો રન ધીમો હોય છે, અને મોટાં મોડેલને ઘણી RAM કે VRAM જોઈએ.
- ઊંચી ક્વોલિટીનાં મોડેલ સાથે CPU થ્રુપુટ સાધારણ છે. હજાર ઇમેજ પર જતાં પહેલાં 20 પ્રતિનિધિ ઇમેજ પર ટેસ્ટ કરો.
- લાઇસન્સ અને ડ્રાઇવર તમારી જવાબદારી છે. rembg અને મોડેલનાં વર્ઝન પિન કરો જેથી પછીનું અપગ્રેડ ચૂપચાપ પરિણામ ન બદલે.
વિકલ્પ B: HTTP API
API સાથે ભારે કામ બીજા કોઈના GPU પર થાય છે, અને તમારી સ્ક્રિપ્ટનું કામ મુખ્યત્વે નેટવર્ક સારી રીતે સંભાળવાનું છે. ઉદાહરણમાં removebackground.dev API વપરાય છે કારણ કે તેનો કોન્ટ્રાક્ટ /openapi.json પર OpenAPI 3.1 તરીકે પ્રકાશિત છે; આ જ પેટર્ન આવી કોઈ પણ સર્વિસને લાગુ પડે છે.
કોન્ટ્રાક્ટ
x-api-keyહેડરમાં તમારી કી સાથેPOST https://removebackground.dev/v1/remove.- ઇમેજ મલ્ટિપાર્ટ ફીલ્ડ
image_fileતરીકે મોકલો (JPG, PNG કે WebP, 25 MB સુધી), કેimage_urlસાથે JSON તરીકે. - વૈકલ્પિક ફીલ્ડમાં
format(png,jpgકેwebp),bg_color,size(preview,medium,hd,full) અનેcropછે. - 200 એટલે બોડી તૈયાર ઇમેજ છે. 202 એટલે આશરે 55 સેકન્ડ પછી પણ પ્રોસેસ ચાલુ છે: બોડી જોબ
idસાથેનું JSON છે, અને તમેGET /v1/jobs/{id}/resultપોલ કરો છો, જે ઇમેજ તૈયાર ન થાય ત્યાં સુધીRetry-Afterસાથે 409not_readyજવાબ આપે છે. ક્યારેય 202 બોડીને ઇમેજ તરીકે સેવ ન કરો. - એકાઉન્ટ દીઠ મિનિટે 60 સુધી પ્રોસેસિંગ રિક્વેસ્ટ; તેનાથી વધુ થાય તો
Retry-Afterસાથે 429rate_limitedમળે છે. Idempotency-Keyહેડર રિટ્રાયને સુરક્ષિત બનાવે છે: એ જ રિક્વેસ્ટ સાથે એ જ કી ફરી ચાર્જ કરવાને બદલે મૂળ જોબ પાછી આપે છે. અલગ રિક્વેસ્ટ સાથે એ જ કી 409idempotency_key_reusedજવાબ આપે છે.- પરિણામ 48 કલાક પછી ડિલીટ થાય છે, તેથી મળે ત્યારે જ સેવ કરો.
બે વાર ચૂકવણીથી બચાવતા રિટ્રાય નિયમો
| રિસ્પોન્સ | શું કરવું |
|---|---|
| 200 | ઇમેજ સેવ કરો |
| 202 | જોબનું પરિણામ પોલ કરો; ફરી અપલોડ ન કરો |
| 400, 401, 402, 413, 422 | રિક્વેસ્ટ, કી, ક્રેડિટ કે ઇમેજ સુધારો; લૂપ ન કરો |
| 429 | Retry-After સેકન્ડ રાહ જુઓ, એ જ કી સાથે ફરી મોકલો |
| 500, 503, ટાઇમઆઉટ, કનેક્શન તૂટ્યું | થોભીને એ જ કી સાથે ફરી મોકલો |
| 502 | એ ઇમેજ નિષ્ફળ ગઈ અને ચાર્જ થઈ નથી; લોગ કરો |
યુક્તિ એ છે કે idempotency કી નિશ્ચિત બનાવો: ઇમેજના બાઇટ અને વિકલ્પોનો હેશ. સ્ક્રિપ્ટ ક્રેશ થાય અને તમે ફરી ચલાવો, તો દરેક ફરી મોકલેલી રિક્વેસ્ટ એ જ કી લઈ જાય છે, તેથી કંઈ પણ બે વાર પ્રોસેસ કે ચાર્જ થતું નથી.
Python સ્ક્રિપ્ટ
import hashlib
import mimetypes
import os
import sys
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from pathlib import Path
import requests
API = os.environ.get("REMOVEBG_API", "https://removebackground.dev")
KEY = os.environ["REMOVEBG_API_KEY"] # keep the key out of your code
OPTIONS = {"format": "png", "size": "full"} # or {"format": "jpg", "bg_color": "ffffff"}
WORKERS = 4 # the API allows 60 processing requests a minute
EXTS = {".jpg", ".jpeg", ".png", ".webp"}
RETRYABLE = {429, 500, 503}
def idempotency_key(data: bytes) -> str:
# Same image + same options = same key, so a rerun never pays twice.
h = hashlib.sha256(data)
h.update(repr(sorted(OPTIONS.items())).encode())
return h.hexdigest()
def wait(res, default=2.0):
try:
return float(res.headers.get("Retry-After", default))
except ValueError:
return default
def save(res, dst: Path) -> Path:
if res.status_code != 200 or not res.headers.get("Content-Type", "").startswith("image/"):
raise RuntimeError(f"HTTP {res.status_code}: {res.text[:300]}")
dst.write_bytes(res.content)
return dst
def process(src: Path, dst: Path) -> Path:
data = src.read_bytes()
mime = mimetypes.guess_type(src.name)[0] or "application/octet-stream"
headers = {"x-api-key": KEY, "Idempotency-Key": idempotency_key(data)}
for attempt in range(6):
try:
res = requests.post(
f"{API}/v1/remove",
files={"image_file": (src.name, data, mime)},
data=OPTIONS,
headers=headers,
timeout=(10, 120),
)
except (requests.ConnectionError, requests.Timeout):
time.sleep(2 ** attempt) # same key: safe to resend
continue
if res.status_code in RETRYABLE:
time.sleep(wait(res, 2 ** attempt))
continue
break
else:
raise RuntimeError("gave up after retries")
if res.status_code != 202:
return save(res, dst) # 200 is the image; 4xx and 502 raise
# 202: still processing. Poll the same job; never upload the image again.
job_id = res.json()["id"]
deadline = time.monotonic() + 600
while time.monotonic() < deadline:
time.sleep(wait(res))
try:
res = requests.get(f"{API}/v1/jobs/{job_id}/result", headers=headers, timeout=30)
except (requests.ConnectionError, requests.Timeout):
continue # reading a job is free and safe to repeat
if res.status_code == 409 and res.json()["error"]["code"] == "not_ready":
continue
if res.status_code >= 500:
continue
return save(res, dst)
raise TimeoutError(f"job {job_id} still running; fetch it later")
def main(in_dir: str, out_dir: str) -> None:
src_dir, dst_dir = Path(in_dir), Path(out_dir)
dst_dir.mkdir(parents=True, exist_ok=True)
ext = ".jpg" if OPTIONS.get("format") == "jpg" else "." + OPTIONS.get("format", "png")
todo = [
(p, dst_dir / (p.stem + ext))
for p in sorted(src_dir.iterdir())
if p.suffix.lower() in EXTS and not (dst_dir / (p.stem + ext)).exists()
]
print(f"{len(todo)} images to process")
failed = []
with ThreadPoolExecutor(max_workers=WORKERS) as pool:
jobs = {pool.submit(process, s, d): s for s, d in todo}
for fut in as_completed(jobs):
src = jobs[fut]
try:
print("ok ", src.name, "->", fut.result().name)
except Exception as e:
failed.append(src.name)
print("failed", src.name, e)
print(f"done: {len(todo) - len(failed)} ok, {len(failed)} failed")
if __name__ == "__main__":
main(sys.argv[1], sys.argv[2])REMOVEBG_API_KEY=... python batch_api.py photos cutouts થી ચલાવો. ચાર વર્કર સાધારણ શરૂઆત છે; ઝડપી રિસ્પોન્સથી મિનિટની મર્યાદા પાર થાય તો 429 હેન્ડલિંગ રાહ જોઈને એ જ કી સાથે ફરી મોકલે છે. ફાઇલને બદલે URL મોકલવા JSON પોસ્ટ કરો:
res = requests.post(
f"{API}/v1/remove",
json={"image_url": "https://example.com/shoe.jpg", "format": "png"},
headers={"x-api-key": KEY, "Idempotency-Key": "shoe-front-v1"},
timeout=(10, 120),
)URL ની લાંબી યાદી માટે એ જ API માં POST /v1/batch છે, જે 100 સુધી ઇમેજ URL ને એક જોબ તરીકે કતારમાં મૂકે છે, જેને તમે પોલ કરો છો.
કોઈ પણ બેચ જોબને મજબૂત બનાવવી
- પૂરાં થયેલાં આઉટપુટ છોડી દો જેથી ફરી ચલાવો ત્યારે શરૂઆતથી નહીં, જ્યાં અટક્યું હતું ત્યાંથી ચાલે. બંને સ્ક્રિપ્ટ આમ કરે છે.
- નામની ટક્કર પર ધ્યાન રાખો. એક જ ફોલ્ડરમાં
shoe.jpgઅનેshoe.pngબંનેshoe.pngબની જાય છે; ઇનપુટનાં નામ બદલો કે આઉટપુટ નામમાં મૂળ એક્સટેન્શન રાખો. - નિષ્ફળતા ફાઇલમાં લોગ કરો અને માત્ર એ જ ફરી ચલાવો.
- બધું પ્રોસેસ કરતાં પહેલાં ઘેરા અને આછા બેકગ્રાઉન્ડ પર 100% ઝૂમે થોડા નમૂના તપાસો.
- મૂળ ફાઇલ જેમની તેમ રાખો. અલગ આઉટપુટ ફોલ્ડરમાં લખો.
- મંજિલ મુજબ આઉટપુટ ફોર્મેટ પસંદ કરો. ટ્રાન્સપરન્સી માટે PNG કે WebP, માર્કેટપ્લેસ માટે સફેદ પર JPG. જુઓ PNG વિરુદ્ધ JPEG વિરુદ્ધ WebP.
પ્રશ્નો
શું rembg વ્યાવસાયિક ઉપયોગ માટે ફ્રી છે?
rembg પોતે MIT-લાઇસન્સવાળું છે, પણ દરેક મોડેલનું પોતાનું લાઇસન્સ છે. ડિફોલ્ટ મોડેલ, BRIA નું RMBG-2.0 (bria-rmbg), વ્યાવસાયિક ઉપયોગ માટે પેઇડ કરાર માગે છે, તેથી તમે વાપરો તે મોડેલનું લાઇસન્સ તપાસો કે બીજું પસંદ કરો.
શું rembg આપમેળે મારું GPU વાપરે છે?
હા, જો તમે rembg[gpu] ઇન્સ્ટોલ કરો અને ONNX Runtime CUDA પ્રોવાઇડર લોડ કરી શકે (જેના માટે મેળ ખાતાં CUDA અને cuDNN જોઈએ). rembg ઉપલબ્ધ હોય ત્યારે CUDA કે ROCm વાપરે છે અને CPU પર પાછું જાય ત્યારે ચેતવણી આપે છે. onnxruntime.get_available_providers() થી તપાસો.
કયું rembg મોડેલ શ્રેષ્ઠ ક્વોલિટી આપે છે?
નવાં મોડેલ, bria-rmbg (ડિફોલ્ટ), birefnet કુટુંબ અને isnet-general-use, જૂના u2net કુટુંબ કરતાં વધુ નરમ અને સુઘડ આકારની કિનારી આપે છે. લોકો માટે birefnet-portrait સારી શરૂઆત છે. તમારી પોતાની ઇમેજના નમૂના પર ટેસ્ટ કરો, કારણ કે સબ્જેક્ટ પ્રમાણે પરિણામ બદલાય છે.
API કોલ રિટ્રાય કરતી વખતે બે વાર ચાર્જથી કેવી રીતે બચવું?
Idempotency-Key હેડર મોકલો અને એ જ ઇમેજના દરેક રિટ્રાય પર તે ફરી વાપરો. ઇમેજના બાઇટ અને વિકલ્પોના હેશમાંથી તે બનાવો તો આખી સ્ક્રિપ્ટ ફરી ચલાવો તો પણ એ જ કી વપરાય છે.
202 રિસ્પોન્સ મળે ત્યારે મારી સ્ક્રિપ્ટે શું કરવું?
તેને ઇમેજ નહીં, હજી પ્રોસેસ ચાલુ છે એમ ગણો. JSON બોડીમાંથી જોબ id વાંચો અને GET /v1/jobs/{id}/result પોલ કરો, જ્યારે પણ તે 409 not_ready જવાબ આપે ત્યારે Retry-After મુજબ રાહ જુઓ. ઇમેજ ફરી અપલોડ ન કરો.
removebackground.dev API ને કેટલી ઝડપે રિક્વેસ્ટ મોકલી શકાય?
એકાઉન્ટ દીઠ મિનિટે 60 સુધી પ્રોસેસિંગ રિક્વેસ્ટ. તેનાથી વધુ થાય તો API Retry-After હેડર સાથે 429 rate_limited જવાબ આપે છે. ઘણા URL માટે POST /v1/batch રિક્વેસ્ટ દીઠ 100 સુધી સ્વીકારે છે.
તમારી પોતાની ઇમેજ પર અજમાવો
નવા એકાઉન્ટને 50 મફત ક્રેડિટ મળે છે. દરેક ઇમેજ માટે 1 ક્રેડિટ, કોઈ સબ્સ્ક્રિપ્શન નહીં, અને ક્રેડિટ ક્યારેય સમાપ્ત થતી નથી.
બેકગ્રાઉન્ડ દૂર કરોસ્રોત
- rembg on GitHub (README: installation, models, edge modes)
- rembg on PyPI (version and Python requirement)
- BRIA RMBG-2.0 model card and license
- ONNX Runtime: Get started and installation matrix
- removebackground.dev API reference and guides
- removebackground.dev OpenAPI 3.1 schema
- Requests: Quickstart (multipart file uploads, timeouts)