読者です 読者をやめる 読者になる 読者になる

AKIBAko

自分のためのナレッジ的ブログ

Raspberry pi で MNIST

この前トレーニングした MNIST で手書き数字を分類してみたが全然ダメ
なんでじゃー

手書き数字は以下

0.jpg 1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg 7.jpg 8.jpg 9.jpg
f:id:minori-san:20161107231839j:plain f:id:minori-san:20161107231840j:plain f:id:minori-san:20161107231841j:plain f:id:minori-san:20161107231831j:plain f:id:minori-san:20161107231832j:plain f:id:minori-san:20161107231833j:plain f:id:minori-san:20161107231834j:plain f:id:minori-san:20161107231835j:plain f:id:minori-san:20161107231836j:plain f:id:minori-san:20161107231837j:plain

 
やったことを記載しておく

meanファイルを作成

$ cd ~/caffe
$ ./build/tools/compute_image_mean examples/mnist/mnist_train_lmdb examples/mnist/mean.binaryproto

mean.binaryproto から mean.npy を作成
https://github.com/BVLC/caffe/issues/290 を参考に下記のスクリプトを作成して mean.binaryproto を mean.npy に変換する

  • ~/caffe/examples/mnist/mean_bp2npy.py
import caffe
import numpy as np
import sys

if len(sys.argv) != 3:
print "Usage: python convert_protomean.py proto.mean out.npy"
sys.exit()

blob = caffe.proto.caffe_pb2.BlobProto()
data = open( sys.argv[1] , 'rb' ).read()
blob.ParseFromString(data)
arr = np.array( caffe.io.blobproto_to_array(blob) )
out = arr[0]
np.save( sys.argv[2] , out )

スクリプトを実行

$ cd ~/caffe/examples/mnist
$ python mean_bp2npy.py mean.binaryproto mean.npy

mean.npy ができたので、推論してみる
~/caffe/python/classify.py を使っても良いのだろうが、python の勉強のために下記スクリプトを作成

  • ~/caffe/examples/mnist/mnist_iter.py
#!/usr/bin/python

import sys, os

prototxt = sys.argv[1]
model    = sys.argv[2]
mean     = sys.argv[3]
imgs     = ['0.jpg', '1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg', '9.jpg']

if os.path.exists(prototxt) == False or os.path.exists(model) == False or os.path.exists(mean) == False :
    print("File does not exist")
    sys.exit()

import cv2
import caffe
import numpy as np

datas = []
net    = caffe.Classifier(prototxt, model, mean=np.load(mean), image_dims=(28,28))

for img in imgs :
    datas.append(caffe.io.load_image(img, color=False))
outdt  = net.predict(datas)

for i in range(0, len(imgs)) :
    sortdt = sorted(range(len(outdt[i])), key=lambda x:outdt[i][x], reverse=True)
    print '--------- [%s] ---------' % (imgs[i])
    for j in sortdt[0:3] :
        score = outdt[i][j]
        if score != 0 :
            print '%d.jpg - %f percent' % (j ,score*100)
    print ''

スクリプトの実行

$ cd ~/caffe/examples/mnist
$ python mnist_iter.py lenet.prototxt lenet_iter_10000.caffemodel mean.npy 

全然分類できていない
スクリプトが悪いのか、画像が悪いのか、やり方が悪いのか。。

--------- [0.jpg] ---------
5.jpg - 100.000000 percent

--------- [1.jpg] ---------
5.jpg - 100.000000 percent

--------- [2.jpg] ---------
5.jpg - 100.000000 percent

--------- [3.jpg] ---------
5.jpg - 100.000000 percent

--------- [4.jpg] ---------
5.jpg - 100.000000 percent

--------- [5.jpg] ---------
5.jpg - 100.000000 percent

--------- [6.jpg] ---------
5.jpg - 100.000000 percent

--------- [7.jpg] ---------
5.jpg - 100.000000 percent

--------- [8.jpg] ---------
5.jpg - 100.000000 percent

--------- [9.jpg] ---------
5.jpg - 100.000000 percent

学習回数も頑張って1万回しても結果変わらないし、mean を消しても結果がぼんやりするだけで全然ダメだった
トレーニング時の accuracy ってなんじゃい