Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 31/07/2017, à 17:48

senoyo

[RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Bonjour,


J'ai installé Ubuntu (je viens de windows) récemment pour m'amuser avec un système neuronal appliqué aux images: "neural-style". C'est très captivant mais pour un résultat réussi, il faut beaucoup tester d'images et de paramètres et je me dis qu'il y a surement une possibilité de "batcher" ça puisque c'est sous Linux.


Voici la commande:

th neural_style.lua \
-content_weight 10 -style_scale 1.2 -style_weight 1000 \
-content_image $HOME/img/cont/image01.jpg -style_image $HOME/img/styl/style01.jpg -output_image $HOME/img/sortie01.jpg \
-image_size 800 

explication:
fichier: sp_style.lua
content_image = (l'image source)
style_image = (l'image de contenu)
output_image = (résultat créé)

J'aimerais pouvoir "batcher" tout un répertoire pour les images sources ($HOME/img/cont/) ,
qu'elles utilisent une à une les images de contenu ($HOME/img/styl/) ,
et enfin que je puisse créer une liste plus ou moins grande de valeurs à utiliser pour (content_weight, style_scale, style_weight)
ex:
1: 10 1.2 1000
2: 100 1 500
3: 100 5 1000

Donc s'il y a 3 images sources, 3 images de contenu et 3 listes de valeurs, il devrait résulter 27 images.
(si poss le nom final de l'image serait: nom-image-source_nom-image-contenu_valeurs (valeurs de l'ex1: 10-1_2-1000)

J'ai trouvé une solution partielle ici
J'en suis là: J'arrive à "batcher" une séquence d'images sources ou bien les images de contenu; pas les 2 en même temps.

for b in $(seq -w 05 10); do
th sp_style.lua \
-content_weight 10 -style_scale 1.2 -style_weight 1000 \
-content_image $HOME/img/cont/01.jpg -style_image $HOME/img/styl/$b.jpg -output_image $HOME/img/resultat_$b.png \
-image_size 800 ; done

Un coup de pousse ?
Merci.

Dernière modification par senoyo (Le 10/08/2017, à 14:53)

Hors ligne

#2 Le 31/07/2017, à 18:57

Watael

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

salut,

il y a surement une possibilité de "batcher" ça puisque c'est sous Linux

tu peux "batcher" SUR* W$ aussi.

pour ta requête, en pseudo-code :

pour imageSrc dans repertoireSource/fichiers
faire
   pour imageCtn dans repertoireContenu/fichiers
   faire
      pour valeur dans listeValeurs
      faire
         tonProg %imageSrc%_%imageCtn%_%valeur%
      fait
   fait
fait

* rappel de topographie : l'ordinateur est sur le bureau, l'OS est sur l'ordi, les scripts sur l'OS, et toi par dessus tout ça.


eval, c'est mal.

Hors ligne

#3 Le 04/08/2017, à 15:33

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

D'abord, merci Watael pour cette réponse. Ça fait plusieurs jours que j'essaie de comprendre et d'appliquer cette proposition mais je ne sais pas programmer et je suis totalement novice sur Ubuntu.
Pour essayer de comprendre, j'ai laissé de coté la problématique des valeurs qui complique considérablement mais je suis bien loin de résoudre ma requette.

imageSrc="-content_image"
imageCtn="-style_image"


for $imageSrc in $HOME/img/cont/
do
   for $imageCtn in $HOME/img/styl/
   do
      th th neural_style.lua -content_weight 10 -style_scale 1.2 -style_weight 1000 -output_image $HOME/img/sortie01.jpg -image_size 800  %imageSrc%_%imageCtn%
   done
done

Est-ce une bonne direction ?

Hors ligne

#4 Le 04/08/2017, à 16:39

Watael

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

oui, c'est la bonne direction.

for doit boucler sur une liste qui sera obtenue par le développement des chemins en utilisant un astérisque (*)

for fichier in /chemin/*

il n'y a pas de dollar devant une variable que l'on assigne.
par contre il doit y en avoir un devant une variable que l'on développe :

var="bla bla"
echo "$var"

et, il faut toujours, TOUJOURS*, mettre les variables développées entre guillemets.

* à moins de savoir pourquoi ne pas le faire. wink

PS: j'ai mis les variables entre %% dans le pseudo-code, parce que c'est du pseudo-code.


eval, c'est mal.

Hors ligne

#5 Le 04/08/2017, à 17:51

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Bon, finalement j'ai vu que le principe ressemble à ce que j'avais essayé de faire et effectivement, j'avais juste fais une erreur de syntaxe.
Ca ça fonctionne:
smile

for a in $(seq -w 01 02); do
for b in $(seq -w 14 16); do
time th neural_style.lua \
-content_weight 10 -style_scale 1 -style_weight 1000 \
-content_image $HOME/img/cont/p$a.jpg -style_image $HOME/img/styl/$b.jpg -output_image $HOME/img/s100_$a-$b.png \
-init image -gpu 0 -backend cudnn -normalize_gradients -print_iter 10 -save_iter 100 -num_iterations 200 -image_size 800 ; done done

Reste à ajouter les valeurs (par 3)...

Hors ligne

#6 Le 04/08/2017, à 18:10

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Ça devrait donner quelque chose comme ça pour utiliser des valeurs différentes ?

for x in $(10) for y in $(1) for z in $(1000) ;do
for x in $(100) for y in $(10) for z in $(10000) ;do
for x in $(1000) for y in $(100) for z in $(100000) ;do
time th neural_style.lua \
-content_weight $x -style_scale $y -style_weight $z \
-content_image $HOME/img/cont/p01.jpg -style_image $HOME/img/styl/14.jpg -output_image $HOME/img/s0101_$x-$y-$z.png \
-init image -gpu 0 -backend cudnn -normalize_gradients -print_iter 0 -save_iter 100 -num_iterations 200 -image_size 800 ; done done done

En tout cas ça ne fonctionne pas. sad

Hors ligne

#7 Le 04/08/2017, à 18:34

Watael

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

il faut être rigoureux.

for i in 1 2 3
do
   for y in 4 5 6
   do
      for z in 7 8 9
      do
         echo "$i $y $z"
      done
   done
done
1 4 7
1 4 8
1 4 9
1 5 7
1 5 8
1 5 9
1 6 7
1 6 8
1 6 9
2 4 7
2 4 8
2 4 9
2 5 7
2 5 8
2 5 9
2 6 7
2 6 8
2 6 9
3 4 7
3 4 8
3 4 9
3 5 7
3 5 8
3 5 9
3 6 7
3 6 8
3 6 9

l'indentation permet de lire plus facilement le code et d'y détecter d'éventuelles erreurs.


eval, c'est mal.

Hors ligne

#8 Le 04/08/2017, à 18:50

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

l'indentation permet de lire plus facilement le code et d'y détecter d'éventuelles erreurs.

Ah oui, je comprend. smile

Par contre, si je fais

for x in 1 2 3
do
   for y in 4 5 6
   do
      for z in 7 8 9
      do
         echo "$x $y $z"
      done
   done
done

...alors je ça va être très dur de visualiser mes 3 valeurs.
Exemple:

for i in 10 1000 100000 500
do
   for y in 1 1.2 0.2 0.000001
   do
      for z in 1000000000 100 5000000 0.000005
      do
         echo "$i $y $z"
      done
   done
done

il n'y aurait pas une solutions un peu comme ça plutôt ?

x y z = 10 1.2 1000
x y z = 100 1 10000
xyz = 1000 2 1000000

Hors ligne

#9 Le 04/08/2017, à 19:49

Watael

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

adapte le echo pour qu'il affiche les précisions désirées.

un peu plus tard, je te montrerai comment faire avec printf. wink


eval, c'est mal.

Hors ligne

#10 Le 05/08/2017, à 02:27

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Je n'avais pas vu "écho" D'après mes recherches, cela permet d'afficher les valeurs à l'écran. Je ne vois pas trop l'intérêt puisque il va y avoir des kilomètres de codes affichés avec ce batch.
Mais peut-être que je me trompe. (Le top serait d'ajouter ces valeurs directement en surimpression sur les images produites mais c'est une autre histoire)

Ce dont je parlais, c'est de pouvoir écrire les 3 valeurs par ligne pour les éditer rapidement si besoin
Si par exemple j'ai 10 x 3 valeurs et que je dois voir et changer les 3 chiffres des valeurs 7, je vais avoir du mal à les repérer ; il faudra que je compte les espaces... ça ne sera pas bien lisible..

Hors ligne

#11 Le 05/08/2017, à 03:03

Watael

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

ok, c'est ma faute, j'avais perdu de vue la liste de valeurs que tu veux appliquer au couple content_image / style_image.

d'où vient cette liste ? elle est contenu dans un fichier ? quel est le format des lignes ?
on peut en faire un tableau dont on splittera chaque ligne en autant d'éléments qu'elle contient pour les utiliser dans ta commande.

listeValeurs=(
   '1: 10 1.2 1000'
   '2: 100 1 500'
   '3: 100 5 1000'
)

for f in repCnt/*
do
   for g in repStyl/*
   do
      for i in "${listeValeurs[@]}"
      do
         read numLigne val1 val2 val3 <<<"$i"
         taCommande -opt="$val1" -opt="$val2" -opt="$val3" "$f" "$g"
      done
   done
done

Dernière modification par Watael (Le 05/08/2017, à 14:21)


eval, c'est mal.

Hors ligne

#12 Le 05/08/2017, à 13:26

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

d'où vient cette liste ? elle est contenu dans un fichier ? quel est le format des lignes ?

Si besoin, voici le début du contenu du fichier *style.lua

require 'torch'
require 'nn'
require 'image'
require 'optim'

require 'loadcaffe'


local cmd = torch.CmdLine()

-- Basic options
cmd:option('-style_image', 'examples/inputs/seated-nude.jpg',
           'Style target image')
cmd:option('-style_blend_weights', 'nil')
cmd:option('-content_image', 'examples/inputs/tubingen.jpg',
           'Content target image')
cmd:option('-image_size', 512, 'Maximum height / width of generated image')
cmd:option('-gpu', '0', 'Zero-indexed ID of the GPU to use; for CPU mode set -gpu = -1')
cmd:option('-multigpu_strategy', '', 'Index of layers to split the network across GPUs')

-- Optimization options
cmd:option('-content_weight', 5e0)
cmd:option('-style_weight', 1e2)
cmd:option('-tv_weight', 1e-3)
cmd:option('-num_iterations', 1000)
cmd:option('-normalize_gradients', false)
cmd:option('-init', 'random', 'random|image')
cmd:option('-init_image', '')
cmd:option('-optimizer', 'lbfgs', 'lbfgs|adam')
cmd:option('-learning_rate', 1e1)
cmd:option('-lbfgs_num_correction', 0)

-- Output options
cmd:option('-print_iter', 50)
cmd:option('-save_iter', 100)
cmd:option('-output_image', 'out.png')

-- Other options
cmd:option('-style_scale', 1.0)
cmd:option('-original_colors', 0)
cmd:option('-pooling', 'max', 'max|avg')
cmd:option('-proto_file', 'models/VGG_ILSVRC_19_layers_deploy.prototxt')
cmd:option('-model_file', 'models/VGG_ILSVRC_19_layers.caffemodel')
cmd:option('-backend', 'nn', 'nn|cudnn|clnn')
cmd:option('-cudnn_autotune', false)
cmd:option('-seed', -1)

cmd:option('-content_layers', 'relu4_2', 'layers for content')
cmd:option('-style_layers', 'relu1_1,relu2_1,relu3_1,relu4_1,relu5_1', 'layers for style')


local function main(params)
  local dtype, multigpu = setup_gpu(params)

  local loadcaffe_backend = params.backend
  if params.backend == 'clnn' then loadcaffe_backend = 'nn' end
  local cnn = loadcaffe.load(params.proto_file, params.model_file, loadcaffe_backend):type(dtype)

  local content_image = image.load(params.content_image, 3)
  content_image = image.scale(content_image, params.image_size, 'bilinear')
  local content_image_caffe = preprocess(content_image):float()

  local style_size = math.ceil(params.style_scale * params.image_size)
  local style_image_list = params.style_image:split(',')
  local style_images_caffe = {}
  for _, img_path in ipairs(style_image_list) do
    local img = image.load(img_path, 3)
    img = image.scale(img, style_size, 'bilinear')
    local img_caffe = preprocess(img):float()
    table.insert(style_images_caffe, img_caffe)
  end

  local init_image = nil
  if params.init_image ~= '' then
    init_image = image.load(params.init_image, 3)
    local H, W = content_image:size(2), content_image:size(3)
    init_image = image.scale(init_image, W, H, 'bilinear')
    init_image = preprocess(init_image):float()
  end

  -- Handle style blending weights for multiple style inputs
  local style_blend_weights = nil
  if params.style_blend_weights == 'nil' then
    -- Style blending not specified, so use equal weighting
    style_blend_weights = {}
    for i = 1, #style_image_list do
      table.insert(style_blend_weights, 1.0)
    end
  else
    style_blend_weights = params.style_blend_weights:split(',')
    assert(#style_blend_weights == #style_image_list,
      '-style_blend_weights and -style_images must have the same number of elements')
  end


Sinon, pour les valeurs, c'est moi qui vais les choisir et le batch permettra d’évaluer les meilleurs résultats en sorties et donc des meilleurs listes de valeurs.

.

Dernière modification par senoyo (Le 05/08/2017, à 13:32)

Hors ligne

#13 Le 05/08/2017, à 14:22

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Wah, c'est magique les tableaux ! smile

tableau=( '1: 10 1.2 1000'
'2: 100 1 500'
'3: 100 2 1000' )
    for i in "${tableau[@]}"
    do
       read numLigne val1 val2 val3 <<<"$i"        
       time th neural_style.lua \
      -content_weight "$val1" -style_scale "$val2" -style_weight "$val3" \
      -content_image $HOME/img/cont/p01.jpg -style_image $HOME/img/styl/14.jpg -output_image $HOME/img/s101_$val1-$val2-$val3.png \
      -init image -gpu 0 -backend cudnn -normalize_gradients -print_iter 0 -save_iter 100 -num_iterations 10 -image_size 800 ; \
   done

Ça fonctionne !

Hors ligne

#14 Le 05/08/2017, à 15:09

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

J'en viens à comment traiter tout le contenu d'un dossier.
Pour l'instant j'ai ça qui permet de traiter la séquence *14 à *16 des fichiers ".jpg"

for b in $(seq -w 14 16); do
...    
   -style_image $HOME/img/styl/$b.jpg

Mais j'aimerais utiliser tout les fichier "*.jpg" et "*.png" du dossier

Quelque chose comme ça: ?

for b in *.jpg *.png
...  
   -style_image $HOME/img/styl/$b

Hors ligne

#15 Le 05/08/2017, à 18:12

Watael

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

« Quelque chose comme ça ? »

oui, mais, là, tu n'auras que les fichiers .jpg et .png du répertoire courant.

regarde le post#11.


eval, c'est mal.

Hors ligne

#16 Le 06/08/2017, à 22:51

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

oui, mais, là, tu n'auras que les fichiers .jpg et .png du répertoire courant.

Oui, c'est ce que je veux faire et ça ne fonctionne pas.

for b in *.jpg *.png; do
time th neural_style.lua \
-content_weight 10 -style_scale 1 -style_weight 1000 \
-content_image $HOME/img/cont/p01.jpg -style_image $HOME/img/styl/$b -output_image $HOME/img/s098_$b.png \
-init image -gpu 0 -backend cudnn -normalize_gradients -print_iter 10 -save_iter 0 -num_iterations 100 -image_size 800 ; done

J'ai ce message d'erreur: " ...styl/input_file_0.png: No such file or directory "

.

Hors ligne

#17 Le 07/08/2017, à 01:19

Watael

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Input_file_0.png existe-t-il sous $HOME/img/styl ?

et il faut toujours mettre les noms des variables entre guillemets.


eval, c'est mal.

Hors ligne

#18 Le 07/08/2017, à 12:49

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Input_file_0.png existe-t-il sous $HOME/img/styl ?

Non, il n'y a pas de fichier de ce nom. Je pense que si aucun nom n'est spécifié, il cherche ce fichier par défaut.

0k pour les "variables ".

Dernière modification par senoyo (Le 07/08/2017, à 12:54)

Hors ligne

#19 Le 07/08/2017, à 15:07

Watael

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

et que retourne :

for f in *jpg *png; do echo "$f"; done

?


eval, c'est mal.

Hors ligne

#20 Le 07/08/2017, à 19:25

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Ubuntu ne redémarre plus son interface graphique et affiche un message d'erreur. Du coup je réinstalle tout sur un autre disque dur plus gros que j'ai retrouvé. 60go c'était trop juste.
...
Je te dis ça demain pour ta dernière proposition; merci.

Hors ligne

#21 Le 09/08/2017, à 19:26

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Bon, j'ai beaucoup galéré pour installer neural style...
mais c'est bon. :-)

Watael a écrit :

et que retourne :

for f in *jpg *png; do echo "$f"; done

?

Ca affiche bien le nom des images du dossier courant.

Hors ligne

#22 Le 09/08/2017, à 19:47

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Si je met les guillemets:

for b in "*.jpg *.png";
do
        time th neural_style.lua \
        -content_weight 10 -style_scale 1 -style_weight 1000 \
        -content_image $HOME/img/cont/p01.jpg -style_image $HOME/img/styl/$b.jpg -output_image $HOME/img/s100_$b.png \
        -init image -gpu 0 -backend cudnn -normalize_gradients -print_iter 10 -save_iter 100 -num_iterations 200 -image_size 800 ;
done

Le message d'erreur est "invalide argument..." Je pense qu'il y à une erreur dans la commande. Peut être déjà lui dire de ne pas prendre l'extension du fichier en compte sinon ça risque d'être cumulatif: *.jpg.gif en sortie.

.

Dernière modification par senoyo (Le 09/08/2017, à 20:01)

Hors ligne

#23 Le 09/08/2017, à 19:56

Watael

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

le développements des chemins (les astérisques entre autres) ne sont pas développés entre guillemets.
c'est le développement des variables (quand il y a un dollar), qu'il faut mettre les variables entre guillemets.

il est préférable de copier intégralement le message d'erreur exact, entre balises code également.

Dernière modification par Watael (Le 09/08/2017, à 21:03)


eval, c'est mal.

Hors ligne

#24 Le 09/08/2017, à 20:20

Sub0

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Senoyo,

t’as besoin d’apprendre les bases de bash avant tout j’ai l’impression…

Les sources fiables (la première est  accessible, la seconde pour les approfondissements) :
http://mywiki.wooledge.org/BashGuide
http://wiki.bash-hackers.org/

et pour vérifier ton code :

http://www.shellcheck.net/


Seule alternative au bépo acceptée = stylo/papier.

Hors ligne

#25 Le 09/08/2017, à 20:22

senoyo

Re : [RÉSOLU] Faire une boucle de commande multi-paramettres / batch

Avec:

for b in *.jpg *.png; 
do
   time th neural_style.lua \
   -content_weight 10 -style_scale 1 -style_weight 1000 \
   -content_image $HOME/img/cont/p01.jpg -style_image $HOME/img/styl/"$b" -output_image $HOME/img/s098_"$b".png \
   -init image -gpu 0 -backend cudnn -normalize_gradients -print_iter 10 -save_iter 0 -num_iterations 100 -image_size 800 ; 
done

J'ai ce message d'erreur:

/home/ed/torch/install/bin/luajit: /home/ed/torch/install/share/lua/5.1/image/init.lua:367: /home/ed/img/styl/input_file_0.png: No such file or directory
stack traceback:
	[C]: in function 'error'
	/home/ed/torch/install/share/lua/5.1/image/init.lua:367: in function 'load'
	neural_style.lua:67: in function 'main'
	neural_style.lua:601: in main chunk
	[C]: in function 'dofile'
	...e/ed/torch/install/lib/luarocks/rocks/trepl/scm-1/bin/th:150: in main chunk
	[C]: at 0x00405d50

ainsi que la même chose avec:

.../home/ed/img/styl/style_file.jpg: No such file or directory...

,

/home/ed/img/styl/myimg.jpg: No such file or directory

et

/home/ed/img/styl/input_file.jpg: No such file or directory

Hors ligne