Detecção de objetos usando Fast R-CNN
Sumário
- Resumo
- Instalação
- Executar o exemplo de toy
- Executar Pascal VOC
- Treinar CNTK Fast R-CNN em seus próprios dados
- Detalhes técnicos
- Detalhes do algoritmo
Resumo
Este tutorial descreve como usar o CNTK Fast R-CNN com o BrainScript e cntk.exe. O Fast R-CNN usando a API do Python do CNTK é descrito aqui.
Os exemplos acima são imagens de exemplo e anotações de objeto para o conjunto de dados de supermercado (primeira imagem) e o conjunto de dados PASCAL VOC (segunda imagem) usado neste tutorial.
Fast R-CNN é um algoritmo de detecção de objetos proposto por Ross Girshick em 2015. O documento é aceito no ICCV 2015 e arquivado em https://arxiv.org/abs/1504.08083. O Fast R-CNN baseia-se em trabalhos anteriores para classificar com eficiência propostas de objeto usando redes convolucionais profundas. Em comparação com o trabalho anterior, o Fast R-CNN emprega um esquema de pool de interesses que permite reutilizar os cálculos das camadas convolucionais.
Material adicional: um tutorial detalhado para detecção de objetos usando o CNTK Fast R-CNN com o BrainScript (incluindo o treinamento SVM opcional e a publicação do modelo treinado como uma API Rest) pode ser encontrado aqui.
Instalação
Para executar o código neste exemplo, você precisa de um ambiente do CNTK Python (consulte aqui para obter ajuda de instalação). Além disso, você precisa instalar alguns pacotes adicionais. Vá para a pasta FastRCNN e execute:
pip install -r requirements.txt
Problema conhecido: para instalar o scikit-learn, talvez você precise executar conda install scikit-learn
se usar o Anaconda Python.
Você precisará ainda de Scikit-Image e OpenCV para executar esses exemplos.
Baixe os pacotes de roda correspondentes e instale-os manualmente. No Linux, você pode conda install scikit-image opencv
.
Para usuários do Windows, visite http://www.lfd.uci.edu/~gohlke/pythonlibs/e baixe:
- Python 3.5
- scikit_image-0.12.3-cp35-cp35m-win_amd64.whl
- opencv_python-3.2.0-cp35-cp35m-win_amd64.whl
Depois de baixar os respectivos binários de roda, instale-os com:
pip install your_download_folder/scikit_image-0.12.3-cp35-cp35m-win_amd64.whl
[! OBSERVAÇÃO]: se você vir a mensagem Nenhum módulo nomeado anteriormente ao executar os scripts, execute pip install future
.
Este código de tutorial pressupõe que você esteja usando a versão de 64bits do Python 3.5 ou 3.6, uma vez que os arquivos DLL Fast R-CNN necessários em utils são predefinidos para essas versões. Se sua tarefa exigir o uso de uma versão diferente do Python, recompile esses arquivos DLL por conta própria no ambiente correto (veja abaixo).
O tutorial pressupõe ainda que a pasta em que cntk.exe reside está na variável de ambiente PATH. (Para adicionar a pasta ao SEU PATH, você pode executar o seguinte comando em uma linha de comando (supondo que a pasta em que cntk.exe está em seu computador seja C:\src\CNTK\x64\Release): set PATH=C:\src\CNTK\x64\Release;%PATH%
.)
Binários pré-compilados para regressão de caixa delimitadora e supressão não máxima
A pasta Examples\Image\Detection\FastRCNN\BrainScript\fastRCNN\utils
contém binários pré-compilados necessários para executar o Fast R-CNN. As versões que estão atualmente contidas no repositório são Python 3.5 e 3.6, todas de 64 bits. Se você precisar de uma versão diferente, poderá compilá-la seguindo estas etapas:
git clone --recursive https://github.com/rbgirshick/fast-rcnn.git
cd $FRCN_ROOT/lib
make
- Em vez disso
make
, você pode executarpython setup.py build_ext --inplace
na mesma pasta. No Windows, talvez seja necessário comentar os args de compilação extra em lib/setup.py:
ext_modules = [ Extension( "utils.cython_bbox", ["utils/bbox.pyx"], #extra_compile_args=["-Wno-cpp", "-Wno-unused-function"], ), Extension( "utils.cython_nms", ["utils/nms.pyx"], #extra_compile_args=["-Wno-cpp", "-Wno-unused-function"], ) ]
- Em vez disso
copie os binários gerados
cython_bbox
cython_nms
de$FRCN_ROOT/lib/utils
para$CNTK_ROOT/Examples/Image/Detection/fastRCNN/utils
.
Exemplo de dados e modelo de linha de base
Usamos um modelo alexnet pré-treinado como base para o treinamento Fast-R-CNN. O AlexNet pré-treinado está disponível em https://www.cntk.ai/Models/AlexNet/AlexNet.model. Armazene o modelo em $CNTK_ROOT/PretrainedModels
. Para baixar os dados, execute
python install_grocery.py
da Examples/Image/DataSets/Grocery
pasta.
Executar o exemplo de toy
No exemplo de toy, treinamos um modelo CNTK Fast R-CNN para detectar itens de supermercado em uma geladeira.
Todos os scripts necessários estão em $CNTK_ROOT/Examples/Image/Detection/FastRCNN/BrainScript
.
Guia rápido
Para executar o exemplo de toy, verifique se ele PARAMETERS.py
dataset
está definido como "Grocery"
.
- Execute
A1_GenerateInputROIs.py
para gerar os ROIs de entrada para treinamento e teste. - Execute
A2_RunWithBSModel.py
para treinar e testar usando cntk.exe e BrainScript. - Execute
A3_ParseAndEvaluateOutput.py
para calcular o mAP (precisão média média) do modelo treinado.
A saída do script A3 deve conter o seguinte:
Evaluating detections
AP for avocado = 1.0000
AP for orange = 1.0000
AP for butter = 1.0000
AP for champagne = 1.0000
AP for eggBox = 0.7500
AP for gerkin = 1.0000
AP for joghurt = 1.0000
AP for ketchup = 0.6667
AP for orangeJuice = 1.0000
AP for onion = 1.0000
AP for pepper = 1.0000
AP for tomato = 0.7600
AP for water = 0.5000
AP for milk = 1.0000
AP for tabasco = 1.0000
AP for mustard = 1.0000
Mean AP = 0.9173
DONE.
Para visualizar as caixas delimitadoras e os rótulos previstos, você pode executar B3_VisualizeOutputROIs.py
(clique nas imagens para ampliar):
Detalhes da etapa
A1: O script A1_GenerateInputROIs.py
primeiro gera candidatos ROI para cada imagem usando a pesquisa seletiva.
Em seguida, armazena-os em um formato de texto CNTK como entrada para cntk.exe
.
Além disso, os arquivos de entrada CNTK necessários para as imagens e os rótulos de verdade básica são gerados.
O script gera as seguintes pastas e arquivos na FastRCNN
pasta:
proc
– pasta raiz para conteúdo gerado.grocery_2000
– contém todas as pastas e arquivos gerados para ogrocery
exemplo usando2000
ROIs. Se você executar novamente com um número diferente de ROIs, o nome da pasta será alterado correspondentemente.rois
- contém as coordenadas ROI brutas para cada imagem armazenada em arquivos de texto.cntkFiles
- contém os arquivos de entrada CNTK formatados para imagens (train.txt
etest.txt
), coordenadas ROI (xx.rois.txt
) e rótulos ROI (xx.roilabels.txt
) paratrain
etest
. (Detalhes do formato são fornecidos abaixo.)
Todos os parâmetros estão contidos PARAMETERS.py
, por exemplo, alteração cntk_nrRois = 2000
para definir o número de ROIs usados para treinamento e teste. Descrevemos parâmetros na seção Parâmetros abaixo.
A2: O script A2_RunWithBSModel.py
executa o cntk usando cntk.exe e um arquivo de configuração do BrainScript (detalhes da configuração).
O modelo treinado é armazenado na pasta cntkFiles/Output
da subpasta correspondente proc
.
O modelo treinado é testado separadamente no conjunto de treinamento e no conjunto de testes.
Durante o teste para cada imagem e cada ROI correspondente, um rótulo é previsto e armazenado nos arquivos test.z
e train.z
na cntkFiles
pasta.
A3: A etapa de avaliação analisa a saída do CNTK e calcula o mAP comparando os resultados previstos com as anotações de verdade básicas.
A supressão não máxima é usada para mesclar ROIs sobrepostos. Você pode definir o limite para supressão não máxima em PARAMETERS.py
(detalhes).
Scripts adicionais
Há três scripts opcionais que você pode executar para visualizar e analisar os dados:
B1_VisualizeInputROIs.py
visualiza os ROIs de entrada do candidato.B2_EvaluateInputROIs.py
calcula o recall dos ROIs de verdade básica em relação aos ROIs candidatos.B3_VisualizeOutputROIs.py
visualize as caixas delimitadoras e os rótulos previstos.
Executar Pascal VOC
Os dados pascal VOC (CLASSES de Objeto Visual PASCAL) são um conjunto bem conhecido de imagens padronizadas para reconhecimento de classe de objeto. Treinar ou testar o CNTK Fast R-CNN nos dados do Pascal VOC requer uma GPU com pelo menos 4 GB de RAM. Como alternativa, você pode executar usando a CPU, o que, no entanto, levará algum tempo.
Obtendo os dados do PASCAL VOC
Você precisa dos dados 2007 (trainval e test) e 2012 (trainval), bem como os ROIs pré-compilados usados no artigo original.
Você precisa seguir a estrutura de pastas descrita abaixo.
Os scripts pressupõem que os dados pascal residem em $CNTK_ROOT/Examples/Image/DataSets/Pascal
.
Se você estiver usando uma pasta diferente, defina pascalDataDir
correspondentemente PARAMETERS.py
.
- Baixar e desempacotar os dados de trainval de 2012 para
DataSets/Pascal/VOCdevkit2012
- Baixar e desempacotar os dados de trainval de 2007 para
DataSets/Pascal/VOCdevkit2007
- Baixar e desempacotar os dados de teste de 2007 na mesma pasta
DataSets/Pascal/VOCdevkit2007
- Baixar e descompactar os ROIs pré-compilados para
DataSets/Pascal/selective_search_data
* http://dl.dropboxusercontent.com/s/orrt7o6bp6ae0tc/selective_search_data.tgz?dl=0
A VOCdevkit2007
pasta deve ter esta aparência (semelhante a 2012):
VOCdevkit2007/VOC2007
VOCdevkit2007/VOC2007/Annotations
VOCdevkit2007/VOC2007/ImageSets
VOCdevkit2007/VOC2007/JPEGImages
Executando o CNTK no Pascal VOC
Para executar nos dados do Pascal VOC, certifique-se de que in PARAMETERS.py
dataset
está definido como "pascal"
.
- Execute
A1_GenerateInputROIs.py
para gerar os arquivos de entrada formatados em CNTK para treinamento e teste dos dados ROI baixados. - Execute
A2_RunWithBSModel.py
para treinar um modelo Fast R-CNN e resultados de teste de computação. - Execute
A3_ParseAndEvaluateOutput.py
para calcular o mAP (precisão média média) do modelo treinado.- Observe que isso é um trabalho em andamento e os resultados são preliminares, pois estamos treinando novos modelos de linha de base.
- Certifique-se de ter a versão mais recente do mestre CNTK para os arquivos fastRCNN/pascal_voc.py e fastRCNN/voc_eval.py para evitar erros de codificação.
Treinar em seus próprios dados
Preparar um conjunto de dados personalizado
Opção nº 1: Ferramenta de Marcação de Objeto Visual (recomendado)
A VOTT (Visual Object Tagging Tool) é uma ferramenta de anotação entre plataformas para marcar ativos de vídeo e imagem.
O VOTT fornece os seguintes recursos:
- Marcação assistida por computador e acompanhamento de objetos em vídeos usando o algoritmo de rastreamento do Camshift.
- Exportar marcas e ativos para o formato CNTK Fast-RCNN para treinar um modelo de detecção de objetos.
- Executar e validar um modelo de detecção de objeto CNTK treinado em novos vídeos para gerar modelos mais fortes.
Como anotar com VOTT:
- Baixar a versão mais recente
- Siga o Readme para executar um trabalho de marcação
- Depois de marcar marcas de exportação para o diretório do conjunto de dados
Opção nº 2: usando scripts de anotação
Para treinar um modelo CNTK Fast R-CNN em seu próprio conjunto de dados, fornecemos dois scripts para anotar regiões retangulares em imagens e atribuir rótulos a essas regiões.
Os scripts armazenarão as anotações no formato correto, conforme exigido pela primeira etapa de execução do Fast R-CNN (A1_GenerateInputROIs.py
).
Primeiro, armazene suas imagens na estrutura de pastas a seguir
<your_image_folder>/negative
- imagens usadas para treinamento que não contêm objetos<your_image_folder>/positive
- imagens usadas para treinamento que contêm objetos<your_image_folder>/testImages
- imagens usadas para testes que contêm objetos
Para as imagens negativas, você não precisa criar anotações. Para as outras duas pastas, use os scripts fornecidos:
- Execute
C1_DrawBboxesOnImages.py
para desenhar caixas delimitadoras nas imagens.- No conjunto
imgDir = <your_image_folder>
de scripts (/positive
ou/testImages
) antes de executar. - Adicione anotações usando o cursor do mouse. Depois que todos os objetos em uma imagem são anotados, pressionar a tecla 'n' grava o arquivo .bboxes.txt e, em seguida, prossegue para a próxima imagem, 'u' desfaz (ou seja, remove) o último retângulo e 'q' encerra a ferramenta de anotação.
- No conjunto
- Execute
C2_AssignLabelsToBboxes.py
para atribuir rótulos às caixas delimitadoras.- No conjunto
imgDir = <your_image_folder>
de scripts (/positive
ou/testImages
) antes de executar... - ... e adapte as classes no script para refletir suas categorias de objeto, por exemplo
classes = ("dog", "cat", "octopus")
. - O script carrega esses retângulos anotados manualmente para cada imagem, exibe-os um por um e solicita que o usuário forneça a classe de objeto clicando no respectivo botão à esquerda da janela. Anotações de verdade terrestre marcadas como "indecisas" ou "excluídas" são totalmente excluídas do processamento adicional.
- No conjunto
Treinar no conjunto de dados personalizado
Antes de executar o CNTK Fast R-CNN usando scripts A1-A3, você precisa adicionar seu conjunto de dados a PARAMETERS.py
:
- Defina
dataset = "CustomDataset"
- Adicione os parâmetros para o conjunto de dados na classe
CustomDataset
Python. Você pode começar copiando os parâmetros deGroceryParameters
- Adapte as classes para refletir suas categorias de objeto. Seguindo o exemplo acima, isso seria semelhante
self.classes = ('__background__', 'dog', 'cat', 'octopus')
. - Defina
self.imgDir = <your_image_folder>
. - Opcionalmente, você pode ajustar mais parâmetros, por exemplo, para geração de ROI e poda (consulte seção Parâmetros ).
- Adapte as classes para refletir suas categorias de objeto. Seguindo o exemplo acima, isso seria semelhante
Pronto para treinar com seus próprios dados! (Use as mesmas etapas do exemplo de toy.)
Detalhes técnicos
Parâmetros
Os principais parâmetros em PARAMETERS.py
são
dataset
- qual conjunto de dados usarcntk_nrRois
- quantos ROIs usar para treinamento e testenmsThreshold
- Limite de supressão não máximo (no intervalo [0,1]). Quanto menor, mais ROIs serão combinados. Ele é usado para avaliação e visualização.
Todos os parâmetros para a geração ROI, como largura e altura mínimas e máximas, etc., são descritos na PARAMETERS.py
classe Parameters
Python. Todos eles são definidos como um valor padrão que é razoável.
Você pode substituí-los na # project-specific parameters
seção correspondente ao conjunto de dados que você está usando.
Configuração do CNTK
O arquivo de configuração do CNTK BrainScript usado para treinar e testar o Fast R-CNN é fastrcnn.cntk.
A parte que está construindo a rede é a BrainScriptNetworkBuilder
seção no Train
comando:
BrainScriptNetworkBuilder = {
network = BS.Network.Load ("../../../../../../../PretrainedModels/AlexNet.model")
convLayers = BS.Network.CloneFunction(network.features, network.conv5_y, parameters = "constant")
fcLayers = BS.Network.CloneFunction(network.pool3, network.h2_d)
model (features, rois) = {
featNorm = features - 114
convOut = convLayers (featNorm)
roiOut = ROIPooling (convOut, rois, (6:6))
fcOut = fcLayers (roiOut)
W = ParameterTensor{($NumLabels$:4096), init="glorotUniform"}
b = ParameterTensor{$NumLabels$, init = 'zero'}
z = W * fcOut + b
}.z
imageShape = $ImageH$:$ImageW$:$ImageC$ # 1000:1000:3
labelShape = $NumLabels$:$NumTrainROIs$ # 21:64
ROIShape = 4:$NumTrainROIs$ # 4:64
features = Input {imageShape}
roiLabels = Input {labelShape}
rois = Input {ROIShape}
z = model (features, rois)
ce = CrossEntropyWithSoftmax(roiLabels, z, axis = 1)
errs = ClassificationError(roiLabels, z, axis = 1)
featureNodes = (features:rois)
labelNodes = (roiLabels)
criterionNodes = (ce)
evaluationNodes = (errs)
outputNodes = (z)
}
Na primeira linha, o AlexNet pré-treinado é carregado como o modelo base. As duas partes seguintes da rede são clonadas: convLayers
contém as camadas convolucionais com pesos constantes, ou seja, não são treinadas mais adiante.
fcLayers
contém as camadas totalmente conectadas com os pesos pré-treinados, que serão treinados ainda mais.
Os nomes network.features
de nó, network.conv5_y
etc. podem ser derivados da análise da saída de log da chamada cntk.exe (contida na saída de log do A2_RunWithBSModel.py
script).
A definição do modelo(model (features, rois) = ...
) primeiro normaliza os recursos subtraindo 114 para cada canal e pixel.
Em seguida, os recursos normalizados são enviados por push pelo convLayers
ROIPooling
seguido e, por fim, pelo fcLayers
.
A forma de saída (largura:altura) da camada de pooling ROI está definida como (6:6)
, pois esse é o tamanho da forma que o modelo de AlexNet pré-treinado fcLayers
espera. A saída do fcLayers
é alimentada em uma camada densa que prevê um valor por rótulo (NumLabels
) para cada ROI.
As seis linhas a seguir definem a entrada:
- uma imagem do tamanho 1000 x 1000 x 3 (
$ImageH$:$ImageW$:$ImageC$
), - rótulos de verdade básica para cada ROI (
$NumLabels$:$NumTrainROIs$
) - e quatro coordenadas por ROI (
4:$NumTrainROIs$
) correspondentes a (x, y, w, h), todas relativas à largura e altura completas da imagem.
z = model (features, rois)
alimenta as imagens de entrada e ROIs no modelo de rede definido e atribui a saída a z
.
O critério (CrossEntropyWithSoftmax
) e o erro (ClassificationError
) são especificados axis = 1
para considerar o erro de previsão por ROI.
A seção de leitor da configuração do CNTK está listada abaixo. Ele usa três desserializadores:
ImageDeserializer
para ler os dados da imagem. Ele capta os nomes de arquivo de imagem,train.txt
dimensiona a imagem para a largura e a altura desejadas, preservando a taxa de proporção (preenchimento de áreas vazias com114
) e transpõe o tensor para ter a forma de entrada correta.- Um
CNTKTextFormatDeserializer
para ler as coordenadas ROI detrain.rois.txt
. - Um segundo
CNTKTextFormatDeserializer
para ler os rótulos ROI detrain.roislabels.txt
.
Os formatos de arquivo de entrada são descritos na próxima seção.
reader = {
randomize = false
verbosity = 2
deserializers = ({
type = "ImageDeserializer" ; module = "ImageReader"
file = train.txt
input = {
features = { transforms = (
{ type = "Scale" ; width = $ImageW$ ; height = $ImageW$ ; channels = $ImageC$ ; scaleMode = "pad" ; padValue = 114 }:
{ type = "Transpose" }
)}
ignored = {labelDim = 1000}
}
}:{
type = "CNTKTextFormatDeserializer" ; module = "CNTKTextFormatReader"
file = train.rois.txt
input = { rois = { dim = $TrainROIDim$ ; format = "dense" } }
}:{
type = "CNTKTextFormatDeserializer" ; module = "CNTKTextFormatReader"
file = train.roilabels.txt
input = { roiLabels = { dim = $TrainROILabelDim$ ; format = "dense" } }
})
}
Formato de arquivo de entrada CNTK
Há três arquivos de entrada para CNTK Fast R-CNN correspondentes aos três desserializadores descritos acima:
train.txt
contém em cada linha primeiro um número de sequência, depois um nome de arquivo de imagem e, finalmente, um0
(que ainda é necessário por motivos herdados do ImageReader).
0 image_01.jpg 0
1 image_02.jpg 0
...
train.rois.txt
(Formato de texto CNTK) contém em cada linha primeiro um número de sequência e, em seguida, o|rois
identificador seguido por uma sequência de números. São grupos de quatro números correspondentes a (x, y, w, h) de um ROI, todos relativos à largura e altura completas da imagem. Há um total de 4 * números de números de rois por linha.
0 |rois 0.2185 0.0 0.165 0.29 ...
train.roilabels.txt
(Formato de texto CNTK) contém em cada linha primeiro um número de sequência e, em seguida, o|roiLabels
identificador seguido por uma sequência de números. São grupos de números de números de rótulos (zero ou um) por ROI codificando a classe de verdade básica em uma representação única. Há um total de números de rótulos * número de números de rois por linha.
0 |roiLabels 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
Detalhes do algoritmo
R-CNN rápido
R-CNNs for Object Detection foram apresentados pela primeira vez em 2014 por Ross Girshick et al., e foram mostrados para superar abordagens anteriores de última geração em um dos principais desafios de reconhecimento de objetos no campo: Pascal VOC. Desde então, dois artigos de acompanhamento foram publicados que contêm melhorias significativas de velocidade: Fast R-CNN e Faster R-CNN.
A ideia básica da R-CNN é pegar uma rede neural profunda que foi originalmente treinada para classificação de imagens usando milhões de imagens anotadas e modificá-la para fins de detecção de objetos. A ideia básica do primeiro artigo R-CNN é ilustrada na Figura abaixo (tirada do papel): (1) Dada uma imagem de entrada, (2) em uma primeira etapa, um grande número de propostas de região são geradas. (3) Essas propostas de região ou ROIs (Regiões de Interesses) são enviadas independentemente pela rede que gera um vetor de, por exemplo, 4096 valores de ponto flutuante para cada ROI. Por fim, (4) um classificador é aprendido, que usa a representação ROI flutuante 4096 como entrada e gera um rótulo e confiança para cada ROI.
Embora essa abordagem funcione bem em termos de precisão, é muito caro computar, pois a Rede Neural precisa ser avaliada para cada ROI. O R-CNN rápido resolve essa desvantagem avaliando apenas a maior parte da rede (para ser específico: as camadas de convolução) uma única vez por imagem. De acordo com os autores, isso leva a uma aceleração de 213 vezes durante o teste e uma aceleração de 9x durante o treinamento sem perda de precisão. Isso é obtido usando uma camada de pooling ROI que projeta o ROI no mapa de recursos convolucionais e executa o pooling máximo para gerar o tamanho de saída desejado que a camada a seguir está esperando. No exemplo de AlexNet usado neste tutorial, a camada de pool de ROI é colocada entre a última camada convolucional e a primeira camada totalmente conectada (consulte código BrainScript).
A implementação original do Caffe usada nos jornais R-CNN pode ser encontrada no GitHub: RCNN, Fast R-CNN e Faster R-CNN. Este tutorial usa parte do código desses repositórios, notadamente (mas não exclusivamente) para treinamento de SVM e avaliação de modelo.
Treinamento SVM vs NN
Patrick Buehler fornece instruções sobre como treinar uma SVM na saída CNTK Fast R-CNN (usando os recursos 4096 da última camada totalmente conectada), bem como uma discussão sobre prós e contras aqui.
Pesquisa Seletiva
A Pesquisa Seletiva é um método para localizar um grande conjunto de possíveis locais de objeto em uma imagem, independentemente da classe do objeto real. Ele funciona agrupando pixels de imagem em segmentos e executando clustering hierárquico para combinar segmentos do mesmo objeto em propostas de objeto.
Para complementar os ROIs detectados da Pesquisa Seletiva, adicionamos ROIs que cobrem uniformemente a imagem em diferentes escalas e proporções. A primeira imagem mostra uma saída de exemplo da Pesquisa Seletiva, em que cada local de objeto possível é visualizado por um retângulo verde. ROIs muito pequenos, muito grandes, etc. são descartados (segunda imagem) e, por fim, ROIs que cobrem uniformemente a imagem são adicionados (terceira imagem). Esses retângulos são usados como ROIs (Regiões de Interesse) no pipeline R-CNN.
O objetivo da geração ROI é encontrar um pequeno conjunto de ROIs que, no entanto, cobrem o maior número possível de objetos na imagem. Essa computação deve ser suficientemente rápida e, ao mesmo tempo, encontrar locais de objeto em diferentes escalas e proporções. A Pesquisa Seletiva mostrou-se com bom desempenho para essa tarefa, com boa precisão para acelerar as compensações.
NMS (supressão não máxima)
Os métodos de detecção de objetos geralmente geram várias detecções que cobrem totalmente ou parcialmente o mesmo objeto em uma imagem.
Esses ROIs precisam ser mesclados para poder contar objetos e obter seus locais exatos na imagem.
Isso é feito tradicionalmente usando uma técnica chamada NMS (Supressão Não Máxima). A versão do NMS que usamos (e que também foi usada nas publicações R-CNN) não mescla ROIs, mas tenta identificar quais ROIs melhor abrangem os locais reais de um objeto e descarta todos os outros ROIs. Isso é implementado selecionando iterativamente o ROI com maior confiança e removendo todos os outros ROIs que se sobrepõem significativamente a esse ROI e são classificados como sendo da mesma classe. O limite para a sobreposição pode ser definido em PARAMETERS.py
(detalhes).
Resultados de detecção antes (primeira imagem) e depois (segunda imagem) Supressão não máxima:
mAP (precisão média média)
Depois de treinado, a qualidade do modelo pode ser medida usando critérios diferentes, como precisão, recall, precisão, área abaixo da curva etc. Uma métrica comum que é usada para o desafio de reconhecimento de objeto PASCAL VOC é medir a AP (Precisão Média) para cada classe. A descrição a seguir da Precisão Média é obtida de Everingham et. al. A média de precisão (mAP) é calculada tomando a média sobre os APs de todas as classes.
Para uma determinada tarefa e classe, a curva de precisão/recall é calculada a partir da saída classificada de um método. O recall é definido como a proporção de todos os exemplos positivos classificados acima de uma determinada classificação. A precisão é a proporção de todos os exemplos acima dessa classificação que são da classe positiva. A AP resume a forma da curva de precisão/recall e é definida como a precisão média em um conjunto de onze níveis de recall igualmente espaçados [0,0.1, . . . ,1]:
A precisão em cada nível de recall r é interpolada usando a precisão máxima medida para um método para o qual o recall correspondente excede r:
onde p( ̃r) é a precisão medida em recall ̃r. A intenção de interpolar a curva de precisão/recall dessa forma é reduzir o impacto dos "wiggles" na curva de precisão/recall, causado por pequenas variações na classificação de exemplos. Deve-se observar que, para obter uma pontuação alta, um método deve ter precisão em todos os níveis de recall – isso penaliza os métodos que recuperam apenas um subconjunto de exemplos com alta precisão (por exemplo, exibições laterais de carros).