ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Rembg Python API 实战教程:一行代码抠出图片,从安装到批量处理

Rembg Python API 实战教程:一行代码抠出图片,从安装到批量处理 Rembg Python API 实战教程一行代码抠出图片从安装到批量处理【免费下载链接】rembgRembg is a tool to remove images background项目地址: https://gitcode.com/GitHub_Trending/re/rembg如果你需要把照片里的背景擦掉只留主体用 Python 抠图会比手动描边靠谱得多。Rembg 就是一个基于深度学习的背景移除库给它一张图它还给你一张去掉背景的图。下面从安装的第一条命令开始带你走完 Rembg 的 Python 用法单张处理、选模型、整个文件夹批量跑、精修参数再给两个能直接落地的场景最后整理常见翻车原因。Rembg 一句话开箱即用的背景移除引擎Rembg 的原理是用 onnxruntime 运行预训练模型自动识别前景并输出透明图。人物、动物、车辆、植物、动漫角色都能处理不同模型各有所长。先看项目 examples 目录里的一张车图对比左为原图右为remove()的输出背景已透明拿到第一张透明图安装、版本与最小代码先确认 Python 版本Rembg 要求 3.11 及以上、低于 3.14python --version安装按硬件二选一。纯 CPU 机器pip install rembg[cpu] # 仅装库 pip install rembg[cpu,cli] # 库 命令行工具有 NVIDIA 显卡的把cpu换成gpu即可前提是本机支持 onnxruntime-gpu对照 onnxruntime 安装矩阵确认你的系统和 CUDA 组合在支持列表里pip install rembg[gpu]装好后四行代码拿到第一张透明图from rembg import remove from PIL import Image input_image Image.open(car-2.jpg) # 输入可以是 PIL 对象 output_image remove(input_image) # 默认使用 u2net 模型 output_image.save(car-2.out.png)首次运行会自动把模型下载到主目录下的~/.u2net之后走缓存。remove()的入参不挑格式除了 PIL Image字节串和 numpy 数组都行。如果你的数据本来就是字节可以直接这样写with open(car-2.jpg, rb) as f: result remove(f.read()) # 传入 bytes返回 bytes换个模型换种抠图效果按图片类型对号入座默认 u2net 能兜住大部分场景但遇到特定题材时专用模型明显更好。按你手里是什么图来选图片类型模型说明通用场景u2net默认模型速度与精度均衡资源受限环境u2netp、silueta轻量快速silueta 仅约 43MB人物、人体u2net_human_seg针对人体识别人像照片birefnet-portrait高精度人像专用商品、日常物体birefnet-general精度高速度略慢动漫人物isnet-anime动漫风格专用衣物分割u2net_cloth_seg可分出上半身、下半身高分辨率细节birefnet-hrsod适合细节复杂的图交互式指定sam点几个点告诉模型哪里是前景每个模型的实现都在 rembg/sessions/ 里想看某个模型怎么跑的可以直接翻源码。指定模型用new_sessionfrom rembg import remove, new_session from PIL import Image session new_session(birefnet-portrait) # 加载人像专用模型 img Image.open(girl-2.jpg) remove(img, sessionsession).save(girl-2.out.png)new_session会真正加载模型所以下面批量处理时它只该出现一次。另外sam模型支持用点击点引导适合模型拿不准主体的画面import numpy as np session new_session(sam) points np.array([[300, 400]]) # [y, x] 坐标 labels np.array([1]) # 1 表示前景0 表示背景 remove(img, sessionsession, input_pointspoints, input_labelslabels)从一张图到一整个文件夹批量处理写法处理一批图时最该省的是模型加载。remove()不传 session 时每次调用都会隐式建一个新会话模型反复读盘是批量慢的头号原因。正确姿势session 建一次循环里一直复用from pathlib import Path from PIL import Image from rembg import remove, new_session session new_session(birefnet-general) # 只加载一次 input_dir Path(examples) output_dir Path(output) output_dir.mkdir(exist_okTrue) for img_path in input_dir.glob(*.jpg): with Image.open(img_path) as img: # with 及时释放大图不累积 result remove(img, sessionsession) result.save(output_dir / f{img_path.stem}_out.png) print(f完成: {img_path.name})这段会扫完 examples 下所有 jpg 并写进 output 目录。文件夹里人像和商品混着放也没关系可以在分组处切一次 session但千万别每张图重建。 三个开关精修抠图边缘过渡、只出 Mask、换底色抠完之后有三个参数各管一件事。开关一alpha matting管边缘过渡。默认抠图的前景背景分界比较硬毛发、发丝容易缺一圈。开启 alpha matting 后模型会对边缘半透明区域做估计过渡更自然result remove( img, alpha_mattingTrue, alpha_matting_foreground_threshold240, # 高于此值判定为前景 alpha_matting_background_threshold10, # 低于此值判定为背景 alpha_matting_erode_size10, # 掩码腐蚀尺寸 )边缘留白就调高前景阈值发现主体缺块就调低erode_size控制收缩幅度。开关二only_mask只输出掩码。有些流水线不想要透明图只要一张黑白区域图白是前景黑是背景后续自己拿去合成或做统计mask remove(img, only_maskTrue) mask.save(mask.png)不同模型在同一张图上的掩码差异可以在 tests/results/ 里对照比如 u2net 的输出开关三bgcolor直接替换底色。默认输出是透明 PNG如果你的目标是白底或蓝底成品直接把bgcolor传给remove()省掉二次合成# 四元组为 RGBA最后一个数字是透明度 remove(img, bgcolor(255, 255, 255, 255)).save(white-bg.png)拿去干活证件照换底色和视频逐帧抠图两个场景场景一证件照换红蓝白底。人像模型 alpha 合成十几行代码from rembg import remove, new_session from PIL import Image def change_id_photo_bg(input_path, output_path, bg_color(67, 142, 219, 255)): session new_session(birefnet-portrait) # 人像模型边缘更干净 with Image.open(input_path) as img: transparent remove(img, sessionsession) bg Image.new(RGBA, transparent.size, bg_color) # 生成纯色底 result Image.alpha_composite(bg, transparent) # 把人物合成上去 result.convert(RGB).save(output_path, JPEG) change_id_photo_bg(original_id.jpg, new_id.jpg)场景二视频逐帧抠图。用 FFmpeg 把视频拆成原始帧逐帧抠session 必须全程复用import subprocess import numpy as np from rembg import remove, new_session session new_session(u2netp) # 视频场景选轻量模型保速度 width, height 1280, 720 cmd [ffmpeg, -i, input.mp4, -f, rawvideo, -pix_fmt, rgb24, -] pipe subprocess.Popen(cmd, stdoutsubprocess.PIPE) results [] while True: raw pipe.stdout.read(width * height * 3) if not raw: break frame np.frombuffer(raw, np.uint8).reshape((height, width, 3)) results.append(remove(frame, sessionsession)) # 之后可用 ffmpeg 把 results 重新编码成视频逐帧是重任务模型选u2netp这类轻量款帧率才撑得住。 翻车了怎么办四个常见问题的解法症状可能原因解决模型下载失败网络访问不到模型源~/.u2net里没有文件按 README.md 的模型列表手动下载放进~/.u2net处理大图内存不足模型本身重 分辨率高换u2netp、silueta等轻量模型或先缩小图片速度慢每张图重复建 sessionCPU 跑大图复用 session条件允许装rembg[gpu]降低分辨率抠图精度差、缺边模型和题材不匹配换专用模型动漫用isnet-anime、人像用birefnet-portrait或开 alpha matting多核 CPU 上线程打架时可以设环境变量OMP_NUM_THREADS限制线程数new_session 会读取它并同步设置 onnxruntime 的线程选项。写在最后Rembg 的核心就两个函数new_session()决定用哪个模型remove()决定怎么出图其余都是组合拳。想看 HTTP 服务、Docker 部署或更多命令行参数翻 USAGE.md或者直接在终端跑rembg --help命令行工具本身就能独立干活。【免费下载链接】rembgRembg is a tool to remove images background项目地址: https://gitcode.com/GitHub_Trending/re/rembg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表