Histogram of Oriented Gradients (HOG) in Dlib
the histogram of oriented gradients (HOG) is a feature descriptor used in computer vision and image processing for the purpose of object detection. A idéia por trás de HOG é extrair características em um vetor, e alimentá-lo em um algoritmo de classificação como uma máquina de vetor de suporte que irá avaliar se um rosto (ou qualquer objeto que você treina para reconhecê-lo de fato) está presente em uma região ou não. No descritor HOG feature, a distribuição ( histogramas ) de direções de gradientes ( gradientes orientados ) são usados como características. Gradientes (derivados x e y) de uma imagem são úteis porque a magnitude dos gradientes é grande em torno das arestas e cantos ( regiões de mudanças bruscas de intensidade ) e sabemos que as arestas e os cantos empacotam muito mais informações sobre a forma do objeto do que as regiões planas.
no artigo original, o processo foi implementado para detecção do corpo humano, e a cadeia de detecção foi a seguinte: :

a Detecção de um rosto a partir de uma imagem usando o PORCO método requer os seguintes passos a serem seguidos :-
- Calcular o Gradiente de Imagens
- Calcule o PORCO
- Bloco de normalização
- Alimentação do vetor em SVM
Calcular o Gradiente de Imagens: O primeiro passo é calcular a horizontal e a vertical gradientes de imagem, filtrando a imagem com as seguintes kernels :

Aqui as imagens de entrada deve ser do mesmo tamanho, tendo uma proporção fixa como 64×128, 100×200 128×256, mas não 101×205.


a imagem do gradiente removeu um monte de informações não essenciais ( por exemplo, fundo colorido constante), mas esboços realçados. Ainda podemos identificar a imagem. A cada pixel, o gradiente tem uma magnitude e uma direção.
Calcule o porco : a imagem é então dividida em 8×8 células para oferecer uma representação compacta e tornar o nosso porco mais robusto ao ruído. Depois, calculamos um porco para cada uma dessas células.

Para estimar a direção de um gradiente dentro de uma região, basta construir um histograma entre os 64 valores do gradiente direções (8×8) e sua magnitude (outro 64 valores) dentro de cada região. O próximo passo é criar um histograma de gradientes nestas 8×8 células. O histograma contém 9 caixas correspondentes aos ângulos 0, 20, 40 … 160.
Quando construirmos o porco, então 3 casos surgirão:
- e se o ângulo for menor que 160° e não a meio caminho entre 2 classes. Em seguida, nesses casos, o ângulo será adicionado na categoria certa do porco.e se o ângulo for menor que 160° e exactamente entre 2 classes? Então, nesses casos, consideramos uma contribuição igual para as 2 classes mais próximas e dividimos a magnitude em 2
- e se o ângulo for maior que 160°. Então, nesses casos, consideramos que o pixel contribuiu proporcionalmente para 160° e 0°.

Na fig. 10 o pixel circundado em azul tem um ângulo (direção ) de 80 graus e magnitude de 2. Assim, adiciona 2 para o quinto bin como segue o primeiro caso. O gradiente no pixel circundado a vermelho tem um ângulo de 10 graus e uma magnitude de 4. Uma vez que 10 graus está a meio caminho entre 0 e 20, o voto pelo pixel divide-se uniformemente nos dois caixotes, como segue o segundo caso.

Na fig. 11 o pixel com ângulo de 165 graus contribui proporcionalmente para o bin de 0 graus e o bin de 160 graus como segue o terceiro caso.
O Porco é assim para cada célula 8×8 como (Fig. 12).

Bloco de normalização : Finalmente, um bloco de 16×16 podem ser aplicadas a fim de normalizar a imagem e torná-lo invariante para a iluminação. Aplicando 16×16 bloco significa que estamos fazendo a imagem mais escura dividindo todos os valores de pixels por 2, assim a magnitude gradiente vai mudar para a metade e, portanto, os valores do histograma vai mudar para a metade. Idealmente, queremos que o nosso descritor seja independente das variações de iluminação.
alimentando o vector em SVM: um bloco de 16×16 tem 4 histogramas que podem ser concatenados para formar um vector de 36 x 1. Finalmente, todos os vetores 36×1 são concatenados em um grande vetor que será o nosso Vetor de recursos, no qual podemos treinar uma SVM suave e prever o rosto em uma imagem.
em Dlib está presente um modelo treinado para detectar faces, basta criar um objecto desse modelo.
assim que é o fim de prever faces usando o porco usando o Dlib.
conclusão
Há um enorme debate sempre acontecendo o que é melhor na detecção de faces haar classifier cascade ou HOG based face detector. Dlib está à frente do classifier haar cascade sobre a implementação, velocidade e precisão. Há vários benefícios para o uso do classificador de porcos. Primeiro o treinamento é feito usando uma sub-janela de deslizamento na imagem para que nenhuma subamostragem e manipulação de parâmetros é necessária como é no classificador Haar. Isso faz com que a Deteção de face de porco + SVM da Dlib seja mais fácil de usar e mais rápida de treinar. Note que o porco tem maior precisão para detecção de face do que o classificador Haar cascade. O classificador Haar cascade faz mais predições falsas positivas nas faces do que o detector de face baseado em porcos.se quiser ver a precisão do Classificador haar cascade vs detector de face baseado no porco, pode ler aqui.