<?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>Visão Computacional</title>
	<atom:link href="https://visaocomputacional.com.br/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:27:16 +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>Visão Computacional</title>
	<link>https://visaocomputacional.com.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>YOLO Versões 3 e 4 (Arquitetura)</title>
		<link>https://visaocomputacional.com.br/yolo-versoes-3-e-4-arquitetura/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=yolo-versoes-3-e-4-arquitetura</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Sat, 30 Mar 2024 14:23:25 +0000</pubDate>
				<category><![CDATA[Visão computacional]]></category>
		<category><![CDATA[Anchor Box]]></category>
		<category><![CDATA[Caixa delimitadora]]></category>
		<category><![CDATA[Caixas de âncora]]></category>
		<category><![CDATA[Camada Convolucional]]></category>
		<category><![CDATA[Darknet]]></category>
		<category><![CDATA[Feature Pyramid Networks]]></category>
		<category><![CDATA[FPN]]></category>
		<category><![CDATA[PAN]]></category>
		<category><![CDATA[Path Aggregation Network]]></category>
		<category><![CDATA[ResNet]]></category>
		<category><![CDATA[Spatial Pyramid Polling]]></category>
		<category><![CDATA[SSP]]></category>
		<category><![CDATA[YOLO]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=5157</guid>

					<description><![CDATA[<p>Este artigo, explana o funcionamento das versões 3 e 4 do YOLO, conforme descrito em seus artigos científicos, com foco no detalhamento de suas redes neurais. Detalhando quais são as camadas ocultas destas duas redes neurais e uma breve descrição de como é o funcionamento destas camadas. </p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/yolo-versoes-3-e-4-arquitetura/">YOLO Versões 3 e 4 (Arquitetura)</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Este artigo, explana o funcionamento das versões 3 e 4 do YOLO, conforme descrito em artigos científicos, com foco em suas redes neurais, detalhando quais são as camadas ocultas destas duas redes neurais e uma breve descrição de como é o funcionamento dessas camadas. </p>



<p>Alguns dos comportamentos realizados pela rede neural do YOLO v3 e v4 são idênticos ao das suas versões 1 e 2, que serão apresentadas de forma resumida neste artigo, destacando assim as melhorias das versões 3 e 4. Antes de prosseguir, recomendo a leitura dos artigos:  <a href="https://visaocomputacional.com.br/yolo-para-deteccao-de-objetos-visao-geral/">YOLO para Detecção de Objetos – Visão Geral</a> e <a href="https://visaocomputacional.com.br/yolo-versoes-1-e-2-arquitetura/">YOLO Versões 1 e 2 (Arquitetura)</a>.</p>



<h2>Como funciona?</h2>



<p>O YOLO utiliza uma rede neural profunda (DNN – Deep Neural Network), rede neural convolucional, cuja a arquitetura é chamada de Darknet, com o mesmo nome do framework utilizado para implantá-la. Sua implementação foi desenvolvida na linguagem C, porém, com a ajuda da comunidade e empresas, já está disponível em várias outras linguagens de programação.</p>



<p>O YOLO cria diversas caixas delimitadoras, para cada caixa é atribuído um valor de confiança, com a porcentagem (0 até 1) de existir um objeto, também é realizada a predição de que tipo de objeto existe na caixa. O valor de confiança para a caixa delimitadora e a predição da classe são combinados em uma pontuação final, que vai informar a probabilidade dessa caixa conter um objeto específico. Por fim, é realizado o processo de supressão não máxima, a fim de “filtrar”/”eliminar” falsos objetos e mesclar regiões de um mesmo objeto <a href="https://visaocomputacional.com.br/yolo-para-deteccao-de-objetos-visao-geral/#refs">[AG]</a>. </p>



<p>Nem todo o processo do YOLO é realizado dentro da Rede Neural, como por exemplo, a supressão não máxima, que elimina detecções repetidas de um mesmo objeto, é realizada fora da rede neural. O redimensionamento da imagem também é realizado fora da rede neural, assim como normalizar a quantidade e ordem de canais de cores da imagem.</p>



<p>É Importante lembrar, que atualmente a função de perda, responsável por treinar a rede neural YOLO, faz parte da biblioteca DarkNet, ou seja, independente de qual tecnologia for utilizada para usar o YOLO, será necessária a biblioteca DarkNet para treinar os classificadores. </p>



<h2>YOLO V3</h2>



<p>Em relação às suas versões anteriores, a versão 3 não possui grandes mudanças segundo o próprio autor, ao mencionar o seguinte texto na introdução do seu artigo <a href="https://pjreddie.com/media/files/papers/YOLOv3.pdf">YOLO v3</a>: <em>&#8220;Consegui fazer algumas melhorias no YOLO. Mas, honestamente, nada como super interessante, apenas um monte de pequenas mudanças que o tornam melhor.&#8221;</em> </p>



<p>Uma das principais melhorias no YOLO v3 é o uso de uma nova arquitetura CNN chamada Darknet-53. O Darknet-53 é uma variante com arquitetura ResNet que foi projetada especificamente para tarefas de detecção de objetos. Possui 53 camadas convolucionais, capaz de alcançar melhores precisões na detecção de objetos <a href="#refs">[KR]</a>.</p>



<p>Outra melhoria no YOLO v3 são as caixas de âncora (anchor boxes) com diferentes escalas e proporções. No YOLO v2, as caixas de âncora eram todas do mesmo tamanho, o que limitava a capacidade do algoritmo de detectar objetos de diferentes tamanhos e formas. No YOLO v3, as caixas de âncora são dimensionadas e suas proporções são variadas, para melhor corresponder ao tamanho e à forma dos objetos que estão sendo detectados <a href="#refs">[KR]</a>.</p>



<p>YOLO v3 também introduz o conceito de &#8220;redes de pirâmide de recursos&#8221; (FPN). FPNs são arquiteturas CNN usadas para detectar objetos em múltiplas escalas. Elas constroem uma pirâmide de mapas de características, com cada nível da pirâmide sendo usado para detectar objetos em uma escala diferente. Isso ajuda a melhorar o desempenho de detecção em objetos pequenos, pois o modelo é capaz de perceber objetos em escalas maiores <a href="#refs">[KR]</a>. No final deste artigo, o FPN, é melhor descrito.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="570" src="https://visaocomputacional.com.br/wp-content/uploads/2024/02/yolov3-1024x570.webp" alt="" class="wp-image-5588" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/02/yolov3-1024x570.webp 1024w, https://visaocomputacional.com.br/wp-content/uploads/2024/02/yolov3-300x167.webp 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/02/yolov3-768x427.webp 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/02/yolov3.webp 1100w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 1 &#8211; Arquitetura YOLO v3</figcaption></figure>



<h3 id="3888">Detecção em três escalas</h3>



<p id="c4e0">A arquitetura mais recente possui conexões de salto residuais (ResNet) e aumento da resolução<span class="has-inline-color has-black-color"> <a href="#refs">[KA]</a></span>.  Essas conexões de salto permitem que informações de gradiente passem pelas camadas, criando &#8220;rodovias&#8221; de informações, onde a saída de uma camada/ativação anterior seja adicionada à saída de uma camada mais profunda <a href="#refs">[DST]</a>. Isto permite que as informações das partes anteriores da rede sejam passadas para as partes mais profundas da rede, ajudando a manter a propagação do sinal mesmo em redes mais profundas. As conexões de salto são um componente crítico que permitiu o treinamento bem-sucedido de redes neurais mais profundas.</p>



<p>Você pode observas nas Figuras 1, os saltos residuais pelas camadas 36 e 61. Note que no final de cada salto existe o simbolo &#8220;*&#8221;, indicando que as informações do início do salto foram adicionadas (normalizadas) às informações da última camada dentro do bloco.</p>



<p id="c4e0">A característica mais notável da v3 é que ela faz detecções em três escalas diferentes, fornecidas precisamente pela redução da resolução das dimensões da imagem de entrada em 32, 16 e 8, respectivamente. A detecção é feita aplicando kernels de detecção 1 x 1 em mapas de recursos de três tamanhos diferentes em três locais diferentes na rede<span class="has-inline-color has-black-color"> <a href="#refs">[KA]</a></span><strong>.</strong></p>



<p id="dc79">A forma do kernel de detecção do YOLO v3 é <strong>1 x 1 x (B x (5 + C) )</strong>, onde B é o número de caixas delimitadoras que uma célula no mapa de recursos pode prever, o “5” corresponde aos 4 primeiros atributos da caixa delimitadora mais a confiança de um objeto, e o C é o número de classes treinadas. Por exemplo, na rede neural YOLO v3 treinado com COCO DataSet, com 3 caixas delimitadoras(B=3) e capacidade pra classificar 80 objetos (C=80),  teremos o tamanho de um kernel de 1 x 1 x (3 * (5 + 80)) = 255 <a href="#refs">[KA]</a>.</p>



<p id="99dd">A primeira detecção é feita pela 82ª camada. Para as primeiras 81 camadas, a imagem é amostrada pela rede, de modo que a 81ª camada tenha um passo(Stride) de filtro de 32. Se tivermos uma imagem de 416 x 416, o mapa de características resultante teria o tamanho de 13 x 13. Uma detecção é feito aqui usando o kernel de detecção 1 x 1, fornecendo um mapa de recursos de detecção de 13 x 13 x 255 <a href="#refs">[KA]</a>.</p>



<p id="6736">Em seguida, o mapa de características da camada 79 é submetido a algumas camadas convolucionais antes de ser amostrado em 2x para dimensões de 26 x 26. Este mapa de características é então concatenado em profundidade com o mapa de características da camada 61. Em seguida, os mapas de características combinados são novamente submetidos a algumas camadas convolucionais 1 x 1 para mesclar os recursos da camada anterior (61). Então, a segunda detecção é feita pela 94ª camada, produzindo um mapa de características de detecção de 26 x 26 x 255 <a href="#refs">[KA]</a>.</p>



<p id="2ccf">Um procedimento semelhante é seguido novamente, onde o mapa de características da camada 91 é submetido a algumas camadas convolucionais antes de ser concatenado em profundidade com um mapa de características da camada 36. Como antes, algumas camadas convolucionais 1 x 1 seguem para fundir as informações da anterior camada (36). A terceira e ultima detecção na 106ª camada é realizada, produzindo um mapa de características de tamanho 52 x 52 x 255 <a href="#refs">[KA]</a>.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida1-1024x500.png" alt="" class="wp-image-5928" width="840" height="410" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida1-1024x500.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida1-300x146.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida1-768x375.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida1-1536x750.png 1536w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida1.png 1602w" sizes="(max-width: 840px) 100vw, 840px" /><figcaption>Figura 2 &#8211; Primeira saída YOLO v3 [DPB].</figcaption></figure></div>



<p>Cada kernel de detecção corresponde a apenas a um bloco de cada saída do Yolo. Observe na Figura 2, o tensor da primeira saída, onde cada célula da <strong>grade 13&#215;13</strong>, é responsável por prever <strong>3 caixas delimitadoras</strong>, que possuí as informações de suas <strong>coordenas</strong>, nas suas 4 primeiras posições,  seguida da <strong>pontuação de confiança</strong> (probabilidade da caixa conter um objeto), e uma <strong>pontuação de predição para cada classe</strong> de objeto treinado. </p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="501" src="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida2-1024x501.png" alt="" class="wp-image-5929" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida2-1024x501.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida2-300x147.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida2-768x375.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida2-1536x751.png 1536w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida2.png 1604w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 3 &#8211; Segunda saída YOLO v3 <a href="#refs">[DPB]</a>.</figcaption></figure>



<p>A mesma estrutura de classificação ocorre na segunda saída, porém agora com uma <strong>grade de 26&#215;26</strong>, maior que a saída anterior, pois nesta houve um aumento de resolução.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="500" src="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida3-1024x500.png" alt="" class="wp-image-5930" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida3-1024x500.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida3-300x146.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida3-768x375.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida3-1536x750.png 1536w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov3_saida3.png 1602w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 4 &#8211; Terceira saída YOLO v3 <a href="#refs">[DPB]</a>.</figcaption></figure>



<p>Não diferente das saídas anteriores, ocorre a mesma estrutura de classificação, porém com uma <strong>grade de 52&#215;52</strong>.</p>



<p><strong>Caixas de âncora</strong></p>



<p>Assim como a versão 2, a versão 3 também usa caixas de âncora. Caixas de âncora são um conjunto de caixas predefinidas com altura e largura específicas; eles atuam como uma estimativa. São múltiplas caixas delimitadoras predefinidas com diferentes proporções e tamanhos centralizados em cada píxel&nbsp;<a href="#refs">[SA]</a>. As caixas de ancoragem contêm a proporção de determinado objeto conforme ilustrado na Figura 9 e 10.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="554" height="404" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/image-1.png" alt="" class="wp-image-5042" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/image-1.png 554w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/image-1-300x219.png 300w" sizes="(max-width: 554px) 100vw, 554px" /><figcaption>Figura 5 – Caixas âncora&nbsp;<a href="#refs">[DPB2]</a>.</figcaption></figure></div>



<p>A versão do YOLO v2 não prevê diretamente as caixas delimitadoras, mas sim as probabilidades que correspondem às caixas âncoras lado a lado, e retorna um conjunto exclusivo de previsões para cada caixa de âncora definida. O uso de caixas de âncora permite que uma rede detecte vários objetos, podendo ser de diferentes escalas ou sobrepostos&nbsp;<a href="https://visaocomputacional.com.br/yolo-versoes-1-e-2-arquitetura/#refs">[DPB]</a>.</p>



<p>Para gerar as detecções finais de objetos, as caixas de âncora lado a lado que pertencem à classe de fundo são removidas, e as demais são filtradas por sua pontuação de confiança. As caixas de âncora com a maior pontuação de confiança são selecionadas usando supressão não máxima <a href="#refs">[DPB]</a>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="864" height="208" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/image.png" alt="" class="wp-image-5041" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/image.png 864w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/image-300x72.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/image-768x185.png 768w" sizes="(max-width: 864px) 100vw, 864px" /><figcaption>Figura 6 – Caixas de ancoragem com supressão não máxima&nbsp;<a href="#refs">[DPB2]</a>.</figcaption></figure>



<h3 id="a3f8">Mais caixas delimitadoras por imagem</h3>



<p id="b947">Para uma imagem de entrada do mesmo tamanho, o YOLO v3 prevê mais caixas delimitadoras do que o YOLO v2. Por exemplo, com sua resolução nativa de 416 x 416, o YOLO v2 previu 13 x 13 x 5 = 845 caixas. Em cada célula da grade, 5 caixas foram detectadas utilizando 5 âncoras.</p>



<p id="ba89">Por outro lado, o YOLO v3 prevê caixas em 3 escalas diferentes. Para a mesma imagem de 416 x 416, o número de caixas previstas é 10.647. Isso significa que&nbsp;<strong>o YOLO v3 prevê 10x o número de caixas previstas pelo YOLO v2.</strong>&nbsp;Você pode facilmente imaginar por que é mais lento que o YOLO v2. Em cada escala, cada grade pode prever 3 caixas usando 3 âncoras. Como existem três escalas, o número de caixas de ancoragem utilizadas no total é 9, 3 para cada escala <a href="#refs">[KA]</a>.</p>



<h3>Remoção da função SoftMax</h3>



<p id="bc13">Anteriormente no YOLO, os autores costumavam suavizar as pontuações da classe e considerar a classe com pontuação máxima, como a classe do objeto contido na caixa delimitadora. Isso foi modificado no YOLO v3 <a href="#refs">[KA]</a>.</p>



<p id="f1c0">As classes Softmaxing baseiam-se na suposição de que as classes são mutuamente exclusivas, ou seja, se um objeto pertence a uma classe, então ele não pode pertencer à outra <a href="https://visaocomputacional.com.br/wp-admin/post.php?post=5157&amp;action=edit#refs">[KA]</a>. Isso funciona bem para determinadas bases de dados<a href="#refs">.</a> No entanto, quando temos classes semelhantes, como&nbsp;homem&nbsp;e mulher, em um conjunto de dados, esta suposição falha. Esta é a razão pela qual os autores do YOLO se abstiveram de usar softmaxing nas classes. Em vez disso, cada pontuação de classe é prevista e um limite é usado para prever vários rótulos para um objeto. As classes com pontuação superior a esse limite são atribuídas à caixa <a href="#refs">[KA]</a>.</p>



<h3>Diferença da arquitetura YOLO v2 e YOLO v3</h3>



<p>Para facilitar o entendimento na mudança de arquitetura do yolo v2 e v3, observe na figura 5, a arquitetura do YOLO v2, descrita no artigo <a href="http://yolo-versoes-1-e-2-arquitetura">YOLO Versões 1 e 2</a>, ao lado da arquitetura do YOLO v3.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov2_x_yolov3-964x1024.png" alt="" class="wp-image-5927" width="840" height="892" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov2_x_yolov3-964x1024.png 964w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov2_x_yolov3-282x300.png 282w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov2_x_yolov3-768x816.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov2_x_yolov3-1445x1536.png 1445w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov2_x_yolov3.png 1594w" sizes="(max-width: 840px) 100vw, 840px" /><figcaption>Figura 5 &#8211; Comparação arquitetura YOLO v2 e YOLO v3 <a href="#refs">[DPB]</a>.</figcaption></figure>



<h2>YOLO v4</h2>



<p>O YOLO v4, passou a ser desenvolvido por outros desenvolvedores, pois o autor original parou suas pesquisas em visão computacional, devido a percepção do impacto dela na sociedade. Quem assumiu a continuadade do YOLO foram os autores Alexey Bochkovskiy, Chien-Yao Wang e Hong-Yuan Mark Liao.</p>



<p>O objetivo desta versão foi projetar um sistema rápido para funcionar em ambientes produdivos e otimizado para computação paralela, para que qualquer pessoa com uma GPU (Processador gráfico) convencional possa treinar e testar com resultados satisfatórios <a href="#refs">[ACH]</a>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="303" src="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_arquitetura-1024x303.png" alt="" class="wp-image-6000" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_arquitetura-1024x303.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_arquitetura-300x89.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_arquitetura-768x227.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_arquitetura-1536x454.png 1536w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_arquitetura.png 1691w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 6 &#8211; Arquitetura YOLO v4 <a href="#refs">[ACH]</a>. </figcaption></figure>



<p>Podemos dizer que o YOLO v4, em essência, consiste em três pilares principais, o backbone (espinha dorsal) para extração de recursos, o neck (pescoço) focado na agregação de recursos e a head (cabeça) para gerar detecções.</p>



<h4>Backbone (Espinha dorsal)</h4>



<p>O backbone YOLO é uma pilar de rede neural convolucional que agrupa pixels de imagem para formar recursos em diferentes granularidades. O Backbone normalmente é pré-treinado em um conjunto de dados de classificação, normalmente ImageNet. Backbone é a arquitetura de aprendizagem profunda que atua basicamente como um extrator de recursos. Todos os modelos de backbone são basicamente modelos de classificação.</p>



<p>Três backbones diferentes foram selecionados, durante o estudo do YOLO v4. Após análise rigorosa de diferentes parâmetros em benchmarks padrão, os autores finalizaram o CSPDarknet53 como a espinha dorsal e extrator de características da arquitetura YOLO v4 <a href="#refs">[ACH]</a>.</p>



<h4>Neck (Pescoço)</h4>



<p>O Neck do YOLO combina e mistura as representações da camada ConvNet antes de passar para o pilar de previsão Head. Neck é um subconjunto do pilar backbone, basicamente coleta mapas de recursos de diferentes estágios do backbone. Em termos simples, é um agregador de recursos.</p>



<p>Neste pilar, os autores acoplaram camadas SPP (Spatial Pyramid Pooling) modificadas para aumentar o campo receptivo da rede, e PAN (Path Aggregation Networks) modificado para melhor concatenação de texturas locais e características globais da CSPDarknet53. No final do artigo, SSP e PAN, são melhor descritos. </p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="727" src="https://visaocomputacional.com.br/wp-content/uploads/2024/03/YoloV4_simplificado-1024x727.png" alt="" class="wp-image-6028" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/03/YoloV4_simplificado-1024x727.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/YoloV4_simplificado-300x213.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/YoloV4_simplificado-768x545.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/YoloV4_simplificado.png 1242w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 7 &#8211; Fluxo simplificado do YOLO v4 <a href="#refs">[DPB3]</a>.</figcaption></figure>



<h4>Head (Cabeça)</h4>



<p>Esta é a parte da rede que faz a caixa delimitadora e a previsão da classe. É guiado pelas três funções de perda YOLO para classe, caixa e objetividade.</p>



<p>Head também é conhecido como detector de objetos, encontra basicamente a região onde o objeto pode estar presente, mas não informa qual objeto está presente naquela região. No YOLO v4, temos detectores de dois estágios e detectores de um estágio, que são subdivididos em detectores baseados em âncora e detectores sem âncora.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="824" height="1024" src="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_simplificado_02-824x1024.jpeg" alt="" class="wp-image-6029" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_simplificado_02-824x1024.jpeg 824w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_simplificado_02-241x300.jpeg 241w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_simplificado_02-768x955.jpeg 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_simplificado_02-1235x1536.jpeg 1235w, https://visaocomputacional.com.br/wp-content/uploads/2024/03/yolov4_simplificado_02.jpeg 1554w" sizes="(max-width: 824px) 100vw, 824px" /><figcaption>Figura 8 &#8211; Fluxo simplificado do YOLO v4  <a href="#refs">[DPB3]</a></figcaption></figure>



<p>Se observar na imagem acima, a versão 4 é bastante semelhante ao YOLO v3. A maior diferença é que CSPDarknet é usado no Backbone e SPP e PANet são usados ​​no Neck, e todo o resto é quase igual. Se você analisar isso com muita profundidade, poderá ver uma pequena diferença, mas no geral, se você entender as três coisas acima corretamente, poderá entender o YOLO v4 <a href="#refs">[DPB]</a>.</p>



<h3>Diferença da arquitetura YOLO v3 e YOLO v4</h3>



<p>Para facilitar o entendimento na mudança de arquitetura do YOLO v2 e v3, a seguir, a Figura 9 ilustra as duas arquiteturas.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="947" height="1024" src="https://visaocomputacional.com.br/wp-content/uploads/2024/04/yolov3_x_yolov4-947x1024.png" alt="" class="wp-image-6119" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/04/yolov3_x_yolov4-947x1024.png 947w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/yolov3_x_yolov4-278x300.png 278w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/yolov3_x_yolov4-768x830.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/yolov3_x_yolov4-1421x1536.png 1421w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/yolov3_x_yolov4.png 1604w" sizes="(max-width: 947px) 100vw, 947px" /><figcaption>Figura 9 &#8211; Comparação arquitetura YOLO v3 e YOLO v4 <a href="#refs">[DPB]</a>.</figcaption></figure>



<h2>Material Complementar</h2>



<h3>FPN &#8211; Feature Pyramid Networks</h3>



<p>Ao fazer previsões para uma escala específica, o FPN aumenta a amostragem (2×) do fluxo descendente anterior e o adiciona à camada vizinha do fluxo ascendente, conforme Figura 11 <a href="#refs">[ST]</a>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="898" src="https://visaocomputacional.com.br/wp-content/uploads/2024/04/fpn-1024x898.webp" alt="" class="wp-image-6126" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/04/fpn-1024x898.webp 1024w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/fpn-300x263.webp 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/fpn-768x674.webp 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/fpn.webp 1100w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 11 &#8211; Estrutura da FPN original <a href="#refs">[ST]</a>.</figcaption></figure>



<p>A FPN é composta por um caminho ascendente e descendente. O caminho bottom-up é a rede convolucional usual para extração de características. À medida que subimos, a resolução espacial diminui. Com mais estruturas de alto nível detectadas, o valor semântico de cada camada aumenta <a href="#refs">[JH]</a>.</p>



<p>No caminho de cima para baixo, para construir camadas de resolução mais alta a partir de uma camada semântica rica. Embora as camadas reconstruídas sejam semânticas fortes, as localizações dos objetos não são precisas após toda a redução e aumento da resolução. Para contornar isto, são adicionadas conexões laterais entre as camadas reconstruídas e os mapas de características correspondentes para ajudar o detector a prever melhor a localização <a href="#refs">[JH]</a>. </p>



<p>No YOLOv4, o conceito FPN é gradualmente implementado/substituído pelo SAM, PAN e SPP modificados.</p>



<h3>SPP &#8211; Spatial Pyramid Pooling</h3>



<p>A camada Spatial Pyramid Pooling permite gerar recursos de tamanho fixo, qualquer que seja o tamanho de nossos mapas de recursos. Para gerar um tamanho fixo, ele usará camadas de pooling (exemplo Max Pooling) e gerará diferentes representações dos mapas de recursos.</p>



<p>Observe na figura 10, e suponha que a saída da camada convolicional (parte preta da figura) tenha 256 mapas de recursos.</p>



<ol><li>Primeiro, cada mapa de características é agrupado para se tornar um valor único (parte cinza). Então, o tamanho do vetor é (1, 256)</li><li>Em seguida, cada mapa de características é agrupado para ter 4 valores (par verde). Então, o tamanho do vetor é (4, 256)</li><li>Da mesma forma, cada recurso é agrupado para ter 16 valores (parte azul). Então, o tamanho do vetor é (16, 256)</li><li>Os 3 vetores criados nas 3 etapas anteriores são então concatenados para formar um vetor de tamanho fixo que será a entrada da próxima camada conectada.</li></ol>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="567" height="402" src="https://visaocomputacional.com.br/wp-content/uploads/2024/04/ssp.png" alt="" class="wp-image-6122" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/04/ssp.png 567w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/ssp-300x213.png 300w" sizes="(max-width: 567px) 100vw, 567px" /><figcaption>Figura 10. Uma estrutura de rede com uma camada de pooling de pirâmide espacial &#8211; SSP <a href="#refs">[KXSJ]</a>.</figcaption></figure></div>



<p>YOLOv4 usa um bloco SPP após CSPDarknet53 para aumentar o campo receptivo e separar os recursos mais importantes do backbone. O pool de pirâmide espacial consiste em pegar uma imagem de entrada e usar camadas convolucionais para extrair seu mapa de recursos, em seguida, usar o pool máximo de tamanho de janela 1 para gerar um conjunto de recursos e, em seguida, usar novamente o pool máximo de tamanho de janela 2. Repetindo este processo n vezes, você terá mapas de recursos de diferentes alturas e larguras, formando uma pirâmide. YOLO v4, em vez de aplicar SPP em uma única camada, divide o recurso ao longo da dimensão de profundidade da rede, aplica SPP em cada parte e, em seguida, combina-o novamente para gerar um mapa de recursos de saída <a href="#refs">[DPB]</a>.</p>



<h3>PAN &#8211; Path Aggregation Network</h3>



<p>O PANet, semelhante ao FPN, segue um caminho ascendente adicional ao caminho descendente seguido pela FPN. Isso ajuda a encurtar esse caminho usando conexões laterais limpas das camadas inferiores às superiores. Isso é chamado de conexão de&nbsp;<strong><em>“atalho”</em></strong>.</p>



<p>Na imagem abaixo, tirada do artigo Path Aggregation Network (PAN), um caminho de baixo para cima (b) é aumentado para tornar as informações da camada inferior mais fáceis de propagar para o topo. Na FPN, a informação espacial localizada viaja para cima na seta vermelha. Não está claramente demonstrado na imagem, mas o caminho vermelho passa por cerca de mais de 100 camadas. O PAN introduziu um caminho de atalho (o caminho verde) que leva apenas cerca de dez camadas para chegar à camada N₅ superior. Esses conceitos de curto-circuito disponibilizam informações localizadas refinadas para as camadas superiores.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="341" src="https://visaocomputacional.com.br/wp-content/uploads/2024/04/pan_original-1024x341.png" alt="" class="wp-image-6131" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/04/pan_original-1024x341.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/pan_original-300x100.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/pan_original-768x256.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/pan_original.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 12 &#8211; Figura 1. Ilustração do nosso framework. (a) Estrutura principal da FPN. (b) Aumento do caminho de baixo para cima. (c) Agrupamento de recursos adaptativos. (d) Caixa filial. (e) Fusão totalmente conectada <a href="#refs">[SLHJJ]</a>.</figcaption></figure>



<p>PANet convencionalmente adiciona as camadas vizinhas para fazer previsões de máscara usando o pool de recursos adaptativos. No entanto, esta abordagem é ligeiramente distorcida quando o PANet é empregado no YOLOv4, de modo que, em vez de adicionar as camadas vizinhas, uma operação de concatenação é aplicada a elas, o que melhora a precisão das previsões <a href="#refs">[MR]</a>.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="720" height="355" src="https://visaocomputacional.com.br/wp-content/uploads/2024/04/panmodificado_concat.png" alt="" class="wp-image-6134" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/04/panmodificado_concat.png 720w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/panmodificado_concat-300x148.png 300w" sizes="(max-width: 720px) 100vw, 720px" /><figcaption>Figura 13 &#8211; PAN modificado para o YOLO v4 <a href="#refs">[ACH]</a></figcaption></figure></div>



<p>Os PANs funcionam de forma semelhante aos FPNs, mas adicionaram um caminho de aumento de baixo para cima, como mostrado na Figura. 12, para que respostas de textura fortes de níveis baixos possam ser fundidas diretamente com respostas semanticamente ricas presentes em N5 usando um caminho de atalho <a href="#refs">[DPB]</a>.</p>



<p>No YOLO v4, <strong>o PAN Neck</strong> modificado é usado para agregação de recursos. Em vez de adição, a abordagem de concatenação é usada entre cada camada ascendente. Isso ajuda a conservar os recursos perdidos conforme Figura 15.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="867" src="https://visaocomputacional.com.br/wp-content/uploads/2024/04/panmodificado_yolo4-1024x867.png" alt="" class="wp-image-6124" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/04/panmodificado_yolo4-1024x867.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/panmodificado_yolo4-300x254.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/panmodificado_yolo4-768x651.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/04/panmodificado_yolo4.png 1400w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 14 &#8211; Estrutura do PAN original e modificado <a href="#refs">[DPB]</a>.</figcaption></figure></div>



<p><strong>Referências:</strong></p>



<p>[RJFA] YOLOv3: Redmon, Joseph and Farhadi, Ali, YOLO: An Incremental Improvement. <a href="https://pjreddie.com/media/files/papers/YOLOv3.pdf">Artigo.</a></p>



<p>[ACH] Alexey Bochkovskiy; Chien-Yao Wang; Hong-Yuan Mark Liao. YOLOv4: Optimal Speed and Accuracy of Object Detection. <a href="https://arxiv.org/pdf/2004.10934.pdf">Artigo</a></p>



<p>[KA] Kathuria, Ayoosh What’s new in YOLO v3? <a href="https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b">Acessado em 09/06/2024</a></p>



<p>[KR] Kundu, Rohit. YOLO: Algorithm for Object Detection Explained. <a href="https://www.v7labs.com/blog/yolo-object-detection#:~:text=In%20YOLO%20v2%2C%20the%20anchor,of%20the%20objects%20being%20detected.">Acessado em 08/02/2024</a>.</p>



<p>[DPB] Deep Learning Bible. Yolo V1 – EN –&nbsp;<a href="https://wikidocs.net/177719">Acessado em 15/02/2024</a>.</p>



<p>[DPB2] Deep Learning Bible. Anchor Boxes EN  <a href="https://wikidocs.net/188051">Acessado em 20/03/2024,</a></p>



<p>[DST] Data Science Team. Uma Visão Geral da ResNet e suas Variantes &#8211; <a href="https://datascience.eu/pt/aprendizado-de-maquina/uma-visao-geral-da-resnet-e-suas-variantes/">Acessado em 15/02/2024</a></p>



<p>[DPB3] Deep Learning Bible. V4 explicado em todos os detalhes <a href="https://wikidocs.net/167833">Acessado em 25/03/2024</a></p>



<p>[SA] Sharma, Aditya. Um detector de objetos melhor, mais rápido e mais forte (YOLOv2).&nbsp;<a href="https://pyimagesearch.com/2022/04/18/a-better-faster-and-stronger-object-detector-yolov2/">Acessado em 16/09/2023</a>.</p>



<p>[KXSJ] Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognitio. <a href="https://arxiv.org/abs/1406.4729v4">Artigo</a>.</p>



<p>[ST] Shreejal Trivedi; DetectoRS — A Comprehensive Review. <a href="https://medium.com/visionwizard/detectors-state-of-the-art-object-detector-from-google-research-e0b89abdd1fc">Acessado em 11/04/2024</a>.</p>



<p>[JH] Jonathan Hui. Understanding Feature Pyramid Networks for object detection (FPN). <a href="https://jonathan-hui.medium.com/understanding-feature-pyramid-networks-for-object-detection-fpn-45b227b9106c">Acessado em 12/04/2024.</a></p>



<p>[SLHJJ] Shu Liu; Lu Qi; Haifang Qin; Jianping Shi; Jiaya Jia†; Path Aggregation Network for Instance Segmentation. <a href="https://arxiv.org/pdf/1803.01534v4.pdf">Artigo</a>.</p>



<p>[MR] Milagre R. PANet: Path Aggregation Network In YOLOv4. <a href="https://medium.com/clique-org/panet-path-aggregation-network-in-yolov4-b1a6dd09d158">Acessado em 12/04/2024.</a></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/yolo-versoes-3-e-4-arquitetura/">YOLO Versões 3 e 4 (Arquitetura)</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>YOLO Versões 1 e 2 (Arquitetura)</title>
		<link>https://visaocomputacional.com.br/yolo-versoes-1-e-2-arquitetura/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=yolo-versoes-1-e-2-arquitetura</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Sun, 08 Oct 2023 19:53:46 +0000</pubDate>
				<category><![CDATA[Visão computacional]]></category>
		<category><![CDATA[Camada Convolucional]]></category>
		<category><![CDATA[Camada Totalmente Conectada]]></category>
		<category><![CDATA[Convolutional Neural Network]]></category>
		<category><![CDATA[Darknet]]></category>
		<category><![CDATA[Full Connected]]></category>
		<category><![CDATA[Intersection over Union]]></category>
		<category><![CDATA[IoU]]></category>
		<category><![CDATA[Non maximum suppression]]></category>
		<category><![CDATA[Normalização em Lote]]></category>
		<category><![CDATA[Supressão não máxima]]></category>
		<category><![CDATA[YOLO]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=3424</guid>

					<description><![CDATA[<p>Este artigo, explana o funcionamento das versões 1 e 2 do YOLO, conforme descrito em seus artigos científicos, com foco no detalhamento de suas redes neurais. Detalhando quais são as camadas ocultas destas duas redes neurais e uma breve descrição de como é o funcionamento destas camadas.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/yolo-versoes-1-e-2-arquitetura/">YOLO Versões 1 e 2 (Arquitetura)</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Este artigo, explana o funcionamento das versões 1 e 2 do YOLO, conforme descrito em seus artigos científicos, com foco no detalhamento de suas redes neurais. Detalhando quais são as camadas ocultas destas duas redes neurais e uma breve descrição de como é o funcionamento destas camadas. Uma introdução ao YOLO está disponível em <a href="https://visaocomputacional.com.br/yolo-para-deteccao-de-objetos-visao-geral/">YOLO para Detecção de Objetos  – Visão Geral</a>.</p>



<p><strong>Observação:&nbsp;</strong>Para melhor entender este artigo e os demais sobre YOLO, é necessário ter uma conhecimento geral sobre inteligência artificial e redesnNeurais.</p>



<p>Antes de detalhar esta rede neural, capaz de detectar diversos objetos em uma imagem, nos próximos 3 parágrafos é apresentado um resumo de seu funcionamento, para melhor entendimento.</p>



<h2>Como funciona?</h2>



<p>O YOLO utiliza uma rede neural profunda (DNN – Deep Neural Network), uma rede neural convolucional, cuja a arquitetura é chamado de Darknet, com o mesmo nome do framework utilizado para implantá-lo. Sua implementação foi desenvolvida na linguagem C, porém, com a ajuda da comunidade e empresas, já está disponível em várias outras linguagens de programação.</p>



<p>O YOLO cria diversas caixas delimitadoras, para cada caixa é atribuído um valor de confiança, com a porcentagem (0 até 1) de existir um objeto, também é realizada a predição de que tipo de objeto existe na caixa.&nbsp;O valor de confiança para a caixa delimitadora e a predição da classe são combinados em uma pontuação final, que vai informar a probabilidade dessa caixa conter um objeto específico. Por fim, é realizado o processo de supressão não máxima afim de “filtrar”/”eliminar” falsos objetos e mesclar regiões de um mesmo objeto <a href="https://visaocomputacional.com.br/yolo-para-deteccao-de-objetos-visao-geral/#refs">[AG]</a>. <span class="has-inline-color has-black-color">Todo esse processo</span>, é realizado dentro da própria rede neural? A resposta é não, nem toda a mágica acontece dentro dela, conforme explicações a seguir.</p>



<h2>Nem Tudo é Rede Neural</h2>



<p>Apesar da maior parte do processamento ser realizada em uma rede neural, duas etapas de processamento são realizados fora dela: a supressão não máxima e o redimensionamento da imagem para detecção.</p>



<p>A Supressão Não Máxima (Non Maximum Suppression), é uma etapa de pós-processamentos realizado pelo YOLO, por meio de algoritmos especializados. NMS é uma etapa de pós-processamento usada para melhorar a precisão e a eficiência da detecção de objetos. Na detecção de objetos, é comum que várias caixas delimitadoras sejam geradas para um único objeto em uma imagem. Essas caixas delimitadoras podem se sobrepor ou estarem localizadas em posições diferentes, mas todas representam o mesmo objeto. O NMS é usado para identificar e remover caixas delimitadoras redundantes ou incorretas e gerar uma única caixa delimitadora para cada objeto na imagem <a href="#refs">[KR]</a>. A Figura 1 ilustra o resultado deste processo.</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/08/supressao_nao_maxima.png" alt="" width="329" height="219"/><figcaption>Figura 1 &#8211; Sem e com supressão não máxima.</figcaption></figure></div>



<p>Na outra ponta da rede neural, é realizado um pré-processamento responsável por redimensionar a imagem, a fim de ter exatamente o mesmo tamanho (mesma quantidade de pixeis) que a camada de entrada desta rede neural. </p>



<p>Agora que eliminamos estas duas etapas, ficará menos complexo entender o que acontece dentro do YOLO.</p>



<h2>Rede Neural &#8220;Dinâmica&#8221;</h2>



<p>Outro ponto importante a entender é que a Darknet, responsável por treinar a rede neural do YOLO a partir do YOLO 2, também é responsável por dimensionar o tamanho da rede neural, durante seu treinamento, conforme o arquivo de configurações yolo.cfg.</p>



<p>Para se ter ideia, por meio deste arquivo, é possível informar a quantidade de classes que serão treinadas e também a quantidade de filtros que as camadas (layers) CNN possuirão. A modificação destas configurações, alterará a estrutura da rede neural, como a quantidade de layers ocultos e principalmente a quantidade de neurônios de saída.</p>



<p>Entender esse dinamismo, ajuda a entender que o YOLO não é uma rede neural de tamanho fixo e sim uma arquitetura de rede neural que pode ter tamanhos diferentes, para atender diferentes bases de dados com quantidades diferentes de classes.</p>



<h2>Função de Perda</h2>



<p>Caso você ainda não esteja acostumado a treinar redes neurais e não conhece esse termo, a função de perda (loss-function) ou de custo, tem o objetivo de “levar” o resultado do treinamento em direção à convergência, atuando no processo de ajuste dos pesos da rede neural <a href="#refs">[GFT]</a>. Em resumo, é a função/cálculo que ajusta os pesos da rede neural.</p>



<p>Esta função é crucial pra treinar qualquer rede neural e cada versão do YOLO possui sua própria função de perda, responsável por treinar a rede. As funções de perda do YOLO fazem parte da Darknet e estão descritas em seus artigos. Podemos dizer, que para utilizar o YOLO com qualquer outra biblioteca (Opencv, OpenVino, Tensorflow, etc), possuímos a dependência da Darknet para treiná-lo.</p>



<p>Mais detalhes sobre cada função de perda serão apresentado nas próximas seções.</p>



<h2>YOLO v1</h2>



<p>O YOLO v1 é representado na Figura 2, ele consiste em uma rede neural com 24 camadas de convolução (CNN), que atuam como um extrator de características, s<span class="has-inline-color has-black-color">eguidas</span> por 2 camadas totalmente conectadas, que são responsáveis pela classificação de objetos e regressão de caixas delimitadoras, e a saída final é um tensor de 7 x 7 x 30. Uma breve descrição do comportamento de cada uma das camadas (layer) do YOLO, é apresentada na última sessão deste artigo.</p>



<p>YOLO é uma CNN simples de caminho único e usa convoluções 1&#215;1 seguidas por convoluções 3&#215;3. A ativação Leaky ReLU é usada para todas as camadas, exceto a camada final, em que é usada uma função de ativação linear <a href="https://visaocomputacional.com.br/wp-admin/post.php?post=3424&amp;action=edit#refs">[TAV]</a>. No final do artigo são apresentadas breves descrições de como funciona cada um destes tipos de camadas.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="720" height="302" src="https://visaocomputacional.com.br/wp-content/uploads/2023/08/yolo_v1_autor.webp" alt="" class="wp-image-4965" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/08/yolo_v1_autor.webp 720w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/yolo_v1_autor-300x126.webp 300w" sizes="(max-width: 720px) 100vw, 720px" /><figcaption>Figura 2 &#8211; Rede Neural YOLO v1. Autor Joseph Redmon et al. <a href="#refs">[RJ1]</a>.</figcaption></figure>



<p>Podemos dizer que o YOLO, em essência, consiste em três pilares principais, o backbone (espinha dorsal) para extração de recursos, o neck (pescoço) focado na agregação de recursos e a head (cabeça) para gerar detecções. A imagem da Figura 3 ilustra essa ideia, que foi apresentada pelo autor 고민수 em <a href="#refs">DPB]</a>. Observar essa divisão de estrutura irá ajudar a entender as divisões de detecção do YOLO.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2023/08/yolo_backbone_neck_head-969x1024.png" alt="" class="wp-image-4958" width="840" height="887" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/08/yolo_backbone_neck_head-969x1024.png 969w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/yolo_backbone_neck_head-284x300.png 284w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/yolo_backbone_neck_head-768x812.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/yolo_backbone_neck_head-1453x1536.png 1453w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/yolo_backbone_neck_head.png 1612w" sizes="(max-width: 840px) 100vw, 840px" /><figcaption>Figure 3 &#8211; Rede neural YOLO v1 <a href="#refs">[DPB]</a>. </figcaption></figure>



<p><strong>A arquitetura do YOLO v1 não é complicada</strong>, na verdade, é apenas um backbone convolucional com duas camadas totalmente conectadas, muito parecido com uma arquitetura de rede de classificação de imagens.&nbsp;A parte inteligente do YOLO (a parte que o torna um detector de objetos) está na interpretação das saídas (head), dessas camadas totalmente conectadas <a href="#refs">[DPB]</a>.</p>



<p>Para fixar ainda mais a estrutura desta rede neural, observe nas imagens 4 e 5, que o fluxo do <strong>pilar backbone (<strong>espinha dorsal</strong>) </strong>vai afunilando até uma pequena saída. Este é um processo comum em camadas CNNs, que extraem características ou recursos. Na seção &#8220;Camada CNN&#8221;, será apresentada uma ferramenta que ilustra os efeitos deste tipo de camada.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="842" src="https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet-1024x842.png" alt="" class="wp-image-4957" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet-1024x842.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet-300x247.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet-768x631.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet-1536x1263.png 1536w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet.png 1562w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 4 &#8211; CNNs Yolo v1 <a href="#refs">[DPB]</a>.</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" width="734" height="1024" src="https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet_diag-734x1024.png" alt="" class="wp-image-4956" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet_diag-734x1024.png 734w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet_diag-215x300.png 215w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet_diag-768x1071.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet_diag-1101x1536.png 1101w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet_diag-1468x2048.png 1468w, https://visaocomputacional.com.br/wp-content/uploads/2023/08/darknet_diag.png 1564w" sizes="(max-width: 734px) 100vw, 734px" /><figcaption>Figura 5 &#8211; CNNs YOLO v1 <a href="#refs">[DPB]</a> .</figcaption></figure>



<p>Uma nota rápida sobre o backbone (espinha dorsal), é que&nbsp; os autores projetaram seu próprio backbone convolucional inspirado no GoogLeNet <a href="#refs">[DPB]</a>, mas vale ressaltar que é apenas um extrator de recursos.</p>



<p><strong>O pilar seguinte <strong>neck</strong> (<strong>pescoço)</strong></strong>, é um subconjunto que basicamente coleta mapas funcionais de diferentes estágios do backbone, ou seja, é um coletor de recursos. Estas camadas basicamente transformam os dados de entrada para o pilar head conseguir realizar sua tarefa de detecção de objeto.</p>



<p><strong>Vamos ampliar o</strong> <strong>último pilar head (cabeça)</strong> com um pouco mais de detalhes, nos referindo a ele como tensor de saída. A primeira coisa que você pode notar é que ele é uma camada totalmente conectada, mas com certeza não se parece com uma. Não se deixe enganar pela forma 3D, ela está totalmente conectada, não é produzida por uma convolução, apenas a remodelam, porque é mais fácil de interpretar em 3D. Alternativamente, você pode imaginar e enfileirar o tensor 3D em um longo vetor de comprimento. Seja como for que você imagine, está totalmente conectado, cada neurônio de saída está conectado a cada neurônio, no vetor antes dele <a href="#refs">[DPB]</a>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="320" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/output_tensor-1024x320.png" alt="" class="wp-image-4984" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/output_tensor-1024x320.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/output_tensor-300x94.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/output_tensor-768x240.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/output_tensor-1536x480.png 1536w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/output_tensor.png 1762w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 6 &#8211; Tensor de saída do YOLO v1 <a href="#refs">[DPB]</a>.</figcaption></figure>



<p>Portanto, cada célula é responsável por prever caixas de uma única parte da imagem, mais especificamente, cada célula é responsável por prever com precisão duas caixas para cada parte da imagem.&nbsp;Observe que existem 49 células e cada célula está prevendo duas caixas, então toda a rede irá prever apenas 98 caixas, esse número é fixo.</p>



<p>Para prever uma única caixa, a rede deve gerar uma série de coisas.</p>



<ul><li>Em primeiro lugar, deve codificar as coordenadas da caixa que o YOLO codifica como (x, y, w, h), onde x e y são o centro da caixa.&nbsp;O YOLO não gera as coordenadas reais da caixa, mas sim as coordenadas parametrizadas.&nbsp;A largura e a altura são normalizadas em relação à largura da imagem, portanto, se a rede gerar um valor de 1,0 para a largura, significa que a caixa deve abranger toda a imagem, da mesma forma, 0,5 significa que é metade da largura da imagem. Observe que a largura e a altura não têm nada a ver com a própria célula da grade, os x ésimos valores são parametrizados em relação à célula da grade, pois eles representam deslocamentos da posição da mesma.&nbsp;A célula da grade tem largura e altura iguais a 1/S.&nbsp;Se a rede gerar um valor de 1,0 para x, isso significa que o valor x da caixa é a posição x da célula da grade, mais a largura da célula da grade <a href="#refs">[DPB]</a>.</li><li>Em segundo lugar, o YOLO também prevê uma pontuação de confiança para cada caixa que representa a probabilidade da caixa conter um objeto.&nbsp;</li><li>Por último, o YOLO prevê uma pontuação (predição) para cada classe treinada, que é representada por um vetor de C valores, e a classe prevista é aquela com o maior valor.&nbsp;Agora, aqui está o problema, o YOLO não prevê uma classe para cada caixa, ele prevê uma classe para cada célula, mas cada célula está associada a duas caixas, portanto essas caixas terão a mesma classe prevista, embora possam ter formas e posições diferentes <a href="#refs">[DPB]</a>.</li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" width="796" height="1024" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/Yolo_V1_output-796x1024.png" alt="" class="wp-image-4983" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/Yolo_V1_output-796x1024.png 796w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/Yolo_V1_output-233x300.png 233w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/Yolo_V1_output-768x988.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/Yolo_V1_output-1194x1536.png 1194w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/Yolo_V1_output.png 1574w" sizes="(max-width: 796px) 100vw, 796px" /><figcaption>Figura 7 &#8211; Tensor de saída do YOLO v1 <a href="#refs">[DPB]</a>.</figcaption></figure>



<p>Os primeiros cinco valores codificam a localização e a confiança da primeira caixa, os próximos cinco codificam a localização e a confiança da próxima caixa e os 20 finais codificam as 20 classes. No total, o tamanho do vetor é 5 X B + C, onde B é o número de caixas, e C é o número de classes.</p>



<p>A maneira como o YOLO realmente prevê as caixas, é prevendo a escala alvo e os valores de desvio para cada precedente, estes são parametrizados<span class="has-inline-color has-vivid-red-color"> </span>pela<span class="has-inline-color has-vivid-red-color"> </span>normalização, largura e altura da imagem. Por exemplo, pegue a célula superior direita destacada no tensor de saída, da Figura 6, esta célula específica corresponde à célula superior direita na imagem de entrada,  ela representa uma caixa anterior, que terá largura e altura iguais à largura da imagem dividida por 7 e altura da imagem dividida por 7 respectivamente, sendo a localização no canto superior direito. As saídas desta única célula irão, portanto, deslocar e esticar a caixa precedente para novas posições que, esperançosamente, conterão o objeto <a href="#refs">[DPB]</a>.</p>



<p>Como a célula prevê duas caixas, ela deslocará e ampliará a caixa anterior de duas maneiras diferentes, possivelmente para cobrir dois objetos diferentes (mas ambos são restritos a ter a mesma classe). Você pode se perguntar por que ele está tentando fazer duas caixas, a resposta é porque provavelmente 49 caixas não são suficientes, especialmente quando há muitos objetos próximos uns dos outros, embora o que tende a acontecer durante o treinamento é que as caixas previstas se especializem. Sendo assim, uma caixa pode aprender a encontrar coisas grandes, a outra pode aprender a encontrar coisas pequenas, o que pode ajudar a generalização da rede para outros domínios <a href="#refs">[DPB]</a>.</p>



<p>Como nota final para ajudar no seu aprendizado, é razoável perguntar por que eles não previram uma classe para cada caixa e como seria a saída. Ainda teria 7 x 7 células, mas em vez de cada célula ter tamanho de 5 X B + C, você teria (5 + C) X B. Portanto, para duas caixas, você teria 50 saídas, e não 30. Isso não parece irracional e dá à rede a flexibilidade de prever duas classes diferentes no mesmo local <a href="#refs">[DPB]</a>.</p>



<h3>Treinamento YOLO v1</h3>



<p>YOLO é treinado de ponta a ponta, com uma arquitetura simples, que significa menos problemas para que coisas dêem errado. Os autores começam pré-treinando sua arquitetura no ImageNet e para fazer isso, eles usam as primeiras 20 camadas convolucionais, seguidas por um pool médio e depois, uma camada totalmente conectada com 1.000 saídas para as 1.000 classes ImageNet. Isso é algo padrão em classificação de imagens e eles afirmam que podem chegar perto da precisão de última geração (para a época) no ImageNet. Lembre-se de que eles estão fazendo isso apenas para pré treiná-lo <a href="#refs">[DPB]</a>.</p>



<p>Eles convertem a arquitetura para detecção de objetos descartando o pool médio e a camada totalmente conectada, adicionam mais algumas camadas convolucionais e configuram as camadas totalmente conectadas conforme descrito acima. A outra coisa que é feita é dobrar o tamanho da entrada, este é um truque comum para detectores de objetos, pois ajuda a ter uma resolução de entrada refinada, especialmente para encontrar objetos pequenos <a href="#refs">[DPB]</a>. O procedimento de treinamento em si não é notável, a parte inteligente do YOLO está na interpretação dos resultados, nas camadas que destaquei como <strong>head</strong> e tensor de saída.</p>



<p>O mais interessante do YOLO é a <strong>função de perda</strong>, que é o método que treina as saídas da rede da maneira que desejarmos, ou seja, responsável por treinar a parte que realiza a detecção de objetos na rede neural. A função de perda do YOLO foram criadas por seus autores. Na Figura 8, segue sua impressão retirada do artigo que deu origem ao YOLO.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="478" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/yolo_loss_total-1024x478.png" alt="" class="wp-image-5019" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/yolo_loss_total-1024x478.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/yolo_loss_total-300x140.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/yolo_loss_total-768x358.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/yolo_loss_total.png 1372w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 8 &#8211; Função de Perda YOLO v1. Autor: Joseph Redmon et al. <a href="#refs">[RJ1]</a>.</figcaption></figure>



<p>De modo geral, o YOLO prevê múltiplas caixas delimitadoras por célula da grade. Para calcular a perda do verdadeiro positivo, é desejado que apenas um delas seja responsável pelo objeto, para tanto, é selecionado aquele com maior IoU (intersecção sobre união) como a verdade fundamental. Esta estratégia leva à especialização entre as previsões da caixa delimitadora, onde cada previsão fica melhor em prever determinado tamanho e proporção.</p>



<p>O artigo <a href="https://wikidocs.net/167690">Yolo Loss Training</a> e <a href="https://pyimagesearch.com/2022/04/11/understanding-a-real-time-object-detection-network-you-only-look-once-yolov1/">Understanding &#8230; YOLOv1</a> detalham, por partes, a lógica e os cálculos da função de perda do YOLO v1.</p>



<h2>YOLO v2</h2>



<p>O objetivo do YOLO v2 foi reduzir os erros de localização e ao mesmo tempo superar a precisão da classificação. A ideia de Redmon e Farhadi era desenvolver um detector de objetos que fosse mais preciso que seus antecessores e mais rápido que eles. Porém, construir redes maiores e mais profundas ou reunir várias redes não era o desejado. Em vez disso, com uma abordagem simplificada de arquitetura de rede, eles se concentraram em reunir muitas ideias de outros trabalhos combinadas com suas novas técnicas. Como resultado, melhoraram o desempenho do YOLO em termos de velocidade e precisão <a href="#refs">[SA2]</a>.</p>



<p>A seguir alguns pontos que fizeram a versão 2 ter um desempenho melhor.</p>



<h3>Normalização em lote</h3>



<p>Foi adicionada uma camada de normalização em lote em todas as camadas convolucionais, que melhorou o mAP em 2% <a href="#refs">[RJ2].</a> A normalização ajudou a melhorar a convergência do treinamento da rede e eliminou a necessidade de outras técnicas de regularização, sem que a rede ficasse sobrecarregada com os dados de treinamento <a href="#refs">[SA2]</a>.</p>



<p>Na seção &#8220;Material Complementar&#8221;, será apresentada uma breve descrição sobre esta técnica.</p>



<h3>Caixas de âncora</h3>



<p>Uma das principais melhorias no YOLO v2 é o uso de caixas de ancoragem. As caixas âncora são um conjunto de caixas delimitadoras predefinidas com diferentes proporções e escalas. Ao prever caixas delimitadoras, o YOLO v2 usa uma combinação das caixas âncora e os deslocamentos previstos para determinar a caixa delimitadora final, isso permitiu o algoritmo lidar com uma ampla gama de tamanhos de objetos e proporções <a href="#refs">[KR].</a> YOLO v1 era um modelo sem âncora que previa as coordenadas das caixas diretamente, usando camadas totalmente conectadas em cada célula da grade <a href="#refs">[SA2]</a>.</p>



<p>Inspirado no Faster-RCNN, que prevê caixas de âncora, conhecidas como caixas B, o YOLO v2 também funciona com o mesmo princípio. Na versão 2 o YOLO remove as camadas totalmente conectadas e usa caixas de âncora para prever caixas delimitadoras, tornando-o totalmente convolucional <a href="#refs">[SA2]</a>.</p>



<p>O que exatamente são caixas de âncora? Caixas de âncora são um conjunto de caixas predefinidas com altura e largura específicas; eles atuam como uma estimativa. São múltiplas caixas delimitadoras predefinidas com diferentes proporções e tamanhos centralizados em cada pixel <a href="#refs">[SA2]</a>. As caixas de ancoragem contêm a proporção de determinado objeto conforme ilustrado na Figura 9 e 10.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="554" height="404" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/image-1.png" alt="" class="wp-image-5042" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/image-1.png 554w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/image-1-300x219.png 300w" sizes="(max-width: 554px) 100vw, 554px" /><figcaption>Figura 9 &#8211; Caixas âncora <a href="#refs">[DPB]</a>.</figcaption></figure></div>



<p>YOLO v2 não prevê diretamente as caixas delimitadoras, mas sim as probabilidades que correspondem às caixas âncora lado a lado, e retorna um conjunto exclusivo de previsões para cada caixa de âncora definida. O uso de caixas de âncora permite que uma rede detecte vários objetos, podendo ser de diferentes escalas ou sobrepostos <a href="#refs">[DPB]</a>.</p>



<p>Para gerar as detecções finais de objetos, as caixas de âncora lado a lado que pertencem à classe de fundo são removidas, e as demais são filtradas por sua pontuação de confiança. As caixas de âncora com a maior pontuação de confiança são selecionadas usando supressão não máxima <a href="#refs">[DPB]</a>.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="864" height="208" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/image.png" alt="" class="wp-image-5041" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/image.png 864w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/image-300x72.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/image-768x185.png 768w" sizes="(max-width: 864px) 100vw, 864px" /><figcaption>Figura 10 &#8211; Caixas de ancoragem com supressão não máxima <a href="#refs">[DPB]</a>.</figcaption></figure></div>



<p> </p>



<figure class="wp-block-image size-full"><img loading="lazy" width="850" height="356" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/YoloV2.png" alt="" class="wp-image-4989" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/YoloV2.png 850w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/YoloV2-300x126.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/YoloV2-768x322.png 768w" sizes="(max-width: 850px) 100vw, 850px" /><figcaption>Figura 11 &#8211;  Rede neural YOLO v2.</figcaption></figure>



<p>A Figura 12 ilustra estrutura do Darknet-19, as camadas convolucionais extratoras de características da imagem do YOLO v2.</p>



<figure class="wp-block-image"><img src="https://wikidocs.net/images/page/167664/Darknet_19_1.png" alt=""/><figcaption>Figura 12 &#8211; Arquitetura Base Darknet-19 <a href="#refs">[DPB]</a>.</figcaption></figure>



<p>A Figura 13 mostra a arquitetura de detecção de objetos, com a rede base mostrada no bloco Darknet-19 (pré-treinada com pesos ImageNet) e uma camada de passagem (concatenação) do bloco 5, do Darknet-19, à penúltima camada convolucional, para que o modelo aprenda recursos refinados e tenha um bom desempenho em objetos menores <a href="https://visaocomputacional.com.br/wp-admin/post.php?post=3424&amp;action=edit#refs">[SA2]</a>.</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector-936x1024.png" alt="" class="wp-image-4986" width="840" height="918" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector-936x1024.png 936w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector-274x300.png 274w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector-768x840.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector-1404x1536.png 1404w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector.png 1592w" sizes="(max-width: 840px) 100vw, 840px" /><figcaption>Figura 13 &#8211; YOLO v2 <a href="#refs">[DPB]</a>.</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="539" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector_2-1024x539.png" alt="" class="wp-image-4987" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector_2-1024x539.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector_2-300x158.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector_2-768x404.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector_2-1536x808.png 1536w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/V2_Feature_Vector_2.png 1604w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 14 &#8211; Saída YOLO v2 <a href="#refs">[DPB]</a>.</figcaption></figure>



<p>Na camada de saída, da versão 2, foi movida a previsão de classe do nível da célula para o nível da caixa delimitadora.&nbsp;Agora, cada previsão inclui 4 parâmetros para a caixa delimitadora, 1 pontuação de confiança da caixa e 20 probabilidades de classe,&nbsp;ou seja, 5 caixas delimitadoras com 25 parâmetros: 125 parâmetros por célula da grade.&nbsp;Assim como o YOLO v1, a previsão da confiança ainda prevê o IoU da verdade básica e da caixa proposta.</p>



<p>YOLO v2 imprime um mapa de recursos de tamanho 13 x 13.&nbsp;Desta forma, quando o tamanho do mapa de características é pequeno, é fácil prever um objeto grande, mas há um problema porque é difícil prever um objeto pequeno <a href="#refs">[DPB]</a>, como as dimensões espaciais do mapa de características de resolução mais alta, não combinam com o mapa de características de baixa resolução, o mapa de características de alta resolução 26 x 26 x 512 é transformado em 13 x 13 x 2048, que é então concatenado com o original 13 x 13 x 1024 características <a href="https://visaocomputacional.com.br/wp-admin/post.php?post=3424&amp;action=edit#refs">[SA2]</a>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="875" height="189" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/1_RuW-SCIML8SHc5_PrIE9-g.jpg" alt="" class="wp-image-5050" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/1_RuW-SCIML8SHc5_PrIE9-g.jpg 875w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/1_RuW-SCIML8SHc5_PrIE9-g-300x65.jpg 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/1_RuW-SCIML8SHc5_PrIE9-g-768x166.jpg 768w" sizes="(max-width: 875px) 100vw, 875px" /><figcaption>Figura 15 &#8211; Concatenando os recursos de alta resolução com os recursos de baixa resolução <a href="https://visaocomputacional.com.br/wp-admin/post.php?post=3424&amp;action=edit#refs">[SA2]</a>.</figcaption></figure>



<p>Para resolver este problema, a versão 2 extrai o mapa de características antes do último agrupamento para obter um mapa de características de tamanho 26 x 26 (x 512).&nbsp;Então, o mapa de características é dividido em 4, mantendo o canal, e então combinado (concatenação) para obter um mapa de características com tamanho de 13 x 13 (x 2048). Adicione isso ao 13 x 13 (x 1024) mapa de recursos para obter um mapa de recursos de tamanho 13 x 13(x 3072) <a href="#refs">[DPB]</a>. </p>



<p>Para facilitar o entendimento, imagine que em vez de ter apenas 2048 característica para analisar cada grade terá 3072 características, unindo o mapa de características de baixa (1024) e alta (2048) resolução.</p>



<h2>Treinamento </h2>



<p>O treinamento YOLO v2 é composto por 2 fases, onde primeiro é treinada uma rede classificadora como VGG16 e em seguida, substituídas as camadas totalmente conectadas por uma camada de convolução, então o YOLO é treinado novamente de ponta a ponta para a detecção de objetos.&nbsp;O YOLO v2 começa o treinamento com imagens (224 x 224) para o treinamento do classificador, mas depois reajusta o classificador novamente com imagens (448 x 448) usando muito menos épocas, isso facilita o treinamento do detector e aumenta o mAP em 4% <a href="#refs">[DPB]</a>.</p>



<h3>Treinamento multiescala</h3>



<p>Depois de remover as camadas totalmente conectadas, o YOLO v2 pode capturar imagens de tamanhos diferentes.&nbsp;Se a largura e a altura forem duplicadas, estaremos apenas fazendo 4 x células da grade de saída e portanto, 4 x previsões.&nbsp;Como a rede YOLO reduz a resolução da entrada em 32, só precisamos ter certeza de que a largura e a altura são múltiplos de 32 <a href="https://visaocomputacional.com.br/wp-admin/post.php?post=3424&amp;action=edit#refs">[SA2]</a>. </p>



<p>Para cada 10 lotes, o YOLO v2 seleciona aleatoriamente outro tamanho de imagem para treinar o modelo, isso atua como um aumento de dados e força a rede a prever bem as diferentes dimensões e escalas da imagem de entrada.&nbsp;Além disso, podemos usar imagens de resolução mais baixa para detecção de objetos em detrimento da precisão <a href="#refs">[DPB]</a>.</p>



<p>Este tipo de treinamento permite que a rede faça previsões em diferentes resoluções de imagem.&nbsp;A rede prevê muito mais rápido com entradas de tamanho menor, oferecendo uma compensação entre velocidade e precisão.&nbsp;A entrada de tamanho maior prevê uma previsão relativamente mais lenta em comparação com a menor, mas atinge a precisão máxima <a href="https://visaocomputacional.com.br/wp-admin/post.php?post=3424&amp;action=edit#refs">[SA2]</a>.&nbsp;</p>



<p>A abordagem de treinamento multiescala produziu um aumento de 1,5% no mAP <a href="#refs">[</a><span class="has-inline-color has-vivid-red-color"><a href="#refs">RJ2].</a></span></p>



<h2>Diferença Entre YOLO v1 e v2</h2>



<p>Na Figura 16, são apresentadas ilustrações das arquiteturas do YOLO v1 e v2 retiradas de <a href="https://wikidocs.net/167699">Deep Learning Bible</a>, para comparação.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="981" height="1024" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/YOLOVO_V2_vs_V1-981x1024.png" alt="" class="wp-image-5046" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/YOLOVO_V2_vs_V1-981x1024.png 981w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/YOLOVO_V2_vs_V1-287x300.png 287w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/YOLOVO_V2_vs_V1-768x802.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/YOLOVO_V2_vs_V1-1471x1536.png 1471w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/YOLOVO_V2_vs_V1.png 1582w" sizes="(max-width: 981px) 100vw, 981px" /><figcaption>Figura 16 &#8211; Diagrama YOLO v1 e v2 <a href="#refs">[DPB]</a>.</figcaption></figure>



<h2>Material Complementar</h2>



<h3>IoU (Intersection over Union)</h3>



<p>IoU é uma métrica crucial para avaliar modelos de segmentação, comumente chamada de Índice de Jaccard, pois quantifica quão bem o modelo pode distinguir objetos de seus planos de fundo em uma imagem. O IoU é usado em inúmeras aplicações de visão computacional, como veículos autônomos, sistemas de segurança e imagens médicas <a href="#refs">[SD]</a>.</p>



<p>Intersecção sobre União é uma métrica popular para medir a precisão da localização e calcular erros de localização em modelos de detecção de objetos. Ele calcula a quantidade de sobreposição entre duas caixas delimitadoras – uma caixa delimitadora prevista e uma caixa delimitadora da verdade básica <a href="#refs">[SD]</a>.</p>



<p>IoU é a razão entre a intersecção das áreas das duas caixas e suas áreas combinadas. A caixa delimitadora da verdade básica e a caixa delimitadora antecipada abrangem a área de união, que é o denominador <a href="#refs">[SD]</a>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="854" height="608" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/IoU_boundingbox-1.webp" alt="" class="wp-image-5016" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/IoU_boundingbox-1.webp 854w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/IoU_boundingbox-1-300x214.webp 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/IoU_boundingbox-1-768x547.webp 768w" sizes="(max-width: 854px) 100vw, 854px" /><figcaption>Figura 17 &#8211; Intersecção sobre União (IoU) <a href="#refs">[SD]</a></figcaption></figure>



<p>Caso queira entender mais sobre IoU, acesse os artigos <a href="#refs">Intersection over Union (IoU): Definition, Calculation, Code</a> e <a href="https://wikidocs.net/177706">IoU (Intersection over Union) and GIoU</a> que detalham até questões de cálculos matemáticos.</p>



<h3>Normalização em Lote</h3>



<p><em>&#8220;A normalização em lote é um método usado durante o treinamento de redes neurais, onde a camada de entrada é normalizada ou padronizada. Esse processo envolve ajustar e escalar as ativações dos neurônios na rede, garantindo assim que eles tenham uma ativação média de saída zero e um desvio padrão de um. Essa técnica ajuda a reduzir a quantidade de desvio covariante interno, um problema que surge quando a distribuição das ativações da rede muda durante o treinamento&#8221;</em> <a href="#refs">[TS]</a>.</p>



<h3>Camada CNN &#8211; Rede Neural Convolucional</h3>



<p>Em resumo, as convoluções funcionam como filtros que enxergam pequenos quadrados e vão percorrendo por toda a imagem captando os traços mais marcantes. O filtro, que também é conhecido por kernel, é formado por pesos inicializados aleatoriamente, atualizando-os a cada nova entrada durante o processo de treinamento.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2023/08/cnn.gif" alt="" class="wp-image-4949" width="282" height="283"/><figcaption>Figura 18 &#8211; Ilustração processo de convolução de uma imagem por um núcleo.</figcaption></figure></div>



<p>Acesse <a href="https://en.wikipedia.org/wiki/Kernel_(image_processing)">kernel (núcleo) de processamento de imagens</a> para visualizar alguns efeitos de kernel 3 x 3 e o final da página <a href="https://setosa.io/ev/image-kernels/">Image Kernels</a> para reproduzir e simular estes efeitos.</p>



<h3>Camada Totalmente Conectada</h3>



<p>Como o próprio nome diz a camada totalmente conectada é uma camada, onde cada neurônio é conectado a todos os neurônios da camada anterior. </p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2023/09/camada_totalmente_conectada.webp" alt="" class="wp-image-5052" width="408" height="256" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/09/camada_totalmente_conectada.webp 699w, https://visaocomputacional.com.br/wp-content/uploads/2023/09/camada_totalmente_conectada-300x188.webp 300w" sizes="(max-width: 408px) 100vw, 408px" /><figcaption>Figura 19 &#8211; Camada totalmente conectada.</figcaption></figure></div>



<p id="refs"><strong>Referências:</strong></p>



<p>[AG] Alvez, Gabriel. Detecção de Objetos com YOLO – Uma abordagem moderna.&nbsp;<a href="https://iaexpert.academy/2020/10/13/deteccao-de-objetos-com-yolo-uma-abordagem-moderna/">Acessado em 15/07/2022</a>.</p>



<p>[RJ1] Redmo, Joseph; Divvala, Santosh; Girshick, Ross; Farhadi, Ali, You Only Look Once: Unified, Real-Time Object Detection. <a href="https://pjreddie.com/media/files/papers/yolo_1.pdf">Artigo.</a></p>



<p>[RJ2] Redmon, Joseph and Farhadi, Ali, YOLO9000: Better, Faster, Stronger.&nbsp;<a href="https://arxiv.org/pdf/1612.08242v1.pdf">Artigo</a>.</p>



<p>[KR] Kundu, Rohit. YOLO: Algorithm for Object Detection Explained [+Examples]. <a href="https://www.v7labs.com/blog/yolo-object-detection">Acessado em 15/08/2023</a>. </p>



<p>[TAV] Thatte, Abhijit V. Evolution of YOLO — YOLO version 1. <a href="https://towardsdatascience.com/evolution-of-yolo-yolo-version-1-afb8af302bd2">Acessado em 15/08/2023</a>.</p>



<p>[HC] Hsin, Carol.  Yolo Object Detectors: Final Layers and Loss Functions. <a href="https://medium.com/oracledevs/final-layers-and-loss-functions-of-single-stage-detectors-part-1-4abbfa9aa71c">Acessado em 23/08/2023</a>.</p>



<p>[GFT] GFT. Função de Perda na Rede Neural. <a href="https://blog.gft.com/br/2022/04/26/funcao-de-perda-na-rede-neural/">Acessado em 23/08/2023.</a></p>



<p>[SD] Shah, Deval. Intersection over Union (IoU): Definition, Calculation, Code . <a href="https://www.v7labs.com/blog/intersection-over-union-guide#:~:text=Intersection%20over%20Union%20(IoU)%20is,ranging%20from%200%20to%201.">Acessado em 23/09/2023</a>.</p>



<p>[SA] Sharma, Aditya. Understanding a Real-Time Object Detection Network: You Only Look Once (YOLOv1).  <a href="https://pyimagesearch.com/2022/04/11/understanding-a-real-time-object-detection-network-you-only-look-once-yolov1/">Acessado em 16/09/2023</a>.</p>



<p>[SA2] Sharma, Aditya. Um detector de objetos melhor, mais rápido e mais forte (YOLOv2). <a href="https://pyimagesearch.com/2022/04/18/a-better-faster-and-stronger-object-detector-yolov2/">Acessado em 16/09/2023</a>.</p>



<p>[TS] TS2. Como a Normalização em Lote de IA Melhora o Treinamento de Redes Neurais. <a href="https://ts2.space/pt/como-a-normalizacao-em-lote-de-ia-melhora-o-treinamento-de-redes-neurais-explorando-o-impacto-da-normalizacao-em-lote-de-ia-na-eficiencia-do-treinamento-de-redes-neurais/">Acessado em 16/09/2023</a></p>



<p>[DPB] Deep Learning Bible &#8211; Yolo V1 &#8211; EN &#8211; <a href="https://wikidocs.net/167699">https://wikidocs.net/167699</a>.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/yolo-versoes-1-e-2-arquitetura/">YOLO Versões 1 e 2 (Arquitetura)</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Programando Esqueletização e Extração de Fronteiras Morfológica com Javascript</title>
		<link>https://visaocomputacional.com.br/programando-esqueletizacao-e-extracao-de-fronteiras-morfologica-com-javascript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=programando-esqueletizacao-e-extracao-de-fronteiras-morfologica-com-javascript</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Mon, 19 Jun 2023 17:50:53 +0000</pubDate>
				<category><![CDATA[Experimentos]]></category>
		<category><![CDATA[Esqueletização]]></category>
		<category><![CDATA[Fronteiras]]></category>
		<category><![CDATA[Morfologia]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=4669</guid>

					<description><![CDATA[<p>Este artigo demonstra como programar a extração de fronteiras internas e externas, e esqueletização de imagens binárias apresentadas em Morfologia Matemática – Esqueletização de imagem e Morfologia Matemática – Extração de Fronteiras / Detecção de Bordas. A programação foi realizada na linguagem javascript, utilizando a biblioteca opencv.js e as imagens produzidas com a IDE OpenCV-Flow.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/programando-esqueletizacao-e-extracao-de-fronteiras-morfologica-com-javascript/">Programando Esqueletização e Extração de Fronteiras Morfológica com Javascript</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="Programando Extração de Fronteiras Morfológica com Javascript." width="800" height="450" src="https://www.youtube.com/embed/FLfueaozdHo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></div>
</div></figure>



<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="Programando Esqueletização Morfológica com Javascript." width="800" height="450" src="https://www.youtube.com/embed/tMaCqGAM8uI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></div>
</div></figure>



<p>Este artigo demonstra como programar a extração de fronteiras internas e externas, e esqueletização de imagens binárias apresentadas em <a href="https://visaocomputacional.com.br/morfologia-matematica-esqueletizacao-de-imagem/">Morfologia Matemática – Esqueletização de imagem</a> e <a href="https://visaocomputacional.com.br/morfologia-matematica-extracao-de-fronteiras-deteccao-de-bordas/">Morfologia Matemática – Extração de Fronteiras / Detecção de Bordas</a>. A programação foi realizada na linguagem javascript, utilizando a biblioteca&nbsp;<a href="https://docs.opencv.org/4.x/d5/d10/tutorial_js_root.html">opencv.js</a>&nbsp;e as imagens produzidas com a IDE&nbsp;<a href="https://opencvflow.org/pt">OpenCV-Flow</a>.</p>



<h3>OpenCV</h3>



<p>A biblioteca opencv.js disponibiliza diversas funcionalidade prontas para o processamento de imagens e visão computacional. Para utilizá-la, basta incluí-la no script da página&nbsp;conforme descrito em&nbsp;<a href="https://docs.opencv.org/4.x/d0/d84/tutorial_js_usage.html">Using OpenCV.js</a>.</p>



<h2>Extração de Fronteira Interna</h2>



<p>A fronteira interna, como apresentado no outro post citado,&nbsp;é o contorno da imagem binarizada. O cálculo consiste em subtrair da imagem o resultado da erosão da própria imagem, por um elemento estruturante.</p>



<p>A primeira etapa que iremos realizar é criar o núcleo de operação com o formato de quadrado. O elemento estruturante deve ser uma imagem binarizada (preto e branco). Como não temos imagens binárias no OpenCV, criaremos uma imagem em tons de cinza.</p>



<p>Na função nucleoFormatoCruz abaixo, é criada uma matriz de tamanho 3×3, com um canal de cor do tipo uint8, com valores entre 0 e 255:</p>



<pre class="wp-block-preformatted">function nucleoFormatoCruz() {
  return new cv.matFromArray(3, 3, cv.CV_8UC1, [
    0, 1, 0,
    1, 1, 1,
    0, 1, 0
  ]);
}</pre>



<p>Com o núcleo criado, basta realiza a erosão da imagem binarizada e depois subtrair a imagem original pelo resultado desta operação. A função abaixo realiza este processo com a biblioteca OpenCV.js:</p>



<pre class="wp-block-preformatted">function extrairFronteiraInterna(imagem, imagemSaida, nucleo) {
  let imgTemporaria = new cv.Mat(imagem.rows, imagem.cols, imagem.type(), new cv.Scalar(0));

  // Realiza a erosão com biblioteca opencv.
  cv.erode(imagem, imgTemporaria, nucleo);
  
  // Realiza a subtração da imagem pela mesma erodida
  cv.subtract(imagem, imgTemporaria, imagemSaida);
}</pre>



<p>A primeira operação realizada com a função cv.erode, recebe uma imagem de entrada, uma imagem que receberá o resultado da operação de erosão e o núcleo para a operação. </p>



<p>A segunda e última operação realizada é a subtração com a função cv.subtract, que recebe uma imagem de entrada, uma segunda imagem com os valores das subtrações a serem realizadas, e por fim uma imagem de saída que receberá o resultado desta operação.</p>



<p>É possível simplificar esta função conforme abaixo:</p>



<pre class="wp-block-preformatted">function extrairFronteiraInterna(imagem, imagemSaida, nucleo) {
  // Realiza a erosão com biblioteca opencv.
  cv.erode(imagem, imagemSaida, nucleo);
  
  // Realiza a subtração da imagem pela mesma erodida
  cv.subtract(imagem, imagemSaida, imagemSaida);
}</pre>



<p>Note que, foi informada a variável imagemSaida como segundo e terceiro parâmetro, da segunda operação. Foi realizado isto, pois a variável imagemSaida contém o resultado da erosão, que é preciso para subtrair os valores e para não precisarmos criar uma terceira variável, simplificando a função. Não há problemas em utilizar a mesma variável na operação cv.subtract, pois ela é uma operação não convolucional, que realiza apenas operações que utilizam um único pixel de cada vez.</p>



<h2>Extração de Fronteiras Externas</h2>



<p>A fronteira externa, na imagem binarizada, cria uma camada como uma vestimenta que cobre toda a imagem. O cálculo consiste em dilatar a imagem por um elemento estruturante e subtrair pela imagem original. De certa forma, o inverso da operação para extração da fronteira interna.</p>



<p>A primeira etapa para realizar esta operação, também consiste em criar um núcleo para a operação de dilatação. Utilizaremos o mesmo da seção anterior. Com o núcleo criado basta realizar as operações conforme a função abaixo:</p>



<pre class="wp-block-preformatted">function extrairFronteiraExterna(imagem, imagemSaida, nucleo) {
  let imgTemporaria = new cv.Mat(imagem.rows, imagem.cols, imagem.type(), new cv.Scalar(0));

  // Realiza a erosão com biblioteca opencv.
  cv.dilate(imagem, imgTemporaria, nucleo);
  
  // Realiza a subtração da imagem pela mesma erodida
  cv.subtract(imgTemporaria, imagem, imagemSaida);
}</pre>



<p>Observe que para extração da fronteira externa, foi trocada a operação de erosão pela dilatação com a função cv.dilate, e alterada a ordem dos parâmetros durante a subtração com a função cv.subtract.</p>



<h2>Esqueletização de Imagem Binarizada </h2>



<p>Pare realizar a esqueletização com morfologia, conforme apresentado em <a href="https://visaocomputacional.com.br/morfologia-matematica-esqueletizacao-de-imagem/">Morfologia Matemática – Esqueletização de imagem</a>, basta realizar quatro operações, dentro de um laço de repetição, e realizar a inicialização de algumas variáveis para este processamento.</p>



<p>Observe na função abaixo, que nas primeiras linhas, antes do laço while, foram inicializados variáveis para o processamento da esqueletização, criando uma imagem temporária chamada clone, com as mesmas informações da imagem original e um núcleo que é utilizado para reduzir a estrutura da imagem original.</p>



<pre class="wp-block-preformatted">function extrairEsqueleto(imagem, imagemSaida) {
  // Inicializa as matrizes
  const erosao = new cv.Mat(imagem.rows, imagem.cols, src.type());
  const abertura = new cv.Mat(imagem.rows, imagem.cols, src.type());
  const subtracao = new cv.Mat(imagem.rows, imagem.cols, src.type());

  // Clona a imagem original
  let clone = imagem.clone();
  // Cria o núcleo(3x3) em formato de cruz
  const nucleo = cv.getStructuringElement(cv.MORPH_CROSS, new cv.Size(3, 3), new cv.Point(-1, -1));

<strong><strong>  while (cv.countNonZero(clone) !== 0) {
    cv.erode(clone, erosao, nucleo); 
    cv.dilate(erosao, abertura, nucleo);

    cv.subtract(clone, abertura, subtracao);

    cv.bitwise_or(imagemSaida, subtracao, imagemSaida);

    clone = </strong>erosao<strong>.clone();</strong>
    GCStore.add(<strong>clone</strong>);<strong>
  }
</strong></strong>
  // Deleta as variáveis temporárias
  delete erosao;
  delete abertura;
  delete subtracao;
  delete clone;
}</pre>



<p>Após a inicialização das variáveis, é realizado um laço que verifica se a imagem clone está vazia (só com valores zero), caso não esteja, o laço fica realizando as seguintes operações:</p>



<ul id="block-7706de29-1bfa-4502-a250-c1d85e071358"><li>As duas primeiras operações realizadas, dentro do laço, consistem em realizar uma erosão, seguida de uma dilatação.<ul><li>Como resultado é criado uma abertura da imagem, pelo elemento estruturante em formato cruz;</li><li>Esta abertura remove os pontos das extremidades da imagem clone.</li></ul></li><li>A terceiraça operação, realiza a subtração da imagem clone pela imagem de abertura.<ul><li>Como resultado, na matriz subtração, estão apenas os pontos com as extremidades da imagem clone.</li></ul></li><li>Por fim, os pontos da extremidades, são salvos na imagem de saída.</li></ul>



<p>O processo é repetido até que a imagem clone seja zerada, durante o processo de erosão.</p>



<p>Note que, em cada laço realizado, é coletado os pontos da extremidades da imagem clone e salvo na imagem de saída, e em cada laço a imagem é diminuída de tamanho. Este processo resulta na criação do esqueleto da imagem.</p>



<h2>Cuidados</h2>



<p>Caso você vá utilizar a biblioteca opencv, saiba que as funções morfológicas dela também realizam morfologia matemática em imagens em tons de cinza e coloridas, que possuem resultados muito diferentes das operações morfológicas em imagens binarizadas. Lembre-se de converter a imagem em preto e branco, para realizar os experimentos aqui apresentados.</p>



<h2>Considerações</h2>



<p>As funções programadas neste post possuem caráter de estudo, afim de entender as etapas e os processos morfológicos, pois não foram pensadas em questões como desempenho nestes exemplos. Caso você precise utilizar este tipo de operação, é recomendado que utilize uma biblioteca preparada para isso, como o OpenCV ou similar.</p>



<p>O código aqui apresentado esta disponível no link abaixo:</p>



<p>Source code:&nbsp;<a href="https://github.com/visaocomputacionalexemplos/morfologia/blob/main/javascript/base/morfologia.html">https://github.com/visaocomputacionalexemplos/morfologia/blob/main/javascript/base/esqueletizacao.html</a></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/programando-esqueletizacao-e-extracao-de-fronteiras-morfologica-com-javascript/">Programando Esqueletização e Extração de Fronteiras Morfológica com Javascript</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Morfologia Matemática &#8211; Esqueletização de imagem</title>
		<link>https://visaocomputacional.com.br/morfologia-matematica-esqueletizacao-de-imagem/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=morfologia-matematica-esqueletizacao-de-imagem</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Thu, 18 May 2023 16:48:59 +0000</pubDate>
				<category><![CDATA[Sem Categoria]]></category>
		<category><![CDATA[Dilatação]]></category>
		<category><![CDATA[Dilate]]></category>
		<category><![CDATA[Erode]]></category>
		<category><![CDATA[Erosão]]></category>
		<category><![CDATA[Esqueletização]]></category>
		<category><![CDATA[Morfologia]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=4294</guid>

					<description><![CDATA[<p>Uma abordagem importante, para representação da forma de um objeto, é transformá-la em uma estrutura mais simples, chamada de esqueleto.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/morfologia-matematica-esqueletizacao-de-imagem/">Morfologia Matemática &#8211; Esqueletização de imagem</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Uma abordagem importante, para representação da forma de um objeto, é transformá-la em uma estrutura mais simples, chamada de esqueleto. O esqueleto de um objeto pode ser obtido por meio de diversas técnicas, como transformada de distância, afinamento de objetos entre outras.</p>



<p>Neste artigo, será apresentado como utilizar a morfologia para extração do esqueleto de uma imagem binarizada. Acesse <a href="https://visaocomputacional.com.br/morfologia-matematica-para-processamento-de-imagens/">Morfologia Matemática para Processamento de Imagens</a>, para entender sobre erosão e dilatação, operações que são a base dos cálculos apresentados a seguir.</p>



<h3>Transformada do eixo-médio</h3>



<p>A transformada do eixo-médio, proposto por Blum (1967), determina o conjunto de pontos que estão mais próximos da borda do objeto. De uma maneira formal, o eixo médio de um objeto é composto pelos centros das maiores circunferências que cabem no objeto. A figura 1 ilustra essa definição para um retângulo <a href="#refs">[PS]</a>.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-11.png" alt="" class="wp-image-4356" width="527" height="243" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-11.png 480w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-11-300x138.png 300w" sizes="(max-width: 527px) 100vw, 527px" /><figcaption>Fig 1- Esqueleto de um retângulo definido a partir da transformada do eixo-médio <a href="#refs">[RSA]</a>.</figcaption></figure></div>



<p>Embora a transformada do eixo médio resulte em um esqueleto aceitável. Sua utilização na prática resulta em um problema em termos computacionais. Tal implementação envolve o cálculo da distância entre cada ponto interior e da borda do objeto. Diversos algoritmos foram propostos para tentar melhorar a eficiência desta transformada <a href="#refs">[PS]</a>. </p>



<p>Outros exemplos de objetos e seu esqueletos são demonstrados na figura 2. Pode-se observar, nas duas primeiras imagens, que objetos e formas diferentes podem ter o mesmo esqueleto. </p>



<figure class="wp-block-image size-full"><img loading="lazy" width="840" height="703" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-8.png" alt="" class="wp-image-4295" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-8.png 840w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-8-300x251.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-8-768x643.png 768w" sizes="(max-width: 840px) 100vw, 840px" /><figcaption>Fig 2 &#8211; Ilustração de esqueleto de formas geométricas.</figcaption></figure>



<h3>Transformada de distância</h3>



<p>A transformada de distância corresponde ao mapa resultante da distância entre cada ponto interior do objeto e de sua borda mais próxima <a href="#refs">[PS]</a>. Essa transformação depende do tipo de cálculo de distância utilizado.</p>



<p>Um exemplo do processo da transformada de distância é ilustrado na figura 3, o esqueleto do objeto, formado pelos valores mais altos de distância, corresponde às regiões mais claras. O cálculo de distância utilizado é a distância euclidiana.</p>



<div class="wp-block-columns">
<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="253" height="373" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-12.png" alt="" class="wp-image-4368" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-12.png 253w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-12-203x300.png 203w" sizes="(max-width: 253px) 100vw, 253px" /></figure>
</div>



<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="253" height="373" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-13.png" alt="" class="wp-image-4369" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-13.png 253w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-13-203x300.png 203w" sizes="(max-width: 253px) 100vw, 253px" /><figcaption>Fig 3 &#8211; Transformada de distância. </figcaption></figure>
</div>



<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="253" height="373" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-14.png" alt="" class="wp-image-4370" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-14.png 253w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-14-203x300.png 203w" sizes="(max-width: 253px) 100vw, 253px" /></figure>
</div>
</div>



<p>Na figura 4, é ilustrada uma imagem binária, sua representação da transformada euclidiana e seu esqueleto criado, a partir dos valores mais altos (pontos claros).</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-15-1024x161.png" alt="" class="wp-image-4373" width="840" height="132" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-15-1024x161.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-15-300x47.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-15-768x121.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-15.png 1096w" sizes="(max-width: 840px) 100vw, 840px" /><figcaption>Fig 4 &#8211; Ilustração de transformada de distância <a href="#refs">[LQ]</a>.</figcaption></figure>



<h3>Processo de esqueletização com morfologia matemática</h3>



<p>A esqueletização de uma imagem binarizada por morfologia, apresentada a seguir, tem como base a transformada de distância. Todo o processo é bem simples, com apenas duas operações morfológicas e uma subtração, encadeadas em um laço é possível extrair o esqueleto.</p>



<p>Observe a imagem binarizada A e o elemento estruturante B, logo abaixo. Nas linhas seguintes, observe que:</p>



<ul><li>A primeira coluna apresenta a erosão por B da imagem da linha anterior;</li><li>A segunda coluna apresenta a dilatação da imagem da primeira coluna por B. A segunda coluna, também, corresponde a abertura da imagem da primeira coluna da linha anterior;</li><li>A terceira coluna apresenta a subtração da primeira coluna da linha anterior pela segunda.</li></ul>



<p>Por fim, na última linha, a imagem da terceira coluna de título &#8220;Resultado&#8221; apresentada a soma de todas as imagens da terceira coluna. Observe que essa somatória resultou no esqueleto da imagem retangular A.</p>



<div class="wp-block-columns are-vertically-aligned-center">
<div class="wp-block-column is-vertically-aligned-center">
<figure class="wp-block-image size-full"><img loading="lazy" width="250" height="178" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image.png" alt="" class="wp-image-4333"/><figcaption><strong>A</strong><br>Imagem binarizada</figcaption></figure>
</div>



<div class="wp-block-column is-vertically-aligned-center">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="82" height="83" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-9.png" alt="" class="wp-image-4348"/><figcaption><strong>B</strong><br>Elemento estruturante</figcaption></figure></div>
</div>



<div class="wp-block-column is-vertically-aligned-center"></div>
</div>



<div class="wp-block-columns">
<div class="wp-block-column is-vertically-aligned-top">
<p class="has-text-align-center"><strong>Erosão por B</strong><br></p>



<figure class="wp-block-image size-full"><img loading="lazy" width="250" height="178" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-1.png" alt="" class="wp-image-4334"/><figcaption><strong>A ⊖ B</strong><br>Erosão de A por B</figcaption></figure>
</div>



<div class="wp-block-column">
<p class="has-text-align-center"><strong>Dilatação da 1ª coluna por B</strong><br></p>



<figure class="wp-block-image size-full"><img loading="lazy" width="250" height="178" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-3.png" alt="" class="wp-image-4337"/><figcaption><strong>A ◦ B</strong><br>= (A ⊖ B) ⊕ B<br>Abertura de A por B</figcaption></figure>
</div>



<div class="wp-block-column">
<p class="has-text-align-center"><strong>Subtração da 1ª coluna da linha anterior pela 2ª coluna</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" width="250" height="178" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-4.png" alt="" class="wp-image-4338"/><figcaption><strong>A &#8211; (A ◦ B)</strong><br>A subtraída pela abertura de A por B</figcaption></figure>
</div>
</div>



<div class="wp-block-columns">
<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="250" height="178" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-2.png" alt="" class="wp-image-4336"/><figcaption><strong>A ⊖ B ⊖ B</strong><br>Erosão de A por B duas vezes</figcaption></figure>
</div>



<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="278" height="182" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-16.png" alt="" class="wp-image-4377"/><figcaption><strong>(A ⊖ B) ◦ B</strong><br>= (A ⊖ B) ⊖ B ⊕ B<br>Erosão de A por B, seguida da abertura por B</figcaption></figure>
</div>



<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="250" height="178" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-6.png" alt="" class="wp-image-4341"/><figcaption><strong>A &#8211; ((A ⊖ B) ◦ B</strong>)<br>Abertura de A por B <br>subtraída pela Erosão de A por B</figcaption></figure>
</div>
</div>



<div class="wp-block-columns">
<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="250" height="178" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-7.png" alt="" class="wp-image-4343"/><figcaption><strong>A ⊖ B ⊖ B ⊖ B</strong><br>Erosão de A por B três vezes</figcaption></figure>
</div>



<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="250" height="178" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-7.png" alt="" class="wp-image-4343"/><figcaption><strong>(A ⊖ B ⊖ B) ◦ B</strong><br>Erosão de A por B duas vezes, seguida da abertura por B</figcaption></figure>
</div>



<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="250" height="178" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-2.png" alt="" class="wp-image-4336"/><figcaption><strong>A &#8211; ((A ⊖ B ⊖ B) ◦ B)</strong><br>Abertura de A por B <br>subtraída pela Erosão de A por B</figcaption></figure>
</div>
</div>



<div class="wp-block-columns">
<div class="wp-block-column"></div>



<div class="wp-block-column"></div>



<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="250" height="178" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/image-8.png" alt="" class="wp-image-4345"/><figcaption>Resultado</figcaption></figure>
</div>
</div>



<h3>Exemplos</h3>



<p>A seguir, duas demonstrações de esqueletização, da palavra &#8220;OpenCV&#8221; e de uma imagem da digital de um dedo. O processo de extração do esqueleto da Figura 8 é carregar a imagem, suavizar a imagem com o filtro gaussiano, converter em tons de cinza, limiarizar/binarizar a imagem e extrair o esqueleto.</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/opencv-300x100-1.png" alt="" class="wp-image-4399" width="426" height="142"/><figcaption>Fig 6 &#8211; Texto &#8221; OpenCV&#8221; para extração do esqueleto <a href="#refs">[FA]</a>. </figcaption></figure></div>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="341" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/skel_opencv-1024x341.png" alt="" class="wp-image-4400" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/05/skel_opencv-1024x341.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/skel_opencv-300x100.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/skel_opencv-768x256.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/skel_opencv.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption> Fig 7 &#8211; Esqueleto da palavra &#8220;OpenCV&#8221; <a href="#refs">[FA]</a>. </figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="460" src="https://visaocomputacional.com.br/wp-content/uploads/2023/05/digital-1024x460.png" alt="" class="wp-image-4401" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/05/digital-1024x460.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/digital-300x135.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/digital-768x345.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/digital-1536x691.png 1536w, https://visaocomputacional.com.br/wp-content/uploads/2023/05/digital.png 1706w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Fig 8 &#8211; Extração do esqueleto da impressão digital, utilizando morfologia matemática com a ferramenta <a href="https://opencvflow.org/en">OpenCV-Flow</a>.</figcaption></figure>



<p id="refs"><strong>Referências</strong></p>



<p>[PS] Pedrini, H.; Schwartz, W. R.; Análise de Imagens Digitais: Princípios, Algoritmos e Aplicações. Thomson Learning, 2007</p>



<p>[LQ] Li, Quannan et al. “Skeleton Extraction Using SSM of the Distance Transform.” (2008).</p>



<p>[RSA] R. Fisher, S. Perkins, A. Walker and E. Wolfart. Skeletonization/Medial Axis Transform. <a href="https://homepages.inf.ed.ac.uk/rbf/HIPR2/skeleton.htm">Acessado em 01/05/2023</a></p>



<p>[FA] Félix Abecassis &#8211; OpenCV &#8211; Morphological Skeleton. <a href="https://felix.abecassis.me/2011/09/opencv-morphological-skeleton/">Acessado em 02/05/2023</a></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/morfologia-matematica-esqueletizacao-de-imagem/">Morfologia Matemática &#8211; Esqueletização de imagem</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Morfologia Matemática &#8211; Extração de Fronteiras / Detecção de Bordas</title>
		<link>https://visaocomputacional.com.br/morfologia-matematica-extracao-de-fronteiras-deteccao-de-bordas/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=morfologia-matematica-extracao-de-fronteiras-deteccao-de-bordas</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Wed, 26 Apr 2023 21:56:18 +0000</pubDate>
				<category><![CDATA[Conceitos básicos]]></category>
		<category><![CDATA[Processamento de imagens]]></category>
		<category><![CDATA[Bordas]]></category>
		<category><![CDATA[Dilatação]]></category>
		<category><![CDATA[Dilate]]></category>
		<category><![CDATA[Erode]]></category>
		<category><![CDATA[Erosão]]></category>
		<category><![CDATA[Fronteiras]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=3795</guid>

					<description><![CDATA[<p>A fronteira interna é o contorno da imagem binarizada. O cálculo consiste em subtrair da imagem, o resultado da erosão da própria imagem por um elemento estruturante. </p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/morfologia-matematica-extracao-de-fronteiras-deteccao-de-bordas/">Morfologia Matemática &#8211; Extração de Fronteiras / Detecção de Bordas</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Existem diversas técnicas para detecção ou realce de bordas e extração de fronteiras. Com morfologia matemática binária é possível realizar a extração de fronteiras de forma simples e com baixo custo de processamento. Acesse <a href="https://visaocomputacional.com.br/morfologia-matematica-para-processamento-de-imagens/">Morfologia Matemática para Processamento de Imagens</a>, para entender sobre erosão e dilatação, operações que são a base dos cálculos apresentados a seguir.</p>



<p>A extração de fronteiras, com morfologia, consiste em destacar as fronteiras da área de interesse (Roi) de uma imagem. Na Fig.1 é ilustrado o resultado de uma extração interna de fronteira.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="943" height="558" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image.png" alt="" class="wp-image-4268" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image.png 943w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-300x178.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-768x454.png 768w" sizes="(max-width: 943px) 100vw, 943px" /><figcaption>Fig 1 &#8211; Resultado da extração de fronteiras utilizando processamento morfológico. [GW] </figcaption></figure>



<p>Basicamente existem dois tipos de extração de fronteiras, as fronteiras internas e as fronteiras externas, sendo uma contraponto da outra. </p>



<h3>Fronteira interna</h3>



<p>Definição: <strong>β(A) = A &#8211;</strong> <strong>(A</strong> <strong><sub><sup>⊖</sup></sub> B) </strong></p>



<p>A fronteira interna é o contorno da imagem binarizada. O cálculo consiste em subtrair da imagem, o resultado da erosão da própria imagem por um elemento estruturante. </p>



<p>Observe nas figuras abaixo, que a partir da imagem A, foi realizada sua erosão pelo elemento estruturante B. Como resultado desta operação, temos apenas os pixels interno da imagem, conforme a imagem da terceira coluna. Com a erosão realizada, basta subtrair da imagem A por esta erosão, resultando apenas os pixels que estão na Imagem A e não estão na sua erosão.</p>



<div class="wp-block-columns">
<div class="wp-block-column" style="flex-basis:100%">
<div class="wp-block-columns">
<div class="wp-block-column">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="255" height="255" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-2.png" alt="" class="wp-image-4270" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-2.png 255w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-2-150x150.png 150w" sizes="(max-width: 255px) 100vw, 255px" /><figcaption>A<br>Imagem binarizada</figcaption></figure></div>
</div>



<div class="wp-block-column">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="86" height="85" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-6.png" alt="" class="wp-image-4274"/><figcaption>B<br>Elementro estruturante</figcaption></figure></div>
</div>



<div class="wp-block-column">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-1.png" alt="" class="wp-image-4280" width="186" height="182"/><figcaption>A <sub><sup>⊖</sup></sub> B<br>Erosão da imagem A</figcaption></figure>
</div>



<div class="wp-block-column">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="254" height="254" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-3.png" alt="" class="wp-image-4281" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-3.png 254w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-3-150x150.png 150w" sizes="(max-width: 254px) 100vw, 254px" /><figcaption>A &#8211; (A <sub><sup>⊖</sup></sub> B)<br>Fronteira interna</figcaption></figure></div>
</div>
</div>
</div>
</div>



<h3>Fronteira externa</h3>



<p>Definição: <strong>β(A) = (A <sub><sup>⊕</sup></sub> B) &#8211; A</strong></p>



<p>A fronteira externa, na imagem binarizada, cria uma camada como uma vestimenta que cobre toda a imagem. O cálculo consiste em dilatar a imagem por um elemento estruturante e subtrair pela imagem original.</p>



<p>Observe nas figuras abaixo, que a partir da Imagem A, foi realizada sua dilatação pelo elemento estruturante B. Como resultado desta operação, temos a imagem A mais uma camada externa à ela, conforme imagem da terceira coluna. Com a dilatação realizada, basta subtrair a dilatação pela Imagem A, resultando apenas nos pixels externos, que estão na imagem dilatada e não estão na imagem A.</p>



<div class="wp-block-columns">
<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="255" height="255" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-2.png" alt="" class="wp-image-4270" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-2.png 255w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-2-150x150.png 150w" sizes="(max-width: 255px) 100vw, 255px" /><figcaption>A<br>Imagem binarizada</figcaption></figure>
</div>



<div class="wp-block-column">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="82" height="80" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-4.png" alt="" class="wp-image-4283"/><figcaption>B<br>Elemento extruturante</figcaption></figure></div>
</div>



<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="254" height="253" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-7.png" alt="" class="wp-image-4285" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-7.png 254w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-7-150x150.png 150w" sizes="(max-width: 254px) 100vw, 254px" /><figcaption>A <sub><sup>⊕</sup></sub> B<br>Dilatação da imagem A</figcaption></figure>
</div>



<div class="wp-block-column">
<figure class="wp-block-image size-full"><img loading="lazy" width="252" height="252" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-5.png" alt="" class="wp-image-4284" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-5.png 252w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-5-150x150.png 150w" sizes="(max-width: 252px) 100vw, 252px" /><figcaption> (A <sub><sup>⊕</sup></sub> B) &#8211; A<br>Fronteira externa</figcaption></figure>
</div>
</div>



<h3>Outros exemplos</h3>



<p>Na ilustração da Tabela 01 são demonstrados os resultados das extrações de fronteiras, com os elementos estruturantes apresentados anteriormente.</p>



<figure class="wp-block-table aligncenter"><table><tbody><tr><td class="has-text-align-center" data-align="center">Imagem original</td><td class="has-text-align-center" data-align="center">Fronteira interna</td><td class="has-text-align-center" data-align="center">Fronteira externa</td></tr><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" width="248" height="249" class="wp-image-4316" style="width: 150px;" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-10.png" alt="" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-10.png 248w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-10-150x150.png 150w" sizes="(max-width: 248px) 100vw, 248px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" width="248" height="249" class="wp-image-4318" style="width: 150px;" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-12.png" alt="" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-12.png 248w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-12-150x150.png 150w" sizes="(max-width: 248px) 100vw, 248px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" width="248" height="249" class="wp-image-4319" style="width: 150px;" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-13.png" alt="" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-13.png 248w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-13-150x150.png 150w" sizes="(max-width: 248px) 100vw, 248px" /></td></tr><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" width="248" height="249" class="wp-image-4317" style="width: 150px;" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-11.png" alt="" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-11.png 248w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-11-150x150.png 150w" sizes="(max-width: 248px) 100vw, 248px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" width="248" height="249" class="wp-image-4320" style="width: 150px;" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-14.png" alt="" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-14.png 248w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-14-150x150.png 150w" sizes="(max-width: 248px) 100vw, 248px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" width="248" height="249" class="wp-image-4321" style="width: 150px;" src="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-15.png" alt="" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-15.png 248w, https://visaocomputacional.com.br/wp-content/uploads/2023/04/image-15-150x150.png 150w" sizes="(max-width: 248px) 100vw, 248px" /></td></tr></tbody></table><figcaption>Tabela 01 &#8211; Exemplos de extração de fronteiras com morfologia matemática.</figcaption></figure>



<p>A seguir, uma demonstração do resultado da extração de fronteira de uma imagem limiarizada, de um pote sobre uma mesa. O resultado desta operação, foi detectar as bordas da imagem. Esta demonstração foi realizada utilizando a IDE <a href="https://opencvflow.org/">OpenCV-Flow</a>. </p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="508" src="https://visaocomputacional.com.br/wp-content/uploads/2023/01/exemplo_extracao_fronteira-1024x508.png" alt="" class="wp-image-3744" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/01/exemplo_extracao_fronteira-1024x508.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2023/01/exemplo_extracao_fronteira-300x149.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/01/exemplo_extracao_fronteira-768x381.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/01/exemplo_extracao_fronteira.png 1304w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2><strong>Referências:</strong></h2>



<p>[GW] GONZALEZ, R. C., WOODS, R. E. Processamento de Imagens Digitais. Editora Edgard Blucher, ISBN 978-85-8143-586-2, 3 ed., São Paulo, 2010</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/morfologia-matematica-extracao-de-fronteiras-deteccao-de-bordas/">Morfologia Matemática &#8211; Extração de Fronteiras / Detecção de Bordas</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Programando Erosão, Dilatação, Abertura e Fechamento Morfológica com Javascript.</title>
		<link>https://visaocomputacional.com.br/programando-erosao-dilatacao-abertura-e-fechamento-morfologica-com-javascript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=programando-erosao-dilatacao-abertura-e-fechamento-morfologica-com-javascript</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Thu, 09 Feb 2023 23:03:49 +0000</pubDate>
				<category><![CDATA[Experimentos]]></category>
		<category><![CDATA[Abertura]]></category>
		<category><![CDATA[Dilatação]]></category>
		<category><![CDATA[Dilate]]></category>
		<category><![CDATA[Erode]]></category>
		<category><![CDATA[Erosão]]></category>
		<category><![CDATA[Fechamento]]></category>
		<category><![CDATA[Morfologia]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=3846</guid>

					<description><![CDATA[<p>Este artigo trata de como programar as operações morfológicas binárias apresentadas no post Morfologia Matemática para Processamento de Imagens. A programação foi realizada na linguagem javascript, utilizando a biblioteca opencv.js e as imagens produzidas com a IDE OpenCV-Flow. OpenCV A biblioteca opencv.js disponibiliza diversas funcionalidade prontas para o processamento de imagens e visão computacional. Para [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/programando-erosao-dilatacao-abertura-e-fechamento-morfologica-com-javascript/">Programando Erosão, Dilatação, Abertura e Fechamento Morfológica com Javascript.</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="Programando Erosão e Dilatação Morfológica com Javascript." width="800" height="450" src="https://www.youtube.com/embed/FTHAoLFlWuI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></div>
</div></figure>



<p>Este artigo trata de como programar as operações morfológicas binárias apresentadas no post <a href="https://visaocomputacional.com.br/morfologia-matematica-para-processamento-de-imagens/">Morfologia Matemática para Processamento de Imagens</a>. A programação foi realizada na linguagem javascript, utilizando a biblioteca <a href="https://docs.opencv.org/4.x/d5/d10/tutorial_js_root.html">opencv.js</a> e as imagens produzidas com a IDE <a href="https://opencvflow.org/pt">OpenCV-Flow</a>.</p>



<h3>OpenCV</h3>



<p>A biblioteca opencv.js disponibiliza diversas funcionalidade prontas para o processamento de imagens e visão computacional. Para utilizá-la, basta incluí-la no script da página <span class="has-inline-color has-black-color">conforme descrito em <a href="https://docs.opencv.org/4.x/d0/d84/tutorial_js_usage.html">Using OpenCV.js</a></span>.</p>



<p>Utilizaremos a classe <a href="https://docs.opencv.org/4.x/de/d06/tutorial_js_basic_ops.html">Mat do OpenCV</a> para realizar a manipulação da imagem, com esta classe conseguimos construir de forma fácil imagens (coloridas e binárias) e manipular seus pixels. </p>



<h2>Erosão</h2>



<p>A erosão como apresentado no outro post citado, consiste em testar se o elemento estruturante (núcleo) se encaixa na imagem de origem, gerando uma nova imagem de destino, onde cada teste realizado com sucesso, é identificado na imagem de destino com o valor 1 e identificado com o valor 0 caso a estrutura não tenha sido localizada.&nbsp;</p>



<p>A primeira etapa que iremos realizar é criar o núcleo de operação com o formato de quadrado. O elemento estruturante deve ser uma imagem binárizada (preto e branco), como não temos imagens binárias no OpenCV, criaremos uma imagem em tons de cinza.</p>



<p>Na função nucleoFormatoCruz, abaixo, é criada uma matriz de tamanho 3&#215;3, com um canal de cor do tipo uint8, com valores entre 0 e 255: </p>



<pre class="wp-block-preformatted">function nucleoFormatoCruz() {
  return new cv.matFromArray(3, 3, cv.CV_8UC1, [
    1, 1, 1,
    1, 1, 1,
    1, 1, 1
  ]);
}</pre>



<p>Além do núcleo das operações, vamos precisar da posição central das operações, sendo que no OpenCV é utilizada a classe cv.Point para indicar posições específicas, com o objetivo de seguir o padrão, nosso código também ira utilizá-la. Para inicializar a classe, é preciso apenas informar as posições das coordenadas x e y, conforme abaixo:</p>



<pre class="wp-block-preformatted">const centro = new cv.Point(1, 1);</pre>



<p>Agora que temos nosso núcleo e sua posição, nossa função de erosão foi programada com as seguintes etapas:</p>



<ul><li>Percorre todas as posições dos pixels da imagem;</li><li>Para cara pixel da imagem, percorre todos os elementos do elemento estruturante e testa a estrutura na imagem conforme as etapas:<ul><li>Verifica-se se o elemento do núcleo possui valor e:<ul><li>Se o elemento possuir valor, verifica a posição correspondente na imagem também possui valor e:<ul><li>Se o pixel possuir valor, verifica o próximo elemento;</li><li>Se o pixel não possuir, marca o teste como negado;</li></ul></li></ul></li></ul><ul><li>Se o elemento não possui valor, verifica o próximo elemento;</li><li>Ao finalizar todos os testes dos elementos, do núcleo na região do pixel, e caso nenhum for negado, marca na imagem de destino o valor 255, do contrário marca como 0;</li></ul></li></ul>



<pre class="wp-block-preformatted">function erosao(nucleo, centro, imagem, imagemSaida) {
  //Percorre a imagem
  for (let x = centro.x; x &lt; imagem.cols; x++) {
    for (let y = centro.y; y &lt; imagem.rows; y++) {

      let hasNucleo = true;
      //Percorre o elemento estruturante (núcleo)
      for (let j = 0; j &lt; nucleo.cols; j++) {
        for (let k = 0; k &lt; nucleo.rows; k++) {
          
          //Verifica-se se o elemento do núcleo deve ser checado
          const nucleoTemValor = nucleo.ucharPtr(k, j)[0] &gt; 0;
          if (nucleoTemValor) {
            const col = x + j - centro.x;
            const row = y + k - centro.y;

            //Verifica-se se a imagem tem valor na mesma posição do núcleo
            const imagemTemValor = imagem.ucharPtr(row, col)[0] &gt; 0;
            if (!imagemTemValor) {
              hasNucleo = false;
              break;
            }
          }
        }
      }

      imagemSaida.ucharPtr(y, x)[0] = hasNucleo ? 255 : 0;
    }
  }
}</pre>



<h2>Dilatação</h2>



<p>A dilatação consiste em testar cada elemento da imagem de origem e verificar se possui valor 1, caso exista na imagem de destino, então é adicionado os valores do elemento estruturante a partir da posição central do elemento estruturante.</p>



<p>A programação da dilatação é menos complexa que a da erosão, nossa função realiza apenas as seguintes etapas:</p>



<ul><li>Percorre todas as posições dos pixeis da imagem;</li><li>Para cara pixel da imagem:<ul><li>Verifica-se se o pixel possui valor e:<ul><li>Caso possuir, percorre os elementos do núcleo e os projeta na imagem de destino;</li><li>Caso não possuir, não realiza nenhuma operação;</li></ul></li></ul></li></ul>



<pre class="wp-block-preformatted">function dilatacao(nucleo, centro, imagem, imagemSaida) {
  //Percorre a imagem
  for (let x = centro.x; x &lt; imagem.cols; x++) {
    for (let y = centro.y; y &lt; imagem.rows; y++) {

      //Verifica-se se o pixel da imagem possui valor positivo
      const pixelComValor = imagem.ucharPtr(y, x)[0] &gt; 0;
      if (pixelComValor) {

        //Percorre o elemento estruturante (núcleo)
        for (let j = 0; j &lt; nucleo.cols; j++) {
          for (let k = 0; k &lt; nucleo.rows; k++) {
            
            //Verifica-se se o elemento do núcleo tem valor positivo
            const nucleoTemValor = nucleo.ucharPtr(k, j)[0] &gt; 0;
            if (nucleoTemValor) {
              const col = x + j - centro.x;
              const row = y + k - centro.y;

              imagemSaida.ucharPtr(row, col)[0] = 255;
            }
          }
        }
      }
    }
  }
}</pre>



<h2>Abertura</h2>



<p>A abertura de uma imagem A, por um elemento estruturante B, é simplesmente a operação de erosão de A por B, seguida da dilatação de A por B. Como a abertura é apenas o encadeamento de duas operações, nosso código de exemplo faz apenas isto.</p>



<pre class="wp-block-preformatted">function abertura(nucleo, centro, imagem, imagemSaida) {
  let imgTemporaria = new cv.Mat( imagem.rows, imagem.cols, imagem.type(), new cv.Scalar(0));
  
  erosao(nucleo, centro, imagem, imgTemporaria);
  dilatacao(nucleo, centro, imgTemporaria, imagemSaida);

  imgTemporaria.delete();
}</pre>



<h2>Fechamento</h2>



<p>O fechamento de uma imagem A, por um elemento estruturante B, é simplesmente a operação de dilatação de A por B, seguida da erosão de A por B. Como o fechamento também é apenas o encadeamento de duas operações, nosso código de exemplo faz apenas isto também.</p>



<pre class="wp-block-preformatted">function fechamento(nucleo, centro, imagem, imagemSaida) {
  let imgTemporaria = new cv.Mat( imagem.rows, imagem.cols, imagem.type(), new cv.Scalar(0));

  dilatacao(nucleo, centro, imagem, imgTemporaria);
  erosao(nucleo, centro, imgTemporaria, imagemSaida);

  imgTemporaria.delete();
}</pre>



<h2>Considerações</h2>



<p>As funções programadas neste post possuem caráter de estudo, afim de entender as etapas e os processos morfológicos, pois não foram pensadas em questões como desempenho nestes exemplos. Caso você precise utilizar este tipo de operação, é recomendado que utilize uma biblioteca preparada para isso, como o OpenCV ou similar.</p>



<p>O código aqui apresentado esta disponível no link abaixo:</p>



<p>Source code: <a href="https://github.com/visaocomputacionalexemplos/morfologia/blob/main/javascript/base/morfologia.html">https://github.com/visaocomputacionalexemplos/morfologia/blob/main/javascript/base/morfologia.html</a></p>



<p></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/programando-erosao-dilatacao-abertura-e-fechamento-morfologica-com-javascript/">Programando Erosão, Dilatação, Abertura e Fechamento Morfológica com Javascript.</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Morfologia Matemática para Processamento de Imagens</title>
		<link>https://visaocomputacional.com.br/morfologia-matematica-para-processamento-de-imagens/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=morfologia-matematica-para-processamento-de-imagens</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Sat, 04 Feb 2023 00:42:41 +0000</pubDate>
				<category><![CDATA[Conceitos básicos]]></category>
		<category><![CDATA[Processamento de imagens]]></category>
		<category><![CDATA[Abertura]]></category>
		<category><![CDATA[Closing]]></category>
		<category><![CDATA[Dilatação]]></category>
		<category><![CDATA[Dilate]]></category>
		<category><![CDATA[Erode]]></category>
		<category><![CDATA[Erosão]]></category>
		<category><![CDATA[Fechamento]]></category>
		<category><![CDATA[Morfologia]]></category>
		<category><![CDATA[Opening]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=3633</guid>

					<description><![CDATA[<p>O estudo morfológico concentra-se na estrutura geométrica das imagens. Aplica-se morfologia em , realce, filtragem, segmentação, esqueletonização e outras operaçõe.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/morfologia-matematica-para-processamento-de-imagens/">Morfologia Matemática para Processamento de Imagens</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>A palavra Morfologia é originalmente um ramo da biologia, que estuda as formas e estruturas dos animais e plantas. Utilizamos esta palavra no contexto de Morfologia Matemática, como um instrumento para extração de componentes da imagem, que sejam úteis para representação e descrição da forma de uma região, como fronteiras, esqueletos, realce, filtragem, segmentação ou esqueletização <a href="#refs">[GW]</a>. </p>



<p>A morfologia<span class="has-inline-color has-vivid-red-color"> </span><span class="has-inline-color has-black-color">também pode ser utilizada</span> para extração de componentes conexos, busca de padrões específicos na imagem, delimitação de fecho convexo, extração de bordas entre outros <a href="https://visaocomputacional.com.br/wp-admin/post.php?post=3633&amp;action=edit#refs">[PS]</a>.</p>



<p>Neste post é apresentado um resumo sobre morfologia matemática, sem detalhar suas fórmulas matemáticas.</p>



<h2>Imagem Digital e Binária</h2>



<p>Uma imagem digital é formada por uma quantidade finita de amostras de uma cena, capturada pela lente de uma câmera, também pode ser chamada de imagem discreta e é representada como subconjunto do plano cartesiano Z<sup>2</sup>, onde Z representa o conjunto dos números inteiros. Cada amostra da imagem, conhecida como pixel, está localizada em uma coordenada (x, y) da imagem, associada alguma informação sobre a cor <a href="#refs">[VL]</a>.</p>



<p>Uma imagem binária é composta por dois tipos de pixels, os do plano de fundo e o plano principal, que são representados normalmente usando preto e branco, ou 0 e 1, respectivamente <a href="#refs">[VL]</a>. Normalmente representam a área de interesse durante o processamento morfológico. </p>



<p>Neste artigo<span class="has-inline-color has-black-color"> é apresentada a morfologia matemática binária (em imagens binárias).</span></p>



<h2>Elemento Estruturante</h2>



<p>Um conceito importante na morfologia matemática é a definição de elemento estruturante, também chamado de núcleo. O elemento estruturante é um vetor bidimensional pré-definido, representado por zeros (0) e uns (1), com uma coordenada indicando o centro da operação e pode assumir diversas formas e aspectos, dependendo do tipo de efeito desejado a ser aplicado na imagem.</p>



<p>A seguir, são demonstrados 3 diferentes vetores de elementos estruturantes e suas imagens representativas, com o centro de operação destacado em vermelho.</p>



<div class="wp-block-columns">
<div class="wp-block-column">
<p class="has-text-align-center">[1, 1, 1,<br> 1, <s><strong>1</strong></s>, 1,<br> 1, 1, 1]</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="129" height="130" src="https://visaocomputacional.com.br/wp-content/uploads/2023/01/nucleo-2.png" alt="" class="wp-image-3755"/><figcaption>Fig&nbsp; 1 &#8211; Elemento Estruturante Quadrado.</figcaption></figure></div>
</div>



<div class="wp-block-column">
<p class="has-text-align-center">[0, 1, 0,<br> 1, <span class="has-inline-color has-black-color"><s><strong>1</strong></s></span>, 1,<br> 0, 1, 0]</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2023/01/nucleo-3.png" alt="" class="wp-image-3756" width="129" height="130"/><figcaption>Fig&nbsp;2 &#8211; Elemento Estruturante Cruz.</figcaption></figure></div>
</div>



<div class="wp-block-column">
<p class="has-text-align-center">[1, <br> <s><strong>1</strong></s>, <br> 1]</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="84" height="130" src="https://visaocomputacional.com.br/wp-content/uploads/2023/01/nucleo-4.png" alt="" class="wp-image-3757"/><figcaption>Fig&nbsp;3 -Elemento Estruturante Linha.<br><br></figcaption></figure></div>
</div>
</div>



<p>A ideia básica da morfologia binária é sondar uma imagem com o elemento estruturante pré-definido, analisando  como essa forma se encaixa ou não nas formas da imagem. </p>



<h2>Erosão e Dilatação</h2>



<p>A erosão e a dilatação são dois operadores fundamentais em Morfologia Matemática, muitos operadores morfológicos mais sofisticados se baseiam nestas duas operações.</p>



<h3>Erosão</h3>



<p>Símbolo / Representação : <strong>⊖</strong></p>



<p>Definição: <strong>A</strong> <strong><sub><sup>⊖</sup></sub> B = { z | (B)<sub>z</sub> ∩ A<sup>c</sup> = ∅ }</strong>  </p>



<p>A erosão consiste em testar se o elemento estruturante se encaixa na imagem de origem, gerando uma nova imagem de destino, onde cada teste realizado com sucesso, é identificado na imagem de destino com o valor 1 e identificado com o valor 0 caso a estrutura não tenha sido localizada. Os valores 0 e 1 podem ser substituídos por outros valores, caso necessário.</p>



<p>O efeito prático do processo morfológico chamado erosão, consiste na modificação das feições da imagem, diminuindo-as em seu entorno, literalmente “erodindo-as” <a href="#refs">[MM]</a>.</p>



<p>Observe na ilustração a seguir, o passo a passo da erosão da imagem, de tamanho 11&#215;11, pelo elemento estruturante, de tamanho 3&#215;3. O processo inicia pelo teste do elemento estruturante na parte superior esquerda da imagem, onde é verificado se cada elemento do núcleo é encontrado da imagem. Para isso, é verificado se cada um dos elementos [1, 2, 3, 4, 5, 6, 7, 8, 9] do núcleo estão contidos nos elementos de coordenada [(1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3)] da imagem, e registrado o valor 1 (branco) na imagem de destino caso todos os elementos sejam encontrados, como o teste não passou, na imagem de destino é registrado o valor 0 (preto). Então, é deslocado a verificação do núcleo para os próximos elementos da imagem, até que todos sejam testados.</p>



<div class="wp-block-columns">
<div class="wp-block-column" style="flex-basis:33.33%">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="129" height="130" src="https://visaocomputacional.com.br/wp-content/uploads/2023/01/nucleo-2.png" alt="" class="wp-image-3755"/><figcaption>Fig 4 &#8211; Elemento Estruturante<br>(Núcleo)</figcaption></figure></div>
</div>



<div class="wp-block-column" style="flex-basis:66.66%">
<figure class="wp-block-image size-full"><img loading="lazy" width="574" height="258" src="https://visaocomputacional.com.br/wp-content/uploads/2023/01/erosao.gif" alt="" class="wp-image-3734"/><figcaption> Fig 5 &#8211;  Ilustração de Erosão.</figcaption></figure>
</div>
</div>



<p>A seguir, na ilustração da Fig. 6, é exibido um exemplo de erosão morfológica de uma imagem de placa de circuitos. Neste exemplo vamos tentar remover todos os circuitos e manter apenas suas extremidades. O primeiro processo realizado, consiste em carregar a imagem, convertê-la em tons de cinza e realizar a limiarização, para termos uma imagem em preto e branco (zeros e uns). Com a imagem limiarizada foi realizada a sua Erosão, com uma matriz 3&#215;3 de valores 1.  </p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="712" src="https://visaocomputacional.com.br/wp-content/uploads/2023/01/exemplo_erosao-1024x712.png" alt="" class="wp-image-3736" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/01/exemplo_erosao-1024x712.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2023/01/exemplo_erosao-300x209.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/01/exemplo_erosao-768x534.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/01/exemplo_erosao.png 1030w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption> Fig 6 &#8211;  Efeito de Erosão Morfológica em placa de circuitos.</figcaption></figure>



<p>Podemos observar pela imagem, que este simples processo eliminou todos os traços/linhas da imagem de entrada, mantendo apenas as estruturas maiores. O resultado não foi uma extração ideal de estrutura, porém, com uma única aplicação de operação morfológica foi possível remover muitas informações indesejadas. O exemplo acima foi realizado utilizando a ferramenta online <a href="https://opencvflow.org/">OpenCV-Flow</a>.</p>



<h3>Dilatação</h3>



<p>Símbolo / Representação: <strong>⊕</strong></p>



<p>Definição: <strong>A <sub><sup>⊕</sup></sub> B = { z | (^B)<sub>z</sub> ∩ A ≠ ∅ }</strong> </p>



<p>A dilatação, de certa forma, é o contraponto da erosão. Ela consiste em testar cada elemento da imagem de origem e verificar se possui valor 1, caso exista na imagem de destino, então é adicionado os valores do elemento estruturante a partir da posição central do elemento estruturante.</p>



<p>O efeito prático do processo morfológico chamado&nbsp;<em>Dilatação</em>&nbsp;consiste na modificação das feições da imagem, aumentando-as em seu entorno <a href="#refs">[MM]</a>. </p>



<p>Observe na ilustração a seguir, o resultado da aplicação do elemento estruturante (núcleo) na imagem. O núcleo de forma quadrada, com tamanho 3&#215;3, possui os valores  [1,1,1,1,1,1,1,1,1] e centro de coordenada (2,2). Note que ao aplicar o núcleo na coordenada (3,3) da imagem de entrada, resultou na imagem de saída a expansão daquele ponto, ao aplicar/copiar o elemento estruturante na imagem de saída. Todo o processo é repetido para cada elemento da imagem. </p>



<div class="wp-block-columns">
<div class="wp-block-column" style="flex-basis:33.33%">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="129" height="130" src="https://visaocomputacional.com.br/wp-content/uploads/2023/01/nucleo-2.png" alt="" class="wp-image-3755"/><figcaption> Fig 7 &#8211;  Elemento Estruturante<br>(Núcleo)</figcaption></figure></div>
</div>



<div class="wp-block-column" style="flex-basis:66.66%">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="574" height="258" src="https://visaocomputacional.com.br/wp-content/uploads/2023/01/dilatacao_imagem.png" alt="" class="wp-image-3749" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/01/dilatacao_imagem.png 574w, https://visaocomputacional.com.br/wp-content/uploads/2023/01/dilatacao_imagem-300x135.png 300w" sizes="(max-width: 574px) 100vw, 574px" /><figcaption> Fig 8 &#8211;  Ilustração de Dilatação.</figcaption></figure></div>
</div>
</div>



<h2>Abertura e Fechamento</h2>



<p>Duas outras operações morfológicas importantes são a abertura e fechamento.</p>



<h3>Abertura</h3>



<p>Símbolo / Representação: <strong> ◦ </strong></p>



<p>Definição: <strong>A ◦ B = (A <sub><sup>⊖</sup></sub> B)<strong> <sub><sup>⊕</sup></sub> </strong>B</strong></p>



<p>A abertura de uma imagem A por um elemento estruturante B é simplesmente a operação de erosão de A por B, seguida da dilatação de A por B <a href="https://visaocomputacional.com.br/wp-admin/post.php?post=3633&amp;action=edit#refs">[PS]</a>.</p>



<p>Ao realizar a erosão seguida da dilatação, o efeito produzido na imagem é de abertura de pontos/ligações e remoção de ruídos. Observe na ilustração da Fig. 9, que após realizar a operação de erosão na imagem, a conexão que existia entre os retângulos foi perdida e também foram reduzidos seu tamanhos. Porém, ao aplicar a dilatação esses retângulos voltaram a ter sua forma inicial.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="497" src="https://visaocomputacional.com.br/wp-content/uploads/2023/01/image-1-1024x497.png" alt="" class="wp-image-3798" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/01/image-1-1024x497.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2023/01/image-1-300x146.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/01/image-1-768x373.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/01/image-1.png 1210w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption> Fig 9 &#8211;  Efeito da abertura morfológica.</figcaption></figure></div>



<h3>Fechamento</h3>



<p>Símbolo / Representação:  <strong>• </strong></p>



<p>Definição: <strong>A • B = (A<strong> <sub><sup>⊕</sup></sub> </strong>B) <sub><sup>⊖</sup></sub> B</strong></p>



<p>O fechamento de uma imagem A por um elemento estruturante B é simplesmente a operação de dilatação de A por B, seguida da erosão de A por B <a href="https://visaocomputacional.com.br/wp-admin/post.php?post=3633&amp;action=edit#refs">[PS]</a> .</p>



<p>Ao realizar a dilatação seguida da erosão, o efeito produzido na imagem são o fechamento de pequenos buracos e criação de conexões. Observe na ilustração da Fig. 10, que após realizar a dilatação, com a espação dos elementos, os buracos iniciais foram fechados, e com a realização da erosão o componente voltou a ter o aspecto da sua estrutura inicial, com os pequenos buracos fechados. Porém, como consequência desta técnica os componentes que estavam próximos se conectaram.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="758" height="354" src="https://visaocomputacional.com.br/wp-content/uploads/2023/02/image-2.png" alt="" class="wp-image-3813" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/02/image-2.png 758w, https://visaocomputacional.com.br/wp-content/uploads/2023/02/image-2-300x140.png 300w" sizes="(max-width: 758px) 100vw, 758px" /><figcaption> Fig 10 &#8211;  Efeito do fechamento morfológica.  </figcaption></figure></div>



<h3>Filtragem morfológica</h3>



<p>As operações morfológicas podem ser utilizadas como filtros de imagem, como filtros espaciais apresentados no artigo <a href="http://dominios-de-valor-espaco-e-frequencia">Domínios de Valor, Espaço e Frequência</a>. </p>



<p>A ilustração da Fig. 11 mostra uma imagem de impressão digital corrompida por ruído, no topo a esquerda, sendo que o ruído se manifesta como elementos aleatórios claros sobre o fundo escuro e como elementos escuros sobre componentes claros na digital. O objetivo é eliminar todos os ruídos sem danificar a estrutura da digital <a href="#refs">[GW]</a>.</p>



<p>A seguir, na ilustração da Fig. 11, um exemplo de filtragem utilizando abertura seguida do fechamento morfológico, utilizando um elemento estruturante em forma de cruz.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="468" src="https://visaocomputacional.com.br/wp-content/uploads/2023/02/image-1024x468.png" alt="" class="wp-image-3807" srcset="https://visaocomputacional.com.br/wp-content/uploads/2023/02/image-1024x468.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2023/02/image-300x137.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2023/02/image-768x351.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2023/02/image.png 1127w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Fig 11 &#8211; Filtragem de ruídos em impressão digital.</figcaption></figure></div>



<p>O resultado final, após o fechamento, esta quase sem ruídos, mas com algumas das cristas de impressão não totalmente reparadas e também apresenta algumas quebras, além de que algumas cristas foram conectadas e não deveriam. Isto não é inesperado utilizando esta técnica e para resolver esta situação seria necessário aplicar outras técnicas de processamento de imagens, que talvez resolveriam o problema, como realizar <a href="/?s=afinamento" target="_blank" rel="noreferrer noopener">afinamento </a>ou <a href="/s=esqueletizacao" target="_blank" rel="noreferrer noopener">esqueletização.</a> </p>



<p>Estes conceitos apresentados neste artigo são a base da morfologia matemática. Ela possui muitas outras técnicas, como extração de fronteiras, transformada acerto-ou-erro, afinamento, esqueletização, poda e extração de componentes conexos.</p>



<p id="refs"><strong>Referências:</strong></p>



<p>[GW] GONZALEZ, R. C., WOODS, R. E. Processamento de Imagens Digitais. Editora Edgard Blucher, ISBN 978-85-8143-586-2, 3 ed., São Paulo, 2010</p>



<p>[PS] Pedrini, H.; Schwartz, W. R.; Análise de Imagens Digitais: Princípios, Algoritmos e Aplicações. Thomson Learning, 2007</p>



<p>[VL]  Visual-Lab &#8211; Instituto de computação. Morfologia Matemática em Análise de Imagens. <a href="http://visual.ic.uff.br/morphology/index.html">Acessado em 30/01/2023</a>.</p>



<p>[MM] Matosak, B. M.;  Medeiros, N. G; IMGedu &#8211; Capítulo 3 Morfologia Matemática. <a href="https://menimato.github.io/IMGedu.jl/morfologia-matematica.html">Acessado em 30/01/2023</a>.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/morfologia-matematica-para-processamento-de-imagens/">Morfologia Matemática para Processamento de Imagens</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>YOLO para Detecção de Objetos  &#8211; Visão Geral</title>
		<link>https://visaocomputacional.com.br/yolo-para-deteccao-de-objetos-visao-geral/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=yolo-para-deteccao-de-objetos-visao-geral</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Wed, 07 Sep 2022 22:45:45 +0000</pubDate>
				<category><![CDATA[Visão computacional]]></category>
		<category><![CDATA[Anchor Box]]></category>
		<category><![CDATA[Âncoras]]></category>
		<category><![CDATA[Bounding box]]></category>
		<category><![CDATA[Caixa delimitadora]]></category>
		<category><![CDATA[Detecção de Objetos]]></category>
		<category><![CDATA[Non maximum suppression]]></category>
		<category><![CDATA[Redes Neurais]]></category>
		<category><![CDATA[Supressão não máxima]]></category>
		<category><![CDATA[YOLO]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=3305</guid>

					<description><![CDATA[<p>Neste primeiro post de 5, é abordado uma visão geral sobre o YOLO, como é a estrutura base de seu funcionamento e um pouco de sua história. Nos próximos posts serão detalhados como são as arquiteturas de cada uma das 4 primeiras versões do YOLO e, como Bônus, textos e materiais de apoio ensinando a [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/yolo-para-deteccao-de-objetos-visao-geral/">YOLO para Detecção de Objetos  &#8211; Visão Geral</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Neste primeiro post de 5, é abordado uma visão geral sobre o YOLO, como é a estrutura base de seu funcionamento e um pouco de sua história. Nos próximos posts serão detalhados como são as arquiteturas de cada uma das 4 primeiras versões do YOLO e, como Bônus, textos e materiais de apoio ensinando a utilizar e treinar está técnica com diversos frameworks diferentes.  </p>



<p><strong>Observação: </strong>Para melhor entender este Post e os demais sobre YOLO, é necessário ter uma conhecimento geral sobre Inteligência Artificial e Redes Neurais.</p>



<p>O YOLO foi lançado em 2015,  por Joseph Redmon e Ali Farhadi, durante o seu doutorado e em uma demonstração da sua primeira versão no&nbsp;<em>TED Talks</em>. O YOLO foi reconhecido como uma técnica inovadora, que foi capaz de obter uma precisão igual ou superior a de outros métodos de detecção de objetos da época <a href="#refs">[AG]</a>.</p>



<p>Durante a apresentação, ele faz uma demonstração ao vivo, provando que o detector é capaz de executar em sua GPU a detecção de até 80 categorias de objetos simultaneamente, a uma taxa de mais ou menos 30 FPS, e mantendo uma ótima precisão, o que foi revolucionário para a época <a href="#refs">[AG]</a>.</p>



<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="How computers learn to recognize objects instantly | Joseph Redmon" width="800" height="450" src="https://www.youtube.com/embed/Cgxsv1riJhI?start=1&#038;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></div>
</div><figcaption>Video 1. Como os computadores aprendem a reconhecer objetos instantaneamente.</figcaption></figure>



<p>Durante esta exposição, foi apresentado a versão V3 do YOLO v3. Caso tenha curiosidade, os artigos científicos referentes as suas 3 primeiras versões são os seguintes: <a href="https://pjreddie.com/media/files/papers/yolo_1.pdf" rel="noreferrer noopener" target="_blank">YOLO v1</a>; <a href="https://pjreddie.com/media/files/papers/YOLO9000.pdf" rel="noreferrer noopener" target="_blank">YOLO v2</a> e <a href="https://pjreddie.com/media/files/papers/YOLOv3.pdf">YOLO v3</a>. </p>



<h2>O Diferencial YOLO</h2>



<p>Os sistemas de detecção de objetos anteriores ao YOLO, redirecionam classificadores ou localizadores para realizar a detecção. Eles aplicam o modelo (IA) a uma imagem em vários locais e escalas, onde as regiões de alta pontuação da imagem são consideradas detecções <a href="#refs">[RJPA2]</a>. Essas regiões menores, extraídas da imagem, são denominadas Bounding Box &#8211; &#8220;Regiões Delimitadoras&#8221; e cada uma dessas regiões detecta um único objeto. A Figura 1, ilustra como as técnicas de classificação, normalmente, percorrem a imagem em varias regiões e escalas diferentes para realizar a classificação do objeto.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="256" height="377" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/sliding_window_example.gif" alt="" class="wp-image-3284"/><figcaption>Fig 1 – Exemplo de como os Bounding Box percorrem a imagem em regiões menores para identificar um objeto.</figcaption></figure></div>



<p>Diferente dos algoritmos que percorrem a imagem, em busca dos objetos treinados, o YOLO apenas precisa olhar pela imagem uma única vez e enviá-la para a rede neural. Foi a partir desse conceito que ele ganhou seu nome You Only Look Once (YOLO), que significa &#8220;Você só olha uma vez&#8221;.</p>



<p>O YOLO usa uma abordagem totalmente diferente, onde é aplicado uma única rede neural à imagem completa. Para isso a rede neural divide a imagem em regiões menores e prevê caixas delimitadoras, probabilidades de existir um objeto naquela caixa e também qual a probabilidade de ser determinado objeto <a href="#refs">[RJPA2</a>]. Todo este processo é descrito a seguir.</p>



<h2>Como Funciona?</h2>



<p>O YOLO utiliza uma rede neural profunda (DNN &#8211; Deep Neural Network), uma rede neural convolucional, cuja a arquitetura é chamado de Darknet, com o mesmo nome do framework utilizado para implantá-lo. Sua implementação foi desenvolvida na linguagem C, porém, com a ajuda da comunidade e empresas, já é disponível em várias outras linguagens de programação.</p>



<p>Existem diversas versões do YOLO publicadas, a seguir demonstraremos o funcionamento básico/geral do YOLO, e nos próximos posts o funcionamento detalhado de cada uma das primeiras versões dele. </p>



<p>O primeiro passo que o YOLO executa é dividir a imagem em uma grade de S por S células. A grade utilizada nas primeiras versões é de 13&#215;13, 13 colunas e 13 linhas, contendo 169 células, conforme exemplo na Figura 2 abaixo. Nas versões mais recentes esse tamanho é de 19&#215;19 <a href="http://%refs">[AG]</a>.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_dog_grid.png" alt="" class="wp-image-3454" width="457" height="457" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_dog_grid.png 457w, https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_dog_grid-300x300.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_dog_grid-150x150.png 150w" sizes="(max-width: 457px) 100vw, 457px" /><figcaption>Figura 2 &#8211; YOLO Divisão da imagem em grades.</figcaption></figure></div>



<p>Cada uma destas células é responsável por realizar a predição/detecção de 5 caixas delimitadoras, pois podem existir mais de um objeto nesta célula. Cada caixa é responsável por analisar um pedaço da imagem e extrair informações da região. Na versão do YOLO utilizado como exemplo, existem um total de 845 (13x13x5) caixas delimitadoras.</p>



<h3>Caixas delimitadoras/Bounding box</h3>



<p>O retângulo que contém a localização do objeto é chamado de caixa delimitadora (bounding box). Durante o processo de detecção de objetos, podem ser encontradas diversas caixas delimitadoras para um mesmo objeto. Estas caixas também podem possuir diversos tamanhos diferentes. </p>



<p>Cada caixa possui uma pontuação de confiança, indicando a quantidade de certeza que o algoritmo tem que aquela caixa possui um objeto. Porém, esta pontuação não identifica qual tipo é esse objeto.</p>



<p>Na Figura 3 abaixo, foram destacadas as caixas detectadas pelo algoritmo YOLO. Também foi destacado na imagem a pontuação de confiança através da espessura da caixa, ou seja, quanto maior a confiança que o YOLO tem que existe um objeto naquela caixa maior é a borda da caixa. A quantidade de possíveis objetos identificados nesta etapa do algoritmo é imensa.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="466" height="466" src="https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_boundingboxes_black.png" alt="" class="wp-image-3470" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_boundingboxes_black.png 466w, https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_boundingboxes_black-300x300.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_boundingboxes_black-150x150.png 150w" sizes="(max-width: 466px) 100vw, 466px" /><figcaption>Figura 3 &#8211; Resultado da detecção das caixas delimitadoras.</figcaption></figure></div>



<p>Para cada caixa delimitadora encontrada, também é executado o processo classificação dos objetos. Esse processo consiste em fornecer um valor de probabilidade para cada uma das possíveis classes/objetos que o algoritmo foi treinado a encontrar. Na Figura 4 abaixo, foram destacados em cores diferentes os possíveis objetos de cada caixa.  </p>



<div class="wp-block-image"><figure class="aligncenter size-full"><a href="#refs"><img loading="lazy" width="458" height="458" src="https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_boundingboxes.png" alt="" class="wp-image-3464" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_boundingboxes.png 458w, https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_boundingboxes-300x300.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_boundingboxes-150x150.png 150w" sizes="(max-width: 458px) 100vw, 458px" /></a><figcaption>Figura 4 &#8211; Resultado da classificação das caixas delimitadoras.</figcaption></figure></div>



<p>A combinação da confiança da caixa, com a probabilidade da classe, geram a pontuação final. Essa pontuação indica qual a probabilidade de uma determinada caixa delimitadora conter um objeto <a href="#refs">[JO]</a>.</p>



<p>Boa parte das caixas detectadas, possuem um grau de confiança muito baixo. Para eliminar a maioria das caixas podemos atribuir uma limiar de confiança, de 70% por exemplo, e remover o que estiver abaixo deste valor. Nesta etapa a confiança atribuída é de 30%.</p>



<p>A rede neural usa recursos de toda a imagem para prever cada caixa delimitadora, ela também prevê todas as caixas delimitadoras em todas as classes para uma imagem simultaneamente. Isso significa que a rede raciocina globalmente sobre a imagem completa e todos os objetos na imagem <a href="#refs">[MC].</a></p>



<h3>Resultado caixas delimitadoras:</h3>



<p>Cada caixa delimitadora no YOLO contém 3 grupos de informações/atributos:</p>



<ul><li><strong>Probabilidade de confiança</strong>: Atributo com a probabilidade de existir um objeto na determinada caixa;</li><li><strong>Coordenadas</strong>: Contém a localização da caixa delimitadora/objeto. A localização no YOLO é representada com posição  central do objeto, sua altura e sua largura;</li><li><strong>Probabilidade da classe</strong>: Atributo com a probabilidade de ser determinado objeto. Para cada tipo de objeto que a rede neural do YOLO foi treinada é acrescentado um novo atributo.</li></ul>



<p>Na Figura 5 abaixo, é representado esses 3 grupos de atributos.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/07/yolo_mapa_filtro_precisao.png" alt="" class="wp-image-3437" width="395" height="521" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/07/yolo_mapa_filtro_precisao.png 600w, https://visaocomputacional.com.br/wp-content/uploads/2022/07/yolo_mapa_filtro_precisao-228x300.png 228w" sizes="(max-width: 395px) 100vw, 395px" /><figcaption>Figura 5 &#8211; Mapa de saída do YOLO <a href="#refs">[AG2]</a>.</figcaption></figure></div>



<p>Finalizada a coleta/predição das probabilidades de cada caixa delimitadora, agora é preciso decidir quais caixas de fato são ou não são objetos. Para realizar esta decisão/predição, em sua última etapa de detecção, o YOLO realiza o processo de supressão não máxima.  </p>



<h3>Supressão não máxima/Non maximum suppression</h3>



<p>Durante o processo de detecção de objetos, são identificadas varias caixas delimitadoras contendo objetos. Porém, a maioria das caixas não vai conter um objeto, ou compartilham a mesma região de um mesmo objeto. Portanto é necessário realizar uma etapa para remover as caixas com baixas probabilidade e/ou que possuem uma área compartilhada.</p>



<p>A Figura 6 abaixo, ilustra esse processo de tomada de decisão realizada pelo YOLO e diversas outras redes neurais.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" width="629" height="419" src="https://visaocomputacional.com.br/wp-content/uploads/2022/08/supressao_nao_maxima.png" alt="" class="wp-image-3447" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/08/supressao_nao_maxima.png 629w, https://visaocomputacional.com.br/wp-content/uploads/2022/08/supressao_nao_maxima-300x200.png 300w" sizes="(max-width: 629px) 100vw, 629px" /><figcaption>Figura 6 &#8211; Supressão não máxima.</figcaption></figure></div>



<h3>Âncoras/Anchor Box</h3>



<p>As ancoras são retângulos de tamanhos pré-definidos, que foram incluídas a partir da versão 2 do YOLO. Estes retângulos são utilizados, para que as caixas delimitadoras previstas, possuam maior relação com as caixas delimitadoras esperadas como resultado. </p>



<p>Estas âncoras possuem tamanhos altura e largura próximos aos tamanhos dos objetos identificados. Elas são criadas durante o processo de treinamento da rede neural, com base nas classes de objetos. </p>



<p>A partir das coordenadas das caixas dos objetos detectadas, são selecionadas as âncoras de cada objeto, redimensionadas para a proporção dos objetos identificados e utilizadas como saída da rede neural YOLO.  </p>



<p>A rede neural YOLO não prevê o tamanho final do objeto, ela apenas ajusta o tamanho da âncora mais próxima ao tamanho do objeto.</p>



<p>Na Figura 7 abaixo, é exibido o resultado de todo o processo de detecção com o YOLO.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_result.jpg" alt="" class="wp-image-3511" width="456" height="342" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_result.jpg 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/08/yolo_result-300x225.jpg 300w" sizes="(max-width: 456px) 100vw, 456px" /><figcaption>Figura 7 &#8211; Resultado da detecção com YOLO.</figcaption></figure></div>



<h2>Resumo</h2>



<p>O YOLO cria diversas caixas delimitadoras. Para cada caixa, é atribuido um valor de confiaça, com a porcentagem (0 até 1) de existir uma objeto. Também é realizado a predição de que tipo de objeto existe na caixa.&nbsp;O valor de confiança para a caixa delimitadora e a predição da classe são combinados em uma pontuação final, que vai informar a probabilidade dessa caixa conter um objeto específico. Por fim é realizada o processo de supressão não máxima afim de &#8220;filtrar&#8221;/&#8221;Eliminar&#8221; falsos objetos e mesclar regiões de um mesmo objeto que assumem o tamnho conforme o tamanho da âncora <a href="#refs">[AG]</a>.</p>



<p>O processo de predição do YOLO é realizado a partir de uma grid de 13×13 células, o que no final resulta em 169 células. Para cada uma dessas células, são detectadas 5 caixas delimitadoras, o que resulta em 845 caixas com possíveis objetos <a href="#refs">[AG]</a>.&nbsp;</p>



<p></p>



<div class="wp-block-image"><figure class="aligncenter"><img src="https://cdn.shortpixel.ai/spai/w_722+q_+ret_img+to_webp/https://iaexpert.academy/wp-content/uploads/2020/10/processo-yolo.jpg" alt="" class="wp-image-21488"/><figcaption>Figura 8 &#8211; Resumo das operações YOLO.</figcaption></figure></div>



<h2>Um pouco de história</h2>



<p>Joseph Redmon introduziu a primeira versão em seu paper publicado em junho de 2015:&nbsp;<a href="https://arxiv.org/pdf/1506.02640.pdf">You Only Look Once: Unified, Real-Time ObjectDetection</a>.</p>



<p>Em dezembro de 2016, Redmon e Ali Farhadi introduziram o YOLOv2 com o paper: “<a href="https://arxiv.org/abs/1612.08242">YOLO9000: Better, Faster, Stronger</a>, mais preciso e mais rápido que a versão anterior <a href="#refs">[AG]</a>.</p>



<p>Em abril de 2018, o YOLOv3 (“<a href="https://arxiv.org/pdf/1804.02767.pdf">YOLOv3: An Incremental Improvement</a>“) demonstrou uma grande melhora na eficiência da predição. No entanto, no geral ele não é mais rápido que a versão anterior. A principal novidade é a predição da imagem em 3 diferentes escalas, o que resolveu o principal problema da versão anterior, que era a dificuldade para reconhecer objetos muito pequenos na imagem. Essa novidade também é o principal motivo de não ser mais rápido que o seu antecessor, já que tal função exigiu mudanças na arquitetura e funcionamento, que tornaram o processo mais pesado <a href="#refs">[AG]</a>.</p>



<p>A quarta versão do YOLO foi lançada em abril de 2020, sendo oficializada após a publicação do paper<em>&nbsp;“YOLOv4: Optimal Speed and Accuracy of Object Detection”</em>&nbsp;por Alexey Bochkovskiy, Chien-Yao Wang e Hong-Yuan Mark Liao<em>.</em></p>



<p>As principais características que podem ser destacadas nessa versão são melhorias na velocidade e precisão. Outra característica importante é o fato de ser mais eficiente para rodar em GPUs, pois foi otimizado para utilizar menos memória <a href="#refs">[AG]</a>.</p>



<p>Nos próximos posts, serão detalhadas estas 4 versões. Espero que tenha gostado do post, deixe seu comentário abaixo.</p>



<p id="refs"><strong>Referências:</strong></p>



<p>[AG] Alvez, Gabriel. Detecção de Objetos com YOLO – Uma abordagem moderna. <a href="https://iaexpert.academy/2020/10/13/deteccao-de-objetos-com-yolo-uma-abordagem-moderna/">Acessado em 15/07/2022</a>.</p>



<p>[RJFA] Redmon, Joseph and Farhadi, Ali, YOLO: Real-Time Object Detection. <a href="https://pjreddie.com/darknet/yolo/">Acessado em 29/06/2022,</a></p>



<p>[MC] Manish Chablani, YOLO — You only look once, real time object detection explained<a href="https://towardsdatascience.com/yolo-you-only-look-once-real-time-object-detection-explained-492dc9230006">. Acessado em 29/06/2022.</a></p>



<p>[RJFA2] Redmon, Joseph and  Farhadi, Ali, YOLO9000: Better, Faster, Stronger. <a href="https://arxiv.org/pdf/1612.08242v1.pdf">Artigo</a>.</p>



<p>[AK] Ayoosh Kathuria &#8211; What’s new in YOLO v3.  <a href="https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b">Acessado em 26/07/2022.</a></p>



<p>[AK2] Ayoosh Kathuria &#8211; How to implement a YOLO (v3) object detector from scratch in PyTorch: Part 1. <a href="https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/">Acessado em 26/07/2022</a></p>



<p>[JP] Jilvan Pinheiro; Módulo OCR de leitura e reconhecimento de documentos. Acessado em <a href="https://medium.com/softwrap/m%C3%B3dulo-ocr-de-leitura-e-reconhecimento-de-documentos-dbe8703f6bb5">12/08/2022</a></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/yolo-para-deteccao-de-objetos-visao-geral/">YOLO para Detecção de Objetos  &#8211; Visão Geral</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Identificação, Detecção, Reconhecimento e Segmentação de Imagem e Objetos.</title>
		<link>https://visaocomputacional.com.br/identificacao-deteccao-reconhecimento-e-segmentacao-de-imagem-e-objetos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=identificacao-deteccao-reconhecimento-e-segmentacao-de-imagem-e-objetos</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Sun, 01 May 2022 01:07:24 +0000</pubDate>
				<category><![CDATA[Conceitos básicos]]></category>
		<category><![CDATA[Detecção de Objetos]]></category>
		<category><![CDATA[Identificação de objetos]]></category>
		<category><![CDATA[Reconhecimento]]></category>
		<category><![CDATA[Segmentação de imagem]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=3127</guid>

					<description><![CDATA[<p>Uma das operações mais importantes em Visão Computacional é a Segmentação. A segmentação de imagens é a tarefa de agrupar partes de uma imagem que pertencem à mesma classe de objeto. Esse processo também é chamado de classificação em nível de pixel. Em outras palavras, envolve o particionamento de imagens (ou quadros de vídeo) em [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/identificacao-deteccao-reconhecimento-e-segmentacao-de-imagem-e-objetos/">Identificação, Detecção, Reconhecimento e Segmentação de Imagem e Objetos.</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Uma das operações mais importantes em Visão Computacional é a Segmentação. A segmentação de imagens é a tarefa de agrupar partes de uma imagem que pertencem à mesma classe de objeto. Esse processo também é chamado de classificação em nível de pixel. Em outras palavras, envolve o particionamento de imagens (ou quadros de vídeo) em vários segmentos ou objetos.</p>



<p>A operação de segmentação de imagens pode ser facilmente confundida pelas duas operações: identificação de objetos e regiões, e classificação e rotulação. A primeira operação busca extrair objeto da imagem sem saber o que ele é necessariamente, e a segunda classificar o tipo de objeto e região, saber o que é determinado elemento, a quem pertence o tipo do elemento identificado através de rótulos nomeados.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="575" src="https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_detec_recog-1-1024x575.jpg" alt="" class="wp-image-3134" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_detec_recog-1-1024x575.jpg 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_detec_recog-1-300x168.jpg 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_detec_recog-1-768x431.jpg 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_detec_recog-1-1536x862.jpg 1536w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_detec_recog-1.jpg 1925w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Ilustração de segmentação, reconhecimento e identificação de objetos.</figcaption></figure>



<p>Para entender melhor estas operações, vamos analisar cenários diferentes e posteriormente mencionar algumas técnicas conhecidas para cada tipo de operação.</p>



<h2>Cenário 1 e 2 &#8211; Detectar objetos e regiões em veículos autônomos</h2>



<p>Neste primeiro cenário, explanamos um dos vários problemas que os veículos autônomos precisam lidar, que é segregar/separar a imagem em regiões ou objetos detectados, porém sem a necessidade de saber o que eles são. Esta operação é necessária para que o veículo saiba todos os obstáculos que estão em seu caminho, se possui chão a sua frente ou uma parede, e assim saber como ele pode se descolocar no ambiente.</p>



<p>A grande características desta operação, é que não se precisa saber neste momento, o que é determinada coisa a sua frente, se o elemento é um carro, uma pessoa, uma placa, um poste, um semáforo ou uma moto, por exemplo. Mas sim, saber que existe objetos e regiões, e saber onde estão.</p>



<p>Este tipo de operação é denominado de <strong>segmentação de imagem</strong>, que consiste em separar a imagem em regiões de interesse com o objetivo de simplificar e/ou mudar a representação de uma imagem para facilitar a sua análise.</p>



<p>Neste cenário, com a segmentação de imagem, o veículo autônomo ao se mover pode monitorar essas regiões e: verificar se são objetos fixos ou se estão se movendo; se estão se movendo e para qual direção estão se deslocando; e identificar se os objetos irão colidir com o veículo.</p>



<p>Uma outra utilidade, para este tipo de operação, é possibilitar separar o solo da imagem para posteriormente analisá-lo, a fim de saber se é uma estrada ou calçada, se é subida ou descida, se é chão de barro ou asfalto.</p>



<p>Para ilustrar este cenário, observe a imagem abaixo com uma segmentação de imagem. Existem diversas técnicas de segmentação e essas técnicas que detectam varias regiões, geralmente não agrupam por tipo de objeto, como foi realizado abaixo. Geralmente são grupos desconexos e não rotulados (sem classificação), porém, na imagem abaixo, os grupos foram rotulados apenas para facilitar o entendimento. </p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="788" src="https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_segmentation-1024x788.jpeg" alt="" class="wp-image-3145" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_segmentation-1024x788.jpeg 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_segmentation-300x231.jpeg 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_segmentation-768x591.jpeg 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_segmentation.jpeg 1170w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Fig 01 &#8211; Segmentação de imagem.</figcaption></figure>



<p>No segundo cenário, continuamos com o exemplo do veículo autônomo, porém, agora vamos analisar as situações em que precisamos identificar e rotular quais são os tipos de objetos a frente do veículo.  </p>



<p>Sendo assim, digamos que o veículo precise identificar quais sinais de trânsito estão a sua frente, quais carros e pessoas. Esta operação é <strong>denominada de classificação e rotulação</strong>, e o resultado esperado é a extração de determinados tipos de objetos, qual sua localização e identificação.</p>



<p>É imprescindível identificar, neste cenário, o que é determinado objeto para a tomada de decisões especiais, por exemplo, ao identificar uma placa de proibido virar a direita, o veículo deve saber que não poderá virar a direita, ao identificar um semáforo, saber se pode ou não prosseguir e se identificar veículos, pessoas ou outros seres, aumentar toda a segurança para não colidir com estes.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="769" src="https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_identification-1024x769.jpeg" alt="" class="wp-image-3148" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_identification-1024x769.jpeg 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_identification-300x225.jpeg 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_identification-768x577.jpeg 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_identification.jpeg 1170w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Fig 02 &#8211; Classificação de imagem.</figcaption></figure>



<h2>Cenário 3 &#8211; Detectar documento para realinhamento</h2>



<p>Em um cenário mais simples e controlado, digamos que precisamos extrair da imagem a região com determinado documento e identificar suas bordas para realizar alguma técnica de alinhamento.</p>



<p>Neste caso, podemos converter a imagem em tons de cinza, detectar as bordas e linhas retas com técnicas de visão computacional e procurar por regiões retangulares para realizar uma extração do documento da imagem.</p>



<p>As técnicas que detectam bordas e linhas retas, são técnicas de <strong>segmentação de imagem</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="342" src="https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_text-1024x342.jpeg" alt="" class="wp-image-3179" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_text-1024x342.jpeg 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_text-300x100.jpeg 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_text-768x256.jpeg 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_text-1536x513.jpeg 1536w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/seg_text-2048x684.jpeg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Fig 03 &#8211; Segmentar documento de imagem e recortar documento da imagem.</figcaption></figure>



<h2>Cenário 4 &#8211; Detectar rostos e realizar reconhecimento facial</h2>



<p>Em nosso último cenário, vamos analisar superficialmente um sistema de portaria eletrônica com reconhecimento facial, que habilita a entrada de pessoas em seu apartamento. Neste tipo de sistema é preciso realizar ao menos duas etapas de classificação de imagem.</p>



<p>A primeira etapa necessária é a detecção de rostos na imagem ou câmera digital e segmentação da imagem em subimagens, apenas com os rostos. Este tipo de operação é realizada em tempo real, onde o sistema fica monitorando toda a movimentação da câmera com o objetivo de identificar rostos na imagem, sem a necessidade de saber quem é a pessoa, apenas procurando por rostos.</p>



<p>A segunda etapa a ser realizada, é feita após a identificação do rosto, onde o sistema irá comparar se o rosto identificado é de alguém habilitado a entrar no apartamento e então liberar o acesso. A imagem abaixo busca ilustrar esses dois tipos de problemas de classificação.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="472" src="https://visaocomputacional.com.br/wp-content/uploads/2022/03/fac_recog_sistem-1024x472.jpg" alt="" class="wp-image-3197" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/03/fac_recog_sistem-1024x472.jpg 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/fac_recog_sistem-300x138.jpg 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/fac_recog_sistem-768x354.jpg 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/fac_recog_sistem.jpg 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Fig 04 &#8211; Classificar se duas imagens pertencem a uma mesma pessoa.</figcaption></figure>



<p>Apesar dessas duas etapas serem operações de classificação de imagem, seus objetivos são muito diferentes e para cada uma delas existem soluções diferentes. Para a primeira técnica, a de detecção, existem diversas soluções genéricas capazes de identificar determinado tipo de informação na imagem. Porém na segunda, a de reconhecimento, que exige uma precisão maior, geralmente precisa de uma solução específica para cada situação.</p>



<h2>Segmentação de imagem</h2>



<p>A segmentação tem como objetivo dividir uma imagem em regiões ou objetos que a compõem. O nível de detalhe, que a divisão é realizada, depende do tipo de problema a ser resolvido. Em resumo, a segmentação deve parar quando os objetos e regiões são encontrados <a href="#refs">[GW]</a>.  </p>



<p>A segmentação de imagens não triviais (não obvias), é uma das tarefas mais difíceis no processamento de imagens. A precisão da segmentação que identifique corretamente a localização, a forma dos objetos, a topologia é fundamental para o sucesso final dos procedimentos de análise computadorizadas <a href="#refs">[GW]</a>. </p>



<p>A seguir são apresentadas as principais técnicas de segmentação de imagens, baseadas nos valores de intensidade dos pixels da imagem, com ênfase nas técnicas de detecção de descontinuidades, gradiente, limiarização, identificação de regiões e classificadores.</p>



<h3><span style="font-size: revert; color: initial;">Detecção de Descontinuidades</span></h3>



<p>Este tipo de técnica particiona a imagem a partir de alterações bruscas nas intensidades de imagens, como <strong>pontos, linhas bordas e junções</strong>. Uma maneira comum de identificação de descontinuidade, é por meio de aplicações de uma máscara por uma <a href="/tag/convolucao/">convolução espacial</a> <a href="#refs">[PS]</a>. </p>



<p>Esta técnica analisa a variação de intensidade utilizando uma única camada de cor da imagem, geralmente uma camada em tons de cinza da imagem. Porém, a análise pode ser feita através da representação de uma das cores da imagem, da iluminação, do brilho ou da saturação da imagem. </p>



<p>Observe na Figura 4, a representação A e B das variações de intensidade dos tons de cinza, note que na representação A a mudança de tons de cinza é muito mais abrupta que a representação B. É com base na análise deste variação abrupta que as técnicas de segmentação de imagem por descontinuidade funcionam.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/varicao_intensidade-1024x517.png" alt="" class="wp-image-3218" width="564" height="284" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/04/varicao_intensidade-1024x517.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/varicao_intensidade-300x151.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/varicao_intensidade-768x388.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/varicao_intensidade.png 1323w" sizes="(max-width: 564px) 100vw, 564px" /><figcaption>Fig 4. Representação de variação de intensidade em tons de cinza.</figcaption></figure></div>



<p>Veja na Figura 5 a aplicação desta técnica, ao aplicar o operador Laplaciano em duas imagens em tons de cinza. Com uma simples técnica de <a href="/tag/convolucao/">convolução</a> foi possível detectar as bordas de uma imagem.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/laplaciano.png" alt="" class="wp-image-3221" width="331" height="506" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/04/laplaciano.png 440w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/laplaciano-196x300.png 196w" sizes="(max-width: 331px) 100vw, 331px" /><figcaption>Fig 5. Aplicação do operador Laplaciano.</figcaption></figure></div>



<h3>Gradiente e Bordas</h3>



<p>Existem diversas outras técnicas e também operadores capazes de detectar/destacar melhor as bordas em imagens como exemplo, Sobel, Roberts e Canny, e são conhecidos como operações de gradiente, pois realçam a maior variação de gradiente na imagem. Porém, são menos simples de aplicar e realizam operações de derivadas.</p>



<p>Observe na Figura 6 o resultado da aplicação do filtro Sobel na imagem e como ele destacou as bordas na imagem.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/sobel.png" alt="" class="wp-image-3226" width="291" height="378" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/04/sobel.png 440w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/sobel-231x300.png 231w" sizes="(max-width: 291px) 100vw, 291px" /><figcaption>Fig 6. Aplicação do filtro Sobel.</figcaption></figure></div>



<h3>Limiarização</h3>



<p>Limiarização é um processo de segmentação de imagens que se baseia na diferença dos níveis de cinza, que compõe diferentes regiões de uma imagem. A partir de uma limiar definida a imagem é separada em 2 grupos.</p>



<p>A técnica mais simples de limiarização, consiste em varrer cada pixel da imagem e verificar se o valor do pixel é maior ou menor que uma limiar preestabelecida e gerar uma nova imagem com apenas duas cores. A Figura 7 ilustra a aplicação de uma limiarização simples, com uma limiar de 100.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/limiarizacao.png" alt="" class="wp-image-3231" width="340" height="248" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/04/limiarizacao.png 657w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/limiarizacao-300x219.png 300w" sizes="(max-width: 340px) 100vw, 340px" /><figcaption>Fig 7. Aplicação do filtro de Limiarização.</figcaption></figure></div>



<p>Existem muitas técnicas de limiarização e todas elas utilizam o <a href="/tag/histograma">histograma</a> da imagem como tomada de decisão. Entre as técnicas mais conhecidas estão o método de Otsu, o método de Seleção Iterativa, a limiarização adaptativa média, a limiarização adaptativa gaussiana e a limiarização global simples. </p>



<h3>Segmentação de regiões</h3>



<p>Como descrito no começo do post, o objetivo da segmentação é dividir a imagem em regiões e a seguir serão apresentadas as técnicas usadas com esse objetivo.</p>



<p>A primeira técnica apresentada é a técnica de segmentação por crescimento de região. Os métodos de segmentação baseados em região visam reunir em um mesmo conjunto, pixels adjacentes que atendem a um dado critério de diversidade. Desta forma, regiões da imagem são agrupadas ou divididas, dependendo de seus pixels terem ou não características semelhantes em termos de cor, textura ou forma.</p>



<p>Está técnica necessita de ao menos duas informações, uma limiar de similaridade e um conjunto de locais/pontos inicias, que serão utilizados para começar o agrupamento. Para ilustrar, observe a matriz da Figura 8.a, nela foram selecionados 4 pontos de forma aleatória, para iniciar o processo de agrupamento de região. Após selecionar os locais iniciais, foi comparada a vizinhança destes pontos com uma limiar de tamanho 2, caso o valor seja uma diferença igual a este tamanho, a vizinhança será agrupada, conforme ilustra a Figura 8.c. Este processo é repetido até percorrer todos os locais da Imagem.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/crescimento_regiao-1024x831.png" alt="" class="wp-image-3238" width="618" height="501" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/04/crescimento_regiao-1024x831.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/crescimento_regiao-300x243.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/crescimento_regiao-768x623.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/crescimento_regiao.png 1256w" sizes="(max-width: 618px) 100vw, 618px" /><figcaption>Fig 8. Crescimento por região.</figcaption></figure></div>



<p>Neste tipo de técnica existem dois grandes problemas, que são os problemas de todas as técnicas de segmentação, que são: identificar quantos pontos iniciais serão utilizados, ou qual nível/profundidade de segmentação é desejada,  e qual o critério ou limiar de similaridade que devemos utilizar.</p>



<p>Observe na Figura 8.d que possuímos também um terceiro problema, que os valores 3 da matriz, não foram agrupados ainda. Porém, dependendo da ordem de processamento, estes valores poderiam ser agrupados com os valores 1 ou com os valores 5, conforme demonstrado nas figuras 8.g e 8.h. Para piorar a situação, talvez o ideal fosse que estes valores estivessem segmentados em uma única região, se tivesse sido iniciado o processo de segmentação com um ponto inicial a mais.</p>



<p>Uma outra  técnica é a técnica de divisor de águas Watershed. O método de segmentação calcula o gradiente para todos os pixels da imagem. Imagine que os valores de gradiente formem uma superfície topográfica com vales e montanhas. As regiões mais baixas, conforme Figura 9.c seriam correspondentes as de menor gradiente e as mais altas as de maior gradiente. Os crescimentos de regiões seriam equivalentes a uma inundação feita a partir da abertura de um pequeno furo nas regiões mais baixas. Os segmentos seriam formados por regiões conforme se formam bacias hidrográficas, daí o nome divisor de águas.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="295" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/watershed-basics-1024x295.png" alt="" class="wp-image-3247" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/04/watershed-basics-1024x295.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/watershed-basics-300x87.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/watershed-basics-768x221.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/watershed-basics.png 1172w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Fig 9. Ilustração processo Watershed.</figcaption></figure>



<p>E uma última técnica muito interessante, é a segmentação por movimento. O conceito desta técnica é simples, através da análise do deslocamento dos objetos são extraídas as regiões de interessa da imagem. Este tipo de técnica é uma ferramenta poderosa de segmentação em ambiente abertos e cenários não controlados. Não existe uma solução única ou genérica para esta técnica, mas existem diversos trabalhos na literatura com esse objetivo. Abaixo são demostrados os resultados de dois artigos a fim de ilustrar a técnica.</p>



<figure class="wp-block-gallery aligncenter columns-2 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img loading="lazy" width="1024" height="867" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/segmentacao_movimento-1024x867.jpeg" alt="" data-id="3249" class="wp-image-3249" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/04/segmentacao_movimento-1024x867.jpeg 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/segmentacao_movimento-300x254.jpeg 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/segmentacao_movimento-768x650.jpeg 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/segmentacao_movimento.jpeg 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure></li><li class="blocks-gallery-item"><figure><img loading="lazy" width="618" height="564" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/segmentacao_movimento_carrro.jpeg" alt="" data-id="3252" data-full-url="https://visaocomputacional.com.br/wp-content/uploads/2022/04/segmentacao_movimento_carrro.jpeg" data-link="https://visaocomputacional.com.br/?attachment_id=3252" class="wp-image-3252" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/04/segmentacao_movimento_carrro.jpeg 618w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/segmentacao_movimento_carrro-300x274.jpeg 300w" sizes="(max-width: 618px) 100vw, 618px" /></figure></li></ul><figcaption class="blocks-gallery-caption">Fig 10. Ilustração de segmentação por movimentação dos trabalhos <a href="https://visaocomputacional.com.br/wp-admin/post.php?post=3127&amp;action=edit#refs">[MSBTV]</a> e <a href="#refs">[VJ]</a></figcaption></figure>



<p>Todas estas técnicas descritas até então, são técnicas que segmentam imagem sem rotulação, ou seja, como resultado da sua aplicação não se sabe o que é o objeto segmentado. A seguir será discutido brevemente o conceito de classificação de imagem, que tem com objetivo rotular a imagem.</p>



<h2>Classificação, Detecção e Identificação de objetos</h2>



<p>A classificação de padrões ou imagens, visa determinar um mapeamento que relacione as propriedade extraídas de amostras com um conjunto de rótulos, e ao atribuir um mesmo rótulo a amostras distintas, diz-se que tais elementos pertencem a uma mesma classe <a href="#refs">[PS]</a>.</p>



<p>O conceito de classificação está relacionado ao aprendizado de máquina, reconhecimento de padrões e inteligência artificial (IA) que se baseiam na ideia de que sistemas podem aprender com dados, identificar padrões e tomar decisões para uma variedades de possibilidades. Para simplificar, vamos nos limitar a ideia e ao conceito de classificar imagens através de rótulos, para identificar esse rótulos e detectar algo em outras imagens e vídeos.</p>



<p>Antes de prosseguir, saiba que o conceito de classificação não é considerado parte da área de segmentação de imagens, porém é muito utilizado para este fim, com diversas soluções para segmentar imagens.</p>



<p>Agora, vamos analisar o segundo cenário novamente, onde temos a imagem da vista de um carro para a rua e nela queremos identificar pedestres, carros e sinais de trânsito. Para isto, precisamos ao menos realizar três etapas: criar e coletar uma base de imagens, treinar algum algoritmos de classificação e utilizar o algoritmo treinado para classificar outras imagens.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_identification-1024x769.jpeg" alt="" class="wp-image-3148" width="355" height="266" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_identification-1024x769.jpeg 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_identification-300x225.jpeg 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_identification-768x577.jpeg 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/stree_identification.jpeg 1170w" sizes="(max-width: 355px) 100vw, 355px" /><figcaption>Fig 11 &#8211; Classificação de imagem.</figcaption></figure></div>



<p>A tarefa de criação de base de dados é a mais simples das três tarefas, porém muito onerosa, pois demanda muito tempo para se criar uma base de dados e dependendo da precisão desejada essa tarefa se torna uma tarefa continua.  Para o cenário 2, a base de dados deve ser criada com no mínimo três informações: a imagens com o que se deseja rotular, a localização de todos os objetos de interesse na imagem para todas as imagens e o nome do rótulo. Dependendo do algoritmo, mais informações são necessárias.</p>



<p>A segunda tarefa de treinamento, de modo geral, consiste em informar a base de dados para ser treinada no algoritmo e aguardar seu treinamento. Esta tarefa costuma ser demorada para ser finalizada, pois exige muito processamento do computador, podendo levar horas ou dias. Caso não se tenha um computador com uma placa de vídeo, é recomendado que a tarefa seja feita em algum computador na nuvem que a tenha.</p>



<p>A última etapa, consiste em utilizar o algoritmo treinado para identificar os rótulas na imagem. Estas três etapas são mais complexas do que isso que foi exposto, porém a ideia geral das técnicas de classificação é essa. </p>



<p>Na Figura 12 é apresentado o resultado do algoritmo YOLO &#8211; You Only Look Once, que significa &#8220;Você só olha uma vez&#8221;. A ideia do YOLO é que ao receber uma imagem a ser rotulada, ele consiga identificar todos os rótulos treinados de uma única vez. </p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/yolo-1024x765.png" alt="" class="wp-image-3273" width="574" height="428" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/04/yolo-1024x765.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/yolo-300x224.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/yolo-768x574.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/04/yolo.png 1367w" sizes="(max-width: 574px) 100vw, 574px" /><figcaption>Fig 12. Resultado da aplicação do algoritmo YOLO via <a href="https://pjreddie.com/darknet/yolo/">darknet</a>.</figcaption></figure></div>



<p>O que &#8220;identificar todos os rótulos de uma única vez&#8221; quer dizer? Bom, para explicar isso, antes vamos precisar entender outro tipo de técnica. Observe na Figura 13 a ilustração de uma RNA &#8211; Rede Neural Artificial, técnica de IA inspirada no sistema nervoso central de um animal (em particular o cérebro). Esta rede neural foi treinada como objetivo de identificar, se na imagem existe um cachorro, um gato ou nenhum dos dois.</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="722" height="406" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/1_oB3S5yHHhvougJkPXuc8og.webp" alt="" class="wp-image-3276"/><figcaption>Fig 13 &#8211; Classificação de imagem simples usando rede neural convolucional <a href="#refs">[VT]</a>.</figcaption></figure>



<p>Porém, esta rede neural ilustrativa, foi criada de tal forma que só é possível confirmar se na imagem possuir apenas um gato ou um cachorro, caso a imagem possuir mais de um gato, ou um gato e um cachorro, por exemplo, ela não saberá identificar. Para resolver este tipo de problema, boa parte das técnicas de classificação tem como solução, percorrer a imagem em regiões menores, testando cada parte da imagem, a fim de identificar a existência de objetos rotulados, e localizar sua posição, conforme ilustra a figura abaixo.</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img loading="lazy" src="https://visaocomputacional.com.br/wp-content/uploads/2022/04/sliding_window_example.gif" alt="" class="wp-image-3284" width="296" height="436"/><figcaption>Fig 14 &#8211; Percorrer a imagem em regiões menores.</figcaption></figure></div>



<p>De volta ao YOLO, sua diferença com a técnica apresentada anteriormente, é que sua mecânica não necessita percorrer a imagem em regiões menores para identificar mais de um rótulo ou objeto, pois utilizando toda a região da imagem ele consegue identificar tantos objetos, quanto sua etapa de treinamento o ensinou. Porém, não quer dizer que dividir a imagem em regiões menores, também não possa ser feito com o YOLO, mas então entraríamos em outras questões, como performance, precisão e técnicas de treinamento. </p>



<p>Existem diversas técnicas de classificação de imagem para rotulação, que utilizam estes dois conceitos apresentados,  cada uma com sua característica e vantagem, abaixo trago algumas conhecidas:</p>



<ul><li>R-CNN – Region-based Convolutional Neural Networks</li><li>SPP-net – Spatial Pyramid Pooling</li><li>Fast R-CNN</li><li>Faster R-CNN</li><li>SSD &#8211; Single Shot Detector</li><li>R-FCN</li></ul>



<p>Além das técnicas de classificação, para rotulação de objetos conhecidos, existem diversos estudos que utilizam IA para segmentar a imagem em regiões, conforme descrito no cenário 1 e não foram apresentadas neste post para não delongá-lo, pois seu objeto é transmitir uma visão geral sobre segmentação de imagens. </p>



<p>Caso tenha dúvidas ou sugestões de melhorias no post, deixe seu comentário abaixo.</p>



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



<p>[GW] GONZALEZ, R. C., WOODS, R. E. Processamento de Imagens Digitais. Editora Edgard Blucher, ISBN 978-85-8143-586-2, 3 ed., São Paulo, 2010</p>



<p>[PS] Pedrini, H.; Schwartz, W. R.; Análise de Imagens Digitais: Princípios, Algoritmos e Aplicações. Thomson Learning, 2007</p>



<p>[MSBTV]  M. Keuper, S. Tang, B. Andres, T. Brox and B. Schiele, &#8220;Motion Segmentation &amp; Multiple Object Tracking by Correlation Co-Clustering&#8221; in IEEE Transactions on Pattern Analysis &amp; Machine Intelligence, vol. 42, no. 01, pp. 140-153, 2020.<br>doi: 10.1109/TPAMI.2018.2876253</p>



<p>[VJ] Vertens, Johan et al. “SMSnet: Semantic motion segmentation using deep convolutional neural networks.” 2017 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS) (2017): 582-589.</p>



<p>[VT] Venkatesh Tata. Simple Image Classification using Convolutional Neural Network — Deep Learning in python. <a href="https://becominghuman.ai/building-an-image-classifier-using-deep-learning-in-python-totally-from-a-beginners-perspective-be8dbaf22dd8">Acessado em 14/04/2022</a>.</p>



<p>[DK] Darknet. YOLO: Real-Time Object Detection. <a href="https://pjreddie.com/darknet/yolo/">Acessado em 15/04/2022</a>.</p>



<p></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/identificacao-deteccao-reconhecimento-e-segmentacao-de-imagem-e-objetos/">Identificação, Detecção, Reconhecimento e Segmentação de Imagem e Objetos.</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Experimento &#8211; NDVI e NDWI com o Google Earth Engine</title>
		<link>https://visaocomputacional.com.br/experimento-ndvi-e-ndwi-com-o-google-earth-engine/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=experimento-ndvi-e-ndwi-com-o-google-earth-engine</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Fri, 18 Mar 2022 00:22:54 +0000</pubDate>
				<category><![CDATA[Experimentos]]></category>
		<category><![CDATA[Google Earth Engine]]></category>
		<category><![CDATA[NDVI]]></category>
		<category><![CDATA[NDWI]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=3041</guid>

					<description><![CDATA[<p>Detectando água e vegetação na superfícies terrestres a partir de imagens multiespectrais de satélites.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/experimento-ndvi-e-ndwi-com-o-google-earth-engine/">Experimento &#8211; NDVI e NDWI com o Google Earth Engine</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 - NDVI e NDWI com o Google Earth Engine" width="800" height="450" src="https://www.youtube.com/embed/6FVhfF13q9E?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
</div></figure>



<p>Neste experimento, vamos demostrar a aplicação das técnicas NDWI e NDVI, capazes de identificar água e a saúde da vegetação, por meio de imagens públicas de satélites com o Google Earth Engine. Essas técnicas foram apresentadas no post <a href="https://visaocomputacional.com.br/ndvi-e-ndwi-indice-de-vegetacao-e-indice-de-agua/">&#8220;Índice de Vegetação e Índice de Água&#8221;</a>.</p>



<p>A técnica NDVI &#8211; Índice de vegetação por diferença normalizada, identifica a saúde da planta, calculando a diferença de refletância entre o infravermelho-próximo e o vermelho, com a fórmula:</p>



<pre class="wp-block-preformatted"><strong>Fórmula:</strong> NDVI = (Infravermelho Próximo - Vermelho) / (Infravermelho Próximo + Vermelho).</pre>



<p>A técnica NDWI &#8211;  Índice de vegetação por diferença normalizada identifica água, inundações, mar, etc. Calculando a diferença de refletância entre o infravermelho-próximo e o verde, com a fórmula:</p>



<pre class="wp-block-preformatted"><strong>Fórmula:</strong> NDWI = (Verde – Infravermelho Próximo) / (Verde + Infravermelho Próximo).</pre>



<p>Estas duas técnicas diferentes, podem ser aplicadas em imagens de satélite ou através de câmeras infravermelho de forma muito simples. Neste post, iremos demonstrar como aplicá-las com a ferramenta Google Earth Engine utilizando uma base de dados geoespaciais pública, para pesquisa. </p>



<h2>Google Earth Engine</h2>



<p>É uma ferramenta desenvolvida pela Google que combina um catálogo de várias de imagens de satélite e conjuntos de dados geoespaciais com recursos de análise em escala planetária. Com o objetivo, de que cientistas, pesquisadores e desenvolvedores usam o Earth Engine para detectar mudanças, mapear tendências e quantificar diferenças na superfície da Terra. </p>



<p>A ferramenta está disponível para uso comercial e é gratuito para uso acadêmico e de pesquisa. Para utilizar o Code Editor, basta acessar o link <a href="https://code.earthengine.google.com/">&#8220;code&#8221;</a>, realizar o login com sua conta do Google e de um navegador web desktop. A ferramenta contém os seguintes 4 painéis:</p>



<ul><li>O Editor, de código onde serão adicionados todos os procedimentos e script;</li><li>O Painel de status, que exibem as saídas dos procedimentos executados, como exibição de logs e erros;</li><li>O Painel de navegação, semelhante ao Explorer do Windows;</li><li>O Mapa, onde serão exibidos todos os resultados e análises feitas pelos scripts criado.</li></ul>



<figure class="wp-block-image"><img src="https://mapasabertos.files.wordpress.com/2021/03/fig-1.jpg?w=1024" alt=""/><figcaption>Editor de código do Google Earth Engine<br>Autor: Iporã Brito Possantti (Mapasabertos)</figcaption></figure>



<h2>Catálogos de Dados do Google Earth </h2>



<p>Pare aplicar as técnicas de análise de dados geoespaciais, com o Earth Engine, primeiro é preciso selecionar qual ou quais coleções de dados/imagens deseja-se utilizar. Existe uma grande variedade de base de dados e para diversas finalidades, porém, para nosso agrado, o Google disponibiliza um buscador (<a href="https://developers.google.com/earth-engine/datasets/catalog">Clique aqui para acessar</a>) que nos facilita a encontrá-la.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="296" src="https://visaocomputacional.com.br/wp-content/uploads/2022/03/image-1-1024x296.png" alt="" class="wp-image-3080" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/03/image-1-1024x296.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/image-1-300x87.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/image-1-768x222.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/image-1-1536x444.png 1536w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/image-1.png 1626w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Buscador de base de dados do Earth Engine.</figcaption></figure>



<p>Neste experimento, iremos utilizar a base <a href="https://developers.google.com/earth-engine/datasets/catalog/LANDSAT_LC08_C01_T1_TOA">USGS Landsat 8 Collection 1 Tier 1 TOA Reflectance</a>. Base de dados com informações de refletância do espectro de luz magnético, que possui imagens com as cores e o infravermelho,  necessário para aplicar as fórmulas NDVI e NDWI.</p>



<p>Esta base de dados, possui imagens coletadas entre o período de 2013 à 2022. As informações da base de dados são divididas em bandas, cada banda representa uma faixa do espectro eletromagnético. No experimento iremos utilizar as bandas B3, B4 e B5, que representam respectivamente o verde, vermelho e infravermelho próximo.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="458" src="https://visaocomputacional.com.br/wp-content/uploads/2022/03/image-2-1024x458.png" alt="" class="wp-image-3083" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/03/image-2-1024x458.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/image-2-300x134.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/image-2-768x344.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/image-2.png 1486w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Bandas da coleção de dados Landsat8 Tier 1 Reflectance</figcaption></figure>



<h2>Experimento</h2>



<p>Coletar NDVI e NDWI com o Earth Engine é muito fácil, para testes rápidos precisamos apenas realizar 4 etapas: selecionar a coleção de dados; selecionar as bandas; aplicar as fórmulas e exibir o resultado no mapa.</p>



<h4>Selecionar Coleção de dados</h4>



<p>Na primeira etapa, é preciso selecionar a região de interesse no mapa, o local que se deseja extrair as imagens, no experimento foi selecionado a região de Florianópolis &#8211; SC.  Esta região foi selecionada por meio da função  <strong>ee.Geometry.Point </strong>que criar uma variável com as informações da coordenada desejada.</p>



<p>Também é necessário coletar a base de imagens ou coleção de dados, por meio da função <strong>ee.ImageCollection</strong>. Com a coleção de dados indicada, agora precisamos indicar 2 filtros, o filtro da região de interesse e o filtro de período de busca de imagens. Estes filtros são aplicados por meio das funções <strong>filterBounds</strong> e <strong>filterDate</strong>.</p>



<pre class="wp-block-preformatted">//Coleta as posições do mapa na região de Florianópolis - SC
var imagePoint = ee.Geometry.Point([-49, -27.6935391]);
var viewPoint = ee.Geometry.Point([-48.5449963, -27.5930994]);

//Base de imagens geoespaciais utilizada
var l8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR');
//Informa o período de busca das imagens
var l8Query =  l8
    .filterBounds(imagePoint)
    .filterDate('2021-01-01', '2021-12-31')
    .sort('CLOUD_COVER');

//Coleta a primeira imagem identificada para o período informado
var image = ee.Image(l8Query.first());

//Centraliza o mapa
Map.centerObject(viewPoint, 13);</pre>



<p>Com os filtros e a região de interesse informada, basta solicitar os registros com a função <strong>l8Query.first</strong>. Com os registros coletados, devemos convertê-los em dados de imagens que podemos trabalhar com a função <strong>ee.Image</strong> que retorna uma classe com diversas funcionalidade.</p>



<p>Observe que, além dos filtros foi informada para ordenar a coleção de dados por meio da função <strong>sort</strong>, com base na ordem de dados do atributo <strong>CLOUD_COVER</strong> da coleção de dados. Este atributo indica o quanto da região esta coberta por nuvens, e como não queremos realizar a analise dos dados com nuvens, então indicamos para trazer a primeira imagem com o menor número de nuvens identificadas. Também é possível realizar filtros por este atributo, porém isso pode fazer com que não venha nenhuma imagem da região devido o filtro aplicado.</p>



<h4>Selecionar Bandas</h4>



<p>Na segunda etapa, basta extrairmos da imagem as bandas B3, B4 e B5 da coleção de dados que correspondem ao verde, vermelho e infravermelho-próximo do espectro eletromagnético, conforme código abaixo: </p>



<pre class="wp-block-preformatted">//Coleta as bandas de cores NIR, Vermelho e Verde 
var green = image.select('B3');
var red = image.select('B4');
var nir = image.select('B5');</pre>



<h4>Aplicar e visualizar Fórmulas</h4>



<p>Por fim, basta realizar os cálculos e adicionar a camada (Layer) com a imagem do NDVi gerada pelo Earth Engine ao mapa. Para adicionar ao mapa basta chamar a função <strong>Map.addLayer</strong>. Note que ao adicionar a camada NDVI, foram adicionados 2 parâmetros adicionais, o primeiro parâmetro (ndviParams), indica quais cores representarão cada extremo do cálculo NDVI, utilizamos a cores vermelha pra representar o valor -1, verde +1 e branco valores próximo ao zero. O segundo parâmetro &#8220;NDVI imagem&#8221; indica o nome do botão que ativa e inativa a visualização da camada no visualizador do mapa.</p>



<pre class="wp-block-preformatted">// Computa o Índice de Vegetação de Diferença Normalizada (NDVI).
var ndvi = nir.subtract(red).divide(nir.add(red)).rename('NDVI');
var ndviParams = {min: -1, max: 1, palette: ['red', 'white', 'green']};
Map.addLayer(ndvi, ndviParams, 'NDVI image');</pre>



<p>Para calcular o NDWI basta realizar as mesmas operações do NDVI, porém ajustando o cálculo para utilizar o infravermelho e o verde.</p>



<pre class="wp-block-preformatted">// Computa o Índice de Água de Diferença Normalizada (NDWI).
var ndwi = green.subtract(nir).divide(green.add(nir)).rename('NDVI');
var ndwiParams = {min: -1, max: 1, palette: ['red', 'white', 'blue']};
Map.addLayer(ndwi, ndwiParams, 'NDWI image');</pre>



<p>Também é possível realizar todo o cálculo do NDVI e NDWI de uma forma bem mais simples. Como essas duas formulas são cálculos de normalização, basta utilizar os seguintes códigos abaixo que o próprio Earth Engine converte para as fórmulas descritas acima.</p>



<pre class="wp-block-preformatted">//Formas resumidas de coletar a informação
var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
var ndwi = image.normalizedDifference(['B3', 'B5']).rename('NDVI');
Map.addLayer(ndvi);
Map.addLayer(ndwi);</pre>



<p>Com este experimento e o código acima foram geradas as seguintes imagens: </p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="394" src="https://visaocomputacional.com.br/wp-content/uploads/2022/03/google_earth_ndvi-1024x394.jpg" alt="" class="wp-image-3048" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/03/google_earth_ndvi-1024x394.jpg 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/google_earth_ndvi-300x115.jpg 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/google_earth_ndvi-768x295.jpg 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/google_earth_ndvi.jpg 1358w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption><br>Resultado NDVI do Goggle Earth Engine</figcaption></figure>



<p>Na primeira imagem, na parte esquerda, visualizamos em verde a refletância de áreas cobertas por vegetação e em vermelho áreas com nenhuma refletância de vegetação segundo a fórmula do NDVI. Quanto mais escuro o verde é indicativo de maior concentração de vegetação ou vegetações mais saudáveis. </p>



<p>Observar que nem toda vegetação saudável possui um alto nível de NDVI, cada vegetação possui uma característica especifica de saúde, que requerem estudos específicos para saber identificar sua saúde através do NDVI. Porém para identificar regiões de mata, floresta ou de cultivo, o NDVI é ideal ideal.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="394" src="https://visaocomputacional.com.br/wp-content/uploads/2022/03/google_earth_ndwi-1-1024x394.jpg" alt="" class="wp-image-3050" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/03/google_earth_ndwi-1-1024x394.jpg 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/google_earth_ndwi-1-300x115.jpg 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/google_earth_ndwi-1-768x295.jpg 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/google_earth_ndwi-1.jpg 1358w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Resultado NDWI do Goggle Earth Engine</figcaption></figure>



<p>Na segunda imagem, na parte esquerde, visualizamos em azul todas as regiões com superfície coberta por água, inundações e em vermelho a ausência d&#8217;água. O interessante nesta segunda imagem é que ela consegue identificar a Lagoa da Conceição, uma lagoa situada no meio de Florianópolis e se olharmos a mesma imagem, na parte direita, não é possível identificar a lagoa pela imagem de satélite.</p>



<p>Para visualizar esta aplicação, basta acessar o link <a href="https://rafaelpiemontez.users.earthengine.app/view/ndvindwi">Teste NDVI NDWI</a>. Todo este experimento foi criado, com base no tutorial criado pelo próprio Google (<a href="https://developers.google.com/earth-engine/tutorials/tutorial_api_06">clique aqui para acessar o tutorial</a>).</p>



<h2>Plataforma MapBiomas</h2>



<p>Uma ferramenta muito mais elabora, que esta criada neste post, é a plataforma <a href="https://mapbiomas.org/ferramentas">MapBiomas</a> que disponibilizam diversas análises sensoriais do Brasil com <a href="https://mapbiomas.org/ferramentas">scripts</a> criados por meio do Google Earth Engine.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="486" src="https://visaocomputacional.com.br/wp-content/uploads/2022/03/mapbiomas-1024x486.jpg" alt="" class="wp-image-3063" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/03/mapbiomas-1024x486.jpg 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/mapbiomas-300x142.jpg 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/mapbiomas-768x364.jpg 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/mapbiomas-1536x729.jpg 1536w, https://visaocomputacional.com.br/wp-content/uploads/2022/03/mapbiomas.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>Ilustração da Plataforma MapBiomas</figcaption></figure>



<p><a href="https://plataforma.brasil.mapbiomas.org/?activeBaseMap=8&amp;layersOpacity=70&amp;activeModule=coverage&amp;activeModuleContent=coverage%3Acoverage_main&amp;activeYear=2020&amp;mapPosition=-14.392118%2C-56.250000%2C4&amp;timelineLimitsRange=1985%2C2020">Clique aqui</a> para acessar a ferramenta ou <a href="https://plataforma.brasil.mapbiomas.org/agua">clique</a> <a href="https://plataforma.brasil.mapbiomas.org/agua">aqui</a> para visualizar uma análise sensorial e temporal da superfície d&#8217;água no Brasil.</p>



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



<p>Source:</p>



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



<p>Referências:</p>



<p>Iporã Brito Possantti via MasAbertos, O Google Earth&nbsp;Engine. <a href="https://mapasabertos.com/2021/03/30/o-google-earth-engine/">Acessado em 04 mar 2022</a>.</p>



<p>Google, NDVI, Mapping a Function over a Collection, Quality Mosaicking . <a href="https://developers.google.com/earth-engine/tutorials/tutorial_api_06">Acessado em 04 mar 2022.</a></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/experimento-ndvi-e-ndwi-com-o-google-earth-engine/">Experimento &#8211; NDVI e NDWI com o Google Earth Engine</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
