2017年10月16日

c++でtensorflowの学習モデルを構築する方法

C++で、 tensorflowの学習モデルを構築して、保存する
という事を実現したいと思います。

基本は C++ API | TensorFlow に書いてあるんですが、 これだけでは本当にやりたいことには全然届きませんでした。

実行ファイルはbazelで作ります。
しかしまず、bazelを実行する前に ./configure を実行しておくようにとの事です。

bazelはBUILDでルールを記述しています。

BUILDファイルは /tensorflow/cc/BUILD に在るはずです。 ここに、サンプルは全部書いてありますが
tf_cc_binary(
name = "tutorials_example_trainer",
srcs = ["tutorials/example_trainer.cc"],

これが、こう対応します。
bazel build -c opt //tensorflow/cc:tutorials_example_trainer

ファイルは、 tutorials/example_trainer.cc に在りますが、name と srcs がこのように違っていたりします。

これで、実行ファイルは
bazel-bin/tensorflow/cc/tutorials_example_trainer
に作成されると思います。


この example_trainer.cc が、機械学習のサンプルコードです。
しかし、重大な足りない情報としては、モデルの保存方法が書かれていない事です。

その方法やサンプルが、どこにも、一切書かれていなかったのですが、ソースコードの方を見に行ってようやくわかりました。

WriteBinaryProto これを使うのです。

どうやって使うのか実例を示しますと
example_trainer.ccの142行目辺りに

WriteBinaryProto(tensorflow::Env::Default() , "model_path" , def);

このように書きます。
これで、 model_pathにモデルが出力されます。


読み込む時はこうです。
ReadBinaryProto(tensorflow::Env::Default(), "model_path" , &def);


続きを読む

tak_tak0 at 22:45コメント(0)サーバ この記事をクリップ!

2017年10月08日

MobileNetsと、スマートフォンで機械学習に関する説明






このMobileNetsは、基本的にモデルを提供しているだけです。
後は、そのモデルに関する論文だけです。

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, Hartwig Adam   Google
arXiv preprint arXiv:1704.04861 (2017).

モバイル機器の計算能力が高くなってきたので、インターネット接続に関係なく、スマートフォンの計算力、および電力だけで、機械学習モデルを素早く実行したいです。
MobileNetsはTensorFlowで利用される、リソース制約を満たすためにパラメータ化されたモデルです。
3. MobileNet Architecture
3.1. Depthwise Separable Convolution
MobileNetモデルは、標準的な畳み込みを、深度畳み込みと因数分解畳み込みと呼ばれる1x1の畳み込みに分解する、因数分解された畳み込みの一種である深度分離可能な畳み込みに基づいています。
MobileNetsの場合、深さ方向畳み込みは各入力チャンネルに単一のフィルターを適用します。


深さ方向に分離可能な畳み込みは、これを2つの層、すなわちフィルタリングのための層と、組み合わせのための層に分割する。
この因数分解は、計算量とモデルサイズを大幅に削減する効果があります


入力 M
出力チャンネル数 N
カーネルの空間次元 Dk
入力空間幅と高さ Df
だった場合、 通常の計算量は  Dk・Dk・M・N・Df・Df となる

MobileNetでは、深さ方向に分離可能な畳み込みを使用して、チャンネル数とカーネルのサイズとの間の相互作用を破る。

.............














MobileNetsのモデルは、  MobileNet_v1 に在ります。
普通は、一番良いMobileNet_v1_1.0_224を使えばいいと思います。
python3 /models/research/slim/export_inference_graph.py \
--model_name=mobilenet_v1 \
--output_file=/tmp/mobilenet_v1_224.pb

解凍したモデルをこうやって pbに変換しなければAndroidでは使えないはずです。

そのファイルでapkをbuildすればいいはずです。





続きを読む

2017年10月01日

DeepLearningアプローチでの顔画像からアニメーション制作






Large Pose 3D Face Reconstruction from a Single Image via Direct Volumetric CNN Regression
Aaron S. Jackson, Adrian Bulat, Georgios Tzimiropoulos   The University of Nottingham, UK
Vasileios Argyriou   Kingston University, UK
arXiv preprint arXiv:1703.07834 (2017).

画像から3D顔モデルの再構成はコンピュータビジョンの非常に難しい問題です。
既存の研究では、同じ被写体から複数の画像が利用できるものと想定されていますが、
本研究では、2D画像と3D顔モデルのデータセットをCNNで訓練することによって、1枚の顔画像だけから汎用的にモデルを構成することに取り組む。................
3. Method
3.1. Dataset

未知の画像にこの方法を適用することが目標あるので、訓練およびテストセットを形成するために[Face alignment across large poses: A 3d solution.]でデータセットを作成した。

このデータは、Face Alignment Across Large Poses: A 3D Solution を参照すれば分かります。
................

3.2. Proposed volumetric representation


我々の目標は、CNN回帰を介して対応する2D画像から各顔面スキャンの3D頂点の座標を予測することです。
既存研究が指摘しているように、標準のL2損失を使用してベクトルとして連結されたすべての3Dポイントを直接回帰すると、各3D頂点の単一の正しい値を予測する必要があるため、学習が困難になることがあります。
さらに、このようなアプローチでは、すべてのスキャンを固定次元のベクトルに補間する必要があります。
これは、本研究の方法では不要な前処理ステップである。
この学習問題を軽減するために、2Dから3Dへの画像分割の1つとして、3次元顔再構成の問題を再定式化することを提案します。

3D空間を 3D vertex {f, h, d}に離散化することにより、各3D顔面スキャンを3DバイナリボリュームVwhdに変換する。
3D顔面スキャンで囲まれたすべてのポイントに1の値を割り当て、それ以外の場合は0を割り当てます。
つまり、Vwhdはvertex {f, h, d}のground truthです。
{f, h, d}は顔の3次元容積表示に属し、それ以外の場合には0(すなわち、それは背景に属する)である。
変換は図2に示されています。プロセスが2D画像と完全に整列したボリュームを作成することに注目してください。
空間的アラインメントの重要性は、セクション5でより詳細に分析される。
ボリュームサイズの関数としてランダムに選択された顔面スキャンの離散化によって引き起こされた誤差を図3に示す。
最先端の方法の誤差が数mm程度であることを考えると、192×192×200の離散化は無視できる誤差を生じると結論づける。


具体的なモデルのパラメータ(形)は書いてないように思えます。

砂時計型(hourglass)ネットワーク、residual module、 3D Morphable Model (3DMM) と言った要素技術の組み合わせで一枚の顔画像から3Dモデルを構成できるCNNネットワークを実装できたと言う事でしょうか?
後は、2D画像と3Dモデルの対応データセットでしょうか

Volumetric Regression Network

(a)VRNは、入力としてRGB入力を受け取り、3DMMへの対応をバイパスする3Dボリュームを直接回帰する。
各矩形は、256個特徴のresidualモジュールです。
(b)VRN - Guided architecture firstsは、3Dランドマークの2D投影を検出し、これらを元の画像と積み重ねる。
このスタックは、ボリュームを直接回帰する再構成ネットワークに供給されます。
(c)VRN - マルチタスクアーキテクチャは、3D顔面と疎な顔面ランドマークのセットの両方を回帰させる。


3.3. Volumetric Regression Networks
Volumetric Regression Network (VRN).

本研究のアーキテクチャは完全畳み込みネットワークの拡張である砂時計ネットワークに基づいている。
2つの砂時計モジュールが中間層の管理なしで一緒に積み重ねられている。
入力はRGB画像であり、出力は192×192×200の実数値です。

ネットワークは、畳み込みレイヤのセットが最初に固定ディメンションの表現を計算するために使用される符号化/復号構造を有する。
この表現は、空間領域にさらに処理され、入力画像と出力との間の空間的対応を再確立する。

................

3.4. Training


トレーニング中に、各入力サンプル(顔画像)とその対応するターゲット(3Dボリューム)にランダム増強(反転と回転など)を適用しました。
................

これで3Dモデルは作れます。続きを読む

tak_tak0 at 06:25コメント(0)研究 この記事をクリップ!
adsense
Categories
サイト内検索
にほんブログ村 科学ブログへ
にほんブログ村

amazon
Profile
Archives
blogchart
QRコード
QRコード
Recent Comments
o