Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

能否改善涂善修復有淡淡灰色的狀況 #733

Open
wagannan opened this issue Jan 18, 2025 · 16 comments
Open

能否改善涂善修復有淡淡灰色的狀況 #733

wagannan opened this issue Jan 18, 2025 · 16 comments

Comments

@wagannan
Copy link

不論用哪種方式圖像修復 某些地方都會有這淡淡灰色的方框
Image

Image

@ZzzzzzzSkyward
Copy link

ZzzzzzzSkyward commented Jan 21, 2025

相同问题:使用aotlama_mpelama_large_512px进行手动修复,在填充区域的像素的rgb值会降低一点。
测试用例:周围为白色的黑色文字区域修复。
测试结果:aot填充rgb范围(250~252),lama_mpe(254~254),lama_large_512px(253~254)。使用iopaint的lama模型没有问题。
参数:inpaint_size2048 cuda fp32
环境:Windows10 22H2 python 3.8 pyqt5 RTX4060 torch2.4.1+cu124
远程同步此提交(1316ceca7caf829b3e3a60f8a6334694a79b0c3e)
可复现性:总是发生,且结果相同。
原因:浮点数类型转换错误。
修复方案:(以lama为例)

        #在此前是正确的
        img_inpainted = (img_inpainted_torch.to(device='cpu', dtype=torch.float32).squeeze_(0).permute(1, 2, 0).numpy() * 255)
        #需使用math.floor
        img_inpainted = np.clip(img_inpainted+0.5, 0, 255).astype(np.uint8)

验证:

import torch
import numpy as np

# 创建一个示例张量,范围在 [0, 1],包含一些接近1.0的值
img_inpainted_torch = torch.tensor(
    [[[[1.0, 0.9999], [0.99, 0.97]]]], dtype=torch.float32)

# 方法1:第一种处理方式
img_inpainted_raw = img_inpainted_torch.detach().squeeze_(
    0).permute(1, 2, 0).cpu().numpy() * 255.0
img_inpainted_raw = np.clip(img_inpainted_raw+0.5, 0, 255).astype(np.uint8)
# 方法2:第二种处理方式
img_inpainted = (img_inpainted_torch.to(device='cpu', dtype=torch.float32).squeeze_(
    0).permute(1, 2, 0).numpy() * 255).astype(np.uint8)

# 打印结果
print("原始张量 (范围 [0, 1]):")
print(img_inpainted_torch)

print("\n方法1结果 (浮点数,范围 [0, 255]):")
print(img_inpainted_raw)

print("\n方法2结果 (整数,范围 [0, 255]):")
print(img_inpainted)
原始张量 (范围 [0, 1]):
tensor([[[1.0000, 0.9999],
         [0.9900, 0.9700]]])

方法1结果 (浮点数,范围 [0, 255]):
[[[255]
  [255]]

 [[252]
  [247]]]

方法2结果 (整数,范围 [0, 255]):
[[[255]
  [254]]

 [[252]
  [247]]]

修复结果:bug消失。
此补丁仅修复lama模型相关的bug。

@ZzzzzzzSkyward
Copy link

ZzzzzzzSkyward commented Jan 22, 2025

相同问题:使用aotlama_mpelama_large_512px进行自动修复,在填充区域的像素的rgb值不符合预期(修复结果远差于手动)。
测试用例:周围为白色的黑色文字区域修复。
测试结果:lama_large_512px(254~254)。使用iopaint的lama模型没有问题。
参数:inpaint_size2048 cuda fp32 膨胀10(这个大小在测试图片上是正好能在手动修复时不触碰到气泡边缘)
环境:Windows10 22H2 python 3.8 pyqt5 RTX4060 torch2.4.1+cu124
远程同步此提交(1316ceca7caf829b3e3a60f8a6334694a79b0c3e
可复现性:在一次流程中,有一部分会发生此问题,大部分不会。
测试结果展示:
自动修复(使用GIMP的色阶工具增加对比度)
Image
自动修复
Image
原图的一部分
Image

@gsxgmpkt9020
Copy link

gsxgmpkt9020 commented Jan 22, 2025

相同问题:使用aotlama_mpelama_large_512px进行手动修复,在填充区域的像素的rgb值会降低一点。 测试用例:周围为白色的黑色文字区域修复。 测试结果:aot填充rgb范围(250~252),lama_mpe(254~254),lama_large_512px(253~254)。使用iopaint的lama模型没有问题。 参数:inpaint_size2048 cuda fp32 环境:Windows10 22H2 python 3.8 pyqt5 RTX4060 torch2.4.1+cu124 远程同步此提交(1316ceca7caf829b3e3a60f8a6334694a79b0c3e) 可复现性:总是发生,且结果相同。 原因:浮点数类型转换错误。 修复方案:(以lama为例)

    #在此前是正确的
    img_inpainted = (img_inpainted_torch.to(device='cpu', dtype=torch.float32).squeeze_(0).permute(1, 2, 0).numpy() * 255)
    #需使用math.floor
    img_inpainted = np.clip(img_inpainted+0.5, 0, 255).astype(np.uint8)

验证:

import torch
import numpy as np

创建一个示例张量,范围在 [0, 1],包含一些接近1.0的值

img_inpainted_torch = torch.tensor(
[[[[1.0, 0.9999], [0.99, 0.97]]]], dtype=torch.float32)

方法1:第一种处理方式

img_inpainted_raw = img_inpainted_torch.detach().squeeze_(
0).permute(1, 2, 0).cpu().numpy() * 255.0
img_inpainted_raw = np.clip(img_inpainted_raw+0.5, 0, 255).astype(np.uint8)

方法2:第二种处理方式

img_inpainted = (img_inpainted_torch.to(device='cpu', dtype=torch.float32).squeeze_(
0).permute(1, 2, 0).numpy() * 255).astype(np.uint8)

打印结果

print("原始张量 (范围 [0, 1]):")
print(img_inpainted_torch)

print("\n方法1结果 (浮点数,范围 [0, 255]):")
print(img_inpainted_raw)

print("\n方法2结果 (整数,范围 [0, 255]):")
print(img_inpainted)
原始张量 (范围 [0, 1]):
tensor([[[1.0000, 0.9999],
[0.9900, 0.9700]]])

方法1结果 (浮点数,范围 [0, 255]):
[[[255]
[255]]

[[252]
[247]]]

方法2结果 (整数,范围 [0, 255]):
[[[255]
[254]]

[[252]
[247]]]
修复结果:bug消失。 此补丁仅修复lama模型相关的bug。

谢谢,还真是bug,之前反映多次都没人能找到bug的根本原因

#695 (comment) #557 (comment)

@ZzzzzzzSkyward
Copy link

谢谢,还真是bug,之前反映多次都没人能找到bug的根本原因

#695 (comment)

#557 (comment)

这里找出的只是一个原因,还有别的。我暂时还认为自动修复流程里有对图片的不适当裁剪或者错误的遮罩会降低lama的修复质量,但还没看代码。

@gsxgmpkt9020
Copy link

谢谢,还真是bug,之前反映多次都没人能找到bug的根本原因
#695 (comment)
#557 (comment)

这里找出的只是一个原因,还有别的。我暂时还认为自动修复流程里有对图片的不适当裁剪或者错误的遮罩会降低lama的修复质量,但还没看代码。

最近这两个月这个自动修复的bug反映普遍比较多,你的修复应该涵盖了大部分非不当使用导致的异常

之前是听说lama_large_512px对日漫比较友好所以试用了lama_large_512px,不知道是不是lama系一开始就有这个bug

#256 (comment)

@dmMaze
Copy link
Owner

dmMaze commented Jan 22, 2025

谢谢,还真是bug,之前反映多次都没人能找到bug的根本原因

#695 (comment)

#557 (comment)

你给的这些 comment 都是膨胀开太大的原因,精度问题不会有那么夸张的色差

@gsxgmpkt9020
Copy link

gsxgmpkt9020 commented Jan 22, 2025

谢谢,还真是bug,之前反映多次都没人能找到bug的根本原因
#695 (comment)
#557 (comment)

你给的这些 comment 都是膨胀开太大的原因,精度问题不会有那么夸张的色差

抱歉,他是用“使用GIMP的色阶工具增加对比度”,我误解了。

虽然但是,我确实注意到还是有残留淡淡的灰色的。而之前inpaint后都是完美纯白的

@dmMaze
Copy link
Owner

dmMaze commented Jan 22, 2025

原因:浮点数类型转换错误。

@ZzzzzzzSkyward @wagannan
我觉得可能不是数值范围的问题,+- 1 也不会有一楼那么明显,不过代码这里已经改了。
如果设置->修复里勾选了 “由程序决定是否调用修复方法” 在涂纯色气泡时就有可能会取背景像素平均的 RGB 值抹字。求平均可能会被非背景区域的像素干扰,现在改成了用中值。
不过我没找到合适的测试图。验证是不是这个问题可以先取消 “由程序决定是否调用修复方法”,然后跑一下你出问题的图看有没有改善。最后再拉取最新代码试试

@gsxgmpkt9020
Copy link

在涂纯色气泡时就有可能会取背景像素平均的 RGB 值抹字。

请问是否可以加个调节项弱化背景颜色的权重?就算取中值有时候权重还是太高了。

@ZzzzzzzSkyward
Copy link

原因:浮点数类型转换错误。

@ZzzzzzzSkyward @wagannan 我觉得可能不是数值范围的问题,+- 1 也不会有一楼那么明显,不过代码这里已经改了。 如果设置->修复里勾选了 “由程序决定是否调用修复方法” 在涂纯色气泡时就有可能会取背景像素平均的 RGB 值抹字。求平均可能会被非背景区域的像素干扰,现在改成了用中值。 不过我没找到合适的测试图。验证是不是这个问题可以先取消 “由程序决定是否调用修复方法”,然后跑一下你出问题的图看有没有改善。最后再拉取最新代码试试

我已经关掉这个选项了。
我仍然认为lama模型相关代码有问题。
以下是一个例子,通过cv2.imwrite导出中间图:
原图

Image

遮罩

Image

此项目的结果
Image

iopaint的结果

Image

注意,虽然iopaint调用也会出现像素非纯白(rgb=254)的现象,但是总体上看是良好的。而此项目调用结果是较差的。我不清楚到底是模型参数不同还是什么其他原因。

@dmMaze
Copy link
Owner

dmMaze commented Jan 23, 2025

在涂纯色气泡时就有可能会取背景像素平均的 RGB 值抹字。

请问是否可以加个调节项弱化背景颜色的权重?就算取中值有时候权重还是太高了。

啥叫弱化权重,你是说让程序判定用纯色涂抹的标准更严格吗

@dmMaze
Copy link
Owner

dmMaze commented Jan 23, 2025

我已经关掉这个选项了。
我仍然认为lama模型相关代码有问题。
以下是一个例子,通过cv2.imwrite导出中间图:
原图

图一就是原来输入吗,你给的膨胀参数是啥

@ZzzzzzzSkyward
Copy link

ZzzzzzzSkyward commented Jan 23, 2025

我已经关掉这个选项了。
我仍然认为lama模型相关代码有问题。
以下是一个例子,通过cv2.imwrite导出中间图:
原图

图一就是原来输入吗,你给的膨胀参数是啥

在传给lama模型前有一系列变换操作,为了剔除它们的影响,我展示的是_inpaint函数里,距离修复前后最直接的图像。膨胀开了3~10之间的数字吧,这不重要了,你看那个遮罩是覆盖文字,但没有碰到气泡边缘的,这种情况理应正确修复。
至于为什么没有裁剪到遮罩边界,是因为我特意扩大了图片()。去除视野过小这个可能的不利因素。

@dmMaze
Copy link
Owner

dmMaze commented Jan 23, 2025

这不重要了

最省事的方式是你直接给我原图和参数我能跑出这个结果,我也没遇到这种情况,你光说要我怎么试
OK 是我没仔细看 我拿图复现了

@ZzzzzzzSkyward
Copy link

这不重要了

最省事的方式是你直接给我原图和参数我能跑出这个结果,我也没遇到这种情况,你光说要我怎么试 OK 是我没仔细看 我拿图复现了

翻以前的issue发现这里的lama不会是iopaint的anime lama吧,我在iopaint调用的是原版lama。。。

@dmMaze
Copy link
Owner

dmMaze commented Jan 23, 2025

这不重要了

最省事的方式是你直接给我原图和参数我能跑出这个结果,我也没遇到这种情况,你光说要我怎么试 OK 是我没仔细看 我拿图复现了

翻以前的issue发现这里的lama不会是iopaint的anime lama吧,我在iopaint调用的是原版lama。。。

我遍历了一下 iopaint 那个 anime lama 它用的是我们的模型。用 lama mpe 不会出这个问题,那大概是模型问题。
inpaint size 改成 512 (训练分辨率) 这张图也会变好。一般是局部裁出来做 inpainting ,所以这个分辨率很多时候是够的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants