Rの小技

過去の記事をまとめたもの


ExcelファイルをRに読み込む
クリップボード経由でファイルを読み込む方法

mydata <- read.table(file="clipboard",header=T,sep="\t")


■データフレームの入力

mydata <- edit(data.frame())


■プロットのマーカーをきれいに表示する方法

plot(0, 0, xlim=c(0,3), ylim = c(0, 8), type = "n", axes = F, xlab = "", ylab = "")
a<-rep(0:2,c(9,9,8))
b<-c(8:0,8:0,8:1)
points(a,b,pch=0:25,cex=3)
text(a+0.45,b,0:25)

WindowsでMXNet-Gluon-Style-Transferを使ってみる(GPUなし)

GPU版はこちら
touch-sp.hatenablog.com

環境

Windows10 Pro 64bit

Anacondaに仮想環境を作成

conda create -n gluon python=3.6 anaconda
activate gluon
pip install mxnet

python 2.7では最後の実行がうまくいかなかった

MXNetのソースをダウンロード

こちら』からv0.12.0のソースコードをダウンロードして解凍

imageのダウンロード

Linuxsvnコマンドが含まれるため、bash on Windowsを使用しないといけない
まずはsubversionのインストール

sudo apt-get install subversion

続いて、『incubator-mxnet-0.12.0/gluon/style_transfer』フォルダ内に移動して以下を実行

python download_images.py

Linuxコマンドが使えなけえば『こちら』からダウンロードできる

学習済みモデルのダウンロード

こちらは、通常のWindowsから実行可能
『incubator-mxnet-0.12.0/gluon/style_transfer』フォルダ内に移動して以下を実行

python models/download_model.py

Pythonコードの書き換え

『incubator-mxnet-0.12.0/gluon/style_transfer』フォルダ内のmain.pyとnet.pyを書き換え
(修正前)

from mxnet import gluon
from mxnet.gluon import nn, autograd, Block, HybridBlock, Parameter, ParameterDict

(修正後)

from mxnet import gluon, autograd
from mxnet.gluon import nn, Block, HybridBlock, Parameter, ParameterDict

実行

python main.py eval --content-image images/content/venice-boat.jpg --style-image images/styles/wave.jpg --model models/21styles.params --content-size 1024 --cuda 0

WindowsでMXNet-Gluon-Style-Transferを使ってみる(GPUあり)

CPU版はこちら
touch-sp.hatenablog.com

環境

Windows10 Pro 64bit
GeForce GTX 1080 (CUDA 8.0, cuDNN 6.0)

Anacondaに仮想環境を作成

conda create -n gluon python=2.7 anaconda
activate gluon
pip install mxnet-cu80==0.12.0

MXNetのソースをダウンロード

こちら』からv0.12.0のソースコードをダウンロードして解凍

imageのダウンロード

Linuxsvnコマンドが含まれるため、bash on Windowsを使用しないといけない
まずはsubversionのインストール

sudo apt-get install subversion

続いて、『incubator-mxnet-0.12.0/gluon/style_transfer』フォルダ内に移動して以下を実行

python download_images.py

Linuxコマンドが使えなけえば下記サイトからダウンロードできる
github.com

学習済みモデルのダウンロード

こちらは、通常のWindowsから実行可能
『incubator-mxnet-0.12.0/gluon/style_transfer』フォルダ内に移動して以下を実行

python models/download_model.py

Pythonコードの書き換え

『incubator-mxnet-0.12.0/gluon/style_transfer』フォルダ内のmain.pyとnet.pyを書き換え
(修正前)

from mxnet import gluon
from mxnet.gluon import nn, autograd, Block, HybridBlock, Parameter, ParameterDict

(修正後)

from mxnet import gluon, autograd
from mxnet.gluon import nn, Block, HybridBlock, Parameter, ParameterDict

実行

python main.py eval --content-image images/content/venice-boat.jpg --style-image images/styles/wave.jpg --model models/21styles.params --content-size 1024

実行結果

f:id:touch-sp:20171105002254j:plain:w400

おまけ

main.pyを以下のように書き換えてmymain.pyとして保存

import time
import random
import os
import mxnet as mx
import numpy as np
np.set_printoptions(precision=2)
from PIL import Image

from mxnet import gluon, autograd
from mxnet.gluon import nn, Block, HybridBlock, Parameter, ParameterDict
import mxnet.ndarray as F

import net
import utils
from option import Options
import data

import glob
import os

def evaluate(args):
    if args.cuda:
        ctx = mx.gpu(0)
    else:
        ctx = mx.cpu(0)
    # content_images
    content_image = utils.tensor_load_rgbimage(args.content_image, ctx, size=1024, keep_asp=True)
    # model
    style_model = net.Net(ngf=args.ngf)
    style_model.collect_params().load(args.model, ctx=ctx)

    #style_image
    files = glob.glob('images/styles/*.jpg')
    for f in files:
        style_image = utils.tensor_load_rgbimage(f, ctx, size=args.style_size)
        style_image = utils.preprocess_batch(style_image)
    
    # forward
        style_model.setTarget(style_image)
        output = style_model(content_image)
        (dirname,filename)=os.path.split(f)
        utils.tensor_save_bgrimage(output[0], filename, args.cuda)

def main():
    # figure out the experiments type
    args = Options().parse()

    if args.subcommand is None:
        raise ValueError("ERROR: specify the experiment type")


    elif args.subcommand == 'eval':
        # Test the pre-trained model
        evaluate(args)

    else:
        raise ValueError('Unknow experiment type')

if __name__ == "__main__":
   main()

実行するとすべてのスタイル画像を適応してくれる

python mymain.py eval --content-image images/content/flowers.jpg --model models/21styles.params

おまけ

Microsoft PowerPoint 2010のアート効果「鉛筆:スケッチ」と比較してみる
元の写真
f:id:touch-sp:20171106190936j:plain:w400
PowerPoint 2010
f:id:touch-sp:20171106190748j:plain:w400
MXNet-Gluon-Style-Transfer
f:id:touch-sp:20171106190826j:plain:w400

GluonでMNIST

下記の本で紹介されているニューラルネットワークをGluonで書いてみる。

環境

Windows10 Pro 64bit
GeForce GTX 1080 (CUDA 8.0, cuDNN 6.0)

Anacondaに仮想環境を作成

conda create -n gluon python=2.7 anaconda
activate gluon
pip install mxnet-cu80==0.12.0

データの取得、ネットワークの構築、実行

from __future__ import print_function
import mxnet as mx
from mxnet import nd, autograd
from mxnet import gluon
import numpy as np
mx.random.seed(1)
ctx = mx.gpu()
batch_size = 1000
def transform(data, label):
    return nd.transpose(data.astype(np.float32), (2,0,1))/255, label.astype(np.float32)
train_data = mx.gluon.data.DataLoader(mx.gluon.data.vision.MNIST(train=True, transform=transform),
                                      batch_size, shuffle=True)
test_data = mx.gluon.data.DataLoader(mx.gluon.data.vision.MNIST(train=False, transform=transform),
                                     batch_size, shuffle=False)
net = gluon.nn.Sequential()
with net.name_scope():
    net.add(gluon.nn.Conv2D(channels=16, kernel_size=3, strides=(1, 1), padding=(1, 1), activation='relu'))
    net.add(gluon.nn.Conv2D(channels=16, kernel_size=3,  strides=(1, 1), padding=(1, 1),activation='relu'))
    net.add(gluon.nn.MaxPool2D(pool_size=2, strides=2))

    net.add(gluon.nn.Conv2D(channels=32, kernel_size=3,  strides=(1, 1), padding=(1, 1),activation='relu'))
    net.add(gluon.nn.Conv2D(channels=32, kernel_size=3,  strides=(1, 1), padding=(2, 2),activation='relu'))
    net.add(gluon.nn.MaxPool2D(pool_size=2, strides=2))

    net.add(gluon.nn.Conv2D(channels=64, kernel_size=3,  strides=(1, 1), padding=(1, 1),activation='relu'))
    net.add(gluon.nn.Conv2D(channels=64, kernel_size=3,  strides=(1, 1), padding=(1, 1),activation='relu'))
    net.add(gluon.nn.MaxPool2D(pool_size=2, strides=2))

    net.add(gluon.nn.Dense(50, activation="relu"))
    net.add(gluon.nn.Dropout(0.5))
    net.add(gluon.nn.Dense(10))
    net.add(gluon.nn.Dropout(0.5))

net.collect_params().initialize(mx.init.Xavier(magnitude=2.24), ctx=ctx)

softmax_cross_entropy = gluon.loss.SoftmaxCrossEntropyLoss()

trainer = gluon.Trainer(net.collect_params(), 'adam', {'learning_rate': .001})
def evaluate_accuracy(data_iterator, net):
    acc = mx.metric.Accuracy()
    for i, (data, label) in enumerate(data_iterator):
        data = data.as_in_context(ctx)
        label = label.as_in_context(ctx)
        output = net(data)
        predictions = nd.argmax(output, axis=1)
        acc.update(preds=predictions, labels=label)
    return acc.get()[1]
epochs = 20
for e in range(epochs):
    for i, (data, label) in enumerate(train_data):
        data = data.as_in_context(ctx)
        label = label.as_in_context(ctx)
        with autograd.record():
            output = net(data)
            loss = softmax_cross_entropy(output, label)
        loss.backward()
        trainer.step(data.shape[0])

    test_accuracy = evaluate_accuracy(test_data, net)
    train_accuracy = evaluate_accuracy(train_data, net)
    print("Epoch {0:<3}Train_acc {1:<16}, Test_acc {2:<16}".format(e+1, train_accuracy, test_accuracy))

結果


Epoch 1  Train_acc 0.930766666667  , Test_acc 0.9327          
Epoch 2  Train_acc 0.961966666667  , Test_acc 0.9613          
Epoch 3  Train_acc 0.973416666667  , Test_acc 0.9734          
Epoch 4  Train_acc 0.979916666667  , Test_acc 0.9797          
Epoch 5  Train_acc 0.9838          , Test_acc 0.983           
Epoch 6  Train_acc 0.985883333333  , Test_acc 0.9853          
Epoch 7  Train_acc 0.98785         , Test_acc 0.987           
Epoch 8  Train_acc 0.989316666667  , Test_acc 0.9868          
Epoch 9  Train_acc 0.990283333333  , Test_acc 0.9882          
Epoch 10 Train_acc 0.991466666667  , Test_acc 0.9893          
Epoch 11 Train_acc 0.991383333333  , Test_acc 0.9898          
Epoch 12 Train_acc 0.9937          , Test_acc 0.9912          
Epoch 13 Train_acc 0.993866666667  , Test_acc 0.9915          
Epoch 14 Train_acc 0.99315         , Test_acc 0.989           
Epoch 15 Train_acc 0.994433333333  , Test_acc 0.9915          
Epoch 16 Train_acc 0.994266666667  , Test_acc 0.9905          
Epoch 17 Train_acc 0.994433333333  , Test_acc 0.9916          
Epoch 18 Train_acc 0.9945          , Test_acc 0.9911          
Epoch 19 Train_acc 0.995466666667  , Test_acc 0.9915          
Epoch 20 Train_acc 0.995933333333  , Test_acc 0.9923 

MXNet-0.12.0公開(mxnet-ssdとneural-styleを使ってみた)

MXNet-0.12.0が公開された。
Windowsでもpipから最新版がインストール可能になっている。
mxnet-ssdとneural-styleを使ってみた。

環境

Windows10 Pro 64bit
GeForce GTX 1080 (CUDA 8.0, cuDNN 6.0)

openCVをインストール

  • こちら』からopencv-2.4.13.2をダウンロード
  • 解凍してパスを通す
D:\ProgramFiles\opencv\build\x64\vc14\bin

Anacondaに仮想環境を作成

conda create -n mxnet python=2.7 anaconda
activate mxnet
pip install opencv_python-2.4.13.2-cp27-cp27m-win_amd64.whl
pip install mxnet-cu80==0.12.0

MXNetのソースをダウンロード


以上で『incubator-mxnet-0.12.0/example/ssd』フォルダ内のPythonスクリプトが実行できた。
f:id:touch-sp:20171104135349p:plain:w400


また『incubator-mxnet-0.12.0/example/neural-style』フォルダ内のPythonスクリプトも実行できた。
f:id:touch-sp:20171104135359j:plain:w400

Darknet YOLOのハイパーパラメーター(学習率)

github.com
学習率が徐々に変化する仕様になっているらしい。

learning_rate=0.0001
policy=steps
steps=100,25000,35000
scales=10,.1,.1
  • [0 - 100] iteration learning_rate will be 0.0001 <= 指定した学習率
  • [100 - 25000] iteration learning_rate will be 0.001 <= 指定した学習率×10
  • [25000 - 35000] iteration learning_rate will be 0.0001 <= 指定した学習率×10×0.1
  • [35000 - ...] iteration learning_rate will be 0.00001 <= 指定した学習率×10×0.1×0.1

デフォルトはVOC-dataseに最適化されているらしい。
結局自分で最適な設定を見つけるしかない。
参考としてこのような記載がみられる。

If you have 10 000 images and 1 classes, 
then also you should decrease 20-fold 2 & 3 steps steps=100,1200,2000 
and you should train about 10 000 iterations.

Darknet YOLOの進化がとまらない

github.com

YOLOで『densenet201』が使えるようになった。

  • pre-trained weights 『densenet201.300』をダウンロード
  • cfg-file 『densenet201_yolo2.cfg』をダウンロード
darknet.exe detector train obj.data densenet201_yolo2.cfg densenet201.300

(おまけ)Yolo_markの使い方

github.com
To compile on Windows, open in MSVS2015 yolo_mark.sln and compile it.
1) If you have other version of OpenCV 2.4.9 then you should change version number in first 3 lines in main.cpp.
2) If you have OpenCV 2.4.13 then you should change pathes

  • 2-1) (right click on project) -> properties -> C/C++ -> General -> Additional Include Directories: C:\opencv_2.4.13\opencv\build\include

  • 2-2) (right click on project) -> properties -> Linker -> General -> Additional Library Directories: C:\opencv_2.4.13\opencv\build\x64\vc14\lib