Super Resolution simples com OpenCV
A técnica de Super Resolução (SR) é o processo de Deep Learning que cria imagens em alta resolução a partir de imagens de baixa resolução.
O problema de super resolução tem muita importância em vários campos de atuação onde a qualidade e tamanho de imagens é necessário, como por exemplo em astronomia, onde imagens muitas vezes são aumentadas para se entender melhor os detalhes de astros muito distantes.
As técnicas e modelos mais comuns de super resolution que vou cobrir neste artigo consistem de métodos de aprendizado supervisionado que recebem imagens de baixa resolução como entrada e imagens de alta resolução como objetivo no treinamento.
Upsampling tradicional
Tradicionalmente, quando usamos um editor de imagens simples e tentamos aumentar o tamanho de uma imagem não vetorial (.png, .jpg etc), estamos basicamente pedindo para que o programa preencha os novos espaços criados com valores que até então não existiam, e que use a imagem original para adivinhar os melhores valores.
Tais métodos mais simples são chamados de métodos de interpolação (ou escalonamento).
Interpolação Nearest-neighbor
Nearest-neighbor é o método de interpolação mais simples. Basicamente esse método calcula o pixel mais próximo e assume o valor desse pixel.
Interpolação Bilinear
Esse método de escalonamento é muito parecido com Nearest Neighbor, entretanto, ele usa interpolação baseado nos pixel em volta para produzir um resultado mais suave. Como o próprio nome diz, esse método aplica uma combinação de duas interpolações lineares para compor o resultado final.
Interpolação Bicúbica
É um dos métodos mais usados e bem similar ao Bilinear. Muitos dos exemplos usados a seguir vão usar resultados de interpolação bicúbica como comparação.
Deep Learning Super Resolution Frameworks
FSRCNN
FSRCNN é uma técnica de super resolução baseada em Post-upsampling, isso significa que não é feito nenhum pré-processamento na imagem, ou seja, o processo de feature extraction é feito com a imagem em tamanho original.
ESPCN
ESPCN utiliza uma técnica de convolução sub-pixel, resolvendo problemas associados com a deconvolução sendo mais barata computacionalmente e diminuindo o efeito checkerboard que ocorre na deconvolução.
EDSR
EDSR se baseia na arquitetura SRResNet, que consiste em múltiplos blocos residuais. A maior diferença em comparação a SRResNet é a ausência de camadas de Batch Normalization, resultando em uma redução de 40% no uso de memória.
LapSRN
Esse método de Super Resolution consiste de uma estrutura em pirâmide Laplaciana e é o único modelo que suporta upscaling por um fator de 8x.
Usando com OpenCV
Quando usando OpenCV para super resolution é importante ter certeza que a versão do pacote opencv-contrib-python é ao menos 4.5.4.58.
pip install opencv-contrib-python==4.5.4.58Embora a biblioteca OpenCV proporcione os métodos que precisamos para aplicar os modelos de super resolution, é necessário obter os modelos treinados. Eles podem ser obtidos no repositório de cada paper, ou você pode acessar no meu repositório dedicado a isso: https://github.com/vcasadei/OpenCV_SR
Instanciando modelos
modelSrc = "models/EDSR_x2.pb"
modelName = edsr
modelScale = 2sr = cv2.dnn_superres.DnnSuperResImpl_create()
sr.readModel(modelSrc)
sr.setModel(modelName, modelScale)
Você pode mudar o caminho para o modelo, além do nome e escala.
Usando o modelo
# lendo uma imagem em baixa resolução
image = cv2.imread("imgs/lr/img1.png")# aplicando o modelo
upscaled = sr.upsample(image)
Como podemos ver acima, é extremamente simples usar e aplicar o modelo. Então só precisamos usar algum pacote gráfico para exibir a imagem.
Comparação de performance
Abaixo eu trago uma tabela onde executei no Google Colab e capturei os tempos de execução de cada um dos modelos aplicando upscaling de escala x2.
Como podemos ver o modelo EDSR é ao menos 60 vezes mais lento do que os demais, entretanto, ele produz resultados muito bons, comparado aos demais. A pergunta que fica é se o ganho em qualidade compensa o custo computacional.
Comparação das Imagens
Colab Exemplo
Se você quiser testar rapidamente o que viu nesse artigo, acesse Google Colab que preparei: https://colab.research.google.com/drive/1WwkSPtwf3YyLoC7Eyo0-aFartNlkYgtI?usp=sharing
Referências
- EDSR — https://arxiv.org/abs/1707.02921
- ESPCN — https://arxiv.org/abs/1609.05158
- FSRCNN — https://arxiv.org/abs/1608.00367
- LapSRN — https://arxiv.org/abs/1710.01992