Ho sviluppato un'applicazione per il rilevamento di volti utilizzando il rilevamento di faccia a cascata HAAR di OpenCVs. L'algoritmo funziona bene, tuttavia ogni tanto trova dei pattern sul muro o altre cose che non sono facce.
Voglio eseguire controlli aggiuntivi su oggetti sospetti come facce ma voglio farlo solo su oggetti che non sono confidente dal fatto che siano facce. C'è un modo per ottenere un livello di "sicurezza" per un volto rilevato dal rilevamento del volto in cascata HAAR?C'è un modo per ottenere una misurazione del livello di confidenza quando si utilizza il rilevamento di haar face usando OpenCV?
risposta
OpenCV trova in realtà più di un risultato per qualsiasi oggetto particolare, ciascuna area rilevata si sovrappone in gran parte l'una all'altra; quelli sono quindi raggruppati e formano un numero di "conteggi dei vicini". Questo conteggio è la cosiddetta fiducia.
Quando si esegue il rilevamento degli oggetti, uno dei parametri è il vicino minimo prima che venga restituito un riscontro. Aumentando riduce i falsi positivi, ma diminuisce anche il numero di possibili volti rilevati.
Perché non eseguire più hack cascade (con addestramento diverso) rispetto alla stessa immagine e vedere se producono risultati simili? Li hanno votati, per così dire. Quindi, se solo una cascata trova un dato volto e gli altri no, ciò ti darebbe meno fiducia in quel dato volto.
Sono stato in grado di eseguire 3 cascate contemporaneamente su un feed video di iPhone in tempo reale, quindi le prestazioni non dovrebbero essere un problema in molti scenari normali. Maggiori informazioni qui: http://rwoodley.org/?p=417
OpenCV fornisce la fiducia tramite l'argomento "pesi" in funzione "detectMultiScale" dalla classe CascadeClassifier, è necessario mettere il flag "outputRejectLevels" true
Non è una risposta diretta alla sua domanda , ma questo può aiutare a ridurre il rilevamento falso.
È possibile ottenere meno rilevamenti falsi modificando i valori MinNeibhbours, CV_HAAR_FIND_BIGGEST_OBJECT e Size.
int MinNeighbours = 7;
face_cascade.detectMultiScale (frame_gray, facce, 1.1, MinNeighbours, CV_HAAR_FIND_BIGGEST_OBJECT, Dimensione (60, 60));
questo parametro è disponibile per openCV C++ API? Lo vedo solo in API python?!? Ad esempio, esiste un modo non documentato per utilizzare il parametro flags per questo scopo? – Micka
[Apparentemente] (http://code.opencv.org/issues/3064) c'è anche una funzione non documentata nell'API C++. 'CascadeClassifier vuoto :: detectMultiScale (const Mat & immagine, vettoriale e oggetti, vettore & rejectLevels, vettore & levelWeights, doppio scaleFactor, int minNeighbors, int bandiere, Dimensioni minObjectSize, Dimensioni maxObjectSize, outputRejectLevels bool)' –
sietschie