<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Neuman F.</title>
    <description>The latest articles on DEV Community by Neuman F. (@neumanf).</description>
    <link>https://dev.to/neumanf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3248264%2Fe1ac6370-9497-4ae6-ade5-0fceb9186c52.jpeg</url>
      <title>DEV Community: Neuman F.</title>
      <link>https://dev.to/neumanf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neumanf"/>
    <language>en</language>
    <item>
      <title>Introdução à Visão Computacional - Parte 2: Detecção de Objetos com YOLO 11</title>
      <dc:creator>Neuman F.</dc:creator>
      <pubDate>Sun, 08 Jun 2025 20:56:26 +0000</pubDate>
      <link>https://dev.to/neumanf/introducao-a-visao-computacional-parte-2-deteccao-de-objetos-com-yolo-11-2pod</link>
      <guid>https://dev.to/neumanf/introducao-a-visao-computacional-parte-2-deteccao-de-objetos-com-yolo-11-2pod</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Na primeira parte deste artigo, exploramos os princípios fundamentais da visão computacional e apresentamos bibliotecas e algoritmos utilizadas na área. Nessa segunda parte, iremos utilizar uma abordagem prática com o YOLOv11, algoritmo de detecção de objetos, desenvolvido pela Ultralytics. Mostraremos como configurar o ambiente, carregar um modelo YOLOv11 pré-treinado, detectar objetos em imagens e vídeos, e interpretar os resultados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detecção de objetos
&lt;/h2&gt;

&lt;p&gt;Utilizaremos um notebook Python no ambiente Google Colab, como exemplo, porém o passo a passo pode ser seguido em qualquer outro ambiente.&lt;/p&gt;

&lt;p&gt;Com sua conta Google, acesso o Google Colab: &lt;a href="https://colab.research.google.com" rel="noopener noreferrer"&gt;https://colab.research.google.com&lt;/a&gt; e crie um novo notebook, clicando em 'New notebook'.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação de bibliotecas
&lt;/h3&gt;

&lt;p&gt;Primeiramente, instalaremos a biblioteca da Ultralytics com o gerenciador de pacotes do Python, pip:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="err"&gt;!&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;ultralytics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utilização
&lt;/h3&gt;

&lt;p&gt;Em seguida, iremos carregar um modelo YOLO versão 11 pré-treinado. Ao executar o seguinte trecho de código, um modelo será baixado do GitHub da Ultralytics para o ambiente do notebook.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;ultralytics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;YOLO&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;YOLO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yolo11n.pt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# ou YOLO("yolo11n.yaml") para criar um modelo do zero
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Treinamento
&lt;/h3&gt;

&lt;p&gt;Treinaremos o modelo com o dataset de Common Objects in Context (ou  &lt;a href="https://cocodataset.org/" rel="noopener noreferrer"&gt;COCO&lt;/a&gt;) versão 8, utilizando 5 epochs. &lt;/p&gt;

&lt;p&gt;COCO é um conjunto de dados de detecção, segmentação e legendagem de objetos em larga escala. Em sua versão completa, ele possui mais de 200 mil imagens rotuladas, 80 categorias de objetos e 91 categorias de "coisas". Para fins de teste, utilizaremos um versão menor, composto das primeiras 128 imagens do COCO Train 2017.&lt;/p&gt;

&lt;p&gt;Já epoch, se refere a uma passagem completa por todo o conjunto de dados de treinamento. Imagine que você tem um conjunto de imagens com rótulos, usado para treinar um modelo para detectar objetos. Durante uma epoch, o modelo "vê" todas essas imagens uma vez, ajustando seus pesos internos para aprender a fazer previsões mais precisas. Portanto, se você treinar um modelo com  50 epochs, isso significa que ele passará 50 vezes por todo o conjunto de dados. Escolher um número baixo de epochs pode causar o que chamamos de underfitting, onde o modelo aprende pouco. O oposto disso também pode ser prejudicial, pois o modelo aprende demais os dados de treino e perde capacidade de generalização, chamado de overfitting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;coco128.yaml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de treinado, note que foram criados diretórios para o dataset e para o resultado dos treinamentos (métricas e pesos), em &lt;code&gt;runs &amp;gt; detect &amp;gt; train&lt;/code&gt;. No diretório de &lt;code&gt;weights&lt;/code&gt;, estão os pesos treinados do modelo. O arquivo &lt;code&gt;best.pt&lt;/code&gt; representa o modelo com o melhor desempenho obtido durante o treinamento, medido com base em alguma métrica de validação, geralmente mAP (mean Average Precision). Já o &lt;code&gt;last.pt&lt;/code&gt;, é o modelo salvo ao final do treinamento, independentemente de seu desempenho. De modo geral, podemos escolher o &lt;code&gt;best.pt&lt;/code&gt; para detectar os objetos pós treinamento, e &lt;code&gt;last.pt&lt;/code&gt; quando quisermos continuar o treinamento de onde parou.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1tvijsd01qgyknfq8h4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1tvijsd01qgyknfq8h4.png" alt="Arquivos criados"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para sabermos se o modelo está desempenhando bem, podemos consultar as métricas disponíveis na imagem &lt;code&gt;runs/detect/train/results.png&lt;/code&gt;. Nela, podemos ver a evolução do desempenho do modelo a cada epoch. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Precision é a proporção de previsões corretas entre todas as previsões positivas feitas. Alta precisão significa que o modelo não comete muitos falsos positivos&lt;/li&gt;
&lt;li&gt;Recall é a proporção de objetos verdadeiros que o modelo conseguiu identificar corretamente. Alto recall significa que o modelo não deixa escapar muitos objetos reais.&lt;/li&gt;
&lt;li&gt;mAP_0.5 e mAP_0.5:0.95 são métrica de mean Average Precision. mAP_0.5 é a média da precisão com IoU ≥ 0.5, idealmente deve ficar acima de 0.5 (ou 50%) para tarefas gerais. Enquanto mAP_0.5:0.95 é a média da precisão com múltiplos limiares de IoU (de 0.5 a 0.95, com passo 0.05), idealmente ficando acima de 0.75 (ou 75%) em contextos profissionais mais exigentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na imagem abaixo, podemos ver que a precisão está aumentando, porém o recall está instável. Além disso, pela baixa quantidade de epochs, os gráficos encontram-se muito instáveis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal045xsk1mcqcqnfcvuo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal045xsk1mcqcqnfcvuo.png" alt="Resultado para 5 epochs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Testando com 20 epochs, podemos notar que as curvas de loss de caem de forma consistente, o que indica que o modelo está conseguindo aprender com os dados. A precisão, apesar das oscilações, aparente estar aumentando. indicando que o modelo está acertando mais quando prevê a presença de objetos, e o recall está crescendo constantemente, o que indica que o modelo está detectando mais objetos verdadeiros ao longo do tempo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhv1r5r0b2iox55qf4fz0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhv1r5r0b2iox55qf4fz0.png" alt="Resultado para 20 epochs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas agora você pode estar se perguntando qual é o número ideal de epochs, e a resposta é: depende. Para datasets menores, como o COCO 128, de 50 e 100 epochs pode ser o suficiente, mas para grandes volumes de imagens, pode ser necessário mais de 300 epochs. &lt;/p&gt;

&lt;p&gt;Para minimizar a tentativa e erro ao escolher o número de epochs, podemos utilizar o parâmetro &lt;code&gt;patience&lt;/code&gt;, que serve para interromper automaticamente o treino quando não há melhora nas métricas por várias épocas consecutivas. Continuando nossa análise, agora podemos definir, por exemplo, &lt;code&gt;epochs=100&lt;/code&gt; e &lt;code&gt;patience=15&lt;/code&gt;, que gera o resultado da figura a seguir.&lt;/p&gt;

&lt;p&gt;Podemos notar que nos logs, foi mostrado que o treinamento parou mais cedo pois nenhuma melhora foi observada nas últimas 15 epochs, e os melhores resultados foram observados na epoch de número 73. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggmoefq02otvzw909blc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggmoefq02otvzw909blc.png" alt="Output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sobre as métricas, observamos que a precisão cresceu e se estabilizou por volta de 0.90, o recall atingiu aproximadamente 0.85 e mAP50 chegou a 0.91, o que são bons resultados para o dataset.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkol443e74wg6m93yshaw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkol443e74wg6m93yshaw.png" alt="Resultado para 100 epochs com patient 15"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Predição
&lt;/h3&gt;

&lt;p&gt;Agora que temos o nosso modelo treinado, podemos utilizá-lo da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;YOLO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./runs/detect/train/weights/best.pt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que, nós fizemos diferentes treinamentos, portanto várias versões do diretório "train". Então, certifique-se que você ajustou o caminho do arquivo para o último treinamento. &lt;/p&gt;

&lt;p&gt;Então, podemos utilizar o modelo para fazer uma predição com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://ultralytics.com/images/bus.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado da predição será salvo em 'runs/detect/predict'.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcv4gyqmd7e0fouy9vy8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcv4gyqmd7e0fouy9vy8.jpg" alt="Resultado da predição com a imagem de teste"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Detecção de objetos em vídeos
&lt;/h3&gt;

&lt;p&gt;Para detectar objetos em vídeos, precisaremos primeiramente instalar a biblioteca OpenCV para Python, com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="err"&gt;!&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;opencv&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então, com o trecho de código abaixo, recebemos um arquivo de vídeo no formato .mp4 (&lt;code&gt;input.mp4&lt;/code&gt;), processamos cada frame, utilizando o modelo para predizer o resultado e escrevemos em um novo frame, que fará parte de um novo arquivo de vídeo, &lt;code&gt;output.mp4&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;

&lt;span class="n"&gt;input_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;output_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;cap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;VideoCapture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;width&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CAP_PROP_FRAME_WIDTH&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CAP_PROP_FRAME_HEIGHT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;fps&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CAP_PROP_FPS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fourcc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;VideoWriter_fourcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mp4v&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;VideoWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fourcc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isOpened&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;

    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;annotated_frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;annotated_frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroyAllWindows&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado pode ser visto abaixo.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/igbvGkyPIjE"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://docs.ultralytics.com" rel="noopener noreferrer"&gt;https://docs.ultralytics.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cocodataset.org" rel="noopener noreferrer"&gt;https://cocodataset.org&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Introdução à Visão Computacional - Parte 1</title>
      <dc:creator>Neuman F.</dc:creator>
      <pubDate>Thu, 05 Jun 2025 23:56:28 +0000</pubDate>
      <link>https://dev.to/neumanf/introducao-a-visao-computacional-parte-1-4efl</link>
      <guid>https://dev.to/neumanf/introducao-a-visao-computacional-parte-1-4efl</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;A visão computacional é um campo da inteligência artificial que se dedica ao desenvolvimento de algoritmos e sistemas capazes de interpretar e extrair informações significativas a partir de dados visuais, como imagens e vídeos. Com a combinação de técnicas de processamento de imagens, aprendizado de máquina e redes neurais profundas, essa área permite que computadores reconheçam padrões, classifiquem objetos e compreendam cenas visuais de forma similar a que os humanos percebem o ambiente ao seu redor.&lt;/p&gt;

&lt;p&gt;Com o avanço de recursos computacionais e o acesso a grandes volumes de dados, a visão computacional se tornou uma ferramenta poderosa em diversos setores, como segurança, medicina, industria e mobilidade autônoma. Nesse artigo, serão abordados os princípios básicos da visão computacional, suas aplicações, seus principais algoritmos e algumas das ferramentas mais utilizadas na área.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aplicações
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Rastreamento de objetos
&lt;/h3&gt;

&lt;p&gt;Object Tracking, ou rastreamento de objetos, é a técnica que permite acompanhar o movimento de um ou mais objetos ao longo do tempo em uma sequência de imagens ou vídeos. Diferente da detecção de objetos, que identifica e localiza os objetos em cada quadro isoladamente, o rastreamento mantém a identidade desses objetos, seguindo seu trajeto e atualizando suas posições conforme eles se movem. &lt;/p&gt;

&lt;p&gt;Existem diversas aplicações da técnica, mas como um dos mais comuns,  podemos citar os sistemas de vigilância e segurança, onde é possível monitorar pessoas ou veículos suspeitos, análisar tráfego urbano para otimização de semáforos e contagem de veículos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fduzgn02vwho9c062gcn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fduzgn02vwho9c062gcn8.png" alt="Monitoramento de tráfego" width="673" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Medicina
&lt;/h3&gt;

&lt;p&gt;Na radiologia, algoritmos de deep learning são amplamente utilizados para análise automatizada de exames de imagem como raios-X, tomografias computadorizadas e ressonâncias magnéticas, auxiliando na detecção precoce de câncer de pulmão, tumores cerebrais e fraturas ósseas com precisão muitas vezes superior à de radiologistas experientes. Até mesmo durante procedimentos cirúrgicos, sistemas de visão computacional já atuam, de forma a identificar estruturas anatômicas em tempo real.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cqschujv2isb1l194wb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cqschujv2isb1l194wb.png" alt="Análise de raio-X" width="720" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reconhecimento facial
&lt;/h3&gt;

&lt;p&gt;O reconhecimento facial é uma das aplicações mais famosas da visão computacional. O processo envolve várias etapas sequenciais: primeiro a detecção do rosto na imagem, seguida pela extração de pontos de referência faciais (como olhos, nariz, boca e contorno facial), normalização da imagem para padronizar pose e iluminação, e finalmente a extração de características distintivas que formam uma representação única do rosto.&lt;/p&gt;

&lt;p&gt;As aplicações do reconhecimento facial incluem sistemas de segurança em aeroportos, controle de acesso em edifícios corporativos, desbloqueio de smartphones, organização automática de fotos pessoais, entre outros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1zmxns6chu9xin1c53va.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1zmxns6chu9xin1c53va.png" alt="Reconhecimeto facial" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pipeline
&lt;/h2&gt;

&lt;p&gt;Desde a extração dos dados brutos até o formato compreensível por computadores, uma imagem necessita passar por uma série de etapas, na qual podemos denominar de pipeline de visão computacional. De forma geral, uma pipeline geral pode ser representada pelas seguintes fases:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqirp02uvdfc62bsr8az.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqirp02uvdfc62bsr8az.png" alt="Exemplo de pipeline de visão computacional" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Dados de entrada
&lt;/h3&gt;

&lt;p&gt;Nessa etapa, o sistema recebe os dados visuais brutos, como imagens ou vídeos. Esses dados são capturados por câmeras, sensores ou extraídos de bancos de dados.&lt;/p&gt;

&lt;p&gt;Embora nós, humanos, vejamos imagens como composições visuais de formas, cores e objetos, os computadores enxergam imagens como matrizes de números. Cada imagem digital é composta por pixels, e cada pixel representa uma pequena parte da imagem. O valor de cada pixel é um número que indica sua cor ou intensidade, geramente varianda de 0 (preto) a 255 (branco). No caso de imagens coloridas, cada pixel é representado por três valores, um para cada cor primária (R - Vermelho, G - Verde e B - Azul).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybo7vv0bl8hu3e2qu69y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybo7vv0bl8hu3e2qu69y.png" alt="Comparação entre uma imagem e sua matriz" width="720" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pré-processamento
&lt;/h3&gt;

&lt;p&gt;O pré-processamento, por sua vez, prepara os dados para as próximas etapas, eliminando ruídos, ajustando contrastes e redimensionando imagens. Técnicas comuns incluem normalização, filtragem, conversão para escala de cinza e aumento de dados (data augmentation). Essa etapa melhora a qualidade e a consistência dos dados para facilitar a análise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1azk5wug5f81uvsd4ruf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1azk5wug5f81uvsd4ruf.png" alt="Transformações em imagens e suas respectivas matrizes 2D" width="703" height="713"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Seleção de áreas de interesse
&lt;/h3&gt;

&lt;p&gt;Nem todas as partes da imagem são relevantes para a tarefa. Nesta etapa, o sistema identifica regiões que merecem atenção especial, como rostos em uma multidão ou placas de trânsito em uma estrada. A ideia é focar os recursos computacionais apenas onde há maior probabilidade de obter informações úteis.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Extração de características
&lt;/h3&gt;

&lt;p&gt;Aqui, o sistema analisa as áreas de interesse para identificar padrões visuais relevantes, como bordas, texturas, formas ou cores. Esses elementos (chamados de &lt;em&gt;features&lt;/em&gt;) são convertidos em vetores numéricos que representam as características da imagem de forma computacionalmente útil.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Predição / Reconhecimento
&lt;/h3&gt;

&lt;p&gt;Com as características extraídas, o sistema utiliza modelos de aprendizado de máquina, como redes neurais convolucionais, para reconhecer objetos, classificar cenas ou fazer previsões. Por exemplo, ele pode identificar se uma imagem contém um carro, uma pessoa ou um animal.&lt;/p&gt;

&lt;p&gt;A rede neural faz uma operação de convolução de matrizes. Uma matriz menor serve como filtro, também chamada de Kernel. O filtro lê todos os pixels e produz uma matriz de dimensões menores que a matriz de entrada. Estes filtros são usados para manipular a imagem, seja desfocar, detectar bordas, relevos, cores ou aumentar a nitidez.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcaqa2yndpphdwndvxy6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcaqa2yndpphdwndvxy6m.png" alt="Exemplos de filtros utilizados na convolução" width="342" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Ação
&lt;/h3&gt;

&lt;p&gt;Por fim, com base no reconhecimento feito, o sistema executa uma ação. Isso pode ser emitir um alerta, acionar um dispositivo, tomar uma decisão autônoma (como virar o volante em um carro) ou simplesmente registrar a informação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ferramentas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenCV
&lt;/h3&gt;

&lt;p&gt;OpenCV é a biblioteca de visão computacional mais renomada e amplamente utilizada. Ela fornece acesso a mais de 2.500 algoritmos diferentes que podem ser usados ​​para construir seu próprio modelo. Além disso, ela é compatível com bibliotecas populares como TensorFlow e PyTorch, o que permite a integração entre processamento clássico de imagens e modelos modernos de deep learning.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://opencv.org" rel="noopener noreferrer"&gt;https://opencv.org&lt;/a&gt;&lt;br&gt;
Documentação: &lt;a href="https://docs.opencv.org" rel="noopener noreferrer"&gt;https://docs.opencv.org&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  DeepFace
&lt;/h3&gt;

&lt;p&gt;DeepFace é uma biblioteca gratuita e de código aberto amplamente utilizada para reconhecimento facial. Ela oferece a interface mais simples, permitindo trabalhar com tarefas complexas de CV com apenas poucas linha de código.&lt;/p&gt;

&lt;p&gt;Documentação: &lt;a href="https://github.com/serengil/deepface" rel="noopener noreferrer"&gt;https://github.com/serengil/deepface&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  YOLO
&lt;/h3&gt;

&lt;p&gt;You Only Look Once, ou YOLO, é um dos algoritmos mais conhecidos e eficientes para detecção de objetos em tempo real. Ele analisa a imagem completa apenas uma vez, dividindo-a em uma grade e, para cada célula, prevê as caixas delimitadoras (bounding boxes) e as classes dos objetos. Isso resulta em uma performance extremamente rápida e precisa, sendo ideal para aplicações que exigem velocidade, como sistemas de vigilância, carros autônomos e robótica.&lt;/p&gt;

&lt;p&gt;Documentação: &lt;a href="https://docs.ultralytics.com/models/yolo11" rel="noopener noreferrer"&gt;https://docs.ultralytics.com/models/yolo11&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.analyticsvidhya.com/blog/2020/11/computer-vision-a-key-concept-to-solve-many-problems-related-to-image-data" rel="noopener noreferrer"&gt;https://www.analyticsvidhya.com/blog/2020/11/computer-vision-a-key-concept-to-solve-many-problems-related-to-image-data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.deepchecks.com/computer-vision-models-workflow-and-tools" rel="noopener noreferrer"&gt;https://www.deepchecks.com/computer-vision-models-workflow-and-tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.electricalelibrary.com/2018/11/20/o-que-sao-redes-neurais-convolucionais" rel="noopener noreferrer"&gt;https://www.electricalelibrary.com/2018/11/20/o-que-sao-redes-neurais-convolucionais&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@tanimahmed11/computer-vision-in-a-nutshell-86d12a95b07c" rel="noopener noreferrer"&gt;https://medium.com/@tanimahmed11/computer-vision-in-a-nutshell-86d12a95b07c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://futuristech.com.au/services/computer-vision/" rel="noopener noreferrer"&gt;https://futuristech.com.au/services/computer-vision/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.augmentedstartups.com/blog/object-detection-vs-classification-in-computer-vision-explained" rel="noopener noreferrer"&gt;https://www.augmentedstartups.com/blog/object-detection-vs-classification-in-computer-vision-explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://innov8tif.com/facial-recognition-vs-fingerprint-scanning/" rel="noopener noreferrer"&gt;https://innov8tif.com/facial-recognition-vs-fingerprint-scanning/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
  </channel>
</rss>
