Sur MacbookPro (environnement non-Cuda), j'ai formé PaintsChainera pour apprendre de nouvelles données et les faire fonctionner par moi-même.
MacbookPro(Early 2015)
L'environnement est désactivé avec virtualenv sur pyenv. La liste des pips est la suivante.
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
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/{}'
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
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.
hoge.jpg
. (Le format lui-même peut être mélangé avec jpg, png, gif, etc.)
Après avoir généré les données d'entraînement, j'ai généré une liste d'images dans ~ / PaintsChainer / cgi-bin / paint_x2_unet / dat
.$ 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.
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
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