I am working with thermal videos. My project determines in real-time whether each frame contains a face or not. By "contains a face", I mean this:
(one face, this size and angle, per frame)
I've trained an LBP cascade classifier for this purpose. The classifier performs pretty well and is able to detect thermal faces with very low chance of false negative as shown above. However, the rate of false positives is quite alarming. Non-face objects in the void are detected, as shown below.
Note: these images were used as negative samples
By adjusting parameters of detectMultiScale
method, the number of false positives can be reduced. But still, with a scaleFactor
of 1.5 and minNeighbors
of 10, I get false positives 20% of the time.
For the cascade training I had 600 negative images (60x80) and 90 positive images (60x50), out of which 1200 positive samples were generated.
So what are other possible solutions or work-around for this problem, without compromising speed of detection or frame rate?
EDIT: I have tried extracting hard negatives from my samples by using the trained classifier on the negative images and marking up the false negatives to include them in the next training. So far, I have been able to reduce the false positives to about 12%. However i am still not satisfied with this result.