[PYTHON] Apprendre Paints Chainer avec Macbook Pro ~ Fonctionnement

Sur MacbookPro (environnement non-Cuda), j'ai formé PaintsChainera pour apprendre de nouvelles données et les faire fonctionner par moi-même.

Environnement d'exécution

MacbookPro(Early 2015)

L'environnement est désactivé avec virtualenv sur pyenv. La liste des pips est la suivante.

Préparation

Structure du répertoire

Chaque fichier a été organisé dans la configuration suivante.

~/PaintsChainer/
├── 2010_06.png
├── 2010_06_correcte_by_changing_save_as_img.jpg
├── 2010_06_new_BGR2YUV.JPG
├── 2010_06_new_changed_color_RGB-2-BGR-by-IrfanView.JPG
├── IMG_6731.jpg
├── README.md
├── cgi-bin
│   └── paint_x2_unet
│       ├── __init__.py
│       ├── __pycache__
│       │   ├── cgi_exe.cpython-36.pyc
│       │   ├── img2imgDataset.cpython-36.pyc
│       │   ├── lnet.cpython-36.pyc
│       │   └── unet.cpython-36.pyc
│       ├── cgi_exe.py
│       ├── dat
│       │   └── images_color_train.dat
│       ├── images
│       │   ├── color
│       │   │   ├── 1.jpg
│       │   │   ├── 2.jpg
│       │   │   ...
│       │   │   └── N.jpg
│       │   ├── colorx2
│       │   │   ├── 1.jpg
│       │   │   ├── 2.jpg
│       │   │   ...
│       │   │   └── N.jpg
│       │   ├── line
│       │   │   ├── 1.jpg
│       │   │   ├── 2.jpg
│       │   │   ...
│       │   │   └── N.jpg
│       │   ├── linex2
│       │   │   ├── 1.jpg
│       │   │   ├── 2.jpg
│       │   │   ...
│       │   │   └── N.jpg
│       │   └── original
│       │       ├── 1.jpg
│       │       ├── 2.jpg
│       │       ...
│       │       └── N.jpg
│       ├── img2imgDataset.py
│       ├── lnet.py
│       ├── models
│       │   ├── model_cnn_128
│       │   ├── old
│       │   │   ├── unet_128_standard
│       │   │   └── unet_512_standard
│       │   ├── unet_128_standard
│       │   └── unet_512_standard
│       ├── result
│       │   └── log
│       ├── result1
│       │   ├── cg.dot
│       │   ├── model_final
│       │   └── optimizer_final
│       ├── result2
│       │   ├── cg.dot
│       │   ├── model_final
│       │   └── optimizer_final
│       ├── tools
│       │   ├── image2line.py
│       │   ├── resize.py
│       │   └── run.sh
│       ├── train_128.py
│       ├── train_128_mod.py
│       ├── train_x2.py
│       ├── train_x2_mod.py
│       └── unet.py
├── clouds.jpg
├── cv2_demo_cvt.py
├── edge-detection.ipynb
├── log
├── server.py
└── static
    ├── bootstrap
    │   ├── css
    │   │   ├── bootstrap-responsive.css
    │   │   ├── bootstrap-responsive.min.css
    │   │   ├── bootstrap.css
    │   │   └── bootstrap.min.css
    │   ├── img
    │   │   ├── glyphicons-halflings-white.png
    │   │   └── glyphicons-halflings.png
    │   └── js
    │       ├── bootstrap.js
    │       └── bootstrap.min.js
    ├── images
    │   ├── line
    │   │   ├── ERS39TVYS8OKJOGLA3X29GWR3K4QOD9B.png
    │   │   ├── F5RIILKVA2O5YTUD4AO4EGCM9CQ9E2NP.png
    │   │   ├── HLMP9DNIJ3JYKTQ8PEEN7TMCCDNJJ3GW.png
    │   │   ├── L0QH3YOCJ342JQD6OXE9ED534FOC9YMS.png
    │   │   ├── L5VJOBTLIA21YWYF2S7LOPMJ67A1UMOA.png
    │   │   ├── OC2B63AMFXW14NGG9VOA0TK2NRDP1GF3.png
    │   │   └── P07S79RSSSRSES72DP9ITAQSPJNA8M1V.png
    │   ├── out
    │   │   ├── ERS39TVYS8OKJOGLA3X29GWR3K4QOD9B_0.jpg
    │   │   ├── F5RIILKVA2O5YTUD4AO4EGCM9CQ9E2NP_0.jpg
    │   │   ├── HLMP9DNIJ3JYKTQ8PEEN7TMCCDNJJ3GW_0.jpg
    │   │   ├── L0QH3YOCJ342JQD6OXE9ED534FOC9YMS_0.jpg
    │   │   ├── L5VJOBTLIA21YWYF2S7LOPMJ67A1UMOA_0.jpg
    │   │   ├── OC2B63AMFXW14NGG9VOA0TK2NRDP1GF3_0.jpg
    │   │   └── P07S79RSSSRSES72DP9ITAQSPJNA8M1V_0.jpg
    │   ├── out_min
    │   │   ├── ERS39TVYS8OKJOGLA3X29GWR3K4QOD9B_0.png
    │   │   ├── F5RIILKVA2O5YTUD4AO4EGCM9CQ9E2NP_0.png
    │   │   ├── HLMP9DNIJ3JYKTQ8PEEN7TMCCDNJJ3GW_0.png
    │   │   ├── L0QH3YOCJ342JQD6OXE9ED534FOC9YMS_0.png
    │   │   ├── L5VJOBTLIA21YWYF2S7LOPMJ67A1UMOA_0.png
    │   │   ├── OC2B63AMFXW14NGG9VOA0TK2NRDP1GF3_0.png
    │   │   └── P07S79RSSSRSES72DP9ITAQSPJNA8M1V_0.png
    │   └── ref
    │       ├── ERS39TVYS8OKJOGLA3X29GWR3K4QOD9B.png
    │       ├── F5RIILKVA2O5YTUD4AO4EGCM9CQ9E2NP.png
    │       ├── HLMP9DNIJ3JYKTQ8PEEN7TMCCDNJJ3GW.png
    │       ├── L0QH3YOCJ342JQD6OXE9ED534FOC9YMS.png
    │       ├── L5VJOBTLIA21YWYF2S7LOPMJ67A1UMOA.png
    │       ├── OC2B63AMFXW14NGG9VOA0TK2NRDP1GF3.png
    │       └── P07S79RSSSRSES72DP9ITAQSPJNA8M1V.png
    ├── index.html
    ├── interactive_ui.html
    ├── paints_chainer.js
    └── wPaint
        ├── lib
        │   ├── jquery.1.10.2.min.js
        │   ├── jquery.ui.core.1.10.3.min.js
        │   ├── jquery.ui.draggable.1.10.3.min.js
        │   ├── jquery.ui.mouse.1.10.3.min.js
        │   ├── jquery.ui.widget.1.10.3.min.js
        │   ├── mixins.styl
        │   ├── wColorPicker.min.css
        │   └── wColorPicker.min.js
        ├── plugins
        │   ├── file
        │   │   ├── img
        │   │   │   └── icons-menu-main-file.png
        │   │   ├── src
        │   │   │   └── wPaint.menu.main.file.js
        │   │   └── wPaint.menu.main.file.min.js
        │   ├── main
        │   │   ├── img
        │   │   │   ├── cursor-bucket.png
        │   │   │   ├── cursor-crosshair.png
        │   │   │   ├── cursor-dropper.png
        │   │   │   ├── cursor-eraser1.png
        │   │   │   ├── cursor-eraser10.png
        │   │   │   ├── cursor-eraser2.png
        │   │   │   ├── cursor-eraser3.png
        │   │   │   ├── cursor-eraser4.png
        │   │   │   ├── cursor-eraser5.png
        │   │   │   ├── cursor-eraser6.png
        │   │   │   ├── cursor-eraser7.png
        │   │   │   ├── cursor-eraser8.png
        │   │   │   ├── cursor-eraser9.png
        │   │   │   ├── cursor-pencil.png
        │   │   │   ├── icon-group-arrow.png
        │   │   │   └── icons-menu-main.png
        │   │   ├── src
        │   │   │   ├── fillArea.min.js
        │   │   │   └── wPaint.menu.main.js
        │   │   └── wPaint.menu.main.min.js
        │   ├── shapes
        │   │   ├── img
        │   │   │   └── icons-menu-main-shapes.png
        │   │   ├── src
        │   │   │   ├── shapes.min.js
        │   │   │   └── wPaint.menu.main.shapes.js
        │   │   └── wPaint.menu.main.shapes.min.js
        │   └── text
        │       ├── img
        │       │   └── icons-menu-text.png
        │       ├── src
        │       │   └── wPaint.menu.text.js
        │       └── wPaint.menu.text.min.js
        ├── wPaint.min.css
        └── wPaint.min.js

Outils

Créez resize.py, image2line.py, run.sh dans ~ / PaintsChainer / cgi-bin / paint_x2_unet / tools en vous référant à http://qiita.com/ikeyasu/items/6c1ebed07b281281b1f6 fait.

resize.py n'est pas créé séparément pour 128px et 512px, et la taille peut être spécifiée par l'argument.

resize.py


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='clipping and resize')
    parser.add_argument('--input', '-i', default='input.jpg', help='input file')
    parser.add_argument('--output', '-o', default='output.jpg', help='output file')
+   parser.add_argument('--size', '-s', default='128', help='size')
    args = parser.parse_args()
+   main(args.input, args.output, int(args.size))
-   main(args.input, args.output)

Comme il y avait une omission de chemin dans la description de la source de référence pour run.sh, elle a été corrigée comme suit. Spécifiez également la taille avec un argument en raison de la modification de resize.py.

run.sh


ls -v1 ../images/original/ | parallel -j 8  'echo {}; python resize.py -i ../images/original/{} -o ../images/color/{} -s 128'
ls -v1 ../images/original/ | parallel -j 8  'echo {}; python image2line.py -i ../images/color/{} -o ../images/line/{}'
ls -v1 ../images/original/ | parallel -j 8  'echo {}; python resize.py -i ../images/original/{} -o ../images/colorx2/{} -s 512'
ls -v1 ../images/original/ | parallel -j 8  'echo {}; python image2line.py -i ../images/colorx2/{} -o ../images/linex2/{}'

Apprenant

Reportez-vous à http://qiita.com/ikeyasu/items/6c1ebed07b281281b1f6 et http://blog.livedoor.jp/abars/archives/52397019.html Correction de train_128.py et train_x2.py afin qu'il puisse être exécuté sans GPU.

train_128.py


-     serializers.load_npz("models/liner_f", l)
+     #serializers.load_npz("models/liner_f", l)

-     chainer.serializers.save_npz(os.path.join(out_dir, 'model_final'), cnn)
-     chainer.serializers.save_npz(os.path.join(out_dir, 'optimizer_final'), opt)
+     # chainer.serializers.save_npz(os.path.join(out_dir, 'model_final'), cnn)
+     # chainer.serializers.save_npz(os.path.join(out_dir, 'optimizer_final'), opt)
+     chainer.serializers.save_npz(os.path.join(args.out, 'model_final'), cnn)
+     chainer.serializers.save_npz(os.path.join(args.out, 'optimizer_final'), opt)

train_x2.py


-     serializers.load_npz("models/model_cnn_128_dfl2_9", cnn_128)
+     # serializers.load_npz("models/model_cnn_128_dfl2_9", cnn_128)
+     serializers.load_npz("models/model_cnn_128", cnn_128)

-     chainer.serializers.save_npz(os.path.join(out_dir, 'model_final'), cnn)
-     chainer.serializers.save_npz(os.path.join(out_dir, 'optimizer_final'), opt)
+     # chainer.serializers.save_npz(os.path.join(out_dir, 'model_final'), cnn)
+     # chainer.serializers.save_npz(os.path.join(out_dir, 'optimizer_final'), opt)
+     chainer.serializers.save_npz(os.path.join(args.out, 'model_final'), cnn)
+     chainer.serializers.save_npz(os.path.join(args.out, 'optimizer_final'), opt)

-         x_out = x_out.data.get()
+         # x_out = x_out.data.get()
+         x_out = x_out.data

Apprendre

Les images à former ont été placées dans ~ / PaintsChainer / cgi-bin / paint_x2_unet / images / original, et des découpes et des dessins au trait ont été extraits.

$ cd ~/PaintsChainer/cgi-bin/paint_x2_unet/dat
$ sudo ./run.sh
$ ls ../images
color		colorx2		line		linex2		original

../images/color:
1.jpg 2.jpg ... N.jpg

../images/colorx2:
1.jpg 2.jpg ... N.jpg

../images/line:
1.jpg 2.jpg ... N.jpg

../images/linex2:
1.jpg 2.jpg N.jpg

../images/original:
1.jpg 2.jpg ... N.jpg

$ cd ../images/original/
$ ls -v1 > ../../dat/images_color_train.dat

Lorsque les données d'entraînement étaient prêtes, train_128.py et train_x2.py ont été exécutés respectivement. Puisque Cuda n'est pas utilisé, l'option GPU a spécifié -1 (-g -1).

$ python train_128_mod.py -g -1 --dataset ./images/ -e 20 -o result1
$ cp result1/model_final models/model_cnn_128
$ python train_x2_mod.py -g -1 --dataset ./images/ -e 20 -o result2
$ cp models/unet_128_standard models/unet_128_standard.old
$ cp models/unet_512_standard models/unet_512_standard.old
$ cp result1/model_final models/unet_128_standard
$ cp result2/model_final models/unet_512_standard

Définissez 100 images, commencez à apprendre à l'époque = 20 (-e 20) et rentrez chez vous. Quand je vérifie le lendemain matin ... je n'ai pas fini d'apprendre!

Après avoir réduit l'échelle à 3 images et l'époque = 3 (-e 3) et réessayer, Le fichier de modèle (model_final) a été produit en environ 3 minutes à 128x128 et environ 10 minutes à 512x512.

Lancer CGI

L'option GPU a spécifié -1. J'ai accédé à http: // localhost: 8000 / static / et j'ai confirmé que l'application fonctionne.

$ cd ~/PaintsChainer/
$ python server.py -g -1

Conclusion

Comme prévu, l'apprentissage dans un environnement non-Cuda demandait un temps considérable et n'était pas réaliste. Si vous montrez ce résultat, vous pouvez obtenir un budget pour une machine Cuda haut de gamme! ···Peut.

Recommended Posts

Apprendre Paints Chainer avec Macbook Pro ~ Fonctionnement
YOLO avec Chainer
Exécutez Paints Chainer sur CPU avec python officiel sur win10
Implémenter ESPnet sur Macbook
Installez Chainer 1.5.0 sur Windows
Installer Chainer sur CentOS 6.7
OpenPose sur MacBook Pro
Fonctionnement Linux sur Win10