空飛ぶ気まぐれ雑記帳

主に趣味とかプログラミングについて扱います。

CNTKがガチでクソだったと思ってたらいつの間にかそうでも無くなってた話

はじめに

前回の記事を書いている最中に思い出したのだけれども、CNTKがガチでクソだった話を書こうと思ったらいつの間にかそうでも無くなってた話。

近況と生存報告と人気ページについて - 空飛ぶ気まぐれ雑記帳

そもそもCNTKって

CNTKとはMicrosoft社が提供しているオープンソースディープラーニングのライブラリで、マルチGPU性能が非常に高いことと、複数台のPCで実行可能なことを売りにしているディープラーニングライブラリです。
どれくらいマルチGPU性能が高いかと言うと、そもそもマルチGPUに対応していないTheanoは置いておいて、Tensor FlowやTorch、Caffeの倍近い性能を持つ他、2台のPCに各4基、合計8基のGPUを搭載して計算すると、他のライブラリよりも圧倒的に早いZEってライブラリです。
さらに、Microsoftが出しているだけあって、Windows対応を謳っている数少ないディープラーニングのライブラリでもあります。

github.com

CNTKのどこが糞だったん

これはあくまでもメジャーリリース当時の話です

私も上の説明を見た時はなんて素敵なライブラリなんだと、目を輝かせたものです。
ただ、それも幻影でした。

最初、Readmeとかよく読まず、とりあえず"cmake --build . --target Debug"とかでVisual Studioを起動せずに適当にビルドしようとしてたのですが、どうも成功せず。
とりあえず、slnファイルを開いてVisual Studioからビルドすかと思った矢先。なんとプロジェクト名に括弧書きで「Only Visual Studio 2013」(だったかな)と書かれていたのです。
それで、詳しく調べてみると、なんとこのCNTK、Visual Studio 2013にしか対応していないガチクソだったのです。

だったのですが…

今日、この記事を書こうとgithubを見てみると、最新のバージョンだとVisual Studio 2015に対応しているそうです。

github.com

という訳で一転して、CNTKは神ライブラリかもしれません。
また、暇になったら記事を書くかもしれませんが、、、いつに成ることやら

近況と生存報告と人気ページについて

先月からクソ忙しくて、録に更新してこなかったけどいい加減更新しようと思いいたった。のだけれども、どうも記事にできる内容がない。
いや、この三ヶ月、何もしてこなかった訳ではない。一応、研究成果の方はしっかり出して、それ相応の評価を頂戴した。
ただ、このブログに書けるような内容が、どれも進捗半端で紹介しかねるという状況だった。例えば、Webアプリ作った話とか、tensor flowのWindows版をインストールして使ってみた話とかCNTKがクソだった話とか、DLIBでDCGANを実装しようとして死にそうになってる話とか、もう色々あるんだけど……。
それで、とりあえず。はてブの編集ページへ飛ぼうとはてブのトップを開くと、右上のアカウント名のところに赤い通知が来ていた。

PV数が100を超えました

これを見た瞬間「はぁ?」となり、さらにPV数を確認して「……」となった。なんと、月間PVが100と言わず404になっていた。これまで、と言っても最後に更新したのは12月の話だが、その時は月間PV数なんて50を超えれば良いほうだった。それがほったらかしにした2ヶ月の間に何があったのかという話だ。

それで、記事の人気順を出して見るとその原因が何となく分かった。

総アクセス数に占める割合 ページ名
23% C++でDNNが使えないなんてあるわけないよ in Windows
20% CUDA 8.0がいつの間にかリリースされててVisual Studio 2015 Update 3でも使えるようになっていた話
11% DLIBでCNNを使ってみた in Windows
11% DLIBのコンパイル For Debugビルド
6% DLIB with CUDAでCNNを使ってみた in Windows
4% Windowsffmpegを使ってみた話
3% /category/機械学習
2% /category/dlib
2% GLEWをVisual Studio 2015とCMakeでビルドするときの注意点
2% ブログトップ
2% OpenGLでズームを実装する方法
1% GPGPUって色々あるけど結局どれがいいの
1% SFINAEやテンプレートの部分特殊化で気をつけたいこと
1% Visual Studio で拡張子のないC++ヘッダーをIntelli Senseで表示する方法
0% PythonでDLLを使う時の話
0% /category/深層学習
0% Visual Studioユーザーに送るCMakeテクニック☆ (1)
0% cygwinでFindOpenCVするとエラーになる
0% Visual Studioユーザーに送るCMakeテクニック☆ (2)


あー、ただのディープラーニングか。実際、「C++ DNN」とか「DLIB DNN」でGoogle検索を掛けると、ビックリするほど上位に出てくるから、やはりそういうことらしい。

とりあえず、今後もディープラーニングの話は書いていくつもりですのでよろしくお願いします。あ、それとCMake絡みの記事も読んでくれてもええんやで。

Visual Studioユーザーに送るCMakeテクニック☆ (3)

いやーこれでもう第三回ですよ。
なんとか自分で設定した週一更新のノルマを達成できそうですねー

それはさておき、今日は(1)と(2)の続きにあたるはなしで、(2)はCMakeListsを対象としたものでしたが、今回はそれ以外のヘッダーファイルやソースファイルを対象としたものです。
今回は少し長いので、gistに上げました。

gist.github.com

かなり前に書いたためちょいちょいとお恥ずかしい部分(ぶっちゃけ汎用で作ればいいのになぜか専用品になってるあたりマジで…)もありますが、普通に使えるはずです。
下記は実際にこれを使い方です。実行したCMakeListsの保存されているディレクトリをルートとしてそのファイル内の全てのファイルについてフィルタリング&ファイルパスを取得できます。

使い方としては>|cmake|RecursiveGroupingWithFileSet(<探索するルートディレクトリ> <探索するディレクトリ一覧> <ヘッダーファイルの一覧が保存される変数名> <ソースファイルの一覧が保存される変数名>)|

なんかデスマってたからレムちーのボクセルキャラクターを描いてみた

学会前のセルフハンディキャッピングの一環としてなぜかボクセルキャラクターを作りたくなったのでRe:ゼロのレムを作ってみました。
参考は下記、3つのサイトです。

CHARACTER|TVアニメ『Re:ゼロから始める異世界生活』オフィシャルサイト
ultimei.hatenablog.com
github.dev7.jp

一番上は参考画像。まあRe:ゼロのアニメ版公式サイトですね。
それから、真ん中は基本的な書き方、一番下はテンプレートを拝借しました。

それで、実際に書いていて一箇所だけ詰まったのが、パレットの設定です。

パレットからいらない色を選択して、左下のHSVというペーン内で設定することができるのですが、
HSVというのはスライダーの部分のパラメータだけで、スライダーの下のテキストボックスはRGBなので、手打ちで色を入力する際は注意が必要です。

f:id:elda27:20161211005903p:plain

それ以外は特に詰まること無くスイスイと書くことができました。
もともと絵心がない上に製作時間が1時間なので出来具合はお察しください。

正面
f:id:elda27:20161211011721p:plain

頭上
f:id:elda27:20161211012821p:plain

側面
f:id:elda27:20161211012818p:plain

背面
f:id:elda27:20161211012824p:plain

パンツは未実装
f:id:elda27:20161211012815p:plain

ガラス調
f:id:elda27:20161211011728p:plain

メタル調
f:id:elda27:20161211011731p:plain

それでも、自分で作ったからか何となく愛着が湧いちゃって。もうね、どれ位かって言うとこんな記事を作っちゃうくらいですよね。

とりあえず、今後も作るかは分からないけれども、課題としてはもう少し凝ってみたいので、より大きなサイズのボクセルモデルを作ってみたいですね。

追記:
投稿してからすぐに気づいたのだけれども、なんかメイド服なのにしっくりこないなと思っていたら、カチューシャ(?)の存在を忘れていたので慌てて付け足しました。

f:id:elda27:20161211014917p:plain

Visual Studioユーザーに送るCMakeテクニック☆ (2)

Visual Studioユーザーに送るCMakeテクニック☆ 、第二回目です。
今回は、昨日の記事で説明したフィルタリング機能を使って、CMakeファイルをVisualStudioから簡単に見えるようにしようって話です。
具体的にはどういうことかと言うと下記のように各ディレクトリに配置されているCMakeListsと*.cmakeファイルをディレクトリ構造をフィルタ名としたCustomプロジェクトを作成します。

f:id:elda27:20161130000643p:plain

下記が実際のソースコードです。

FILE(GLOB_RECURSE CMAKE_LIST_FILES CMakeLists.txt *.cmake)

FOREACH(file ${CMAKE_LIST_FILES})
  FOREACH(dir ${CMAKE_CURRENT_LIST_DIR})
    FILE(RELATIVE_PATH relative ${CMAKE_CURRENT_LIST_DIR} ${file})
    
    STRING(REGEX MATCHALL "[^/]+" filters "${relative}")
    LIST(LENGTH filters output_length)
    MATH(EXPR iteration "${output_length} - 2")
    
    IF(${iteration} LESS 0)
      continue()
    ENDIF()
    
    SET(group_string "")
    FOREACH(i RANGE 0 ${iteration})
      LIST(GET filters ${i} g)    
      set(group_string "${group_string}\\${g}")
      #MESSAGE(${i},${output_length}:${g})
    ENDFOREACH()
    SOURCE_GROUP("${group_string}" FILES ${file})
  ENDFOREACH()
ENDFOREACH()

ADD_CUSTOM_TARGET(CMakeLists SOURCES ${CMAKE_LIST_FILES})
<||

Visual Studioユーザーに送るCMakeテクニック☆ (1)

はじめに

今月忙しすぎてブログの更新が滞っていたので、暫くごまかしのためにCMakeのテクニックを紹介します。
なお、未だに忙しくて録に記事が書ける状態ではないので記事は分割してますが、悪しからず。

決して当初掲げていた週一更新の分を一気に放出しようとしているわけではありません

それはさておき、今日紹介するのはVisual Studioが有するフィルタリング機能をCMakeから利用するにはどうすれば良いのか?
という話です。

フィルタリング機能って

Visual Studioでプロジェクトを右クリックしてでてくるポップアップメニューの Add > New Filterで出てくるアレです。
デフォルトでも、Source filesやHeader files(日本語版だとソースファイルとヘッダーファイルかな?)というものが設定されているかと思います。

このフィルタリング機能ですが、これがないとソースファイルの数が100近くなると非常に見づらくなるので、どっぷりとVisual Studioを使っている方は間違いなく利用しているかと思います。

これをCMakeを使ってソリューションファイルを生成するとデフォルトのSource filesやHeader filesのフィルタリングすらないため、非常に不便ですよね。

フィルタリングを有効にする

下記コマンドを実行すればフィルタリングが有効になります。
なお、デフォルトでSource filesとHeader filesが設定され、振り分けられます(久しくデフォルトの挙動を確認していないので不安ですが…)。

SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) 

もし、これをONにしない場合、以下で説明している設定をしても反映されないので注意しましょう

ソースファイルをフィルタリングしたいとき

ソースファイルをフィルタに分類する場合、下記コマンドを実行すればOKです。

SOURCE_GROUP("任意のフィルタ名" FILES <ソースコードのファイルパス> ...)

なお、もしフィルタをネストする場合、例えば Source files > hoge > huga > hage.cpp のような階層構造を持たせたい場合、フィルタ文字列をバックスラッシュ2つ(文字列内の場合バックスラッシュをエスケープする必要がある?)並べる必要があります。

SOURCE_GROUP("Source files\\hoge\\huga" FILES hage.cpp)

のようになります。

プロジェクトをフィルタリングしたいとき

プロジェクトの場合ソースコードとは違う方法でフィルタリングを行います(フィルタリングのフォーマットは同じ)

SET_TARGET_PROPERTIES(<プロジェクト名(ターゲット名)> PROPERTIES FOLDER "任意のフィルタ名")

ここで注意しなければならないのが、ターゲットを対象としてフィルタリングするため、add_executable or add_library or add_custam_target etc... でターゲットを生成した後に呼び出す必要があるという所。

おわりに

ざっくりとCMakeを使ったフィルタリングの使い方を説明しました。
次回以降も個人的に知ってて便利だな―と思ったCMakeの使い方を説明していくつもりです。

なお、全五回くらいになる予定していますそんなにネタがあるか微妙ですが

Visual Studio で拡張子のないC++ヘッダーをIntelli Senseで表示する方法

Qt+CMakeを使いつつVisual Studioを使っていると拡張なしのヘッダーファイルをインクルードしたい時がある(実際には拡張し有りのヘッダーファイルをインクルードすれば事足りるので特に問題にはならないが…)。
その場合、なぜかIntelli Senseでは標準ライブラリ以外の拡張子無しのヘッダーファイルが候補として表示されることはない。

本当になぜかは分からないが…

それはさておき、解決方法。
Tools > Options... から設定画面を開く。
それから TextEditor > FileExtension から拡張子に関する設定画面を開く。
その後,「Editor:」と「Map extensionless files to:」をMicrosoft Visual C++に変更して、チェックボタンをチェックしてからOKボタンをクリックして設定完了。

f:id:elda27:20161129232257p:plain