精华内容
下载资源
问答
  • 因为clone必须最终调用object类的clone方法才能完成克隆,那么,对子类对象克隆时,由于子类的clone方法里一定存在super.clone(),那么就会调用父类的clone方法,最终返回的为什么不是父类的克隆对象?在这过程中,...

    clone在克隆存在继承关系的类时,super.clone();最终克隆的是哪个类的问题:

    当子类和父类都重写了clone()方法,因为clone必须最终调用object类的clone方法才能完成克隆,那么,对子类对象克隆时,由于子类的clone方法里一定存在super.clone(),那么就会调用父类的clone方法,最终返回的为什么不是父类的克隆对象?在这过程中,为什么没发生父类对象赋给子类引用时产生的编译错误?

    示例代码:

    class Father implements Cloneable{
        public Father clone() throws CloneNotSupportedException {
            System.out.println(super.clone().getClass()+"--Father类clone方法执行了");
            return (Father)super.clone();
        }
    }
    class Son extends Father implements Cloneable{
        int i=9;//是Test3类中独有的变量,用来测试clone是否成功
    
        public Son clone() throws CloneNotSupportedException {
            System.out.println(super.clone().getClass()+"--Son类clone方法执行了");
            return (Son)super.clone();
        }
    }
    class Test{
        public static void main(String[] args) throws CloneNotSupportedException {
            Son test=new Son().clone();
            System.out.println(test.i);
            //程序正常运行,最后输出i的值9
            //为什么?
            //我以为会发生:new Son().clone()→
            //触发return (Son)super.clone();,找到super代表的父类Father
            // 调用Father 的 clone()方法,经过强制类型转化,得到Father类型引用变量→
            //将收到的Father类型引用变量,强制类型转化:(Son),
            //由于Son是Father子类,Son中·存在Father中没有的变量i,所以这种转换会报错
            //为什么结果却能正确执行?
        }
    }
    

    运行结果:

    class com.cskaoyan.objectapi.clone.Son--Father类clone方法执行了
    class com.cskaoyan.objectapi.clone.Son--Son类clone方法执行了
    class com.cskaoyan.objectapi.clone.Son--Father类clone方法执行了
    9
    

    可见,子类clone方法调用super.clone()的确会执行父类clone方法,但父类中调用super.clone(),也就是调用
    object类中的clone方法时,产生的一定也是最开始调用super.clone()那个类的对象,也就是子类对象,事实上,
    无论存在多少层继承关系,在层层super.clone()的过程中,每一层返回的对象都是最开始调用clone方法的那个对象,

    原因在于,其实每个对象中都存储了一些额外信息,其中就包括,存储了对象所属的实际类型,所以Clone方法访问对象的这个信息就能知道对象的实际类型,从而按照对象的实际类型复制对象

    这种情况产生原因是,clone方法是native方法,底层是由c/c++实现的,所以不受java语法约束,可视为一种语法糖,
    这是一种开后门的语法,就像包装类可以使用运算符直接运算一样无耻又方便
    同理,另一个native方法:Thread类中的sleep()方法也能实现这种语法糖效果,即无论是哪个线程对象调用的它,
    其结果都是让执行这句代码所在的线程休眠(而非调用sleep方法的线程对象代表的那个线程)

    展开全文
  • 创建运行时类的对象

    2019-08-15 22:59:23
    通过反射创建对应的运行时类的对象:对应的是哪个运行时类,只能创建这个类的对象 newInstance(),调用此方法创建运行时类的对象 这个方法中实际上还是调用的是类的构造器 Object obj = clazz.newInstance();内部...

    不是通过new 构造器的方式,而是用反射的方式创建
    通过反射创建对应的运行时类的对象:对应的是哪个运行时类,只能创建这个类的对象
    newInstance(),调用此方法创建运行时类的对象
    这个方法中实际上还是调用的是类的构造器
    Object obj = clazz.newInstance();内部调用了Person类(运行时类)的空参构造器
    证明方法很简单,在Person的空参构造器中加一条输出语句
    执行之后如果控制台出现了输出语句,则说明调用了空参构造器
    如果没有空参构造器就会报这个异常InstantiationException
    IllegalAccessException表示非法访问,如果Person的空参构造器权限是私有的,就会报这个异常

    要想此方法正常的创建运行时类的对象:要求
    1.运行时类必须提供空参构造器
    2.空参构造器的访问权限要满足要求
    比如默认权限是在包内进行访问。通常设置为public
    这也是javabean中要要求提供空参的权限为public的构造器的原因,反射有可能用到,便于通过反射创建运行时类的对象
    还有一个原因是子类中的构造器如果没有显式的写super,相当于就是super()
    如果不提供父类的空参构造器,这里就会报错
    造对象都是用构造器去造的,也只有构造器才能够造对象,只是形式上有所区别

       @Test
        public void test() throws IllegalAccessException, InstantiationException {
    
            Class clazz=Person.class;
    
            Object obj = clazz.newInstance();//这个对象其实就是造的Person类的对象
            System.out.println(obj);//Person{name='null', age=0}
    
            //所以可以进行强制转换
            Person p=(Person)obj;
            //也可以用泛型,Class<Person> clazz=Person.class;//newInstance()返回值会自动识别为Person
            
    
        }
    

    当然也可以调用指定的某个构造器;但是这种方式用的很少,用的比较多的还是直接newInstance(),再去操作属性

    Constructor cons = clazz.getConstructor(String.class, int.class);//得到指定的构造器
    

    反射的动态性:在运行代码时可以根据某些条件改变自身结构,比如说想创哪个类的对象,在编译时是定不下来的
    如果是new构造器那对象就定下来了,所以必须通过反射的方式去写
    所以框架中用到反射也是利用了反射的动态性

    体会反射的动态性:

     //forName(String classPath);创建一个指定类的对象
        //classPath为指定类的全名
        
        public Object getInstance(String classPath) throws Exception {
            Class clazz = Class.forName(classPath);//得到Class实例
    
            return clazz.newInstance();//创建classPath所对应的类的实例
    
        }
    
        @Test
        public void test2(){
            int i = new Random().nextInt(3);//产生随机数,0,1,2中的任何一个
            String classPath ="";//不要写成 String classPath ;否则下面getInstance(classPath);报错,要进行初始化
    
            switch(i){
                case 0:
                    classPath="java.util.Date";
                    break;
                case 1:
                    //classPath="java.sql.Date";不能用这个,没有空参构造器
                    classPath="java.lang.Object";
    
                    break;
                case 2:
                    classPath="test.test01";//右键类名,点击copy reference,再ctrl+v
            }
    
            try {
                Object obj = getInstance(classPath);//编译完之后,并不能确定造哪个类的对象,是由运行后生成的随机数决定的
                System.out.println(obj);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
    展开全文
  • 原文:Integrated Recognition, Localization and Detection using ... 我们还介绍了一种新深度学习方法,通过学习 object boundaries 来实现定位。 然后,为了增加检测置信度,Bounding boxes被累积而不是抑.

    原文:Integrated Recognition, Localization and Detection using Convolutional Networks

    利用卷积网络进行集成识别、定位和检测

    摘要:

    1. 提出了一种利用卷积网络进行分类、定位和检测的集成框架。
    2. 我们展示了如何在ConvNet中有效地实现多尺度和滑动窗口方法。
    3. 我们还介绍了一种新的深度学习方法,通过学习 object boundaries 来实现定位。
    4. 然后,为了增加检测置信度,Bounding boxes 被累积而不是抑制。
    5. 我们表明,可以使用单个共享网络同时学习不同的任务。
    6. 成就:该集成框架是2013年图像网络大规模视觉识别挑战(ILSVRC2013)本地化任务的赢家,并在检测和分类任务中获得了非常有竞争力的结果。 在赛后工作中,我们为检测任务建立了一个新的 state of the art 。 最后,我们从我们的最佳模型Over Feat中发布了一个特征提取器。

    Introduction

     

    1-现状:从图像中识别主要物体,多年来一直是采用卷积网络(ConvNets)[17],无论对象是手写字符[16]、房屋编号[24]、无纹理玩具[18]、交通标志[3,26]、来自Caltech-101数据集[14]的对象,还是来自1000类Image Net数据集[15]的对象。 像Caltech-101这样的小型数据集上的ConvNet的准确性虽然不错,但并没有打破记录。 然而,更大的数据集的出现使ConvNet能够在数据集上显著提高技术的状态,例如1000类Image Net[5]。

    2-提出问题:对于许多这样的任务,ConvNet的主要优点是整个系统被训练到底,从原始像素到最终类别,从而减轻了手动设计合适的特征提取器的要求。 主要的缺点是他们对标记训练样本的渴望。

    3-解决问题:本文的主要目的是表明训练卷积网络同时对图像中的对象进行分类、定位和检测可以提高分类精度和所有任务的检测和定位精度。 本文提出了一种新的基于单一ConvNet的目标检测、识别和定位集成方法。 我们还介绍了一种新的方法,通过积累预测的 bounding boxes 来定位和检测。 我们建议,通过结合许多定位预测,可以在不训练背景样本的情况下进行检测,并且可以避免耗时和复杂的 bootstrapping training passes 。 不训练背景也让网络只关注 positive classes,以获得更高的准确性。

    在Image Net ILSVRC2012和2013数据集上进行了实验,并在ILSVRC2013定位和检测任务上取得了state of  the art 的成绩。

    虽然来自Image Net分类数据集的图像在很大程度上被选择为包含一个以大致为中心的对象来填充大部分图像,但感兴趣的对象有时在图像中的大小和位置上有很大的不同。

    4- 提出假设

    • 解决这个问题的第一个想法是在图像中的多个位置,以滑动窗口的方式,并在多个尺度上应用ConvNet。 然而,即使这样,许多查看窗口可能包含对象的完全可识别的部分(例如狗的头),但不包含整个对象,甚至也不包含对象的中心。 这导致了较好的分类,但定位和检测不佳。
    • 因此,第二个想法是训练系统不仅为每个窗口产生一个在类别上的分布,而且还产生一个包含对象相对于窗口的包围框的位置和大小的预测。
    • 第三个想法是在每个位置和大小为每个类别积累证据。

    5-前人操作:

    许多作者建议使用ConvNet来检测和定位,在多个尺度上使用滑动窗口,可以追溯到20世纪90年代初的多字符串[20]、面部[30]和手[22]。 最近,ConvNet已经被证明在natural images中的文本检测 [4]、face detection [8,23]和 pedestrian detection [25]方面具有最先进的性能。

    一些作者还提出训练ConvNet来直接预测要定位的对象的实例化参数。 例如Osadchy等人 [23]描述一个用于同时进行人脸检测和姿态估计的ConvNet。

    其他作者已经提出通过基于ConvNet的分割来执行对象定位。 最简单的方法包括训练ConvNet将其查看窗口的中心像素(或体积图像的体素)分类是否为区域之间的边界[13]。但当区域必须分类时,最好执行语义分割。 其主要思想是训练ConvNet将查看窗口的中心像素与其所属对象的类别进行分类,使用该窗口作为决策的上下文。应用范围从生物图像分析[21],到移动机器人的障碍标记[10]到照片[7]的标记。 这种方法的优点是边界轮廓不需要矩形,并且区域不需要很好的边界对象。 缺点是需要密集的像素级标签进行训练。这种分割预处理或对象建议步骤最近在传统计算机视觉中得到了广泛的应用,以减少检测[19,2,6,29]的位置、尺度和纵横比的搜索空间。因此,一种昂贵的分类方法可以应用于搜索空间中的最优位置,从而提高识别精度。 此外,[29,1]建议这些方法通过大幅减少不可能的对象区域来提高准确性,从而减少潜在的假阳性。 然而,我们的密集滑动窗口方法能够在ILSVRC13检测数据集上优于 object proposal  方法。

    Krizhevsky等人。 [15]最近展示了令人印象深刻的分类性能使用一个大的ConvNet。 作者还进入了Image Net2012比赛,赢得了分类和本地化的挑战。 虽然他们展示了令人印象深刻的 Localization 性能,但还没有发表任何描述他们的方法的工作。 因此,我们的论文是第一个提供一个明确的解释,如何使用ConvNet来定位和检测图像网络数据

    6-我们的操作:

    在本文中,我们使用的术语定位和检测的方式与它们在Image Net2013竞赛中的使用是一致的,即唯一的区别是所使用的评估准则,两者都涉及到预测图像中每个对象的 bounding box 

    图1:Localization(顶部)和检测任务(底部)。 左边的图像包含我们的预测(通过降低置信度来排序),而右边的图像显示 groundtruth labels 。 检测图像(底部)说明了检测数据集的较高难度,它可以包含许多小对象,而分类和定位图像通常包含单个大对象。

     

    Vision Tasks

    本文探讨了三种计算机视觉任务的难度递增顺序:(一)分类,(二)定位,(三)检测。 每个任务都是下一个任务的子任务。 虽然所有任务都是使用单个框架和共享特征学习基础来处理的,但我们将在下面的章节中分别描述它们。

    在整个论文中,我们报告了2013年图像网络大规模视觉识别挑战(ILSVRC2013)的结果)。 在本次挑战的分类任务中,每个图像都被分配一个与图像中的主要对象对应的标签。 允许五个猜测找到正确的答案(这是因为图像也可以包含多个未标记的对象)。 定位任务类似,每个图像允许5个猜测,但此外,必须在每个猜测中返回预测对象的边界框。要被认为是正确的,预测的框必须至少与 groundtruth 相匹配50%(使用 the PASCAL criterion of union over intersection),并被标记为正确的类(即。 每个预测都是一个标签和bounding box,它们关联在一起)。检测任务不同于定位,因为每个图像中可以有任意数量的对象(包括零),假阳性被mAP评价。 定位任务是介于分类和检测之间的一个方便的中间步骤,允许我们独立于检测特有的挑战(例如学习背景类)来评估我们的定位方法)。 在图中。 我们展示了图像的例子,我们的定位/检测预测以及相应的 groundtruth 。 请注意,分类和定位共享相同的数据集,而检测也有额外的数据,其中对象可以更小。 检测数据还包含一组图像,其中某些对象不存在。 这可以用于 bootstrapping,但我们在这项工作中没有使用它。

     

    Classifification

    我们的分类体系结构类似于Krizhevsky等人的最佳ILSVRC12体系结构。 [15]。 然而,我们改进了网络设计和推理步骤。 由于时间限制,Krizhevsky模型中的一些训练特征没有被探索,因此我们期望我们的结果可以进一步改进。 这些问题将在今后的工作第6节中讨论

    图2: Layer 1 (top) and layer 2 fifilters (bottom).

     

    3.1 - Model Design and Training
    • 数据集:我们在Image Net2012训练集(120万个图像和C=1000个类)[5]上对网络进行培训。
    • 输入尺寸:我们的模型使用了Krizhevsky等人提出的相同的固定输入大小方法。 [15]在培训期间,但转向多尺度分类,如下一节所述。 每个图像下采样,使最小维数为256像素。 然后,我们提取5个大小为221x221像素的随机作物(及其水平翻转),
    • 批次大小:并将它们以大小为128的小批次呈现给网络。
    • 初始化:网络中的权重用(µ,σ)=(0,0.02)随机初始化。
    • 优化器:然后通过随机梯度下降来更新它们,伴随着动量项0.6和L2重量衰减10^{-5}。 学习率最初为5×10^{-2},在(30、50、60、70、80)元后依次下降0.5倍。
    • Dropout:在分类器中的完全连接层(第6和第7层)上使用速率为0.5的Dropout[11]。

    网络结构:我们在表1和表3中详细说明了体系结构的大小。 请注意,在训练期间,我们将这种体系结构视为非空间(大小为1x1的输出映射),而不是产生空间输出的推理步骤。 第1-5层类似于Krizhevsky等人。 [15],使用 relu 非线性和最大池,但有以下不同之处:(一)不使用对比归一化;(二)池区域是不重叠的;(三)由于步长较小(2而不是4),我们的模型具有更大的第一层和第二层特征映射。 更大的步幅加快训练速度,但会损害准确性。

    表1:快速模型的体系结构细节。 特征映射的空间大小取决于输入图像大小,在我们的推理步骤中变化(见附录中的表5)。 在这里,我们展示了训练的空间大小。 第5层是最上面的卷积层。 随后的层完全连接,并在测试时以滑动窗口的方式应用。 在空间设置中,完全连接的层也可以看作是1x1卷积。 精确模型的类似尺寸可在附录中找到。

    3.2 Feature Extractor

    在此基础上,我们发布了一个名为“ OverFeat ”1的特征提取器,以为计算机视觉研究提供强大的特征。 提供了两种型号,一种是快速准确的。 表1和表3描述了每个体系结构。 我们还从参数和连接方面比较了表4中它们的大小。 精确模型比快速模型更精确(14.18%的分类误差,而表2中的分类误差为16.39%),但它需要近两倍的连接。

    3.3 Multi-Scale Classifification
    • 在[15]中:multi-view voting 用于提高性能:一组固定的10个视图(4个角和中心,水平翻转)取平均。 然而,这种方法可以忽略图像的许多区域,并且在计算上是冗余的,当视图重叠时。 此外,它只在一个单一的尺度上应用,这可能不是ConvNet以最佳置信度响应的尺度。
    • 我们:通过在每个位置和多个尺度上密集地运行网络来探索整个图像。 虽然滑动窗口方法在计算上对某些类型的模型来说可能是禁止的,但在ConvNet的情况下,它本质上是有效的(见第3.5节)
    然而,上述网络中的总子采样比为2x3x2x3,即36。 因此,当密集应用时,该体系结构只能沿每个轴在输入维数中每36个像素产生一个分类向量。 与10视图方案相比,输出的这种粗分布降低了性能,因为网络窗口与图像中的对象不太一致。 网络窗口与对象对齐越好,网络响应的置信度越强。 为了避免这个问题,我们采取了类似于Giusti等人提出的方法。 [9],并在每个偏移量上应用最后的次采样操作。 这消除了该层的分辨率损失,产生了x12而不是x36的总次采样比。我们现在详细解释如何执行分辨率增强。 我们使用6个尺度的输入,这导致未冷却的第5层不同分辨率的地图(详见表5)。 然后使用以下过程将这些集合并呈现给分类器,如图所示。 3:
    • 对于单个图像,在给定的尺度上,我们从未 pool 的第5层特征映射开始。
    • 每个未 pool 的映射都经历了3x3最大池操作(非重叠区域),对{0,1,2}的(∆x,∆y)像素偏移量重复3x3次。
    • 这会产生一组 pooled feature maps, ,为不同的(∆x,∆y)组合复制(3x3)次。
    • 分类器(第6、7、8层)的固定输入大小为5x5,并为 pooled maps 中的每个位置生成一个C维输出向量。 分类器以滑动窗口的方式应用于 pooled maps,产生C维输出映射(对于给定的(∆x,∆y)组合)。
    • 将不同(∆x,∆y)组合的 output maps 重塑为单个3D output maps (两个空间维度xC类)
    图3:用于分类的输出映射计算的1D插图(缩放),以尺度2中的y维为例(见表5)。 (a)20个像素未冷却的第5层特征地图。 (b):最大池超过不重叠的3个像素组,使用∆={0、1、2}像素(分别为红色、绿色、蓝色)的偏移量)。 (c)所产生的不同∆的6个像素集合地图。 (d):5个像素分类器(第6、7层)以滑动窗口的方式应用于集合映射,为每个∆生成2个像素的C映射。 (e):通过C输出映射重新塑造成6个像素。

    这些操作可以看作是通过池层将分类器的查看窗口移动1像素,而不进行次采样,并在下面的层中使用跳过内核(其中邻域中的值是不相邻的)。 或等效地,作为应用最终的池层和完全连接的堆栈在每一个可能的偏移,并通过交织输出组装结果。
    在一个直观的层次上,网络的两半-即 特征提取层(1-5)和分类器层(6-输出)以相反的方式使用。 在特征提取部分中,滤波器在整个图像上卷积。 从计算的角度来看,这比将固定大小的特征提取器滑动到图像上,然后聚合来自不同位置的结果要有效得多。 然而,对于网络的分类器部分,这些原则是相反的。 在这里,我们希望在第5层特征映射中寻找不同位置和尺度的固定大小表示。 因此,分类器具有固定大小的5x5输入,并被详尽地应用于第5层映射。 穷举池方案(具有单像素移位(∆x,∆y))确保了我们可以在分类器和feature map 中对象的表示之间获得精细的对齐。
     
    3.4 Results
     
    在表2中,我们用不同的方法进行了实验,并将它们与Krizhevsky等人的单一网络模型进行了比较。 [15]供参考。 上述方法具有6个尺度,实现了13.6%的top-5。 正如可能预期的那样,使用较少的尺度会损害性能:单尺度模型更差,16.97%的前5名错误。 精细步幅技术如图所示。 3对单一规模制度的改善相对较小,但对这里所示的多规模收益也很重要。
    表2:验证集的分类实验。 细/粗步是指应用分类器时使用的∆值的数目。 细:∆=0,1,2;粗:∆=0。
     

    图4:测试集分类结果。 在比赛期间,超过Feat产生14.2%的前5名错误率使用平均7个快速模型。 在比赛后的工作中,超过飞排名第五,13.6%的错误使用更大的模型(更多的特征和更多的层)。

    我们在图中报告了2013年比赛的测试集结果。 其中,我们的模型(超过英尺)获得14.2%的准确性通过投票7个Conv网(每个训练不同的初始化),并排名第5的18个团队。 仅使用ILSVRC13数据的最佳精度为11.7%。 预训练从图像网Fall11数据集的额外数据提高到11.2%。 在赛后的工作中,我们通过使用更大的模型(更多的特征和更多的层),将Over Feat结果提高到13.6%的误差)。 由于时间限制,这些较大的模型没有得到充分的训练,预计会及时出现更多的改进。

    3.5 ConvNets and Sliding Window Effificiency

    与许多滑动窗口方法相比,ConvNet在一次为输入窗口的每个窗口计算整个管道,在以滑动的方式应用时本质上是有效的,因为它们自然地共享重叠区域共同的计算。 当在测试时将我们的网络应用于更大的图像时,我们只需在完整图像的范围内应用每个卷积。 这扩展了每个层的输出,以覆盖新的图像大小,最终生成输出类预测映射,每个输入的“window”都有一个空间位置。

    图5:用于检测的Conv网的效率。 在训练期间,ConvNet只产生单个空间输出(顶部)。 但是,当在测试时间应用于更大的图像时,它会产生一个空间输出映射,例如。 2x2(底部)。 由于所有层都是卷积应用的,较大图像所需的额外计算仅限于黄色区域。 为了简单起见,此图省略了特征维度

    卷积是自下而上应用的,因此相邻窗口所共有的计算只需要做一次。

    请注意,我们体系结构的最后一层是完全连接的线性层。 在测试时,这些层被具有1x1空间范围的核的卷积运算有效地取代。 然后,整个ConvNet只是一个卷积、max-pooling 和阈值操作的序列。

    Localization

    从我们的 classifification-trained network 开始,我们用回归网络代替分类器层,并训练它在每个空间位置和尺度上预测 object bounding boxes 。 然后,我们将回归预测结合在一起,以及每个位置的分类结果,就像我们现在描述的那样。

    4.1 Generating Predictions 

    我们同时在所有位置和尺度上运行分类器和回归网络。 由于这些层具有相同的特征提取层,因此在计算分类网络后只需要重新计算最终的回归层。 类c在每个位置的最终Softmax层的输出提供了一个置信度,因此,我们可以为每个 bounding box 分配一个置信度。

    4.2 Regressor Training

    回归网络将第5层的 pooled feature maps 作为输入。 它有2个完全连接的隐藏层大小分别为4096和1024通道。 最终输出层有4个单元,它们指定 bounding box 的坐标。 与分类一样,整个都有(3x3)副本,这是由∆x,∆y位移引起的。 体系结构如图 8.所示。

    图6:Localization/Detection管道。 原始分类器/检测器输出每个位置的类和一致性(第一个图)。 使用3.3节(第二图)中描述的方法可以提高这些预测的分辨率)。 然后,回归预测对象相对于每个窗口的位置尺度(第三张图)。 然后将这些 bounding box 合并并累积到少量对象(第4个图)。

     

    图7:回归网络产生的bounding box 的例子,然后被组合成最终的预测。 这里显示的例子是一个单一的规模。 预测在其他尺度上可能更优,这取决于对象。 在这里,大多数边界框最初被组织为一个网格,收敛到一个单一的位置和规模。 这表明网络对对象的位置非常有信心,而不是随机传播。 左上图显示,如果存在多个对象,它也可以正确地识别多个位置。 预测包围盒的各种纵横比表明,网络能够应付各种物体的姿态。

    我们从分类网络中修复特征提取层(1-5),并使用预测和 true bounding box 之间的 L2 损失对回归网络进行训练。 最后的回归层是特定于类的,有1000个不同的版本,每个类一个。 我们使用第3节中描述的同一组尺度来训练这个网络。 我们比较了回归网在每个空间位置的预测与 ground-truth bounding box ,转移到参考框架的回归器的转置偏移在卷积(见图。 8)。 然而,我们不会在边界框上训练回归器,与输入视场的重叠率小于50%:由于对象大多在这些位置之外,所以通过包含对象的回归窗口将更好地处理它。

    以多尺度的方式训练回归者对于跨尺度预测组合非常重要。 单一规模的培训将在该规模上表现良好,在其他规模上仍然表现合理。 然而,训练多尺度将使预测在不同尺度上正确匹配,并成倍地增加合并预测的置信度。 反过来,这使我们能够很好地执行只有几个尺度,而不是许多尺度,这是通常的情况下,检测。 在行人检测[25]中,从一个尺度到另一个尺度的典型比率约为1.05至1.1,然而,在这里,我们使用了大约1.4的大比例(这个数字对于每个尺度不同,因为尺寸被调整以完全适应我们网络的步长),这使得我们能够更快地运行我们的系统。

    4.3 Combining Predictions

    我们结合了个人的预测(见图。 7)通过一个贪婪的合并策略应用于回归边界框,使用以下算法。

    • (a)给Cs分配每个尺度s的顶部k中的类集∈1~6,通过在该尺度的空间位置上获取最大检测类输出来找到。
    • (b)分配给Bs由回归网络为Cs中的每个类预测的 bounding boxes ,在尺度s的所有空间位置上。

    图8:例如,在尺度2下,回归网络对第5层特征的应用。

    (a)在这个尺度上,对回归器的输入在空间上为6x7像素,每个(3x3)∆x,∆y位移256个通道。

    (b)回归网第一层中的每个单元连接到第5层地图中的5x5空间邻域以及所有256个通道。 改变5x5邻域的结果是一个2x3空间范围的地图,对于层中的每个4096个通道,对于每个(3x3)∆x,∆y移动。

    (c)第二回归层有1024个单元,并完全相连(即。 紫色元素只连接到(B)中的紫色元素,跨越所有4096个通道)。

    (d)回归网络的输出是2x3地图中每个位置的4向量(指定边界框的边缘),以及每个(3x3)∆x,∆y移位。

     

    在上面,我们使用两个bounding boxes 中心之间的距离和 bounding boxes 的交点面积来计算匹配分数。 框合并计算边界框坐标的平均值。

    最后的预测是通过取最大类分数的合并边界框来给出的。 这是通过累积添加与预测每个边界框的输入窗口相关联的检测类输出来计算的。 见图。 例如,边界框合并为一个高置信度边界框。 在这个例子中,一些海龟和鲸鱼包围盒出现在中间的多尺度步骤中,但在最终的检测图像中消失。不仅这些包围盒具有较低的分类置信度(最多分别为0.11和0.12),它们的集合不像熊 bounding boxes 那样连贯,显著的置信度提升。 熊 bounding boxes 有很强的信心(平均每尺度约0.5)和高匹配分数。 因此,在合并后,许多熊bounding boxes 被融合成一个非常高的置信度box,而假阳性由于缺乏bounding boxes 的一致性和置信度而消失在检测阈值以下。 这一分析表明,我们的方法自然更稳健的假阳性来自纯分类模型比传统的非最大抑制。

    图9:ILSVRC12验证集上的本地化实验。 我们用不同数量的尺度进行实验,并使用单类回归(SCR)或每类回归(PCR)。

    4.4 Experiments

    我们使用为竞争指定的 localization 标准将我们的网络应用于Imagenet2012验证集。 这方面的结果如图9。 10显示了2012年和2013年 localization 竞赛的结果(这两年的train和测试数据相同)。 我们的方法是2013年比赛的赢家,误差为29.9。

    我们的多尺度和多视图方法对于获得良好的性能至关重要,如图所示9,只使用单个中心作物,我们的回归网络实现了40%的错误率。 通过在两个尺度上结合来自所有空间位置的回归预测,我们获得了更好的误差率为31.5%。 添加第三和第四个标度进一步将性能提高到30.0%的误差。

    在图中,为每个类(Per-Class Regressor(PCR))在回归网络中的每个类使用不同的顶层。 令人惊讶的是,只使用所有类之间共享的一个网络,9)的性能并没有超过(44.1%对31.3%)。 这可能是因为在训练集中,每类注释的带有边界框的示例相对较少,而网络具有1000倍以上的顶层参数,导致训练不足。 这种方法可能会通过仅在类似类之间共享参数来改进(例如。 为所有类别的狗培训一个网络,另一个用于车辆等。 )

    Detection

    检测训练类似于分类训练,但以空间方式进行。 图像的多个位置可以同时训练。 由于模型是卷积的,所以所有权重在所有位置之间共享。 与定位任务的主要区别在于,当没有对象存在时,预测背景类的必要性。 传统上,消极的例子最初是随机的训练。 然后,在引导传递中,将负面错误添加到训练集中。 独立的引导传递使训练变得复杂,并使负例收集和训练时间之间的风险潜在不匹配。此外,需要调整引导传递的大小,以确保训练不会在小集合上过度拟合。 为了避免所有这些问题,我们在飞机上进行负面训练,通过选择一些有趣的负面例子,每个图像,如随机的或大多数冒犯的。 这种方法在计算上更昂贵,但使过程更简单。 由于特征提取最初是用分类任务训练的,所以检测微调并不是那么长。

    在图中。 11.我们报告了ILSVRC2013年比赛的结果,我们的检测系统以19.4%的平均MAP)排名第三)。 我们后来建立了一个新的检测状态的艺术与24.3%的mAP注意,前3名的方法和其他团队之间有很大的差距

    图10:ILSVRC12和ILSVRC13比赛成绩(测试集)。 我们的参赛作品是ILSVRC13本地化比赛的获胜者,误差为29.9%(前5名)。 请注意,两年的培训和测试数据是相同的。 超飞条目使用4个尺度和一个单类回归方法。方法产生11.5%的mAP)。 此外,我们的方法与前两个其他系统有很大的不同,它们使用初始分割步骤将候选窗口从大约200,000个减少到2,000个。 这种技术加快了推理,大大减少了潜在假阳性的数量。 [29,1]表明,当使用密集滑动窗口时,检测精度会下降,而不是选择性搜索,这会丢弃不太可能的对象。 还应指出这一点位置,从而减少假阳性。 结合我们的方法,我们可以观察到传统的密集方法和基于分割的方法之间的类似改进。我们没有像NEC和UVA那样对检测验证集进行微调。 验证和测试集分布与训练集有很大的不同,仅这一点就能提高大约1点的结果。 两者之间的改进OverFeat结果在图中。 11是由于培训时间较长和使用背景。 每个尺度也使用较低的分辨率尺度作为输入。

     图11:ILSVRC13测试集检测结果。 在比赛中,UvA以22.6%的mAP排名第一。 在岗位竞赛工作中,我们以24.3%的AP state of the art。 用ILSVRC12分类数据预先训练标记为*的系统。

    Discussion

    提出了一种可用于分类、定位和检测的多尺度滑动窗口方法。 我们将其应用于ILSVRC2013数据集,目前在分类方面排名第四,在定位方面排名第一,在检测方面排名第一。 我们论文的第二个重要贡献是解释了ConvNet如何有效地用于检测和定位任务。 [15]从未讨论过这些问题,因此,我们是第一个解释如何在Image Net2012中这样做的人。 我们提出的方案涉及对设计用于分类的网络进行实质性修改,但清楚地证明ConvNet能够完成这些更具挑战性的任务。 我们的本地化方法赢得了2013年ILSVRC竞争,并显著优于所有2012年和2013年的方法。 该检测模型在比赛中名列前茅,在赛后结果中名列第一。 我们提出了一个集成流水线,它可以执行不同的任务,同时共享一个共同的特征提取库,完全从像素中直接学习。我们的方法可能仍在几个方面得到改进。 (i)就本地化而言,我们目前没有通过整个网络进行备份;这样做可能会提高业绩。 (二)我们使用的是ℓ2损失,而不是直接优化衡量业绩的交重合准则。 如果有一些重叠,那么交换损失应该是可能的,因为欠条仍然是可微的。 (三)边界框的交替参数化可能有助于对产出进行去关联,这将有助于网络培训。

     

     

     
     
    展开全文
  • ,物以类聚人以群分,物以类聚,则是整齐划一相同,放到一块。 犹如某网厂网子,白色...面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来抽象思维过程和面向...

     类,物以类聚人以群分,物以类聚,则是整齐划一的相同类,放到一块。 犹如某网厂的网子,白色的肯定白色的放到一块,黑色的与黑色的类放到一块。此理相同,相通。 

       面向过程,和面向对象,哪个重要?我认为,面向过程,怎么做比谁来做更重要。 怎么做,才是考验人的功力的。 谁来做?安排个人去做就是了,但是怎么做的又快又好,麻利干净利落,那就需要技巧的了。不是盲干可以实现。 

    面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。

    面向对象程序设计(Object Oriented Programming,OOP)是一种计算机编程架构。OOP的一条基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。OOP=对象+类+继承+多态+消息,其中核心概念是类和对象。

    面向对象程序设计方法是尽可能模拟人类的思维方式,使得软件的开发方法与过程尽可能接近人类认识世界、解决现实问题的方法和过程,也即使得描述问题的问题空间与问题的解决方案空间在结构上尽可能一致,把客观世界中的实体抽象为问题域中的对象。(类似易经中,象的细化使用, 犹如交通信号的细化。 )

    面向对象程序设计以对象为核心,该方法认为程序由一系列对象组成。类是对现实世界的抽象,包括表示静态属性的数据和对数据的操作,对象是类的实例化。对象间通过消息传递相互通信,来模拟现实世界中不同实体间的联系。在面向对象的程序设计中,对象是组成程序的基本模块。

    展开全文
  • Object类: public int hashCode() (了解): 返回该对象哈希码值,不是实际地址值,但是和地址值相关(可以理解为地址值),通过底层哈希表得出来(哈希算法); public final Class getClass() : 返回当前对象运行...
  • 如果一个类继承自Object类,我们可以将extends Object给省略掉,如果在一个类的定义中没有明确的指出哪个是它的父类,那么Object类就认为是这个类的父类。 = 问题二:Object类中有一个registerNatives方法,对此你...
  • 如果一个类继承自Object类,我们可以将extends Object给省略掉,如果在一个类的定义中没有明确的指出哪个是它的父类,那么Object类就认为是这个类的父类。 问题二:Object类中有一个registerNatives方法,对此你...
  • 1.父类或者接口类型的引用指向子类或者实现该接口的类的对象。 2.多态是运行时行为,不是编译时行为。比如可以通过一个随机数来的值来判断返回的子类或者接口实现类对象是哪个。再调用该对象的方法。 3.java中通过...
  • Object类 调用方式 Thread.sleep()方式 对象.wait()方式 理解 在哪个位置调用,哪个线程等待 对象.wait(),不是调用对象等待,是访问当前对象线程等待 唤醒方式 不需要其他线程唤醒 需要其他线程调用...
  • “==”与equals和equal

    2020-07-27 11:47:14
    equals是Object类的一个方法,用来比较两个对象的内容是否相等。 equal是继承Object类后对equals重写的一种方法。 “==”是用来比较两个对象的内存地址。 其实equal与equals这两者的功能应该是差不多的,这主要看...
  • 10.1.9 万类之祖——Object类 250 10.2 子类对象?父类对象? 251 10.2.1 父随子行 251 10.2.2 当构造方法遇到继承 254 10.2.3 记得给类一个无参数构造方法 255 10.2.4 调用父类中构造方法 256 10.2.5 ...
  • Java反射小总结

    2021-05-27 09:34:12
    每个类的实例都会记得自己是由哪个Class实例所生成 通过Class可以完整地得到一个类的完整结构 Class对象是放在堆内存中的 类的字节码二进制数据,是放在方法区的,有的地方也称为类的元数据 Class类常用方法 String...
  • wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...
  • 10.1.9 万类之祖——Object类 250 10.2 子类对象?父类对象? 251 10.2.1 父随子行 251 10.2.2 当构造方法遇到继承 254 10.2.3 记得给类一个无参数构造方法 255 10.2.4 调用父类中构造方法 256 10.2.5 ...
  • 10.1.9 万类之祖——Object类 250 10.2 子类对象?父类对象? 251 10.2.1 父随子行 251 10.2.2 当构造方法遇到继承 254 10.2.3 记得给类一个无参数构造方法 255 10.2.4 调用父类中构造方法 256 10.2.5 ...
  • 笔试题

    2017-09-16 15:39:59
    一般情况下,以下哪个选项不是关系数据模型与对象模型之间匹配关系? 表之间参考关系对应类之间依赖关系 ...下面不属于Object类方法的是: finally() 下面哪段程序能够正确实现了GBK编码字
  • 至于shouldConvert和后续的几个判断则是为了防止value不是单纯的对象而是Regexp或者函数之类的,或者是vm实例再或者是不可扩展的,shouldConvert则是某些特殊情况下为false,它的解释参见源码里尤...
  • [Java笔试]5.12

    2020-05-13 05:38:27
    1.哪个选项不是Java特点? ...- A sleep是线程类(Thread)的方法,wait是Object类的方法; - B sleep不释放对象锁,wait放弃对象锁 - C sleep暂停线程、但监控状态仍然保持,结束后会自动恢复...
  • String.valueOf(a)和(String)a有什么区别

    千次阅读 2013-05-18 16:15:30
    Object类里 就定义了一个toString()方法 每个类都有其字符串表示形式 第一种,它是将当前a类转化成字符串,无论你是什么,有可能转化成结果不是一个正常字符串,是本质上转换 第二种,是引用类型转换,...
  • 我们玩的游戏一般都是应用程序(但现在后缀名为.swf的Flash影片类的游戏也比较流行)  常见的编程语言  * .NET  * ActionScript  * APL、A+和J  * Ada  * 汇编语言  * AWK  * Basic  o QBasic  o Visual ...
  • ASP.NET网页代码模型及生命周期

    热门讨论 2009-07-28 14:22:11
    Cookie在客户端用户保存网站的少量的用户信息,服务器可以通过编程的方法获取用户信息,Cookie信息和页面请求通常一起发送到服务器,服务器对客户端传递过来的Cookie信息做处理。通常Cookie保存用户的登录状态、...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52.一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历...
  • 首先看一个成品截图预览: 一、接下来我们先说思路,首先定义一个upload”类”, 一)、这个类的公共访问信息应该有: 1、构造函数中要传递一些必要的参数,比如,在哪个容器构造upload的信息。 2、必须有一个add()...
  • 可能还会有人问,即使你使用这种方式,那么在判断具体创建哪个工厂时候,不是也要用到 switch 语 句吗?我承认这种看法是对。不过使用工厂模式,其直接好处并非是要解决switch 语句难题,而是 要延迟对象...
  • A) 在一个类的声明里声明的类,也叫做内部类或嵌套类,内部类可以作为外包类的一个成员使用,可以访问外包类的所有成员,包括私有成员。 B) 内部类的访问权限可以被定义为public、protected、private和default。但是...

空空如也

空空如也

1 2 3 4
收藏数 71
精华内容 28
关键字:

哪个不是object类的方法