Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| os.system("mim install mmengine") | |
| os.system('mim install "mmcv==2.1.0"') | |
| os.system("mim install mmdet") | |
| import cv2 | |
| from PIL import Image | |
| import numpy as np | |
| import zipfile | |
| import shutil | |
| from animeinsseg import AnimeInsSeg, AnimeInstances | |
| from animeinsseg.anime_instances import get_color | |
| if not os.path.exists("models"): | |
| os.mkdir("models") | |
| os.system("huggingface-cli lfs-enable-largefiles .") | |
| os.system( | |
| "git clone https://huggingface.co/dreMaz/AnimeInstanceSegmentation models/AnimeInstanceSegmentation" | |
| ) | |
| ckpt = r"models/AnimeInstanceSegmentation/rtmdetl_e60.ckpt" | |
| mask_thres = 0.7 | |
| instance_thres = 0.3 | |
| refine_kwargs = { | |
| "refine_method": "refinenet_isnet" | |
| } # set to None if not using refinenet | |
| # refine_kwargs = None | |
| net = AnimeInsSeg(ckpt, mask_thr=mask_thres, refine_kwargs=refine_kwargs) | |
| def fn(image): | |
| img = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) | |
| instances: AnimeInstances = net.infer( | |
| img, output_type="numpy", pred_score_thr=instance_thres | |
| ) | |
| # 创建一个临时文件夹,用来存放每个人物的去除背景的图片 | |
| temp_dir = "outputs" | |
| # 删除临时文件夹,避免占用空间 | |
| if os.path.isdir(temp_dir): | |
| shutil.rmtree(temp_dir) | |
| os.makedirs(temp_dir, exist_ok=True) | |
| images = [] | |
| # instances.bboxes, instances.masks will be None, None if no obj is detected | |
| if instances.bboxes is None: | |
| return None | |
| img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | |
| for ii, (xywh, mask) in enumerate(zip(instances.bboxes, instances.masks)): | |
| # 创建一个空白的白色图像,和原图大小一致 | |
| white = np.full_like(img2, 255) | |
| # 把mask转换为bool类型,方便后续操作 | |
| mask = mask.astype(np.bool_) | |
| # 对掩码进行高斯模糊,平滑边缘 | |
| mask_smoothed = cv2.GaussianBlur(mask.astype(np.float32), (3, 3), 0) | |
| # 用原图中对应的区域替换白色图像中的区域,实现去除背景的效果 | |
| white[mask_smoothed > 0.5] = img2[mask_smoothed > 0.5] | |
| # 给每个人物编号,然后用cv2.imwrite函数来保存图片到文件夹中 | |
| filename = f"person_{ii+1}.png" | |
| filepath = os.path.join(temp_dir, filename) | |
| images.append(white) | |
| cv2.imwrite(filepath, white[..., ::-1]) | |
| # 创建一个压缩包,然后用zipfile.write函数来把文件夹中的所有图片添加到压缩包中 | |
| zip_name = "persons.zip" | |
| zip_path = os.path.join(temp_dir, zip_name) | |
| with zipfile.ZipFile(zip_path, "w") as zf: | |
| for file in os.listdir(temp_dir): | |
| if file != zip_name: | |
| zf.write(os.path.join(temp_dir, file), file) | |
| # 返回一个图片文件和一个压缩包文件 | |
| return images, zip_path | |
| # 在gr.Interface中添加outputs参数,把fn函数的输出作为一个列表传入 | |
| iface = gr.Interface( | |
| # design titles and text descriptions | |
| title="Anime Subject Instance Segmentation", | |
| fn=fn, | |
| inputs=gr.Image(type="numpy"), | |
| outputs=[ | |
| gr.Gallery( | |
| label="Anime Subject Instance Segmentation", | |
| show_label=False, | |
| elem_id="gallery", | |
| columns=[4], | |
| rows=[4], | |
| object_fit="contain", | |
| height="auto", | |
| ), | |
| gr.File(type="filepath", label="Download Zip"), | |
| ], # 添加一个压缩包组件,给它一个名称 | |
| examples=["1562990.jpg", "612989.jpg", "sample_3.jpg"], | |
| ) | |
| iface.launch() |