Reprodução simples de DBNet

       DBNet é Detecção de Texto de Cena em Tempo Real com Binarização Diferenciável, que é usado para detecção de texto OCR. Existem muitos artigos na Internet que interpretam este artigo. Para estar mais familiarizado com o uso do pytorch e ter um entendimento mais profundo do DBNet, usei meu tempo livre e consultei o código do grandalhão para reproduzir uma versão simples da DBNet.

        Uma breve revisão da rede DBNet.

        Estrutura da rede:

Figura 1 Diagrama da estrutura da rede

        O backbone usa resnet, seguido por FPN e, em seguida, concatena os mapas de recursos de tamanhos diferentes e, finalmente, fornece os resultados por dois cabeçotes de saída diferentes.

        Inovação:

        Adicionando a binarização adaptativa, o limite de binarização é aprendido pela rede.

        Geração de etiquetas:

        No artigo, a geração do rótulo é explicada de forma mais concisa. O rótulo é dividido em um rótulo binário e um rótulo de limite. Aqui vou pegar os dados de simulação que usei como exemplo.

Figura 2 Imagem original dos dados de simulação

        A geração de rótulos binários é relativamente simples.

        Reduza o contorno da caixa de texto de acordo com o deslocamento da fórmula D=A(1-r2)/L, onde L é o perímetro da caixa de rótulo, A é a área da caixa de rótulo e r é o fator de zoom predefinido.No papel é 0,4.

Figura 3 Rótulo de binarização de dados de simulação (para exibição, preenchido com azul)

        Geração de rótulo de limite

        1). Expanda o contorno da caixa de texto de acordo com o deslocamento D acima

        2) Obtenha o retângulo circunscrito do contorno ampliado (conveniente para usar a transmissão numpy para cálculo rápido)

        3). Calcule a distância de cada ponto no retângulo delimitador para cada segmento de linha do contorno original da caixa de texto e pegue a distância mínima

        4) Divida a distância mínima buscada pelo offset D para normalização

        5). Resultado 1 normalizado, o valor menor que 0 torna-se 0 e o valor maior que 1 torna-se 1

        6). Por ser um rótulo de limite, ele precisa ser dimensionado. No artigo, 1 é dimensionado para 0,7 e 0 é dimensionado para 0,3

Figura 3 Rótulo de limite de dados de simulação (para exibição, o limite desta figura não é dimensionado)

Figura 4 Rótulo de limite de dados de simulação e superposição de rótulo binarizado

        Função de perda:

        L = Ls + α×Lb + β×Lt, onde Ls é a perda do mapa de probabilidade, Lb é a perda do mapa binário e Lt é a perda do mapa de limiar. Neste trabalho, os valores de α e β são 1,0 e 10, respectivamente. Ls e Lb são resolvidos usando entropia cruzada binária (BCE), e mineração negativa forte é usada, e Lt usa perda L1.

        Minha interpretação:

        Resnet50, FPN e DB_Head completamente construídos do zero, o código construído não é conciso, mas a lógica é clara, fácil de entender e modificar. A função de perda no código do grandalhão foi modificada para BalanceCrossEntropyLoss, DiceLoss e MaskL1Loss, enquanto a minha usava apenas BCE e L1loss que vêm com pytorch. Leitura de dados, geração de rótulos, estrutura de rede e treinamento e especulação de modelo são todos colocados no arquivo DBnet_pytorch.py ​​​​.

https://github.com/yts2020/DBnet_pytorch

Após o treinamento no conjunto de dados da simulação, os resultados inferidos do modelo são os seguintes:

Figura 5 Resultados da previsão do modelo

 

 

 

 

 

 

 

 

 

 

Acho que você gosta

Origin blog.csdn.net/ytsaiztt/article/details/118090611
Recomendado
Clasificación