Este projeto tem como objetivo simplificar o processo de criação de um modelo DeepDream personalizado usando modelos de GoogleNet pré -terenciados e conjuntos de dados de imagem personalizados.
Aqui estão algumas visualizações de exemplo criadas com modelos DeepDream personalizados treinados em imagens temáticas de verão:
Dependências:
Você pode encontrar instruções detalhadas de instalação para o Ubuntu e o Windows no guia de instalação.
Depois de garantir que o Pytorch esteja instalado, você pode opcionalmente baixar os Modelos Pré -tenhados do POTES365 GOOGLENET e INCCECCIONAL5H (EMPCECCIONV1) com o seguinte comando:
python models/download_models.py
Se você deseja apenas criar DeepDreams com os modelos pré-treinados ou baixou um modelo pré-traçado feito por outra pessoa com o Creator Dream, então você pode pular para a visualização de modelos.
Crie e prepare seu conjunto de dados
Coletar imagens
Classifique as imagens no formato necessário.
Remova todas as imagens corruptas.
Verifique se qualquer duplicata foi removida se você ainda não o fez
Redimensione o conjunto de dados para acelerar o treinamento.
Calcule a média e o desvio padrão do seu conjunto de dados.
Treine um modelo googlenet
Visualize os resultados
Se os resultados não forem ótimos, talvez seja necessário voltar à etapa 1-2 e fazer algumas alterações com quais imagens, categorias e parâmetros de treinamento são usados.
Pode levar apenas 5 épocas para criar visualizações que se assemelham aos seus dados de treinamento usando a principal camada FC/logits. Para acelerar o treinamento e criar resultados mais importantes, o modelo BVLC pré -treinado usado é parcialmente congelado para proteger as camadas inferiores da mudança.
Para treinar um modelo DeepDream personalizado, você precisará criar um conjunto de dados composto por imagens que deseja usar para treinamento. Existem várias maneiras pelas quais você pode adquirir imagens para o seu conjunto de dados e precisará de pelo menos algumas centenas de imagens para cada categoria/classe.
O DeepDream é mais frequentemente realizado com modelos de classificação de imagem treinados em conjuntos de dados de imagem compostos por diferentes categorias/classes. Os modelos de classificação de imagens tentam aprender a diferença entre diferentes classes de imagem e, ao fazer isso, os neurônios ganham a capacidade de criar alucinações de sonho. As imagens que você escolher, as diferenças entre elas, as diferenças entre as classes escolhidas e o número de imagens usadas afetarão bastante as visualizações que podem ser produzidas.
Os conjuntos de dados de imagem Pytorch devem ser estruturados, onde o diretório/pasta principal contém subpastas/diretórios para cada categoria/classe. Abaixo, é mostrado um exemplo da estrutura do conjunto de dados necessária:
dataset_dir
│
└───category1
│ │ image1.jpg
│ │ image2.jpg
│ │ image3.jpg
│
└───category2
│ image1.jpg
│ image2.jpg
│ image3.jpg
Depois de criar seu conjunto de dados no formato adequado, remova qualquer imagens duplicadas, se você ainda não o fez. Há uma variedade de ferramentas que você pode usar para esta tarefa, incluindo software gratuito e de código aberto.
Se você ainda não o fez, pode criar uma cópia de backup do seu conjunto de dados.
Em seguida, você precisará verificar se nenhuma das imagens é corrompida de tal maneira que impeça a Pytorch de carregá -las. Para remover automaticamente as imagens corruptas do seu conjunto de dados, use o seguinte comando:
python data_tools/remove_bad.py -delete_bad -data_path <training_data>
Em seguida, você provavelmente deseja redimensionar seu conjunto de dados para estar mais próximo do tamanho da imagem de treinamento para acelerar o treinamento. O redimensionamento do seu conjunto de dados não impedirá que você crie imagens maiores de profundidade com o modelo resultante. O script de redimensionamento incluído modificará apenas imagens que vão acima do tamanho da imagem especificado com sua altura ou largura.
Para redimensionar as imagens no seu conjunto de dados, use o seguinte comando:
python data_tools/resize_data.py -data_path <training_data> -max_size 500
Agora, com seu conjunto de dados recém -redimensionado, você pode calcular a média e o desvio padrão do seu conjunto de dados para uso em treinamento e profundidade. Certifique -se de recalcular a média e o desvio padrão novamente se você modificar o conjunto de dados adicionando ou removendo imagens.
Para calcular a média e o desvio padrão do seu conjunto de dados, use o seguinte comando e salve a saída para a próxima etapa:
python data_tools/calc_ms.py -data_path <training_data>
Agora você pode começar a treinar seu modelo DeepDream executando o script de treinamento do GoogleNet. É recomendável que você salve o modelo a cada 5-10 épocas para monitorar a qualidade das visualizações.
Depois de treinar seus modelos, você pode adicionar uma matriz de correlação de cores para decorrelação de cores com o seguinte comando:
python data_tools/calc_cm.py -data_path <training_data> -model_file <bvlc_out120>.pth
Comando de treinamento básico:
python train_googlenet.py -data_path <training_data> -balance_classes -batch_size 96 -data_mean <mean> -data_sd <sd>
Opções de entrada:
-data_path
: caminho para o diretório/pasta do conjunto de dados que você deseja usar.-data_mean
: sua lista pré -calculada de valores médios para o conjunto de dados escolhido.-data_sd
: sua lista pré -calculada de valores de desvio padrão para o conjunto de dados escolhido.Opções de treinamento:
-num_epochs
: o número de épocas de treinamento para usar. O padrão é 120
.-batch_size
: o número de imagens de treinamento e validação para colocar na rede ao mesmo tempo. O padrão é 32
.-learning_rate
: taxa de aprendizado para usar com o otimizador ADAM ou SGD. O padrão é 1e-2
.-optimizer
: o algoritmo de otimização a ser usado; sgd
ou adam
; O padrão é sgd
.-train_workers
: Quantos trabalhadores usarem para treinamento. O padrão é 0
.-val_workers
: quantos trabalhadores usam para validação. O padrão é 0
.-balance_classes
: Ativando esse sinalizador equilibrará o treinamento para cada classe com base no tamanho da classe.Opções do modelo:
-model_file
: caminho para o arquivo de modelo .pth
a ser usado para o modelo de partida. O padrão é o modelo BVLC GoogleNet.-freeze_to
: Qual camada para congelar o modelo até; Um de none
, conv1
, conv2
, conv3
, mixed3a
, mixed3b
, mixed4a
, mixed4b
, mixed4c
, mixed4d
, mixed4e
, mixed5a
ou mixed5b
. O padrão é mixed3b
.-freeze_aux1_to
: Qual camada para congelar a primeira ramificação auxiliar até; Um de none
, loss_conv
, loss_fc
ou loss_classifier
. Padrão none
é.-freeze_aux2_to
: Qual camada para congelar a segunda ramificação auxiliar até; Um de none
, loss_conv
, loss_fc
ou loss_classifier
. Padrão none
é.-delete_branches
: Se este sinalizador estiver ativado, nenhuma agência auxiliar será usada no modelo.Opções de saída:
-save_epoch
: salve o modelo em todas as épocas save_epoch
. O padrão é 10
. Defina como 0
para desativar os modelos intermediários.-output_name
: nome do modelo de saída. O padrão é bvlc_out.pth
.-individual_acc
: Ativando esse sinalizador imprimirá a precisão individual de cada classe.-save_csv
: Ativando esse sinalizador salvará dados de perda e precisão nos arquivos TXT.-csv_dir
: onde salvar arquivos CSV. O padrão está definido como o diretório de trabalho atual.Outras opções:
-use_device
: ID Indexado por zero da GPU para usar mais cuda:
. O padrão é cuda:0
.-seed
: um valor inteiro que você pode especificar para obter resultados repetíveis. Por padrão, esse valor é aleatório para cada execução.Opções do conjunto de dados:
-val_percent
: a porcentagem de imagens de cada classe a ser usada para validação. O padrão é 0.2
.Depois de treinar um novo modelo DeepDream, você precisará testar suas visualizações. As melhores visualizações são encontradas na camada FC principal, também conhecida como camada 'logits'. Esse script ajuda você a visualizar de maneira rápida e fácil todos os canais de uma camada especificada em um modelo específico para uma época de modelo específica, gerando uma imagem separada para cada canal.
Opções de entrada:
-model_file
: caminho para o modelo de GoogleNet pré -treinado que você deseja usar.-learning_rate
: taxa de aprendizado para usar com o otimizador ADAM ou L-BFGS. O padrão é 1.5
.-optimizer
: o algoritmo de otimização a ser usado; lbfgs
ou adam
; O padrão é adam
.-num_iterations
: o padrão é 500
.-layer
: a camada específica que você deseja usar. O padrão está definido como fc
.-extract_neuron
: Se esse sinalizador estiver ativado, o neurônio central será extraído de cada canal.-image_size
: Uma lista separada por vírgula <height>,<width>
para usar para a imagem de saída. O padrão está definido como 224,224
.-jitter
: a quantidade de instabilidade de imagem para usar para pré -processamento. O padrão é 16
.-fft_decorrelation
: se deve ou não usar a decorrelação espacial da FFT. Se ativado, uma menor taxa de aprendizado deve ser usada.-color_decorrelation
: se deve ou não usar a correlação de cores. Opcionalmente, forneça uma lista separada por vírgula de valores para a matriz de correlação de cores. Se nenhum valores forem fornecidos, uma tentativa de carregar uma matriz de correlação de cores a partir do arquivo do modelo será feita antes de não formar a matriz de correlação de cores ImageNet.-random_scale
: se deve ou não usar escala aleatória. Opcionalmente, forneça uma lista de valores separada por vírgula para que as escalas sejam selecionadas aleatoriamente. Se não forem fornecidos valores, as escalas serão selecionadas aleatoriamente na lista a seguir: 1, 0.975, 1.025, 0.95, 1.05
.-random_rotation
: se deve ou não usar rotações aleatórias. Opcionalmente, forneça uma lista separada por vírgula de valores de grau para que as rotações sejam selecionadas aleatoriamente ou um único valor a ser usado para selecionar aleatoriamente graus de [-value, value]
. Se nenhum valores forem fornecidos, um intervalo de [-5, 5]
será usado.-padding
: a quantidade de preenchimento para usar antes da escala aleatória e rotações aleatórias para evitar artefatos de borda. O preenchimento é então removido após as transformações. O padrão está definido como 0
para desativá -lo.Opções de processamento:
-batch_size
: quantas imagens de visualização de canal para criar em cada lote. O padrão é 10
.-start_channel
: em que canal começar a criar imagens de visualização. O padrão é 0
.-end_channel
: em que canal parar de criar imagens de visualização. O padrão está definido como -1
para todos os canais.Somente necessária se o modelo não os conter, opções :
-model_epoch
: a época da época em que o modelo foi salvo para usar para os nomes de imagem de saída. O padrão é 120
.-data_mean
: sua lista pré -calculada de valores médios que foi usada para treinar o modelo, se eles não foram salvos dentro do modelo.-num_classes
: o número de classes em que o modelo foi treinado. O padrão é 120
.Opções de saída :
-output_dir
: onde salvar imagens de saída. O padrão está definido como o diretório de trabalho atual.-print_iter
: Imprima Progresso a cada print_iter
iterações. Defina como 0
para desativar a impressão.-save_iter
: salve as imagens todas as iterações save_iter
. O padrão é 0
para desativar a economia de resultados intermediários.Outras opções:
-use_device
: ID Indexado por zero da GPU para usar mais cuda:
. O padrão é cuda:0
.-seed
: um valor inteiro que você pode especificar para obter resultados repetíveis. Por padrão, esse valor é aleatório para cada execução.Visualização básica da camada FC (logits):
python vis_multi.py -model_file <bvlc_out120>.pth
Visualização avançada da camada FC (logits):
python vis_multi.py -model_file <bvlc_out120>.pth -layer fc -color_decorrelation -fft_decorrelation -random_scale -random_rotation -lr 0.4 -output_dir <output_dir> -padding 16 -jitter 16,8
Este script permite criar alucinações DeepDream com modelos de googlenet treinados.
Opções de entrada:
-model_file
: caminho para o modelo de GoogleNet pré -treinado que você deseja usar.-learning_rate
: taxa de aprendizado para usar com o otimizador ADAM ou L-BFGS. O padrão é 1.5
.-optimizer
: o algoritmo de otimização a ser usado; lbfgs
ou adam
; O padrão é adam
.-num_iterations
: o padrão é 500
.-content_image
: caminho para sua imagem de entrada. Se nenhuma imagem de entrada for especificada, o ruído aleatório será usado.-layer
: a camada específica que você deseja usar. O padrão está definido como mixed5a
.-channel
: o canal de camada específico que você deseja usar. O padrão está definido como -1
para desativar a seleção específica de canal.-extract_neuron
: Se esse sinalizador estiver ativado, o neurônio central será extraído do canal selecionado pelo parâmetro -channel
.-image_size
: Uma lista separada por vírgula <height>,<width>
para usar para a imagem de saída. Se um valor único para o comprimento lateral máximo for fornecido juntamente com uma imagem de conteúdo, o comprimento lateral mínimo será calculado automaticamente. O padrão está definido como 224,224
.-jitter
: a quantidade de instabilidade de imagem para usar para pré -processamento. O padrão é 16
.-fft_decorrelation
: se deve ou não usar a decorrelação espacial da FFT. Se ativado, uma menor taxa de aprendizado deve ser usada.-color_decorrelation
: se deve ou não usar a correlação de cores. Opcionalmente, forneça uma lista separada por vírgula de valores para a matriz de correlação de cores. Se nenhum valores forem fornecidos, uma tentativa de carregar uma matriz de correlação de cores a partir do arquivo do modelo será feita antes de não formar a matriz de correlação de cores ImageNet.-random_scale
: se deve ou não usar escala aleatória. Opcionalmente, forneça uma lista de valores separada por vírgula para que as escalas sejam selecionadas aleatoriamente. Se não forem fornecidos valores, as escalas serão selecionadas aleatoriamente na lista a seguir: 1, 0.975, 1.025, 0.95, 1.05
.-random_rotation
: se deve ou não usar rotações aleatórias. Opcionalmente, forneça uma lista separada por vírgula de valores de grau para que as rotações sejam selecionadas aleatoriamente ou um único valor a ser usado para selecionar aleatoriamente graus de [-value, value]
. Se nenhum valores forem fornecidos, um intervalo de [-5, 5]
será usado.-padding
: a quantidade de preenchimento para usar antes da escala aleatória e rotações aleatórias para evitar artefatos de borda. O preenchimento é então removido após as transformações. O padrão está definido como 0
para desativá -lo.-layer_vis
: se deve usar o DeepDream ou a Visualização de direção ao não visualizar canais de camada específicos. Um de deepdream
ou direction
; O padrão é deepdream
.Somente necessária se o modelo não os conter, opções :
-data_mean
: sua lista pré -calculada de valores médios que foi usada para treinar o modelo, se eles não foram salvos dentro do modelo.-num_classes
: o número de classes em que o modelo foi treinado, se não foi salvo dentro do modelo.Opções de saída :
-output_image
: nome da imagem de saída. O padrão está out.png
.-print_iter
: Imprima Progresso a cada print_iter
iterações. Defina como 0
para desativar a impressão.-save_iter
: salve as imagens todas as iterações save_iter
. O padrão é 0
para desativar a economia de resultados intermediários.Opções de ladrilhos:
-tile_size
: o tamanho de ladrilho desejado a ser usado. Uma lista separada por vírgula de <height>,<width>
ou um único valor a ser usado para altura e largura do ladrilho. O padrão é definido como 0
para desativar o ladrilho.-tile_overlap
: a porcentagem de sobreposição a ser usada para os ladrilhos. O padrão é 25
para sobreposição de 25%. Porcentagens de sobreposição acima de 50% resultarão em problemas.-tile_iter
: o padrão é 50
.Outras opções:
-use_device
: ID Indexado por zero da GPU para usar mais cuda:
. O padrão é cuda:0
.-seed
: um valor inteiro que você pode especificar para obter resultados repetíveis. Por padrão, esse valor é aleatório para cada execução.DeepDream básico:
python vis.py -model_file <bvlc_out120>.pth -layer mixed5a
Avançado DeepDream:
python vis.py -model_file <bvlc_out120>.pth -layer mixed5a/conv_5x5_relu -channel 9 -color_decorrelation -fft_decorrelation -random_scale -random_rotation -lr 0.4 -padding 16 -jitter 16,8
Veja aqui mais informações sobre todos os scripts/ferramentas incluídos relacionados à criação, limpeza e preparação do conjunto de dados.