mask

一、什么是掩膜
首先我们从物理的角度来看看mask到底是什么过程。在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域。

图像掩膜与其类似,用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。

光学图像处理中,掩模可以足胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像

二、掩膜的用法
数字图像处理中,图像掩模主要用于:
2.1 提取感兴趣区:用预先制作的感兴趣区掩膜与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0;
2.2 屏蔽作用:用掩膜对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计;
2.3 结构特征提取:用相似性变量或图像匹配方法检测和提取图像中与掩膜相似的结构特征;
2.4 特殊形状图像的制作

三、掩膜运算的一个小实例
以图和掩膜的与运算为例:
原图中的每个像素和掩膜中的每个对应像素进行与运算。比如1 & 1 = 1;1 & 0 = 0;
比如一个3 * 3的图像与3 * 3的掩膜进行运算,得到的结果图像就是:


四、小结
1.图像中,各种位运算,比如与、或、非运算与普通的位运算类似。
2.如果用一句话总结,掩膜就是两幅图像之间进行的各种位运算操作。

按照上述定义,非线性激活函数Relu(根据输出的正负区间进行简单粗暴的二分)、dropout机制(根据概率进行二分)都可以理解为泛化的mask操作。

从任务适应性上,mask在图像和自然语言处理中都广为应用,其应用包括但不局限于:图像兴趣区提取、图像屏蔽、图像结构特征提取、语句padding对齐的mask、语言模型中sequence mask等。

从使用mask的具体流程上,其可以作用于数据的预处理(如原始数据的过滤)、模型中间层(如relu、drop等)模型损失计算上(如padding序列的损失忽略)。

尽管上述操作均可统称为mask,但其具体的算法实现细节需要根据实际需求进行设计,下面利用pytroch来实现几个典型的例子。

实例1:图像兴趣区提取

通过mask张量定义兴趣区(或非兴趣区)位置张量,将非兴趣区上的张量元素用0值填充。

import torcha = torch.randint(0, 255, (2, 3, 3))   # 两张单通道的图像张量
print(a)
# tensor([[[ 77,  58, 134],
#         [ 83, 187,  36],
#         [103, 183, 138]],#        [[223,  19,   7],
#         [ 55, 167,  77],
#         [231, 223,  37]]])mask = torch.tensor([[1, 0, 0], [0, 1, 0],  [0, 0, 1]]).bool()   # 1为感兴趣区域位置,0为非感兴趣,可将其值填为0b=a.masked_fill_(~mask, 0)      # 注意按照上述定义,需取反~
print(b)
# tensor([[[ 77,   0,   0],
#         [  0, 187,   0],
#         [  0,   0, 138]],#        [[223,   0,   0],
#         [  0, 167,   0],
#         [  0,   0,  37]]])

实例2:文本Embedding层中对padding的处理

在NLP中,虽然CNN特征抽取器要求文本长度为定长,而RNN和Tranformer特征抽取器虽然可应对不定长的文本序列,但为了在batch维度上进行并行化处理,一般还是选择将文本进行长度对齐,即过长序列进行截断,而长度不足序列进行padding操作。padding操作只是数据维度上的对齐,其并不应该对整个网络的计算贡献任何东西,所以必须进行mask操作。

在pytorch中的词嵌入对象Embedding中,直接通过设定padding_idx参数,即可自动对指定的pad编号进行mask操作,即将padding_idx对象的词向量元素均设为0,从而使得该词对网络的正向传播和梯度反向传播均失活,从而达到了mask的目的。

import torch
import torch.nn as nna = torch.tensor([[1,2,3], [2,1,0]])   # 2段文本数据
net = nn.Embedding(num_embeddings=5, embedding_dim=5, padding_idx=0)  # 词嵌入层
b = net(a)   # 进行词嵌入
print(b)
# tensor([[[-1.8167,  0.0701,  2.0281, -0.7096,  1.0128],
#          [ 2.3647,  1.0678,  0.0383,  0.3265, -0.1237],
#         [ 1.0633,  0.4248,  2.0323, -0.3140, -0.5124]],#        [[ 2.3647,  1.0678,  0.0383,  0.3265, -0.1237],
#         [-1.8167,  0.0701,  2.0281, -0.7096,  1.0128],
#         [ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000]]],
#       grad_fn=<EmbeddingBackward>)# 会发现padding=0处的张量均变为了0
import torch
import torch.nn as nna = torch.tensor([[1,2,3], [2,1,0]])
net = nn.Embedding(num_embeddings=10, embedding_dim=5)  # 并未设置padding_index参数
a_ = net(a)  # 观察结果,发现果然没有全为0的词向量mask = (a!=0).float().unsequeeze(-1)  # 手动得到mask张量,注意要升维b = a_ * mask   # 会发现得到了上述的效果
# tensor([[[ 0.2723, -0.2836,  0.0061,  1.0740, -1.1754],
#         [-0.6695, -0.9080,  0.7244,  0.3022,  0.5039],
#         [ 1.8236, -1.1954, -0.3024,  0.0857, -0.2242]],#        [[-0.6695, -0.9080,  0.7244,  0.3022,  0.5039],
#         [ 0.2723, -0.2836,  0.0061,  1.0740, -1.1754],
#         [ 0.0000,  0.0000,  0.0000, -0.0000, -0.0000]]],
#       grad_fn=<MulBackward0>)

实例3:padding的损失计算问题

对于文本序列中的NLP,其中<padding>-token位置处的损失不应该计入,具体而言就是最终的损失应当是一个mask-mean的计算过程。

在pytorch中的损失计算对象CrossEntropyLoss等中,直接通过设定ignore_index参数,即可自动忽略<padding>处的损失计算。

下面是pytorch中的一个简单的例子:

import torch
import torch.nn as nntargets = torch.tensor([1, 2, 0])  # 某个时间步batch中各样本的labels
preds = torch.tensor([[1.4, 0.5, 1.1], [0.7, 0.4, 0.2], [2.4, 0.2, 1.4]])   # 某个时间步的batch*predscriterion1 = nn.CrossEntropyLoss()   # 不屏蔽padding
criterion2 = nn.CrossEntropyLoss(ignore_index=0)   # 不屏蔽paddingloss1 = criterion1(preds, targets)
# 返回  tensor(1.1362)loss2 = criterion2(preds, targets)
# 返回  tensor(1.5088) , 例子中该损失只考虑了2个样本

下面,手动实现下该机制:

import torch
import torch.nn as nn
import torch.nn.functional as Ftargets = torch.tensor([1, 2, 0])  # 某个时间步batch中各样本的labels
preds = torch.tensor([[1.4, 0.5, 1.1], [0.7, 0.4, 0.2], [2.4, 0.2, 1.4]])   # 某个时间步的batch*predsdef pad_loss(pred, target,  pad_index=None):if pad_index == None:    # 不考虑padding的maskmask = torch.ones_like(target, dtype=torch.float)else:mask = (target != pad_index).float()nopd = mask.sum().item()   # 实际计算的样本label数target = torch.zeros(pred.shape).scatter(dim=1, index=target.unsqueeze(-1), source=torch.tensor(1))  # 对labels进行one-hot编码target_ = target * mask.unsqueeze(-1)   # 对labels进行maskloss = -(F.log_softmax(pred, dim=-1) * target_.float()).sum()/nopd   # NLL损失return lossloss1 = pad_loss(preds, preds)
# 返回  tensor(1.1362)loss2 = pad_loss(preds, preds, pad_index=0)
# 返回  tensor(1.5088)

实例4:self-attention对padding的处理

Transformer中提出的self-attention机制可以通过文本内部两两元素进行信息的提取,在其中计算各score的softmax权重时,不能将padding处的文本考虑进来(因为这些文本并不存在)。所以在进行softmax前需要进行mask操作(如下图)。

其具体策略是,将padding的文本处的score设定为负的极大值,这样最终的权重接近于0,从而这些文本不会对attention后生成的向量其作用。

import torch
import torch.nn as nn
import torch.nn.functional as Fa = torch.tensor([2,1,0])   # 文本序列
score = torch.tensor([1.2, 2.3, 4])   #  score结果mask = (a == 0).bool()   # 生成mask
score_ = F.softmax(score.masked_fill(mask, -np.inf), dim=-1)   # padding处填充-inf,从而对softmax结果没影响
# tensor([0.2497, 0.7503, 0.0000])

实例5:序列生成模型中对后续未知文本的处理
在Transformer中Decoder部分的self-attention处,由于是模型的目的在于序列生成,所以无论在训练过程中需要特意将后续文本进行mask,不让模型看到。

此时的mask操作称为针对序列的sequence mask,其以文本序列长度为单位,生成一个上三角矩阵矩阵,其中上三角元素为0,其余元素为1,表示在当前word处(即矩阵的对角元)模型看不到后面的words。

import numpy as np
import torch def sequence_mask(size):mask_shape = (size, size)return torch.from_numpy(np.tril(np.ones(mask_shape),k=0))

实例6:mask的联合操作

比如在Transformer的Decoder中self-attention中,既需要对<pad>进行mask,也需要对后续序列进行mask,此时就需要对两个mask进行&位运算,以迭加效果。

def combine_mask(batch_text, inpad_index=0):"""batch_text: 文本batch, Batch * Sequence """pad_mask = batch_text != inpad_index    # Batch * Sequence sequence_len = batch_text.shape[1]   # 时间步长sequence_mask = torch.tensor(np.tril(np.ones((sequence_len, sequence_len)), k=0)).byte()  # Sequence * Sequencemask = pad_mask.unsqueeze(-2) & sequence_mask    # Batch * Sequence * Sequence 注意将pad_mask升维return mask

掩膜(mask)的学习总结相关推荐

  1. OpenCV:详解掩膜mask

    在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底什么呢? 一开始我接触到Mask这个东西时,我还真是一头雾水啊,也对无法理解Mask到底有什么用.经过 ...

  2. OpenCV精进之路(十二):详解掩膜mask

    在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底什么呢? 一开始我接触到Mask这个东西时,我还真是一头雾水啊,也对无法理解Mask到底有什么用.经过 ...

  3. python去水印如何制作mask_浅谈图像处理中掩膜(mask)的意义

    刚开始涉及到图像处理的时候,在opencv等库中总会看到mask这么一个参数,非常的不理解,在查询一系列资料之后,写下它们,以供翻阅. 什么是掩膜(mask) 数字图像处理中的掩膜的概念是借鉴于PCB ...

  4. matlab中什么叫掩膜,掩膜IC的定义 / 什么是掩膜Mask / 掩膜的优势

    什么是语音芯片掩膜MASK 语音IC要将声音以一定的格式烧录到IC内,才能发出声音.一般IC是通过烧写器和拷贝机即可完成,像OTP一次性烧录芯片等.但是如果量大,就得选用掩膜IC制作方法,就是在制造I ...

  5. Opencv图像处理之详解掩膜mask

    1.在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底什么呢? 2.如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢?  答案是,使用掩膜(mask ...

  6. 掩膜区域内像素值_OpenCV计算机视觉学习(2)——图像算术运算 图像阈值(数值计算,掩膜mask操作,边界填充,二值化)...

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 在O ...

  7. Mask R-CNN学习笔记

    Date:2018-10-22 Author:哪咔吗 Source Link:http://arxiv.org/pdf/1703.06870v3.pdf Mask R-CNN 摘要 1.介绍 NN) ...

  8. python异或运算怎么算_小强学Python+OpenCV之-1.4.4掩膜mask及位运算(与、或、非、异或)...

    问题引入 在小强学Python+OpenCV之-1.4.2裁剪一节,我们使用的是numpy数组切片功能实现图片区域的裁剪. 那么,如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢? 答案是,使用掩 ...

  9. 图像处理中的 “掩膜” Mask

    图像处理中掩膜的作用 在阅读计算机视觉领域的论文的过程中发现了一个新的词叫作 binary Mask,仔细一查发现,这个东西叫做掩膜,图像分割中较为常用. [掩膜] 掩膜,通俗地讲就是一个遮挡板,喷漆 ...

  10. python JPG图片手动圈画掩膜Mask轮廓ROI

    首先尝试实现一张JPG图片的勾画 注:opencv2键鼠操作可参考本博主的文章:python-opencv控制鼠标操作 import numpy as np import cv2 as cv from ...

最新文章

  1. python3.6手册中文版-python3.6文档中文版
  2. 用友华表cell的程序发布
  3. 单片机最小系统制作记录
  4. 判断回文(Python)
  5. 苹果企业证书_苹果签名经常掉签原因大汇总
  6. Android学习笔记----ArcGIS在线地图服务(Android API)坐标纠偏
  7. vue 将行转换成对象_Vue简化版实现
  8. lvds 共模电感_【成功案例】共模电感CM0805C221R-10解决车载LVDS信号的手持天线抗扰问题...
  9. tushare学习文档_介绍一个python股票分析包tushare——韭菜的自我修养
  10. 告别枯燥,这本插画式 Python 书难怪销量 70W+
  11. Hex2Bin使用方法
  12. Google去广告——Adblock插件使用
  13. 根据《程序员竞争力矩阵》的自我评价
  14. B站下载视频之you-get的使用
  15. iOS 上架App Store 遇到的坑
  16. 通过PD4ML把html转pdf(包含显示页眉页脚,插入图片,显示页数)
  17. 什么是软件EV代码签名证书
  18. 人工智能python好学吗_人工智能“速成班”Python好学吗 小心别被忽悠了
  19. 在网页地图图片上加注企业和“圳品”数量信息+1
  20. web字体 衬线字体与非衬线字体区别 字体扫盲

热门文章

  1. 七彩虹显卡软件测试,【七彩虹FM2A75评测】多款软件测试-中关村在线
  2. DeFi发币潮之下,散户真能赚到钱吗?
  3. java 基础知识学习2
  4. 互联网盈利模式77种创新
  5. 番茄工作法——中断(笔记)
  6. 数据结构 —— 广义表
  7. # 机械设备故障的靶向迁移诊断与OpenAI分析
  8. 中国式危机公关9加1策略(第十一章 强大执行力原则)
  9. Android面试题及答案
  10. OpenHarmony如何拨打电话