[图片训练]处理图片脚本

最近在玩AI绘图,进行Lora模型或者其他训练时需要对图片进行预处理,当然stable diffusion web ui本身就有预处理脚本了,lora训练库里也有相关脚本.

但我这里还是写了一个分享一下

import os
import argparse
from PIL import Image,ImageFilter
import imghdr
from rembg import remove


imgType_list = {'jpg','bmp','png','jpeg','rgb','tif',"webp"}
global outputpath
global autopath
def save(img,file):
    """
    save img
    :param img:
    :param file:
    :return:
    """
    if os.path.isfile(outputpath):
        if autopath:
            img.save(file)
        else:
            img.save(outputpath)
    else:
        if autopath:
            img.save(file)
        else:
            img.save(os.path.join(outputpath,os.path.basename(file)))

def resizeimg(files,size):
    """
    resize img to size
    :param file:
    :return:
    """
    print("图片进行Resize")
    if os.path.isfile(files):
        img = Image.open(files)
        img = img.resize(size)
        save(img,files)
    else:
        for root, dirs, file in os.walk(files):
            for f in file:
                if imghdr.what(os.path.join(root, f)) in imgType_list:
                    img = Image.open(os.path.join(root, f))
                    img = img.resize(size)
                    save(img, os.path.join(root, f))
            for dir in dirs:
                resizeimg(os.path.join(root,dir),size)
def renameimg(files):
    """
    rename img index
    :param file:
    :return:
    """
    print("图片进行Rename")
    if os.path.isfile(files):
        img = Image.open(files)
        if autopath:
            img.save(os.path.join(os.path.dirname(files),"0.jpg"))
        else:
            img.save(os.path.join(outputpath, "0.jpg"))
    else:
        for root,dirs, files in os.walk(files):
            for i,f in enumerate(files):
                if imghdr.what(os.path.join(root, f)) in imgType_list:
                    img = Image.open(os.path.join(root, f))
                    if autopath:
                        img.save(os.path.join(root,str(i)+".jpg"))
                    else:
                        img.save(os.path.join(outputpath,str(i)+".jpg"))
            for dir in dirs:
                renameimg(os.path.join(root,dir))

def removeimgbg(files):
    """
    remove img background
    :param file:
    :return:
    """
    print("图片进行去除背景")
    if os.path.isfile(files):
        img = Image.open(files)
        if files.split('.')[-1] == "jpg":
            img = img.convert('RGB')
            img = img.filter(ImageFilter.BLUR)
        output = remove(img)
        if autopath:
            output.save(os.path.join(os.path.dirname(files),os.path.basename(files).split('.')[0]+".png"))
        else:
            output.save(os.path.join(os.path.dirname(outputpath),os.path.basename(outputpath).split('.')[0]+".png"))
    else:
        for file in os.listdir(files):
            img = Image.open(os.path.join(files,file))
            output = remove(img)
            if autopath:
                output.save(os.path.join(files, os.path.basename(file).split('.')[0]+".png"))
            else:
                output.save(os.path.join(outputpath, os.path.basename(file).split('.')[0]+".png"))

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', '--input', help='input file path,allow file and dir',required=True) # get input path
    parser.add_argument('-o', '--output', help='output file path') # get output path
    parser.add_argument('-s', '--size', help='output size',nargs=2,type=int)  # get output size
    parser.add_argument('-r', '--removebg', help='remove background',type=bool) # remove background
    parser.add_argument('-e', '--rename', help='rename file',type=bool) # rename file (index)
    parser.add_argument('-a', '--autopath', help='outputpath same as the img path',type=bool) # rename file (index)
    

    args = parser.parse_args()
    file = args.input
    autopath = args.autopath
    if os.path.isfile(file):
        outputpath = args.output if args.output else file
    elif os.path.isdir(file):
        outputpath = args.output if args.output else file
        if not os.path.exists(outputpath):
            os.makedirs(outputpath)
    else:
        print("input file or dir is not exist")
        exit()
        
    size = args.size
    removebg = args.removebg
    rename = args.rename


    if os.path.exists(file):
        """
        if input is a file or dir 
        """
        if size:
            resizeimg(file,size=size)
        if removebg:
            removeimgbg(file)
        if rename:
            renameimg(file)
    else:
        print("input file or dir is not exist")

介绍

主要是图片剪裁,重命名和去除背景.去除背景也是最重要的,使用了rembg这个包.

官网danielgatis/rembg: Rembg is a tool to remove images background (github.com),可以考虑GPU版本.

同时测试时也发现如果是.jpg文件去掉背景会存在一些问题,是什么通道还是啥问题,不过使用格式转换啥的最终也解决了.

包环境

requirements如下,因为环境问题,可能有一些用不上的包.

aiohttp==3.8.4
aiosignal==1.3.1
anyio==3.6.2
async-timeout==4.0.2
asyncer==0.0.2
attrs==23.1.0
certifi==2022.12.7
charset-normalizer==3.1.0
click==8.1.3
colorama==0.4.6
coloredlogs==15.0.1
fastapi==0.95.1
filelock==3.12.0
filetype==1.2.0
flatbuffers==23.3.3
frozenlist==1.3.3
h11==0.14.0
humanfriendly==10.0
idna==3.4
ImageHash==4.3.1
imageio==2.27.0
Jinja2==3.1.2
lazy_loader==0.2
llvmlite==0.39.1
MarkupSafe==2.1.2
mpmath==1.3.0
multidict==6.0.4
networkx==3.1
numba==0.56.4
numpy==1.23.5
onnxruntime==1.14.1
opencv-python-headless==4.7.0.72
packaging==23.1
Pillow==9.5.0
platformdirs==3.2.0
pooch==1.7.0
protobuf==4.22.3
pydantic==1.10.7
PyMatting==1.1.8
pyreadline3==3.4.1
python-multipart==0.0.6
rembg==2.0.32
requests==2.28.2
scikit-image==0.20.0
scipy==1.10.1
sniffio==1.3.0
starlette==0.26.1
sympy==1.11.1
tifffile==2023.4.12
torch==2.0.0
tqdm==4.65.0
typing_extensions==4.5.0
urllib3==1.26.15
uvicorn==0.21.1
watchdog==3.0.0
yarl==1.9.1

本文由mdnice多平台发布

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容