【深度学习】fooocusapi,docker,inpainting图像
基础镜像制作来源
fooocusapi接口官方写的:
docker run -d --gpus=all \-e NVIDIA_DRIVER_CAPABILITIES=compute,utility \-e NVIDIA_VISIBLE_DEVICES=all \-p 8888:8888 konieshadow/fooocus-api
会下载一些模型,下载完后推这个镜像
docker commit 4dfd19dd1dc7 kevinchina/deeplearning:fooocusapi-office-v1
写个dockerfile:
FROM kevinchina/deeplearning:fooocusapi-office-v1
EXPOSE 7860
CMD ["python", "main.py", "--host", "0.0.0.0", "--port", "7860", "--skip-pip"]
构建一个新的镜像:
docker build -f Dockerfile . -t kevinchina/deeplearning:fooocusapi-office-v2
docker run -d --gpus=all -p 8881:7860 kevinchina/deeplearning:fooocusapi-office-v2
inpaint还需要下载一些东西,然年成为:
kevinchina/deeplearning:fooocusapi-office-v3
开启镜像
开启方式:
docker run --gpus device=0 -p 7881:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=0 -p 7882:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=1 -p 7883:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=1 -p 7884:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=1 -p 7885:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=2 -p 7886:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=2 -p 7887:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=2 -p 7888:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=3 -p 7889:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=3 -p 7890:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=3 -p 7891:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=3 -p 7892:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=0 -p 8550:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=0 -p 8551:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=1 -p 8552:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=1 -p 8553:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
多进程请求inpaint:
import base64
import io
import os
import traceback
from multiprocessing import Manager, Poolimport requests
import cv2
import numpy as np
import json
from PIL import Image
from PIL import ImageDraw
import numpy as np
import cv2
import pyclipper
from shapely.geometry import Polygon
# plt显示图
import matplotlib.pyplot as plt
from tqdm import tqdm
import jsondef expand_polygon_pyclipper(polygon, expand_ratio):polygon_shape = Polygon(polygon)distance = (polygon_shape.area * (np.power(expand_ratio, 2) - 1) / polygon_shape.length)subject = [tuple(l) for l in polygon]padding = pyclipper.PyclipperOffset()padding.AddPath(subject, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON)expanded = padding.Execute(distance)if expanded == []:expanded = np.array(expanded)else:expanded = np.array(expanded[0]).reshape(-1, 2)return expandeddef shrink_polygon_pyclipper(polygon, expand_ratio):polygon_shape = Polygon(polygon)distance = (polygon_shape.area * (np.power(expand_ratio, 2) - 1) / polygon_shape.length)subject = [tuple(l) for l in polygon]padding = pyclipper.PyclipperOffset()padding.AddPath(subject, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON)expanded = padding.Execute(-distance)if expanded == []:expanded = np.array(expanded)else:expanded = np.array(expanded[0]).reshape(-1, 2)return expanded# 定义函数
def func(x):return 0.25 * (np.sin(x - np.pi / 2) + 1)# 生成0到pi的10个均匀分布的点
x_values = np.linspace(0, np.pi, 11)[1:][::-1]
y_values = func(x_values) + 1
# print(f"面积{len(y_values)}", y_values)
x_values = np.linspace(0, np.pi, 13)[1:]
weight_inpaint = func(x_values) * 2def draw_heatmap(image, polygons):# 计算函数值并加上1# 搞个和image一样大的二维矩阵inpaint_image_weights = np.zeros(image.shape[:2], dtype=np.float32)for i in range(10):for polygon in polygons:expanded_polygon = expand_polygon_pyclipper(polygon, y_values[i])if expanded_polygon.size > 0:cv2.fillPoly(inpaint_image_weights, [expanded_polygon.astype(np.int32)], weight_inpaint[i])# 收缩0.95区域用白色填充for polygon in polygons:for indx, shk in enumerate([0.99, 0.98]):expanded_polygon = shrink_polygon_pyclipper(polygon, shk)if expanded_polygon.size > 0:cv2.fillPoly(inpaint_image_weights, [expanded_polygon.astype(np.int32)], weight_inpaint[10 + indx])return inpaint_image_weightsdef listPathAllfiles(dirname):result = []for maindir, subdir, file_name_list in os.walk(dirname):for filename in file_name_list:apath = os.path.join(maindir, filename)result.append(apath)return resultdef batch_process(index1, src_image_file, urls):url = urls[index1 % len(urls)]ocr_ret_file = src_image_file.replace(".jpg", ".json")txt_file = src_image_file.replace(".jpg", ".txt")output_image_file = src_image_file.replace(src, save_img_dst_output_image_file)output_image_file_alpha = src_image_file.replace(src, save_img_dst_output_inpaint_alpha)if not os.path.exists(ocr_ret_file):returnif not os.path.exists(txt_file):returnif os.path.exists(output_image_file_alpha):returnoutput_image_file_father = os.path.dirname(output_image_file)os.makedirs(output_image_file_father, exist_ok=True)output_image_file_alpha_father = os.path.dirname(output_image_file_alpha)os.makedirs(output_image_file_alpha_father, exist_ok=True)prompt = open(txt_file, "r", encoding="utf-8").read()if len(prompt) < 7:prompt = "a people"# 造一个mask图片在本地mask_file = "tmp_inpaint_mask.jpg"ocr_json_data = json.load(open(ocr_ret_file, "r", encoding="utf-8"))image = cv2.imread(src_image_file)mask = np.zeros(image.shape, dtype=np.uint8)for item in ocr_json_data:box = item[0]cv2.fillPoly(mask, np.array([box], dtype=np.int32), (255, 255, 255))# cv2.imwrite(mask_file, mask)src_image_file_rb = cv2.imencode('.jpg', image)[1].tobytes()mask_file_rb = cv2.imencode('.jpg', mask)[1].tobytes()# 构建请求的 multipart/form-data 数据files = {'input_image': ('src.jpg', src_image_file_rb, 'image/jpeg'),'input_mask': ('mask.jpg', mask_file_rb, 'image/jpeg')}data = {'prompt': prompt,'negative_prompt': 'big nose, watermark, signature, label, worst quality, low quality, normal quality, lowres, watermark, monochrome, grayscale, ugly, blurry, Tan skin, dark skin, black skin, skin spots, skin blemishes, age spot, glans, disabled, distorted, bad anatomy, morbid, malformation, amputation, bad proportions, twins, missing body, fused body, extra head, poorly drawn face, bad eyes, deformed eye, unclear eyes, cross-eyed, long neck, malformed limbs, extra limbs, extra arms, missing arms, bad tongue, strange fingers, mutated hands, missing hands, poorly drawn hands, extra hands, fused hands, connected hand, bad hands, wrong fingers, missing fingers, extra fingers, 4 fingers, 3 fingers, deformed hands, extra legs, bad legs, many legs, more than two legs, bad feet, wrong feet, extra feets, Negro, black people, black race','sharpness': '10','guidance_scale': '5','outpaint_distance_right': '0','loras': '[{"enabled":true,"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]','outpaint_distance_left': '0','outpaint_distance_bottom': '0','image_number': '1','negative_prompt': 'bad','refiner_switch': '0.5','base_model_name': 'juggernautXL_v8Rundiffusion.safetensors','image_seed': '-1','style_selections': ['Fooocus V2', 'Fooocus Enhance', 'Fooocus Sharp'],'inpaint_additional_prompt': '','outpaint_selections': '','refiner_model_name': 'None','aspect_ratios_selection': '1024*1024','performance_selection': 'Speed','require_base64': True,'async_process': False,}headers = {'accept': 'application/json'}try:if len(ocr_json_data) > 0:response = requests.post(url, files=files, data=data, headers=headers)postres = response.json()b64 = postres[0]["base64"]# 将base64字符串解码并保存为图像文件imgdata = base64.b64decode(b64)with open(output_image_file, 'wb') as f:f.write(imgdata)# print(f"Output image saved as {output_image_file}")# pillow讲b64直接转为imageimage_inpaint = Image.open(io.BytesIO(imgdata)).convert('RGB')image_inpaint_cv2 = np.array(image_inpaint)image_inpaint_cv2 = cv2.cvtColor(image_inpaint_cv2, cv2.COLOR_RGB2BGR)# 和原图进行alpha混合text_polys = []for item in ocr_json_data:box = item[0]text_polys.append(np.array(box))alpha = draw_heatmap(image, text_polys)inpaint_image_weights = alpha[:, :, np.newaxis]# print(inpaint_image_weights.shape)new_image = image_inpaint_cv2 * inpaint_image_weights + image * (1 - inpaint_image_weights)cv2.imwrite(output_image_file_alpha, new_image)else:# 直接写入cv2.imwrite(output_image_file_alpha, image)except:print(ocr_ret_file)if __name__ == '__main__':src = r"/ssd/xiedong/xiezhenceshi/xiezhen_datasets"save_img_dst_output_image_file = r"/ssd/xiedong/xiezhenceshi/inpaint_output_image_file"save_img_dst_output_inpaint_alpha = r"/ssd/xiedong/xiezhenceshi/inpaint_alpha2"os.makedirs(save_img_dst_output_image_file, exist_ok=True)os.makedirs(save_img_dst_output_inpaint_alpha, exist_ok=True)files = listPathAllfiles(src)files.sort()files = [file for file in files if file.endswith(".jpg")][5304:]tasks = list(enumerate(files))urlname = 'http://10.136.19.26:port/v1/generation/image-inpaint-outpaint'urlsx = []for i in range(7881, 7893):urlsx.append(urlname.replace("port", str(i)))for i in range(8550, 8554):urlsx.append(urlname.replace("port", str(i)))# 去掉7889urlsx.remove('http://10.136.19.26:7889/v1/generation/image-inpaint-outpaint')for i in urlsx:print(i)with Manager() as manager:lock = manager.Lock()with Pool(processes=len(urlsx)) as pool:# 传递 lock 到 process_user_prompt 函数pool.starmap(batch_process,[(index, file, urlsx) for index, file in tasks])# docker run --gpus device=0 -p 7881:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=0 -p 7882:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=1 -p 7883:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=1 -p 7884:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=1 -p 7885:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=2 -p 7886:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=2 -p 7887:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=2 -p 7888:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=3 -p 7889:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=3 -p 7890:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=3 -p 7891:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=3 -p 7892:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=0 -p 8550:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=0 -p 8551:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=1 -p 8552:7860 -d kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=1 -p 8553:7860 -d kevinchina/deeplearning:fooocusapi-office-v3相关文章:
【深度学习】fooocusapi,docker,inpainting图像
基础镜像制作来源 fooocusapi接口官方写的: docker run -d --gpusall \-e NVIDIA_DRIVER_CAPABILITIEScompute,utility \-e NVIDIA_VISIBLE_DEVICESall \-p 8888:8888 konieshadow/fooocus-api会下载一些模型,下载完后推这个镜像 docker commit 4dfd1…...
算法017:二分查找
二分查找. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-search/ 二分查找,其实是双指针的一种特殊情况,但是时间复杂度极低&#…...
谷粒商城实战笔记-37-前端基础-Vue-基本语法插件安装
文章目录 一,v-model1,双向绑定2,vue的双向绑定2.1 html元素上使用指令v-model2.2 model中声明对应属性2.3,验证view绑定modelmodel绑定view 完整代码 二,v-on1,指令简介2,在button按钮中添加v-…...
mybatis中的缓存(一级缓存、二级缓存)
文章目录 前言一、MyBatis 缓存概述二、一级缓存1_初识一级缓存2_一级缓存命中原则1_StatementId相同2_查询参数相同3_分页参数相同4_sql 语句5_环境 3_一级缓存的生命周期1_缓存的产生2_缓存的销毁3_网传的一些谣言 4_一级缓存核心源码5_总结 三、二级缓存1_开启二级缓存2_二级…...
实现自动化采购:食堂采购系统源码开发详解
本篇文章,笔者将详细介绍食堂采购系统的开发过程,从需求分析、系统设计到实现和测试,为您全面解析如何构建一个高效的自动化采购系统。 一、需求分析 1.采购计划管理 2.供应商管理 3.订单管理 4.库存管理 5.财务管理 6.数据分析与报告 …...
linux、windows、macos清空本地DNS缓存
文章目录 Linux:Windows:macOS: Linux: 对于使用systemd的操作系统(如CentOS 7、Ubuntu 16.04),可以使用以下命令重启systemd-resolved服务来清除缓存: sudo systemctl restart sys…...
领夹麦克风哪个品牌好,电脑麦克风哪个品牌好,热门麦克风推荐
在信息快速传播的时代,直播和视频创作成为了表达与交流的重要方式。对于追求卓越声音品质的创作者而言,一款性能卓越的无线麦克风宛如一把利剑。接下来,我要为大家介绍几款备受好评的无线麦克风,这些都是我在实际使用中体验良好…...
【第5章】Spring Cloud之Nacos服务注册和服务发现
文章目录 前言一、提供者1. 引入依赖2.配置 Nacos Server 地址3. 开启服务注册 二、消费者1. 引入依赖2.配置 Nacos Server 地址3. 开启服务注册 三、服务列表四、服务发现1. 获取服务列表2. 测试2.1 获取所有服务2.2 根据服务名获取服务信息 五、更多配置项总结 前言 本节通过…...
Springboot 启动时Bean的创建与注入(一)-面试热点-springboot源码解读-xunznux
Springboot 启动时Bean的创建与注入,以及对应的源码解读 文章目录 Springboot 启动时Bean的创建与注入,以及对应的源码解读构建Web项目流程图:堆栈信息:堆栈信息简介堆栈信息源码详解1、main:10, DemoApplication (com.xun.demo)2…...
单调栈(随缘复习到了,顺手刷了)
也是不知道为什么突然又复习到单调栈了,所以顺手刷了三道题,总结一下 P6503 [COCI2010-2011#3] DIFERENCIJA 思路:这题是要求每个子区间里面的最大值和最小值的差,我们一开始想的必然是纯暴力呀,但是一看这数据&#…...
学习测试10-3自动化 web自动化
web自动化 chrome驱动下载地址: https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/#stable观察Google版本,下相应的驱动 运行代码试试,成功Google就会弹出 from se…...
安防视频监控EasyCVR视频汇聚平台修改配置后无法启动的原因排查与解决
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…...
爬虫学习2:爬虫爬取网页的信息与图片的方法
爬虫爬取网页的信息与图片的方法 爬取人物信息 import requestshead {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0" } # 这是get请求带参数的模式…...
MySQL定时备份数据,并上传到oss
1.环境准备 1.安装阿里云的ossutil 2.安装mysql 2.编写脚本 脚本内容如下 #!/bin/bash # 数据库的配置信息,根据自己的情况进行填写 db_hostlocalhost db_usernameroot db_passwordroot db_namedb_root # oss 存贮数据的bucket地址 bucket_namerbsy-backup-buck…...
极速删除 node_modules 仅3 秒()
今天教大家如何快速删除 node_modules 依赖的一个小秘诀,告别繁琐!!! 前言 作为前端开发者,相信大家都曾经历过删除 node_modules 文件夹时的漫长等待。 尤其是在处理那些依赖库繁多的项目时,删除操作…...
vue this.$refs 动态拼接
业务需要,refs是不固定的 <vxe-grid refgridWarehouse v-bind"gridWarehouseOptions" v-if"tableHeight" :height"tableHeight":expand-config"{iconOpen: vxe-icon-square-minus, iconClose: vxe-icon-square-plus}"c…...
一次搞定!中级软件设计师备考通关秘籍
大家好,我是小欧! 今天我们来聊聊软考这个话题。要是你准备参加计算机技术与软件专业技术资格(软考),那么这篇文章就是为你量身定做的。话不多说,咱们直接进入正题。 什么是软考? 软考…...
第十六讲 python中的序列-列表简介-特点-常用方法-创建-添加-删除-访问-切片-排序-复制-反转
目录 1. 序列的本质和内存结构 2.列表 2.1 列表简介 2.2 列表的特点 2.3 列表对象的常用方法大全: 2.4 列表的创建 2.4.1 使用方括号 [] 2.4.2 使用 list() 函数 2.4.3 使用 range() 函数 2.4.3.1 range的基本用法 2.4.3.2 返回值 2.4.3.3 range的使用例子 2.4.3.4 range的使…...
大模型日报 2024-07-22
大模型日报 2024-07-22 大模型资讯 谷歌将在ICML 2024展示机器学习研究成果 摘要: 谷歌研究人员将在ICML 2024会议上展示他们在机器学习领域的探索,从理论到应用,构建解决深层问题的ML系统。 代理符号学习:优化AI系统符号组件的框架 摘要: 大…...
Electron 的open-file事件
在 Electron 中,open-file 事件是一个重要的事件,它允许开发者在应用程序已经运行的情况下,通过文件打开请求(如双击文件或在命令行中使用 open 命令打开文件)来捕获文件路径。以下是对 open-file 事件的详细解析: 触发条件 应用已经打开。用户通过双击与应用程序关联的…...
告别龟速!实测字节跳动Rust镜像源rsproxy.cn,安装rust和cargo快到飞起
Rust开发者福音:字节跳动镜像源rsproxy.cn全实测与避坑指南 上周深夜两点,我盯着终端里以KB/s为单位缓慢爬升的Rust安装进度条,第5次按下了CtrlC。作为一门以"零成本抽象"著称的语言,Rust的安装体验却让国内开发者付出了…...
AI工具搭建自动化视频生成Quick Sync
# Quick Sync:AI驱动的自动化视频生成技术实战解析 前阵子团队接了个批量短视频生成的项目,要在短时间内产出数百条产品演示视频。一开始想着一个个用Premiere剪,但算算时间,光是渲染就够呛。后来试用了几种自动化方案,…...
【Portal实战指南】STEP 7 Basic许可证丢失排查与一键修复
1. 问题现象与紧急处理 当你满心欢喜地打开TIA Portal准备开始一天的工作,突然弹出一个令人窒息的提示框:"找不到许可证STEP 7 Basic"。这种情况我遇到过不下十次,每次都能让工程师血压瞬间飙升。别慌,我们先来快速判断…...
掌握智能游戏存档管理:实现高效跨平台游戏进度迁移
掌握智能游戏存档管理:实现高效跨平台游戏进度迁移 【免费下载链接】XGP-save-extractor Python script to extract savefiles out of Xbox Game Pass for PC games 项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor 你是否曾在Xbox Game Pa…...
010 传感器与数据采集基础:从模拟到数字
010 传感器与数据采集基础:从模拟到数字 一个让我熬夜到凌晨三点的ADC问题 去年做的一个工业振动监测项目,传感器输出0-5V模拟信号,STM32F4内置ADC采集,理论上12位分辨率,4096个码值对应0-3.3V。结果数据一出来,波形像被狗啃过——毛刺、跳变、偶尔还出现负值。用示波器…...
2026届学术党必备的降重复率平台横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 1. 在学术写作这个特定领域里,合理运用AI工具能切实有效提升文献检索、大纲构建…...
【音频精修】Melodyne 核心工具实战:从音高微调到节奏重塑
1. Melodyne入门:音频精修的瑞士军刀 第一次打开Melodyne时,我完全被它那些密密麻麻的音符块吓到了。这玩意儿看起来比钢琴卷帘窗还复杂,但用顺手后才发现,它简直是拯救车祸现场录音的神器。作为业内公认的音高校正标杆࿰…...
STM32H7 串口 DMA 双缓冲 空闲中断 实战解析 Hal库
1. STM32H7串口DMA双缓冲方案的必要性 在嵌入式系统中,串口通信是最基础也最常用的外设之一。传统的中断接收方式虽然简单直接,但在处理高速数据流时存在明显短板。每次接收到一个字节就触发一次中断,当波特率较高时(比如115200甚…...
Mac窗口置顶神器Topit:3步解决多窗口遮挡难题,工作效率提升150%
Mac窗口置顶神器Topit:3步解决多窗口遮挡难题,工作效率提升150% 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 在Mac上进行多任务处理时…...
ArcGIS实战:从DEM数据到精美立体晕渲图的调色与渲染全流程
1. 认识DEM数据与立体晕渲图 第一次接触DEM数据时,我完全被那些密密麻麻的数字搞懵了。后来才发现,这些数字其实就是地形的"指纹"。DEM(Digital Elevation Model)就像是用数字搭建的微缩景观,每个像素点都记…...
