通过Spring容器自动扫描和管理Bean,我们不再需要在配置文件中使用<bean>标签管理Bean。
2.9.1引入context命名空间<context:component-scan base-package="cn.framelife.spring"/>
在打开扫描功能后,注解功能也打开了,所以不再需要再打开注解功能。
base-package是要扫描的类的包路径。
@Service业务层组件,如service
@Controller控制层组件,如Struts中的Action
@Repository数据访问层组件,如dao
@Component当组件不好归类时使用,泛指
上面几个注解都是类范围的,所以应该标注在类名的头上。
在扫描的时候,Bean的id,如UserDaoImpl会默认为userDaoImpl。
但如果有需要,我们是可以修改这个默认名字的。
如:
@Service("userService") public class UserServiceImpl implements UserService { //... }
这个时候我们可以使用userService来获取对象。
@Service("userService")@Scope("prototype") public class UserServiceImpl implements UserService { //... }
真受不了这些鸟人写的书了,明明很简单的东西被写的云里雾里的。如下一段文字,即懂CMMI。
CMMI:书名叫软件能力成熟度集成模型。本来有3个不同领域分别的的CMM(软件、硬件、产品),然后CMMI干的事就是把三个领域的CMM(软件能力成熟度模型)集成起来。
至于什么叫软件能力成熟度模型?就是公司在运作的过程中,各个成员所要遵守的一条条准则。和《中学生行为准则》一样。你按照成熟度1级所要求的那几条准则做了,你就是成熟度1级了。一共有5级。CMMI的特点就是,这些准则不止适用于比如写软件的一个职业,还是用于整个开发组织的诸如硬件、质量、测试等所有相关岗位共同遵守的准则。要不怎么叫整合呢!
CMMI最新版本是1.3,分为3个版本,适用于3种不同的活动。搞开发的,就用CMMI-DEV版本;搞服务的,就用CMMI-SVC版本;搞采购的,就用CMMI-ACQ。
上面说了成熟度有5级,达到下一级的要求就可以升一级。还有一种视角,采用另一种评级方式,不是统一的说某些条款达到了就可以升级,而是某一个条款达到了多少级,允许不同的条款达到不同的级别,共6级。某一个条款是多少级和它位于什么成熟度等级是无关,也是不会同时出现的,因为一个组织只会选择一种评级模式。基于整体5级成熟度分级的叫阶段式模型,基于各个组成部分单独的6级评价的叫做连续式模型。
上面说的”条款“这个字眼比较笼统,正式的叫法是过程域,说白了就是事项。例如“需求管理“过程域,属于2级成熟度要求做到的。在一个过程域里,还包括一些目标和实践。什么意思呢?就是要完成需求管理这个过程域,需要达到1个目标(其他过程域可能会有多个):管理需求并识别计划与工作产品的不一致性。要达成这个目标需要5个实践(实践就是具体的操作方法,也就是5条具体的达成目标的手段)。
到这里,可能会有点迷糊。这个需求管理的过程域属于2级成熟度,那么它本身按照阶段式模型又怎么分级呢?需求管理这个过程域和其他所有过程域一样,都可以在连续式模型中分为6级。压根没做,叫0级;做了并完成了此过程域规定的目标,叫1级;这个东西被做需求管理的人制度化了,叫2级;这个东西被全公司认识了,有了能让全组织明确的定义叫3级;需求管理这个东西被定量的研究了,叫4级;能不断提高4级时确定的定量的数值,这个提高的能力被制度化,也就是作为一项专门的工作了,叫5级,也就是最高级了。
好吧,说完单个的过程域的连续式模型上的分级。说说过程域的整体情况和哪些过程域属于哪些成熟度等级。
上面说过,CMMI有3个版本,每个版本叫做一个群集。3个版本共有的过程域叫基础模型(CMF),共有16个。CMMI-DEV还有6个特有的,CMMI-ACQ也还有6个特有的,CMMI-SVC还有8个特有的。
具体的每个过程域是什么,有什么目标和实践,位于哪个成熟等级,属于哪个群集,就可以直接查官网的手册了。
基于形变部件模型(Deformable Part Models)的目标检测
上节说了基于cascade的目标检测,cascade的级联思想可以快速抛弃没有目标的平滑窗(sliding window),因而大大提高了检测效率,但也不是没缺点,缺点就是它仅仅是个很弱的特征,用它做分类的检测器也是弱分类器,仅仅比随机猜的要好一些,它的精度靠的是多个弱分类器来实行一票否决式推举(就是大家都检测是对的)来提高命中率,确定分类器的个数也是经验问题。这节就来说说改进的特征,尽量使得改进的特征可以检测任何物体,当然Deep Learning学习特征很有效,但今天还是按论文发表顺序来说下其他方法,(服务器还没配置好,现在还不能大批跑Deep Learning ^.^),在第四节说了ASM并且简单的提了下AAM,这两个模型其实就是形变模型(deform model),说到基于形变模型检测物体的大牛,就不得说说芝加哥大学教授Pedro F. Felzenszwalb,Pedro发表很多有关基于形变部件来做目标检测的论文,并靠这个获得了VOC组委会授予的终身成就奖,另外它早期发表的《Belief propagation for early vision》也很出名,虽然比不上Science那样的开辟新领域的Paper,但在不牺牲精度的情况下大大提高了BP算法的运行效率,这个BP算法不是神经网络的BP算法,而是概率图模型里的推理求解方法(最大后验概率),它也被用在了后面要说基于霍夫推理的目标检测。貌似Pedro很擅长做这种事情,他的另外一篇论文《Cascade Object Detection with Deformable Part Models》也是不牺牲精度的情况下把基于形变部件做目标检测的效率提高了20倍,今天就来学习一下这种基于形变部件的目标检测。
基于形变部件的目标检测是现在除了深度学习之外的还相对不错的目标检测方法,先来看下为什么要使用形变部件,在(图一)中,同一个人的不同姿态,试问用前面几节中的什么方法可以检测到这些不同姿态的人?阈值不行,广义霍夫变换行吗?人的姿态是变换无穷的,需要太多的模板。霍夫森林投票?貌似可以,但是霍夫森立的特征是图像块,只适用于一些形变不大的物体,当图像块内的形变很大时同样不太适用。那么ASM可以吗?想想也是和广义霍夫变换一样,需要太多的均值模板。归根结底就是我们没有很好的形状描述方法,没有好的特征。而Pedro几乎每发表一篇论文就改进一下形状描述的方法,最终由简单的表示方法到语法形式的表示方法,其演化过程可以在参考文献[4]中看出,参考文献[4]是Pedro的博士论文。
(图一)
既然上节中的几种方法都不能解决大形变目标的检测问题,那基于形变部件的目标检测也该上场了。Pedro的五篇关于目标检测的顶级paper,小生就不一一说了,挑参考文献中的三篇学习一下。参考文献[1]、[2]、[3]分别讲述了如何利用形变模型描述物体(特征阶段)、如何利用形变部件来做检测(特征处理+分类阶段)、如何加速检测。首先来说下文献[1]的形变部件。在Deformable Part Model中,通过描述每一部分和部分间的位置关系来表示物体(part+deformable configuration)。其实早在1973年,Part Model就已经在 “Therepresentation and matching of pictorial structures” 这篇文章中被提出了。
(图二)
Part Model中,我们通过描述a collection of parts以及connection between parts来表示物体。(图二)表示经典的弹簧模型,物体的每一部分通过弹簧连接。我们定义一个energy function,该函数度量了两部分之和:每一部分的匹配程度,部分间连接的变化程度(可以想象为弹簧的形变量)。与模型匹配最好的图像就是能使这个energy function最小的图片。形式化表示中,我们可以用一无向图 G=(V,E) 来表示物体的模型,V={v1,…,vn} 代表n个部分,边 (vi,vj)∈E 代表两部分间的连接。物体的某个实例的configuration可以表示为 L=(l1,…,ln),li 表示为 vi 的位置(可以简单的将图片的configuration理解为各部分的位置布局,实际configuration可以包含part的其他属性)。给定一幅图像,用 mi(li) 来度量vi 被放置图片中的 li 位置时,与模板的不匹配程度;用 dij(li,lj) 度量 vi,vj 被分别放置在图片中的 li,lj位置时,模型的变化程度。因此,一副图像相对于模型的最优configuration,就是既能使每一部分匹配的好,又能使部分间的相对关系与模型尽可能的相符的那一个。同样的,模型也自然要描述这两部分。可以通过下面的(公式一)描述最优configuration:
(公式一)
优化(公式一)其实就是马尔科夫随机场中的经典问题求解,可以用上面说的BP算法求解。说的理论些就是最大化后验概率(MAP),因为从随机场中很容易转换到概率测度中(gibbs measure),在这就不说那么复杂了,想系统的学习相关理论可以学习概率图模型(probabilistic graphical model)。识别的时候采用就是采用部件匹配,并且使得能量最小,这有点类似于ASM,但是ASM没有使用部件之间的关系,只是单纯的让各匹配点之间的代价和最小。匹配结果如(图三)所示:
(图三)
上面的方法没有用到机器学习,另外部件的寻找也不是一件容易的事情,因为首先要大概预估部件的位置,因此这个方法也有缺点,但这个形变部件的思想可以用来作为特征,接着就来看下Pedro的第二篇文献[2]如何用它来做目标检测。
Pedro在文献[2]中基于形变模型的目标检测用到了三方面的知识:1.Hog Features 2.Part Model 3. Latent SVM。
1. 作者通过Hog特征模板来刻画每一部分,然后进行匹配。并且采用了金字塔,即在不同的分辨率上提取Hog特征。
2. 利用上段提出的Part Model。在进行object detection时,detect window的得分等于part的匹配得分减去模型变化的花费。
3. 在训练模型时,需要训练得到每一个part的Hog模板,以及衡量part位置分布cost的参数。文章中提出了Latent SVM方法,将deformable part model的学习问题转换为一个分类问题。利用SVM学习,将part的位置分布作为latent values,模型的参数转化为SVM的分割超平面。具体实现中,作者采用了迭代计算的方法,不断地更新模型。
针对上面三条,我们可能有几个疑问:1、部件从何而来?2、如何用部件做检测?在基于部件做目标检测之前,赢得PASCAL VOC 2006年挑战的Dalal-Triggs的方法是直接用HOG作为特征,然后直接基于不同尺度的滑动窗口做判别,像一个滤波器,靠这个滤波器赢得短时的荣誉,但不能抗大形变的目标。Pedro改进了Dalal-Triggs的方法,他计算作为一个得分,其中beta是滤波器,phi(x)是特征向量。通过滤波器找到一个根(root)部件p0,根部件有专门的滤波器,另外还有一系列非根部件(parts)p1…pn,然后把他们组成一个星形结构,此时回顾(图一)的形变模型思想。每个部件用