Exemplo # 1 - Estação Antiga: veja comparação em HD de 24 bits, foto original CC-BY-SA @siv-athens.
Como visto na TV! E se você pudesse aumentar a resolução de suas fotos usando tecnologia dos laboratórios CSI? Graças ao aprendizado profundo e #NeuralEnhance
, agora é possível treinar uma rede neural para ampliar suas imagens em 2x ou até 4x. Você obterá resultados ainda melhores aumentando o número de neurônios ou treinando com um conjunto de dados semelhante à sua imagem de baixa resolução.
O problema? A rede neural está alucinando detalhes com base em seu treinamento a partir de imagens de exemplo. Não é reconstruir sua foto exatamente como seria se fosse HD. Isso só é possível em Hollywood – mas usar o aprendizado profundo como “IA criativa” funciona e é igualmente legal! Veja como você pode começar...
O script principal é chamado de enhance.py
, que você pode executar com Python 3.4+ assim que estiver configurado conforme abaixo. O argumento --device
que permite especificar qual GPU ou CPU usar. Para as amostras acima, aqui estão os resultados de desempenho:
O padrão é usar --device=cpu
, se você já tiver uma placa NVIDIA configurada com CUDA, tente --device=gpu0
. Na CPU, você também pode definir a variável de ambiente como OMP_NUM_THREADS=4
, o que é mais útil ao executar o script várias vezes em paralelo.
Uma lista de exemplos de linhas de comando que você pode usar com os modelos pré-treinados fornecidos nas versões do GitHub:
# Run the super-resolution script to repair JPEG artefacts, zoom factor 1:1.
python3 enhance.py --type=photo --model=repair --zoom=1 broken.jpg
# Process multiple good quality images with a single run, zoom factor 2:1.
python3 enhance.py --type=photo --zoom=2 file1.jpg file2.jpg
# Display output images that were given `_ne?x.png` suffix.
open * _ne ? x.png
Aqui está uma lista de modelos, tipos de imagem e níveis de zoom atualmente suportados em uma tabela.
CARACTERÍSTICAS | --model=default | --model=repair | --model=denoise | --model=deblur |
---|---|---|---|---|
--type=photo | 2x | 1x | … | … |
Modelos pré-treinados são fornecidos nas versões do GitHub. Treinar o seu próprio é um processo delicado que pode exigir que você escolha parâmetros com base no seu conjunto de dados de imagem.
# Remove the model file as don't want to reload the data to fine-tune it.
rm -f ne ? x * .pkl.bz2
# Pre-train the model using perceptual loss from paper [1] below.
python3.4 enhance.py --train " data/*.jpg " --model custom --scales=2 --epochs=50
--perceptual-layer=conv2_2 --smoothness-weight=1e7 --adversary-weight=0.0
--generator-blocks=4 --generator-filters=64
# Train the model using an adversarial setup based on [4] below.
python3.4 enhance.py --train " data/*.jpg " --model custom --scales=2 --epochs=250
--perceptual-layer=conv5_2 --smoothness-weight=2e4 --adversary-weight=1e3
--generator-start=5 --discriminator-start=0 --adversarial-start=5
--discriminator-size=64
# The newly trained model is output into this file...
ls ne ? x-custom- * .pkl.bz2
Exemplo #2 — Lobby do banco: veja comparação em HD de 24 bits, foto original CC-BY-SA @benarent.
A maneira mais fácil de começar a funcionar é instalar o Docker. Em seguida, você poderá baixar e executar a imagem pré-construída usando a ferramenta de linha de comando docker
. Saiba mais sobre a imagem alexjc/neural-enhance
em sua página Docker Hub.
Esta é a maneira mais simples de chamar o script usando docker
, supondo que você esteja familiarizado com o uso do argumento -v
para montar pastas, você pode usar isso diretamente para especificar os arquivos a serem aprimorados:
# Download the Docker image and show the help text to make sure it works.
docker run --rm -v ` pwd ` :/ne/input -it alexjc/neural-enhance --help
Imagem Única — Na prática, sugerimos que você configure um alias chamado enhance
para expor automaticamente a pasta que contém a imagem especificada, para que o script possa lê-la e armazenar os resultados onde você possa acessá-los. É assim que você pode fazer isso no console do terminal no OSX ou Linux:
# Setup the alias. Put this in your .bashrc or .zshrc file so it's available at startup.
alias enhance= ' function ne() { docker run --rm -v "$(pwd)/`dirname ${@:$#}`":/ne/input -it alexjc/neural-enhance ${@:1:$#-1} "input/`basename ${@:$#}`"; }; ne '
# Now run any of the examples above using this alias, without the `.py` extension.
enhance --zoom=1 --model=repair images/broken.jpg
Várias imagens — Para aprimorar várias imagens seguidas (mais rápido) a partir de uma pasta ou especificação curinga, certifique-se de citar o argumento do comando alias:
# Process multiple images, make sure to quote the argument!
enhance --zoom=2 " images/*.jpg "
Se quiser rodar em sua GPU NVIDIA, você pode alterar o alias para usar a imagem alexjc/neural-enhance:gpu
que vem com CUDA e CUDNN pré-instalados. Em seguida, execute-o no nvidia-docker e ele deverá usar seu hardware físico!
Este projeto requer Python 3.4+ e você também precisará de numpy
e scipy
(bibliotecas de computação numérica), bem como python3-dev
instalado em todo o sistema. Se você quiser instruções mais detalhadas, siga estas:
Depois de buscar o repositório, você pode executar os seguintes comandos em seu terminal para configurar um ambiente local:
# Create a local environment for Python 3.x to install dependencies here.
python3 -m venv pyvenv --system-site-packages
# If you're using bash, make this the active version of Python.
source pyvenv/bin/activate
# Setup the required dependencies simply using the PIP module.
python3 -m pip install --ignore-installed -r requirements.txt
Depois disso, você deverá ter pillow
, theano
e lasagne
instalados em seu ambiente virtual. Você também precisará baixar esta rede neural pré-treinada (VGG19, 80Mb) e colocá-la na mesma pasta do script a ser executado. Para desinstalar tudo, basta excluir a pasta #/pyvenv/
.
Exemplo #3 – Super-resolução especializada para rostos, treinada apenas em exemplos HD de rostos de celebridades. A qualidade é significativamente maior ao restringir o domínio de “fotos” em geral.
Este código usa uma combinação de técnicas dos seguintes artigos, bem como algumas pequenas melhorias ainda a serem documentadas (assista a este repositório para atualizações):
Agradecimentos especiais por sua ajuda e apoio de várias maneiras:
Existe um compilador de extensão Python chamado Cython e ele está ausente ou instalado incorretamente. Tente obtê-lo diretamente do gerenciador de pacotes do sistema, em vez do PIP.
CORREÇÃO: sudo apt-get install cython3
Isso acontece quando você está executando sem GPU e as bibliotecas da CPU não foram encontradas (por exemplo, libblas
). As expressões da rede neural não podem ser avaliadas pelo Theano e estão gerando uma exceção.
CORREÇÃO: sudo apt-get install libblas-dev libopenblas-dev
Você precisa instalar o Lasagne e o Theano diretamente das versões especificadas em requirements.txt
, em vez das versões PIP. Essas alternativas são mais antigas e não possuem os recursos necessários.
CORREÇÃO: python3 -m pip install -r requirements.txt
Parece que seu terminal está configurado incorretamente e não é compatível com a forma como o Python trata as localidades. Pode ser necessário alterar isso em seu .bashrc
ou outro script de inicialização. Alternativamente, este comando irá corrigir o problema uma vez para esta instância do shell.
CORREÇÃO: export LC_ALL=en_US.UTF-8
Exemplo # 4 - Street View: comparação de visualização em HD de 24 bits, foto original CC-BY-SA @cyalex.