No momento, você está visualizando Da programação à arte: Explorando transferência de estilo com Python e IA

Da programação à arte: Explorando transferência de estilo com Python e IA

  • Autor do post:
  • Tempo de leitura:1 minutos de leitura
  • Categoria do post:Dados

Como referenciar este texto: Da programação à arte: Explorando transferência de estilo com Python e IA’. Rodrigo Terra. Publicado em: 02/06/2025. Link da postagem: https://www.makerzine.com.br/dados/da-programacao-a-arte-explorando-transferencia-de-estilo-com-python-e-ia/.

Conteúdos que você verá nesta postagem

Recentemente, desenvolvi um notebook interativo de transferência de estilo neural, unindo arte e inteligência artificial. O objetivo foi explorar como a tecnologia pode transformar qualquer foto em uma imagem com o estilo de uma pintura famosa — tudo com poucas linhas de código em Python, utilizando TensorFlow e TensorFlow Hub.

Este projeto foi uma oportunidade de aprender mais sobre machine learning aplicado à criatividade e, claro, exercitar o olhar de quem gosta de experimentar novas ideias no universo maker.

O que é Transferência de Estilo?

Transferência de estilo é uma técnica em que uma rede neural pega a estrutura de uma imagem (foto comum) e aplica o estilo visual de outra (uma obra de arte, por exemplo). O resultado é surpreendente: uma fusão entre conteúdo e arte, feita por IA!

Principais Desafios e Soluções

Configuração do ambiente

Comecei importando as principais bibliotecas e verificando a disponibilidade de GPU, pois o processamento de imagens pode ser pesado:

				
					import functools
import os
from matplotlib import gridspec
import matplotlib.pylab as plt
import numpy as np
import tensorflow as tf
import tensorflow_hub as hub

print("TF Version: ", tf.__version__)
print("TF Hub version: ", hub.__version__)
print("Eager mode enabled: ", tf.executing_eagerly())
print("GPU available: ", tf.config.list_physical_devices('GPU'))
				
			

Funções para carregar e processar imagens

Implementei funções para baixar, centralizar, recortar e ajustar as imagens, garantindo que o modelo de IA recebesse os dados no formato ideal.

				
					def load_image(image_url, image_size=(256, 256)):
    # Código para baixar e ajustar a imagem

				
			

Escolha das imagens

O legal do projeto é poder experimentar diferentes pares de imagens. Testei desde fotos pessoais até imagens famosas da internet e pinturas expressionistas.

				
					content_image_url = 'URL da foto escolhida'
style_image_url = 'URL da pintura'

				
			

Aplicação do modelo pré-treinado

Utilizei um modelo já treinado e disponível no TensorFlow Hub. Isso facilitou bastante o processo, já que não precisei me preocupar com o treinamento do zero.

				
					hub_handle = 'https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2'
hub_module = hub.load(hub_handle)
stylized_image = hub_module(content_image, style_image)[0]

				
			

Visualização dos resultados

Ao final, visualizei a imagem original, a referência de estilo e o resultado estilizado lado a lado:

				
					show_n([content_image, style_image, stylized_image],
       titles=['Original', 'Estilo', 'Estilizado'])

				
			

Código completo

				
					import functools
import os
from matplotlib import gridspec
import matplotlib.pylab as plt
import numpy as np
import tensorflow as tf
import tensorflow_hub as hub

print("TF Version: ", tf.__version__)
print("TF Hub version: ", hub.__version__)
print("Eager mode enabled: ", tf.executing_eagerly())
print("GPU available: ", tf.config.list_physical_devices('GPU'))


# Define funções para carregar e visualizar imagens

def crop_center(image):
    """Retorna uma imagem centralizada e recortada em formato quadrado."""
    shape = image.shape
    new_shape = min(shape[1], shape[2])
    offset_y = max(shape[1] - shape[2], 0) // 2
    offset_x = max(shape[2] - shape[1], 0) // 2
    image = tf.image.crop_to_bounding_box(
        image, offset_y, offset_x, new_shape, new_shape)
    return image

@functools.lru_cache(maxsize=None)
def load_image(image_url, image_size=(256, 256), preserve_aspect_ratio=True):
    """Carrega e processa uma imagem."""
    # Faz cache do arquivo de imagem localmente.
    image_path = tf.keras.utils.get_file(os.path.basename(image_url)[-128:], image_url)
    # Carrega e converte para array numpy float32, adiciona dimensão de batch e normaliza para o intervalo [0, 1].
    img = tf.io.decode_image(
        tf.io.read_file(image_path),
        channels=3, dtype=tf.float32)[tf.newaxis, ...]
    img = crop_center(img)
    img = tf.image.resize(img, image_size, preserve_aspect_ratio=True)
    return img

def show_n(images, titles=('',)):
    """Exibe uma lista de imagens lado a lado com seus respectivos títulos."""
    n = len(images)
    image_sizes = [image.shape[1] for image in images]
    w = (image_sizes[0] * 6) // 320
    plt.figure(figsize=(w * n, w))
    gs = gridspec.GridSpec(1, n, width_ratios=image_sizes)
    for i in range(n):
        plt.subplot(gs[i])
        plt.imshow(images[i][0], aspect='equal')
        plt.axis('off')
        plt.title(titles[i] if len(titles) > i else '')
    plt.show()


# Carregar imagens de exemplo

content_image_url = 'LINK_FOTO_ORIGINAL'  # @param {type:"string"}
style_image_url = 'LINK_FOTO_ESTILO'  # @param {type:"string"}
output_image_size = 384  # @param {type:"integer"}

# O tamanho da imagem de conteúdo pode ser arbitrário.
content_img_size = (output_image_size, output_image_size)
# O modelo de predição de estilo foi treinado com imagens de tamanho 256,
# e este é o tamanho recomendado para a imagem de estilo
# (embora outros tamanhos também funcionem, mas podem gerar resultados diferentes).
style_img_size = (256, 256)  # Recomendado manter em 256.

content_image = load_image(content_image_url, content_img_size)
style_image = load_image(style_image_url, style_img_size)
style_image = tf.nn.avg_pool(style_image, ksize=[3,3], strides=[1,1], padding='SAME')
show_n([content_image, style_image], ['Imagem de conteúdo', 'Imagem de estilo'])

# Carregar o módulo do TF Hub.

hub_handle = 'https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2'
hub_module = hub.load(hub_handle)
outputs = hub_module(content_image, style_image)
stylized_image = outputs[0]

# Estilizar a imagem de conteúdo usando a imagem de estilo escolhida.
# Esse processo é bem rápido, levando apenas alguns milissegundos em uma GPU.

outputs = hub_module(tf.constant(content_image), tf.constant(style_image))
stylized_image = outputs[0]

# Visualizar as imagens de entrada e a imagem estilizada gerada.

show_n([content_image, style_image, stylized_image], titles=['Imagem de conteúdo original', 'Imagem de estilo', 'Imagem estilizada'])

				
			

Aprendizados

  • Hands-on em IA: Foi uma ótima forma de aprender sobre processamento de imagens e redes neurais.

  • Uso de modelos prontos: O TensorFlow Hub facilita o acesso a modelos de ponta sem a necessidade de treinar do zero.

  • Criatividade com código: Poder misturar arte e tecnologia abre portas para projetos inovadores em sala de aula, portfólio pessoal ou mesmo como experimentação artística.

Exemplos do Resultado

Se você acha que este conteúdo pode ser útil para alguém, compartilhe!

Ao divulgar os textos do MakerZine, você contribui para que todo o material continue acessível e gratuito para todas as pessoas.

Rodrigo Terra

Com formação inicial em Física, especialização em Ciências Educacionais com ênfase em Tecnologia Educacional e Docência, e graduação em Ciências de Dados, construí uma trajetória sólida que une educação, tecnologias ee inovação. Desde 2001, dedico-me ao campo educacional, e desde 2019, atuo também na área de ciência de dados, buscando sempre encontrar soluções focadas no desenvolvimento humano. Minha experiência combina um profundo conhecimento em educação com habilidades técnicas em dados e programação, permitindo-me criar soluções estratégicas e práticas. Com ampla vivência em análise de dados, definição de métricas e desenvolvimento de indicadores, acredito que a formação transdisciplinar é essencial para preparar indivíduos conscientes e capacitados para os desafios do mundo contemporâneo. Apaixonado por café e boas conversas, sou movido pela curiosidade e pela busca constante de novas ideias e perspectivas. Minha missão é contribuir para uma educação que inspire pensamento crítico, estimule a criatividade e promova a colaboração.

Deixe um comentário