JDA icon indicating copy to clipboard operation
JDA copied to clipboard

负样本不够

Open caxieyou opened this issue 8 years ago • 9 comments

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

谢谢

caxieyou avatar Sep 30 '15 03:09 caxieyou

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

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

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

luoyetx avatar Sep 30 '15 14:09 luoyetx

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

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

caxieyou avatar Oct 01 '15 07:10 caxieyou

@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 本身的思路是基本一致的。

luoyetx avatar Oct 01 '15 10:10 luoyetx

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

caxieyou avatar Oct 05 '15 09:10 caxieyou

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

PS:我的 QQ 号 1062018952

luoyetx avatar Oct 06 '15 13:10 luoyetx

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

nihui avatar Oct 23 '15 02:10 nihui

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

luoyetx avatar Oct 23 '15 04:10 luoyetx

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

luoyetx avatar Oct 25 '15 10:10 luoyetx

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

nihui avatar Oct 26 '15 06:10 nihui