Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

Pythonでseleniumとheadless chromeでWebページの情報を取得する (Ubuntu 16.04)

- はじめに -

Chrome 59が正式版となりheadless版も正式に動き始めました。めでたい。

New in Chrome 59  |  Web  |  Google Developers

headless chromeUbuntuに導入してPythonから触ったという記事です。

端的に導入だけです。

こんな記事もあったので。

www.infoq.com


- インストール -

まずPythonからの起動に必要なchromedriverを取得しておきます。
apt-getでも入りますが最新版が欲しいので以下のように。
(記事書いた当時で最新版は2.29)

wget https://chromedriver.storage.googleapis.com/2.29/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/


依存ライブラリとなるlibappindicator1をインストールしておきます。
事前にやらないとハマるっぽいので、先走ったら後述で入れたChromeをアンインストールしてやり直すのが良いです。

sudo apt-get install libappindicator1


Chromedebパッケージを取得してきます。
公式ページに行くと、小さな文字で「Google Chrome をインストールすると Google レポジトリが追加され、Google Chrome がシステムで自動更新されます。Google のレポジトリを追加したくない場合は、パッケージをインストールする前に「sudo touch /etc/default/google-chrome」を実行してください。」と書かれています。
スクレイピング等ガンガン回したい場合などはやっておくべきでしょう。(やらなくてもOK)

sudo touch /etc/default/google-chrome
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb


以下でインストールします。

sudo dpkg -i google-chrome-stable_current_amd64.deb


この時以下のようなエラーが出るかもしれません。

Errors were encountered while processing:
google-chrome-stable


その時はapt-getでこうしてこう。

sudo apt-get install -f
sudo dpkg -i google-chrome-stable_current_amd64.deb


インストールおわりです。


- Pythonで実行 -

Python3.xを使います。2系は小学生にバカにされるからです。
seleniumのwebdriver配下にchrome.optionsというのがあるのでそれを利用して、--headlessを指定します。
gpuが載ってない場合は--disable-gpuも指定しておきます。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=options)
driver.get('hogehoge.com')
print(driver.page_source)

後はPhontomJS等と同じように使えます。


driver.save_screenshotしてみたら以下のように

f:id:vaaaaaanquish:20170606194222p:plain



以下曰くPythonだとNotificationのPopUpが出るので設定しておいた方が良いっぽい(未確認)。



あと多分デフォルトだとUbuntuのフォントが足りず文字化けする。
私は導入済み。以下参考。


- おわりに -

今までPythonでWebスクレイピングというとPhontomJSなるブラウザが圧倒的シェアでした。

しかしPhontomJSもなかなかバギーで、プロセスがゾンビ化するなどの問題を抱えていました。

headless chromeに関する日本語ページが更新されるなど、期待が高まっていたここ半年です。

このままheadless chromeが希望の星となる事を期待しています。


最近はWebテストスクレイピングにお熱なので、いつかそこで溜まった知見も記事にしたいと思っています。

人工知能学会全国大会に参加した #jsai2017

- はじめに -

JSAI2017 – 2017年度 人工知能学会全国大会(第31回) に参加した。

今まで学会への参加は学生発表、個人の聴講参加だけだったが、今回は企業ブースでの参加となった。

あまり聴講への参加は出来てないがメモ程度に気になったものをまとめておく。


- 聴講 -

企業ブース出展者での参加では1企業につき2名分のみ聴講証が渡されていたため、6割は会社の犬として自社の説明やステッカー配りなどをしていた。

以下には会社の犬時間以外で聴講し気になった所のみまとめておく。

会社の犬なので、基礎研究より産業応用の部分が多いかもしれない。

05月23日

DNNによるRDF上の単語間の関係の予測を見たかったのだが、部屋に着いた時には質疑だった。

Deep Learning系やチュートリアルセッションはどこも激混みで、大変であった。


DNN圧縮時のパラメータと圧縮後の精度, 大きさの関係

DNN圧縮時のパラメータと圧縮後の精度, 大きさの関係

Deep CompressionなるDeep Neural Netの圧縮手法に関する発表。
元論文にあるK-meansではなくX-meansを使っていた。
そうしたら、パラメータを設定する時の基準の知見が得られたよという内容。
クラスタ数を自動推定するX-means法を調べてみた - Qiita


「DNNの圧縮に枝刈りを使う」というのは恥ずかしながら初めて知った手法で、Deep Neural Networksの重み量子化と共有, ハフマン符号化をやれば上手くいくらしい。前提となる論文は以下。

Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding

先に上記Deep Compressionの話を書いておくと、所謂「枝刈り」と同じ概念で、ニューロン間を接続しているノードを狩ってパラメータ数削減、計算量圧縮を図るというもの。論文ではVGGモデルが49分の1にまで圧縮され、高速化されながら同等の精度を保っている。

まずは閾値を取って重み行列を疎行列化してしまう。
疎行列となった重み行列をK-meansでまとめて クラスタのインデックスとcentroid行列に分けて扱いやすくする(量子化)。
そうした場合、追加の学習をしないとDNN全体の精度が落ちた状態になるが、K-meansで求めたクラスタを使い、クラスタ毎の勾配を使いながら追加で学習を回す事で精度が担保される(Fine-Turning)。
その上で重みをハフマン符号化してやってコンピュータ最適にしてやる事で、速度と電力消費が圧倒的に改善されている。


本題の発表では、ハフマン符号化を使わず、圧縮後に再学習させない事を制約条件としていた。
(「まあそこまでやるのどう考えても実装と設計が面倒だよね…」と正直思った…)

本題はK-meansのパラメータ設定に関して基準が欲しいとの事で、パラメータを変更したいくつかのモデルとX-meansで試していた。

結果としては、量子化する際のクラスタ数が少ないと精度が下がるが、大きすぎるとモデルが大きくなるのであんまり意味なく、そうするとX-meansを使った場合に「小さすぎ」「大きくなりすぎ」問題が発生してあんまり良くなかったッスという感じだった。
ただ、大まかな基準は示されていたのと、再学習等の余地は大きそうだなと思った。
あと、圧縮方法について幾つか調べてDeep Learning with Limited Numerical Precision等を知れて良かった。

日本語だと以下を見つけたので気になれば。
ニューラルネットのメモリ消費を小さくする類の手法 - うどん記
introduction-to-deep-compression (SlideShare)

追記:


ニューラルネットワークの量子化についての最近の研究の進展と、その重要性 - SmartNews 開発者ブログ 良いです。




CNNへの競合学習の統合による表現学習の強化

CNNへの競合学習の統合による表現学習の強化

DNNの強みは入力データから認識に必要な情報の基底を獲得する表現学習(Representation Learning)にあるけど、今のCNNってあんまり表現学習に適してはいないよね。
じゃあSOMなんかに使われる競合学習みたいな教師なし学習と共存した学習手法があれば、表現学習可能なCNNって作れるよねという内容。

実は学生時代かなり似た研究をしていた時期があって、SOMとNNを接続して上手く学習させようとするCounter PropagationとかSOMを多層化して教師あり学習に応用するSOINNなんかを熱心に調べていた。
(結論から言うとこれはあまり上手くいかなかった...)

発表では、SOMで言うところの勝利ノードの出力(ユークリッド距離)とBack Propagationをシームレスに組み合わせ、SOMフィルターをいくつか作りその数が十分な場合において通常のCNNより良くなったというものだった。
f:id:vaaaaaanquish:20170527231824p:plain

教師なし学習が前提にあれば学習データが少ない状態からでも応用できる可能性があると示唆はしていたが、指摘の通り学習データが少ない場合にSOMのフィルター数を十分に確保できないので難しそう。

SOMって結構安定しないので、数確保したりSOMの研究みたいになりはじめてう~んってなっちゃうんだよね…としみじみ思った。
SOM自体がそれなりの表現学習能力を持っていたと仮定するなら、後方に接続するネットワークもPre-trainingを十分に行ったものを使うとかすると良さそう。


05月24日

お仕事でも自然言語処理にお熱で、時間的にちょうど医療応用の部屋で自然言語処理系のセッションがあったので聞いた。

あとはせっかくなのでオーガナイズドセッションでLinked Dataの話を聞いた。


深層学習による医療テキストからの固有表現抽出器の開発とその性能評価

深層学習による医療テキストからの固有表現抽出器の開発とその性能評価

医療文書って非文法的で断片化した表現が多いので難しい。海外だと語彙サーバーのようなものがあったり標準的なツールがあるが、日本にはないので作りたい。
発表では、よくある双方向LSTM(Bi-LSTM)とCRFをつかった手法を適応し、既存システムに多いCPFベースより精度良く出せたという事だった。
課題は2つあり、疾患識別(ER)と疾患と医師の初見の分類(P/N分類)を1つのEnd-to-Endなモデルで行いたいらしい。

参考にしたのは多分以下(?)。

Bidirectional LSTM-CRF Models for Sequence Tagging

Bi-directional LSTMは文脈を過去(past)と未来(future)に分けて、過去->未来(未来->過去)と双方向に接続するLSTMの拡張モデル。
それらを系列ラベリングに適応するために確率的条件場(CRF)に適応するというのは最近の流れの一つである。

発表内ではBi-LSTMに対して、表層文字のみ入力する場合や辞書の活用等と比較していたが、あまり有意差があるようには見られなかった。
(なかなか分野が違うので、結果を見ても分からず…)

あと普遍的な課題として「コーパス量がもっとあれば」という話をしていて、やっぱり自然言語処理機械学習組み合わせるとどこもそうなるよなあ…と思った。

ついでにBi-LSTMについて調べてた時に見た把握しやすいURLを書いておく。
pythonでBidirectional LSTMを使った分類問題 - ゆるふわめも
ニューラルネットワークで時系列データの予測を行う - Qiita
Recurrent Neural Networks Tutorial, Part 1 – Introduction to RNNs – WildML


Sleep Pattern Visualization via Clustering on Sound Data

Sleep Pattern Visualization via Clustering on Sound Data

睡眠の改善のための分析をSequenced-based kernel SOMを使って視覚的に行ってみようという発表。
利用したのは、睡眠中の音声データで、スコアリングしていくと睡眠改善において音データは非常に重要だという事がわかる。

Sequenced-based kernel SOMは、KLSOM(Kullback-Leibler情報量を使ったSOM)を組み込んだKernel SOM(カーネル関数を使うSOM)、SbSOM(クラスタの時系列変化を可視化するためのモデル)を組み合わせたモデル。
これで見た。


結果を見れば分かるが、音声データが睡眠の情報と並列している事が視覚的にわかる(歯軋りの時間と悪い睡眠の時間が同じ等)。
f:id:vaaaaaanquish:20170527224123p:plain


SOMの時系列可視化はかなり有用そうなので自分でも何か使いたいなと思う。

英語の発表で、プレゼンを見ながらギリギリ追い付いたくらいなのでこの程度で。
質疑では、スマフォで録音した音声じゃなくてマイクにすれば~みたいな話がなされたが全く追い付けなかった(英語力が皆無)。


オーガナイズドセッション OS-7 意味と理解のコンピューティング (2)

オーガナイズドセッション OS-7 意味と理解のコンピューティング (2)

Linked DataやSPARQL、セマンティックWebの話を産業科学研究所の古崎先生がセッションしていた。
なかなか歴史のある話で面白かった。

後は宇宙航空研究開発機構宇宙科学研究所の人の宇宙研究で役立つ事はない話とか、雑誌取材の裏側の話とか。

後はおざき先生が人工知能学会、無限に楽しかったという話をしていて楽しそうだった。
DeepNetは夢があっていいですね。


05月25日

学生のポスターセッションがあったので、同じ部屋内にあった企業ブースは人が混み混みだった。

PFNの岡野原さんの公演を聞きに行きたかったが、こちらも激混みでダメだった…流石岡野原さん…


RDFデータベース構築によるユーザの気分に応じた観光スポット推薦システムの提案

RDFデータベース構築によるユーザの気分に応じた観光スポット推薦システムの提案

観光スポットの推薦システムをSPARQLとAndroid OS上で作成したよという内容。
推薦方法としては観光地データをTF-IDFに投げて、感情(喜べる, 泣ける,…,etc)で分けてユーザに推薦するという事だった。

指摘でもあったが、評価に利用したのがGoogle API等に比べた「新規性」なる軸であり、元となるデータベースが違うので怪しい部分があるが、感情によって推薦するシステムはかなり有意であるとは感じた。


価値観に基づく行列演算ベース情報推薦システムの提案

価値観に基づく行列演算ベース情報推薦システムの提案

商品推薦システムでよく使われる、行列計算を利用したMatrix Factorizationに価値観モデルを付与してやろうという話。

価値観モデルはある商品の属性に対するこだわりを定義するモデルで、簡易な数式ながら少ない評価数で安定したモデル化が可能となる事が知られている。
https://kaigi.org/jsai/webprogram/2017/pdf/310.pdf

Matrix Factorizationは予測評価値をユーザベクトルとアイテムベクトルとに分解し、行列計算と捉える事で、二乗誤差を使ったSGD等で最適化していく方法。
Matrix Factorization: A Simple Tutorial and Implementation in Python @ quuxlabs
MatrixFacorization を使った評価予測 ―アルゴリズムシリーズ 3―|サイバーエージェント 公式エンジニアブログ
Matrix Factorizationとは - Qiita

価値観モデルとなるベクトルを別途用意して、Matrix Factorizationしようという話。
従来の行列ベースのものと、手動でアイテムベクトルを設定したもの、SGDで最適化したものを比較していた。
SGDを回していくと精度が下がるなど少し疑念の残るグラフが示されていたが、価値観モデルを加えると初期の精度が良くなり、少ない評価で良い結果が出せる事が分かった。

指摘にもあった通りFctorization Machinesのような手法を使うともっと良くなりそうである。
Factorization Machinesについて調べてみた - Qiita

あと会場で調べてたらこんなんとか


行動経済学的な知見を用いた消費者の情報探索行動の予測とレコメンデーション法の開発

行動経済学的な知見を用いた消費者の情報探索行動の予測とレコメンデーション法の開発

あるWebサイト(中古車販売)のコンバージョンをRFやXGBoostを使って分析してみましたという内容。

価格帯や車種によって、特徴的なVCがあるという結果が見られた。

Google Analyticsの内容しか利用できなかったらしく、なかなか厳しそうだった。
分析データはやはり多い方が良い。


情報量に注目した推薦のための商品間関係性の分類法

情報量に注目した推薦のための商品間関係性の分類法

牛乳を買う理由にはクリームシチューを作る等の要因があり、同時に適した肉や野菜を買う。
つまり、商品関連性を見つければ次にユーザが買い物カゴに入れる商品が推定出来るのではという話。

条件付きエントロピー相互情報量を使い、「同時性・代替性(ある牛乳を買ったら他の牛乳を買わない)」「相補性(焼肉のタレを買ったら肉を買う)」「独立性(無関係な商品購入)」を定義し、次のネットショップにおける次の買い物商品を推定する。

結果を見ると、それなりに推定出来ながら、ネットショップなのでカップラーメンを複数種類まとめ買いされていたりとの課題は多かった。
加えて、ネットショップではUIによる差異が大きい事があると指摘されていた。確かにと思った。


- 聴講以外 -

はじめて企業ブースの中の人として参加してみて、自社説明や配布物配り、名刺交換をやった。
自社Tシャツを着た。完全に会社の犬だ。

学生時代は「なんで学会に企業ブースなんか出すんだろう」と思ってたけど、社会人になって企業ブースに企業側として参加してみて「なんで学会に企業ブースなんか出すんだろう」ってなった。

まあ冗談だが、ブランディング等の効果はあったと思う。
人工知能というか、機械学習にかなり注力しつつあってかぐるますたーガンガン雇ったりしてるので、機会としては良かった。
研究界隈の大ボスみたいな人が来て、クッソビビリながら自社説明するのとかスリリングで良かったです。
これからも弊社をよろしくお願いします。


個人としては幾人か昔から知っている人や、Twitterで知り合った人と挨拶出来たのが良かった。
挨拶してくれた皆さんありがとうございます。
挨拶できなかった人もまたいつか。


MicrosoftとPFNのMeetupではChainerの良い話が沢山聞けた。
海野さん相変わらず面白かったし、PaintChainerの心暖まる話も良かった。
MSの発表はde:codeで見たのと大体同じだったが、新しいSur◯aceをプレゼントする企画があってビビった。
色んな人に挨拶できたし、shi3zの激しい発言を聞けて良かった。


名古屋メシは味噌煮込みうどんが舌に合わなかった。
(有名な山本なんとか行ったんですがアレ美味いって言うんですか…)

でも、手羽先はめっちゃうまかったし会場近くに飲み屋があったのも良かった。

会場ちょっと狭くて廊下と階段なかなか辛かったけど、場所はめちゃ良かったよね。
美味しいご飯情報もネットで得られて良かった。


- おわりに -

知見が多く得られて、多くの人に会えて良かった。

ネットでは色々あったけどそっちはTwitterで。

あとこれ名古屋で一番ウケました。



 

DCGANで名刺のデザインを試みた

- はじめに -

社内ハッカソンと社内勉強会のネタとして、今更ながらGenerative Adversarial Networks*1 (GAN)とその応用とも言えるモデルであるDeep Convolutional Generative Adversarial Networks*2 (DCGAN)について調査し、実際に検証を行った。

この記事は、DCGANについていくらか調査、検証した部分について記述しておくものである。
なお、画像生成系のモデルは以前より話題になっていたため論文には目を通していたが、実際に触ったのは初めてである。

題材として「名刺」の画像をDCGANで生成する事を試みた。
その過程と結果を示す。


- GANとDCGAN -

DCGANはGANに対してConvolutional Neural Networks(CNN)を適応する構成手法のようなものである。

生成モデルにおけるGAN

GANは、2つの生成モデルを相互に学習させることで学習データが形成する分布をより汎化な状態として保持できるというもので、PRML的に言うと伝承サンプリング(ancestral sampling)を使う生成モデルの一種である。
伝承サンプリングはMCMCのようなサンプリングを使うモデルに対して、計算量が少なく済む事がメリット。中でもHelmholtz Machineや変分AutoEncoderに代表される生成モデルと推論モデルを同時に学習させる手法に比べ、よりシャープな自然画像を生成できるのがGANである。

GAN自体は利用する生成モデルについては限定していないが、2つのモデル間のJSダイバージェンスに対してmin-max最適化を行うように捉える事で、2つのモデルは相互に更新しあいながら学習させられ、またBackpropagationが適応できるので勾配の近似と計算量削減ができて良いよねという旨である。

GANの2つのモデルはDiscriminatorとGeneratorに分かれる。
学習におけるGeneratorの目的は、ランダムノイズからDiscriminatorが誤認識するようなGenerator用の入力を作れるようになること。
学習におけるDiscriminatorの目的は、学習データとGeneratorが作る入力を正しく判定できること。
この2つが相互に上手く学習できれば、Generatorはより学習データに近いものが生成できるはずという旨である。

後述するが実際には、この学習は難しく、大きなネットワークモデル等を利用する場合にはパラメータ設定ゲーとなる。

DCGAN

本題のDCGANは、GANにCNNを上手く適応させるため以下のような事を行っている。

  • Pooling layerを以下に置き換えてアップサンプリング
    • D : Strided convolution
    • G : fractional-strided convolution
  • Batch Normalizationを使う
    • 学習を早くできるし過学習をそれなりに防げる
  • 全結合の隠れレイヤーは取り除く
    • 全結合層を全部除くとの文献を見かけるが正確にはglobal average poolingに置き換える(?)である。「出力層手前では、全結合するのではなくて一つの特徴マップに一つのクラスが対応するように設計する」というのが正しそう。
  • Leaky ReLU関数を使う
    • D : 全てLeaky ReLU
    • G : 基本はReLUで出力層はtanh
    • x<=0でも学習が進み、かつ過学習しないように

こういう感じでGANにCNNを適応していくと、CNN使っても安定して上手いこと画像データの生成ができるよ!というのがDCGANの立ち位置だと思われる(?)。
今回後述の実験では利用してないが、他にも「DCGAN(もしくはGAN)で上手いこと画像を生成する方法」は多く論文としてまとめられていて、社内勉強会で上記内容を発表した際にいくつか教えて頂いたので記述しておく。

[1606.03498] Improved Techniques for Training GANs
Feature matching含むいくつかの最適化手法と半教師あり学習によって、画像の生成の成功確率が上がる。

[1606.00709] f-GAN: Training Generative Neural Samplers using Variational Divergence Minimization
GANで使うJSダイバージェンスをfダイバージェンスというものに置き換えましょうという論文。
KLダイバージェンス等とも比較している。

他にも、GeneratorがDiscriminatorを確実に騙せるような画像を学習によって得てしまい、出力画像が特定の画風に固定化してしまう問題に対して「バッチ重みを上手く全体に適応すると良いよ」等の指摘を頂いた。今後時間があれば試してみたい。


- DCGAN関連のプロダクト -

社内勉強会なので、プロダクトと一緒に紹介した。
若干雑だがせっかくなのでそのままコピペで以下にまとめておく。

その他

- DCGAN参考文献 (Web) -

Web上で学ぶ時に有益だと感じた文献。

関連研究を知る

周辺のモデルの流れを掴むには@beam2d氏が公開する以下の資料が分かりやすい。
https://www.slideshare.net/beam2d/learning-generator

生成モデルに関する論文をまとめた以下のような記事もあり、RBMやVAE関連で調べる際は参考になる。
(こちらは随時更新されているようだが誰が書いているか知らない)
memonone: 生成モデル(Generative Model)関連の論文まとめ

GAN系の最適化とか応用研究についてのスライド
[DL輪読会] GAN系の研究まとめ (NIPS2016とICLR2016が中心)

概要を掴む

@miztiさんのブログ。DCGANの概要がつかめる。
できるだけ丁寧にGANとDCGANを理解する - 午睡二時四十分

わかりやすくDCGANについて書いている。概要がつかめる
なんちゃって!DCGANでコンピュータがリアルな絵を描く - PlayGround

スライド。概要がつかめる。画が多い。
Deep Convolutional Generative Adversarial Networks - Nextremer勉強会資料

GANの更新規則についての記事。GIFが分かりやすい。
An Alternative Update Rule for Generative Adversarial Networks

数式に対する解釈が分かりやすいと思う。
[Survey]Generative Image Modeling using Style and Structure Adversarial Networks - Qiita

めちゃくちゃ丁寧にGANについて書かれている。多分Webだと一番丁寧。
はじめてのGAN


- DCGANで名刺画像生成に挑戦した -

事前準備

今回は社内ハッカソンと社内勉強会のための時間を使って、DCGANを試した。
主には以下の@mattya氏がchainerで書いたDCGANをcloneし、モデルとパラメータを調整した。

GitHub - mattya/chainer-DCGAN: Chainer implementation of Deep Convolutional Generative Adversarial Network

課題として、「DCGANは文字や文字構成を学習できるか」という事を見ておきたく、画像サイズが小さく定形な物があるという事で「名刺」を選択した。

学習データに利用した名刺画像はStanfordのデータセットや「名刺 サンプル」「Business Card」で検索してスクレイピングし、2万枚程集めた。
たまに「企業名 名刺」で検索すると山のように名刺を出してる所があって、日本語の企業一覧使って検索してみて包含したので、データセットとしては若干偏っているかもしれない。

名刺のサンプル画像には1枚の画像に数枚入っていたり、お洒落を意識した傾きがあったりするので、ラプラシアンフィルタを使ってエッジを取って、四角があったら名刺だろうといったコードを書いた。
以下を参考に(というかほぼコピペ)したが、2値化するよりHough変換した方が良かった気がする。
ホワイトボードの画像からポストイットを検出する - Qiita

増量して大体5万枚くらいになって、1週間程仕事終わりに目視で「あ~まあこれならええやろ」くらいの絞り込みを行った。
学習データとしては画像集めるだけだったので、まだマシだった。

元々、これをやろうと思い立ったきっかけは画像認識系のコンテストで、そちらのデータセットには名刺の画像と各情報の矩形位置まであったのを見て「これ使ってアップサンプリングすれば行けそうだな」と思っていて使いたかったんだけど、コンテストページ行ったらもうダウンロードできなかった…

名刺管理系のサービスは大体スクレイピング禁止なる項目が書かれてあるので、大丈夫そうなデータしか集められなかったのは事実。

また、名刺は縦横があるんだけど、全部横向きの物を目で選んだ。
理由は同時に学習できるか分からないのと、widthとheightが違うので合わせるのが大変そうなのと、サンプル名刺では等に横向きの物が大半だったから。
縦向きの名刺ダサいし仕方ないね。

名刺は日本語や英語だけでなく、色々な言語の名刺を入れた。
(じゃないと学習データが確保できなかった)
一応アラビア文字とかは目視で見つけた場合のみ外したはず。
あと画像サイズを縮小して、名刺の縦横比率の2倍の110*182にした。

学習とその結果

学習には絶対最強のp2.16xlargeを利用した。申請して2日くらいかかって使えるようになったと思う。構成はChainer周りのDockerでドッカーン。

会社からAWSサービスを使う時に補助が出たりするけど、4~5日程p2インスタンスを利用したら、会社補助上限を突き抜けて+3万円くらいが消えた。
事前準備とサーバへの画像アップロードも時間がかかったが、大体学習の時間。
方法としてはモデルをまず考えて、数時間回してみて期待できそうなら~という感じ。アナログ。
最初の画像が見れるまでの速度的にp2.16xlargみたいな高火力なやつ使った方が、実験はできると思う。
これから見せる画像は、インターネットにある名刺画像と俺の財布が作り出した結果だと思って見ていって欲しい。

学習初期

> い つ も の <
f:id:vaaaaaanquish:20170319191349p:plain:w200:h200

f:id:vaaaaaanquish:20170319191754p:plain:w200:h200

それっぽさがあるがこの辺りはまだ不安。

画像が生成されはじめる

50万回程が学習を回した段階
f:id:vaaaaaanquish:20170319191920p:plain:w200:h200

100万
f:id:vaaaaaanquish:20170319192040p:plain:w200:h200

この辺で少し安心できる

かなり名刺

330万程学習を回した時

f:id:vaaaaaanquish:20170319193627p:plain:w550:h400

いやこれ名刺っぽいなと思った。
こういうデザインの名刺見たことある。
企業アイコンがあって、よくわからん線が入ってて名前の横に役職とかがあって~というやつ。
ちょっと感動した。

学習過程をGIFにしてみた。

f:id:vaaaaaanquish:20170319215634g:plain

学習終盤では一度生成画像がリセットされ固定化されてしまっている。
これは、GeneratorがDiscriminatorを確実に騙せるような画像を学習によって得てしまった故の結果であり、先述したようにバッチ重みを上手く全体に適応する等の対策があるらしい。一応途中途中でモデルと出力は保存しておくのが良い。


- おわりに -

GANとDCGANについて調べ、ソースを見てモデル調整を行った。
また、そのモデルを用いて名刺画像の生成を試みた。

文字を上手く出して欲しかったが、あまり文字として読めるものにはならなかった。
後で学習データを眺めると画像によっては文字が潰れていたので、学習結果で思ったより文字が上手く出てなかった原因はここにもあるかもしれない。

また、学習データが少なかった事と背景が真っ赤だったりする名刺が混ざっていたために、一部名刺とは言えない画像が生成されるのがネックという感じだった。学習データは大事。

ただ、名刺で見たことあるような全体のデザインや、有り得そうなロゴマーク、背景等が生成できた。
DCGANは、画像内に描かれているものが文字であってもそれらの配置を学習し、生成する事ができるという事が分かった。


ちなみに明日は僕の誕生日です。やったね。

Djangoで送信された画像データをPyhon上で処理するWebサービスを作る

- はじめに -

自分のWebサービスは基本PythonDjangoフレームを利用している。

Djangoでフォームから画像を投稿してもらって、それを受け取り、画像処理や機械学習で色々やって画像として返す、といったサービスを作りたい時のメモ。

実際に「ドイツのトリおるか」なる特定の鳥を赤枠で囲むクソサービスを運営しているので、そちらも参考に。


- Django周りのコード -

view.py辺りにいつもこんな感じで書いている。

# //-- Django周りのimport --

from PIL import Image
import sys
sys.path.append("/usr/local/lib/python2.7/site-packages")
import numpy
import dlib
import cv2

@csrf_protect
def main(request):
    # POSTを受けた時
    if request.method == 'POST':
        try:
      # 画像化して処理
            img_moto =Image.open(request.FILES['image'])
            img=numpy.asarray(numpy.array(img_moto))
            dets = original_detector_run(img)

        except Exception:
            # エラー(画像じゃない等)
            f = forms.TestForm(request.GET or None)
            return render_to_response('index.html',
                                      context_instance=RequestContext(request,
                                                                      {'form1': f,
                                                                       "text":"エラーだよ"}))
        # 画像を編集
        img = img_dets_ediy(img, dets)
        
        # Responseとして画像を返す
        response = HttpResponse(mimetype="image/png")
        img_moto.save(response, "PNG")
        return response
    
    # 普段の動作
    else:
        f = forms.TestForm(request.GET or None)
        return render_to_response('index.html', context_instance=RequestContext(request, {'form1': f}))


requestを受け取ったら、FILES['image']の中に画像情報が入っていてPILのImageベースで利用できる。
あとはいつもの変換作業でよしなに。
OpenCVとPIL(python Image library)のデータ変換 - tataboxの備忘録



- ありがちなやつ -

PYTHON_PATHだけでなく、`django-admin.py`にパスを書く必要がある。
やっておくとsys.path.appendは不要になる(場合がある)。

Django の django-admin.py でパスを通しても command not found の時 - Qiita

画像処理だと、OpenCVを使いたい場合があるが、Pythonバインディングはcv2.soファイルで行っているので、そこへのPATHも通す必要がある。(大体site-package内にあるはずだが自分は諸事情でなかったので)

また、wsgiのPATHの設定が居る場合もある。
wsgi.py(もしくはvirtualenv内のwsgiファイル)にWSGIPythonPathとしてsite-package周りを追加しておく。

Apacheだったらそれらでディレクトリの権限をちゃんと設定しておく必要あり。


- おわりに -

こんなのが出来る

vaaaaaanquish.hatenadiary.jp

『コンピューターで「脳」がつくれるか』を読んで

- はじめに -

この記事は以下
『コンピューターで「脳」がつくれるか』(2016/9/27 五木田 和也)
を読んだ所感をまとめたものです。

コンピューターで「脳」がつくれるか

コンピューターで「脳」がつくれるか


未購入の方やこれから読むぞという方、また読んだので語りたいという方向けに記録として残すものです。

ちなみにこの記事の筆者は、情報工学を専攻し機械学習を研究、現在エンジニアをやっている人間です。
そのような視点から書いているという前提をご理解下さい。


- 読了難度について -

まず、テーマが「コンピューター」「人工知能」「機械学習」という事もあり「一歩踏み出しにくいな」という方も居ると思います。

個人的には、そういった人にこそ薦められる書籍です。

実際に筆者の @kazoo04 は著書について以下のように述べています。

できる限り簡潔に、かつ専門用語を最小限に書かれてあるイメージです。
難しい部分は一般的な体験や現象に紐付けて説明されており、「あ、これ経験した事ある!」という形で頭に入ってきやすい文章だと思います。

また、かわいいイラストによる解説も魅力的です。とてもかわいいです。
僕はこれが好きです。
f:id:vaaaaaanquish:20160921181121j:plain
向かう相手を考えずクソリプを飛ばして噛み付かれてしまうツイッタラーみたいですね。

もちろん、脳や機械学習モデルの模式図も示されますが、内容を細かくセクションで区切り、難解な点は何度も詳しく説明が入るよう工夫されていると思います。

このように言うとコラム本のようなイメージですが、注釈が丁寧に付与されており、人工知能関連の研究を知り、未来を考えるための最初の書籍として最適だと思います。


- 満足感を得るために -

簡易な分、情報工学や神経科学を修めた大学卒の人等からすると、満足いかない部分もあるかもしれません。
僕自身、通勤の行き帰り30分程でほとんどの内容を読み切りました。

僕からするとあっさり軽めな内容ですが、この本の目指す目的は「知識の蓄積」というより「汎用人工知能と未来」に尽きると思いました。

主に前半のセクションでは「コンピュータと人工知能の歴史」「神経科学」「機械学習」と分かれています。
この部分は主に"汎用人工知能の話をするため"に書かれた部分だと思います。
今わかっている事実や技術について、様々な側面から書かれています。

前半は知見のような話が続き、大学の講義だと眠くなるタイプの部分かも知れません。
僕の会社の営業職をする同期にこの書籍を渡した時、この部分で深く考え込んでいました。
難しいと感じれば、まだ考える部分ではなく「へえ~こんなのがあるんだ」程度で良いと思います。
簡単と感じれば、「神経科学」「機械学習」の両面を比較しながら読むと良いかも知れません。
良いアイデアの元になったり再確認にはぴったりだと思います。

後半のセクションでは、前半の知識をもとに「汎用人工知能」の生成について、映画やSF小説からイメージされるような所謂「人工知能」が生まれた未来について書かれています。
最後のこの部分に帰結するための前半といっても過言ではないかなと思います。
後半の汎用人工知能の議論を活発にするために、必要な知識や歴史、キーワード、小話が詰まっているといえます。

これらを意識して読むと、難しい部分や読み飛ばした部分も幸せに読めるかも知れません。


- 気になった所 -

個人的に面白いなと思った所、気になった所を紹介しておきます。

  • ニューラルネットワークおよびDeep Learningの技術史が端的にまとめられている
  • 脳の話に対して実例が多い
  • ちょいちょい入ってくるコラムが面白い
  • ブログでQ&Aしてる
  • 著者と絵のメガネ野郎が微妙に似ている
  • 筆者のプロフィールが真面目
  • カバーを外すと専門書っぽい
  • 絵がかわいい

中でも「絵がかわいい」は推したい所です。

LINEスタンプも出してるようなので僕は買いました!
可愛いしコミカルで伝わりやすいです。素晴らしい。

あとは @kazoo04 氏のブログとも連結していと面白いです。

さらに本を楽しみたければココを読めってことね。

コンテンツと金を作るのが上手いなあ…


- 僕が思う汎用人工知能と未来 -

僕は大体本に書いてある通りの事を考えてます。
まあ著者と親交が深いというのもありますけど。
仕事を人工知能にまかせて、自動運転が実現して、世界がアップデートされていく。幸せだと思います。
自動運転とかよく批判されますけど、「自動化」と捉えれば何てことはないんですよ。
洗濯機が自動で洗濯してくれるように、ドアが自動で開閉するように、エレベータが10階まで自動で連れて行ってくれるように、自然に生活の中に「人工知能」も入ってくると思います。

強いて言うなら、この本を読んで「もっと未来に関する議論は活発にすべきだな」と感じました。

エレベータが事故を起こした際、責任の所在はある程度明確になっています。
自動運転もお仕事も、ちゃんと議論してどこまで責任持つかとか、自動化で職業はどう変化してくかとか、未来について議論する事が大事だなと思います。
法の整備や仕組みを先んじて進めて、ドローンのように世界に遅れを取らないように。
技術が一方的に発展するだけでなく、みんなが幸せになれるように。

世界がそういう方向に向かうと良いなと思います。


- おわりに -

ここまで褒めちぎって書いて何ですが、発売前に見せてもらってチェックしたんですよ。
その時は「Deep Learningライン工みたいに表現してるけど違くね?」とか「ここ無駄多すぎね?」とか色々あったんですよ。
でもそれらを間違いなくかつ分かりやすく説明するのってすごく難しくて、本来ならば線形代数や統計の知識が居る部分を上手くコンテキストとしてまとめてるなと思います。
実際に @kazoo04 氏に反例を出して、ボコボコにしてやろうと思ったんですが、結構反例になるようなものが出せなくて大変でした。

脳とか機械学習とか結構分かってない部分もあり、適当な事言ってる人も多い状態なんですけど、この本に関してはよく考えられてるなと僕は思います。

追記ですがイラストレーターさんの名前でググると、同姓同名の方が出てくるようなのでよしなに。


みなさんの知見と議論が広がれば多分著書もハッピーです。
とりあえず買おう。

コンピューターで「脳」がつくれるか

コンピューターで「脳」がつくれるか