Detecção de rosto Opencv (recurso Haar + classificação em cascata)

Recurso Haar + classificador em cascata Adaboost

A tecnologia de detecção de objetos com base no classificador de recursos Haar é uma tecnologia de detecção de objetos muito eficaz, que é usada principalmente para detecção de rosto e pedestre. O recurso semelhante a Haar é um operador de descrição de recurso comumente usado no campo da visão computacional, também conhecido como recurso Haar. O recurso Haar é para subtrair a soma de todos os valores de pixel do retângulo branco da soma de todos os valores de pixel do retângulo preto na figura abaixo.

Insira a descrição da imagem aqui

O recurso Haar pode gerar uma série de sub-recursos ampliando e alterando a janela de detecção. No artigo "Detecção rápida de objetos usando uma cascata impulsionada de recursos simples", o detector usado pelo autor foi configurado para um tamanho de 24 * 24, e mais de 180.000 recursos foram obtidos.

Insira a descrição da imagem aqui

O valor do recurso Haar reflete as alterações do nível de cinza da imagem. Os experimentos provaram que um número muito pequeno de recursos pode ser combinado para formar um classificador eficaz. Por exemplo, algumas características do rosto podem ser simplesmente descritas por características retangulares, como: os olhos são mais escuros do que as bochechas, os lados do nariz são mais escuros do que a ponte do nariz e a boca é mais escura do que os arredores. Para atingir esse objetivo, aplicamos cada recurso a todas as imagens de treinamento (imagens de rosto de amostra positiva, imagens de amostra negativa de rosto). Queremos selecionar os recursos com a menor taxa de erro, o que significa que são os melhores recursos para detectar imagens faciais e não faciais. O autor finalmente selecionou 6061 recursos de 180.000 recursos.

Para encontrar alvos em diferentes posições na imagem, a janela de detecção precisa ser movida sucessivamente (os recursos de Haar na janela também se movem de acordo), de modo que possa atravessar para todas as posições na imagem. Para detectar alvos de tamanhos diferentes, geralmente existem dois métodos: reduzir gradualmente a imagem ou aumentar gradualmente a janela de detecção, para que você possa atravessar para os alvos de tamanhos diferentes na imagem.

Se você usar esses recursos 6061 para verificar cada janela 24x24 para ver se é um rosto, será demorado, então é melhor ter um método simples para provar que esta janela não é uma área de rosto, se não, apenas descarte-o. Lide com isso novamente. Para atingir esse objetivo, o autor propôs o conceito de classificadores em cascata.

Em vez de testar os recursos do 6061 da janela no início, divida esses recursos em grupos diferentes. Use um por um em diferentes estágios de classificação. Normalmente, os primeiros estágios usam menos detecção de recursos. O estudo descobriu que a taxa correta de julgamento do classificador não é um rosto humano é muito alta, e a taxa correta de julgamento é que um rosto humano está na média. Se uma janela falhar no primeiro estágio do teste, você pode simplesmente abandonar o teste seguinte e, se for aprovado, entrará no segundo estágio de teste. Se uma janela passou em todos os testes, então esta janela é considerada uma área de rosto.

O autor divide 6061 recursos em 38 estágios, e o número de recursos nos primeiros cinco estágios é 1, 10, 25, 25 e 50, respectivamente. O número de recursos contidos nas camadas restantes aumentou dramaticamente. O número total de recursos é 6061.

import os
os.chdir("E:\\code\opencv\\10.人脸检测识别\\")
from imutils import *
image = imread('face.png')
show(image)

Insira a descrição da imagem aqui

  • Descrição do parâmetro da função detector.detectMultiScale
  1. imagem: imagem de entrada
  2. scaleFactor = 1,1: Esta é a proporção de cada vez que a imagem é reduzida, o padrão é 1,1
  3. minNeighbors = 3: O número de caixas retangulares circundantes necessárias para uma correspondência bem-sucedida. A área correspondida por cada recurso é uma caixa retangular. Somente quando existem várias caixas retangulares ao mesmo tempo, a correspondência é considerada bem-sucedida, como um rosto humano. Isso padrão O valor é 3.
  4. minSize: o intervalo mínimo de faces correspondentes
  5. flags = 0: pode assumir os seguintes valores:
    CASCADE_DO_CANNY_PRUNING = 1, use a detecção de borda sagaz para excluir algumas áreas da imagem com poucas ou muitas bordas
    CASCADE_SCALE_IMAGE = 2, detecção de razão normal
    CASCADE_FIND_BIGGEST_OBJECT = 4, apenas detectar o maior objeto
    CASCADE_DO_ROUGH_SEARCH = 8 Detecção
# 级联分类器
detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
rects = detector.detectMultiScale(image, scaleFactor=1.1, minNeighbors=2, minSize=(10,10), flags=cv2.CASCADE_SCALE_IMAGE)

for (x,y,w,h) in rects:
    # 画矩形框
    cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)
    
show(image)

Insira a descrição da imagem aqui

def facedetect(image):
    image = imread(image)
    # 级联分类器
    detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
    rects = detector.detectMultiScale(image, scaleFactor=1.1, minNeighbors=2, minSize=(10,10), flags=cv2.CASCADE_SCALE_IMAGE)

    for (x,y,w,h) in rects:
        # 画矩形框
        cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)

    show(image)
facedetect('Solvay.jpg')

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/cyj5201314/article/details/115218577
Recomendado
Clasificación