c++ - training - Valores recomendados para los parámetros de OpenCV detectMultiScale()
opencv cascade classifier tutorial (3)
¿Cuáles son los parámetros recomendados para CascadeClassifier::detectMultiScale()
y dependiendo de qué factores debo cambiar los parámetros predeterminados?
void CascadeClassifier::detectMultiScale(
const Mat& image,
vector<Rect>& objects,
double scaleFactor=1.1,
int minNeighbors=3,
int flags=0,
Size minSize=Size(),
Size maxSize=Size() )
Entre estos parámetros, debe prestar más atención a cuatro de ellos:
scaleFactor
- Parámetro que especifica cuánto se reduce el tamaño de la imagen en cada escala de imagen.Básicamente, el factor de escala se usa para crear su pirámide de escala. Más explicación se puede encontrar here . En resumen, como se describe here , su modelo tiene un tamaño fijo definido durante el entrenamiento, que es visible en el
xml
. Esto significa que este tamaño de cara se detecta en la imagen si está presente. Sin embargo, al volver a escalar la imagen de entrada, puede cambiar el tamaño de una cara más grande a una más pequeña, haciéndola detectable por el algoritmo.1.05
es un buen valor posible para esto, lo que significa que utiliza un pequeño paso para cambiar el tamaño, es decir, reduce el tamaño en un 5%, aumenta las posibilidades de que coincida el tamaño con el modelo de detección. Esto también significa que el algoritmo funciona más lento ya que es más completo. Puede aumentarlo hasta 1.4 para una detección más rápida, con el riesgo de perder algunas caras por completo.minNeighbors
- Parámetro que especifica cuántos vecinos debe tener cada rectángulo candidato para conservarlo.Este parámetro afectará la calidad de las caras detectadas. Mayor valor da como resultado menos detecciones pero con mayor calidad.
3~6
es un buen valor para eso.minSize
-minSize
mínimo posible del objeto. Los objetos más pequeños que eso se ignoran.Este parámetro determina el tamaño pequeño que desea detectar. Tú lo decides! Por lo general,
[30, 30]
es un buen comienzo para la detección de rostros.maxSize
- Tamaño de objeto máximo posible. Los objetos más grandes que esto son ignorados.Este parámetro determina qué tan grande es el tamaño que desea detectar. Nuevamente, tú lo decides! Por lo general, no es necesario configurarlo manualmente , el valor predeterminado supone que desea detectar sin un límite superior en el tamaño de la cara.
Si tiene un buen rendimiento de CPU y RAM o más, puede establecer scaleFactor = 1 minNeighbors = 3
si está trabajando en un sistema incrustado como en raspberry recomiendo elegir smth como scaleFactor = 2, (valores más altos significan menos precisión) minNeighbors = 1, (valores más altos significan menos precisión pero más confiabilidad) el algoritmo correrá mucho más rápido de lo contrario se congelará si el rendimiento de la CPU y la RAM no son suficientes.
Espero eso ayude
cl_int err;
cl_uint numPlatforms;
err = clGetPlatformIDs(0, NULL, &numPlatforms);
if (CL_SUCCESS == err)
printf("/nDetected OpenCL platforms: %d", numPlatforms);
else
printf("/nError calling clGetPlatformIDs. Error code: %d", err);
string str ="haarcascade_frontalface_alt2.xml";
ocl::OclCascadeClassifier fd;
fd.load(str);
ocl::oclMat frame, frameGray;
Mat frameCpu;
CvVideoCapture vcap = openVideo("0");
vcap.set(CV_CAP_PROP_FRAME_WIDTH,320);
vcap.set(CV_CAP_PROP_FRAME_HEIGHT,240);
static const cv::Size maxSize;
for(;;){
// // processing loop
vector<Rect> faces;
vcap >> frameCpu;
frame = frameCpu;
ocl::cvtColor(frame, frameGray, CV_BGR2GRAY);
//ocl::equalizeHist(frameGray, frameGray);
//Mat mm(frameGray);
//cvWaitKey(100);
fd.detectMultiScale(frameGray,faces,1.05,3,0|CV_HAAR_FIND_BIGGEST_OBJECT ,minSize,maxSize);
for(int i=0; i< faces.size() ; i++)
{
if(faces.size())
//circle(img, Point(palm[i].x+ palm[i].width/2,palm[i].y+palm[i].height/2),palm[i].width,Scalar(255,0,0), 2,8 );
cv::rectangle(frameCpu, faces[i],Scalar(255,0,0), 2,8 );
}
imshow("fsfs",frameCpu);
cvWaitKey(1);