# import base64 | |
# import requests | |
# import os | |
# from PIL import Image | |
# import io | |
# def inpaint(img_path:str,mask_path:str)->"img content (resp.content)": | |
# image_bytes = open(img_path, 'rb') | |
# mask_bytes = open(mask_path, 'rb') | |
# # 将字节数据转换为Base64编码的字符串 | |
# files = { | |
# "image": image_bytes, | |
# "mask":mask_bytes | |
# } | |
# payload = { | |
# "ldmSteps": 25, | |
# "ldmSampler": "plms", | |
# "zitsWireframe": True, | |
# "hdStrategy": "Crop", | |
# "hdStrategyCropMargin": 196, | |
# "hdStrategyCropTrigerSize": 800, | |
# "hdStrategyResizeLimit": 2048, | |
# "prompt": "", | |
# "negativePrompt": "", | |
# "croperX": 307, | |
# "croperY": 544, | |
# "croperHeight": 512, | |
# "croperWidth": 512, | |
# "useCroper": False, | |
# "sdMaskBlur": 5, | |
# "sdStrength": 0.75, | |
# "sdSteps": 50, | |
# "sdGuidanceScale": 7.5, | |
# "sdSampler": "uni_pc", | |
# "sdSeed": -1, | |
# "sdMatchHistograms": False, | |
# "sdScale": 1, | |
# "cv2Radius": 5, | |
# "cv2Flag": "INPAINT_NS", | |
# "paintByExampleSteps": 50, | |
# "paintByExampleGuidanceScale": 7.5, | |
# "paintByExampleSeed": -1, | |
# "paintByExampleMaskBlur": 5, | |
# "paintByExampleMatchHistograms": False, | |
# "p2pSteps": 50, | |
# "p2pImageGuidanceScale": 1.5, | |
# "p2pGuidanceScale": 7.5, | |
# "controlnet_conditioning_scale": 0.4, | |
# "controlnet_method": "control_v11p_sd15_canny" | |
# }#payload用data | |
# #不使用header | |
# #resp = requests.post("https://sanster-lama-cleaner-lama.hf.space/inpaint", data=payload, files=files) | |
# #使用自己的space | |
# resp = requests.post("https://rogerxavier-lama-cleaner-lama.hf.space/inpaint", data=payload, files=files) | |
# print("请求lama clenaer状态是",resp.status_code) | |
# return bytes(resp.content) | |
# def save_img(img_content:"要处理的图片数据",new_save_path:"新文件的保存路径(包含后缀)",old_img_path:"旧文件路径")->"void生成新的文件保存 ,传入旧文件路径是为了删除有问题的旧文件": | |
# print(new_save_path) | |
# try: | |
# img = Image.open(io.BytesIO(img_content)) | |
# # 如果需要指定图像格式,可以在保存时指定 | |
# img.save(new_save_path, format="JPEG") | |
# except Exception as e: | |
# #对于可能异常的图片->比如因为不合规导致resp.content没有正常返回 | |
# print(e,new_save_path,"图片返回有问题,跳过并删除图片.这里的路径是新保存路径") | |
# os.remove(old_img_path) | |
# if __name__ == '__main__': | |
# # 获取当前目录的子目录的路径 | |
# img_path = 'manga' | |
# subdir_path = os.path.join(os.getcwd(), img_path) | |
# # 图片素材获取(包含子目录下所有图片) | |
# image_files = [] | |
# for root, dirs, files in os.walk(subdir_path): | |
# for file in files: | |
# if file.endswith(".jpg") or file.endswith(".png"): | |
# image_files.append(os.path.relpath(os.path.join(root, file))) | |
# # 创建处理后的子目录在与image_files同级目录下 | |
# processed_subdir_path = os.path.join(os.path.dirname(subdir_path), f"{img_path}1") | |
# os.makedirs(processed_subdir_path, exist_ok=True) | |
# # 对image_files进行某种处理,生成新图片,并保存在处理后的子目录中 | |
# for img_file in image_files: | |
# # 处理图片的代码(这里仅作示例) | |
# # 假设处理后的图片为new_img | |
# img_dir = os.path.dirname(img_file) | |
# new_img_dir = os.path.join(processed_subdir_path, img_dir) | |
# os.makedirs(new_img_dir, exist_ok=True) | |
# new_img_path = os.path.join(new_img_dir, os.path.basename(img_file)) | |
# if not os.path.exists(new_img_path): | |
# #如果已经处理过那么跳过 | |
# # 处理图片并保存 | |
# img_inpainted = inpaint(img_path=img_file, mask_path='mask/0.jpg')#上传的遮罩保存都是0开始 | |
# save_img(img_content=img_inpainted, new_save_path=new_img_path,old_img_path=img_file) | |
# else: | |
# print(f"Skipping {new_img_path} as it already exists.") | |
import base64 | |
import requests | |
import os | |
from typing import List | |
import io | |
from PIL import Image | |
from pydantic import BaseModel | |
from lama_cleaner.server import process | |
from lama_cleaner.server import main#先初始化才能用process | |
#C:\Users\17331\.cache\torch\hub 缓存下载位置,记得删 | |
class FakeArgs(BaseModel): | |
host: str = "0.0.0.0" | |
port: int = 7860 | |
model: str = 'lama' | |
hf_access_token: str = "" | |
sd_enable_xformers: bool = False | |
sd_disable_nsfw: bool = False | |
sd_cpu_textencoder: bool = True | |
sd_controlnet: bool = False | |
sd_controlnet_method: str = "control_v11p_sd15_canny" | |
sd_local_model_path: str = "" | |
sd_run_local: bool = False | |
local_files_only: bool = False | |
cpu_offload: bool = False | |
device: str = "cpu" | |
gui: bool = False | |
gui_size: List[int] = [1000, 1000] | |
input: str = '' | |
disable_model_switch: bool = True | |
debug: bool = False | |
no_half: bool = False | |
disable_nsfw: bool = False | |
enable_xformers: bool = False | |
enable_interactive_seg: bool = True | |
interactive_seg_model: str = "vit_b" | |
interactive_seg_device: str = "cpu" | |
enable_remove_bg: bool = False | |
enable_anime_seg: bool = False | |
enable_realesrgan: bool = False | |
enable_gfpgan: bool = False | |
gfpgan_device: str = "cpu" | |
enable_restoreformer: bool = False | |
enable_gif: bool = False | |
quality: int = 95 | |
model_dir: str = None | |
output_dir: str = None | |
def inpaint(img_path: str, mask_path: str) -> "img content (resp.content)": | |
# urllib3 1.26.4 兼容 | |
image_bytes = open(img_path, 'rb') | |
mask_bytes = open(mask_path, 'rb') | |
# 将字节数据转换为Base64编码的字符串 | |
files = { | |
"image": image_bytes, | |
"mask": mask_bytes | |
} | |
payload = { | |
"ldmSteps": 25, | |
"ldmSampler": "plms", | |
"zitsWireframe": True, | |
"hdStrategy": "Crop", | |
"hdStrategyCropMargin": 196, | |
"hdStrategyCropTrigerSize": 800, | |
"hdStrategyResizeLimit": 2048, | |
"prompt": "", | |
"negativePrompt": "", | |
"croperX": 307, | |
"croperY": 544, | |
"croperHeight": 512, | |
"croperWidth": 512, | |
"useCroper": False, | |
"sdMaskBlur": 5, | |
"sdStrength": 0.75, | |
"sdSteps": 50, | |
"sdGuidanceScale": 7.5, | |
"sdSampler": "uni_pc", | |
"sdSeed": -1, | |
"sdMatchHistograms": False, | |
"sdScale": 1, | |
"cv2Radius": 5, | |
"cv2Flag": "INPAINT_NS", | |
"paintByExampleSteps": 50, | |
"paintByExampleGuidanceScale": 7.5, | |
"paintByExampleSeed": -1, | |
"paintByExampleMaskBlur": 5, | |
"paintByExampleMatchHistograms": False, | |
"p2pSteps": 50, | |
"p2pImageGuidanceScale": 1.5, | |
"p2pGuidanceScale": 7.5, | |
"controlnet_conditioning_scale": 0.4, | |
"controlnet_method": "control_v11p_sd15_canny" | |
} # payload用data | |
resp = process(files=files, payload=payload) | |
return resp | |
def save_img(img_content: "要处理的图片数据", new_save_path: "新文件的保存路径(包含后缀)", | |
old_img_path: "旧文件路径") -> "void生成新的文件保存 ,传入旧文件路径是为了删除有问题的旧文件": | |
print(new_save_path) | |
try: | |
# 从 _io.BytesIO 对象中读取字节数据 | |
resp_bytes = img_content.read() | |
# 使用 Image.open() 方法打开图片 | |
img = Image.open(io.BytesIO(resp_bytes)) | |
# 如果需要指定图像格式,可以在保存时指定 | |
img.save(new_save_path, format="JPEG") | |
except Exception as e: | |
# 对于可能异常的图片->比如因为不合规导致resp.content没有正常返回 | |
print(e, new_save_path, "图片返回有问题,跳过并删除图片.这里的路径是新保存路径") | |
os.remove(old_img_path) | |
if __name__ == '__main__': | |
main(FakeArgs())#初始化model | |
# 获取当前目录的子目录的路径 | |
img_path = 'manga' | |
subdir_path = os.path.join(os.getcwd(), img_path) | |
# 图片素材获取(包含子目录下所有图片) | |
image_files = [] | |
for root, dirs, files in os.walk(subdir_path): | |
for file in files: | |
if file.endswith(".jpg") or file.endswith(".png"): | |
image_files.append(os.path.relpath(os.path.join(root, file))) | |
# 创建处理后的子目录在与image_files同级目录下 | |
processed_subdir_path = os.path.join(os.path.dirname(subdir_path), f"{img_path}1") | |
os.makedirs(processed_subdir_path, exist_ok=True) | |
# 对image_files进行某种处理,生成新图片,并保存在处理后的子目录中 | |
for img_file in image_files: | |
# 处理图片的代码(这里仅作示例) | |
# 假设处理后的图片为new_img | |
img_dir = os.path.dirname(img_file) | |
new_img_dir = os.path.join(processed_subdir_path, img_dir) | |
os.makedirs(new_img_dir, exist_ok=True) | |
new_img_path = os.path.join(new_img_dir, os.path.basename(img_file)) | |
if not os.path.exists(new_img_path): | |
# 如果已经处理过那么跳过 | |
# 处理图片并保存 | |
img_inpainted = inpaint(img_path=img_file, mask_path='mask/0.jpg') # 上传的遮罩保存都是0开始 | |
save_img(img_content=img_inpainted, new_save_path=new_img_path, old_img_path=img_file) | |
else: | |
print(f"Skipping {new_img_path} as it already exists.") | |