頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


TensorFlowのtfrecordファイル内のデータ数を数える

ちょっと感心したのでメモ。
TensorFlowで自作のデータセット(tfrecord)を作成したはいいけど、正確なデータ数を数えるの忘れてたってこと、あるよねえ。ねえか。

いざ、自力でやろうとすると、、、あれ?どうすんの?となった。
学習時のコードを見ると、データの中から指定した数だけ持ってきて学習に使う、という処理なので実は正確な数がわからなくても問題ない。どうするんだろうと思って調べたら、、、あるやん!

Obtaining total number of records from .tfrecords file in Tensorflow - Stack Overflow

↑おかげで一撃! tf.python_io.tf_record_iterator(fn) なんて便利なのがあったのね!!
スポンサーサイト






matplotlibでグラフを描こうとするとエラー

Pythonで計算した結果をグラフにしようとしたらエラーが出て困った、というお話。

QObject::connect: Cannot connect NavigationToolbar2QT::message(QString) to (null)::_show_message()

ってエラーが出る。なぜだ?matplotlibでグラフって前にもやってるのに、、、?
そのコードを探して持ってきて実行させてもやはり同じエラーが出る。
エラーメッセージで検索するとバージョンが古いんじゃね?という記述を見たので、自分の環境を調べてみた。

import matplotlib

print(matplotlib.__version__) # 1.5.1
1.5.1で古いんかな?pip install matplotlib してみるけど
Requirement already satisfied: matplotlib
てな感じで最新版ダウンロードしてるようにも見えないし、、、

以前やったコードを「そのまま」実行させたらちゃんと動いた!

matplotlibによるグラフ

つまり、、、そういうことか!

PyQtによるメニュー画面

↑今はこんな感じのPyQt5使ったメニュー画面を経由したところでmatplotlibでグラフ表示させようとしてる。
どうやらそれがダメらしい。メニュー画面を経由しなければいけた。

PyQt5 Matplotlib – Python Tutorial
↑こんな感じでPyQtのメインウインドウにグラフを描くのはできるみたいなんだけど、描きたいのはサブウインドウに、なんだよなあ、、、うーん。
何かやり方はあるのかもしれないけど、、、
結局下のようなおきまりのコードを追加して直接このファイルを実行するようにした。

if __name__ == '__main__' :
    showGraph()
↑Pythonを勉強し始めた頃には何の役に立つの?と思っていたけど、大助かりだわ。


SceneKitでシェーダーを適用したのに一部しか反映されない

Blenderで作成したオブジェクトをdaeファイルで出力→SceneKitで使おうとしたけどうまく認識できていない?って妙な不具合に悩んでいた。まあ同じような症状にはまる人もいないと思うけど、とりあえず書いておく。

Blenderでオブジェクト作成

↑Blenderではこんな形状。これで1つのオブジェクト。ボーンが設定されてるんだけど本筋には関係なかった。
これをdaeファイルで出力。

SceneKitでdaeファイルの表示

↑SceneKitで使う。ここまではいいんだけど、このオブジェクトにシェーダーを適用すると、、、

SCNNodeにシェーダー適用

↑片側しか適用されない?なんでや?

Xcodeでdaeファイル確認

↑もしかして二つのSCNNodeオブジェクトになってんの?と思い、Xcode上でオブジェクトの構成を確認しても1つのオブジェクトみたい。
いろいろ試したり、調べてたりしたんだけど、daeファイルの中身を見てたらマテリアルが二重に設定されてることに気付いた。

Blenderでのマテリアル設定

↑Blenderで確認すると確かに設定したつもりはないんだけど二つある。片方を削除してやったら、、、

SCNNodeにシェーダー適用(修正後)

↑いけた!そういうことだったのか。
確かに、コードでも最初のmaterialにだけシェーダを適用するように書いてたわ。
{
    SCNGeometry *geometry = node.geometry;
    SCNMaterial *material = geometry.firstMaterial;

    SCNProgram *program = [SCNProgram program];
    program.vertexFunctionName = @"myVertex";
    program.fragmentFunctionName = @"myFragment";
    material.program = program;
}



  TopPage  



Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.