精华内容
下载资源
问答
  • 全局与局部GAN做图片填充

    千次阅读 2018-10-16 15:45:10
    Globally and Locally Consistent Image Completion(以下...我自己按照他们的文章实现后,发现效果并不理想,但这一点和我的训练数据以及GAN模型本身的不稳定性有很大关系,也有可能我的实现方法有问题。但是基于他...

    Globally and Locally Consistent Image Completion(以下简称GL)。这篇文章是由早稻田大学(Waseda University)的Satoshi Iizuka等人发表的,他们并没有公布源代码以及训练模型。

    我自己按照他们的文章实现后,发现效果并不理想,但这一点和我的训练数据以及GAN模型本身的不稳定性有很大关系,也有可能我的实现方法有问题。但是基于他们的思路以及DCGAN原本代码重新修改后,我得到了一个可以继续训练的模型,会在最后和大家讨论一下。

    基本思路

    GL这篇文章完全以卷积网络作为基础,遵循GAN的思路,设计两部分网络,一部分用于生成图像,一部分用于鉴别生成图像是否与原图片一致。

    生成图片部分,GL采用12层卷积网络对原始图片(去除需要进行填充的部分)进行encoding,得到一张原图16分之一大小的网格。然后再对该网格采用4层卷积网络进行decoding,从而得到复原图像。

    鉴别器也被分为两个部分,一个全局鉴别器(Global Discriminator)以及一个局部鉴别器(Local Discriminator)。全局鉴别器将完整图像作为输入,识别场景的全局一致性,而局部鉴别器仅在以填充区域为中心的原图像4分之一大小区域上观测,识别局部一致性。

    通过采用两个不同的鉴别器,使得最终网络不但可以使全局观测一致,并且能够优化其细节,最终产生更好的图片填充效果。

    填充网络

    具体到其填充网络部分,是完全基于卷积网络的。原文中给出的卷积网络设置如下:

    网络输入时原始图像,包含RGB三色的通道,以及一个binary的覆盖层,用于盖住需要填充的部分。论文中有提到因为作者不想修改原始图片的内容,所以对于没有被覆盖的部分,他们会直接采用原始图片中的像素进行填充。

    除此之外,通过观察网络结构,我们可以看出这个网络前面若干层是对原始图像的encoding,在第二层以及第四层网络,通过2X2的stride降低分辨率,减少存储空间和计算时间。再通过一系列的convolution和dilated convolution调整后,结果通过deconvolution layer恢复到原始分辨率。在整个网络中,作者采用ReLU函数,在最后一层采用Sigmoid函数使得输出在0到1区间内。

    作者在文章中提到两点注意事项,第一点是他们的网络模型仅仅降低了两次分辨率,使用大小为原始大小4分之一的卷积,其目的是为了降低最终图像的纹理模糊程度。

    第二点就是他们使用了Multi-Scale Context Aggregation by Dilated Convolutions中提到的dilated convolutional layer。这种卷积形式中文被称作空洞卷积,能够通过相同数量的参数和计算能力感知每个像素周围更大的区域。在文章中,作者通过一张图给出说明,为了能够计算填充图像每一个像素的颜色,该像素需要知道周围图像的内容,采用空洞卷积能够帮助每一个点有效的“看到”比使用标准卷积更大的输入图像区域,从而填充图中点p2的颜色。对这一方面感兴趣的同学可以再阅读一下知乎上的问题“如何理解空洞卷积”。

    在tensorflow当中,atrous_conv2d实现了所谓的dilated convolution,可以通过一段函数对他进行包装:

    鉴别网络

    如上文所示,鉴别网络分为全局鉴别网络和局部鉴别网络两个部分。全局鉴别网络输入是256X256,RGB三通道图片,局部网络输入是128X128,RGB三通道图片,根据原始论文当中的设置,全局网络和局部网络都会通过5X5的convolution layer,以及2X2的stride降低分辨率,最终分别得到1024维向量。

    然后,我们将全局和局部两个鉴别器输出连接成一个2048维向量,通过一个全连接然后用sigmoid函数得到整体图像一致性打分。

    我个人比较赞同他们这样打分系统的设计理念,但是再具体实现上持有一定怀疑态度。因为最终鉴别器是基于两部分鉴别器产生的中间结果,我个人感觉优化鉴别器并不等于同时优化了全局和局部鉴别器的一致性,不知道各位读者怎么看?

    训练过程

    训练图片填充所要优化的函数和上一篇文章“”类似,除了要对GAN系统进行最大最小优化之外,我们需要同时考虑填充图像与真实图像误差。这里我们采用MSE(Mean Squared Error)作为对填充图像C(x)与真实图像x之间的误差衡量函数:

    通过加权,我们可以合并MSE函数和对抗网络GANloss function

    针对我在上一段提到的两个鉴别器的问题,这一张作者也有说到“As the optimization consists of jointly minimizing and maximizing conflicting objectives, it is not very stable.”

    由于图像填充问题本来就是非常有挑战性的,所以训练过程需要非常小心。作者在这一张给出了如下图所示的训练过程,整个算法分为三个阶段:第一阶段(最初的Tc轮)主要优化completion network C;第二阶段(Tc~Tc+Td轮)主要优化discriminators D;最后在同时优化所有损失函数。

    除了基本的深度学习以外,作者还通过传统的图像处理方法对生成图片边缘进行了修正,下图展示了修正带来的效果:

    我的实现

    由于这篇文章没有公开任何代码和训练模型,所以我不得不从头开始自己实现,过程中最大的挑战就是GAN自身的不稳定性。

    实现方面,因为有上一篇文章DCGAN开源的代码,所以我直接去修改了Discriminator和Generator。因为没有GPU,所以我采用64X64的人脸进行学习而非256X256的Place2数据集。

    识别部分分别鉴定两个区域的一致性。

    生成代码也非常简单,只需要实现调用DCGAN的帮助函数,构建出主网络即可。

    训练过程可以重复采用DCGAN代码:https://github.com/bamos/dcgan-completion.tensorflow

    在我实现这篇文章中提到的算法时,遇到最大的问题就是GAN的不稳定性。起初,我设置的MSE权重比例太低,另外discriminator比generator训练速度快非常多,导致我的discriminator可以轻易的分辨出哪张是自然图像,哪张是生成图像,但是传递给generator的梯度只能使他生成奇怪的纹路:

    在我调整了MSE权重后,目前可以生成人脸轮廓,但是只训练了300多轮,估计以我现在的CPU还要等好多天才行。

    另外一个训练中遇到的问题就是训练效率低下,在CPU上运行大约需要90秒才能完成64组图像的一轮训练。对比我上一篇文章提到的用DCGAN进行图片填充,我比较喜欢这篇文章对图像先进行encoding,在进行decoding的思路,基于这个思路,我又写了一个generator对模型进行了一定的退化。

    首先,先对原始人脸进行一定程度的降维,然后通过一个简单的全连接层,将人脸变为一个128维向量。在得到人脸的encoding结果后,采用原始DCGAN的思路生成新的图像,在生成过程中同时优化MSE和GAN损失函数。这样的生成网络进行在我的破电脑上运行一轮大约只要10秒钟。

    几千轮训练过后,我们生成的图像在一定程度上与原图相似,但是最终的64X64大小的像素是根据encoding后128维向量生成,边界非常不平滑,纹理也不清晰。也许我还是应该尝试将图片编码压缩为16X16,多通道参数,而非一维编码。

    小结

    民科带你读第二篇就写到这里,通过几次简单的尝试,我意识到GAN有着很大的潜力但是训练过程并不稳定。

    接下来我会继续调试现在的代码,然后研究一下如何稳定GAN的训练过程,也许应该看WGAN?针对图片补全这一个问题,我们回头看看传统的研究思路,能不能结合GAN得到提高。

    1. Globally and Locally Consistent Image Completion

    2. Multi-Scale Context Aggregation by Dilated Convolutions

    3. Improved Training of Wasserstein GANs

    展开全文
  • C++中全局函数和局部函数的关系

    千次阅读 2017-12-09 17:10:00
    #include using namespace std; //面向对象的模型-全局函数成员函数class Test { public: int a; int b; public: Test(int a=0,int b=0) { this->a = a; this->b = b; } Test T
    #include <iostream>
    using namespace std;
    //面向对象的模型-全局函数成员函数
    
    class Test
    {
    public:
        int a;
        int b;
    public:
        Test(int a=0,int b=0)
        {
            this->a = a;
            this->b = b;
        }
        Test  TestAdd(Test &t2)
        {
            //Test tmp;
            // tmp.a = this->a + t2.a;
            // tmp.b = this->b + t2.b;
    
            //return      tmp;
            Test tmp(this->a + t2.a,this->b + t2.b);
            return  tmp;         //返回一个元素C++编译器会将其copy成一个匿名对象
        }
        void prinT(void)
        {
            cout << this->a  << endl<< this->b << endl;
    
        }
    protected:
    private:
    };
    
    void ang(void)
    {
           cout <<"this is a function!"<< endl;
    }
         //全局函数的方式
    //Test  TestAdd(Test &t1,Test &t2)
    //{
    //  
    //  Test tmp;
    //  return    tmp;
    //}
    int main()
    {
        Test t1(1,2);
        Test t2(3,4);
        //全局函数的两种调用的的方式
        ::ang();
        ang();
            //匿名对象的两种接收方式
        {
        Test t3 = t1.TestAdd(t2);    //生成的匿名对象直接转换为t3
        t3.prinT();
        Test t4;                              //匿名对象复制给t4 
        t4 = t1.TestAdd(t2);
    
        t4.prinT();
        }
        cout << "hello world!" << endl;
        system("pause");
        return 0;
    }

    函数的返回值是类的自身
    这样实现函数的无限调用

    #include <iostream>
    using namespace std;
    //面向对象的模型-全局函数成员函数
    
    class Test
    {
    public:
        int a;
        int b;
    public:
        Test(int a=0,int b=0)
        {
            this->a = a;
            this->b = b;
        }
        //在引用的处理之中,因为C++编译器已经替我们做了很多的工作
        //因此返回一个引用,程序员只需要返回变量自身就行了
        Test&  TestAdd2(Test &t2)
        {
            this->a = this->a + t2.a;
            this->b = this->b + t2.b;
    
            return *this; //函数返回值是对象自身     C++编译器会将返回的自身变成一个引用
        }
        void ptintF()
        {
            cout<<this->a << endl;
            cout<< this->b << endl;
        }
    
    protected:
    private:
    };
    
    
    int main()
    {
        Test t1(1,2);
        Test t2(3,4);
        //t1 = t1+t2;
        t1.TestAdd2(t2).TestAdd2(t2).TestAdd2(t2);         //返回引用就能实现返回对象自身 
        //这样函数在调用自身的时候返回的还是自身的引用还能再次的使用相应的函数
        t1.ptintF();
    
    
        cout << "hello world!" << endl;
        system("pause");
        return 0;
    }
    展开全文
  • 全局阈值分割

    全局阈值分割

    迭代法阈值获取方法:
    1)选取一个的初始估计值T(128);
    2)用T分割图像。这样便会生成两组像素集合:G1由所有灰度值大于T的像素组成,而G2由所有灰度值小于或等于T的像素组成。
    3)对G1和G2中所有像素计算平均灰度值u1和u2。
    4)计算新的阈值:T=1/2(u1 + u2)。
    重复步骤(2)到(4),直到得到的T值之差小于一个事先定义的参数T0。

    先导进来图片

    I = imread('rice.png');
    [width,height] = size(I);
    T0 = 1;%设置门限
    T1= 128; %初始阈值T1
    %设置G1,G2两个列向量,各自统计<T和>T的值
    gray_leval_1 = 1;
    gray_leval_2 = 1;
    

    matlab里没有do-while语句,所以用
    while 1

    break
    代替

    while 1
        for i = 1:width
            for j = 1:height
                if I(i,j)>T1
                    G1(gray_leval_1) = I(i,j); %得到分组G1
                    gray_leval_1 = gray_leval_1 + 1;
                else
                    G2(gray_leval_2) = I(i,j); %得到分组G2
                    gray_leval_2 = gray_leval_2 + 1;
                end
            end
        end
        %计算G1、G2均值
        avg1 = mean(G1);
        avg2 = mean(G2);
        T2 = (avg1 + avg2)/2;
        if abs(T2 - T1)<T0 
            break;
        end
        T1 = T2;
        gray_leval_1 = 1;
        gray_leval_2 = 1;
    end
    T1
    T1=uint8(T1);
    

    T1=130.7
    然后画出来

    for i=1:width
        for j=1:height
            if(I(i,j)<T1)
                BW1(i,j)=0;
            else 
                BW1(i,j)=1;
            end
        end
    end
    subplot(1,3,1);imshow(I)
    subplot(1,3,2);imshow(BW1);title('阈值分割');
    

    matlab自带的Otus阈值分割方法

    T3=graythresh(I)
    BW2=imbinarize(I,T3);%Otus阈值分割
    subplot(1,3,3);imshow(BW2);title('Otus阈值分割');
    

    I=130.9,差不多哈。
    结果
    在这里插入图片描述

    这个阈值分割方法存在偏差,如果两个峰值数目相差越多,偏差越大
    (假设第一次迭代前,T在正确位置,很容易看出来,随着迭代进行,越来越偏离)
    在这里插入图片描述
    计算的T=93,目测值应该在110-120吧。

    多说一句,图像处理,一定要double一下,否则可能出现问题。比如,我想把大米图的直方图暗部拉大(偏向0),以体现这种偏差,就用了个一次函数的变换,结果这样了

    在这里插入图片描述

    因为先乘k,结果>255的全归于255,以后全错。

    自适应阈值分割

    1)将整幅图像分成一系列互相之间有50%重叠的子图像;
    2)做出每个子图像的直方图;
    3)检测各个子图像的直方图是否为双峰,如果是,则采用最佳阈值法确定一个阈值,否则就不进行处理;
    4)根据对直方图为双峰的子图像得到的阈值通过插值得到所有子图像(像素点)的阈值。
    仨坑
    1、怎么割图像啊(这个还好吧,也不算割,设置好步长来就行了)
    2、怎么检测单峰还是双峰啊,单峰的话,空缺imresize是不行的。
    3、怎么插值啊(主要是老师上课讲的太玄学,按照距离加权,四点平均,把相距很远的点内部全部插满,听懵了。后来想到,matlab直接imresize啊!然后就码下来啦)
    1、分割方式设置好矩形大小和步长就行
    2、峰值个数没写,matlab统计工具箱里好像有正态拟合图像,而不是plot()这种拟合,plot拟合只是画的圆滑了些还是很多局部峰值
    在这里插入图片描述
    3、插值方式采用了imresize函数
    A=imresize(I,2,‘nearest’);%最近邻插值
    B=imresize(I,2,‘bilinear’);%双线性
    C=imresize(I,2,‘bicubic’);%双三次

    I=imread('rice.png');
    T=zeros(15);
    for i=0:14
        for j=0:14
            img = imcrop(I,[1+i*16 1+j*16 31 31]);%内核32*32,步长设置为16
            t=255*graythresh(img);%我这里直接用了
            T(j+1,i+1)=t;%这里注意坐标顺序反着
        end
    end
    T=uint8(T);
    T1=imresize(T,[256 256],'bilinear');%看了下貌似双线性插值最好
    %%
    for i=1:256
        for j=1:256
            if (I(i,j)<T1(i,j))
                BW(i,j)=0;
            else
                BW(i,j)=1;
            end
        end
    end
    imshow(BW)
    

    有一个地方要注意,图像[i,j],矩阵得是[j,i]。

    阈值图像:
    在这里插入图片描述
    底部更暗,所以阈值也更低才能滤完整
    阈值分割结果
    在这里插入图片描述
    嗯,上部噪声少了,下部也更完整了
    然后试了下这位兄弟博客的图片
    这老哥跑的OPENCV中自带的函数,效果一级棒(怎么看着像边缘检测)
    我这个…毕竟没字的地方有黑背景有白背景,一加权,也没法搞,不过还阔以吧
    在这里插入图片描述

    matlab中自带的阈值分割,对大米图还行。全局阈值分割底部大米都割残了,这个方法完整,可是,这跟局部有关系?貌似先调了调灰度,就好分割了

     I=imread('rice.png');
     I=im2double(I);
    se=strel('disk',10);%se.Neighborhood:10*10圆盘
    ft=imtophat(I,se);% 高帽变换
    gt=uint8(255*ft);
    Th=graythresh(ft);                       
    G=imbinarize(ft,Th);%阈值分割                       
    figure,imshow(G),title('局部阈值');
    

    在这里插入图片描述

    Otsu算法

    matlab自带的阈值分割方法
    参考动态阈值–大津法基于Otsu算法的图像自适应阈值分割,重新打了一下
    调用:

    [counts x] = imhist(img);
    [m n] = size(img);
    BW1 = otsu(counts, m*n);
    第一个元素为直方图,第二个元素为图片大小
    或者:
    T=graythresh(I)
    BW2=imbinarize(I,T);

    原理:
    在这里插入图片描述

    在这里插入图片描述
    让T遍历所有灰度值,找到g的最大值
    代码:

    function level = otsu(histogramCounts, total)%histogramCounts是图像的直方图, total图像的总像素数
    sum0 = 0;
    w0 = 0;%像素个数
    maximum = 0.0;%保存T的最大值
    total_value = sum((0:255).*histogramCounts');
    for ii=1:256
        w0 = w0 + histogramCounts(ii);%<T像素个数累加
        if (w0 == 0)
            continue;
        end
        w1 = total - w0;
        if (w1 == 0)%遍历结束>T像素=0
            break;
        end
        sum0 = sum0 +  (ii-1) * histogramCounts(ii);%灰度和
        m0 = sum0 / w0;%平局灰度u0
        m1 = (total_value - sum0) / w1;%平局灰度u1
        icv = w0 * w1 * (m0 - m1) * (m0 - m1);
        if ( icv >= maximum )
            level = ii;
            maximum = icv;
        end
    end
    end
    
    展开全文
  • 局部变量和全局变量的区别

    千次阅读 2017-03-05 18:17:45
    1、全局变量 全局变量也成为外部变量,它是在函数外部...在C等面向过程语言中,局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。 #

    1、全局变量

    全局变量也成为外部变量,它是在函数外部声明的变量。不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。

    2、局部变量

    局部变量是指在程序中,只在特定过程或函数中可以访问的变量,是相对全局变量而言的。

    3、特点及区别

    在C等面向过程语言中,局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。

    #include<iostream>
    #include<string.h>
    using namespace std;
    int i=1;
    int main(int argc,char* argv[])
    {
        int i = i;
        cout <<  i << endl;
        return 0;
    }
    


    int i=i,变量从声明的那一刻开始就是可见的了,局部变量会屏蔽全局变量,因此main函数里的i跟全局变量的i无关,不是1,而是一个未定义的值(不同操作系统及不同编译器会有不同处理)。

    在同一文件中,当局部变量屏蔽了全局变量,而又想要使用全局变量时,有两种方法。一种是使用作用域操作符“::”,一种是使用“extern”。

    #include<iostream>
    #include<string.h>
    using namespace std;
    int i=1;
    int main(int argc,char* argv[])
    {
        int i = i;
        cout <<  ::i << endl;
    	//{
    	//	extern int i;
    	//	cout << i << endl;
    	//}
        return 0;
    }

    4、总结

    具体来说,全局变量和局部变量的区别如下:

    1). 作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等
    2). 内存存储方式不同:全局变量存储在全局数据区中,局部变量存储在栈区
    3). 生命期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了
    4). 使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量

    展开全文
  • 【malloc 申请的变量、与局部变量、全局变量的区别】 1. 无论全局变量还是局部变量都是系统自动分配管理的,内存分配在:静态储存区和动态储存区即栈; 2. 全局变量:如果不人为初始化,系统自动初始化为0; 3. ...
  •     在JNI规范中定义了三种引用:局部引用(Local Reference)、全局引用(Global Reference)、弱全局引用(Weak Global Reference)。区别如下: 1、 局部引用: 通过NewLocalRef和各种JNI接口创建(Find...
  • 快速了解Ajax·全局刷新和局部刷新(Ajax)

    千次阅读 多人点赞 2021-01-14 16:01:26
    全局刷新和局部刷新(Ajax) 全局刷新:整个浏览器被新的数据覆盖,需要在网络中传输大量的数据。浏览器需要加载,渲染页面。相当于我们正常点击访问网站的方式。 局部刷新:在浏览器的内部,发起请求,获取数据,改变...
  • 实参、形参、局部变量和全局变量

    千次阅读 2020-09-15 16:53:39
    目录实参和形参实参数据传递函数调用过程形参实参和形参的关系局部变量和全局变量局部变量局部变量的作用域说明:全局变量全局变量说明: 实参和形参 实参 实际参数简称“实参”。在调用有参函数时,函数名后面括号...
  • JS 基础之全局变量,局部变量

    千次阅读 2018-08-23 09:56:29
    本章将概要介绍一些编写高质量JavaScript的最佳实践、模式和习惯,比如避免全局变量、使用单var声明、预缓存循环中的length、遵守编码约定等等。本章还包括一些编程习惯,这些习惯跟具体的代码关系不大,而是更多...
  • C语言中的变量,按照作用域的范围可分为两种, 即局部变量和全局变量。 一、局部变量局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。...
  • 局部全局的多模式电影场景分割个人总结1.研究现状:2.研究的意义:3.提出的解决方案(局部全局的场景分割模型):4.电影场景数据集:5.结论:全文翻译从局部全局的多模式电影场景分割方法摘要1.介绍2.相关...
  • Struts2(二)局部与全局类型转换器

    千次阅读 2015-06-17 18:14:54
    -- 定义处理结果视图资源之间的关系 -->  <result name="success">/index.jsp 运行时在网址输入http://localhost:端口号/工程名/..(命名空间)../list_execute.action?birthday=20121181即可完成跳转,在...
  • JNI学习笔记——局部全局引用

    万次阅读 2012-03-26 22:51:04
    JNI将实例、数组类型暴露为不透明的引用。native代码从不会直接检查一个不透明的引用指针的上下文,而是通过使用JNI函数来访问由...1)JNI 支持3中不透明的引用:局部引用、全局引用和弱全局引用。 2)局部全局
  • 今天,因为工作需要,遇到一个可能很基础但是又比较模糊的知识点,局部静态变量和全局变量的释放顺序...这里同样我先给出结论:对于全局变量的处理都是在 main 函数之前就进行的,而局部静态变量不用说,我们都知...
  • 关于全局变量和局部变量,静态变量的关系如何?以及他们在内存在是存储于哪部分的?做个记录,以便往后查看。 1. 全局变量和静态变量 全局变量:又称外部变量,之相对的是局部变量,是从变量的作用域上来考量的...
  • 一、全局变量  全局变量也称为外部变量,是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,应该做全局变量说明。只有在函数内经过说明的全局变量...
  • 局部图像处理

    千次阅读 2017-11-23 20:29:54
    局部特征(1)——入门篇  局部特征 (local features),是近来研究的一大热点。大家都了解全局特征(global features),就是方差、颜色直方图等等。如果用户对整个图像的整体感兴趣,而不是前景本身感兴趣的话,...
  • 1.9. ABAP程序中的局部与全局变量 报表程序中选择屏幕事件块(AT SELECTION-SCREEN)逻辑数据库事件块、以及methods(类中的方法)、subroutines(FORM子过程)、function modules(Function函数)中声明的变量...
  • 局部路径规划器teb_local_planner详解3:跟随全局planner前言一、相关优化项二、topologies相关的参数 前言 在局部路径规划器teb_local_planner详解2:关于避障中,我们对teb的避障策略做了详细清晰的描述。 本章...
  • 在这一部分中,我们将介绍句法分析中的另外两种类型:局部句法分析、依存关系分析。 【一】局部句法分析 相比于完全句法分析要求对整个句子构建句法分析树,局部句法分析(浅层句法分析、语块分析)仅要求识别句子中...
  • JNI将实例、数组类型暴露为不透明的引用。native代码从不会直接检查一个不透明的引用指针的上下文,而是通过使用JNI函数来...1)JNI 支持3中不透明的引用:局部引用、全局引用和弱全局引用。 2)局部全局引用,有
  • 人间观察 好像什么都来得及,又好像什么都来不及。 ...但是对于c,c++中以及用c/c++编写的jni来说同样需要手动管理和处理内存,特别是引用类型的对象。malloc,realloc,free ,delete ,不像jav.
  • 双目立体视觉技术实质就是模拟人的双眼视觉处理系统来处理通过摄像机采集所 获取的图像,它利用两台或多台摄像机在一定约束条件下采集同一场景的图像,对采集 到的图像进行信息提取和整合,最终恢复图像中场景的三...
  • js---局部变量和全局变量(1)

    千次阅读 2010-10-08 17:34:00
    函数的作用和定义那一部分还有一些小问题,我去把他写完 写完了 我们来看一个问题: 下面是我们要讨论的问题的例子代码 <br /><script><br />var msg = "全局变量"; function square...
  • 1.页面置换算法的概念 ...局部:在内存中,给每个进程分配的页面总数是不会变化的。 全局:置换页面的选择范围是所有可换出的物理界面 4 2.最优、先进先出、最近最久未使用算法 最...
  • 将多个聚集向量拼接起来,就得到了聚集向量: 最后,同Transformer,我们可以定义结合函数为下述操作: 注意到,在全局图编码中,我们没有用到关系集合,所以说,我们忽略了知识之间的相关性,我们需要用局部图编码...
  • 并且,在低维投影时增加全局约束因子,使得投影矩阵既考虑了样本的局部稀疏关系,也考虑了全局分布特性,进一步消除异类伪近邻样本的低维映射影响。在AR库、Extended Yale B库、LFW库和PubFig库上进行实验仿真,大量...
  • 图像直方图均衡化和局部增强处理

    万次阅读 2018-04-07 20:10:52
    一、基本原理1.1直方图均衡化(一提高图像的对比度,...) 灰度级的直方图就是反映一幅图像中的灰度级出现这种灰度的概率之间的关系的图形。设变量代表图像中的像素灰度级。在图像中,像素的灰度级可作归一化处理...
  • 文章目录 神经网络知识大串联 1:第一代的神经元模型 3 2:从M-P模型到感知器模型 3 3:前馈神经网络 3 4:后向传播BP算法神经网络 4 ...自然语言处理知识大串联 1:one-hot 11 2:Word-embeding 词嵌入 11 3:Word2V...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 135,316
精华内容 54,126
关键字:

如何处理全局与局部的关系