[PYTHON] Lernen Sie Paints Chainer mit Macbook Pro ~ Operation

In MacbookPro (Nicht-Cuda-Umgebung) habe ich PaintsChainera geschult, neue Daten zu lernen, und sie selbstständig funktionieren lassen.

Ausführungsumgebung

MacbookPro(Early 2015)

Die Umgebung wird mit virtualenv auf pyenv deaktiviert. Die Liste der Pips ist wie folgt.

Vorbereitung

Verzeichnisaufbau

Jede Datei wurde in der folgenden Konfiguration angeordnet.

~/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

Werkzeuge

Erstellen Sie resize.py, image2line.py, run.sh in ~ / PaintsChainer / cgi-bin / paint_x2_unet / tools unter Bezugnahme auf http://qiita.com/ikeyasu/items/6c1ebed07b281281b1f6 tat.

resize.py wird nicht separat für 128px und 512px erstellt, und die Größe kann durch das Argument angegeben werden.

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)

Da die Beschreibung der Referenzquelle in run.sh eine Pfadauslassung aufwies, wurde diese wie folgt korrigiert. Geben Sie außerdem die Größe mit einem Argument an, da resize.py geändert wurde.

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/{}'

Lerner

Siehe http://qiita.com/ikeyasu/items/6c1ebed07b281281b1f6 und http://blog.livedoor.jp/abars/archives/52397019.html Train_128.py und train_x2.py wurden korrigiert, so dass es ohne GPU ausgeführt werden kann.

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

Lernen

Zu trainierende Bilder wurden in "~ / PaintsChainer / cgi-bin / paint_x2_unet / images / original" platziert und Ausschnitte und Strichzeichnungen extrahiert.

$ 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

Als die Trainingsdaten fertig waren, wurden train_128.py und train_x2.py ausgeführt. Da Cuda nicht verwendet wird, wurde in der GPU-Option -1 (-g -1) angegeben.

$ 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

Stellen Sie 100 Bilder ein, lernen Sie ab Epoche = 20 (-e 20) und gehen Sie nach Hause. Wenn ich am nächsten Morgen nachschaue ... habe ich noch nicht fertig gelernt!

Nachdem Sie den Maßstab auf 3 Bilder und die Epoche = 3 (-e 3) reduziert und erneut versucht haben, Die Modelldatei (model_final) wurde in ungefähr 3 Minuten bei 128 x 128 und ungefähr 10 Minuten bei 512 x 512 ausgegeben.

Starten Sie CGI

Die GPU-Option hat -1 angegeben. Ich habe auf "http: // localhost: 8000 / static /" zugegriffen und bestätigt, dass die App funktioniert.

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

Fazit

Wie erwartet war das Lernen in einer Umgebung ohne Cuda sehr zeitaufwändig und nicht realistisch. Wenn Sie dieses Ergebnis zeigen, können Sie ein Budget für eine hochwertige Cuda-Maschine erhalten! ···Kann.

Recommended Posts

Lernen Sie Paints Chainer mit Macbook Pro ~ Operation
YOLO mit Chainer
Führen Sie Paints Chainer auf der CPU mit offiziellem Python auf win10 aus
Implementieren Sie ESPnet auf einem Macbook
Installieren Sie Chainer 1.5.0 unter Windows
Installieren Sie Chainer unter CentOS 6.7
OpenPose auf dem MacBook Pro
Linux-Betrieb unter Win10