精华内容
下载资源
问答
  • 总结了大半年,控制系统各种传递函数双线性变换离散化后的递推公式。相信能帮助大家
  • 为方便起见,我们将双线性注意力网络定义为由双线性注意力图参数化的两个多通道输入的函数,如下所示: Bilinear attention map 我们使用逐元素乘积和矩阵乘法,注意力图 定义为: 其中, 和 。softmax函数采用逐...

    目录

    一、文献摘要介绍

    二、网络框架介绍

    三、实验分析

    四、结论

    本文有点长,请耐心阅读,定会有收货。如有不足,欢迎交流, 另附:论文下载地址

    一、文献摘要介绍

    Attention networks in multimodal learning provide an effificient way to utilize given visual information selectively.However, the computational cost to learn attention distributions for every pair of multimodal input channels is prohibitively expensive.To solve this problem, co-attention builds two separate attention distributions for each modality neglecting the interaction between multimodal inputs.In this paper, we propose bilinear attention networks (BAN) that find bilinear attention distributions to utilize given vision-language information seamlessly.BAN considers bilinear interactions among two groups of input channels, while low-rank bilinear pooling extracts the joint representations for each pair of channels. Furthermore, we propose a variant of multimodal residual networks to exploit eight-attention maps of the BAN effificiently. We quantitatively and qualitatively evaluate our model on visual question answering (VQA 2.0) and Flickr30k Entities datasets, showing that BAN signifificantly outperforms previous methods and achieves new state-of-the-arts on both datasets.

    作者认为,多模式学习中的注意力网络提供了一种有效的方法,有选择的利用给定的视觉信息。但是,学习每对多模式输入通道的注意力分布计算的成本过高,为解决这个问题,共同注意为每个模式建立了两个单独的注意力分布,而忽略了多模式输入之间的交互。而在本文中作者提出了一种双线性注意力网络(BAN),它可以找到双线性注意力分布,来无缝地利用给定的视觉-语言信息。BAN考虑两组输入通道之间的双线性相互作用,而低秩双线性池化提取每对通道的联合表示。此外,作者还提出了一种多模式残差网络的变体,以有效的利用BAN的8注意力图。实验表明BAN明显优于以前的方法。

    二、网络框架介绍

    在本论文中,作者将共同注意力的概念扩展为双线性注意力,它考虑了每对多模式通道,例如成对的疑问词和图像区域。如果给定的问题涉及到由多个单词表示的多个视觉概念,则使用每个单词的视觉注意力分布的推理,可以比使用单个压缩注意力分布的推理,更好的利用相关的信息。

    在这个背景下,作者提出了双线性注意力网络(BAN),以在低秩双线性池化的基础上使用双线性注意力分布。BAN利用两组输入通道之间的双线性相互作用,而低秩双线性池化则提取每对通道的联合表示,此外作者还提出了多模式残差网络(MRN)的变体,有效利用BAN的多个双线性注意力图,下图展示了网络的框架。

    由于所提出的用于BAN的残差学习方法利用的是残差求和而不是级联,从而导致参数和性能有效的学习多达8个一瞥的BAN,上图展示了2个BAN的概述,下面进行详细的分析该框架。

    2.1 Low-rank bilinear pooling

    首先回顾一下,低秩双线性池化及其在注意力网络中的应用,该网络使用单通道输入(问题向量),将其他多通道(图像特征)组合为单通道的中间表示(注意力特征)。

    Low-rank bilinear model

    先前的工作中提出了一种低秩双线性模型,以降低双线性权重矩阵

     的秩,以给出规律性。为此将 

     替换为两个较小的矩阵

    ,其中

    。结果,这种替换使得

     的秩最大为

    。对于标量输出 

     (在不是一般性的情况下省略了偏置项):

    其中,

    是一个ones向量,

    表示element-wise multiplication (逐元素乘法)。

    2.Low-rank bilinear pooling

    对于输出向量

    ,引入了池化矩阵

    后:

    其中

    。通过为输出向量

    引入P,可以使得U和V为二维张量,从而大大减少了参数的数量。

    3.Unitary attention networks

    注意力提供了有效机制,通过有选择地利用给定的信息,减少输入的通道。 假设多通道输入Y由

    个的列向量,组成,我们希望使用权重

    从 Y获得单通道 

     :

    其中,

    表示注意力分布,以选择性地组合

    输入通道。使用低秩双线性池化,

    由softmax函数的输出定义为:

    其中,

    。如果G>1,则使用mutiple glimpses(多一瞥),然后参与输出的串联。最后,可以使用两个单通道输入

    ,利用另一个低秩双线性池化对分类器进行联合表示。

    2.2Bilinear attention networks

    我们推广了一个双线性模型,用于两个多通道输入,

    ,其中

    分别是两个输入通道的数目。为了同时减少两个输入通道,我们引入双线性注意图

    如下:

    其中,

    表示中间的第k个元素,矩阵的下标k表示列的索引。请注意,上述公式是两组通道的双线性模型,其中中间的

    是双线性权重矩阵,也可以重写公式为:

    其中

    分别表示输入

    的第 

     个通道(列)和输入

    的第 

     通道(通道),

    分别表示

    矩阵的第 

     列,而

    表示

    的第i行和第j列中的元素。请注意,对于每对通道,两个特征向量的

    双线性表示是在上述公式中的建模的(最终对于

    最多为

    双线性池化)。那么,双线性联合表示为

    其中,

    。为方便起见,我们将双线性注意力网络定义为由双线性注意力图参数化的两个多通道输入的函数,如下所示:

    Bilinear attention map

    我们使用逐元素乘积和矩阵乘法,注意力图

    定义为:

    其中,

    。softmax函数采用逐元素地。请注意,softmax的每个

    是低秩双线性池化的输出,如下所示:

    多个双线性注意图可以扩展如下:

    其中,

    的参数是共享的,但

    不共享,其中

    表示瞥见(glimpses)的索引

    2.Residual learning of attention

    作者提出了一种MRN的变体,以整合来自多个双线性注意力图的联合表示。第

     个输出定义为:

    其中,

     和

    。这里,

    的大小与

    的大小相同,处理连续的注意力图。为了获得分类器(例如两层MLP)的对数,我们将最后一个输出

    的通道维数相加,其中G是瞥见(glimpses)的次数。

    2.3Nonlinearity and classififier

    1.Nonlinearity.

    我们用

    函数给BAN赋予非线性:

    其中,

    表示。对于注意地图,被定义为:

    2.Classififier

    对于VQA,我们使用两层多层感知器(激活函数为relu)作为最终联合表示

    的分类器,从候选数量答案为3129中选择答案,其中答案最少出现9次,才能作为候选答案。二元交叉熵被用于损失函数。对于Flickr30k实体,取双线性注意图的输出,二进制交叉熵用于此输出。

    三、实验分析

    图像特征和问题嵌入的大小分别为

    =2048和

    =1024。联合表示C的大小与低秩双线性池中的秩K相同,

    但双线性注意图中使用

    提高注意的剩余学习的表征能力。每一个线性映射通过权重归一化和丢弃进行正则化(p=.2,带有.5的分类器除外)。Adamax优化器是一个基于无穷范数Adam的变体。学习率是

    ,其中 

     是从1开始,然后在10个阶段之后,学习费率每2个周期递减1/4,最多13个周期(即第11个周期为

    ,第13个周期为

    )。我们将用2-范数修剪向量化梯度为.25。批处理大小为512,下面是进行试验和消融研究。

    表1:VQA 2.0数据集的验证分数,以了解BAN 瞥见(glimpses)的数量。

    表2:VQA 2.0数据集对注意力和交互机制的验证分数。

    不同参数对准确率的影响。

    可视化结果。

    Flickr30k数据集上的实验研究。

    四、结论

    BAN gracefully extends unitary attention networks exploiting bilinear attention maps, where the joint representations of multimodal multi-channel inputs are extracted using low-rank bilinear pooling. Although BAN considers every pair of multimodal input channels, the computational cost remains in the same magnitude, since BAN consists of matrix chain multiplication for effificient computation. The proposed residual learning of attention effificiently uses up to eight bilinear attention maps, keeping the size of intermediate features constant. We believe our BAN gives a new opportunity to learn the richer joint representation for multimodal multi-channel inputs, which appear in many real-world problems.

    作者提出了双线性注意力网络,利用MRN残差网络的变体进行联合表示,最后通过MLP进行分类,预测答案。值得学习和思考。

    展开全文
  • 1,原理在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用...

    1,原理

    在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。

    越是简单的模型越适合用来举例子,我们就举个简单的图像:3*3 的256级灰度图。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source):

    234 38 22

    67 44 12

    89 65 63

    这个矩阵中,元素坐标(x,y)是这样确定的,x从左到右,从0开始,y从上到下,也是从零开始,这是图象处理中最常用的坐标系。

    如果想把这副图放大为 4*4大小的图像,那么该怎么做呢?那么第一步肯定想到的是先把4*4的矩阵先画出来再说,好了矩阵画出来了,如下所示,当然,矩阵的每个像素都是未知数,等待着我们去填充(这个将要被填充的图的叫做目标图,Destination):

    ? ? ? ?

    ? ? ? ?

    ? ? ? ?

    ? ? ? ?

    然后要往这个空的矩阵里面填值了,要填的值从哪里来来呢?是从源图中来,好,先填写目标图最左上角的象素,坐标为(0,0),那么该坐标对应源图中的坐标可以由如下公式得出srcX=dstX* (srcWidth/dstWidth) , srcY = dstY * (srcHeight/dstHeight)

    好了,套用公式,就可以找到对应的原图的坐标了(0*(3/4),0*(3/4))=>(0*0.75,0*0.75)=>(0,0),找到了源图的对应坐标,就可以把源图中坐标为(0,0)处的234象素值填进去目标图的(0,0)这个位置了。

    接下来,如法炮制,寻找目标图中坐标为(1,0)的象素对应源图中的坐标,套用公式:

    (1*0.75,0*0.75)=>(0.75,0) 结果发现,得到的坐标里面竟然有小数,这可怎么办?计算机里的图像可是数字图像,象素就是最小单位了,象素的坐标都是整数,从来没有小数坐标。这时候采用的一种策略就是采用四舍五入的方法(也可以采用直接舍掉小数位的方法),把非整数坐标转换成整数,好,那么按照四舍五入的方法就得到坐标(1,0),完整的运算过程就是这样的:(1*0.75,0*0.75)=>(0.75,0)=>(1,0) 那么就可以再填一个象素到目标矩阵中了,同样是把源图中坐标为(1,0)处的像素值38填入目标图中的坐标。

    依次填完每个象素,一幅放大后的图像就诞生了,像素矩阵如下所示:

    234 38 22 22

    67 44 12 12

    89 65 63 63

    89 65 63 63

    这种放大图像的方法叫做最临近插值算法,这是一种最基本、最简单的图像缩放算法,效果也是最不好的,放大后的图像有很严重的马赛克,缩小后的图像有很严重的失真;效果不好的根源就是其简单的最临近插值方法引入了严重的图像失真,比如,当由目标图的坐标反推得到的源图的的坐标是一个浮点数的时候,采用了四舍五入的方法,直接采用了和这个浮点数最接近的象素的值,这种方法是很不科学的,当推得坐标值为 0.75的时候,不应该就简单的取为1,既然是0.75,比1要小0.25 ,比0要大0.75 ,那么目标象素值其实应该根据这个源图中虚拟的点四周的四个真实的点来按照一定的规律计算出来的,这样才能达到更好的缩放效果。

    双线型内插值算法就是一种比较好的图像缩放算法,它充分的利用了源图中虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,因此缩放效果比简单的最邻近插值要好很多。

    双线性内插值算法描述如下:

    对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)

    其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。

    比如,象刚才的例子,现在假如目标图的象素坐标为(1,1),那么反推得到的对应于源图的坐标是(0.75 , 0.75), 这其实只是一个概念上的虚拟象素,实际在源图中并不存在这样一个象素,那么目标图的象素(1,1)的取值不能够由这个虚拟象素来决定,而只能由源图的这四个象素共同决定:(0,0)(0,1)(1,0)(1,1),而由于(0.75,0.75)离(1,1)要更近一些,那么(1,1)所起的决定作用更大一些,这从公式1中的系数uv=0.75×0.75就可以体现出来,而(0.75,0.75)离(0,0)最远,所以(0,0)所起的决定作用就要小一些,公式中系数为(1-u)(1-v)=0.25×0.25也体现出了这一特点。

    2,计算方法

    首先,在X方向上进行两次线性插值计算,然后在Y方向上进行一次插值计算。

    在图像处理的时候,我们先根据

    srcX=dstX* (srcWidth/dstWidth) ,

    srcY = dstY * (srcHeight/dstHeight)

    来计算目标像素在源图像中的位置,这里计算的srcX和srcY一般都是浮点数,比如f(1.2, 3.4)这个像素点是虚拟存在的,先找到与它临近的四个实际存在的像素点

    (1,3) (2,3)

    (1,4) (2,4)

    写成f(i+u,j+v)的形式,则u=0.2,v=0.4, i=1, j=3

    在沿着X方向差插值时,f(R1)=u(f(Q21)-f(Q11))+f(Q11)

    沿着Y方向同理计算。

    或者,直接整理一步计算,f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) 。

    3,加速以及优化策略

    单纯按照上文实现的插值算法只能勉强完成插值的功能,速度和效果都不会理想,在具体代码实现的时候有些小技巧。参考OpenCV源码以及网上博客整理如下两点:

    源图像和目标图像几何中心的对齐。

    将浮点运算转换成整数运算

    3.1 源图像和目标图像几何中心的对齐

    方法:在计算源图像的虚拟浮点坐标的时候,一般情况:

    srcX=dstX* (srcWidth/dstWidth) ,

    srcY = dstY * (srcHeight/dstHeight)

    中心对齐(OpenCV也是如此):

    SrcX=(dstX+0.5)* (srcWidth/dstWidth) -0.5

    SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5

    原理:

    双线性插值算法及需要注意事项这篇博客解释说“如果选择右上角为原点(0,0),那么最右边和最下边的像素实际上并没有参与计算,而且目标图像的每个像素点计算出的灰度值也相对于源图像偏左偏上。”我有点保持疑问。

    将公式变形,srcX=dstX* (srcWidth/dstWidth)+0.5*(srcWidth/dstWidth-1)

    相当于我们在原始的浮点坐标上加上了0.5*(srcWidth/dstWidth-1)这样一个控制因子,这项的符号可正可负,与srcWidth/dstWidth的比值也就是当前插值是扩大还是缩小图像有关,有什么作用呢?看一个例子:假设源图像是3*3,中心点坐标(1,1)目标图像是9*9,中心点坐标(4,4),我们在进行插值映射的时候,尽可能希望均匀的用到源图像的像素信息,最直观的就是(4,4)映射到(1,1)现在直接计算srcX=4*3/9=1.3333!=1,也就是我们在插值的时候所利用的像素集中在图像的右下方,而不是均匀分布整个图像。现在考虑中心点对齐,srcX=(4+0.5)*3/9-0.5=1,刚好满足我们的要求。

    3.2 将浮点运算转换成整数运算

    参考图像处理界双线性插值算法的优化

    直接进行计算的话,由于计算的srcX和srcY 都是浮点数,后续会进行大量的乘法,而图像数据量又大,速度不会理想,解决思路是:浮点运算→→整数运算→→”<

    放大的主要对象是u,v这些浮点数,OpenCV选择的放大倍数是2048“如何取这个合适的放大倍数呢,要从三个方面考虑,第一:精度问题,如果这个数取得过小,那么经过计算后可能会导致结果出现较大的误差。第二,这个数不能太大,太大会导致计算过程超过长整形所能表达的范围。第三:速度考虑。假如放大倍数取为12,那么算式在最后的结果中应该需要除以12*12=144,但是如果取为16,则最后的除数为16*16=256,这个数字好,我们可以用右移来实现,而右移要比普通的整除快多了。”我们利用左移11位操作就可以达到放大目的。

    4,代码

    uchar* dataDst =matDst1.data;int stepDst =matDst1.step;

    uchar* dataSrc =matSrc.data;int stepSrc =matSrc.step;int iWidthSrc =matSrc.cols;int iHiehgtSrc =matSrc.rows;for (int j = 0; j < matDst1.rows; ++j)

    {float fy = (float)((j + 0.5) * scale_y - 0.5);int sy =cvFloor(fy);

    fy-=sy;

    sy= std::min(sy, iHiehgtSrc - 2);

    sy= std::max(0, sy);short cbufy[2];

    cbufy[0] = cv::saturate_cast((1.f - fy) * 2048);

    cbufy[1] = 2048 - cbufy[0];for (int i = 0; i < matDst1.cols; ++i)

    {float fx = (float)((i + 0.5) * scale_x - 0.5);int sx =cvFloor(fx);

    fx-=sx;if (sx < 0) {

    fx= 0, sx = 0;

    }if (sx >= iWidthSrc - 1) {

    fx= 0, sx = iWidthSrc - 2;

    }short cbufx[2];

    cbufx[0] = cv::saturate_cast((1.f - fx) * 2048);

    cbufx[1] = 2048 - cbufx[0];for (int k = 0; k < matSrc.channels(); ++k)

    {*(dataDst+ j*stepDst + 3*i + k) = (*(dataSrc + sy*stepSrc + 3*sx + k) * cbufx[0] * cbufy[0] +

    *(dataSrc + (sy+1)*stepSrc + 3*sx + k) * cbufx[0] * cbufy[1] +

    *(dataSrc + sy*stepSrc + 3*(sx+1) + k) * cbufx[1] * cbufy[0] +

    *(dataSrc + (sy+1)*stepSrc + 3*(sx+1) + k) * cbufx[1] * cbufy[1]) >> 22;

    }

    }

    }

    cv::imwrite("linear_1.jpg", matDst1);

    cv::resize(matSrc, matDst2, matDst1.size(),0, 0, 1);

    cv::imwrite("linear_2.jpg", matDst2);

    展开全文
  • 双线性CNN模型:包含两个特征提取器,其输出经过外积相乘,池化后获得image descriptor feature fusion的方式有很多,所以在两个数据集上进行了三种方式的feature fusion结果比较。 很多广泛使用的texture ...

    ICCV 2015

    参考资料

    摘要

    • 双线性CNN模型:包含两个特征提取器,其输出经过外积相乘,池化后获得image descriptor
      feature fusion的方式有很多,所以在两个数据集上进行了三种方式的feature fusion结果比较。

    很多广泛使用的texture representation可以被表示为两个设计合理的特征的outer product。

    2018DataFold-1Fold-2Fold-3Fold-4Fold-5avg
    外积0.90309871153231810.84068645503424910.89602363658746780.86981195346557640.88705149574524080.8793344504729704
    相加0.87879415725681130.85828706206083240.88559022518428760.85497172742104910.89231021546157160.8739906774769104‬
    concat
    2020Data
    外积0.87387444581997480.8834889669436660.88236984953511770.8889784224191960.88657375954818540.883057088853228
    相加0.8577814314340030.85307183618463810.8564479515728030.88624431221561070.8862591328387260.8672857097715232‬
    concat0.86136908406055770.87156294172052140.87351093783842320.89084086645062250.88955551848506990.8773678697110389‬

    pooling函数整合所有位置的bilinear combination,来得到图片的全局信息。代码中使用的是求和,orderless.

    • 优点:
      • 以平移不变的方式,建模了local pairwise feature interactions,适用于细粒度图像分类
      • 能够泛化多种顺序无关的texture descriptor
      • 双线性形式简化了梯度计算。
    • 实验结果
      • 在CUB200-2011数据集上实现了84.1%的准确率。

    1. introduction

    • 细粒度识别

    对同属一个子类的物体进行分类,通常需要对高度局部化、且与图像中姿态及位置无关的特征进行识别。例如,“加利福尼亚海鸥”与“环状海鸥”的区分就要求对其身体颜色纹理,或羽毛颜色的微细差异进行识别。

    • 通常的技术分为两种:

    局部模型:先对局部定位,之后提取其特征,获得图像特征描述。缺陷:外观通常会随着位置、姿态及视角的改变的改变。
    整体模型:直接构造整幅图像的特征表示。包括经典的图像表示方式,如Bag-of-Visual-Words,及其适用于纹理分析的多种变种。
    基于CNN的局部模型要求对训练图像局部标注,代价昂贵,并且某些类没有明确定义的局部特征,如纹理及场景。

    • contribution

    It consists of two feature extractors based on CNNs whose outputs are multiplied using the outer product at each location of the image and pooled across locations to obtain an image descriptor.

    The outer product captures pairwise correlations between the feature channels and can model part-feature interactions,e.g.,if one of the networks was a part detector and the other a local feature extractor.

    M-Net :52.7% , 58.8%
    D-Net :61.0% , 70.4%
    M-Net + D-Net :84.1%(bilinear model)

    • 实验结果

    作者在鸟类飞机汽车等细粒度识别数据集上对模型性能进行测试。表明B-CNN性能在大多细粒度识别的数据集上,都优于当前模型,甚至是基于局部监督学习的模型,并且相当高效。

    2.Bilinear models for image classification

    **模型:**包含两个特征提取器,其输出经过外积相乘,池化后获得image descriptor

    代码中是将两个feature extractor的网络合成一个网络。
    在这里插入图片描述
    在这里插入图片描述bilinear pooling:

    双线性模型 B B B由四元组组成, B = ( f A , f B , P , C ) B = (f_A,f_B,P,C) B=(fA,fB,P,C)

    • feature function: f A , f B f_A,f_B fA,fB

    • pooling function: P P P

    • classfication function: C C C
      在这里插入图片描述
      code
      在这里插入图片描述

    • 首先把同一位置上的两个特征进行bilinear feature combination(矩阵外积)后,得到矩阵 b b b

    • 然后对b进行sum pooling,得到矩阵 ξ \xi ξ

    • ξ \xi ξ 张成向量,记为bilinear vector x x x

    • x x x进行矩归一化操作和L2归一化操作后,就得到融合后的特征 z z z

    • 最后 z z z用于fine grain

    维度过高: 特征A和B的维度之积(相当于排列方式,比如有512*512种特征表示方式,使用了很多的特征之间的两两组合,特征冗余)

    一个通道理解为一个特征图,理解为一种特征。比如:双线性操作前有512个特征图,操作后有512*512个特征图,512个feature和512个feature两两组合,得到512*512种特征组合。

    展开全文
  • 双线性群简介与基本运算

    千次阅读 2020-03-18 15:24:55
    现在密码学实现基本只使用Type A和Type A1的。前者为对称质数阶双线性群,后者为合数阶对称双线性群。本博客也只在这两类曲线上实验。其他类曲线的实现类似

    欢迎关注公众号:区块链之美。
    致力于区块链技术研究,传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。
    在这里插入图片描述

    1.质数阶双线性群(Prime-Order Bilinear Groups)

    质数双线性群可以由五元组 ( p , G 1 , G 2 , G T , e ) (p,G1,G2,GT,e) (p,G1,G2,GT,e)来描述。五元组中 p p p是一个与给定安全常数 λ λ λ相关的大质数, G 1 , G 2 , G T G1,G2,GT G1,G2,GT均是阶为 p p p的乘法循环群, e e e为双线性映射 e : G 1 × G 2 → G T e:G1×G2→GT e:G1×G2GT,它满足以下3个条件:

    • 双线性(Bilinearity):对于任意的 g ∈ G 1 , h ∈ G 2 , a , b ∈ Z p g∈G1,h∈G2,a,b∈Zp gG1hG2a,bZp,有 e ( g a , h b ) = e ( g , h ) a b e(g^a,h^b)=e(g,h)^{ab} e(ga,hb)=e(g,h)ab
    • 非退化性(Non-degeneracy):至少存在元素 g 1 ∈ G 1 , g 2 ∈ G 2 g_1∈G1,g_2∈G2 g1G1,g2G2,满足 e ( g 1 , g 2 ) ≠ 1 e(g_1,g_2)≠1 e(g1,g2)=1
    • 可计算性(Efficiency):对于任意的 u ∈ G 1 , v ∈ G 2 u∈G1,v∈G2 uG1,vG2,存在一个与给定安全常数 λ λ λ相关的多项式时间算法,可以高效地计算 e ( u , v ) e(u,v) e(u,v)

    现在的密码学相关论文中,习惯将 G 1 , G 2 G1,G2 G1,G2设置为乘法循环群。但是,基于椭圆曲线的双线性群构造中, G 1 , G 2 G1,G2 G1,G2是加法群。所以在大约2005年以前的论文中,双线性群一般写成加法群形式。JPBC中将 G 1 , G 2 G1,G2 G1,G2表示称为了乘法循环群,因此在实现写成加法群形式的方案时,要注意将加法群改成乘法群的写法再进行实现。如何修改呢?很简单,把加法群中的加法运算写成乘法运算、把加法群中的乘法运算写成幂指数运算即可。

    2.合数阶双线性群(Composite-Order Bilinear Groups)

    合数阶双线性群和质数阶双线性群很类似,区别是 G 1 , G 2 , G T G1,G2,GT G1,G2,GT的阶数是一个合数 N N N,其中 N N N是一些大质数的乘积,如 N = p 1 p 2 ⋯ p n N=p_1p_2⋯p_n N=p1p2pn。同样,e为双线性映射 e : G 1 × G 2 → G T e:G1×G2→GT e:G1×G2GT,它满足双线性性、非退化性以及可计算性。

    与质数阶双线性群不同,合数阶双线性群中, G N GN GN有阶数分别为 p 1 , p 2 , ⋯ , p n p_1,p_2,⋯,p_n p1,p2,,pn的子群 G p 1 , ⋯ , G p n Gp_1,⋯,Gp_n Gp1,,Gpn。这些子群进一步满足正交特性。

    对于所有的 h i ∈ G p i h_i∈Gp_i hiGpi h j ∈ G p j h_j∈Gp_j hjGpj,如果 i ≠ j i≠j i=j,那么 e ( h i , h j ) = 1 e(h_i,h_j)=1 e(hi,hj)=1

    简单地说就是,子群之间进行双线性运算的结果必为1。

    2.1.一些说明

    首先,由于双线性群现在的构造是基于椭圆曲线的,而椭圆曲线上的元素是由坐标 ( x , y ) (x,y) (x,y)表示的,所以如果我们将 G 1 , G 2 G1,G2 G1,G2的结果输出到Java的控制台,我们得到的是一个坐标。不过, G T GT GT是一个普通的 Z n Z_n Zn群,所以其元素的表示是一个数。

    其次,在密码学中,如果 G 1 = G 2 G1=G2 G1=G2,我们称这个双线性群是对称双线性群(Symmetric Bilinear Group),否则称之为非对称双线性群(Asymmetric Bilinear Group)。

    是否为对称双线性群由选取的椭圆曲线种类决定。一般认为,非对称双线性群要比对称双线性群更安全。特别地,现在已经证明一些特定的对称双线性群是不安全的了。

    现在JPBC可以使用的曲线为如下几类:

    • Type A
    • Type A1
    • Type D
    • Type E
    • Type F
    • Type G

    现在密码学实现基本只使用Type A和Type A1的。前者为对称质数阶双线性群,后者为合数阶对称双线性群。本博客也只在这两类曲线上实验。其他类曲线的实现类似。由于是对称双线性群,本博客中 G 1 , G 2 G1,G2 G1,G2统一写为 G G G

    3.双线性群初始化

    在JPBC中,双线性群的使用都是通过叫做Pairing的对象来实现的。双线性群的初始化在JPBC中就是对Pairing对象的初始化。双线性群有两种初始化的方法。第一种是通过代码动态产生一个双线性群,第二种是从文件中读取参数而产生群。

    3.1.通过代码动态产生

    动态产生的方法非常简单,大概有如下步骤:指定椭圆曲线的种类、产生椭圆曲线参数、初始化Pairing。Type A曲线需要两个参数:rBit是Zp中阶数p的比特长度;qBit是G中阶数的比特长度。代码为:

    //rBit是Zp中阶数p的比特长度,如160;qBit是G中阶数的比特长度,如512。
    TypeACurveGenerator pg = new TypeACurveGenerator(rBit, qBit);
    PairingParameters typeAParams = pg.generate();
    Pairing pairing = PairingFactory.getPairing(typeAParams);
    

    Type A1曲线需要二个参数:numPrime是阶数N中有几个质数因子;qBit是每个质数因子的比特长度。注意,Type A1涉及到的阶数很大,其参数产生的时间也比较长。代码为:

    TypeA1CurveGenerator pg = new TypeA1CurveGenerator(numPrime, qBit);
    PairingParameters typeA1Params = pg.generate();
    Pairing pairing = PairingFactory.getPairing(typeA1Params);
    

    3.2.通过文件读取产生

    我们也可以选择事先产生好参数,存放在文件中。以后再初始化的时候,直接从文件中读取参数,就可以非常快速的初始化双线性群。

    PairingParameters支持toString()函数。实际上,我们可以直接将PairingParametersd的toString()存放在文件中。读取的时候,通过读取文件就可以直接初始化双线性群了。

    Type A曲线从文件中读取参数初始化的代码为:

    TypeACurveGenerator pg = new TypeACurveGenerator(rBit, qBit);
    PairingParameters typeAParams = pg.generate();
    //将参数写入文件a.properties中,我用了Princeton大学封装的文件输出库
    Out out = new Out("a.properties");
    out.println(typeAParams);
    //从文件a.properties中读取参数初始化双线性群
    Pairing pairing = PairingFactory.getPairing("a.properties");
    

    Type A1曲线从文件中读取参数初始化的代码为:

    TypeA1CurveGenerator pg = new TypeA1CurveGenerator(numPrimes, qBit);
    PairingParameters typeA1Params = pg.generate();
    //将参数写入文件a1.properties中,同样使用了Princeton大学封装的文件输出库
    Out out = new Out("a1.properties");
    out.println(typeA1Params);
    //从文件a1.properties中读取参数初始化双线性群
    Pairing pairing = PairingFactory.getPairing("a1.properties");
    

    4.产生双线性群中的随机数

    Type A中产生随机数的方法很简单,代码为:

    //随机产生一个Z_p群的元素
    Element Z_p = pairing.getZr().newRandomElement().getImmutable();
    //随机产生一个G_1群的元素
    Element G_1 = pairing.getG1().newRandomElement().getImmutable();
    //随机产生一个G_2群的元素
    Element G_2 = pairing.getG2().newRandomElement().getImmutable();
    //随机产生一个G_T群的元素
    Element G_T = pairing.getGT().newRandomElement().getImmutable();
    

    Type A1中产生随机数的方法稍微有点麻烦。对于ZN和GT方法和Type A一样。代码为:

    //随机产生一个Z_N群的元素
    Element Z_N = pairing.getZr().newRandomElement().getImmutable();
    //随机产生一个G_T群的元素
    Element G_T = pairing.getGT().newRandomElement().getImmutable();
    

    但是对于G就不同了。因为G有子群Gpi,Type A1产生随机数时需要指定生成元,椭圆曲线的参数,产生哪个子群的元素,以及Type A1一共有多少个子群。

    假定我们产生的Type A1共有n个子群,这n个子群的阶分别为p1,⋯,pn,产生随机数的代码如下:

    TypeA1CurveGenerator pg = new TypeA1CurveGenerator(numPrimes, qBit);
    PairingParameters typeA1Params = pg.generate();
    Pairing pairing = PairingFactory.getPairing(typeA1Params);
    
    //设定并存储一个生成元。由于椭圆曲线是加法群,所以G群中任意一个元素都可以作为生成元
    Element generator = pairing.getG1().newRandomElement().getImmutable();
    //随机产生一个G_p_1中的元素
    Element G_p_1 = ElementUtils.getGenerator(pairing, generator, typeA1Params, 0, numPrimes).getImmutable();
    //随机产生一个G_p_2中的元素
    Element G_p_2 = ElementUtils.getGenerator(pairing, generator, typeA1Params, 1, numPrimes).getImmutable();
    // ...... 
    //随机产生一个G_p_n中的元素
    Element G_p_n = ElementUtils.getGenerator(pairing, generator, typeA1Params, 1, numPrimes).getImmutable();
    

    5.将指定的元素哈希到双线性群中

    由于双线性群最初是用在基于身份的加密(Identity-Based Encryption)系统中,我们经常会需要将一个特定的String或者byte[]哈希到双线性群中。

    JPBC支持将byte[]哈希到双线性群的Z,G,GT中。但是,JPBC说明文档中没有提到的是,byte[]数组长度不能太长,如果过长会抛出异常。因此,我建议首先将byte[]用一个SHA256或者其他通用哈希函数哈希到固定长度,再用JPBC提供的函数哈希到双线性群上。在这里我略去SHA256步骤,直接给出哈希到Z,G,GT群的代码:

    //将byte[] byteArray_Z_p哈希到Z_p群
    Element hash_Z_p = pairing.getZr().newElement().setFromHash(byteArray_Z_p, 0, byteArray_Z_p.length);
    //将byte[] byteArray_G_1哈希到G_1群
    Element hash_G_1 = pairing.getG1().newElement().setFromHash(byteArray_G_1, 0, byteArray_G_1.length);
    //将byte[] byteArray_G_2哈希到G_2群
    Element hash_G_2 = pairing.getG2().newElement().setFromHash(byteArray_G_2, 0, byteArray_G_2.length);
    //将byte[] byteArray_G_T哈希到G_T群
    Element hash_G_T = pairing.getGT().newElement().setFromHash(byteArray_G_T, 0, byteArray_G_T.length);
    

    注意,对于Type A1来说,这个代码无法指定哈希到指定子群Gpi中。解决方法是将byte[]先哈希到Z群,然后利用G,GT的生成元计算幂指数,从而达到哈希到G,GT上的效果。

    6.双线性群的运算

    双线性群之间有如下运算:

    • G相关运算:GZ, G×G;
    • GT相关运算:GZT, GT×GT;
    • Z相关运算:Z+Z, Z×Z;
    • Pairing运算

    做运算的时候要注意一下几点:

    1. Java的运算结果都是产生一个新的Element来存储,所以我们需要把运算结果赋值给一个新的Element;
    2. Java在进行相关运算时,参与运算的Element值可能会改变。所以,如果需要在运算过程中保留参与运算的Element值,在存储的时候一定要调用getImmutable(),具体方法见代码中的初始化相关参数部分。
    3. 其实为了保险起见,防止Element在运算的过程中修改了Element原本的数值,可以使用Element.duplicate()方法。这个方法将返回一个与Element数值完全一样的Element,但是是个新的Element对象。举例来说,如果做G1×G1的运算,可以写成:
    Element G_1_m_G_1 = G_1.duplicate().mul(G_1_p.duplicate());
    

    G和G其实也是可以进行幂指数运算的,即GG,调用的函数为Element e1.pow(Element e2)。特别注意,我们再写G群的Z次方运算时,用的函数为powZn(),而不是pow(),这个调用错误很容易使得程序的运算结果不正确。
    代码如下:

    //初始化相关参数
    Element G_1 = pairing.getG1().newRandomElement().getImmutable();
    Element G_2 = pairing.getG2().newRandomElement().getImmutable();
    Element Z = pairing.getZr().newRandomElement().getImmutable();
    Element G_T = pairing.getGT().newRandomElement().getImmutable();
    
    Element G_1_p = pairing.getG1().newRandomElement().getImmutable();
    Element G_2_p = pairing.getG2().newRandomElement().getImmutable();
    Element Z_p = pairing.getZr().newRandomElement().getImmutable();
    Element G_T_p = pairing.getGT().newRandomElement().getImmutable();
    
    //G_1的相关运算
    //G_1 multiply G_1
    Element G_1_m_G_1 = G_1.mul(G_1_p);
    //G_1 power Z
    Element G_1_e_Z = G_1.powZn(Z);
    
    //G_2的相关运算
    //G_2 multiply G_2
    Element G_2_m_G_2 = G_2.mul(G_2_p);
    //G_2 power Z
    Element G_2_e_Z = G_2.powZn(Z);
    
    //G_T的相关运算
    //G_T multiply G_T
    Element G_T_m_G_T = G_T.mul(G_T_p);
    //G_T power Z
    Element G_T_e_Z = G_T.powZn(Z);
    
    //Z的相关运算
    //Z add Z
    Element Z_a_Z = Z.add(Z_p);
    //Z multiply Z
    Element Z_m_Z = Z.mul(Z_p);
    
    //Pairing运算
    Element G_p_G = pairing.pairing(G_1, G_2);      
    

    参考

    [1] https://blog.csdn.net/liuweiran900217/article/details/45080653

    展开全文
  • 怀疑是不是matlab运算精度不足导致的,于是将传递函数转换为了零极点增益模型,约了个分,系数小了很多,再变换,结果对了,嘿嘿,初步判断问题原因是matlab运算精度不够,具体过程如下。 直接变换: 转换为...
  • wp1=0。3*pi;wp2=0。6*pi;ws1=0。4*pi;ws2=0。5*pi;Ap=3;As=10;Fs=1;B=ws2-ws1;w0=sqrt(ws1*ws2);wp=max(abs(wp1),abs(wp2));ws=1;[N,wc]=buttord(wp,ws,Ap,As,'s');...[numt,dent]=lp2bs(num,d...
  • 针对实际工业过程中广泛存在的双线性系统,通过对其每一滚动优化点进行线性化处理后,设计了一种简便高效的、可与线性系统媲美的预测函数控制算法,该算法具有解析形式,从而避免了一般非线性寻优的繁琐计算。...
  • 它基本上只是基于光线跟踪和视线(LOS)算法的一系列MATLAB函数的C代码版本,用于我作为研究团队一部分正在研究的复杂3D热模型中。 编译该C代码并在运行时将其链接到MATLAB产生了数量级的计算加速,这是非常高兴的。...
  • 双线性插值法原理: ① 何为线性插值? 插值就是在两个数之间插入一个数,线性插值原理图如下: 在位置 x 进行线性插值,插入的值为f(x) ↑ ② 各种插值法: 插值法的第一步都是相同的,计算目标图...
  • 【Bilinear interpolation】双线性插值详解(转)[组图]08-08栏目:技术TAG:双线性插值双线性插值【Bilinear interpolation】双线性插值详解(转)最近在做视频拼接的项目,里面用到了图像的单应矩阵变换,在最后的...
  • 这里写目录标题基本的Bilinear CNN降低维度Compact Bilinear Pooling-CVPR2016Low-rank Bilinear Pooling for Fine-Grained Classification-CVPR2017跨层双线性池化Hierarchical Bilinear Pooling for Fine-Grained ...
  • 双线性模型是2015年提出的一种细粒度图像分类模型。该模型使用的是两个并列的CNN模型,这种CNN模型使用的是AlexNet或VGGNet去掉最后的全连接层和softmax层,这个作为特征提取器,然后使用SVM作为最后的线性分类器。...
  • 将种群分为成年与幼年两个阶段,且只考虑疾病在成年个体中传播,建立了具有阶段结构且发生率为双线性的SIR传染病模型,证明了系统解的有界,并利用V函数法分析了模型的渐近性质和其平衡点的局部渐近稳定,并且得到了...
  • OpenSees Matlab Mat:基于R-O模型双线性 Mat:双线性模型双线性 对比结果: 结论: 1 .SAP2000各种模型分析结果可知:各种算法下的加速结果基本一致,HHT 算法下的位移最大,同样的,HHT算法下的滞回曲线耗能效果...
  • 注意力之双线性模型注意力

    千次阅读 2020-09-22 14:23:59
    本文主要针对两篇论文:双线性注意力网络模型和深度模块化注意力进行总结,加上自己对其的理解。若有不足,还望指出。 论文地址: 双线性注意力网络 深度模块化注意力 项目地址: 双线性注意力网络 深度模块化注意力...
  • 细粒度图像分类旨在同一大类图像的确切子类。由于不同子类之间的视觉差异很小,而且容易受姿势、视角、图像中目标位置等影响,这是一个很有挑战的任务。...双线性汇合提供了比线性模型更强的特征表示,并可以...
  • OpenCV的resize方法与双线性插值

    千次阅读 2018-02-08 16:54:50
    训练Object Detection模型SSD完毕之后进入test阶段,每张图像在进入输入层之前需要进行resize操作,以满足CNN模型对输入层size的要求。本文首先介绍了Caffe实现的SSD模型对输入图像的变换规定,引出了OpenCV中的...
  • [NUMd, DENd]=bilinear(NUM, DEN, Fs) 把模拟滤波器的传递函数模型转换成数字滤波器的传递函数模型,其中的Fs为采样频率。 [Ad, Bd, Cd, Dd]=bilinear(A, B, C, D, Fs) 把模拟滤波器的状态方程模型转换成数字...
  • 讨论了一类带双线性发生率SIRS型的传染病模型,得到了无病平衡点和地方病平衡点存在的阈值条件,借助构造Liapunov函数,找到了平衡点全局渐进稳定的充要条件.
  • 双线性插值(Bilinear Interpolation)

    万次阅读 2019-01-11 12:04:45
    双线性插值(Bilinear Interpolation)  假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j...
  • 双线性插值 一文全讲解

    千次阅读 2019-01-13 15:35:56
    在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。...
  • 引入注意力机制的方法是解决上述问题的常见策略,为此,在双线性卷积神经网络模型的基础上,提出一种改进的双线性残差注意力网络:将原模型的特征函数替换为特征提取能力更强的深度残差网络,并在残差单元之间分别添加...
  • 点击我爱计算机视觉标星,更快获取CVML新技术编者按:双线性特征在学习细粒度图像表达上效果很好,但计算量极大,无法在深层的神经网络中被多次使用。因此,微软亚洲研究院设计了一种深度双线性转...
  • 2 Matlab实现最近邻插值、双线性插值、双三次插值3最近邻插值的原理简介4双线性插值的原理简介5双三次插值原理简介 1插值是什么?为啥要插值? 一句话来说就是插值用于图片缩放,为了解决图片缩放中可能出现小数坐标...
  • 双线性插值算法的详细总结

    万次阅读 多人点赞 2017-12-17 16:43:30
    最近在做视频拼接的项目,里面用到了图像的单应矩阵变换,在最后的图像重映射,由于目标图像的坐标是非整数的,所以需要用到插值的方法,用的就是双线性插值,下面的博文主要是查看了前辈的博客对双线性插值算法...
  • 在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值、双线性插值、双三次插值、兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广...
  • 【Bilinear interpolation】双线性插值详解(转)[组图]08-08栏目:技术TAG:双线性插值双线性插值【Bilinear interpolation】双线性插值详解(转)最近在做视频拼接的项目,里面用到了图像的单应矩阵变换,在最后的...
  • 1. 线性插值 线性插值是数学、计算机图形学等领域广泛使用的一种简单插值方法。 假设我们已知坐标 ((x0,y0) 与 (x1,y1),要得到 [x0,x1] 区间内某一位置x在直线上的值。...2. 双线性插值(Bilinear...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,573
精华内容 3,029
关键字:

双线性函数模型