【gradio 极速入门(二)】gr.Image 是如何得到 Mask 的?

72 篇文章 16 订阅
36 篇文章 3 订阅

Gradio 是一个用于构建和部署交互式机器学习应用的Python库。它的设计目的是让开发者能够轻松地将训练好的机器学习模型封装成一个用户友好的界面,使得非技术人员也能够使用和理解模型的预测结果。(官方链接:https://www.gradio.app/)

base = gr.Image(label="Background", source="upload", tool="sketch", type="pil", height=512, brush_color='#FFFFFF', mask_opacity=0.5, brush_radius = 100)

mask = base["mask"].convert("L")
image = np.asarray(image)
mask = np.asarray(mask)
mask = np.where(mask > 128, 1, 0).astype(np.uint8)

在 Gradio 中,当设置 brush_color='#FFFFFF'mask_opacity=0.5 时,这些参数影响了用户在交互式界面上使用绘图工具(如笔刷工具)时生成的遮罩 mask

brush_color='#FFFFFF'

  • brush_color='#FFFFFF' 表示绘图工具的颜色为白色。在数字表示中,白色的 RGB 值为 (255, 255, 255)
  • 当用户在上传的背景图像上使用白色绘图工具进行绘制时,这些绘制的区域在 mask 中会对应较高的灰度值。

mask_opacity=0.5

  • mask_opacity=0.5 表示绘图工具的不透明度为 0.5,也即绘制的区域会有一定的透明度。
  • mask 中,这些被绘制的区域会对应灰度值介于 0 和 255 之间的值,具体数值取决于用户绘制时的笔触和覆盖程度。

mask > 128

  • 当使用 np.where(mask > 128, 1, 0) 时,意味着将 mask 中灰度值大于 128 的像素设为1,小于等于 128 的像素设为0。
  • 这个操作的目的通常是将 mask 图像转换为二值化图像,其中灰度值较高的区域被视为前景(1),而较低的区域被视为背景(0)。
  • 二值化也方便后续的算法处理,例如逻辑操作(如AND、OR、NOT)在二值掩码上非常高效,适用于实时处理。

影响结果的因素

  • 绘图工具的颜色和透明度:白色作为绘图工具的颜色会在 mask 中产生较高的灰度值,尤其是在设置了一定的透明度后,即使部分像素被绘制了,灰度值也可能超过 128。
  • 绘制的方式和覆盖度:绘制的笔触大小、绘制的速度和持续时间,以及 mask_opacity 的设置,都会影响绘制出的遮罩在 mask 中的灰度值分布。

因此,设置 brush_color='#FFFFFF'mask_opacity=0.5 会使得用户在使用白色绘图工具时,在 mask 中产生灰度值大于 128 的区域,这些区域表示了用户绘制的部分。

以上分析代码来源于:https://github.com/ali-vilab/MimicBrush?tab=readme-ov-file

这是一个crossattention模块:class CrossAttention(nn.Module): def __init__(self, query_dim, context_dim=None, heads=8, dim_head=64, dropout=0.): super().__init__() inner_dim = dim_head * heads context_dim = default(context_dim, query_dim) self.scale = dim_head ** -0.5 self.heads = heads self.to_q = nn.Linear(query_dim, inner_dim, bias=False) self.to_k = nn.Linear(context_dim, inner_dim, bias=False) self.to_v = nn.Linear(context_dim, inner_dim, bias=False) self.to_out = nn.Sequential( nn.Linear(inner_dim, query_dim), nn.Dropout(dropout) ) def forward(self, x, context=None, mask=None): h = self.heads q = self.to_q(x) context = default(context, x) k = self.to_k(context) v = self.to_v(context) q, k, v = map(lambda t: rearrange(t, 'b n (h d) -> (b h) n d', h=h), (q, k, v)) # force cast to fp32 to avoid overflowing if _ATTN_PRECISION =="fp32": with torch.autocast(enabled=False, device_type = 'cuda'): q, k = q.float(), k.float() sim = einsum('b i d, b j d -> b i j', q, k) * self.scale else: sim = einsum('b i d, b j d -> b i j', q, k) * self.scale del q, k if exists(mask): mask = rearrange(mask, 'b ... -> b (...)') max_neg_value = -torch.finfo(sim.dtype).max mask = repeat(mask, 'b j -> (b h) () j', h=h) sim.masked_fill_(~mask, max_neg_value) # attention, what we cannot get enough of sim = sim.softmax(dim=-1) out = einsum('b i j, b j d -> b i d', sim, v) out = rearrange(out, '(b h) n d -> b n (h d)', h=h) return self.to_out(out) 我如何从中提取各个提示词的注意力热力图并用Gradio可视化?
07-15
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值