CNTK; CNNのConv Layer数、ラベル数、モデル利用時の前処理と後処理2020年01月21日 15:21

CNTKのCNNを用いた画像識別。少しずつ、コツを掴みつつあるのか。

1.Conv Layerの数

Conv Layer 3

Conv Layer数3。64x64x1を8x8x16に持っていく。
学習が進むと、大きくLossが下がる箇所がある。ここででは、14000件ほど進んだところ。

Conv Layer 4

Conv Layer数4。64x64x1を8x8x32に持っていく。精度向上や、より多くのラベル数に対応できるようにとの発想だったが。大きくLossが下がる箇所は、25000件ほど進んだところ。

ラベル数は15。2つのCNNの間に、精度の有意な差は見られず。ただ、学習進度が遅くなっただけ。パラメータは他にもいろいろあるので、一概には言えないが、必要以上にモデルを複雑化するのは意味がなく、かえって有害にもなり得る。

2.ラベル数

ラベル数は少ない方が、よい成績を得られそうだが、そう簡単でもない。
今回は、漢字の部品を相手にしているが、「木」に加えて、「大」を加えた方が、精度が上がったりする。データのバリエーションを増やした方が、違いがわかるようになる側面がある。対象のデータの特性次第。

3.モデル利用時の前処理と後処理

漢字の部品単体の認識がそこそこできるようになったところで、対象を広げる。
この時、
・画像の切り出し
・不要な部分の刈り取り
・画像サイズの拡大による正規化
などの前処理を施さないと、結果はノイズだらけに。

圧右下

「圧」の例。画像の右下を切り出し、認識させると、そこそこの精度で「土」を識別する。

圧全体

文字全体だと、「田」と識別。

圧左半

左半分だと、「日」と識別。少し遠目で見ると、そうか、と思えなくもない。
こういった一連の結果を、どう判定して、不適切なものを取り除くかが課題。

圭上半

「圭」の例。画像の上半分を切り出し、「土」を識別。

圭下半

下半分も、「土」を識別。

圭全体

文字全体だと、「王」と識別。横棒を一本無視すれば、そう見えないこともない。
総じて人の識別と比べるとプリミティブなもの。

結果には、まだまだノイズが多い。対処としては、次のようなものか。
・学習データの見直し(形状やバリエーション)
・部品種(ラベル)の追加
・画像の前処理の改良
・結果からのノイズの除去方法の検討
実用に耐えるものができるかどうかは、五分五分。

こんな感じで、機械学習において、モデル構築は作業の一部。目的とする結果を得るには、やることがまだまだある。

機械学習の技術者を育てる、と巷でいうが、どのあたりの技術が課題となっているのか。地味で面倒な作業も多く、十把一絡げで論じてはいけないような。

なお、識別アプリは、UWPでCNTKのライブラリはCPUを使う。画像を69の枠に分割して、処理するが、かなりの時間を要する。エッジ側にもAIアクセラレータが必要、とされるのも道理かと。

UWPでCNTKを利用するためのC++ WrapperのBuildエラー2019年12月27日 11:42

やはり、WPFでは、アプリは作り難い。ということで、諦めが悪いようだが、UWPでCNTKのモデルを利用するためのC++のWrapperを書く。コードは、MSのサンプルをお手本に手を入れる。最近のC++のコードはなかなか新鮮。

リンクエラー

IDEのコードチェックは通ったところで、Buildしてみると、多量のリンクエラー。

配布されているCNTKの開発パック内のサンプルを取り出してBuildしても同じ症状。自分のコードのせいではないようす。よく見ると、エラーメッセージ中に、プラットフォームがx64で、VS2017のみサポート、との文言。

VisualStudio 2017をインストールしてBuildすると、あっさりと通過。

ツールセット2019

C++のプロジェクトで、プラットフォームツールセットがVS2019(v142)というのがいけない。

ツールセット2017

VS2017(v141)にすれば、リンクが通る。後で試すと、VS2019でも、ここを設定すればBuild可。

UWPでCNTKのモデルを利用する評価アプリ

起動時にランタイムを読み込む分、少しもっさりするが、無事、UWPでCNTKのモデルを用いるアプリが動く。これでこの先、手を入れやすい。

プログラムで生成したデータで学習してみると2019年12月26日 07:39

個人レベルでは、機械学習のデータが用意できないなら、作ってしまおう、とプログラムで生成するとして、それは、使い物になるのか。

学習データ生成アプリ

漢字を構成する要素を、乱数をふんだんに配置して、プログラムで生成。これなら万単位のデータも用意できる。Win2DのCanvasPathBuilderで書いていく。

木、ゴシックの評価

試しということで、CNTKで生成したラベル数が5のCNNのモデルを読み込み、検証。Windows MLが使えなかったので、アプリは、WPFで作成。C++のWrapperを用意してUWPにする手もあるのだけど。

ゴシックフォントの「木」を認識。評価関数は、学習した内容から、それである確率を数値化する。これを、右の一覧に表示。最大値のものを正答とする。

土、ゴシックの評価

ゴシックフォントの「土」を認識。そこそこ。

土、明朝の評価

明朝フォントの「土」を認識。「土」と「木」の判定数値が接近している。学習データがゴシック様のものであることが影響するか。

他、「口」、「氵」などは、正しく認識。ただし、「亻」は、誤認識。形状が単純で不十分な学習に終わったか。

まだ、なんともいえないが、漢字フォントのようなかっちりしたものには、プログラムで生成したデータでもそこそこいけそうな感触。もう少し、先に進めてみる。

CNTKで生成したモデルをWindows MLで使用したいが2019年12月23日 09:08

自前のデータによる学習も少し進捗してきたところで、できあがったモデルが使い物になるか試そうと、Windows MLでアプリを用意しようと試みる。

ONNXフォーマットへの変換

Windows MLで取り込めるのは、ONNXフォーマットのモデル。CNTKのSaveのAPIによると、ONNXフォーマットの出力もできそうだが、C#のライブラリは非対応。簡単なPythonプログラムで変換。

Windows ML Code Generatorによる生成

変換したONNXをプロジェクトに取り込むと、Windows Machine Learning Code Generatorがコードを自動生成してくれる。

ONNX Opsetバージョン変換

自動生成されたクラスを用い、アプリを書いてみるが、読み込みで例外発生。Opsetのバージョンの未対応。CNTK2.7で出力したもののバージョンは9。Windows MLが対応しているのは7と8。これも、簡単なPythonプログラムを書いて変換。この機械学習の世界、発展中ということもあって、ツールやフォーマットの不整合があちこちに。

EvaluateAsync例外

もう一度、アプリを動かすと、読み込みは通るが、LearningModelSessionのEvaluateAsyncで例外。XとWの配列数が不一致、というが。

WinML Dashboard

ONNXモデルの中身をみる必要が生じ、WinMLDashboardをインストールして確認。

Inputs

DashboardのEdit/Viewボタンを押し、最初のConvのNODE PROPERTIESのInputsをみる。
Xの型は float32[Sequence, 1, 1, 64, 64]。
Wの型は、float32[4, 1, 3, 3]。
Xは5つ、Wは4つ。例外のメッセージはこれのことか。

MINISTのInputs

WinMLはConv非対応かと思ったが、例題に出てくるMNISTのモデルをダウンロードして、確認してみると、Convを使っている。ただし、InputsのXとWの配列の数は4つで合っている。CNTKのSaveでこの辺りを制御するパラメータはない。

MNIST CNTK 2.5.1

Dashboardの画面の最初に戻って、MNISTのモデルを生成したCNTKのバージョンをみると、2.5.1。少し古い。

自前のアプリで使用するCNTKの最新版2.7では、ONNXの拡張されたデータ型 (Sequence) に対応しており、それに準じた出力をしている。他方、Windows MLでは、そこまでの対応に至っていない、そんな事情と推察する。

今さら、古いバージョンのCNTKを使うのも?なので、Windows MLによるアプリは保留。WPFなら、CNTKのC#のAPIが使えるので、そちらで検証を進める。

CNTKをC#で、ふたたび2019年12月02日 18:10

CNTKを用い、機械学習のうち、CNNを学んでみようとして、データを用意しては、学習しない、を繰り返し、途中、サイクリングや読書に逃避しつつ、ずいぶんと時間を費やす。結局、敷かれた道を歩むのが最短だったか、と今さら気づく。

漢字要素ラベリング

最初は、木や土、といった漢字の構成要素を識別できないか、と試みる。ラベリングしたデータは4000ほど。さっぱり学習が進まない。

ガルパンキャララベリング

漢字の構成要素は、画面のあちこちに現れる。これは、場所を特定してから識別しなければいけないか、と、もう少し簡単なデータを探す。手元に、Webで公開されている、もっとらぶらぶ作戦です、のPDFがあったので、顔の部分を切り出して、ラベリング。1500ほど。こちらも、学習が進まない状況は変わらず。

MNISTデータ変換

うまくいかないのは、データの不備か、学習プログラムのせいか、アルゴリズムを追えばよいわけではないので、切り分けが難しい。基本に戻って、MSのTutorialにある手書き数字の識別の例題を実装。ところが、ここでも学習は進まず。

MNIST Pythonサンプル

C#のAPIの方は、巷の情報も少ない。さらに戻って、Pythonの例題を実装。Visual StudioにPythonの環境も実装されたので、あわせて試す。文法解析などはしてくれるが、C#ほど親切ではない。データを変換する処理を動かして、出力ファイルを比較して、問題の所在が判明。自前のデータ生成処理に不具合があった。

C# MLP

処理を修正して、データを出力し直し、C#の例題にあるコンソールアプリを動かす。MLP(Multi Layer Perceptron)の方は、誤識別率5%程度を達成。

C# CNN

CNN(Convolutional Neural Network)の方は、誤識別率2%程度と、もう少し優秀。

画像識別学習アプリ

自前の学習プログラムで改めて確認。同じように学習が進むことを確認。

漢字の構成要素やらぶらぶ作戦の顔データで試してみると、誤識別率は、実用に耐えるほどではないが、改善する傾向を見ることができた(50%を切るくらいまで)。この2例では、MLPの方が、学習の進みが早い。手書き文字の例題の傾向とあわせてみると、MLPでデータの有効性(学習性向)を把握して、CNNに進む方がよさそう。

総括すると、CNTKを学ぶ道筋は、素直にPythonの環境で、既知のデータを用いて、データと処理ロジックを確認した上、C#のアプリ実装に進み、自前のデータに進む、という段取りが確実。そうすれば、学習アルゴリズムの選択や、Neural Networkの試行錯誤に集中できる。今回は、今さら新言語をと、Pythonを迂回しようとしたのが誤り。

新調したGPU。MLPでHidden Layerが200層、CNNで最大フィルタ数が16、画像は64x64ピクセル。これで、GPUのメモリ使用量が1.5GB弱(ブラウザが使う分を含む)。以前の0.5GBのQuadroでは不足だったはず。今度は、4GBあるので、もう少し試せそう。

問題はこの先。十分な学習に必要なデータ数は、かなり多め。個人の関心の向く中で用意するには、どうしたものか。大きな組織に属するもの以外には、お呼びではないのか。

興味の向くようなデータを公開してくれる組織が増えないと、例題のその先に進む学習者は増えない。逆にゲームやコンテストのノリで募れば、面白くもなりそう。くずし字のプロジェクトは、そのいい例かも。

Visual Studio 20192019年04月04日 14:05


VS2019

4月に入って早々、Visual Studio 2019がリリース。ぱっと見すぐに気づくのは、フラットなUIになったこと、スタートウインドウがダイアログになったこと。What's New は、インストーラの方に。機能面では、チームでの作業支援の充実かな。コーディング支援もいろいろあるようだけど、それは使い込んでから。

プライバシーポリシーとサポート情報 - からだを動かすリズム計2018年11月15日 09:30

本アプリについて (About this app)

※本アプリは、2018年11月、ストアでの新規配信を終了しています。

本アプリは、身体を動かす際などにリズムを取るためのものです。ストレッチ運動などをする際に、リズムを崩さないようにする手助けとなることを想定しています。

一回の動作の拍数(1~4)と、目標の動作数を設定すると、図形の動きと音でリズムを取ります。たとえば、1回の動作を2拍で行い、30回を動作数に設定すると、2拍のリズムを30回の区切りで実行します。1拍の時間は、0.5~3秒の間で設定できます。

また、開始、終了、1拍の時間変更は、音声認識での操作でも行えます。音声認識には、マイクが必要です。

プライバシーポリシー (Privacy statement)

からだを動かすリズム計
対象アプリ:からだを動かすリズム計

本アプリの製作者である The Fourteenth Lab (第十四工房)は、本アプリによって、お客様の個人情報およびプライバシーに関する情報を収集しません。

サポート情報 (Support)

ご質問や不具合のご連絡は、このページの「コメント欄」をご利用いただくか、「このブログについて」に記載の連絡先までお願いします。

あらかじめのおことわり (FAQ)

1)音声認識は、マイクや機種の性能によって、認識具合が変わります。同じ動作にいくつか単語を用意していますので、認識しやすい単語を選んでください。

2)リング図形の表示には、WinRT XAML Toolkitを使用しています。

プライバシーポリシーとサポート情報 - トーンと色の見本帳2018年11月15日 09:30

本アプリについて (About this App)

※本アプリは、2018年11月、ストアでの新規配信を終了しています。

このアプリは、Windowsアプリの色デザインの補助のために、Windowsの定義色について、PCCSのトーン、色相、明度、彩度を概算し、トーンマップ上の位置を示します。また、PCCSの色について、RGB(ARGB)値を算出し、それに近いWindowsの定義色を求めます。

更新;2018年3月
生成した色について、色のタイルをクリップボードにコピーする機能を加えました。クリップボード経由で他のペイントアプリなどで参照できます。

※PCCS;日本色研配色体系

※アプリのページ

プライバシーポリシー (Privacy Statement)

トーンと色の見本帳
対象アプリ;トーンと色の見本帳

本アプリの製作者である The Fourteenth Lab (第十四工房) は、本アプリによって、お客様の個人情報およびプライバシーに関する情報を収集しません。

サポート情報 (Support)

ご質問や不具合のご連絡は、このページの「コメント欄」をご利用いただくか、「このブログについて」に記載の連絡先までお願いします。

使い方 (Usage)

利用方法は、アプリの「このアプリについて」に記載しています。ここでは、概要を示します。

●Windows定義色の色相、明度、彩度、トーンを調べる。

Windows定義色の確認

例として、一覧の中から、定義色「Chatreuse」を選択します。
・RGB(ARGB)値、実際の色を表す矩形を表示します。
・PCCSの色相、明度、彩度、マンセル色相の概算値を計算します。
・明度と彩度からトーンを判別します。

●PCCSサンプル色の色相、明度、彩度、トーンを確認する。

PCCSサンプル色の確認

例として、一覧の中から、「v20」(トーンvividの色相20)を選択します。
・RGB(ARGB)値、実際の色を表す矩形を表示します。
・定義に従い、PCCSの色相、明度、彩度、トーンを表示します。
・マンセル色相の概算値を計算します。

なお、RGBで表現できる範囲を超えた場合は、RGB値の右に「!」を表示します。この場合のRGB値は、越えた部分を上限値または下限値で置き換えたものになります。

●トーンと色相から生成される色を確認する。

トーンと色相から生成した色を確認

例として、トーンの一覧から「d Dull」、色相の一覧から「4:rO 赤みのだいだい」を選択します。
ついで、「トーンと色相からマップ」ボタンを押します。
・RGB(ARGB)値、実際の色を表す矩形を表示します。

●色相、明度、彩度を指定して、生成される色を確認する。

色相、明度、彩度からマップ

例として、色相から「20:V 青紫」、明度をスライダーを操作して70(縮尺は10倍なので実際の値は7.0)、彩度のスライダーを操作して60(縮尺は10倍なので実際の値は6.0)を指定します。
ついで、「色相、明度、彩度からマップ」ボタンを押します。
・RGB(ARGB)値、実際の色を表す矩形を表示します。
・明度x彩度のマップ上に色を表示します。

●トーンマップを確認する。

トーンマップ

色を生成すると、トーンマップにその位置を表示します。一つ前に作成した色が、Lightの円の時計で6時の位置に表示されました。表示位置は、黄(8:Y)が12時の位置、青紫(20:V)が6時の位置で、色相順に時計回りに配置します。

●選択した色相について、等色色相面を生成する。

等色相面

例として、色相から「20:V 青紫」を選択し、メニューから「色相を選んで等色相面を生成」(パレットのアイコン)を選択します。明度、彩度を1.0刻みで表示します。外側のトーンの明度から一定以上外れた色は表示しません。PCCSでは、色相ごとに明度の分布が異なり、青紫は下の方に寄っています。逆に黄は上の方に分布します。

あらかじめのおことわり (FAQ)

1)ディスプレイを通して実際に見える色は、ディスプレイの設定により変わります。紙に印刷した色と同じになるとは限りません。

2)トーンの識別は、トーン系列を近似する曲線を生成して計算しています。理論の裏付けのある計算式ではないので、それなりにずれています。参考程度にとどめてください。

3)RGB値の各値は、0~255の値を取ります。生成する色が、この範囲を外れている場合(「!」を表記)、負の場合は0、255を越えた場合は255に丸めた上、RGB値を生成します。

4)本アプリが示す明度と彩度は、一般のペイントソフトのHLS表示における明度や彩度と異なります。お使いのペイントソフトで、表示されている明度と彩度を指定しても、同じ色にはなりません。ペイントソフトでは、コンピュータで扱いやすいように、どの彩度でも明度の幅が同じになるように補正しています。本アプリが依拠するPCCSでは、高彩度ほど、明度の幅が狭くなります。

5)Windows定義色の「Transparent」(透明)は、白色の透明度100%と表示されます。

6) 生成した色について、右クリックで情報の参照とクリップボードへの色タイルのコピーができますが、表示されるトーンと、トーンマップ上の表示位置にずれがある場合があります。これは、生成された色がWindowsの表現可能範囲を越え、近似色の場合に生じます。

参考資料 (References)

1)中田満雄,北畠耀,細野尚志、「デザインの色彩」(部分改訂版)、日本色研事業株式会社,2016

2)Microsoft, How to Converting Colors Between RGB and HLS(HBS), https://support.microsoft.com/en-us/kb/29240, 2006
※このKB29240のアルゴリズム通りの実装はしていません。

3)クリップボードにコピーする色タイルの生成には、Win2Dのパッケージを利用しています。