2017年5月6日土曜日

CNTKのチュートリアルを動かしてみる

Microsoftが公開している機械学習フレームワーク「CNTK」を触ってみました。

環境構築

次の環境で試しました。これらのインストールは終わっているものとします。

  • Windows 10 Pro (64bit)
  • Anaconda 4.2.0


Python仮想環境の作成

コマンドプロンプトを起動し、次のコマンドで"cntk"という名前の仮想環境を作成します。Pythonのバージョンは3.5にしておきます。
conda create -n cntk python=3.5

Python仮想環境の起動

activateコマンドで仮想環境を起動します。
activate cntk

CNTKのインストール

CNTKをインストールする前に、いくつかのライブラリをインストールしておきます。
conda install jupyter
conda install matplotlib
conda install scipy
その後、CNTKの本体をインストールします。
pip install https://cntk.ai/PythonWheel/CPU-Only/cntk-2.0rc2-cp35-cp35m-win_amd64.whl


サンプルプログラムのダウンロード

次のコマンドでCNTKのサンプルプログラムをダウンロードします(カレントフォルダーにダウンロードされます)
python -m cntk.sample_installer

チュートリアルの起動

Jupyterを起動します。
jupyter notebook
Jupyter Notebook上で、ダウンロードしたサンプルプログラムの中から、Turorialsフォルダーの中のCNTK_101_LogisticRegression.ipynbをクリックして、ノートを表示させます。


2017年5月4日木曜日

GIS関係者に知ってほしい次世代海洋データ標準S-100

はじめに

国際水路機関(IHO)は、2010年に、「S-100」と呼ばれる新しい海洋データ標準をリリースしました。
IHOが現時点で公開している海洋データ標準としては、ほかに「S-57」と呼ばれる仕様があり、電子海図のデータ仕様として広く普及しています。しかし、この仕様は拡張性(データ定義の見直しの都度、仕様をバージョンアップしなければならない)やメンテナンス性(仕様のバージョンアップのたびに、ECDISなどの表示装置側でソフトウェアアップデートが必要になる)などの面で問題があり、これらを改善するためにS-57を全面的に見直して新たな標準を作る、というのがS-100の背景になっています。

S-100の特徴

S-100の大きな特徴として、次の2点をあげておきます。

地理情報の標準への対応

S-100は、地理情報のグローバルスタンダードであるISO19100シリーズをベースに(ところどころS-100独自の拡張を加えて)作られています。多くのデータはGMLファイルとして配布されると思われるので、一般的なGISソフトウェアでも扱いやすくなります。

データフォーマットとデータ定義の分離

S-100では、データ作成のためのフレームワーク(データモデルやファイルフォーマットなど)のみが提供され、具体的なデータの内容を決めるのは、個々のデータ仕様の役割となります。たとえば、「S-101」というデータ仕様では、S-100で定めるデータモデルに基づいて、電子海図ドメインのデータの定義(「海岸線」「航路標識」など)を行います。


このような分離を行うことによって、表示装置でS-100のフレームワークにさえ正しく対応しておけば、データ仕様の変更やデータ仕様そのものの追加があった場合でも、表示装置側のアップデートを行うことなく、仕様の変更に対応できることになります。

S-100の現状

データ仕様の大半はIHOで作成途中ですので、これらのデータが一般に出回るのは、まだまだ先の話になります。
主要なものを下の表に挙げます。
  • S-101(電子海図)…2019年リリース予定
  • S-102(水深)…リリース済
  • S-111(潮流)
  • S-121(境界情報)
  • S-122(MPA:海洋保護区域)…2019年リリース?
  • S-123(無線サービス)
  • S-124(航行警報)
今後どれだけ普及するかは正直わかりませんが、海洋GISデータはすべてS-100ベースのデータになる、という未来もあるかもしれません。

技術的な話

S-100のデータ構造を扱えるライブラリの存在を現時点で確認できていませんが、前述のとおり、S-100はISO19100シリーズが基になっているため、GeoToolsのOpenGIS実装(org.opengisパッケージ)の内容がかなり参考になるはずです。
S-100対応のECDISのSDKがあるようなので、こういうものの中にはおそらく入っているのでしょう。

参考資料

2017年4月15日土曜日

AutoCAD Map 3Dの情報源まとめ

AutoCAD Map 3Dの情報は、AutoCADに比べて圧倒的に少ないですが、見つけたものをまとめておきます。



2017年1月22日日曜日

TensorFlowを試す

GoogleのディープラーニングフレームワークであるTensorFlowを触ってみました。

環境構築

今回は、Windows 10 Professional (64bit)にAnacondaをインストールし、AnacondaでPythonの仮想環境を作って、その上にTensorFlowをインストールしました。


なお、こちらの資料を参考にさせていただきましたが、VirtualBoxのインストールおよびubuntuの仮想マシンの作成は行っておりません。
Windows+VirtualBoxで作るTensorFlow環境

Anacondaのインストール

Anacondaのダウンロードサイトにアクセスし、Python 3.5版の"64-BIT INSTALLER"をダウンロードします。

ダウンロードしたインストーラーを起動し、あとは画面の指示に従ってインストールを進めればOK。パスを通すのを忘れずに。

Python仮想環境の作成

Windowsのコマンドプロンプトを起動し、次のコマンドで"tensorflow"という名前の仮想環境を作成します。
conda create -n tensorflow python=3.5

Python仮想環境の起動

次のコマンドを実行します。これで仮想環境が起動します(プロンプトの左に"(tensorflow)"と表示されるようになります。
activate tensorflow

TensorFlowのインストール

上で作った仮想環境に対して、次のコマンドでインストールできます。思ったより簡単。
pip install tensorflow

コーディング

上記の状態でコマンドプロンプトからpythonを起動し、あとはTensorFlowの"MNIST for Beginners"のチュートリアルを見ながら、1行ずつコーディングしていきます。

2016年12月12日月曜日

FOSS4Gで電子海図の世界をのぞく2016 延長戦

これは「FOSS4G 二個目だよ Advent Calendar 2016」の12日目の記事です。

1個目のほうでは、OpenCPNというソフトウェアを使えば、電子海図(ENC)を正しく表示できることをお話ししました。

でもやっぱりQGISで見たい


昨年の記事の中で、ENCをQGISで表示させてみましたが、どうも見た目がいまいちな感じなので、「もう少しマシにならないのか??」と思っていたところ、これを実現させている方がいらっしゃいました。

その方のブログ記事はこちら(フランス語)

やり方はこんな感じです。

  1. SVGファイルをQGISにセットしておく。
  2. ogr2ogrを使って、ENCのオブジェクトごとにshapefileに変換して保存する。
  3. あらかじめレイヤーの設定をしたQGISプロジェクトファイル(.qgs)をshapefileと同じフォルダーにコピーし、プロジェクトファイルをQGISで開く(プロジェクトファイルも上記記事からダウンロードできます)。


早速試してみる


まず、手順の1ですが、上記サイトからダウンロードしたzipファイルを展開し、nauticalフォルダーごと、QGISのSVGが入っているフォルダーにコピーします。私の環境では、Windowsでバージョン2.18を使っているので、"C:\Program Files\QGIS 2.18\apps\qgis\svg"の下に置きます。


次に、手順2として、ogr2ogrを使ってENCをshapefileに変換します。
コマンドはこんな感じ(US4HA51M.000というのがENCのファイルです)。エラーが大量にでるので、-skipfailuresオプションをつけるのがミソっぽい。
ogr2ogr -skipfailures . .\US4HA51M.000
実行すると、大量のshapefileが出来上がります。


手順3の前に、プロジェクトファイルの中を見ると、svgファイルの指定のところで、ファイル名がフルパスでべた書きされており、このままだと動きませんので、動作環境に合わせて書き換えます(この辺はもう少しうまいやり方があるのかもしれない)。

書き換えたqgsファイルをGISTに置いておきます。

これでQGISのプロジェクトを開くと…
おお!!

細かいことを言えば改善したい点はたくさんあるのですが、ここまでENCに近い表示ができるのは、ほんとうに素晴らしいです。

というわけで、QGISでENCをもっとご活用ください。

FOSS4Gで電子海図の世界をのぞく2016 - OpenCPNで電子海図を見る

これは、「FOSS4G Advent Calendar 2016」の12日目の記事です。

昨年に引き続き、電子海図のネタです。昨年の記事はこちら
昨年は、「航海用電子海図(ENC)」とは何か、どこで入手できるのか、どうやって見るのか、という話をしました。今年は、OpenCPNというソフトウェアを使ってENCを見る方法に触れていきます。

OpenCPNとは?


昨年も少しだけ触れたのですが、OpenCPNは、ENCを表示する専用のオープンソースソフトウェアです。S-52という、IHOが定めたENCの表示仕様に従っているため、船に搭載されているENC表示装置(ECDIS)とほぼ同じ見た目でENCが表示されます。また、通常、ENCは専用の表示装置やソフトウェアでないと使用できないよう、S-63という仕様に基づいた特殊な暗号化がなされていますが、OpenCPNでは、S-63のENCも表示させることができます。

ほかにも、GPSと接続して現在地を表示したり、AIS(船舶自動識別装置)と接続して周囲にいる船の位置を表示したり、といった機能がついているのですが、この記事では扱いません。

インストール


OpenCPNのサイトにアクセスし、"Download"のタブから、最新のバージョンをダウンロードします。あとは、インストーラーの指示に従ってインストールします。
OpenCPNのウェブサイト

ENCのダウンロード


今回も、無料で簡単に手に入るアメリカのENCを使うことにします。
NOAAのENCダウンロードサイトから、必要なファイルをダウンロードします。このサイトでは、州ごとや海域ごとのENCがzipファイルでまとめられています。今回は、そのうちハワイ州のものを使います。
ENCダウンロードサイト
ダウンロードしたzipファイルを展開し、ENC_ROOTフォルダー以下を任意の場所に置いておきます。
zipファイルを展開したところ

OpenCPNの起動


OpenCPNを起動すると、最初に注意喚起のダイアログが出てきます。要するに、「必ず紙海図などと併用して使ってね」ということです。
注意書き
その後、アメリカの東海岸あたりの地図っぽいものが出てきます。当然ですが、この時点では、まだENCは読み込まれていません。
OpenCPNを起動したところ

ENCの表示


画面左上にあるツールバーから、スパナの絵のボタン(Option)をクリックします。

"Options"ダイアログにて、"Charts"を選択し、"Add Directory"をクリックして、先ほど展開したENC_ROOTフォルダーを指定します。
オプション設定画面
"OK"を押してダイアログを閉じます。この状態で、マウスドラッグなどで地図をハワイあたりまで動かすと、ENCが表示されるようになります。画面右上の"Meters"は、水深などの数値の単位がメートルであることを示します。

このままではわかりづらいですが、ズームインしていくと、より細かい海図が表示されるようになります(ENCは縮尺に応じて最大5段階のデータが存在します)。
ワイキキビーチ付近の海図(オプションで水深表示も有効にしています)

Android版を試す


OpenCPNにはAndroid版があるようなので(昨年はなかったので最近できたのでしょう)、こちらも試してみます。インストール自体は難しいことはなく、Google Playで"opencpn"で検索してヒットしたOpenCPNアプリをインストールすればOKです(無料版と有料版の2種類あるようなので注意)。
なお、ENCのファイルはあらかじめAndroid上に置いておきます(今回はSDカードの中に入れました)。

OpenCPNアプリのインストール

起動すると、先ほどと同じ警告の後、このように地図が表示されます(ちょっと陸地が欠けているような…)。
起動したところ

で、画面左上のスパナのボタンをタップし、先ほどと同じ要領でENC_ROOTのフォルダーを指定すると、海図が表示されるようになります。
ENCのデータが表示された
3年前のスマートフォンでも割とさっくり動きます。設定画面などのUIがかなり操作しづらいのが難点ですが、ここが改善されれば、かなり使えるのではないかと。


今回はここまでなのですが、最後に…

そういえば海図のオープンデータ化はどうなっているのか?


平成27年12月4日の「第11回電子行政オープンデータ実務者会議」にて、海図のオープンデータ化についての話が出てきました。その後の動きとして、平成28年4月5日に「電子行政オープンデータ実務者会議 第4回公開支援ワーキンググループ 及び 第4回利活用推進ワーキンググループ 合同会合」が開かれ、海図に関しても触れられたようですが、法律も絡んできますし、海図には安全にかかわる重要な情報が含まれているため、どうも公開には慎重になっているような印象を受けました。まだまだ道のりは遠いかも…。

2016年11月6日日曜日

courseraのMachine Learningの復習(week 2)

week 1の復習はこちら

パラメータが複数個の線形回帰


パラメータが$n$個存在するとき、線形回帰の仮説関数は、式(1)の通りとなる。

\begin{equation}
h_\theta(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + ... + \theta_n x_n
\end{equation}

ここで、$\theta$および$x$を下のような行列で表現すると($x_0$は式を単純化できるように便宜的に追加したもので、値は常に1とする)、
\begin{equation}
\theta = \begin{bmatrix}\theta_0 \\ \theta_1 \\ \theta_2 \\ \vdots \\ \theta_n \end{bmatrix}, x = \begin{bmatrix} x_0 \\ x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}
\end{equation}
仮説関数は式(3)のように表現できる。
\begin{equation}
h_\theta(x) = \theta^T x
\end{equation}

コスト関数は、式(4)の通りになる。表現方法が変わっただけで、内容はweek 1と特に変わらない。
\begin{equation}
J(\theta) = \frac{1}{2m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2
\end{equation}

再急降下法の式は、次のように一般化される($j=1..n$)。
\[
\theta_j := \theta_j - \alpha\frac{1}{m}\sum_{i=1}^m ((h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j)
\]
$\theta_0$については、$x_0 = 1$であるため、結局最後の$x^{(i)}_j$の部分が消えて、week 1の式と同等になる。


パラメータ値の調整


Feature Scalingと、Mean Normalizationという2つの手法がある。これらを使うことで、gradient descentを早く収束させられる。
Feature Scalingでは、パラメータの値を(そのパラメータの最大値 - そのパラメータの最小値)で割ることによって、パラメータの値を概ね-1から1の間に収めようとする。
Mean Normalizationでは、パラメータの値から、そのパラメータの平均値を引くことによって、そのパラメータの平均値概ね0になるように調整する。

まとめると、それぞれのパラメータの値を、次のように調整する。
\begin{equation}
x^{(i)}_j = \frac{x^{(i)}_j - mean(x_j)}{max(x_j) - min(x_j)}
\end{equation}


learning rateの選定


$\alpha$の値は、0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, ... というように調整していくのがいいらしい。


Normal Equation


最小の$\theta$を求める方法として、再急降下法のほかに、次の式を解く方法があり、これがNormal Equationと呼ばれる。
\begin{equation} \theta = (X^T X)^{-1} X^T y \end{equation}
どうやらgradient descentの式からこれを導出できるようなのだが、詳しいことは今後調べていく。
このあたりの記事が参考になるかもしれない。
Qiita - 線形回帰のNormal Equation(正規方程式)について

パラメータの数が10,000を超えるような場合には、normal equationではなくgradient descentを使ったほうがよいとのこと。