当面前的读者看到这篇论文时,应该对这个算法至少了解了一点,至于算法的讲解,网上一搜一大把,我就是写了,也不一定比那些高手厉害。本文主要是一些我在编程(matlab,基于opencv的C)实现时遇到的问题,特在此分享一下。
1 内存;接触这个算法的人一开始编程是不是都嫌自己的电脑内存太小了啊?
解决方法:分特征训练(提倡),或者加大内存(这个需要money)
Matlab 会出现“out of memory”这个错误,刚开始我一直苦恼,不知道怎么解决这个问题,后来问了度娘,找到个解决途径,就是装64位操作系统,然后加大虚拟内存,实践证明,这个不是个好方法,或者说治标不治本。没办法,自己掏腰包买了16G的内存条,然后使用了几万特征,两万样本训练的。另外的方法就是分特征训练了,比如需要训练20万的特征,2万样本,训练时可以先训练前1000个,在这1000中选一个最优的,然后训练下一个1000个特征,然后比较这两次的训练结果,选取一个最优的,依次类推。。。。当然这个地方有个小问题就是需要多次计算特征,浪费了不少时间,没办法,只能用时间换空间。
Opencv就是采用后一种的方法。
2 训练截止
若你是一个只会用opencv工具的一个人,而且不知道opencv是如何实现adaboost的话,这一条会对你有很大的帮助。一般的adaboost训练文档都会说如何构造正负样本,然后读者就会照葫芦画瓢,结果训练的时候训练到10级以后就会暂停。。。咦,这是怎么回事呢。看过源码的话,就会恍然大悟。这里的正负样本,正样本是相同大小的目标图片(若不是灰度图,程序中会自动的将其转成灰度图),而负样本就是不含有目标的图片,其尺寸是没有要求的(但是尺寸都不得小于正样本的尺寸)。然后我说一下正负样本的个数,首先这个正负样本的比例没有谁严格证明,我是采用1:1的。这里就需要说明正负样本的数目是什么意思了。比如说正负样本都为10000,那么正样本是10000幅图片是没有争议的,那么负样本是多少呢?是不是负样本也必须是10000幅图片呢,其实这里的10000是指程序中参与训练的负样本数目,而程序中的负样本是在负样本上自动采样的,然后用上面的训练的分类器进行判断,呗判断错误的话就会加入到负样本集中,一直采样到负样本集中有10000个为止,这里就会出现训练暂停的问题,随着训练的进行,采集到的负样本被分类器判断错误的数量越来越少,那么就要对图片进行重复的采样,比如有100幅负样本,现在需要采集10000幅和正样本一模一样大的图片,就需要在那些100幅上采样,当采样一遍(从第一副采样到100幅)后,发现负样本集里的负样本还不到10000,那么就要多负样本进行多次采样。当训练到一定程度时,这个遍历的次数越来越多,就需要相当长的时间,他的极端就是在每一轮添加到负样本集里的数量都很少时,那么采样的轮数就会很大,更极端的就是每一轮都没有负样本添加成功,这个就导致了一个死循环。就会出现上面的训练暂停的情况。
解决方法:
1 准备更多的负样本,比如1000000幅
2 负样本的要大图比较好,比如你的10000*1000采集的图片要比30*30多很多
3 在训练暂停后,若是达不到训练的级数,可以将负样本换掉,换一批样本,继续原来的训练
提倡的解决方法就是结合1,2;不提倡3