Rastreador de rastreamento de alvo

Rastreador OpenCV – Rastreamento de Objetos

O OpenCV Tracker está localizado no módulo de módulos OpenCV contrib, que precisa ser baixado, compilado e instalado separadamente. A **versão contrib deve corresponder à versão opencv**. O nome da biblioteca é tracking.hpp

一、Rastreamento de objetos

O rastreamento de objetos consiste em localizar um objeto em quadros de vídeo consecutivos. Por exemplo, todas as seguintes ideias distintas, mas relacionadas, são comumente estudadas no rastreamento de objetos:

  1. Fluxo óptico denso (Dense Optical flow DOF): Esses algoritmos ajudam a estimar vetores de movimento para cada pixel em um quadro de vídeo.
  2. Fluxo óptico esparso: como o algoritmo de rastreamento de recursos Kanade-Lucas-Tomashi (KLT), que rastreia as posições de vários pontos de recursos na imagem.
  3. Filtragem de Kalman: Um algoritmo de processamento de sinal muito popular baseado em informações de movimento anteriores, usado para prever a posição de objetos em movimento. Uma das primeiras aplicações desse algoritmo foi a orientação de mísseis! O computador de bordo que guiou o módulo lunar da Apollo 11 até a lua tinha um filtro de Kalman.
  4. Meanshift e Camshift: Estes são os algoritmos para localizar o máximo da função de densidade, eles também são usados ​​para rastreamento.
  5. Rastreadores de objeto único: Nesse tipo de rastreador, o primeiro quadro é marcado com um retângulo para indicar a posição do objeto a ser rastreado. O objeto é então rastreado em quadros subsequentes usando um algoritmo de rastreamento. Na maioria das aplicações do mundo real, esses rastreadores são usados ​​em conjunto com detectores de objetos .
  6. Algoritmos de localização de rastreamento de vários objetos: quando temos um detector de objetos rápido que detecta vários objetos em cada quadro, execute um algoritmo de localização de rastreamento para identificar qual retângulo em um quadro está relacionado ao próximo Faz sentido que os retângulos em um quadro correspondam a uns aos outros.

二、Rastreamento VS Detecção

  1. O rastreamento é mais rápido que a detecção: o rastreamento pode obter informações adicionais, como a posição do quadro anterior e sua direção e velocidade de movimento. Um sistema eficiente deve ser uma combinação de rastreamento e detecção.
  2. O rastreamento pode ajudar quando a detecção falha. O rastreamento atua como uma desoclusão.
  3. Marcas de manutenção de rastreamento: com várias seleções, os rastreamentos fornecem uma maneira de realmente conectar os pontos.

三、Algoritmos de Rastreamento de Objetos

conceito básico

  • Modelo de movimento: A posição e a velocidade (velocidade + direção do movimento) do objeto no quadro anterior e a posição do objeto no novo quadro são previstas de acordo com o modelo de movimento.
  • Modelo de aparência: Codifica a aparência de um objeto. O modelo de aparência pode pesquisar dentro de uma pequena vizinhança do local previsto pelo modelo de movimento, prevendo com mais precisão a localização do objeto. Em rastreadores modernos, o modelo de aparência é um classificador treinado online .
  • Classificador: Classifica uma região retangular de uma imagem como objeto ou fundo. O patch da imagem é usado como entrada e uma pontuação entre 0 e 1 é retornada, indicando a probabilidade de que o patch da imagem contenha o objeto.
  • Treinamento online: Usamos o termo "online" para nos referirmos a algoritmos que são treinados dinamicamente em tempo de execução. Os classificadores offline podem exigir milhares de exemplos para treinar o classificador, mas os classificadores online geralmente são treinados com poucos exemplos em tempo de execução.

Algoritmo de rastreamento Opencv

  1. BOOSTING Tracker: Baseado na versão online do AdaBoost - o algoritmo usado internamente pelos detectores faciais HAAR baseados em cascata. O classificador é treinado em tempo de execução usando amostras positivas e negativas de objetos. A caixa delimitadora inicial fornecida pelo usuário (ou fornecida por outros algoritmos de detecção de objetos) é usada como a amostra positiva do objeto, e muitas manchas de imagem fora da caixa delimitadora são usadas como plano de fundo. Dado um novo quadro, execute o classificador em cada pixel na vizinhança do local anterior e registre a pontuação do classificador. A nova posição do objeto é a posição com a pontuação mais alta. Agora temos mais um exemplo positivo para o classificador. À medida que mais quadros chegam, o classificador será atualizado com esses dados adicionais.
    Prós: Nenhum. Esse algoritmo tem 10 anos e funciona bem, mas não consigo encontrar um bom motivo para usá-lo, especialmente quando outros rastreadores avançados baseados em princípios semelhantes (MIL, KCF) estão disponíveis.
    Contras: desempenho de rastreamento mais ou menos. Ele não pode saber com segurança quando o rastreamento falha.
  2. Rastreador MIL: Este rastreador é semelhante em ideia ao rastreador BOOSTING descrito acima. A maior diferença é que ao invés de considerar apenas a localização atual do objeto como uma amostra positiva, ele procura em uma pequena vizinhança ao redor da localização atual para gerar várias amostras positivas potenciais. Você pode pensar que isso é uma má ideia, já que na maioria dos exemplos "positivos" os objetos não estão centralizados. É aqui que o Multiple Instance Learning (MIL) é útil. No MIL, você não especifica amostras positivas e negativas, você especifica "bolsas" positivas e negativas. O conjunto de imagens no saco positivo não são todas amostras positivas. Em vez disso, apenas uma imagem no saco positivo precisa ser uma amostra positiva!No nosso caso, um saco positivo contém manchas centradas na localização atual do objeto e uma pequena vizinhança de manchas ao redor dele. Mesmo que a posição atual do objeto rastreado seja imprecisa, quando as amostras próximas à posição atual são colocadas na bolsa positiva, essa bolsa provavelmente conterá pelo menos uma imagem na qual o objeto está centralizado. A página do projeto MIL fornece mais informações para aqueles que desejam obter informações sobre o funcionamento interno do rastreador MIL.
    Prós: O desempenho é muito bom. Ele não desvia tanto quanto o BOOSTING, e em oclusão parcial faz um trabalho razoável. Se você estiver usando OpenCV 3.0, este é provavelmente o melhor rastreador que você pode usar. Mas se você usar uma versão superior, considere o KCF.
    Contras: O rastreamento de falhas não é confiável. Não há como se recuperar da oclusão total.
  3. Rastreador KCF: KCF é a abreviatura de Filtros de Correlação Kernefied. Este rastreador se baseia nas ideias apresentadas nos dois rastreadores anteriores. Este rastreador explora o fato de que várias amostras positivas usadas no rastreador MIL têm grandes regiões sobrepostas. Esses dados sobrepostos levam a algumas boas propriedades matemáticas que são exploradas por esse rastreador para tornar o rastreamento mais rápido e preciso ao mesmo tempo.
    Prós: melhor precisão e velocidade do que MIL, e rastreia falhas com mais eficiência do que boost e MIL, se você estiver usando o OpenCV 3.1 e superior, recomendo isso para a maioria dos aplicativos.
    Contras: Não é possível recuperar da oclusão total. Não implementado no OpenCV 3.0.
  4. TLD Tracker: TLD significa Rastrear, Aprender e Detectar. Como o nome sugere, esse rastreamento decompõe a tarefa de rastreamento de longo prazo em três partes - rastreamento (de curto prazo), aprendizado e detecção. Do artigo dos autores, "O rastreador rastreia objetos de quadro a quadro. O detector localiza todas as aparências observadas até agora e corrige o rastreador, se necessário. Aprenda a estimar o erro do detector e atualize-o para evitar esses erros posteriormente." A saída deste rastreador tende a pular um pouco. Por exemplo, se você estiver rastreando um pedestre e houver outros pedestres na cena, o rastreador pode, às vezes, rastrear temporariamente um pedestre diferente daquele que você pretendia rastrear. Do lado positivo, a trilha parece rastrear um objeto em um maior alcance, movimento e oclusão. Se você tiver uma sequência de vídeo em que os objetos estão ocultos atrás de outro objeto, esse rastreador pode ser uma boa escolha.
    Prós: Funciona melhor com vários quadros de oclusão. Além disso, é melhor acompanhar as mudanças de escala.
    Contras: Muitos falsos positivos o tornam quase inutilizável.
  5. Rastreador MEDIAFLOW: Internamente, esse rastreador rastreia objetos nas direções para frente e para trás no tempo e mede a diferença entre essas duas trajetórias. Minimizar esse erro de avanço para trás permite que eles detectem falhas de rastreamento de forma confiável e selecionem trajetórias confiáveis ​​em sequências de vídeo. Em meus testes, descobri que esse rastreador funciona melhor quando o movimento é previsível e pequeno. Ao contrário de outros rastreadores, o rastreador continua funcionando mesmo enquanto você está rastreando.
    Prós: Excelente relatório para rastreamento de falhas. Isso funciona bem quando o movimento é previsível e não há oclusões.
    Contras: Falha em grandes movimentos.
  6. Rastreador GOTURN: De todos os algoritmos de rastreamento da classe Tracker, este é o único baseado em Redes Neurais Convolucionais (CNN). Pela documentação do OpenCV, sabemos que é "robusto para mudanças de ponto de vista, mudanças de iluminação e deformações". Mas não lida muito bem com a oclusão. GOTURN é um rastreador baseado em CNN que usa um modelo caffe para rastreamento. Os arquivos de texto de modelo e protótipo do Caffe devem estar presentes no mesmo diretório que o código. Esses arquivos também podem ser baixados do repositório opencv_extra, vinculados e extraídos antes do uso. O algoritmo de rastreamento de objetos GOTURN foi portado para o OpenCV.
  7. Rastreador MOSSE: A soma mínima de saída de erro quadrado (MOSSE) usa correlação adaptativa para rastreamento de alvo e, ao gerar um filtro de correlação estável, um quadro é usado para inicialização. O rastreador MOSSE é resistente a mudanças de iluminação, escala, pose e deformações não rígidas. Ele também detecta a oclusão com base na relação entre o pico e o lóbulo lateral, o que permite que o rastreador faça uma pausa e continue de onde parou quando um objeto reaparece. O rastreador MOSSE também é executado em fps mais alto (450 fps ou até mais). Além disso, também é muito fácil de implementar, tão preciso quanto outros rastreadores sofisticados e muito mais rápido. No entanto, em termos de desempenho, fica atrás dos rastreadores baseados em aprendizado profundo.
  8. Rastreador CSRT: No filtro de correlação discriminativa com canal e confiabilidade espacial (DCF-CSR), usamos o mapa de confiabilidade espacial para ajustar o suporte de filtro para partes de regiões selecionadas de quadros para rastreamento. Isso garante ampliação e posicionamento de áreas selecionadas e melhora o rastreamento de áreas ou objetos não retangulares. Ele usa apenas dois recursos padrão (porco e nome da cor). Ele também possui fps relativamente baixo (25 fps), mas possui alta precisão para rastreamento de objetos.

4. Exemplo de código

import cv2
import sys
 
# 获得opencv的版本
(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
 
if __name__ == '__main__':
 
    # 建立跟踪器,选择跟踪器的类型
 
    tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN', 'MOSSE', 'CSRT']
    tracker_type = tracker_types[2]
 
    if int(minor_ver) < 3:
        tracker = cv2.Tracker_create(tracker_type)
    else:
        if tracker_type == 'BOOSTING':
            tracker = cv2.TrackerBoosting_create()
        if tracker_type == 'MIL':
            tracker = cv2.TrackerMIL_create()
        if tracker_type == 'KCF':
            tracker = cv2.TrackerKCF_create()
        if tracker_type == 'TLD':
            tracker = cv2.TrackerTLD_create()
        if tracker_type == 'MEDIANFLOW':
            tracker = cv2.TrackerMedianFlow_create()
        if tracker_type == 'GOTURN':
            tracker = cv2.TrackerGOTURN_create()
        if tracker_type == 'MOSSE':
            tracker = cv2.TrackerMOSSE_create()
        if tracker_type == "CSRT":
            tracker = cv2.TrackerCSRT_create()
 
    # 读取视频
    video = cv2.VideoCapture("TownCentreXVID.avi")
 
    # 打开错误时退出
    if not video.isOpened():
        print("Could not open video")
        sys.exit()
 
    # 读取视频的第一帧
    ok, frame = video.read()
    if not ok:
        print ('Cannot read video file')
        sys.exit()
 
    # 定义初始边界框
    bbox = (287, 23, 86, 320)
 
    # Uncomment the line below to select a different bounding box
    # 选择不同的边界框
    bbox = cv2.selectROI(frame, False)
 
    # Initialize tracker with first frame and bounding box
    # 使用视频的第一帧和边界框初始化跟踪器
    ok = tracker.init(frame, bbox)
 
    while True:
        # Read a new frame
        ok, frame = video.read()
        if not ok:
            break
 
        # Start timer 记录开始时间
        timer = cv2.getTickCount()
 
        # Update tracker 更新检测器
        ok, bbox = tracker.update(frame)
 
        # Calculate Frames per second (FPS) 计算FPS
        fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);
 
        # Draw bounding box 绘制边界框
        if ok:
            # Tracking success 跟踪成功
            p1 = (int(bbox[0]), int(bbox[1]))
            p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
            cv2.rectangle(frame, p1, p2, (255,0,0), 2, 1)
        else :  # 跟踪失败
            # Tracking failure
            cv2.putText(frame, "Tracking failure detected", (100,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2)
 
        # Display tracker type on frame
        # 显示跟踪器的类别
        cv2.putText(frame, tracker_type + " Tracker", (100,20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50),2);
 
        # Display FPS on frame 显示FPS
        cv2.putText(frame, "FPS : " + str(int(fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2);
 
        # Display result 显示跟踪结果
        cv2.imshow("Tracking", frame)
 
        # Exit if ESC pressed 按取消键退出
        k = cv2.waitKey(1) & 0xff
        if k == 27 : break

Supongo que te gusta

Origin blog.csdn.net/weixin_43949950/article/details/126339770
Recomendado
Clasificación