como implementar a detecção de objectos personalizada com a correspondência de modelos. Não são necessários dados anotados!
Today, state-of-the-art object detection algorithms (algorithms aiming to detect objects in pictures) are using neural networks such as Yolov4.
Template matching is a technique in digital image processing for finding small parts of an image that matches a template image. É uma solução muito mais simples do que uma rede neural para conduzir a detecção de objetos. Além disso, vem com os seguintes benefícios:
- não há necessidade de anotar os dados (um demorado e tarefa obrigatória para treinar as redes neurais)
- caixas delimitadoras são mais precisos
- não há necessidade de GPU
Na minha experiência, a combinação de uma rede neural como Yolov4 e detecção de objetos com o modelo de correspondência aqui está uma boa maneira de melhorar consideravelmente a sua rede neural desempenho!
o que corresponde ao modelo?
quando usar o modelo OpenCV correspondente, o seu modelo desliza pixel por pixel na sua imagem. Para cada posição, uma métrica de similaridade é calculada entre o modelo de imagem e a parte da imagem que se recupera de:
Se a métrica de similaridade é alto o suficiente para que um pixel, em seguida, este pixel é, provavelmente, o canto superior esquerdo de um objeto correspondente ao seu modelo!
consequentemente, você pode alcançar a detecção de objetos com template correspondente apenas se os objetos que você tenta detectar são semelhantes o suficiente-quase idênticos-dentro de uma classe. Você ainda pode incluir mais modelos para lidar com variações de objetos (tamanho, cor, orientação). Mas vai aumentar o tempo de previsão.À primeira vista, parece muito restritivo. Mas muitos casos de uso de detecção de objetos podem ser enfrentados com correspondência de modelos:
- identificação em documentos digitalizados
- espaço de estacionamento vazio de uma câmara estacionária
- componentes de uma linha de montagem…
a Practical Example
A good use case for object detection using template matching is to detect components on printed circuits, such as this one:
we could imagine an assembly line producing such circuits. Imaginemos que alguns circuitos fabricados são componentes em falta e, portanto, defeituosos. Poderíamos propor instalar uma câmera no final do trilho e filmar cada circuito, a fim de filtrar produtos defeituosos. Podemos conseguir isso com detecção de objetos com correspondência de modelos!Por uma questão de simplicidade, vamos concentrar-nos na detecção de alguns componentes.
Um primeiro componente que aparece duas vezes:
Essa que aparece quatro vezes:
E este terceiro, que aparece seis vezes:
Finalmente, escolhemos estas três imagens como modelos. Consequentemente, a complexidade deste caso de uso é reduzida: vamos facilmente detectar pelo menos os objetos escolhidos como modelos.
Básico de detecção de objetos com o modelo de correspondência
Definição de modelo
em Primeiro lugar, vamos definir modelos de:
- um caminho de imagem,
- a etiqueta
- uma cor (por resultado visualização —caixas delimitadoras e rótulos de cor),
- e uma correspondência de limiar.
em segundo lugar, consideramos que todos os pixels com uma métrica de semelhança acima deste limiar indicam uma detecção para este modelo.
aqui está o código que define os modelos:
detecção de objectos com modelo correspondente
depois, analisamos os modelos para efectuar a detecção de objectos com modelo correspondente para cada modelo. Como estamos usando um limiar, selecionamos uma métrica de similaridade normalizada (TM_CCOEFF_NORMED) ao aplicar correspondência de modelos. Assim, podemos escolher um limiar entre 0 e 1:
we consider that each pixel having a similarity score above the template threshold is the top-left corner of an object (with the template’s height, width, and label).
Visualizar objectos detectados
em Seguida, marcamos o previsto caixas delimitadoras do objeto de detecção com o modelo correspondente na imagem de entrada:
Finalmente, obtemos os seguintes resultados:
as indicated by the thickness of boxes (in green, yellow, and red), each object has been detected several times.
Remover Duplicados
por que obtivemos detecções duplicadas? Como explicado acima, a correspondência do modelo OpenCV devolve uma matriz 2-D com a dimensão da imagem de entrada (uma célula— e, portanto, uma pontuação de semelhança— para cada pixel de imagem de entrada).
portanto, se um objeto é detectado em um local, todos os pixels circundantes provavelmente terão a mesma pontuação de similaridade, e, portanto, considerados como outros cantos superiores-esquerdos objeto.
para resolver este problema, vamos ordenar todas as detecções diminuindo os valores correspondentes. Então, vamos escolher se validar ou não cada detecção. Validamos a detecção se ela não estiver sobrepondo muito com qualquer uma das deteções já validadas. Finalmente, determinamos que duas deteções estão sobrepondo-se se a interseção sobre a União de suas caixas envolventes está acima de um determinado limiar. Este processo é chamado de supressão não-máxima.
Aqui é uma explicação visual de que mais de Intersecção da União (IoU) é:
Aqui está como eu implementado (computação IoU método, juntamente com mais explicações podem ser encontradas aqui):
E em seguida, Acabei de adicionar estas duas linhas após a detecção de loop:
Como resultado, obtém-se:
Much cleaner! Vemos agora claramente que todos os componentes primeiro e terceiro são detectados sem falsos positivos (precisão e recolha de 1).
agora queremos reduzir o número de falsos positivos para o componente 2. A maneira mais fácil é aumentar o limiar de correspondência para o modelo usado para este rótulo.
escolher hiperparametros
é claro que é melhor calcular métricas de detecção de objectos em várias imagens para escolher hiper-parâmetros (limiar de correspondência de modelos e limiar de supressão Não-máximo). Por agora, podemos simplesmente aumentar o limite para o componente 2:
E obtemos:
agora temos apenas dois falsos positivos para o componente 2, em vez de dezenas (precisão de 2/3, lembre-1)! Além disso, os componentes 1 e 2 são ainda perfeitamente detectados (precisão e recolha de 1).
para melhorar os nossos resultados, poderíamos:
- incluir modelos para os componentes confundidos com o componente 2.
- tente várias métricas de similaridade
- anotar algumas imagens para computar métricas de detecção, e realizar uma pesquisa em grade sobre estes parâmetros.
resumo
conseguimos a detecção de objectos com template correspondente por:
- definição de pelo menos um modelo para cada objeto (o mais modelos, você tem um objeto mais sua recordação vai estar em alta e a sua precisão baixa)
- usando OpenCV modelo método correspondente na imagem para cada modelo de
- considerando-se que cada pixel tendo uma semelhança pontuação acima de um modelo de limiar é o canto superior esquerdo de um objeto (com este modelo, largura e altura do rótulo)
- aplicação Não-Máximo de Supressão de detecções obtidas
- escolher o modelo de limiares para melhorar a precisão da detecção!É isso!Está à procura de peritos em reconhecimento de imagens? Não hesite em contactar-nos!