<?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>Fri, 22 May 2026 15:29:22 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</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>SAM 1 e 2 (Arquitetura)</title>
		<link>https://visaocomputacional.com.br/sam-1-e-2-arquitetura/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sam-1-e-2-arquitetura</link>
					<comments>https://visaocomputacional.com.br/sam-1-e-2-arquitetura/#respond</comments>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Wed, 20 May 2026 15:30:31 +0000</pubDate>
				<category><![CDATA[Visão computacional]]></category>
		<category><![CDATA[Codificador de imagem]]></category>
		<category><![CDATA[Codificador de prompt]]></category>
		<category><![CDATA[Hiera]]></category>
		<category><![CDATA[Image encoder]]></category>
		<category><![CDATA[MAE]]></category>
		<category><![CDATA[Mask decoder]]></category>
		<category><![CDATA[Masked Autoencoder]]></category>
		<category><![CDATA[Memory Attention]]></category>
		<category><![CDATA[Memory Bank]]></category>
		<category><![CDATA[Memory Encoder]]></category>
		<category><![CDATA[Prompt encoder]]></category>
		<category><![CDATA[SAM]]></category>
		<category><![CDATA[Vision Transformer]]></category>
		<category><![CDATA[Vit]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=11571</guid>

					<description><![CDATA[<p>Este artigo, explana o funcionamento das versões 1 e 2 do SAM, conforme descrito em seus artigos científicos, com foco no detalhamento de suas redes neurais. </p>
<p>The post <a href="https://visaocomputacional.com.br/sam-1-e-2-arquitetura/">SAM 1 e 2 (Arquitetura)</a> appeared first on <a href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Este artigo, explana o funcionamento das versões 1 e 2 do SAM (Segment Anything Model), 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>



<h2 class="wp-block-heading">O que é e como funciona o SAM 1 e 2?</h2>



<p class="wp-block-paragraph">De forma simples, o SAM é um modelo de inteligência artificial que permite selecionar e separar objetos em imagens e, no caso do SAM 2, também em vídeos. O usuário indica a região de interesse por meio de pontos, áreas ou máscaras e o modelo gera automaticamente a segmentação correspondente. A Figura 1, apresenta uma visão geral desse funcionamento.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="800" height="697" src="https://visaocomputacional.com.br/wp-content/uploads/2026/05/01_Dribbling_Carousel-02.gif" alt="" class="wp-image-11585"/><figcaption class="wp-element-caption">Figura 1 &#8211; Exemplo de uso de SAM 2 <a href="#refs">[META]</a>.</figcaption></figure>



<p class="wp-block-paragraph">O SAM 1 é um modelo de segmentação de imagens criado pela Meta AI, cujo objetivo é separar (segmentar) qualquer objeto em uma imagem, mesmo sem ter sido treinado especificamente para aquele tipo de objeto.</p>



<p class="wp-block-paragraph">O SAM&nbsp;2 é a evolução do SAM&nbsp;1, lançado para ir além de imagens estáticas e resolver segmentação interativa e automática em vídeos, mantendo a ideia de “segmentar qualquer coisa”, mas agora ao longo do tempo.<br>A principal mudança é que o SAM&nbsp;2 entende continuidade temporal, ou seja, ele consegue seguir o mesmo objeto, frame a frame, em um vídeo e também possui maior precisão.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>Aspecto</th><th>SAM&nbsp;1</th><th>SAM&nbsp;2</th></tr><tr><td>Tipo de dado</td><td>Imagem</td><td><strong>Vídeo + imagem</strong></td></tr><tr><td>Consistência temporal</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td></tr><tr><td>Rastreamento de objetos</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td></tr></tbody></table><figcaption class="wp-element-caption">Tabela1 &#8211; Diferença SAM 1 e SAM 2.</figcaption></figure>



<p class="wp-block-paragraph">Os SAM&nbsp;1 e 2 foram desenvolvidos com uma arquitetura que incluí 3 componentes principais:</p>



<ul class="wp-block-list">
<li>Image Encoder (Codificador de imagem);</li>



<li>Prompt Encoder (Codificador de prompts);</li>



<li>Mask Decoder (Decodificador de máscaras)</li>
</ul>



<p class="wp-block-paragraph">O Vídeo 1, abaixo, ilustra como o SAM 1 funciona. A partir de uma imagem de entrada e de um prompt, o modelo codifica a imagem em uma representação numérica rica — isto é, um tensor com informações semânticas — que permite compreender sua estrutura visual. Em seguida, essa representação é combinada com o prompt de entrada, que também é transformado internamente, para gerar uma máscara final (composta por valores binários) correspondente à região segmentada.</p>



<figure class="wp-block-video aligncenter"><video height="800" style="aspect-ratio: 800 / 800;" width="800" controls src="https://visaocomputacional.com.br/wp-content/uploads/2026/05/section-3.1c.mp4"></video><figcaption class="wp-element-caption">Video 1 &#8211; Ilustração de funcionamento do SAM <a href="#refs">[SA]</a>.</figcaption></figure>



<p class="wp-block-paragraph">Uma outra forma de visualizarmos o funcionamento dos SAM 1 e 2, é a partir da Figura 1 abaixo, aonde as 3 camadas: &#8220;Image Encoder&#8221;, &#8220;Prompt Encoder&#8221; e &#8220;Mask Decoder&#8221;, mencionadas no parágrafo anterior, são representadas respectivamente nas cores verde, roxo e laranja.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="850" height="477" src="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-4.png" alt="" class="wp-image-11578" srcset="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-4.png 850w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-4-300x168.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-4-768x431.png 768w" sizes="(max-width: 850px) 100vw, 850px" /><figcaption class="wp-element-caption">Figura 1. SAM vs. SAM 2 architecture <a href="#refs">[KA][RN][GJDECJR]</a>.</figcaption></figure>



<p class="wp-block-paragraph">Observe na Figura 1.b, que a principal diferença entre o SAM 1 e o 2 é a inclusão de uma nova etapa: o banco de memória. Esta etapa, foi adicionada no final, após a segmentação da imagem, onde é criado um banco de memória que alimenta a próxima segmentação (frame) de imagem, caso seja realizada uma segmentação em vídeos. Outra diferença importante do SAM 2, é que a decodificação da imagem (em verde), é realizada por transformação hierárquica (processo melhor detalhado nas próximas seções).</p>



<h2 class="wp-block-heading">Codificador de imagem (Image encoder)</h2>



<p class="wp-block-paragraph">O codificador de imagem é responsável por transformar a imagem original em uma representação numérica chamada de embedding. No SAM 1, essa etapa é realizada por um Vision Transformer (ViT), que divide a imagem em pequenos blocos e aprende as relações entre eles por meio de mecanismos de atenção. </p>



<p class="wp-block-paragraph">Camadas de atenção (ou attention layers) são componentes centrais de modelos de Inteligência Artificial e Processamento de Linguagem Natural (como os Transformers). Elas funcionam como um filtro cognitivo que permite à IA identificar quais partes de um texto, imagem ou áudio são mais relevantes para a tarefa sendo executada.</p>



<p class="wp-block-paragraph">Esse codificador é previamente treinado utilizando a abordagem de Masked Autoencoder (MAE), na qual partes da imagem são ocultadas e o modelo aprende a reconstruí-las, permitindo capturar representações visuais mais ricas e generalizáveis.</p>



<p class="wp-block-paragraph">Diferente do SAM 1, o SAM 2 usa um transformer hierárquico (Hiera), onde processa a imagem em múltiplos níveis de resolução. Na resolução baixa, o Hiera aprende contexto global (forma geral); na resolução média, partes do objeto; e na alta, bordas e detalhes. Esta técnica é chamada de pirâmide de features, desta forma, o que o SAM 1 extrai em uma única resolução, agora o SAM 2 extrai em resoluções diferentes.</p>



<h3 class="wp-block-heading">Vision Transformer (Vit)</h3>



<p class="wp-block-paragraph">O Vision Transformer foi apresentado pela primeira vez em 2020 em um artigo intitulado &#8220;16 x16 palavras&#8221; (link nas referências) e tornou-se amplamente utilizada em tarefas de PNL (Processamento de Linguagem Natural), sendo que para aproveitar os recursos dos Transformers para imagens, o ViT foi introduzido <a href="#refs">[TA]</a>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="513" height="343" src="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-6.png" alt="" class="wp-image-11598" style="width:513px;height:auto" srcset="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-6.png 513w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-6-300x201.png 300w" sizes="(max-width: 513px) 100vw, 513px" /><figcaption class="wp-element-caption">Figura 2 &#8211; Vision Transformer (ViT). Imagem do autor <a href="#refs">[ALADXTMGSJNN]</a>.</figcaption></figure>
</div>


<p class="wp-block-paragraph">Para processar uma imagem, inicialmente ela é segmentada em pequenos patches de tamanho fixo, depois disso, esses patches passam por uma incorporação linear. Por exemplo, considerando uma imagem com dimensões 1024 × 1024 × 3, ao dividi-la em patches de 16 × 16 (totalizando 256 patches), cada um terá dimensão equivalente a 64 × 64 × 3. Em seguida, cada patch é transformado linearmente para o tamanho do modelo. Assim, um patch de dimensão 64 × 64 × 3 (12.288 valores) é projetado em um espaço de tamanho 4096. Dessa forma, cada patch passa a ser representado por um embedding de dimensão 4096 <a href="#refs">[TA]</a>.</p>



<p class="wp-block-paragraph">Resumo da camada linear: todos os pixels de cada patch são achatados em um vetor, e os 12.288 valores resultantes são multiplicados por uma matriz de pesos de dimensão (12.288 × 4.096), gerando 4.096 valores de embedding. Por exemplo, realiza-se a multiplicação entre a entrada (256, 12.288) e a matriz de pesos (12.288, 4.096), em que 256 corresponde ao número de patches, 12.288 ao número de valores por patch após achatamento, e 4.096 ao tamanho final do embedding de cada patch <a href="#refs">[TA]</a>.</p>



<p class="wp-block-paragraph">Ao dividir uma imagem em 256 partes, cada uma delas é transformada em um vetor de incorporação (embedding). De maneira semelhante ao que ocorre em modelos de linguagem, nos quais palavras são representadas como vetores, cada região da imagem passa a ter sua própria representação vetorial. Assim, obtemos 256 vetores de incorporação, correspondentes a cada parte da imagem, que capturam as características essenciais de cada região <a href="#refs">[TA]</a>.</p>



<p class="wp-block-paragraph">Em seguida, vetores de incorporação posicionais são somados aos vetores de incorporação da imagem por meio de uma adição elemento a elemento. Além disso, vetores de incorporação de classe são inseridos no início da sequência de vetores de incorporação, conforme ilustrado na Figura 2, onde esses vetores também são adicionados no início para tarefas de classificação. Esses vetores de incorporação de classe são parâmetros treináveis <a href="#refs">[TA]</a>.</p>



<p class="wp-block-paragraph">O objetivo do Vision Transformer (ViT) é realizar a classificação de imagens. Ao final do codificador, esses vetores de incorporação de classe desempenham um papel fundamental na decisão de classificação, de forma análoga à camada linear utilizada em modelos de linguagem (LLMs) <a href="#refs">[TA]</a>.</p>



<h3 class="wp-block-heading">Masked Autoencoder (MAE)</h3>



<p class="wp-block-paragraph">Masked Autoencoders (MAE) são uma abordagem eficiente de aprendizado auto-supervisionado para visão computacional. A ideia principal é simples: o modelo recebe uma imagem com várias partes ocultadas e aprende a reconstruir os pixels ausentes. </p>



<p class="wp-block-paragraph">Esse método se baseia em dois pontos principais: </p>



<ul class="wp-block-list">
<li>Primeiro, uma arquitetura assimétrica, em que o codificador processa apenas as partes visíveis da imagem, enquanto um decodificador leve reconstrói a imagem completa;</li>



<li>Segundo, o uso de uma alta taxa de mascaramento (por exemplo: 75%), o que torna a tarefa de reconstrução mais desafiadora e significativa.</li>
</ul>



<p class="wp-block-paragraph">Com essa abordagem, é possível treinar modelos grandes de forma mais eficiente, obtendo melhor desempenho e boa capacidade de generalização para diferentes tarefas <a href="#refs">[LZ]</a>.</p>



<p class="wp-block-paragraph">Em SAM 1, o MAE é pré-treinado utilizando um grande subconjunto aleatório de patches da imagem, no qual parte desses patches é mascarada. O codificador é então aplicado apenas ao subconjunto reduzido de patches visíveis. Após isso, os tokens correspondentes aos patches mascarados são adicionados à saída do codificador. Esse conjunto completo, composto pelos patches codificados e pelos tokens mascarados, é processado por um decodificador compacto, responsável por reconstruir a imagem original no nível de pixels. Após a etapa de pré-treinamento, o decodificador é descartado e o codificador passa a ser utilizado com o conjunto completo de patches, agora sem máscaras, em tarefas de reconhecimento <a href="#refs">[TA]</a>.</p>



<p class="wp-block-paragraph">O codificador do MAE foi empregado como codificador de imagens no modelo Segment Anything (SAM), conforme ilustrado na Figura 1.a. Nesse caso, os embeddings de imagem são gerados apenas uma única vez, permitindo que múltiplos prompts sejam fornecidos como entrada posteriormente <a href="#refs">[TA]</a>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="720" height="397" src="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-7.png" alt="" class="wp-image-11601" style="width:720px;height:auto" srcset="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-7.png 720w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-7-300x165.png 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /><figcaption class="wp-element-caption">Imagem 3 &#8211; Autoencoder mascarado (MAE) <a href="#refs">[LZ]</a>.</figcaption></figure>
</div>


<h3 class="wp-block-heading">Hiera</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;Transformadores de visão como o ViT usam a mesma resolução espacial e o mesmo número de características em toda a rede. Mas isso é ineficiente: as camadas iniciais não precisam de tantas características, e as camadas posteriores não precisam de tanta resolução espacial. Modelos hierárquicos anteriores, como o ResNet, resolviam esse problema usando menos características no início e menos resolução espacial no final&#8221; [<a href="https://github.com/facebookresearch/hiera">Hiera</a>, 2026].</p>
</blockquote>



<p class="wp-block-paragraph">O SAM 2 utiliza um codificador de imagem baseado no Hiera, uma arquitetura hierárquica derivada do ViT, previamente treinada com a abordagem MAE. Esse codificador é capaz de extrair características em múltiplas escalas, capturando tanto o contexto global quanto detalhes finos da imagem <a href="#refs">[RA]</a>. Cada alteração de escala modifica o tamanho das representações internas (ou embeddings) no Hiera, conforme bloco Hiera Encoder, ilustrado na Imagem 4 abaixo.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="228" src="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-8-1024x228.png" alt="" class="wp-image-11609" srcset="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-8-1024x228.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-8-300x67.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-8-768x171.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-8-1536x342.png 1536w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-8.png 1993w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Imagem 4 &#8211; Hiera: A Hierarchical Vision Transformer without the Bells-and-Whistles <a href="#refs">[FR]</a>.</figcaption></figure>



<p class="wp-block-paragraph">Cada escala pode ser representada da seguinte forma:</p>



<ul class="wp-block-list">
<li>Estágio 1 → alta resolução (detalhes);</li>



<li>Estágio 2 → média resolução;</li>



<li>Estágio 3 → baixa resolução (mais contexto);</li>



<li>Estágio 4 → muito baixa resolução (global).</li>
</ul>



<p class="wp-block-paragraph">Cada escala tem como saída esperada:</p>



<ul class="wp-block-list">
<li>F1 → detalhes (alta resolução);</li>



<li>F2 → partes do objeto;</li>



<li>F3 → estrutura;</li>



<li>F4 → contexto global.</li>
</ul>



<p class="wp-block-paragraph">A partir dessas diferentes escalas, a Feature Pyramid Network (FPN) atua integrando as características extraídas em cada estágio, combinando informações mais abstratas, provenientes das camadas de baixa resolução, com os detalhes preservados nas camadas de alta resolução.</p>



<p class="wp-block-paragraph">As características dos níveis mais profundos, oriundas dos estágios 3 e 4, são utilizadas para gerar embeddings ricos e semânticos da imagem, fundamentais para a segmentação. Ao mesmo tempo, características de alta resolução, provenientes dos estágios 1 e 2, são incorporadas às etapas de reconstrução no decodificador de máscara, permitindo produzir segmentações mais precisas e com maior nível de detalhe <a href="#refs">[RA]</a>.</p>



<h2 class="wp-block-heading">Codificador de prompt</h2>



<p class="wp-block-paragraph">A codificação de prompts constitui uma etapa essencial no pipeline do SAM, responsável por transformar as interações do usuário em representações numéricas (embeddings) que o modelo consegue interpretar. Esses prompts atuam como mecanismos de orientação, direcionando a atenção do modelo para regiões ou objetos específicos dentro da imagem.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="479" src="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-9-1024x479.png" alt="" class="wp-image-11623" srcset="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-9-1024x479.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-9-300x140.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-9-768x359.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-9-1536x718.png 1536w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-9.png 1711w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Imagem 5 &#8211; Prompt Decoder <a href="#refs">[SW]</a>.</figcaption></figure>



<p class="wp-block-paragraph">O codificador de prompt recebe diferentes tipos de entradas fornecidas pelo usuário, como:</p>



<ul class="wp-block-list">
<li>Cliques em pontos específicos da imagem;</li>



<li>Caixas delimitadoras;</li>



<li>Máscaras iniciais aproximadas.</li>
</ul>



<p class="wp-block-paragraph">Essas entradas são processadas e convertidas em vetores que representam tanto a posição espacial quanto o tipo de interação. De forma geral, os prompts são divididos em duas categorias principais:</p>



<ul class="wp-block-list">
<li>Prompts esparsos (sparse): incluem pontos e caixas, que representam informações discretas e localizadas. Cada ponto ou vértice da caixa é codificado como um vetor (token), totalizando um pequeno conjunto de embeddings que indicam explicitamente onde o modelo deve focar.</li>



<li>Prompts densos (dense): incluem máscaras, que possuem correspondência espacial com toda a imagem. Nesse caso, a máscara é processada por camadas convolucionais, resultando em um mapa de features que preserva a estrutura espacial da entrada.</li>
</ul>



<p class="wp-block-paragraph">No caso dos prompts esparsos, como cliques, a codificação ocorre em etapas. Primeiramente, as coordenadas do ponto são normalizadas e transformadas por um mecanismo de codificação posicional (positional encoding), que captura a localização no espaço da imagem. Em seguida, esse vetor é combinado com um embedding aprendido que indica se o ponto pertence ao primeiro plano (foreground) ou ao fundo (background). Já as caixas delimitadoras são representadas por pares de pontos (canto superior esquerdo e canto inferior direito), cada um com seu próprio embedding específico.</p>



<p class="wp-block-paragraph">O resultado desse codificador é um conjunto de vetores (tokens) que representam a intenção do usuário. Esses tokens não carregam diretamente o conteúdo visual da imagem, mas sim informações sobre “onde” e “o que” deve ser segmentado.</p>



<p class="wp-block-paragraph">Esses embeddings de prompt são então fornecidos ao decodificador de máscaras juntamente com os embeddings da imagem. No Mask Decoder, ocorre a interação entre essas duas informações por meio de mecanismos de atenção, nos quais os tokens do prompt (esparsos) direcionam o modelo a extrair, dos embeddings densos da imagem, as regiões correspondentes ao objeto desejado.</p>



<p class="wp-block-paragraph">Na prática, o codificador de prompt responde à pergunta:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>“Qual região da imagem o usuário quer segmentar?”</strong></p>
</blockquote>



<p class="wp-block-paragraph">Dessa forma, ele atua como a interface entre a interação humana e o processamento automático do modelo, permitindo que o SAM realize segmentações precisas de forma interativa, rápida e generalizável.</p>



<h3 class="wp-block-heading">Decodificador de máscara (Mask decoder)</h3>



<p class="wp-block-paragraph">O decodificador de máscara é a etapa da arquitetura responsável por combinar as características da imagem, os embeddings de prompt e quando disponível, informações adicionais para gerar a segmentação final. O decodificador utiliza um número reduzido de camadas de atenção, nas quais os embeddings da imagem e os tokens de prompt são mutuamente atualizados por meio de mecanismos de atenção cruzada. </p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="720" height="252" src="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-10.png" alt="" class="wp-image-11626" style="width:720px;height:auto" srcset="https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-10.png 720w, https://visaocomputacional.com.br/wp-content/uploads/2026/05/image-10-300x105.png 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /><figcaption class="wp-element-caption">Imagem 6 &#8211; Saída do decodificador de imagem  <a href="#refs">[KA]</a>.</figcaption></figure>



<p class="wp-block-paragraph">O codificador de imagem primeiro converte a imagem em uma representação numérica rica em informações visuais, em seguida, o codificador de prompts transforma entradas como pontos, caixas delimitadoras ou máscaras iniciais em embeddings, que indicam ao modelo qual região deve ser segmentada. O decodificador de máscara combina essas duas fontes de informação para prever a região exata do objeto na imagem <a href="#refs">[KA]</a>.</p>



<p class="wp-block-paragraph">Uma característica importante desse decodificador é que ele foi projetado para ser leve e rápido, isso permite que, depois que a imagem já foi processada pelo codificador, o usuário possa testar diferentes prompts quase em tempo real, sem precisar recalcular toda a imagem novamente. Essa separação entre um codificador de imagem mais pesado e um decodificador mais eficiente é uma das razões pelas quais o SAM funciona bem em cenários interativos <a href="#refs">[SA]</a>.</p>



<p class="wp-block-paragraph">O decodificador também lida com ambiguidades, por exemplo, se o usuário clicar em um ponto sobre uma camisa, o modelo pode interpretar o alvo como a camisa, a pessoa inteira ou até uma parte específica do corpo. Para resolver isso, o SAM pode gerar múltiplas máscaras válidas e associar a elas pontuações de confiança, permitindo escolher a segmentação mais adequada <a href="#refs">[SA]</a>.</p>



<p class="wp-block-paragraph">Em resumo, o decodificador de máscara funciona como a etapa final de decisão do SAM: ele recebe a compreensão visual da imagem, interpreta a intenção expressa pelo prompt e produz a máscara segmentada correspondente. É esse módulo que transforma a interação simples do usuário — como um clique ou uma caixa — em uma seleção precisa de pixels pertencentes ao objeto desejado. Uma descrição detalhada de como funciona a etapa de decodificação é encontrada no post <a href="https://pub.towardsai.net/sam-2-segment-anything-model-2-is-amazing-but-we-need-to-understand-sam-1-cb9042b9decc">SAM 2 (Segment Anything Model 2) is Amazing, But We Need to understand SAM 1.</a></p>



<h3 class="wp-block-heading">Tratamento de ambiguidade</h3>



<p class="wp-block-paragraph">Para lidar com ambiguidades de segmentação, tanto o SAM 1 quanto o SAM 2 podem gerar múltiplas máscaras candidatas para um mesmo prompt. Cada uma dessas máscaras recebe uma pontuação de qualidade baseada em<strong> </strong>um IoU (Intersection over Union) previsto<strong> </strong>(predicted IoU), que representa uma estimativa da qualidade da segmentação aprendida durante o treinamento. Esse mecanismo permite selecionar a máscara mais adequada e aumenta a robustez do modelo em cenários complexos, como imagens com múltiplos objetos, sobreposição ou fronteiras pouco definidas.</p>



<p class="wp-block-paragraph">No caso do SAM 2, essa abordagem é estendida para vídeos, contribuindo também para manter a consistência das segmentações ao longo dos quadros, mesmo em situações de oclusão ou visibilidade parcial dos objetos <a href="#refs">[RA]</a>.</p>



<h2 class="wp-block-heading">Memória e Atenção (Memory and Attention) </h2>



<p class="wp-block-paragraph">O SAM 2 introduz um mecanismo de memória que armazena representações de frames anteriores em um banco de memória, permitindo que o modelo utilize essas informações ao processar o frame atual. Por meio de mecanismos de atenção, o modelo combina o conteúdo atual com o histórico armazenado, garantindo maior consistência temporal e melhor desempenho em cenários com movimento, oclusão e variações visuais. Esse mecanismo é composto por três elementos principais: um codificador de memória, um banco de memória e um módulo de atenção de memória.</p>



<h3 class="wp-block-heading">Codificador de memória (Memory Encoder)</h3>



<p class="wp-block-paragraph">O codificador de memória transforma as características da imagem e a máscara gerada em uma representação compacta que descreve o objeto e pode ser armazenada para uso futuro.</p>



<h3 class="wp-block-heading">Banco de memória (Memory Bank)</h3>



<p class="wp-block-paragraph">O banco de memória armazena essas representações de frames anteriores, mantendo um histórico recente do objeto ao longo do vídeo.</p>



<h3 class="wp-block-heading">Módulo de atenção de memória (Memory Attention)</h3>



<p class="wp-block-paragraph">O módulo de atenção de memória utiliza essas informações armazenadas para influenciar a segmentação do frame atual, garantindo consistência ao longo do tempo.</p>



<p class="wp-block-paragraph">Uma descrição detalhada sobre a memória do SAM 2 é encontrada em <a href="https://deepwiki.com/kijai/ComfyUI-segment-anything-2/4.3-memory-and-attention-mechanism">Memory and Attention Mechanism</a>.</p>



<h2 class="wp-block-heading">Treinamento</h2>



<p class="wp-block-paragraph">O código do Segment Anything Model é parcialmente open source. No SAM 1, a Meta disponibilizou principalmente o código para inferência e uso do modelo, mas não o pipeline completo de treinamento. Já no SAM 2, houve maior abertura, incluindo suporte a treinamento e fine-tuning, embora o processo completo utilizado em larga escala não tenha sido totalmente divulgado.</p>



<h3 class="wp-block-heading">Código fonte</h3>



<p class="wp-block-paragraph"><a href="https://github.com/facebookresearch/segment-anything">https://github.com/facebookresearch/segment-anything</a></p>



<p class="wp-block-paragraph"><a href="https://github.com/facebookresearch/sam2">https://github.com/facebookresearch/sam2</a></p>



<p class="wp-block-paragraph" id="refs"><strong>Referências:</strong></p>



<p class="wp-block-paragraph">[KA] KIRILLOV, Alexander et al. Segment Anything. arXiv preprint arXiv:2304.02643, 2023. <a href="https://arxiv.org/abs/2304.02643">Artigo acesso em: 6 maio 2026</a></p>



<p class="wp-block-paragraph">[RN] RAVI, Nikhila et al. SAM 2: Segment Anything in Images and Videos. arXiv preprint arXiv:2408.00714, 2024. <a href="https://arxiv.org/abs/2408.00714">Artigo acesso em: 6 maio 2026</a> </p>



<p class="wp-block-paragraph">[DATAC] DATACAMP. SAM 2 da Meta: o Segment Anything Model para imagens e vídeos. <a href="https://www.datacamp.com/pt/blog/sam2-meta-segment-anything-model">Acesso em: 6 maio 2026.</a></p>



<p class="wp-block-paragraph">[GJDECJR] Gutiérrez Gallardo, Juan Diego &amp; Delgado, Emilio &amp; Breuer, Carlos &amp; Conejero Manzano, José María &amp; Rodriguez-Echeverria, Roberto. (2025). Prompt Once, Segment Everything: Leveraging SAM 2 Potential for Infinite Medical Image Segmentation with a Single Prompt. Algorithms. 18. 227. 10.3390/a18040227.</p>



<p class="wp-block-paragraph">[SA] Segment Anything Research by Meta AI. <a href="https://segment-anything.metademolab.com/">Acessado em:  07 maio 2026</a></p>



<p class="wp-block-paragraph">[META] META. Our new AI model can segment video. 2024. <a href="https://about.fb.com/news/2024/07/our-new-ai-model-can-segment-video/.">Acesso em: 6 maio 2026.</a></p>



<p class="wp-block-paragraph">[ALADXTMGSJNN] Alexey Dosovitskiy, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, Mostafa Dehghani, Matthias Minderer, Georg Heigold, Sylvain Gelly, Jakob Uszkoreit, Neil Houlsby. An Image is Worth 16&#215;16 Words: Transformers for Image Recognition at Scale. <a href="https://arxiv.org/abs/2010.11929">Acessado em: 13 maio de 2026</a></p>



<p class="wp-block-paragraph">[LZ] Liu, Ziming A Toy Model of Masked-Autoencoder. <a href="https://kindxiaoming.github.io/blog/2026/mae/">Acesso em: 13 maio 2026.</a></p>



<p class="wp-block-paragraph">[TA] TOWARDS AI. SAM 2: Segment Anything Model 2 is amazing, but we need to understand SAM 1.<a href="https://pub.towardsai.net/sam-2-segment-anything-model-2-is-amazing-but-we-need-to-understand-sam-1-cb9042b9decc">Acesso em: 13 maio 2026.</a></p>



<p class="wp-block-paragraph">[RA] ROBERGE, Adam. Unpacking the advanced features of SAM2. Medium, [s.d.]. <a href="https://medium.com/@adam.roberge/unpacking-the-advanced-features-of-sam2-d7d6e154ac7a">Acesso em: 19 maio 2026.</a></p>



<p class="wp-block-paragraph">[FR] FACEBOOK RESEARCH. Hiera. <a href="https://github.com/facebookresearch/hiera">Acesso em: 19 maio 2026.</a></p>



<p class="wp-block-paragraph">[SW] SAM-WEBUI. Prompt Encoding. <a href="https://deepwiki.com/derekray311511/SAM-webui/7.3-prompt-encoding">Acesso em: 19 maio 2026.</a></p>
<p>The post <a href="https://visaocomputacional.com.br/sam-1-e-2-arquitetura/">SAM 1 e 2 (Arquitetura)</a> appeared first on <a href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://visaocomputacional.com.br/sam-1-e-2-arquitetura/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://visaocomputacional.com.br/wp-content/uploads/2026/05/section-3.1c.mp4" length="785203" type="video/mp4" />

			</item>
		<item>
		<title>Espaço e Filtros de Cores HSV, RGB, CMYK, HSB, HSL e RYB</title>
		<link>https://visaocomputacional.com.br/espaco-e-filtros-de-cores-hsv-rgb-cmyk-hsb-hsl-e-ryb/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=espaco-e-filtros-de-cores-hsv-rgb-cmyk-hsb-hsl-e-ryb</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Wed, 04 Sep 2024 23:15:58 +0000</pubDate>
				<category><![CDATA[Conceitos básicos]]></category>
		<category><![CDATA[CMYK]]></category>
		<category><![CDATA[Colors]]></category>
		<category><![CDATA[Cores]]></category>
		<category><![CDATA[FIlter]]></category>
		<category><![CDATA[Filtro]]></category>
		<category><![CDATA[HSB]]></category>
		<category><![CDATA[HSL]]></category>
		<category><![CDATA[HSV]]></category>
		<category><![CDATA[NDVI]]></category>
		<category><![CDATA[RGB]]></category>
		<category><![CDATA[RYB]]></category>
		<guid isPermaLink="false">https://visaocomputacional.com.br/?p=6593</guid>

					<description><![CDATA[<p>Este artigo explana o conceito de espaço de cores e demonstra como realizar filtros em imagens a partir de sua cor.</p>
<p>The post <a href="https://visaocomputacional.com.br/espaco-e-filtros-de-cores-hsv-rgb-cmyk-hsb-hsl-e-ryb/">Espaço e Filtros de Cores HSV, RGB, CMYK, HSB, HSL e RYB</a> appeared first on <a href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Este artigo explana o conceito de espaço de cores e demonstra como extrair regiões de imagens utilizando apenas filtros de cores. Uma visão inicial sobre cores é apresentanda em <a href="https://visaocomputacional.com.br/cores-como-os-humanos-enxergam-e-o-que-computadores-podem-enxergam/">Cores e Câmeras: Como os humanos enxergam e o que computadores podem enxergar</a>.</p>



<p class="wp-block-paragraph">Antes de apresentarmos sobre espaços e filtros de cores é necessário entender o que são cores e quais cores nós conseguimos enxergar para melhor entender como representá-las computacionalmente. Nesta primeira parte, serão explicados conceitos básicos sobre frequência de cores.</p>



<p class="wp-block-paragraph"><strong>Caso você queira visualizar os efeitos que filtros de cores podem ter na área de visão computacional, vá para o final deste artigo.</strong></p>



<p class="wp-block-paragraph">Tudo o que sabemos sobre cores hoje em dia, iniciou em 1660, quando o cientista britânico Isaac Newton descobriu que, ao atravessar um feixe de luz solar num prisma de vidro, o feixe de luz sofria decomposição em uma gama de cores similares às do arco-íris. Newton concluiu que as cores que visualizou, faziam parte da luz solar branca. Logo em seguida, conseguiu demonstrar que, após decompor a luz branca com um prisma, poderia recompor as cores dispersadas com outro prisma invertido obtendo novamente a luz branca. <a href="#refs">[C]</a> A ilustração da Fig.1, apresenta o espectro de cores produzido neste experimento, dividido em 7 regiões: vermelho, laranja, amarelo, verde, azul, anil, e violeta.</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://visaocomputacional.com.br/wp-content/uploads/2021/11/cores_prisma_1.png"><img loading="lazy" decoding="async" width="300" height="300" src="https://visaocomputacional.com.br/wp-content/uploads/2021/11/cores_prisma_1-300x300.png" alt="" class="wp-image-2461" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/11/cores_prisma_1-300x300.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2021/11/cores_prisma_1-150x150.png 150w, https://visaocomputacional.com.br/wp-content/uploads/2021/11/cores_prisma_1-768x768.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2021/11/cores_prisma_1-230x230.png 230w, https://visaocomputacional.com.br/wp-content/uploads/2021/11/cores_prisma_1-400x400.png 400w, https://visaocomputacional.com.br/wp-content/uploads/2021/11/cores_prisma_1-600x600.png 600w, https://visaocomputacional.com.br/wp-content/uploads/2021/11/cores_prisma_1-640x640.png 640w, https://visaocomputacional.com.br/wp-content/uploads/2021/11/cores_prisma_1.png 800w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption">Figura 1 &#8211; Decomposição de luz branca em um prisma de vidro.</figcaption></figure>
</div>


<p class="wp-block-paragraph">No experimento de Newton, conclui-se, que a cor branca é composta por todas as demais, com o violeta em uma extremidade ao vermelho na outra <a href="#refs">[GW]</a>. As&nbsp; cores são formadas, por frequências da radiação eletromagnética e todas estas variações de frequência compõem o espectro eletromagnético conforme ilustrado na Fig. 2.</p>



<p class="wp-block-paragraph">Por muito tempo, achou-se que a luz era a&nbsp; única parte conhecida deste espectro, porém ela representa uma parte muito pequena dele. O espectro se estende desde as ondas de baixa frequência, ondas de rádio, até as de maior frequência como as da radiação gama. Todas estas variações de frequências, servem como áreas de aplicação do processamento de imagens.</p>



<p class="wp-block-paragraph">Uma forma fácil, de compreender a extensão de aplicações de processamento de imagens e possibilidades que um computador consegue enxergar, é categorizar estes espectros como, espectro de luz visível humana, raio x, infravermelho e assim por diante. Porém, ao categorizá-los não devemos esquecer que podemos utilizar mais de uma categoria ao mesmo tempo, como extração de informação.</p>



<h3 class="wp-block-heading">Espectro visível da luz</h3>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://visaocomputacional.com.br/wp-content/uploads/2021/11/espectro-visivel-da-luz.jpg"><img loading="lazy" decoding="async" width="800" height="451" src="https://visaocomputacional.com.br/wp-content/uploads/2021/11/espectro-visivel-da-luz.jpg" alt="" class="wp-image-2438" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/11/espectro-visivel-da-luz.jpg 800w, https://visaocomputacional.com.br/wp-content/uploads/2021/11/espectro-visivel-da-luz-300x169.jpg 300w, https://visaocomputacional.com.br/wp-content/uploads/2021/11/espectro-visivel-da-luz-768x433.jpg 768w, https://visaocomputacional.com.br/wp-content/uploads/2021/11/espectro-visivel-da-luz-150x85.jpg 150w, https://visaocomputacional.com.br/wp-content/uploads/2021/11/espectro-visivel-da-luz-600x338.jpg 600w" sizes="auto, (max-width: 800px) 100vw, 800px" /></a><figcaption class="wp-element-caption">Figura 2 &#8211; Espectro eletromagnético. Ilustração: Peter Hermes Furian / Shutterstock.com</figcaption></figure>
</div>


<p class="wp-block-paragraph">Se observarmos a Fig. 2, percebemos que a variedade de cores que enxergamos é muito pequena, comparada a todo o espectro eletromagnético. Os espaços e filtros de cores apresentados a seguir foram criados para representar essa faixa do espectro de luz, também conhecida como espectro de luz visível humano.</p>



<h2 class="wp-block-heading">Espaço de cores</h2>



<p class="wp-block-paragraph">Um espaço de cor, é uma fórmula/modelo matemática que descrever a cor. Existem vários espaços de cores diferentes, cada um foi pensado para um propósito diferente. Dentre eles os mais conhecidos são o RGB, CMYK, HSV e HSL.</p>



<h2 class="wp-block-heading">Cores aditivas RGB (Red, Blue e Green)</h2>



<p class="wp-block-paragraph">O espaço de cor RBG, criado por James C Maxwell, e provavelmente o mais conhecido, é uma representação 3D das cores vermelho, azul, e verde, conforme Figura 4. Este espaço é associado a reprodução de cores em dispositivos eletrônicos, como monitor, celulares e TVs. </p>



<p class="wp-block-paragraph">O RGB é um padrão de cores aditivas, elas são chamadas “aditivas” porque ao serem adicionadas, a soma dessas três cores, resulta na luz branca. Ao combinar apenas duas dessas cores primárias obtemos as cores secundárias: magenta, amarelo e ciano, conforme representado na Figura 3. O ciano é a união do azul com o verde. Já o amarelo, é a mistura do vermelho e do verde. Por fim, o magenta é resultado do azul mais o vermelho. Observer que as cores primarias no sistema aditivo é diferente das cores primarias no sistema subtrativo, visto na próxima seção.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="360" height="292" src="https://visaocomputacional.com.br/wp-content/uploads/2024/07/cores_aditivas_rgb.png" alt="" class="wp-image-6596" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/07/cores_aditivas_rgb.png 360w, https://visaocomputacional.com.br/wp-content/uploads/2024/07/cores_aditivas_rgb-300x243.png 300w" sizes="auto, (max-width: 360px) 100vw, 360px" /><figcaption class="wp-element-caption">Figura 3 &#8211; Cores Aditivas RGB</figcaption></figure>



<p class="wp-block-paragraph"></p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="392" height="392" src="https://visaocomputacional.com.br/wp-content/uploads/2024/07/cubo_rgb.jpg" alt="" class="wp-image-6598" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/07/cubo_rgb.jpg 392w, https://visaocomputacional.com.br/wp-content/uploads/2024/07/cubo_rgb-300x300.jpg 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/07/cubo_rgb-150x150.jpg 150w" sizes="auto, (max-width: 392px) 100vw, 392px" /><figcaption class="wp-element-caption">Figura 4 &#8211; Representação cúbida do RGB</figcaption></figure>



<p class="wp-block-paragraph"></p>
</div>
</div>



<p class="wp-block-paragraph">Na Figura 5 outras demonstrações da mistura de cores no sistema aditivo. No cubo à esquerda, notar que o preto é obtido a partir da auxência de todas as cores, e no cubo a direita, a cor branca é o resultado da soma de todas as cores.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="920" height="488" src="https://visaocomputacional.com.br/wp-content/uploads/2024/07/cubo_rgb2.png" alt="" class="wp-image-6600" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/07/cubo_rgb2.png 920w, https://visaocomputacional.com.br/wp-content/uploads/2024/07/cubo_rgb2-300x159.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/07/cubo_rgb2-768x407.png 768w" sizes="auto, (max-width: 920px) 100vw, 920px" /><figcaption class="wp-element-caption">Figura 5 &#8211; Representação da mistura de cores aditivas.</figcaption></figure>



<p class="wp-block-paragraph">Uma consideração, o sistema RGB utilizado em monitores e televisões é o sistema sRGB, existem outros modelos RGB como o Adobe RGB, bastante utilizado na industria de impressão.<br></p>



<h2 class="wp-block-heading">Cores Substrativas CMYK</h2>



<p class="wp-block-paragraph">O sistema CMYK CMYK (Cyan, Magenta, Yellow e Black) é utilizado em impressão, pois trabalha com pigmentos. Diferente do modelo aditivo, o sistema subtrativo funciona pela absorção de luz: quanto mais cores são misturadas, menos luz é refletida, ou seja, quanto mais cores diferentes é misturado, menos cor ela ira refletir. </p>



<p class="wp-block-paragraph">A cor branca, ou tinta branca, no sistema subtrativo, é a cor que menos absorve cores, logo refletindo todas elas. A cor preta, por sua vez, é a que mais absorve cores, não refletindo nenhuma, conforme ilustrado na Figura 6.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="768" height="768" src="https://visaocomputacional.com.br/wp-content/uploads/2024/08/sistemca_cor_cmyk.png" alt="" class="wp-image-6720" style="width:768px;height:768px" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/08/sistemca_cor_cmyk.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/sistemca_cor_cmyk-300x300.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/sistemca_cor_cmyk-150x150.png 150w" sizes="auto, (max-width: 768px) 100vw, 768px" /><figcaption class="wp-element-caption">Figura 6 &#8211; Sistema de cor CMYK.</figcaption></figure>



<p class="wp-block-paragraph">No modelo subtrativo, uma tinta vermelha, por exemplo, absorve verde e azul, refletindo apenas o vermelho.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="424" src="https://visaocomputacional.com.br/wp-content/uploads/2024/08/cor_absorvida_refletida-1024x424.jpg" alt="" class="wp-image-6722" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/08/cor_absorvida_refletida-1024x424.jpg 1024w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/cor_absorvida_refletida-300x124.jpg 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/cor_absorvida_refletida-768x318.jpg 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/cor_absorvida_refletida.jpg 1288w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Figura 7 &#8211; Absorção e reflexão de cores <a href="#refs">[GC]</a>.</figcaption></figure>



<h2 class="wp-block-heading">Sistema RYB (Red, Yellow, Blue)</h2>



<p class="wp-block-paragraph">Muito utilizado por artistas, o modelo RYB (Red, Yellow, Blue) define as cores primárias tradicionais ensinadas no ensino básico.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="691" height="617" src="https://visaocomputacional.com.br/wp-content/uploads/2024/08/sistema_cor_ryb.png" alt="" class="wp-image-6719" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/08/sistema_cor_ryb.png 691w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/sistema_cor_ryb-300x268.png 300w" sizes="auto, (max-width: 691px) 100vw, 691px" /><figcaption class="wp-element-caption">Figura 8 &#8211; Sistema de cor RYB <a href="#refs">[GKPB]</a>.</figcaption></figure>
</div>


<p class="wp-block-paragraph">A partir das cores RYB, obtemos o <strong>círculo cromático</strong>, uma representação, simplificada e em círculo, das cores percebidas pelo olho humano. Esta representação é muito útil para designer, arquitetos, pintores e outras artistas, pois a partir dela, é possível identificar cores complementares e contrastantes, cores contrastante sem perda de harmonia.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="564" height="558" src="https://visaocomputacional.com.br/wp-content/uploads/2024/08/circulo-cromatico.webp" alt="" class="wp-image-6728" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/08/circulo-cromatico.webp 564w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/circulo-cromatico-300x297.webp 300w" sizes="auto, (max-width: 564px) 100vw, 564px" /><figcaption class="wp-element-caption">Figura 9 &#8211; Circulo Cromático.</figcaption></figure>
</div>


<p class="wp-block-paragraph">No artigo <a href="https://www.vivadecora.com.br/pro/circulo-cromatico/">Círculo Cromático: Veja Como Usar e Evite Erros na Escolha das Cores</a>, são apresentados diversos exemplos de combinações de cores utilizando o círculo cromático.</p>



<h2 class="wp-block-heading">Representação HSV e HSB</h2>



<p class="wp-block-paragraph">HSV é a abreviatura para o sistema de cores formadas pelos componentes Hue (matiz), Saturation (saturação) e Value (valor). O sistema de cor HSV é uma representação cilindrica das cores conforme Figuras 10 e 11.. O HSV também é conhecido como HSB (hue, saturation e brightness — matiz, saturação e brilho, respectivamente) <a href="#refs">[WK]</a>.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="720" height="540" src="https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsv.webp" alt="" class="wp-image-6797" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsv.webp 720w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsv-300x225.webp 300w" sizes="auto, (max-width: 720px) 100vw, 720px" /><figcaption class="wp-element-caption">Figura 10 &#8211; HSV  <a href="#refs">[WK]</a> </figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="640" height="480" src="https://visaocomputacional.com.br/wp-content/uploads/2024/08/HSV_02.jpg" alt="" class="wp-image-6798" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/08/HSV_02.jpg 640w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/HSV_02-300x225.jpg 300w" sizes="auto, (max-width: 640px) 100vw, 640px" /><figcaption class="wp-element-caption">Figura 11 &#8211; HSV  <a href="#refs">[WK]</a></figcaption></figure>
</div>
</div>



<p class="wp-block-paragraph">A cor, no sistema HSV, é definida conforme descrito abaixo:</p>



<ul class="wp-block-list">
<li>Matiz (tonalidade): Define o tipo de cor, abrangendo todas as cores do espectro, desde o vermelho até o violeta, mais o magenta. Atinge valores de 0 a 360, em algumas aplicações, esse valor é normalizado de 0 a 100% ou entre 0 e 1.</li>



<li>Saturação: Também chamado de &#8220;pureza&#8221;. Quanto menor esse valor, mais com tom de cinza aparecerá a imagem. Quanto maior o valor, mais &#8220;pura&#8221; é a imagem. Atinge valores de 0 a 100% entre 0 e 1.</li>



<li>Valor (brilho): Define o brilho da cor. Atinge valores de 0 a 100% ou entre 0 e 1.</li>
</ul>



<p class="wp-block-paragraph">Este espectro de cor é muito útil no processamento de imagens e visão computacional, pois é mais simples extrair um faixa ou tipo de cor com este modelo.</p>



<h2 class="wp-block-heading">Representação HSL</h2>



<p class="wp-block-paragraph">HSL é a abreviatura para o sistema de cores formado pelos componentes Hue (matiz), Saturation (saturação) e Lightness (luminosidade). O sistema de cor HSL é uma representação cilíndrica (ou biconica) das cores, semelhante ao HSV, porém com uma forma diferente de representar a variação de brilho.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsl-1024x768.png" alt="" class="wp-image-6816" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsl-1024x768.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsl-300x225.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsl-768x576.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsl.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"> A cor, no sistema HSL, é definida conforme descrito abaixo: </p>



<ul class="wp-block-list">
<li>Matiz (Hue) -Define o tipo de cor, abrangendo todas as cores do espectro visível, desde o vermelho até o violeta, incluindo o magenta. Seus valores variam de 0 a 360 graus, podendo também ser normalizados entre 0 e 1 ou 0% e 100%.</li>



<li>Saturação (Saturation) -Representa a intensidade ou pureza da cor. Quanto menor o valor, mais próxima a cor estará de tons de cinza. Quanto maior, mais intensa e &#8220;pura&#8221; será a cor. Seus valores variam entre 0 e 100% ou entre 0 e 1.</li>



<li>Luminosidade (Lightness) &#8211; Define o grau de iluminação da cor. Diferente do modelo HSV, a luminosidade no HSL varia entre preto, cor pura e branco:
<ul class="wp-block-list">
<li>0% representa preto</li>



<li>50% representa a cor em sua intensidade normal</li>



<li>100% representa branco</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Esse modelo permite um controle mais intuitivo da iluminação da cor, sendo bastante utilizado em design gráfico e interfaces visuais.</p>



<p class="wp-block-paragraph">Assim como o HSV, o sistema HSL também é útil no processamento de imagens e visão computacional, especialmente quando se deseja manipular ou analisar cores levando em consideração sua luminosidade de forma mais equilibrada.</p>



<h2 class="wp-block-heading">RGB para HSV e HSL</h2>



<p class="wp-block-paragraph">O HSV e o HSL são modelos de cores semelhantes, porém distintos. Ambos utilizam representações baseadas em geometrias cilíndricas para organizar as cores, facilitando sua interpretação e manipulação. No entanto, eles diferem na forma como essa geometria é construída.<br>O modelo HSV é baseado no chamado “hexcone” (um cone hexagonal), enquanto o modelo HSL é baseado em um “bi-hexcone” (duplo cone hexagonal), o que resulta em diferentes formas de representar o brilho e a intensidade das cores.<br>Na Figura 12, é possível observar as diferenças entre essas duas representações cilíndricas. A ilustração apresenta:</p>



<ul class="wp-block-list">
<li>A estrutura geométrica de cada modelo (HSV e HSL);</li>



<li>A visualização das cores quando a saturação está em 100%, evidenciando apenas cores puras;</li>



<li>A visualização das cores quando luminosidade (no HSL) ou valor/brilho (no HSV) estão em 100%, mostrando como cada modelo trata regiões mais claras;</li>



<li>Cortes verticais no cilindro para valores de matiz em 0° e 180°, permitindo observar como as cores se distribuem internamente em cada modelo.</li>
</ul>



<p class="wp-block-paragraph">Essas diferenças estruturais influenciam diretamente na forma como as cores são ajustadas e percebidas em cada sistema, especialmente em aplicações de design gráfico e processamento de imagens.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="768" height="768" src="https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsl_x_hsv.png" alt="" class="wp-image-6804" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsl_x_hsv.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsl_x_hsv-300x300.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/hsl_x_hsv-150x150.png 150w" sizes="auto, (max-width: 768px) 100vw, 768px" /><figcaption class="wp-element-caption">Figura 12 -HSL e HSV <a href="#refs">[WK2]</a>.</figcaption></figure>



<p class="wp-block-paragraph">Nos Vídeos 1 e 2, abaixo, são demonstrados como são realizados as conversões de um cubo RGB para as representações HSV/HSV e HSL. </p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-video"><video height="480" style="aspect-ratio: 430 / 480;" width="430" controls src="https://visaocomputacional.com.br/wp-content/uploads/2024/08/RGB_2_HSV_conversion_with_grid.ogg.480p.vp9_.webm"></video><figcaption class="wp-element-caption"> Video 1 &#8211; Derivação geométrica visualizada da representação HSV cilíndrica de um &#8220;cubo de cores&#8221; RGB <a href="#refs">[WK2]</a>. </figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-video"><video controls src="https://visaocomputacional.com.br/wp-content/uploads/2024/08/RGB_2_HSL_conversion_with_grid.ogg.480p.vp9_.webm"></video><figcaption class="wp-element-caption"> Video 2 &#8211; Derivação geométrica visualizada da representação HSL cilíndrica de um &#8220;cubo de cores&#8221; RGB <a href="#refs">[WK2]</a>. </figcaption></figure>
</div>
</div>



<p class="wp-block-paragraph">Na Figura 13, ilustração da fórmula base para conversão entre estas representações. Ná página <a href="https://en.wikipedia.org/wiki/HSL_and_HSV">HSL and HSV</a> da Wikipédia, contém a explanação completa destes cálculos.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="300" height="600" src="https://visaocomputacional.com.br/wp-content/uploads/2024/08/HSL-HSV_hue_and_chroma.svg_.png" alt="" class="wp-image-6806" srcset="https://visaocomputacional.com.br/wp-content/uploads/2024/08/HSL-HSV_hue_and_chroma.svg_.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2024/08/HSL-HSV_hue_and_chroma.svg_-150x300.png 150w" sizes="auto, (max-width: 300px) 100vw, 300px" /><figcaption class="wp-element-caption"> Figura 13 &#8211; Fórmula base para conversão do sistema RGB em HSV e HSL  <a href="#refs">[WK2]</a>.  </figcaption></figure>
</div>


<h1 class="wp-block-heading">Filtros</h1>



<p class="wp-block-paragraph">A seguir, serão apresentados alguns <a href="https://visaocomputacional.com.br/dominios-de-valor-espaco-e-frequencia/">filtros locais (ou espaciais)</a>, com o objetivo de demonstrar como, por meio de operações simples, é possível extrair regiões específicas de uma imagem ou isolar determinados tipos de objetos.</p>



<p class="wp-block-paragraph">Os filtros apresentados aqui são considerados os mais básicos no processamento de imagens. Eles funcionam analisando individualmente o valor de cada pixel da imagem de entrada e, com base em determinados critérios, geram uma nova imagem contendo apenas as informações de interesse.</p>



<p class="wp-block-paragraph">Esse processo permite destacar características específicas da imagem original, como cores, bordas ou regiões específicas, facilitando etapas posteriores de análise. O funcionamento geral desse tipo de filtro pode ser observado de forma ilustrativa na Figura 14.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="595" height="410" src="https://visaocomputacional.com.br/wp-content/uploads/2021/07/dom_espaco_filtros.png" alt="" class="wp-image-1490" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/07/dom_espaco_filtros.png 595w, https://visaocomputacional.com.br/wp-content/uploads/2021/07/dom_espaco_filtros-300x207.png 300w" sizes="auto, (max-width: 595px) 100vw, 595px" /><figcaption class="wp-element-caption">Figura.14 Funcionamento de um filtro de imagem.</figcaption></figure>
</div>


<h3 class="wp-block-heading">Filtro de cor HSV.</h3>



<p class="wp-block-paragraph">No experimento apresentado no Vídeo 3, é possível observar como a aplicação simples de um filtro baseado em uma faixa de cores permite extrair objetos ou regiões de interesse de uma imagem.</p>



<p class="wp-block-paragraph">Nesse experimento, são extraídas seis regiões distintas. Cada uma dessas regiões corresponde a uma faixa de cor específica, permitindo a separação dos elementos da imagem com base em suas cores. As faixas utilizadas representam as seguintes cores: vermelho, amarelo, verde, azul, roxo e ciano.</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="VC - Experimento - Extraindo ROI com filtros de cores HSV." width="800" height="450" src="https://www.youtube.com/embed/C0vAPq-58eo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
</div><figcaption class="wp-element-caption"> Video 3 &#8211; Experimento para extração de áreas de interesse com filtros HSV.</figcaption></figure>



<p class="wp-block-paragraph">No caso apresentado no Vídeo 3, o objetivo principal é extrair as regiões da imagem que contêm morangos. Para isso, é aplicado um filtro correspondente à faixa de cor vermelha, permitindo isolar esses elementos do restante da imagem de entrada.</p>



<p class="wp-block-paragraph">É importante observar que, para isolar completamente os morangos, foram utilizadas duas faixas de cor vermelha. Isso ocorre porque, na representação HSV, a cor vermelha está localizada tanto no início quanto no final do intervalo de matiz, devido à natureza cíclica dessa representação.</p>



<p class="wp-block-paragraph">Apesar de sua simplicidade, esse tipo de filtro pode ser utilizado de forma eficiente em ambientes controlados como um primeiro estágio de detecção de objetos. Isso se deve ao seu baixo custo computacional, o que permite seu uso em conjunto com métodos mais avançados, como algoritmos de inteligência artificial, formando uma abordagem encadeada de processamento.</p>



<h3 class="wp-block-heading">Filtro de cor NDVI</h3>



<p class="wp-block-paragraph">Uma outra forma de extrair informações de uma imagem utilizando apenas filtros de cores é por meio da comparação da diferença, ou distância, entre duas ou mais bandas de cor em cada pixel. Esse tipo de abordagem permite extrair informações relevantes, como a presença de água, a saúde da vegetação, entre outras características específicas da cena.</p>



<p class="wp-block-paragraph">O Índice de Vegetação por Diferença Normalizada (NDVI) é um exemplo desse tipo de técnica. Ele consiste em um indicador simples que representa a quantidade de biomassa fotossinteticamente ativa, ou seja, fornece uma estimativa da saúde da vegetação. Em termos mais intuitivos, o NDVI mede o estado das plantas com base em como elas refletem e absorvem a luz em diferentes frequências do espectro eletromagnético.</p>



<p class="wp-block-paragraph">De forma simplificada, plantas saudáveis tendem a absorver mais luz na faixa do vermelho visível e refletir mais luz na faixa do infravermelho próximo. Já superfícies não vegetais apresentam comportamentos diferentes nessas faixas.</p>



<p class="wp-block-paragraph">O NDVI funciona justamente comparando essas duas respostas espectrais, utilizando a seguinte fórmula:</p>



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



<p class="wp-block-paragraph">O resultado desse cálculo é um valor normalizado que varia tipicamente entre -1 e 1, permitindo diferenciar diferentes tipos de cobertura do solo.</p>



<p class="wp-block-paragraph">Observe a imagem à esquerda da Figura 14: ela foi gerada a partir do cálculo do NDVI, utilizando a diferença entre dois canais de cor — o vermelho e o infravermelho próximo. Nessa representação, elementos como troncos de árvores, grama seca e rochas apresentam valores baixos de NDVI, pois não realizam fotossíntese. Em contrapartida, áreas com vegetação saudável apresentam valores elevados de NDVI, destacando-se claramente na imagem.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1024" height="466" src="https://visaocomputacional.com.br/wp-content/uploads/2022/02/ndvi_01-1024x466.png" alt="" class="wp-image-3004" srcset="https://visaocomputacional.com.br/wp-content/uploads/2022/02/ndvi_01-1024x466.png 1024w, https://visaocomputacional.com.br/wp-content/uploads/2022/02/ndvi_01-300x136.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2022/02/ndvi_01-768x349.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2022/02/ndvi_01.png 1500w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Figura 14 &#8211; Foto colorida normal à direita e imagem de índice de vegetação de diferença normalizada NDVI) à esquerda.<br>Autor: Public Lab</figcaption></figure>



<p class="wp-block-paragraph">Mais sobre NDVI e outros Índices você pode ler em <a href="https://visaocomputacional.com.br/experimento-ndvi-e-ndwi-com-o-google-earth-engine/">NDVI e NDWI – Índice de Vegetação e Índice de Água</a>, e em <a href="https://visaocomputacional.com.br/experimento-ndvi-e-ndwi-com-o-google-earth-engine/">Experimento – NDVI e NDWI com o Google Earth Engine</a> um exemplo de como detectar água e vegetação saudável utilizando o Google Maps, utilizando apenas filtros de cores.</p>



<h4 class="wp-block-heading">Outros índices</h4>



<p class="wp-block-paragraph">Existem diversos outros índices, capazes de diferenciar nuvens de neve, queimadas, entre outros como:</p>



<ul class="wp-block-list">
<li>Índice de Diferença Normalizada da Água (NDWI)</li>



<li>Índice De Queima Por Razão Normalizada (NBR), Índice De Clorofila Verde (GCI);</li>



<li>Índice De Neve de Diferença Normalizada (NDSI);</li>



<li>Índice De Clorofila de Borda Vermelha (RECl);</li>



<li>Índice De Vegetação Ajustado ao Solo Modificado (MSAVI);</li>



<li>Índice De Vegetação da Diferença De Verde Normalizado (GNDVI);</li>



<li>Índice De Vegetação Ajustado ao Solo (SAVI);</li>



<li>Índice De Vegetação Resistente À Atmosfera (ARVI);</li>



<li>Índice De RedEdge por Diferença Normalizada (NDRE);</li>
</ul>



<p class="wp-block-paragraph">melhores detalhados no artigo&nbsp;<a href="https://eos.com/pt/blog/indices-de-vegetacao/">Indices de Vegetação</a>&nbsp;da Earth Observation System.</p>



<h2 class="wp-block-heading">Comentários finais</h2>



<p class="wp-block-paragraph">Uma das melhores formas de entender melhor os efeitos destes filtro é testando operações e funções que alteram a imagem, pois uma mesma operações pode produzir diversos efeitos diferentes dependendo da imagem utilizada.</p>



<p class="wp-block-paragraph"><strong>Referências</strong>:</p>



<p class="wp-block-paragraph">[C] CALDAS, J.&nbsp;<em>Museu Interativo da Física da UFPA: Ação educativa com ênfase em divulgação e popularização da História e da Filosofia da Ciência para o ensino de Física</em>. 2015. Trabalho de Conclusão de Curso. Faculdade de Física. Universidade Federal do Pará, Belém, 2015.</p>



<p class="wp-block-paragraph">[GW]&nbsp;GONZALEZ, R. C., WOODS, R. E. Processamento de Imagens Digitais.<br>Editora Edgard Blucher, ISBN 978-85-8143-586-2, 3 ed., São Paulo, 2010</p>



<p class="wp-block-paragraph">[GKPB] CMYK, RGB e RYB: conheça os diferentes sistemas de cores primárias. <a href="https://gkpb.com.br/49455/cores-primarias-cmyk-rgb/">Acessado 12 de agosto de 2024</a>.</p>



<p class="wp-block-paragraph">[GC] Gerenciamento de cor. Cores – sistema aditivo e substrativo. <a href="https://gerenciamentodecor.wordpress.com/2016/02/20/cores-sistema-aditivo-e-substrativo/">Acessado em 12/08/2024.</a></p>



<p class="wp-block-paragraph">[WK] Wikipédia . HSV. <a href="https://pt.wikipedia.org/wiki/HSV">Acessado em 29/08/2024</a>.</p>



<p class="wp-block-paragraph">[WK2] Wikipédia. HSL and HSV. <a href="https://en.wikipedia.org/wiki/HSL_and_HSV">Acessado em 30/08/2024</a>.</p>



<p class="wp-block-paragraph">[EOS-2] Earth Observation System, Índice De Água De Diferença Normalizada.&nbsp;<a href="https://eos.com/pt/make-an-analysis/ndwi/">Acessado em 18 fev 2024.</a></p>
<p>The post <a href="https://visaocomputacional.com.br/espaco-e-filtros-de-cores-hsv-rgb-cmyk-hsb-hsl-e-ryb/">Espaço e Filtros de Cores HSV, RGB, CMYK, HSB, HSL e RYB</a> appeared first on <a href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		<enclosure url="https://visaocomputacional.com.br/wp-content/uploads/2024/08/RGB_2_HSV_conversion_with_grid.ogg.480p.vp9_.webm" length="395976" type="video/webm" />
<enclosure url="https://visaocomputacional.com.br/wp-content/uploads/2024/08/RGB_2_HSL_conversion_with_grid.ogg.480p.vp9_.webm" length="377113" type="video/webm" />

			</item>
		<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 href="https://visaocomputacional.com.br/yolo-versoes-3-e-4-arquitetura/">YOLO Versões 3 e 4 (Arquitetura)</a> appeared first on <a href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Como funciona?</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">É 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 class="wp-block-heading">YOLO V3</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 1 &#8211; Arquitetura YOLO v3</figcaption></figure>



<h3 class="wp-block-heading" id="3888">Detecção em três escalas</h3>



<p class="wp-block-paragraph" 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 class="wp-block-paragraph">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 class="wp-block-paragraph" 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 class="wp-block-paragraph" 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 class="wp-block-paragraph" 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 class="wp-block-paragraph" 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 class="wp-block-paragraph" 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" decoding="async" 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="auto, (max-width: 840px) 100vw, 840px" /><figcaption>Figura 2 &#8211; Primeira saída YOLO v3 [DPB].</figcaption></figure></div>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 3 &#8211; Segunda saída YOLO v3 <a href="#refs">[DPB]</a>.</figcaption></figure>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 4 &#8211; Terceira saída YOLO v3 <a href="#refs">[DPB]</a>.</figcaption></figure>



<p class="wp-block-paragraph">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 class="wp-block-paragraph"><strong>Caixas de âncora</strong></p>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 554px) 100vw, 554px" /><figcaption>Figura 5 – Caixas âncora&nbsp;<a href="#refs">[DPB2]</a>.</figcaption></figure></div>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (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 class="wp-block-heading" id="a3f8">Mais caixas delimitadoras por imagem</h3>



<p class="wp-block-paragraph" 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 class="wp-block-paragraph" 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 class="wp-block-heading">Remoção da função SoftMax</h3>



<p class="wp-block-paragraph" 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 class="wp-block-paragraph" 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 class="wp-block-heading">Diferença da arquitetura YOLO v2 e YOLO v3</h3>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (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 class="wp-block-heading">YOLO v4</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 6 &#8211; Arquitetura YOLO v4 <a href="#refs">[ACH]</a>. </figcaption></figure>



<p class="wp-block-paragraph">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 class="wp-block-heading">Backbone (Espinha dorsal)</h4>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Neck (Pescoço)</h4>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 7 &#8211; Fluxo simplificado do YOLO v4 <a href="#refs">[DPB3]</a>.</figcaption></figure>



<h4 class="wp-block-heading">Head (Cabeça)</h4>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 824px) 100vw, 824px" /><figcaption>Figura 8 &#8211; Fluxo simplificado do YOLO v4  <a href="#refs">[DPB3]</a></figcaption></figure>



<p class="wp-block-paragraph">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 class="wp-block-heading">Diferença da arquitetura YOLO v3 e YOLO v4</h3>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (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 class="wp-block-heading">Material Complementar</h2>



<h3 class="wp-block-heading">FPN &#8211; Feature Pyramid Networks</h3>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 11 &#8211; Estrutura da FPN original <a href="#refs">[ST]</a>.</figcaption></figure>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">No YOLOv4, o conceito FPN é gradualmente implementado/substituído pelo SAM, PAN e SPP modificados.</p>



<h3 class="wp-block-heading">SPP &#8211; Spatial Pyramid Pooling</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">Observe na figura 10, e suponha que a saída da camada convolicional (parte preta da figura) tenha 256 mapas de recursos.</p>



<ol class="wp-block-list"><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" decoding="async" 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="auto, (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 class="wp-block-paragraph">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 class="wp-block-heading">PAN &#8211; Path Aggregation Network</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 720px) 100vw, 720px" /><figcaption>Figura 13 &#8211; PAN modificado para o YOLO v4 <a href="#refs">[ACH]</a></figcaption></figure></div>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 14 &#8211; Estrutura do PAN original e modificado <a href="#refs">[DPB]</a>.</figcaption></figure></div>



<p class="wp-block-paragraph"><strong>Referências:</strong></p>



<p class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[DPB] Deep Learning Bible. Yolo V1 – EN –&nbsp;<a href="https://wikidocs.net/177719">Acessado em 15/02/2024</a>.</p>



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



<p class="wp-block-paragraph">[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 class="wp-block-paragraph">[DPB3] Deep Learning Bible. V4 explicado em todos os detalhes <a href="https://wikidocs.net/167833">Acessado em 25/03/2024</a></p>



<p class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 href="https://visaocomputacional.com.br/yolo-versoes-3-e-4-arquitetura/">YOLO Versões 3 e 4 (Arquitetura)</a> appeared first on <a 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 href="https://visaocomputacional.com.br/yolo-versoes-1-e-2-arquitetura/">YOLO Versões 1 e 2 (Arquitetura)</a> appeared first on <a href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">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 class="wp-block-paragraph"><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 class="wp-block-paragraph">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 class="wp-block-heading">Como funciona?</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Nem Tudo é Rede Neural</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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 class="wp-block-paragraph">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 class="wp-block-paragraph">Agora que eliminamos estas duas etapas, ficará menos complexo entender o que acontece dentro do YOLO.</p>



<h2 class="wp-block-heading">Rede Neural &#8220;Dinâmica&#8221;</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Função de Perda</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Mais detalhes sobre cada função de perda serão apresentado nas próximas seções.</p>



<h2 class="wp-block-heading">YOLO v1</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 840px) 100vw, 840px" /><figcaption>Figure 3 &#8211; Rede neural YOLO v1 <a href="#refs">[DPB]</a>. </figcaption></figure>



<p class="wp-block-paragraph"><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 class="wp-block-paragraph">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" decoding="async" 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="auto, (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" decoding="async" 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="auto, (max-width: 734px) 100vw, 734px" /><figcaption>Figura 5 &#8211; CNNs YOLO v1 <a href="#refs">[DPB]</a> .</figcaption></figure>



<p class="wp-block-paragraph">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 class="wp-block-paragraph"><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 class="wp-block-paragraph"><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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 6 &#8211; Tensor de saída do YOLO v1 <a href="#refs">[DPB]</a>.</figcaption></figure>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">Para prever uma única caixa, a rede deve gerar uma série de coisas.</p>



<ul class="wp-block-list"><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" decoding="async" 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="auto, (max-width: 796px) 100vw, 796px" /><figcaption>Figura 7 &#8211; Tensor de saída do YOLO v1 <a href="#refs">[DPB]</a>.</figcaption></figure>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Treinamento YOLO v1</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">YOLO v2</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">A seguir alguns pontos que fizeram a versão 2 ter um desempenho melhor.</p>



<h3 class="wp-block-heading">Normalização em lote</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">Na seção &#8220;Material Complementar&#8221;, será apresentada uma breve descrição sobre esta técnica.</p>



<h3 class="wp-block-heading">Caixas de âncora</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 554px) 100vw, 554px" /><figcaption>Figura 9 &#8211; Caixas âncora <a href="#refs">[DPB]</a>.</figcaption></figure></div>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (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 class="wp-block-paragraph"> </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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="auto, (max-width: 850px) 100vw, 850px" /><figcaption>Figura 11 &#8211;  Rede neural YOLO v2.</figcaption></figure>



<p class="wp-block-paragraph">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 decoding="async" 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 class="wp-block-paragraph">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" decoding="async" 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="auto, (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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Figura 14 &#8211; Saída YOLO v2 <a href="#refs">[DPB]</a>.</figcaption></figure>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Treinamento </h2>



<p class="wp-block-paragraph">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 class="wp-block-heading">Treinamento multiescala</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Diferença Entre YOLO v1 e v2</h2>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 981px) 100vw, 981px" /><figcaption>Figura 16 &#8211; Diagrama YOLO v1 e v2 <a href="#refs">[DPB]</a>.</figcaption></figure>



<h2 class="wp-block-heading">Material Complementar</h2>



<h3 class="wp-block-heading">IoU (Intersection over Union)</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 854px) 100vw, 854px" /><figcaption>Figura 17 &#8211; Intersecção sobre União (IoU) <a href="#refs">[SD]</a></figcaption></figure>



<p class="wp-block-paragraph">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 class="wp-block-heading">Normalização em Lote</h3>



<p class="wp-block-paragraph"><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 class="wp-block-heading">Camada CNN &#8211; Rede Neural Convolucional</h3>



<p class="wp-block-paragraph">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" decoding="async" 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 class="wp-block-paragraph">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 class="wp-block-heading">Camada Totalmente Conectada</h3>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 408px) 100vw, 408px" /><figcaption>Figura 19 &#8211; Camada totalmente conectada.</figcaption></figure></div>



<p class="wp-block-paragraph" id="refs"><strong>Referências:</strong></p>



<p class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[RJ2] Redmon, Joseph and Farhadi, Ali, YOLO9000: Better, Faster, Stronger.&nbsp;<a href="https://arxiv.org/pdf/1612.08242v1.pdf">Artigo</a>.</p>



<p class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 href="https://visaocomputacional.com.br/yolo-versoes-1-e-2-arquitetura/">YOLO Versões 1 e 2 (Arquitetura)</a> appeared first on <a 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 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 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 class="wp-block-paragraph">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 class="wp-block-heading">OpenCV</h3>



<p class="wp-block-paragraph">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 class="wp-block-heading">Extração de Fronteira Interna</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">É 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 class="wp-block-paragraph">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 class="wp-block-heading">Extração de Fronteiras Externas</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Esqueletização de Imagem Binarizada </h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-list" 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 class="wp-block-paragraph">O processo é repetido até que a imagem clone seja zerada, durante o processo de erosão.</p>



<p class="wp-block-paragraph">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 class="wp-block-heading">Cuidados</h2>



<p class="wp-block-paragraph">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 class="wp-block-heading">Considerações</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">O código aqui apresentado esta disponível no link abaixo:</p>



<p class="wp-block-paragraph">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 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 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 href="https://visaocomputacional.com.br/morfologia-matematica-esqueletizacao-de-imagem/">Morfologia Matemática &#8211; Esqueletização de imagem</a> appeared first on <a href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Transformada do eixo-médio</h3>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (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 class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 840px) 100vw, 840px" /><figcaption>Fig 2 &#8211; Ilustração de esqueleto de formas geométricas.</figcaption></figure>



<h3 class="wp-block-heading">Transformada de distância</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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="auto, (max-width: 253px) 100vw, 253px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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="auto, (max-width: 253px) 100vw, 253px" /><figcaption>Fig 3 &#8211; Transformada de distância. </figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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="auto, (max-width: 253px) 100vw, 253px" /></figure>
</div>
</div>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 840px) 100vw, 840px" /><figcaption>Fig 4 &#8211; Ilustração de transformada de distância <a href="#refs">[LQ]</a>.</figcaption></figure>



<h3 class="wp-block-heading">Processo de esqueletização com morfologia matemática</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">Observe a imagem binarizada A e o elemento estruturante B, logo abaixo. Nas linhas seguintes, observe que:</p>



<ul class="wp-block-list"><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 class="wp-block-paragraph">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 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow"></div>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow">
<p class="has-text-align-center wp-block-paragraph"><strong>Erosão por B</strong><br></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<p class="has-text-align-center wp-block-paragraph"><strong>Dilatação da 1ª coluna por B</strong><br></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<p class="has-text-align-center wp-block-paragraph"><strong>Subtração da 1ª coluna da linha anterior pela 2ª coluna</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 class="wp-block-heading">Exemplos</h3>



<p class="wp-block-paragraph">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" decoding="async" 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" decoding="async" 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="auto, (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" decoding="async" 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="auto, (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 class="wp-block-paragraph" id="refs"><strong>Referências</strong></p>



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



<p class="wp-block-paragraph">[LQ] Li, Quannan et al. “Skeleton Extraction Using SSM of the Distance Transform.” (2008).</p>



<p class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 href="https://visaocomputacional.com.br/morfologia-matematica-esqueletizacao-de-imagem/">Morfologia Matemática &#8211; Esqueletização de imagem</a> appeared first on <a 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 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 href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 943px) 100vw, 943px" /><figcaption>Fig 1 &#8211; Resultado da extração de fronteiras utilizando processamento morfológico. [GW] </figcaption></figure>



<p class="wp-block-paragraph">Basicamente existem dois tipos de extração de fronteiras, as fronteiras internas e as fronteiras externas, sendo uma contraponto da outra. </p>



<h3 class="wp-block-heading">Fronteira interna</h3>



<p class="wp-block-paragraph">Definição: <strong>β(A) = A &#8211;</strong> <strong>(A</strong> <strong><sub><sup>⊖</sup></sub> B) </strong></p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" 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="auto, (max-width: 255px) 100vw, 255px" /><figcaption>A<br>Imagem binarizada</figcaption></figure></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" 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="auto, (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 class="wp-block-heading">Fronteira externa</h3>



<p class="wp-block-paragraph">Definição: <strong>β(A) = (A <sub><sup>⊕</sup></sub> B) &#8211; A</strong></p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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="auto, (max-width: 255px) 100vw, 255px" /><figcaption>A<br>Imagem binarizada</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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="auto, (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 is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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="auto, (max-width: 252px) 100vw, 252px" /><figcaption> (A <sub><sup>⊕</sup></sub> B) &#8211; A<br>Fronteira externa</figcaption></figure>
</div>
</div>



<h3 class="wp-block-heading">Outros exemplos</h3>



<p class="wp-block-paragraph">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" decoding="async" width="150" height="151" 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="auto, (max-width: 150px) 100vw, 150px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="150" height="151" 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="auto, (max-width: 150px) 100vw, 150px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="150" height="151" 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="auto, (max-width: 150px) 100vw, 150px" /></td></tr><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="150" height="151" 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="auto, (max-width: 150px) 100vw, 150px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="150" height="151" 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="auto, (max-width: 150px) 100vw, 150px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="150" height="151" 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="auto, (max-width: 150px) 100vw, 150px" /></td></tr></tbody></table><figcaption>Tabela 01 &#8211; Exemplos de extração de fronteiras com morfologia matemática.</figcaption></figure>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><strong>Referências:</strong></h2>



<p class="wp-block-paragraph">[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 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 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 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 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 class="wp-block-paragraph">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 class="wp-block-heading">OpenCV</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Erosão</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Agora que temos nosso núcleo e sua posição, nossa função de erosão foi programada com as seguintes etapas:</p>



<ul class="wp-block-list"><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 class="wp-block-heading">Dilatação</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">A programação da dilatação é menos complexa que a da erosão, nossa função realiza apenas as seguintes etapas:</p>



<ul class="wp-block-list"><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 class="wp-block-heading">Abertura</h2>



<p class="wp-block-paragraph">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 class="wp-block-heading">Fechamento</h2>



<p class="wp-block-paragraph">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 class="wp-block-heading">Considerações</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">O código aqui apresentado esta disponível no link abaixo:</p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph"></p>
<p>The post <a 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 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 href="https://visaocomputacional.com.br/morfologia-matematica-para-processamento-de-imagens/">Morfologia Matemática para Processamento de Imagens</a> appeared first on <a href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Neste post é apresentado um resumo sobre morfologia matemática, sem detalhar suas fórmulas matemáticas.</p>



<h2 class="wp-block-heading">Imagem Digital e Binária</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Neste artigo<span class="has-inline-color has-black-color"> é apresentada a morfologia matemática binária (em imagens binárias).</span></p>



<h2 class="wp-block-heading">Elemento Estruturante</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p class="has-text-align-center wp-block-paragraph">[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" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<p class="has-text-align-center wp-block-paragraph">[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" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow">
<p class="has-text-align-center wp-block-paragraph">[1, <br> <s><strong>1</strong></s>, <br> 1]</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" 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 class="wp-block-paragraph">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 class="wp-block-heading">Erosão e Dilatação</h2>



<p class="wp-block-paragraph">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 class="wp-block-heading">Erosão</h3>



<p class="wp-block-paragraph">Símbolo / Representação : <strong>⊖</strong></p>



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



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" 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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption> Fig 6 &#8211;  Efeito de Erosão Morfológica em placa de circuitos.</figcaption></figure>



<p class="wp-block-paragraph">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 class="wp-block-heading">Dilatação</h3>



<p class="wp-block-paragraph">Símbolo / Representação: <strong>⊕</strong></p>



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



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" 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 is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" 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="auto, (max-width: 574px) 100vw, 574px" /><figcaption> Fig 8 &#8211;  Ilustração de Dilatação.</figcaption></figure></div>
</div>
</div>



<h2 class="wp-block-heading">Abertura e Fechamento</h2>



<p class="wp-block-paragraph">Duas outras operações morfológicas importantes são a abertura e fechamento.</p>



<h3 class="wp-block-heading">Abertura</h3>



<p class="wp-block-paragraph">Símbolo / Representação: <strong> ◦ </strong></p>



<p class="wp-block-paragraph">Definição: <strong>A ◦ B = (A <sub><sup>⊖</sup></sub> B)<strong> <sub><sup>⊕</sup></sub> </strong>B</strong></p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption> Fig 9 &#8211;  Efeito da abertura morfológica.</figcaption></figure></div>



<h3 class="wp-block-heading">Fechamento</h3>



<p class="wp-block-paragraph">Símbolo / Representação:  <strong>• </strong></p>



<p class="wp-block-paragraph">Definição: <strong>A • B = (A<strong> <sub><sup>⊕</sup></sub> </strong>B) <sub><sup>⊖</sup></sub> B</strong></p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 758px) 100vw, 758px" /><figcaption> Fig 10 &#8211;  Efeito do fechamento morfológica.  </figcaption></figure></div>



<h3 class="wp-block-heading">Filtragem morfológica</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Fig 11 &#8211; Filtragem de ruídos em impressão digital.</figcaption></figure></div>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph" id="refs"><strong>Referências:</strong></p>



<p class="wp-block-paragraph">[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 class="wp-block-paragraph">[PS] Pedrini, H.; Schwartz, W. R.; Análise de Imagens Digitais: Princípios, Algoritmos e Aplicações. Thomson Learning, 2007</p>



<p class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 href="https://visaocomputacional.com.br/morfologia-matematica-para-processamento-de-imagens/">Morfologia Matemática para Processamento de Imagens</a> appeared first on <a 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 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 href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">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 class="wp-block-paragraph"><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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">O Diferencial YOLO</h2>



<p class="wp-block-paragraph">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" decoding="async" 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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Como Funciona?</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 457px) 100vw, 457px" /><figcaption>Figura 2 &#8211; YOLO Divisão da imagem em grades.</figcaption></figure></div>



<p class="wp-block-paragraph">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 class="wp-block-heading">Caixas delimitadoras/Bounding box</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 466px) 100vw, 466px" /><figcaption>Figura 3 &#8211; Resultado da detecção das caixas delimitadoras.</figcaption></figure></div>



<p class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 458px) 100vw, 458px" /></a><figcaption>Figura 4 &#8211; Resultado da classificação das caixas delimitadoras.</figcaption></figure></div>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Resultado caixas delimitadoras:</h3>



<p class="wp-block-paragraph">Cada caixa delimitadora no YOLO contém 3 grupos de informações/atributos:</p>



<ul class="wp-block-list"><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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 395px) 100vw, 395px" /><figcaption>Figura 5 &#8211; Mapa de saída do YOLO <a href="#refs">[AG2]</a>.</figcaption></figure></div>



<p class="wp-block-paragraph">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 class="wp-block-heading">Supressão não máxima/Non maximum suppression</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 629px) 100vw, 629px" /><figcaption>Figura 6 &#8211; Supressão não máxima.</figcaption></figure></div>



<h3 class="wp-block-heading">Âncoras/Anchor Box</h3>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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" decoding="async" 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="auto, (max-width: 456px) 100vw, 456px" /><figcaption>Figura 7 &#8211; Resultado da detecção com YOLO.</figcaption></figure></div>



<h2 class="wp-block-heading">Resumo</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph"></p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" 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 class="wp-block-heading">Um pouco de história</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Nos próximos posts, serão detalhadas estas 4 versões. Espero que tenha gostado do post, deixe seu comentário abaixo.</p>



<p class="wp-block-paragraph" id="refs"><strong>Referências:</strong></p>



<p class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[RJFA2] Redmon, Joseph and  Farhadi, Ali, YOLO9000: Better, Faster, Stronger. <a href="https://arxiv.org/pdf/1612.08242v1.pdf">Artigo</a>.</p>



<p class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 class="wp-block-paragraph">[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 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 href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
