2019年12月31日火曜日

夕焼け画像分析 (2) 検証データで夕焼け抽出

教師データの色分布を算出できたので、次は検証データを使って色分布の類似度を計算していきます。前回からの流れを含め、全体の流れは次のようになります。

(1) 教師データの作成、それぞれの教師データの色分布をcsvへ保存:今回は美しい夕焼け10件、美しくない夕焼け3件
(2) 教師データと検証データから色分布の類似度をcos類似度で算出:結果はcsvに保存
(3) 検証データの閾値以上のデータをDBへアップロード

注意点
・cos類似度は教師データ、検証データの両方の色分布を100%に変換してからやっている
・DBには閾値を超えたcos類似度とその時の教師データをセットにして保存

[データベース構造]
今回、teachers(教師データの色分布を保存)とtests(検証用データの閾値以上のcos類似度)、dates(観測日)を利用しています。それぞれのテーブルは次のようになります。

[teachers]
CREATE TABLE IF NOT EXISTS `teachers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `path` text NOT NULL,
  `white` double DEFAULT NULL,
  `olive` double DEFAULT NULL,
  `yellow` double DEFAULT NULL,
  `fuchsia` double DEFAULT NULL,
  `silver` double DEFAULT NULL,
  `aqua` double DEFAULT NULL,
  `lime` double DEFAULT NULL,
  `red` double DEFAULT NULL,
  `gray` double DEFAULT NULL,
  `blue` double DEFAULT NULL,
  `green` double DEFAULT NULL,
  `purple` double DEFAULT NULL,
  `black` double DEFAULT NULL,
  `navy` double DEFAULT NULL,
  `teal` double DEFAULT NULL,
  `maroon` double DEFAULT NULL,
  `madder` double DEFAULT NULL,
  `dawn` double DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ;
[tests]
CREATE TABLE IF NOT EXISTS `tests` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `date_id` date NOT NULL,
  `path` text NOT NULL,
  `teacher_id` int(11) NOT NULL,
  `value` double NOT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=296 ;
[dates]
CREATE TABLE IF NOT EXISTS `dates` (
  `id` varchar(255) NOT NULL,
  `created` date DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

検証用データDB
http://mznsada.mizunolab.info/tests/index2

ソースコード
https://github.com/smzn/PixelColor

説明動画(かなりボソボソ話しています)
https://www.youtube.com/watch?v=fjthiMfRLcU

2019年12月29日日曜日

夕焼け画像分析 (1) 教師データ作成

夕焼け予報を出すためにまずどのような夕焼けが美しいかを決めないといけません。ほぼ主観ですが、きれいな夕焼け画像を10枚、きれいでない夕焼け画像を3枚選び、教師データとしました。
(1) 教師データの作成:使われている色の分布を得る
きれいな夕焼け画像は、https://www.pakutaso.com/ から頂きました。きれいでない夕焼け画像は自分たちで撮ったものです。これらをjpegファイルとしてダウンロードしておきます。
教師データの作成には、これらのデータを取り込んで、全てのピクセルに対してどの色に当てはまるかを決めていきます。今回はHTMLで使われているという基本色16色を使いました。
参考:https://note.cman.jp/color/base_color.cgi
また夕焼け、朝焼けに対応する色も追加しました。それぞれ茜色、曙色です。
参考:http://color-sample.fashion-guide.jp/?eid=310
それぞれのピクセルでRGBの値が得られるので、そこから上記の基本色+2色とRGB距離をとり、一番近いものをそのピクセルで使っている色としました。
参考:https://ja.wikipedia.org/wiki/%E8%89%B2%E5%B7%AE
本当はHSVでやろうと思っていましたが、RGBからHSVの変換は簡単ですので、当面RGBでやっていきます。
それを全てのピクセルで取得し、分布を出しました。001-010までが美しい夕焼け、011-013までがダメな夕焼けです。
[teacher001.jpg]

[teacher002.jpg]

[teacher003.jpg]

[teacher004.jpg]

[teacher005.jpg]

[teacher006.jpg]

[teacher007.jpg]

[teacher008.jpg]

[teacher009.jpg]

[teacher010.jpg]

[teacher011.jpg]

[teacher012.jpg]

[teacher013.jpg]
得られたデータをまとめるために、Webサイトにアップロードしておきました。
http://mznsada.mizunolab.info/teachers/index2/
ここまでのソースコードは以下になります。
https://github.com/smzn/PixelColor

この次はテストデータの分析になります。

2019年12月25日水曜日

2019情報数学基礎(1)

情報数学基礎で利用している参考テキストを載せておきます。
[利用テキスト]
『情報数学の基礎 - 例からはじめてよくわかる』 幸谷智紀 #ブクログ
https://booklog.jp/item/1/4627052715
これがメインのテキストで、この内容に対して関連する内容が入っている書籍が下記になります。

(1) 『大学数学ほんとうに必要なのは「集合」 (BERET SCIENCE)』 大蔵陽一 #ブクログ
https://booklog.jp/item/1/4860644891
授業で説明している集合、写像に関する事柄を簡単な言葉で説明しています。
数学初心者にはおすすめです。

(2) 『新版 集合と位相 そのまま使える答えの書き方 (KS理工学専門書)』 一樂重雄 #ブクログ
https://booklog.jp/item/1/4061565575
これも初心者に読みやすい本ですが、上記の(1)と比べるとかなり数学的になります。授業に関連する内容は最初の50ページ程ですが、今後数学をしっかり学びたい人にとっては、それ以降の位相の話も大事ですので、持っていても価値があると思います。(1)を十分理解できる人には良いと思います。

(3) 『技術者のための基礎解析学 機械学習に必要な数学を本気で学ぶ』 中井悦司 #ブクログ
https://booklog.jp/item/1/4798155357
授業に関する内容は1、2章ですが、3章以降の微積分に関する内容は数学を学ぶ上で必須ですので、理工系のエンジニアを目指す人には非常に良い本です。授業の内容を理解できている人はこれを読むとどのような数学がAI分野に最低必要かが見えてくると思います。

(4) 『文系プログラマーのためのPythonで学び直す高校数学』 谷尻かおり #ブクログ
https://booklog.jp/item/1/4822295915
簡単な数学をプログラムで動かすための説明が書かれていて、楽しみながらできると思います。数学を学ぶというより、数学をどのようにプログラムで表現するかを知りたい人には良いと思います。または数学は嫌いだけど、プログラムをやってみたい人の数学への入り口にも良いかと思います。

[勉強方法アドバイス]
数学だけではないですが、僕が1冊の本(理論・技術書)を読むとき、関連した本を複数冊用意します。同じ内容を見比べていくと、理解が深まったり、理解が間違っていたことがわかったりします。複数の本を全て読むのではなく、メインの本を一冊決めて、残りのサブの本を参照しながら、メインの本の理解を深めていくようにしています。
僕の例では、メイン本1冊(英語、理論系の本)に対して、サブ:英語の本2冊、日本語の本2冊、メイン、サブ合わせて5冊くらいで読み進めています。

ちなみに英語の本を読んでいるのは、日本語が悪い訳ではなく、日本語だとすぐ読めてしまって、理解したつもりになってしまって、後で考えてみると何だったかな?と思うことが多いです。英書だとじっくり読まないと理解ができないので、僕にとってはかえって理解が深まります。もちろん英語の勉強にもなります。

2019年12月11日水曜日

Street View Static APIの利用

Street View Static APIを利用して、緯度・経度情報から周りの様子を取得します。
(1) Google Cloud Consoleの設定
https://developers.google.com/maps/documentation/streetview/get-api-key?hl=ja
から設定方法を確認します。
今回は無料トライアルを利用しました。
(i) 説明にある通り、APIとサービス -> 認証情報にいきます。
認証情報を作成->APIキー
キーを制限した方がいいですが、今回は制限せずにそのままとします。

次にStreet View Static APIを有効にします。
左側のメニューから、Google Map -> APIを選択します。
Street View Static APIを有効にします。
APIを利用して画像が見えるか試してみます。
ブラウザのアドレス欄に
https://maps.googleapis.com/maps/api/streetview?location=34.737624,137.961193&size=456x456&heading=0&pitch=0&key=APIキー
とすると、下記のような画像が見えます。

(2) プログラムで画像を取得し、画像を保存します。
APIキーを使って毎回画像を表示すると、利用料がかかるので、画像を保存します。
テーブル「streets」構造は次の形です。
photoX_YではXはheadingで0-360を指定します。ここでは0,90,180,270で回します。Yはpitchで今回は0と+45にしています。これらのフィールドは対応する画像のファイル名が入ります。
画像のファイル名は後から入れるので、Null指定をしておきます。緯度・経度は登録時に入力します。
今回はcakephpの環境で作成しています。
[StreetsController.php]
既存であるviewアクションをコピーしてsviewアクションを作ります。
https://gist.github.com/smzn/fda746432f7e499186c39bf00e32ed18

[sview.ctp]
上記のsviewアクションに対するビューを作成します。
https://gist.github.com/smzn/6f9f583f37605b94cb5f104fbc62e81e


ファイルはstreet+ID_heading_pitch.pngの形でwebroot/img/image/に保存されます。
保存したファイルを表示するようにします。
アクションはviewをそっくりコピーしただけのpviewアクションを作っておきます。
また保存してある画像ファイルを表示するpview.ctpを作成します。
[pview.ctp]
https://gist.github.com/smzn/94340e05e7f0206a2993417a307c72b8

実行順序
緯度・経度を登録
画像取得ボタンを作成して、sviewアクションを呼び出す。
これで画像が保存される。
次に、画像閲覧ボタンを作成し、pviewアクションを呼び出す。
保存してあった画像ファイルが閲覧できる