Zephyrnet Logo

Detecção de objetos ao vivo e segmentação de imagens com YOLOv8

Data:

Introdução

Na visão computacional, existem diferentes técnicas para detecção de objetos vivos, incluindo Faster R-CNN, SSD e YOLO. Cada técnica tem suas limitações e vantagens. Embora o Faster R-CNN possa ser excelente em precisão, ele pode não funcionar tão bem em cenários em tempo real, provocando uma mudança em direção ao Algoritmo YOLO.

A detecção de objetos é fundamental na visão computacional, permitindo que as máquinas identifiquem e localizem objetos dentro de um quadro ou tela. Ao longo dos anos, vários algoritmos de detecção de objetos foram desenvolvidos, com o YOLO emergindo como um dos mais bem-sucedidos. Recentemente, o YOLOv8 foi introduzido, aprimorando ainda mais as capacidades do algoritmo.

Neste guia abrangente, exploramos três algoritmos de detecção de objetos proeminentes: Faster R-CNN, SSD (Single Shot MultiBox Detector) e YOLOv8. Discutimos os aspectos práticos da implementação desses algoritmos, incluindo a configuração de um ambiente virtual e o desenvolvimento de um aplicativo Streamlit.

Objetivo do aprendizado

  • Entenda Faster R-CNN, SSD e YOLO e analise as diferenças entre eles.
  • Ganhe experiência prática na implementação de sistemas de detecção de objetos ao vivo usando OpenCV, Supervisão e YOLOv8.
  • Compreender o modelo de segmentação de imagens usando a anotação Roboflow.
  • Crie um aplicativo Streamlit para uma interface de usuário fácil.

Vamos explorar como fazer segmentação de imagens com YOLOv8!

Índice

Este artigo foi publicado como parte do Blogatona de Ciência de Dados.

R-CNN mais rápida

Faster R-CNN (Faster Region-based Convolutional Neural Network) é um algoritmo de detecção de objetos baseado em aprendizado profundo. É avaliado usando as estruturas R-CNN e Fast R-CNN e pode ser considerado uma extensão do Fast R-CNN.

Este algoritmo introduz a Rede de Propostas de Região (RPN) para gerar propostas de regiões, substituindo a busca seletiva usada no R-CNN. O RPN compartilha camadas convolucionais com a rede de detecção, permitindo um treinamento eficiente de ponta a ponta.

As propostas de região geradas são então alimentadas em uma rede Fast R-CNN para refinamento da caixa delimitadora e classificação de objetos.

RCNN | segmentação de imagens com YOLOv8
RCNN mais rápido | segmentação de imagens com YOLOv8

O diagrama acima ilustra a família Faster R-CNN de forma abrangente e é fácil de entender para avaliar cada algoritmo.

Detector MultiBox de disparo único (SSD)

A Detector MultiBox de disparo único (SSD) é popular na detecção de objetos e usado principalmente em tarefas de visão computacional. No método anterior, Faster R-CNN, seguimos duas etapas: a primeira envolveu a parte de detecção e a segunda envolveu a regressão. No entanto, com SSD, realizamos apenas uma única etapa de detecção. O SSD foi introduzido em 2016 para atender à necessidade de um modelo de detecção de objetos rápido e preciso.

"

O SSD tem várias vantagens sobre os métodos anteriores de detecção de objetos, como Faster R-CNN:

  • Eficiência: O SSD é um detector de estágio único, o que significa que ele prevê diretamente caixas delimitadoras e pontuações de classe sem exigir uma etapa separada de geração de propostas. Isso o torna mais rápido em comparação com detectores de dois estágios como o Faster R-CNN.
  • Treinamento ponta a ponta: O SSD pode ser treinado ponta a ponta, otimizando conjuntamente a rede base e o cabeçote de detecção, o que simplifica o processo de treinamento.
  • Fusão de recursos em várias escalas: o SSD opera em mapas de recursos em múltiplas escalas, permitindo detectar objetos de tamanhos variados com mais eficiência.

O SSD atinge um bom equilíbrio entre velocidade e precisão, tornando-o adequado para aplicações em tempo real onde o desempenho e a eficiência são essenciais.

Você só olha uma vez (YOLOv8)

Em 2015, You Only Look Once (YOLO) foi apresentado como um algoritmo de detecção de objetos em um artigo de pesquisa de Joseph Redmon, Santosh Divvala, Ross Girshick e Ali Farhadi. YOLO é um algoritmo de disparo único que classifica diretamente um objeto em uma única passagem, fazendo com que apenas uma rede neural preveja caixas delimitadoras e probabilidades de classe usando uma imagem completa como entrada. 

Agora, vamos entender o YOLOv8 como avanços de última geração na detecção de objetos em tempo real com maior precisão e velocidade. O YOLOv8 permite aproveitar modelos pré-treinados, que já foram treinados em um vasto conjunto de dados como COCO (Common Objects in Context). A segmentação de imagens fornece informações em nível de pixel sobre cada objeto, permitindo uma análise e compreensão mais detalhadas do conteúdo da imagem.

Embora a segmentação de imagens possa ser cara do ponto de vista computacional, o YOLOv8 integra esse método em sua arquitetura de rede neural, permitindo uma segmentação de objetos eficiente e precisa.

Princípio de funcionamento do YOLOv8

YOLOv8 funciona primeiro dividindo a imagem de entrada em células da grade. Usando essas células da grade, YOLOv8 prevê as caixas delimitadoras (bbox) com probabilidades de classe.

Posteriormente, o YOLOv8 emprega o algoritmo NMS para reduzir a sobreposição. Por exemplo, se houver vários carros presentes na imagem, resultando em caixas delimitadoras sobrepostas, o algoritmo NMS ajuda a reduzir essa sobreposição.

Diferença entre variantes do Yolo V8: YOLOv8 está disponível em três variantes: YOLOv8, YOLOv8-L e YOLOv8-X. A principal diferença entre as variantes é o tamanho da rede backbone. YOLOv8 possui a menor rede de backbone, enquanto YOLOv8-X possui a maior rede de backbone.

Diferença entre Faster R-CNN, SSD e YOLO

Aspecto R-CNN mais rápida SSD YOLO
Arquitetura Detector de dois estágios com RPN e Fast R-CNN Detector de estágio único Detector de estágio único
Propostas de Região Sim Não Não
Velocidade de detecção Mais lento em comparação com SSD e YOLO Mais rápido em comparação com Faster R-CNN, mais lento que YOLO Muito rápido
Precisão Geralmente maior precisão Precisão e velocidade equilibradas Precisão decente, especialmente para aplicações em tempo real
Flexibilidade Flexível, pode lidar com vários tamanhos de objetos e proporções Pode lidar com múltiplas escalas de objetos Pode ter dificuldades com a localização precisa de pequenos objetos
Detecção Unificada Não Não Sim
Troca entre velocidade e precisão Geralmente sacrifica a velocidade pela precisão Equilibra velocidade e precisão Prioriza a velocidade enquanto mantém uma precisão decente

O que é segmentação?

Como sabemos, segmentação significa que dividimos a imagem grande em grupos menores com base em certas características. Vamos entender a segmentação de imagens, que é a técnica de visão computacional usada para particionar uma imagem em diferentes segmentos ou regiões múltiplas. Como as imagens são feitas de pixels e na segmentação de imagens, os pixels são agrupados de acordo com a semelhança de cor, intensidade, textura ou outras propriedades visuais.

Por exemplo, se uma imagem contém árvores, carros ou pessoas, a segmentação da imagem dividirá a imagem em diferentes classes que representam objetos ou partes significativas da imagem. A segmentação de imagens é amplamente utilizada em diferentes campos, como imagens médicas, análise de imagens de satélite, reconhecimento de objetos em visão computacional e muito mais.

"

Na parte de segmentação, criamos inicialmente o primeiro modelo de segmentação YOLOv8 usando Robflow. Em seguida, importamos o modelo de segmentação para realizar a tarefa de segmentação. Surge a questão: por que criamos o modelo de segmentação quando a tarefa poderia ser concluída apenas com um algoritmo de detecção?

A segmentação nos permite obter a imagem corporal completa de uma turma. Embora os algoritmos de detecção se concentrem na detecção da presença de objetos, a segmentação fornece uma compreensão mais precisa ao delinear os limites exatos dos objetos. Isso leva a uma localização e compreensão mais precisas dos objetos presentes na imagem.

No entanto, a segmentação normalmente envolve maior complexidade de tempo em comparação com algoritmos de detecção porque requer etapas adicionais, como separar anotações e criar o modelo. Apesar desta desvantagem, a maior precisão oferecida pela segmentação pode compensar o custo computacional em tarefas onde o delineamento preciso do objeto é crucial.

Detecção ao vivo passo a passo e segmentação de imagens com YOLOv8

Neste conceito estamos explorando as etapas para criar um ambiente virtual usando conda, ativando o venv e instalando os pacotes de requisitos usando pip. primeiro criando o script python normal e depois criamos o aplicativo streamlit.

Passo 1: Crie um ambiente virtual usando Conda

conda create -p ./venv python=3.8 -y

Passo 2: Ative o ambiente virtual

conda activate ./venv

Etapa 3: criar requisitos.txt 

Abra o terminal e cole o script abaixo:

touch requirements.txt

Etapa 4: use o comando Nano e edite o arquivo requirements.txt

Depois de criar o require.txt, digite o seguinte comando para editar o require.txt

nano requirements.txt

Depois de executar o script acima, você poderá ver esta IU.

Use o comando Nano e edite o arquivo requirements.txt

Escreva os pacotes necessários para ela.

ultralytics==8.0.32
supervision==0.2.1
streamlit

Em seguida, pressione o botão “ctrl+o”(este comando salva a parte de edição) e pressione o botão "Entrar"

Use o comando Nano e edite o arquivo requirements.txt

Após pressionar o botão “Ctrl+x”. você pode sair do arquivo. e indo para o caminho principal.

Etapa 5: Instalando o require.txt

pip install -r requirements.txt

Etapa 6: Crie o script Python

No terminal escreva o seguinte script ou podemos dizer comando.

touch main.py

Depois de criar main.py, abra o código vs e use o comando write no terminal,

code 

Passo 7: Escrevendo o script Python

import cv2
from ultralytics import YOLO
import supervision as sv

# Define the frame width and height for video capture
frame_width = 1280
frame_height = 720

def main():
    # Initialize video capture from default camera
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)

    # Load YOLOv8 model
    model = YOLO("yolov8l.pt")

    # Initialize box annotator for visualization
    box_annotator = sv.BoxAnnotator(
        thickness=2,
        text_thickness=2,
        text_scale=1
    )

    # Main loop for video processing
    while True:
        # Read frame from video capture
        ret, frame = cap.read()

        # Perform object detection using YOLOv8
        result = model(frame, agnostic_nms=True)[0]
        detections = sv.Detections.from_yolov8(result)

        # Prepare labels for detected objects
        labels = [
            f"{model.model.names[class_id]} {confidence:0.2f}"
            for _, confidence, class_id, _
            in detections
        ]

        # Annotate frame with bounding boxes and labels
        frame = box_annotator.annotate(
            scene=frame,
            detections=detections,
            labels=labels
        )

        # Display annotated frame
        cv2.imshow("yolov8", frame)

        # Check for quit key
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # Release video capture
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

Depois de executar este comando você poderá ver que sua câmera está aberta e detectando parte de você. como gênero e partes de fundo.

Passo 7: Criar aplicativo streamlit

import cv2
import streamlit as st
from ultralytics import YOLO
import supervision as sv

# Define the frame width and height for video capture
frame_width = 1280
frame_height = 720

def main():
    # Set page title and header
    st.title("Live Object Detection with YOLOv8")

    # Button to start the camera
    start_camera = st.button("Start Camera")

    if start_camera:
        # Initialize video capture from default camera
        cap = cv2.VideoCapture(0)
        cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
        cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)

        # Load YOLOv8 model
        model = YOLO("yolov8l.pt")

        # Initialize box annotator for visualization
        box_annotator = sv.BoxAnnotator(
            thickness=2,
            text_thickness=2,
            text_scale=1
        )

        # Main loop for video processing
        while True:
            # Read frame from video capture
            ret, frame = cap.read()

            # Perform object detection using YOLOv8
            result = model(frame, agnostic_nms=True)[0]
            detections = sv.Detections.from_yolov8(result)

            # Prepare labels for detected objects
            labels = [
                f"{model.model.names[class_id]} {confidence:0.2f}"
                for _, confidence, class_id, _
                in detections
            ]

            # Annotate frame with bounding boxes and labels
            frame = box_annotator.annotate(
                scene=frame,
                detections=detections,
                labels=labels
            )

            # Display annotated frame
            st.image(frame, channels="BGR", use_column_width=True)

            # Check for quit key
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        # Release video capture
        cap.release()

if __name__ == "__main__":
    main()

Neste script, estamos criando o aplicativo streamlit e criando o botão para que após pressionar o botão a câmera do seu dispositivo fique aberta e detectando a parte no quadro.

Execute este script usando este comando.

streamlit run app.py
# first create the app.py then paste the above code and run this script.

Depois de executar o comando acima, suponha que você tenha recebido o erro de alcance como,

Ereor| Segmentação de imagens usando Yolov8

então pressione este comando,

sudo sysctl fs.inotify.max_user_watches=524288

Depois de clicar no comando que você deseja escrever sua senha porque estamos usando o comando sudo sudo é deus :)

Execute o script novamente. e você pode ver o aplicativo streamlit.

Detecção de objetos vivos | Segmentação de imagens usando YOLOv8

Aqui podemos criar um aplicativo de detecção ao vivo bem-sucedido. Na próxima parte veremos a parte de segmentação.

Etapas para anotação

Etapa 1: configuração do Roboflow

Depois de assinar o “Criar Projeto”. aqui você pode criar o projeto e o grupo de anotações.

Configuração do Roboflow | Segmentação de imagens usando Yolov8

Etapa 2: download do conjunto de dados

Aqui consideramos o exemplo simples, mas você deseja usá-lo na definição do problema, então estou usando aqui o conjunto de dados duck.

Vá isso link e baixe o conjunto de dados do pato.

Download de conjunto de dados | Segmentação de imagens usando YOLOv8

Extraia a pasta lá você pode ver as três pastas: treinar, testar e val.

Etapa 3: Carregando o conjunto de dados no roboflow

Depois de criar o projeto no roboflow, você pode ver esta UI aqui, você pode fazer upload do seu conjunto de dados, portanto, ao fazer upload apenas de imagens da parte do trem, selecione “selecione a pasta" opção.

Carregando o conjunto de dados no roboflow

Em seguida, clique no botão “Salve e continue" opção conforme marquei em uma caixa retangular vermelha

Carregando o conjunto de dados no roboflow | Segmentação de imagens usando Yolov8

Etapa 4: adicione o nome da classe

Em seguida, vá para o parte da aula no lado esquerdo marque a caixa vermelha. e escreva o nome da classe como pato, depois de clicar na caixa verde.

Adicione o nome da classe

Agora nossa configuração está concluída e a próxima parte, como a parte de anotação, também é simples.

Passo 5: Inicie o parte de anotação

Vou ao opção de anotação Marquei na caixa vermelha e cliquei em iniciar a parte da anotação conforme marquei na caixa verde.

Clique na primeira imagem para ver esta IU. Depois de ver isso, clique na opção de anotação manual.

Adicione o nome da classe

Em seguida, adicione seu ID de e-mail ou o nome do seu colega de equipe para poder atribuir a tarefa.

Clique na primeira imagem para ver esta IU. aqui clique na caixa vermelha para selecionar o modelo multipolinomial.

Detecção de objetos usando yolov8

Após clicar na caixa vermelha, selecione o modelo padrão e clique no objeto pato. Isso segmentará automaticamente a imagem. Em seguida, clique na próxima parte e salve-a. Você verá então o lado esquerdo marcado em uma caixa vermelha, onde poderá ver o nome da classe.

Detecção de objetos usando yolov8

Clique na salvar e entrar opção. anote todas as imagens.

Adicione as imagens para o formato YOLOv8. No lado direito, você verá a opção de adicionar imagens na seção de anotações. Aqui, são criadas duas partes: uma para imagens anotadas e outra para imagens não anotadas.

  • Primeiro, clique no lado esquerdo “anotar" opção então adicionar as imagens para o conjunto de dados.
  • Em seguida, clique no próximo “Adicionar imagens".
Detecção de objetos usando yolov8

Por último, criamos o conjunto de dados então clique na opção “Gerar” no lado esquerdo, marque a opção e pressione a opção conitune.

Detecção de objetos usando yolov8

Então você obtém a interface do usuário da opção de divisão do conjunto de dados aqui e pode verificar as pastas train, test e val e suas imagens são divididas automaticamente. e clique na caixa vermelha acima Opção Exportar conjunto de dados e baixe o arquivo zip. a estrutura da pasta do arquivo zip é como…

root_file.zip
│
├── test
│   ├── Images
│   └── labels
│
├── train
│   ├── Images
│   └── labels
│
├── val
│   ├── Images
│   └── labels
│
├── data.yaml
└── Readme.roboflow.txt

Etapa 6: Escreva o script para treinar o modelo de segmentação de imagens

Nesta parte, primeiro você cria o arquivo Google Collab usando o Drive e depois carrega seu conjunto de dados. e mude o Google Drive usando o Google Collab.

1. Use este comando para Monte o Google Drive

from google.colab import drive

drive.mount('/content/gdrive')

2. Definir diretório de dados Use a variável constante.

DATA_DIR = '/content/drive/MyDrive/YoloV8/Data/'

3. Instalando o pacote necessário, Instale ultralíticos

!pip install ultralytics

4. Importando as bibliotecas

import os

from ultralytics import YOLO

5. Carga YOLOv8 pré-treinado modelo (aqui temos modelos diferentes também verifique a documentação oficial lá você pode ver os diferentes modelos)

model = YOLO('yolov8n-seg.pt') 
 # load a pretrained model (recommended for training)

6. Treine o modelo

model.train(data='/content/drive/MyDrive/YoloV8/Data/data.yaml', epochs=2, imgsz=640)

# Update the path & and join this line together 

Não, verifique sua unidade. A pasta com o nome do modelo é criada e o modelo é salvo para a previsão que desejamos para este modelo.

7. Preveja o modelo

#Update the path
model_path = '/content/drive/MyDrive/YoloV8/Model/train2/weights/last.pt'
#Update the path
image_path = '/content/drive/MyDrive/YoloV8/Data/val/1be566eccffe9561.png'

img = cv2.imread(image_path)
H, W, _ = img.shape

model = YOLO(model_path)

results = model(img)

for result in results:
    for j, mask in enumerate(result.masks.data):

        mask = mask.numpy() * 255

        mask = cv2.resize(mask, (W, H))

        cv2.imwrite('./output.png', mask)

Aqui você pode ver que a imagem de segmentação foi salva.

Detecção de objetos usando yolov8

Agora, finalmente, podemos construir modelos de detecção ao vivo e de segmentação de imagens.

Conclusão

Neste blog, exploramos a detecção de objetos ao vivo e a segmentação de imagens com YOLOv8. Para detecção ao vivo, importamos um modelo YOLOv8 pré-treinado e utilizamos a biblioteca de visão computacional, OpenCV, para abrir a câmera e detectar objetos. Além disso, criamos um aplicativo Streamlit para uma interface de usuário atraente.

A seguir, nos aprofundamos na segmentação de imagens com YOLOv8. Importamos um modelo pré-treinado e realizamos aprendizagem por transferência em um conjunto de dados personalizado. Antes disso, exploramos o Roboflow para anotação de conjuntos de dados, fornecendo uma alternativa fácil de usar para ferramentas como EtiquetaImg.

Finalmente, prevemos uma imagem contendo um pato. Embora o objeto na imagem pareça ser um pássaro, especificamos o nome da classe como “pato”Para fins de demonstração.

Principais lições

  • Aprendendo sobre modelos de detecção de objetos como Faster R-CNN, SSD e o mais recente YOLOv8.
  • Compreender a ferramenta de anotação Roboflow e seu papel na criação de conjuntos de dados para modelos de segmentação YOLOv8.
  • Explorando a detecção de objetos vivos usando OpenCV (cv2) e Supervisão, aprimorando habilidades práticas.
  • Treinar e implantar um modelo de segmentação usando YOLOv8, ganhando experiência prática.

Perguntas Frequentes

Q1. Qual é a diferença entre detecção de objetos e segmentação de imagens com YOLOv8?

A. A detecção de objetos envolve a identificação e localização de vários objetos em uma imagem, normalmente desenhando caixas delimitadoras ao redor deles. A segmentação de imagens, por outro lado, divide uma imagem em segmentos ou regiões com base na similaridade de pixels, proporcionando uma compreensão mais detalhada dos limites do objeto.

Q2. Como o YOLOv8 se compara às versões anteriores do YOLO (por exemplo, YOLOv3)?

R. O YOLOv8 melhora as versões anteriores, incorporando avanços na arquitetura de rede, técnicas de treinamento e otimização. Pode oferecer melhor precisão, velocidade e eficiência em comparação com YOLOv3.

Q3. Posso usar o YOLOv8 para detecção de objetos em tempo real em dispositivos incorporados?

R. O YOLOv8 pode ser usado para detecção de objetos em tempo real em dispositivos incorporados, dependendo dos recursos de hardware e da otimização do modelo. No entanto, pode exigir otimizações, como remoção de modelo ou quantização, para obter desempenho em tempo real em dispositivos com recursos limitados.

Q4. Quais são as vantagens de usar o Roboflow para anotação de conjuntos de dados em comparação com outras ferramentas?

R. O Roboflow oferece ferramentas de anotação intuitivas, recursos de gerenciamento de conjunto de dados e suporte para vários formatos de anotação. Ele agiliza o processo de anotação, permite a colaboração e fornece controle de versão, facilitando a criação e o gerenciamento de conjuntos de dados para projetos de visão computacional.

local_img

Inteligência mais recente

local_img