Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

负样本不够 #7

Open
caxieyou opened this issue Sep 30, 2015 · 9 comments
Open

负样本不够 #7

caxieyou opened this issue Sep 30, 2015 · 9 comments

Comments

@caxieyou
Copy link

请问你代码实现的如何了,我试着跑了下python的版本,结果负样本完全不够用,我塞了3000张正样本,20000张负样本(500*500)结果训练到第一个stage的第40个弱分类器就完全不够用了,
实在差的太多了。
是不是哪里有什么问题?

谢谢

@luoyetx
Copy link
Owner

luoyetx commented Sep 30, 2015

@caxieyou 如果你说的 Python 版本是指 FaceDetect/jointCascade_py,我看过它的源码,并没有做 hard negative mining,也就是说负样本的数量一开始就是固定的,随着训练过程的深入,负样本必然不断减少。

我现在采取的策略是当负样本数量不够时,通过在线生成的方式来扩充负样本(也可以离线事先生成足够多的负样本)。

你用的 20000 张背景图片事实上是可以生成很多负样本的,500x500 的尺寸下做区域的选取并加上相应的变换 (旋转,翻转,模糊等) 应该能够生成足够多的负样本,论文中也提到用来 20000 张背景图片来生成负样本。

@caxieyou
Copy link
Author

caxieyou commented Oct 1, 2015

谢谢你的回复,继续就这个问题进行讨论的话
请问 你有亲自跑过这个算法到什么程度么 比如送进去多少张带标定的人脸图 和多少张负样本,结果如何

我之前没有做过相关的算法,这是第一个决策树类的训练项目,然后就数量而言 论文里送了正负样本各两万张 然后就训练了5040个弱分类器 这在我看来是一件很神奇的事情 python代码采取的策略是 每隔8个像素进行一次位移的“扫图” 其中一共候选的负样本按照20000张计算的话,最后生产的小样本,有几百万个小patch之多,最后就直接不够用,而且是在第40个分类器就用完了,如果采用hard negative mining这样的方法,作用能有多大,后面还有几千个弱分类器等着要“喂养”,真的可以训练出这么多个分类器么
就像我说的,我是新手,对于一般性的训练这样的分类器需要的数量没有什么概念,还是说,其实这种位移产生的负样本数量,其实就是不够用的,就是需要海量的负样本来训练?
我是新手 谢谢指导

@luoyetx
Copy link
Owner

luoyetx commented Oct 1, 2015

@caxieyou 不好意思,我之前的说法有误,FaceDetect/jointCascade_py 事实上是做了 hard negative mining 的,参考这段代码

我没有跑过 FaceDetect/jointCascade_py 。JDA 还没写完,所以自己也没有实践过训练,对训练数据大小也没有很好的把握(我也是新手=。=)

关于你用了 2W 张背景图片,却在第 40 个分类器下就被消耗完了,说明在 hard negative mining 阶段消耗了大量背景图片,这是否意味着你的背景图片之间的相似度很高,背景不够丰富?我没仔细看 FaceDetect/jointCascade_py 中是如何产生负样本的,我认为在滑动窗口的基础上还可以对产生的区域(也就是负样本)做各种变换来成倍地增加负样本数量,当然,这种方法在 hard negative mining 面前并不一定有效。

关于这种级联分类器的训练,我认为 OpenCV 自带的 haartraining 程序的参数设置有一定的参考价值。我认为 VJ 和 JDA 本身的思路是基本一致的。

@caxieyou
Copy link
Author

caxieyou commented Oct 5, 2015

谢谢回复 我的邮箱没有通知说收到了 有点回的慢了,真个python代码我都摸了一遍,还和作者沟通过修了一个bug,你说的这段代码当然我也仔细研究过,这里并没有什么旋转,变换,镜像之类的操作,只有平移,纯粹的平移。
这个应该不能算是hard negative mining吧?
如果我把后续的操作加上去,不知道能有多大作用。只是觉得,这样的消耗率实在太快了。很诡异,而且一点也摸不着头脑。
能留个QQ号什么的 方便下次交流么
谢谢

@luoyetx
Copy link
Owner

luoyetx commented Oct 6, 2015

那份 Python 代码里确实是做了 hard negative mining,它产生负样本之后还送到了现有的级联分类器中去做验证,如果被判成正样本的就认为该负样本为 hard negative。负样本在送到现有级联分类器前做一下 Data Augmentation 也是可以的,但是效果不好说。

PS:我的 QQ 号 1062018952

@nihui
Copy link

nihui commented Oct 23, 2015

void NegGenerator::NextState()
这里 imread 后先把图片放大4倍,可以多找到一些负样本
hard negative mining 到后面非常慢,能不能openmp加速下呀
真的很感谢~~

@luoyetx
Copy link
Owner

luoyetx commented Oct 23, 2015

可以考虑多次调用 NegGenerator::NextImage() 生成一个待选负样本集合,然后多线程进行验证是否足够 hard

@luoyetx
Copy link
Owner

luoyetx commented Oct 25, 2015

@nihui 简单用 OpenMP 加速了一下,但是效率不是很高 c9aaf98

@nihui
Copy link

nihui commented Oct 26, 2015

mining_pool_size = std::thread::hardware_concurrency(); 5000太浪费了 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants