在JAVA里 啥是回调函数啊.?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在JAVA里 啥是回调函数啊.?相关的知识,希望对你有一定的参考价值。
最好打个比方..来个比喻..
然后在举个JAVA中回调方法的列子..
这个列子最好是 SAX解析xml 文档的列子..
谢谢前辈们拉。..!
SAX的我不会写,只会用DOM4J写解析xml文档的例子
如下:
SAXReader sax = new SAXReader();
String file = this.getServletContext().getRealPath("/xml/news.xml");//获得xml文档的路径
Document doc = sax.read(file);
//获得根元素坐标
Element root = doc.getRootElement();
String value = "";
List nodes = root.selectNodes("//new");
//得到元素个数
int size = nodes.size();
//定位到最后一个元素
Element el = (Element) nodes.get(size - 1);
//得到该元素所有属性集合
Iterator it = el.attributeIterator();
//循环遍历
while (it.hasNext())
//将集合中包含的元素转换为Attribute类型
Attribute att = (Attribute) it.next();
//取出里面的数值
value = att.getValue();
这样 所有的值就能都取出来了
不过 要导入这几个包包
org.dom4j.*
org.dom4j.io.*
java.util.*
java.io.* 参考技术A C语言中回调函数解释:
回调函数(Callback Function)是怎样一种函数呢?
函数是用来被调用的,我们调用函数的方法有两种:
l 直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。这里,A称为“主叫函数”(Caller),B称为“被叫函数”(Callee)。
l 间接调用:在函数A的函数体里并不出现函数B的函数名,而是使用指向函数B的函数指针p来使内存中属于函数B的代码片断得以执行——听起来很酷,是吧。
比起直接调用来,间接调用的确麻烦,那为什么还要使用间接调用呢?原因很简单——直接调用把函数名都写进函数体了,经过编译器那么一编译,板上钉钉,A注定调用的是B了,这样的程序只能按照程序员事先设计好的流程执行下去,太呆板了。此时,间接调用的巨大灵活性就显现出来了。想一想,如果p是函数A的一个参数(参数是变量,是变量就可以变吗!),那么程序的最终用户完全可以通过操作来改变p的指向——这样,A在通过p调用函数的时候就有机会调用到不同的函数,这样程序的实用性和扩展性就强多了。
在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就称为回调。在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃。这样的解释似乎还是比较难懂,这里举个简单的例子,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。
正常情况下开发人员使用已经定义好的API,这个过程叫Call。但是有时这样不能满足需求,就需要程序员注册自己的程序,然后让事先定义好多API在合适的时候调用注册的方法,这叫CallBack。
“通常大家说的回调函数一般就是按照别人(李四)的定好的接口规范写,等待别人(张三)调用的函数,在C语言中,回调函数通常通过函数指针来传递;在Java中,通常就是编写另外一个类或类库的人(李四)规定一个接口,然后你(张三)来实现这个接口,然后把这个实现类的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。” 参考技术B 建议用ajax吧,ajax机制靠的就是回调.
论文里啥是目标值?
参考技术A 论文里的目标值就是你要围绕什么目标写论文啊,要达到什么水平 参考技术B 目标检测论文整理
最近开始看一些object detection的文章,顺便整理一下思路。排版比较乱,而且几乎所有图片都是应用的博客或论文,如有侵权请联系我。
文章阅读路线参考
目前已完成的文章如下,后续还会继续补充(其中加粗的为精读文章):
RCNN
Overfeat
MR-CNN
SPPNet
Fast RCNN
A Fast RCNN
Faster RCNN
FPN
R-FCN
Mask RCNN
YOLO
YOLO 9000
YOLO v3
SSD
DSSD
R-SSD
RetinaNet(focal loss)
DSOD
Cascade R-CNN
(待续)
吐槽一下,博客园的markdown竟然没有补齐功能,我还是先在本地补全再传上来吧。。。
RCNN之前的故事
Histogram of Gradient (HOG) 特征
在深度学习应用之前,图像的特征是人工定义的具有鲁棒性的特征,如SIFT,HOG等,下面简要介绍一下HOG。
8x8像素框内计算方向梯度直方图:
HOG Pyramid
特征金字塔,对于不同大小的物体进行适应,设计尺度不变性特征
HOG特征 -> SVM分类
DPM模型 Deformable Part Model
加组件组合的HOG特征, 组件间计算弹性得分,优化可变形参数
如果没有弹性距离,就是BoW (Bag of Word)模型, 问题很大, 位置全部丢失:
n个组件的DPM计算流程:
Selective Search 思想
过分割后基于颜色纹理等相似度合并,
然后,过分割、分层合并、建议区域排序
基于Selective Search + DPM/HoG + SVM的物体识别
此时的框架就是RCNN的雏形,因为DPM就是基本由RBG和他导师主导,所以大神就是大神。
AlexNet的图像分类(深度学习登场)
2012年AlexNet赢得LSVRC的ImageNet分类竞赛。深度CNN结构用来图像特征提取。
bounding-box regression 框回归
BBR 在DPM时代就和SVM分类结合,一般直接使用线性回归,或者和SVR结合
RCNN: Rich feature hierarchies for accurate object detection and semantic segmentation
RCNN作为深度学习用于目标检测的开山之作,可以看出是基于Selective Search + DPM/HoG + SVM框架,只不过将是将手工特征转变为CNN提取特征,本文主要贡献如下:
CNN用于object detection
解决数据集不足的问题
主要流程如下:
regional preposals(selective research)
CNN feature extraction
SVM Classification
NMS
bounding-box regression(BBR)
为啥能work?
优秀的目标检测框架,region proposal 和 regression offset降低了目标检测的难度,
强大的CNN特征提取器,代替传统的已经到瓶颈的手工特征
迁移训练降低了对数据集的要求
MR-CNN:Object detection via a multi-region & semantic segmentation-aware CNN model
Multi-Region的提出, 开始对Box进一步做文章, 相当于对Box进一步做增强,希望改进增强后的效果,主要改善了部分重叠交叉的情况。
特征拼接后使得空间变大,再使用SVM处理, 效果和R-CNN基本类似.
OverFeat:Integrated Recognition, Localization and Detection using Convolutional Networks
不得不说虽然OverFeat在但是比赛成绩不是太好,但是它的思想还是很有启发性的。
OverFeat直接抛弃了Selective Search,采用CNN上slide windows来进行框推荐,并且把Bounding box Regression整合一起使用全连接层搞定, 解决了后面一端的问题(取代了SVM分类器和BBR线性回归器),这个思想影响了后来的Fast RCNN。是第一个End to End 的目标检测模型,模型虽然简陋,但是可以验证网络强大的拟合能力注意整合目标检测的各项功能(分类,回归)。
亮点:
先用CNN得到feature map再做slide windows推荐区域,避免了特征重复计算。
设计了End to End模型,方便优化和加快检测速度
设计全卷积网络,并进行多尺度图像训练
maxpool offset(没有Fast RCNN的ROI Pooling自然)
为啥能work?
可以看出OverFeat将不同的两个问题物体分类和位置回归采用了两个分支网络,共用前面的CNN特征表述,而CNN提取的特征正如OverFeat所言,是一种类似于SIFT,HOG等人工描述子的一种稳定的描述子(底层抽象),可以用于构建不同的任务(高层表述),也就是模型为什么能work的原因。
SPPNet
R-CNN和Overfeat都存在部分多尺度,重叠效果的问题。 某种意义上, 应对了HoG特征, 这样对于物体来说类似BoW模型, 我们知道DPM里面,是带有组件空间分布的弹性得分的, 另外也有HoG Pyramid的思想。 如何把Pyramid思想和空间限制得分加入改善多尺度和重叠的效果呢? MR-CNN里面尝试了区域增强, Overfeat里面尝试了多尺度输入。 但是效果都一般。 这里我们介绍另外一个技术Spatial Pyramid Matching, SPM,是采用了空间尺度金字塔的特点。和R-CNN相比做到了先特征后区域, 和Overfeat相比自带Multi-Scale。
SPP pooling layer 的优势:
解决了卷积层到全连接层需要固定图片大小的问题,方便多尺度训练。
能够对于任意大小的输入产生固定的输出,这样使得一幅图片的多个region proposal提取一次特征成为可能。
进一步强调了CNN特征计算前移, 区域处理后移的思想, 极大节省计算量
也能看出文章还是强调用CNN做特征的提取,还是用的BBR和SVM完成回归和分类的问题
Fast RCNN
可以看出Fast RCNN结合了OverFeat和Sppnet的实现,打通了高层表述和底层特征之间的联系
主要流程:
任意size图片输入CNN网络,经过若干卷积层与池化层,得到特征图;
在任意size图片上采用selective search算法提取约2k个建议框;
根据原图中建议框到特征图映射关系,在特征图中找到每个建议框对应的特征框【深度和特征图一致】,并在RoI池化层中将每个特征框池化到H×W【VGG-16网络是7×7】的size;
固定H×W【VGG-16网络是7×7】大小的特征框经过全连接层得到固定大小的特征向量;
将上一步所得特征向量经由各自的全连接层【由SVD分解实现(全连接层加速)】,分别得到两个输出向量:一个是softmax的分类得分,一个是Bounding-box窗口回归;
利用窗口得分分别对每一类物体进行非极大值抑制剔除重叠建议框
其中ROI POOL层是将每一个候选框映射到feature map上得到的特征框经池化到固定的大小,其次用了SVD近似求解实现全连接层加速。
这里需要注意的一点,作者在文中说道即使进行多尺度训练,map只有微小的提升,scale对Fast RCNN的影响并不是很大,反而在测试时需要构建图像金字塔使得检测效率降低。这也为下一步的多尺度改进埋下了伏笔。
为啥能更好的work?
也是结合了OverFeat的和SPPnet的work,同时规范了正负样本的判定(之前由于SVM和CNN对区域样本的阈值划分不同而无法统一网络,当然这只是其中的一个原因。更多的估计是作者当时没想到),将网络的特征抽取和分类回归统一到了一个网络中。
A Fast RCNN: Hard Positive Generation via Adversary for Object Detection
这篇论文是对,CMU与rbg的online hard example mining(OHEM)改进,hard example mining是一个针对目标检测的难例挖掘的过程,这是一个更充分利用数据集的过程。实际上在RCNN训练SVM时就已经用到,但是OHEM强调的是online,即如何在训练过程中选择样本。同期还有S-OHEM的改进。
而随着但是GAN的火热,A-Fast-RCNN尝试生成hard example(使用对抗网络生成有遮挡和有形变的两种特征,分别对应网络ASDN和ASTN)
结论如下:
ASTN 和 随机抖动(random jittering)做了对比,发现使用AlexNet,mAP分别是58.1%h和57.3%,使用VGG16,mAP分别是69.9%和68.6%,ASTN 的表现都比比随机抖动效果好。作者又和OHEM对比,在VOC 2007数据集上,本文方法略好(71.4% vs. 69.9%),而在VOC 2012数据集上,OHEM更好(69.0% vs. 69.8%)。gan用于目标检测还没有很好的idea,这篇论文相当于抛砖引玉了。
同时需要注意的一个问题,网络对于比较多的遮挡和形变情况识别情况更好;但是对于正常目标的特征抽象能力下降,所以有时候创造难例也要注意样本的数量。下面是一些由于遮挡原因造成的误判。
Faster RCNN:Towards Real-Time Object Detection with Region Proposal Networks
这篇文章标志着two-stage目标检测的相对成熟,其主要改进是对候选区域的改进,将候选区域推荐整合进了网络中。
结合后面的一系列文章,可以马后炮一下它的缺点:
虽然Faster RCNN已经共享了绝大部分卷积层运算,但是RoI之后还有部分ConvNet的计算,有没有可能把ROI之上的计算进一步前移? 请看R-FCN
Faster RCNN还是没有很好的解决多尺度问题,如何解决,请看FPN
YOLO:You Only Look Once
作者的论文简直是一股论文界的泥石流,作者本身是一个喜欢粉红小马的大叔,萌萌哒。实际上YOLO一直发展到v3都是简单粗暴的目标检测方法,虽然学术界模型繁杂多样,但是在实际应用工业应用上YOLO绝对是一个首选的推荐。YOLO v1版本现在看来真是简单粗暴,也印证了网络抽象的强大之处。可以看出作者没有受到太多前辈的影响,将对象检测重新定义为单个回归问题,直接从图像像素到边界框坐标和类概率(当然这也是一个缺少坐标约束也是一个缺点)。
YOLO的明显缺点,如多尺度问题,密集物体,检测框耦合,直接回归坐标等在yolo 9000中也做了比较好的改进。
SSD:Single Shot MultiBox Detector
SSD作为one stage的代表模型之一,省去了判断推荐候选区域的步骤(实际上可以认为one-stage就是以feature map cell来抽象代替ROI Pooling功能) ,虽然SSD和Faster RCNN在Anchor box上一脉相承,但是Faster RCNN却还是有一个推荐候选区域(含有物体的区域)的监督部分(注意后面其实也是整合到了最终Loss中),因此one-stage优势是更快,而含有区域推荐的two-stage目前是更加准确一些。(更看好one-stage,其实区域推荐不太符合视觉系统,但是可以简化目标检测问题),主要贡献:
用多尺度feature map来预测,也生成了更多的default box
检测框对每一类对象产生分数(低耦合,对比yolo)
缺点:
底层feature map高级语义不足 (FPN)
正负样本影响 (focal loss)
feature map抽象分类和回归任务只用了两个卷积核抽象性不足(DSSD)
为啥能更好的工作?
SSD的出现对多尺度目标检测有了突破性进展,利用卷积层的天然金字塔形状,设定roi scale让底层学习小物体识别,顶层学习大物体识别
FPN:feature pyramid networks
SSD网络引入了多尺度feature map,效果显著。那Faster RCNN自然也不能落后,如何在Faster RCNN中引入多尺度呢?自然有FPN结构
同时FPN也指出了SSD因为底层语义不足导致无法作为目标检测的feature map
注意原图的候选框在Faster RCNN中只固定映射到同一个ROI Pooling中,而现在如果某个anchor和一个给定的ground truth有最高的IOU或者和任意一个Ground truth的IOU都大于0.7,则是正样本。如果一个anchor和任意一个ground truth的IOU都小于0.3,则为负样本。
本文算法在小物体检测上的提升是比较明显的,另外作者强调这些实验并没有采用其他的提升方法(比如增加数据集,迭代回归,hard negative mining),因此能达到这样的结果实属不易。
DSSD:Deconvolutional Single Shot Detector
一个SSD上移植FPN的典型例子,作者主要有一下改动:
将FPN的Upsampling变成deconv
复杂了高层表述分支(分类,回归)网络的复杂度
R-SSD:Enhancement of SSD by concatenating feature maps for object detection
本文着重讨论了不同特征图之间的融合对SSD的影响(水论文三大法宝),这篇论文创新点不是太多,就不说了
DSOD: Learning Deeply Supervised Object Detectors from Scratch
这篇文章的亮点:
提出来了不需要预训练的网络模型
DSOD实际上是densenet思想+SSD,只不过并不是在base model中采用densenet,而是密集连接提取default dox的层,这样有一个好处:通过更少的连接路径,loss能够更直接的监督前面基础层的优化,这实际上是DSOD能够直接训练也能取得很好效果的最主要原因,另外,SSD和Faster RCNN直接训练无法取得很好的效果果然还是因为网络太深(Loss监督不到)或者网络太复杂。
Dense Prediction Structure 也是参考的densenet
stem能保留更多的信息,好吧,这也行,但是对效果还是有提升的。
YOLO 9000:Better, Faster, Stronger
很喜欢这个作者的论文风格,要是大家都这么写也会少一点套路,多一点真诚。。。。文章针对yolo做了较多的实验和改进,简单粗暴的列出每项改进提升的map。这个建议详细的看论文。下面列举几个亮点:
如何用结合分类的数据集训练检测的网络来获得更好的鲁棒性
将全连接层改为卷积层并结合了细粒度信息(passthrough layer)
Multi-Scale Traning
Dimension Clusters
darknet-19更少的参数
Direct locaion prediction对offset进行约束
R-FCN:Object Detection via Region-based Fully Convolutional Networks
本文提出了一个问题,base CNN网络是为分类而设计的(pooling 实际上是反应了位置的不变性,我一张人脸图片只要存在鼻子,两只眼睛,分类网络就认为它是人脸,这也就是Geoffrey Hinton 在Capsule中吐槽卷积的缺陷),而目标检测则要求对目标的平移做出准确响应。Faster RCNN是通过ROI pooling让其网络学习位置可变得能力的,再次之前的base CNN还是分类的结构,之前讲过R-FCN将Faster RCNN ROI提取出来的部分的卷积计算共享了,那共享的分类和回归功能的卷积一定在划分ROI之前,那么问题来了,如何设计让卷积对位置敏感?
主要贡献:
将用来回归位置和类别的卷积前置共享计算,提高了速度。
巧妙设计score map(feature map)的意义(感觉设计思想和yolo v1最后的全连接层一样),让其何以获得位置信息,之后在经过ROI pooling和vote得到结果
为啥能work?
实际上rfcn的feature map设计表达目标检测问题的方式更加抽象(ROI pool前的feature map中每一个cell的channel代表定义都很明确),loss在监督该层时更能通过论文中关于ROI pool和vote设计,在不同的channel上获得高的响应,这种设计方式可能更好优化(这个是需要大量的实验得出的结论),至于前面的resnet-base 自然是抽象监督,我们本身是无法理解的,只是作为fintuning。实际上fpn的loss监督也是非常浅和明确的,感觉这种可以理解的优化模块设计比较能work。
Focal Loss: Focal Loss for Dense Object Detection
这篇文章实际上提供了另外一个角度,之前一直认为Single stage detector结果不够好的原因是使用的feature不够准确(使用一个位置上的feature),所以需要Roi Pooling这样的feature aggregation办法得到更准确的表示。但是这篇文章基本否认了这个观点,提出Single stage detector不好的原因完全在于:
极度不平衡的正负样本比例: anchor近似于sliding window的方式会使正负样本接近1000:1,而且绝大部分负样本都是easy example,这就导致下面一个问题:gradient被easy example dominant的问题:往往这些easy example虽然loss很低,但由于数 量众多,对于loss依旧有很大贡献,从而导致收敛到不够好的一个结果。
所以作者的解决方案也很直接:直接按照loss decay掉那些easy example的权重,这样使训练更加bias到更有意义的样本中去。很直接地,如下图所示:
实验中作者比较了已有的各种样本选择方式:
按照class比例加权重:最常用处理类别不平衡问题的方式
OHEM:只保留loss最高的那些样本,完全忽略掉简单样本
OHEM+按class比例sample:在前者基础上,再保证正负样本的比例(1:3)
Focal loss各种吊打这三种方式,coco上AP的提升都在3个点左右,非常显著。值得注意的是,3的结果比2要更差,其实这也表明,其实正负样本不平衡不是最核心的因素,而是由这个因素导出的easy example dominant的问题。
RetinaNet 结构如下
实际上就是SSD+FPN的改进版
以上是关于在JAVA里 啥是回调函数啊.?的主要内容,如果未能解决你的问题,请参考以下文章