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