<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pontos Faciais &#8211; Visão Computacional</title>
	<atom:link href="https://visaocomputacional.com.br/tag/pontos-faciais/feed/" rel="self" type="application/rss+xml" />
	<link>https://visaocomputacional.com.br</link>
	<description>Tecnologias, teorias e testes.</description>
	<lastBuildDate>Thu, 28 Aug 2025 18:26:15 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.8.1</generator>

<image>
	<url>https://visaocomputacional.com.br/wp-content/uploads/2021/12/cropped-logo-150x150-1-32x32.png</url>
	<title>Pontos Faciais &#8211; Visão Computacional</title>
	<link>https://visaocomputacional.com.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Experimento &#8211; Detecção de piscadas e contador de piscadas com OpenCV e Dlib</title>
		<link>https://visaocomputacional.com.br/deteccao-e-contagem-de-piscadas-com-opencv-e-dlib/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deteccao-e-contagem-de-piscadas-com-opencv-e-dlib</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Thu, 21 Oct 2021 11:53:02 +0000</pubDate>
				<category><![CDATA[Experimentos]]></category>
		<category><![CDATA[Contador Piscadas]]></category>
		<category><![CDATA[Detecção Piscadas]]></category>
		<category><![CDATA[Dlib]]></category>
		<category><![CDATA[facemark]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[Pontos Faciais]]></category>
		<guid isPermaLink="false">http://visaocomputacional.com.br/?p=2297</guid>

					<description><![CDATA[<p>Apresentação dos resultados dos experimentos na detecção de piscadas com as bibliotecas OpenCV e Dlib.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/deteccao-e-contagem-de-piscadas-com-opencv-e-dlib/">Experimento &#8211; Detecção de piscadas e contador de piscadas com OpenCV e Dlib</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<div class="ratio ratio-16x9"><iframe loading="lazy" title="VC - Experimento - Detecção de piscadas e contador de piscadas com OpenCV e Dlib" width="800" height="450" src="https://www.youtube.com/embed/6Fi8jTeIG8s?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
</div></figure>



<p>Neste vídeo, apresento os resultados obtidos no experimento de detecção e contagem de piscadas com a webcam.</p>



<p>Para realizar este experimento, foi necessário coletar o contorno dos olhos através da detecção de pontos faciais do rosto e criar um pequeno controlador que verifica a proporção do olho aberto e fechado.&nbsp; Este controlador verifica se o olho foi fechado e depois verifica se o olho voltou a estar aberto, ao realizar finalizar este processo contabiliza uma piscada.</p>



<p>A coleta dos pontos faciais foi realizada com a biblioteca OpenCV e Dlib, que por padrão informa 6 referências para cada olho. Os posts &#8220;Detecção de pontos faciais com <a href="http://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-opencv/">OpenCV&#8221;</a> e &#8220;Detecção de pontos faciais com <a href="http://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-dlib/">Dlib</a>&#8220;, detalham melhor esta coleta.</p>



<p>A proporção de olho aberto é calculada apenas dividindo a altura do olho pela largura do olho, conforme ilustrado na Fig 1. abaixo.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/calculo_proporcao_olho.png"><img loading="lazy" width="493" height="191" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/calculo_proporcao_olho.png" alt="" class="wp-image-2312" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/calculo_proporcao_olho.png 493w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/calculo_proporcao_olho-300x116.png 300w" sizes="(max-width: 493px) 100vw, 493px" /></a><figcaption>Fig 1. Informações utilizadas para calcular a proporção de olho aberto.</figcaption></figure></div>



<p>Caso você esteja se perguntando, &#8220;mas por que ele não utiliza apenas a informação da altura olho?&#8221;. Na imagem abaixo (Fig 2.) espero responder esta pergunta. Note, nesta imagem, que existem diversos tamanhos de olhos, se for considerado apenas a altura do olho aberto, para saber se o olho está fechando ou não, o controlador irá identificar piscadas apenas com um único tamanho de imagem de olho, e não para qualquer tamanho de olho encontrado.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/olho_diferente_tamanhos.png"><img loading="lazy" width="491" height="121" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/olho_diferente_tamanhos.png" alt="" class="wp-image-2319" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/olho_diferente_tamanhos.png 491w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/olho_diferente_tamanhos-300x74.png 300w" sizes="(max-width: 491px) 100vw, 491px" /></a><figcaption>Fig 2. Olhos com diferentes tamanhos na imagem.</figcaption></figure></div>



<p>Para calcular a largura do olho, basta calcular a distância euclidiana entre os pontos da lateral esquerda e lateral direita do olho. A Fig 3. ilustra o cálculo da distância euclidiana.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/distancia_euclidiana-1.png"><img loading="lazy" width="454" height="269" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/distancia_euclidiana-1.png" alt="" class="wp-image-2324" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/distancia_euclidiana-1.png 454w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/distancia_euclidiana-1-300x178.png 300w" sizes="(max-width: 454px) 100vw, 454px" /></a><figcaption>Fig 3. Fórmula distância euclidia.</figcaption></figure></div>



<p>E para calcular a altura dos olhos é preciso coletar o centro da parte superior e o centro da parte inferior do olho. O centro da parte superior é obtido somando os X e Y das posições 38 e 39 do olho e dividindo por 2, conforme Fig 1. E o centro da parte inferior é obtido da mesma forma, porém utilizando as posições 42 e 41. A Fig 4. ilustra todo o cálculo realizado para calcular a proporção do olho e a condicional para verificar se o olho está aberto e fechado.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/proporcao_olho_aberto.png"><img loading="lazy" width="591" height="338" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/proporcao_olho_aberto.png" alt="" class="wp-image-2328" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/proporcao_olho_aberto.png 591w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/proporcao_olho_aberto-300x172.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/proporcao_olho_aberto-150x85.png 150w" sizes="(max-width: 591px) 100vw, 591px" /></a><figcaption>Fig 4. Cálculo de proporção de olho aberto.</figcaption></figure></div>



<p>Todo o código fonte do projeto está disponível para replicação do experimento no link abaixo. Caso tenham dúvidas e sugestões de melhorias no post, deixe seu comentário abaixo.</p>



<p>Source:<br><a href="https://github.com/visaocomputacionalexemplos/experimentos_faciais/tree/main/identificar_piscada">https://github.com/visaocomputacionalexemplos/experimentos_faciais/tree/main/identificar_piscada</a></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/deteccao-e-contagem-de-piscadas-com-opencv-e-dlib/">Experimento &#8211; Detecção de piscadas e contador de piscadas com OpenCV e Dlib</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Detecção de pontos faciais (Facemark) com Dlib</title>
		<link>https://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-dlib/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deteccao-de-pontos-faciais-facemark-com-dlib</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Tue, 19 Oct 2021 14:03:07 +0000</pubDate>
				<category><![CDATA[Visão computacional]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[Dlib]]></category>
		<category><![CDATA[facemark]]></category>
		<category><![CDATA[Pontos Faciais]]></category>
		<category><![CDATA[shape predictor]]></category>
		<guid isPermaLink="false">http://visaocomputacional.com.br/?p=2192</guid>

					<description><![CDATA[<p>Saiba como realizar a detecção de pontos faciais, com a biblioteca Dlib, utilizando o algoritmo Shape Predictor de Kazemi.</p>
<p>O código fonte disponibilizado contém o modelo treinado para possibilitar a replicação do experimento.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-dlib/">Detecção de pontos faciais (Facemark) com Dlib</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<div class="ratio ratio-16x9"><iframe loading="lazy" title="VC - Detecção de pontos faciais (Facemark) com Dlib" width="800" height="450" src="https://www.youtube.com/embed/_ALx8It4Eqo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
</div></figure>



<p>Neste post, é apresentado como realizar a detecção de pontos faciais com o algoritmo de Kazemi, implementado na biblioteca Dlib utilizando Shape Predictor. Na primeira parte deste tutorial, é apresentado o conceito de shape predictor (preditor de forma/ponto de referência) e como ele pode se usado para prever localizações específicas em objetos estruturais.</p>



<p>Este conteúdo é continuação do post <a href="http://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-opencv-e-dlib/">Detecção de pontos faciais (Facemark) com OpenCV,</a> recomendo a leitura dele primeiro, para melhor entender os conceitos básicos aqui apresentados.</p>



<h2>Revisão de Conteúdo</h2>



<p>Caso você não queira ler o <a href="http://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-opencv-e-dlib/">post anterior</a>, segue uma rápida revisão do conteúdo.</p>



<p>Os pontos faciais, em visão computacional, como o próprio nome diz, são pequenas regiões faciais identificadas por uma numeração, conforme ilustra a Fig 1.. Estas regiões, são identificadas por um ponto e uma numeração que pode variar de técnica para técnica utilizada.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais.png"><img loading="lazy" width="150" height="150" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais-150x150.png" alt="" class="wp-image-1925" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais-150x150.png 150w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais-230x230.png 230w" sizes="(max-width: 150px) 100vw, 150px" /></a><figcaption>Fig 1. Principais pontos faciais utilizados.</figcaption></figure></div>



<p>Para realizar a detecção de pontos faciais, são necessárias as seguintes etapas antecessoras à coleta dos pontos na imagem: (1) identificar os rostos na imagem; (2) rotacionar o rosto caso necessário e (3) identificar os pontos faciais A Fig 2. Ilustra estas etapas..</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark.png"><img loading="lazy" width="300" height="105" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark-300x105.png" alt="" class="wp-image-1971" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark-300x105.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark-768x268.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark-600x209.png 600w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark.png 998w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption>Fig 2. Etapas antecessoras a detecção de pontos faciais.</figcaption></figure></div>



<h2>Algoritmo Shape Predictor de Kazemi</h2>



<p>&#8220;Shape Predictor&#8221; são utilizados para localizar coordenadas (x, y) específicas a partir de uma forma de entrada. O termo &#8220;Shape&#8221; é arbitrário, mas presume-se que a forma seja de natureza estrutural, como: rostos; mãos; dedos; etc <a href="#refs_r">[R]</a>.</p>



<p>Por exemplo, os rostos têm formas e tamanhos diversos, e todos eles compartilham características estruturais comuns: os olhos estão acima do nariz, o nariz está acima da boca, etc. O objetivo dos preditores de forma/ponto de referência, é explorar esse conhecimento estrutural e, com dados de treinamento suficientes, aprender como prever automaticamente a localização dessas estruturas <a href="#refs_r">[R]</a>.</p>



<p>Existem vários algoritmos preditores de forma. O algoritmo do preditor de forma implementado na biblioteca Dlib vem do artigo <a href="https://www.csc.kth.se/~vahidk/face_ert.html">CVPR de Kazemi e Sullivan de 2014, One Millisecond Face Alignment with an Ensemble of Regression Trees </a> &nbsp;<a href="http://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-opencv-e-dlib/#ref_kj1">[KJ1]</a>.</p>



<h2>Código e Experimentos</h2>



<p>A seguir, são apresentados partes do código criado para realizar os experimentos de detecção de pontos faciais. Caso queira replicar estes experimentos, basta baixar o código fonte disponível no github (link na seção “Source” no final deste post).</p>



<p>Neste primeiro bloco, são inicializados todos os detectores do sistema, o detector facial e o detector de pontos faciais. Para iniciar todos estes detectores é muito simples, basta instanciar a classe <strong>dlib::frontal_face_detector</strong>, instanciar a classe <strong>dlib::shape_predictor</strong> e carregar o modelo treinado para a classe shape_predictor.</p>



<pre class="wp-block-preformatted">...
#include &lt; dlib/image_processing/frontal_face_detector.h &gt;
#include &lt; dlib/image_processing.h &gt;
<strong>dlib::frontal_face_detector detector;</strong>
<strong>dlib::shape_predictor shapePredictor;
</strong>
main() {
...
    // Inicia Detector faciauk
    <strong>detector = dlib::get_frontal_face_detector()</strong>;
    //Carrega o modelo treinado do shape predictor
    iniciarDetectorPontosFacialSP(shapePredictor);
...
}
void iniciarDetectorPontosFacialSP(dlib::shape_predictor &amp;sp)
{
    <strong>dlib::deserialize("../../extra/shape_predictor_68_face_landmarks.dat")</strong> &gt;&gt; sp;
}
</pre>



<p>Para carregar o modelo de dados com Dlib, basta utilizar a função de <strong>dlib::deserialize</strong> e informar o caminho do arquivo. Esta função carrega o modelo treinado e transfere os dados carregados para a classe de predição com o operador &#8220;&gt;&gt;&#8221;&nbsp; conforme trecho de código <strong>&#8220;&gt;&gt; sp&#8221;</strong>.</p>



<p>Com os detectores/preditores carregados, agora precisamos carregar a imagem com os rostos a serem detectados. Neste experimento, utilizamos a webcam para este fim e para carregar as imagens da webcam, utilizamos a biblioteca OpenCV, que é de fácil instalação.</p>



<p>Para capturar a câmera do vídeo com o OpenCV, basta instanciar a classe “cv::VideoCapturecap” e coletar a imagem do vídeo com o operador “&gt;&gt;” conforme trecho de código “cap&gt;&gt;img”.</p>



<pre class="wp-block-preformatted">main() {
  ...
  //Inicia captura dos vídeos
<strong>  cv::VideoCapturecap cap(0);</strong>
  if (!cap.isOpened()) {
    std::cout&lt;&lt;"Video Capture Fail"&lt;&lt;std::endl; return1; } cv::Mat img; cap&gt;&gt;img;
    return 1;
  }
  //Calcula nova dimensão da imagem para 320 pixels
  auto showSize = cv::Size(320, ((float)320 / img.cols) * img.rows);
  for (;;)
  {
    //Coleta a imagem da camera
    <strong>cap&gt;&gt;img;</strong>
    //Reescala a imagem para uma largura de 320 pixels
    cv::resize(img, img, showSize, 0, 0, cv::INTER_LINEAR_EXACT);
    <strong>coletarPontosFaciais(img);
</strong>
    cv::imshow("Origem", img);
    cv::waitKey(5);
  }
}
</pre>



<p>Por fim, no último trecho de código, é apresentado como coletar os pontos faciais com o OpenCV.</p>



<pre class="wp-block-preformatted">dlib::image_window win, win_faces;
std::vector&lt; dlib::rectangle &gt; rostosDetectados;
void coletarPontosFaciais(const dlib::array2d&amp; imagemOriginal)
{
    //Detecta os pontos faciais e retorna a lista de rostos detectados
    rostosDetectados = <strong>detector(imagemOriginal)</strong>;
    //Percorre os rostos detectados e coloca os pontos faciais
    <strong>std::vector&lt; dlib::full_object_detection &gt; pontosFaciais</strong>;
    for (unsigned long j = 0; j &lt; rostosDetectados.size(); ++j)
    {
        //Coleta os pontos faciais de um único rosto
        <strong>dlib::full_object_detection shape = shapePredictor(imagemOriginal, rostosDetectados[j]);</strong>
        pontosFaciais.push_back(shape);
    }
    // Exibe a imagem com o contorno dos pontos.
    win.clear_overlay();
    win.set_image(imagemOriginal);
    win.add_overlay(render_face_detections(pontosFaciais));
    // Recorta o rosto da imagem original e a exibe.
    dlib::array rostosRecortados;
    extract_image_chips(imagemOriginal, get_face_chip_details(pontosFaciais), rostosRecortados);
    win_faces.set_image(tile_images(rostosRecortados));
}
</pre>



<p>Observe que para detectar os rostos faciais com a classe dlib::frontal_face_detector, basta utilizar a variável <strong>detector&nbsp;</strong>como fosse uma função, passando a imagem como parâmetro. Ao utilizar o detector como função, serão detectados os rostos e retorna uma lista de retângulos com sua localização.</p>



<p>Com os rostos detectados, basta percorrer cada região dos rostos e chamar a função do <strong>shapePredictor</strong>, para coletar os pontos faciais. Esta função retorna uma lista com todos pontos localizados.</p>



<p>A classe <strong>dlib::image_window</strong> é utilizada para criar uma janela para exibição das imagens. A função render_face_detections é disponibilizada pela própria Dlib a fim de demarcar as regiões do rosto na imagem. E as funções extract_image_chips e get_face_chip_details recortam o rosto a partir dos pontos faciais. Como resultado deste projeto, foi realizado o experimento&nbsp;ilustrado&nbsp;pela Fig 3.&nbsp;</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/detecao_pontos_faciais_dlib.gif"><img loading="lazy" width="518" height="246" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/detecao_pontos_faciais_dlib.gif" alt="" class="wp-image-2273"/></a><figcaption>Fig 4. Resultados obtidos com este experimento</figcaption></figure></div>



<p>Espero que esse conteúdo os ajudem na tarefa de identificação de pontos faciais.&nbsp;<br>Caso tenham dúvidas e sugestões de melhorias no post, deixe seu comentário abaixo.</p>



<p>Source:</p>



<p><a href="https://github.com/visaocomputacionalexemplos/experimentos_faciais/tree/main/detectar_pontos_faciais_dlib">https://github.com/visaocomputacionalexemplos/experimentos_faciais/tree/main/detectar_pontos_faciais_dlib</a></p>



<p><strong>Referencias:</strong></p>



<p>Huber, Patrik. (2018). Real-time 3D morphable shape model fitting to monocular in-the-wild videos.</p>



<p>[R] <a href="https://www.pyimagesearch.com/2019/12/16/training-a-custom-dlib-shape-predictor/">Rosebrock, A, Training a custom dlib shape predictor, 2019, acessado em: 18/10/2101</a></p>



<p>[KJ1]&nbsp;<a style="background-color: #ffffff;" href="https://www.csc.kth.se/~vahidk/papers/KazemiCVPR14.pdf">V. Kazemi and J. Sullivan, “One millisecond face alignment with an ensemble of regression trees,”&nbsp;<em>2014 IEEE Conference on Computer Vision and Pattern Recognition</em>, 2014, pp. 1867-1874, doi: 10.1109/CVPR.2014.241.</a></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-dlib/">Detecção de pontos faciais (Facemark) com Dlib</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Detecção de pontos faciais (Facemark)  com OpenCV</title>
		<link>https://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-opencv/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deteccao-de-pontos-faciais-facemark-com-opencv</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Fri, 15 Oct 2021 13:10:42 +0000</pubDate>
				<category><![CDATA[Visão computacional]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[FacemarkAAM]]></category>
		<category><![CDATA[FacemarkKazemi]]></category>
		<category><![CDATA[FacemarkLBF]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[Pontos Faciais]]></category>
		<guid isPermaLink="false">http://visaocomputacional.com.br/?p=1906</guid>

					<description><![CDATA[<p>Saiba como realizar a detecção de pontos faciais, com a biblioteca OpenCV, utilizando os algoritmos FacemarkKazemi, FacemarkLBF e FacemarkAAM.</p>
<p>O código fonte disponibilizado contém os modelos treinados, para todos os 3 algoritmos.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-opencv/">Detecção de pontos faciais (Facemark)  com OpenCV</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<div class="ratio ratio-16x9"><iframe loading="lazy" title="VC - Detecção de pontos faciais (Facemark) com OpenCV" width="800" height="450" src="https://www.youtube.com/embed/RW8MxV3Dk1k?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
</div></figure>



<p>Neste tutorial, irei apresentar como detectar pontos faciais, quais as regiões importantes a serem utilizadas na detecção e apresentar resultados de experimentos realizados com as bibliotecas OpenCV.</p>



<p>Os pontos faciais podem ser utilizados para diversas finalidades e são uma grande área de estudo científico. As principais áreas e utilidades são: o reconhecimento de expressões e emoções, identificação de rosto cansado e sonolência, identificação de direção do rosto e alinhamento facial,&nbsp; detecção de piscadas e no auxílio do reconhecimento facial.</p>



<p>Podendo serem utilizados para vários fins, os algoritmos de detecção possuem um único objetivo, detectar pontos faciais.</p>



<h2>O que são pontos faciais</h2>



<p>Os pontos faciais, em visão computacional, como o próprio nome diz, são pequenas regiões faciais identificadas por uma numeração. Estas regiões, são identificadas por um ponto e uma numeração que pode variar de técnica para técnica utilizada.</p>



<p>Estes pontos têm como objetivo identificar os contornos dos olhos, nariz, boca e os arredores do rosto, iniciando na parte superior, pelas sobrancelhas, terminando na parte inferior no queixo. As orelhas, geralmente, não são identificadas ao coletar os pontos faciais, porém, caso seja necessário detectar estas regiões, os algoritmos disponibilizados pelo OpenCV (utilizados nos experimentos apresentados mais abaixo) estão preparados para serem treinados a fim de detectar estas regiões.</p>



<p>Os algoritmos de detecção facial, comumente, identificam 68 pontos faciais. Na Fig.1 são ilustrados estes pontos faciais e abaixo estão descritos as localizações destes pontos:</p>



<ul><li>Contorno do rosto: inicia no ponto 1 e termina no ponto 17;</li><li>Sobrancelha esquerda: inicia no ponto 18 e termina no ponto 22;</li><li>Sobrancelha direita: inicia no ponto 23 e termina no ponto 27;</li><li>Nariz: inicia no ponto 28 e termina no ponto 36;</li><li>Olho esquerdo: inicia no ponto 37 e termina no ponto 42;</li><li>Olho direito: inicia no ponto 43 e termina no ponto 46;</li><li>Contorno externo da boca: inicia no ponto 49 e termina no ponto 60;</li><li>Contorno interno da boca: inicia no ponto 61 e termina no ponto 68.</li></ul>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais.png"><img loading="lazy" width="390" height="312" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais.png" alt="" class="wp-image-1925" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais.png 390w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais-300x240.png 300w" sizes="(max-width: 390px) 100vw, 390px" /></a><figcaption>Fig 1. Principais pontos faciais utilizados. Autor: Huber, Patrik. (2018)</figcaption></figure></div>



<h2>Identificando pontos faciais</h2>



<p>Existem diversas formas de identificar pontos faciais, desde a utilização de morfologia matemática até redes neurais. Para se ter ideia, em uma rápida <a href="https://ieeexplore.ieee.org/search/searchresult.jsp?newsearch=true&amp;queryText=face%20landmark%20detection">busca pelos termos &#8220;face&#8221; &#8220;landmark&#8221; &#8220;detection&#8221;</a> só na biblioteca digital IEEE, foram encontrados 846 artigos publicados em revistas e conferências. É muito provável que boa parte destes artigos estejam relacionados a experimentos e muitos deles possuem técnicas semelhantes, porém, ilustra a variedades de trabalhos para tentar identificar pontos faciais.</p>



<p>Apesar de existirem diversos trabalhos com o objetivo de identificar pontos faciais, existe uma grande semelhança em todos eles, os pontos são detectados em imagens com apenas a região do rosto, no máximo um fundo ao redor do rosto, ou seja, para identificar os pontos faciais, antes é preciso coletar apenas o rosto da(s) pessoa(s) na imagem. Em alguns casos também é preciso rotacionar o rosto, a fim de deixar os olhos o mais alinhado possível. Todo este processo é necessário, porque estes algoritmos possuem um único objeto, encontrar os pontos faciais em rostos, e são treinados para identificá-los em rostos verticalmente alinhados ou pouco inclinados.</p>



<p>Com isto, podemos presumir, as seguintes etapas antecessoras à coleta dos pontos faciais na imagem: (1) identificar os rostos na imagem; (2) rotacionar o rosto caso necessário&nbsp; e (3) identificar os pontos faciais. A imagem da Fig.2 ilustra este processo.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark.png"><img loading="lazy" width="998" height="348" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark.png" alt="" class="wp-image-1971" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark.png 998w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark-300x105.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark-768x268.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark-600x209.png 600w" sizes="(max-width: 998px) 100vw, 998px" /></a><figcaption>Fig 2. Etapas antecessoras a detecção de pontos faciais.</figcaption></figure></div>



<h2>Algoritmos AAM, LBF e Kazemi</h2>



<p>Dos diversos algoritmos existentes, 3 deles estão disponibilizados na biblioteca OpenCV: o algoritmo de detecção por Active Appearance Model (AAM) ou modelo de aparência ativa,&nbsp; o algoritmo de detecção por Local Binary Features (LBF) ou recursos binários locais e o algoritmo de Kazemi. Estes 3 algoritmos estão prontos para serem treinados e utilizados na detecção de pontos faciais. São esses algoritmos que são testados e apresentados neste post.</p>



<p>O algoritmo AAM foi apresentado pela primeira vez por Edwards, Cootes e Taylor no contexto da análise facial na 3ª Conferência Internacional sobre Reconhecimento de Rostos e Gestos, 1998 <a href="#ref_cet1">[CET1]</a><a href="#ref_cet2">[CET2]</a>. O segundo algoritmo LBF, proposto por Shaoqing Ren et al. realiza a deteção dos pontos por meio de regração <a href="#ref_rcws">[RCWS]. </a>E o terceiro algoritmo de <a href="https://www.csc.kth.se/~vahidk/face_ert.html">Kazemi</a>,&nbsp; desenvolvido em 2014 por Vahid Kazemi e Josephine Sullivan realiza a detecção por meio de um conjunto de árvores de regressão <a href="#ref_kj1">[KJ1]</a>.</p>



<p>Os autores do algoritmo AAM relatam, na&nbsp; European Conference, que a abordagem deste método pode ser utilizada para propósitos gerais (não só na detecção de pontos faciais) em visão computacional. <a href="#ref_cet3">[CET3]</a><a href="#ref_cet4">[CET4]</a>.</p>



<h2>Código e Experimentos</h2>



<p>A seguir, são apresentados partes do código criado para realizar os experimentos de detecção de pontos faciais. Caso queira replicar estes experimentos, basta baixar o código fonte disponível no github, link na seção &#8220;Source&#8221; no final deste post.</p>



<p>Neste primeiro bloco, são inicializados todos os detectores do sistema, o detector facial, o detector de olhos e os algoritmos de detecção de pontos faciais. Para iniciar todos estes detectores é muito simples, basta instanciar a classe <strong>cv::CascadeClassifier&nbsp;</strong>e informar o modelo treinado, para os detectores faciais e de olhos, e chamar a função create das classes FacemarkLBF, FacemarkAMM e FacemarkKazemi para iniciar os detectores de pontos faciais.</p>



<pre class="wp-block-preformatted">...
cv::Ptr&lt; cv::CascadeClassifier &gt; faceDetector;
cv::Ptr&lt; cv::CascadeClassifier &gt; eyeDetector;
cv::Ptr&lt; cv::face::Facemark &gt; facemark;
main() {
...
  //Inicia o detector de rostos por haarcascade
  faceDetector = iniciarDetectorFacial();
  //Inicia o detector de olhos por haarcascade
  eyeDetector = iniciarDetectorOlhos();
  //Inicia o detector de pontos faciais
  facemark = iniciarDetectorPontosFacialLBF();
  //facemark = iniciarDetectorPontosFacialAAM();
  //facemark = iniciarDetectorPontosFacialKazemi();
...
}
cv::Ptr iniciarDetectorFacial() {
 cv::Ptr faceDetector =<strong> new CascadeClassifier;</strong>
<strong> faceDetector-&gt;load("../../extra/haarcascade_frontalface_alt2.xml");</strong>
 return faceDetector;
}
cv::Ptr initSimpleEyeDetector() {
  cv::Ptr faceDetector = <strong>new CascadeClassifier;
  faceDetector-&gt;load("../../extra/haarcascade_eye.xml");</strong>
  return faceDetector;
}
cv::Ptr iniciarDetectorPontosFacialLBF() {
  cv::Ptr facemark = <strong>cv::face::FacemarkLBF::create();
  facemark-&gt;loadModel("../../extra/lbfmodel.yaml");</strong>
  return facemark;
}
cv::Ptr iniciarDetectorPontosFacialKazemi() {
&nbsp; cv::Ptr facemark = <strong>cv::face::FacemarkKazemi::create();
&nbsp; facemark-&gt;loadModel("../../extra/kazemi_model.dat");</strong>
&nbsp; return facemark;
}
cv::Ptr iniciarDetectorPontosFacialAAM()
{
&nbsp; cv::Ptr facemark = <strong>cv::face::FacemarkAAM::create();
&nbsp; facemark-&gt;loadModel("../../extra/aam_model.yaml");</strong>
&nbsp; return facemark;
}</pre>



<p>Observe que todos os detectores utilizam a função &#8220;<strong>load</strong>&#8221; e &#8220;<strong>loadModel</strong>&#8221; para carregar os modelos de dados treinados. Estes detectores não funcionam caso não seja informada a base de dados treinada. Junto com o código fonte, deste projeto, encontra-se a base de dados utilizada nos experimentos. Esta base de dados é extremamente simples e não é útil para projetos mais robustos e aplicações finais.</p>



<p>Note, que foi utilizado o detector facial e de olhos por Haarcascade, porém, nada impede de serem utilizados outros detectores faciais e olhos para este tipo de projeto, como técnica de pré-processamento.&nbsp;</p>



<p>No próximo bloco, abaixo, é capturado o vídeo para detecção dos pontos faciais, alterando a resolução da imagem para 320 pixels, a fim de facilitar o processamento dos detectores. Para capturar a câmera do vídeo com o OpenCV, basta instanciar a classe <strong>&#8220;cv::VideoCapturecap&#8221;</strong> e coletar a imagem do vídeo com o operador &#8220;&gt;&gt;&#8221; conforme trecho de código <strong>&#8220;cap&gt;&gt;img&#8221;</strong>.</p>



<pre class="wp-block-preformatted">main() {
  ...
  //Inicia captura dos vídeos
<strong>  cv::VideoCapturecap cap(0);</strong>
  if (!cap.isOpened()) {
    std::cout&lt;&lt;"Video Capture Fail"&lt;&lt;std::endl; return1; } cv::Mat img; cap&gt;&gt;img;
    return 1;
  }
  //Calcula nova dimensão da imagem para 320 pixels
  auto showSize = cv::Size(320, ((float)320 / img.cols) * img.rows);
  for (;;)
  {
    //Coleta a imagem da camera
    <strong>cap&gt;&gt;img;</strong>
    //Reescala a imagem para uma largura de 320 pixels
    cv::resize(img, img, showSize, 0, 0, cv::INTER_LINEAR_EXACT);
    <strong>coletarPontosFaciais(img);
</strong>
    cv::imshow("Origem", img);
    cv::waitKey(5);
  }
}</pre>



<p>E no último trecho de código, é apresentado como coletar os pontos faciais com o OpenCV.</p>



<pre class="wp-block-preformatted">...
void coletarPontosFaciais(cv::Mat imagemOriginal)
{
    cv::Mat imagemOriginalCinza;
    std::vector&lt; cv::Rect &gt; rostosDetectados;
    std::vector&lt; std::vector&lt; cv::Point2f &gt; &gt; pontosFaciais;
    cv::Mat imagemComPontosFaciais;
    {
        //Converte em tons de cinza e equaliza a imagem
        //Detecção por haarcascade funcionam bem com imagens equalizadas
        cvtColor(imagemOriginal, imagemOriginalCinza, cv::COLOR_BGR2GRAY);
        equalizeHist(imagemOriginalCinza, imagemOriginalCinza);
        //Detecta os rostos na imagem
        <strong>faceDetector-&gt;detectMultiScale</strong>(imagemOriginal, rostosDetectados);
    }
    if (rostosDetectados.size() != 0)
    {
        imagemComPontosFaciais = imagemOriginal.clone();
        //Demarca rosto na imagem original
        for (auto &amp;&amp;rostoDetec : rostosDetectados)
        {
            demarcarRostoDetectado(imagemOriginal, rostoDetec);
        }
        if (requerDetecaoDosOlhos) {
            //Detecta os pontos faciais com código personalizado para o algorítmo AAM
            facemarkAAMFit(static_cast&lt; cv::face::FacemarkAAM* &gt;(facemark.get()), eyeDetector,
                fitEmTonsDeCinza
                    ? imagemOriginalCinza
                    : imagemOriginal,
                rostosDetectados, 
                pontosFaciais);
        } else {
            //Detecta os pontos faciais
            pontosDetectados = <strong>facemark-&gt;fit(</strong>fitEmTonsDeCinza
                              ? imagemOriginalCinza
                              : imagemOriginal,
                          rostosDetectados, pontosFaciais);
        }
        if (pontosDetectados)
        {
            demarcarPontosFaciais(imagemComPontosFaciais, rostosDetectados, pontosFaciais);
            imshow("Pontos faciais", imagemComPontosFaciais);
        }
    }
    escreverQtdPiscadas(imagemOriginal, piscadas);
}
</pre>



<p>Observe que, a primeira etapa realizada é a detecção dos rostos através da função &#8220;<strong>faceDetector-&gt;detectMultiScale</strong>&#8220;, onde é informada uma imagem de entrada, e como resposta desta função, é devolvido um vetor de retângulos, com as regiões dos rostos encontrados. Mais abaixo, na função &#8220;<strong>facemark-&gt;fit&#8221;</strong>,&nbsp; é chamada a função que detecta os pontos faciais, esta função deve receber a imagem que contém os rostos e o vetor de retângulos, com as posições dos rostos encontrados. Por fim, a função fit, devolve todos os pontos faciais encontrados, de todos os rostos informados à ela.</p>



<p>Neste mesmo bloco de códigos, mencionado acima, encontrasse a função &#8220;<strong>facemarkAAMFit</strong>&#8220;, ela possui um código personalizado para realizar a coleta dos pontos faciais, com o algoritmo AAM. Esta personalização coleta informações de rotação e translação da imagem, a fim de rotacionar e ajustar a posição do rosto, etapa necessária para o algoritmo AMM. Esta função, está disponível no código fonte do github e foi copiada do próprio <a href="https://docs.opencv.org/4.1.2/d5/dd8/tutorial_facemark_aam.html">tutorial da OpenCV</a>.&nbsp;</p>



<p>As funções <strong>demarcarRostoDetectado</strong> e <strong>demarcarPontosFaciais</strong>, não são funções do OpenCV e foram criadas apenas para demarcarem as regiões do rosto e os pontos faciais detectados.&nbsp; Estas funções, também estão disponíveis no código fonte do projeto.</p>



<p>Como resultado deste projeto, foi realizado o experimento ilustrado pela Fig 3.&nbsp; Observe que o detector facial (etapa de pré-processamento) encontrou uma segunda face, que na verdade eram 3 potes. Por consequência desta falha, na detecção facial, o detector de pontos também tentou identificar os pontos faciais.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/detecao_pontos_faciais_opencv.gif"><img loading="lazy" width="600" height="250" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/detecao_pontos_faciais_opencv.gif" alt="" class="wp-image-2110"/></a><figcaption>Fig 3 .Resultados obtidos com este experimento.</figcaption></figure></div>



<p>Espero que esse conteúdo os ajudem na tarefa de identificação de pontos faciais.&nbsp;<br>Caso tenham dúvidas e sugestões de melhorias no post, deixe seu comentário abaixo.</p>



<p>Source:</p>



<p><a href="https://github.com/visaocomputacionalexemplos/experimentos_faciais/tree/main/detectar_pontos_faciais_opencv">https://github.com/visaocomputacionalexemplos/experimentos_faciais/tree/main/detectar_pontos_faciais_opencv</a></p>



<p><strong>Referencias:</strong></p>



<p>Huber, Patrik. (2018). Real-time 3D morphable shape model fitting to monocular in-the-wild videos.</p>



<p>[CET1] <a href="http://www.ai.mit.edu/courses/6.899/papers/aamFG98.pdf">Edwards, G. J.; Taylor, C. J.; Cootes, T. F. (1998). &#8220;Interpreting face images using active appearance models&#8221;. Proceedings Third IEEE International Conference on Automatic Face and Gesture Recognition. p. 300</a>[CET2] <a href="https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/cootes-eccv-98.pdf"><em>Cootes, T.F.;</em> Edwards, G.J.; <em>Taylor, C.J.</em>&nbsp;Active Appearance Models. Wolfson Image Analysis Unit,. Department of Medical Biophysics,</a>[CET3] <a href="https://doi.org/10.1007%2FBFb0054760">Cootes, T. F.; Edwards, G. J.; Taylor, C. J. (1998). &#8220;Active appearance models&#8221;. Computer Vision — ECCV&#8217;98. Lecture Notes in Computer Science. 1407. p. 484.</a>[CET4] <a href="https://doi.org/10.1109%2F34.927467">Cootes, T. F.; Edwards, G. J.; Taylor, C. J. (2001). &#8220;Active appearance models&#8221;. IEEE Transactions on Pattern Analysis and Machine Intelligence. 23 (6): 681. </a>&nbsp;[KJ1] <a href="https://www.csc.kth.se/~vahidk/papers/KazemiCVPR14.pdf">V. Kazemi and J. Sullivan, &#8220;One millisecond face alignment with an ensemble of regression trees,&#8221;&nbsp;<em>2014 IEEE Conference on Computer Vision and Pattern Recognition</em>, 2014, pp. 1867-1874, doi: 10.1109/CVPR.2014.241.</a>&nbsp;[RCWS] <a href="https://ibug.doc.ic.ac.uk/media/uploads/documents/tzimiro_pantic_iccv2013.pdf">S. Ren, X. Cao, Y. Wei and J. Sun, &#8220;Face Alignment at 3000 FPS via Regressing Local Binary Features,&#8221;&nbsp;<em>2014 IEEE Conference on Computer Vision and Pattern Recognition</em>, 2014, pp. 1685-1692, doi: 10.1109/CVPR.2014.218.</a></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-opencv/">Detecção de pontos faciais (Facemark)  com OpenCV</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
