皆さんがやられているtensorflowでの顔認識。これでとりあえず家族4人の写真を元にラズパイで認識できるようにしようと取り組みましたが、なかなかどうして色々なところでつまずきました。
その備忘録。
#環境
Raspberry Pi 3 Model B
および今回の各種バージョンは以下のとおり
python3 3.5.3
tensorflow 1.1.0
opencv 3.2.0
#参考にしたページその1
Raspberry Pi上でTensorFlowで簡単にディープラーニングを試せるツール「tensorflow-pi」でロボホンの幻の顔認識機能に挑戦してみた
まずはこのページを参考にさせていただきました。
なお、私はPython3にてtensorflow他をインストールしています。
特に「顔の切り出し」と「ラベル作成」は大変役に立ちました。深謝!
その後、「学習」の章にあるプログラムを実行!
ところが・・・
私の環境では以下のようなエラーが出て先に進みません。
Traceback (most recent call last):
File "train.py", line 87, in <module>
logits = nn.inference(images_placeholder, keep_prob)
File "/home/pi/tensorflow-pi/cnn.py", line 57, in inference
W_fc1 = weight_variable([FC_LAYER_SIZE*FC_LAYER_SIZE*64, 1024])
File "/home/pi/tensorflow-pi/cnn.py", line 21, in weight_variable
initial = tf.truncated_normal(shape, stddev=0.1)
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/random_ops.py", line 172, in truncated_normal
shape_tensor, dtype, seed=seed1, seed2=seed2)
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/gen_random_ops.py", line 336, in _truncated_normal
seed=seed, seed2=seed2, name=name)
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/op_def_library.py", line 590, in apply_op
param_name=input_name)
File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/op_def_library.py", line 61, in _SatisfiesTypeConstraint
", ".join(dtypes.as_dtype(x).name for x in allowed_list)))
TypeError: Value passed to parameter 'shape' has DataType float32 not in list of allowed values: int32, int64
tensorflowのインストールが成功していないのでは無いかとかで、以下を参考に
TensorFlowでDeepLearningを学習する ~MNISTでHello, World!~
hello Worldを試してみたり、
サンプルのMNISTを動かしてみたりして、tensorflowがちゃんと導入されていることは確認
そこで、以下のサイトのコードを試してみました
#参考にしたページその2
[TensorFlowでアニメゆるゆりの制作会社を識別する] (http://kivantium.hateblo.jp/entry/2015/11/18/233834)
この中の「コード全体」とあるのを使わせてもらいました。
実は、先の参考にしたページその1にあったコードと大きな違いは無いようですが、その1がいくつかのファイルに分けていたのに対し、こちらは一つにまとまっているので、追いかけやすいというのはありました。
ただ、その1で作ったデータ用のディレクトリーをそのまま使いたいので、最初の部分の
flags.DEFINE_string('train', 'train.txt', 'File name of train data')
flags.DEFINE_string('test', 'test.txt', 'File name of train data')
flags.DEFINE_string('train_dir', '/tmp/data', 'Directory to put the training data.')
を
flags.DEFINE_string('train', '/tmp/tensorflow_pi/train.txt', 'File name of train data')
flags.DEFINE_string('test', '/tmp/tensorflow_pi/test.txt', 'File name of train data')
flags.DEFINE_string('train_dir', '/tmp/tensorflow_pi/train_data', 'Directory to put the training data.')
に変更しました。
順調に動くように見えましたが・・・いくつかエラーが
①SyntaxError: invalid syntax
この参考にしたコードはpython2用のようですので、print文でエラーがでました。
print "step %d, training accuracy %g"%(step, train_accuracy)
を
print ("step %d, training accuracy %g"%(step, train_accuracy))
に
②IndexError: index 4 is out of bounds for axis 0 with size 4
tmp[int(l[1])] = 1
IndexError: index 4 is out of bounds for axis 0 with size 4
これはNUM_CLASSESを書き換えなかっただけのミスでした。今回は家族4人+その他でNUM_CLASSES =5にしなければいけなかったということ(汗)
③AttributeError: module 'tensorflow' has no attribute 'scalar_summary'
これはこのページが参考になりました。
TensorFlow の "AttributeError: 'module' object has no attribute 'xxxx'" エラーでつまづいてしまう人のための移行ガイド
tensorflowのバージョン変更に伴い、記載のコードを変える変更があるらしい
例えば
tf.scalar_summary("cross_entropy", cross_entropy)
を
tf.summary.scalar("cross_entropy", cross_entropy)
に
④TypeError: object of type 'int' has no len()
ここに答えが!
Python - TypeError: 'float' object cannot be interpreted as an integer
for i in range(len(train_image)/len(FLAGS.batch_size)):
を
for i in range(len(train_image)//FLAGS.batch_size):
だって。なんじゃそりゃ。