2017年10月06日

fastTextをPythonで使いたいならpyfasttext

エモトです.今週末はついにRWBY volume 4の公開.あの3のラストからどう展開するのか楽しみです.2,3は難波まで遠征してましたが,4は地元京都でも上映されるので,テンションあがってます.

最近,word2vecfastText などの語彙のベクトル化に興味あります.それらの説明はまたいつかとして,語彙を意味のあるベクトルデータに変換して,
king - man + women = queen
の加算計算をやってしまうとは,素直にすごいの一言です.

個人的にfastTextでWikipediaの全データを使って,学習させて,
ザク + 赤い = シャア専用ザク
の計算ができたのは,本当に感動しました.

ただ,加算だけでは満足できませんよね.他のサービスと連携させたいですよね.やっぱり,いまはPythonですよね.ということで,fastTextをPythonで動かす方法を色々調べました.

fasttext 0.8.3
現在,「fasttext python」で検索したらトップに表示される,各種技術ブログ等でも紹介されている,おそらく誰もがこれを使おうと思うでしょう.しかしながら,fasttext 0.8.3 と本家fastTextとバージョンが異なるようで,うまく動作しません.その fasttext 0.8.3 で学習や推論をすれば問題ないですが,最新のfastTextは使いたいですよね.ブランチ内で0.9.0が公開されているのですが,これも上手く動きません.

gensim
これは本家fastTextで学習したモデルを読むことができます.しかしながら,なぜかベクトル化した数値や類似した語句の結果が本家と異なります.gensimの学習は本家fastTextをコマンドラインで実行しており,学習したものと推論で異なってしまってはつかえません.

Pythonからコマンドラインを呼び出して無理に連携してしまおうかと思いましたが,現時点で利用可能なライブラリがありました.

pyfasttext 0.4.0
本家fastTextで学習したモデルの読み込みも可能で.本家と同じ結果を出力することができました.インストールもコマンド1つですみます.
pip install pyfasttext
ただ私の環境では一発では入れられなかったので,ちょっと右往左往しました.しかし,本家と同じ結果を出すことができるので,pythonでfastTextを操作したいなら,このライブラリを使うのがオススメです.
posted by Seesaa京都スタッフ at 13:00| Comment(0) | iOS | このブログの読者になる | 更新情報をチェックする

2017年09月11日

TensorFlow (Keras)とCore MLでリアルタイムの顔識別アプリを作ったぞい

エモトです.今週はAppleの発表会に,iOSDC JAPAN 2017と,iOS開発界隈のイベントが目白押しですね.iOSDCには弊社エンジニアも参加します.関係者各様よろしくお願いします.

n番煎じではありますが,機械学習フレームワーク TensorFlowKeras で学習したモデルを,iOS11 からの Core ML に与えて,簡単な顔識別のアプリを試作して見ました.試作ということで,データ収集など一部で手を抜いてます.ご了承ください.

IMG_0032 2.PNG


ただいま絶賛放送中のNEW GAME!!の9人の主要キャラを対象した識別アプリです.UI等は,先行実装された記事を参考しました.ありがとうございます.

1. TensorFlow (Keras)

画像データはGoogle画像検索およびTumblrタグ検索のスクリプトを書いて集めました.APIの使用制限上,各キャラごとに多くの画像は集められなかったのですが,比較的キャラの描き分けがされている,作画が安定しているからたぶん大丈夫だろうと思います.

使用したCNN(畳み込みニューラルネットワーク)は以下のような簡単なものを設定しました.

model = Sequential()
model.add(Conv2D(32,
                 kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

訓練およびテストデータには,取得した画像にOpenCVでアニメ顔検出を行い,顔領域を切り出したものを使用しました.Tumblrで取得した画像データを訓練,Googleで取得した画像データをテストとして,学習しました.

Epoch 81/1000
128/730 [====>.........................] - ETA: 2s - loss: 0.0728 - acc: 0.9609
256/730 [=========>....................] - ETA: 1s - loss: 0.0667 - acc: 0.9727
384/730 [==============>...............] - ETA: 1s - loss: 0.0610 - acc: 0.9766
512/730 [====================>.........] - ETA: 0s - loss: 0.0636 - acc: 0.9785
640/730 [=========================>....] - ETA: 0s - loss: 0.0629 - acc: 0.9797
730/730 [==============================] - 7s - loss: 0.0611 - acc: 0.9808 - val_loss: 0.4857 - val_acc: 0.8301
Epoch 00080: early stopping

学習結果は,EarlyStoppingを設定して,80回目の試行で切り上げ.テストデータに対して精度0.8となったので,遊び程度ならまあまあ良いかなと思います.本当はもっとデータ増やしたりやCNNを考えて,精度を上げたいところですが.

2. mlmodel へ変換

coremltools を使って,Kerasで学習したモデルをCore MLが読み込めるファイルへと変換します.convertのパラメータ調整もですが,Python2.7系にしか対応していないので,環境作成に時間かかりました.

import coremltools
coreml_model = coremltools.converters.keras.convert(h5_path, input_names = 'image', is_bgr = True, image_scale = 0.00392156863, image_input_names = 'image', class_labels = 'labels.txt')
coreml_model.save(mlmodel_path)

3. Core MLで識別

流れとしては,AVCaptureSessionでカメラから静止画像を順次受け取って顔画像を切り出して,Core MLで識別の流れです.ほかのブログ等では顔画像の識別はVisionフレームワークを使用してる例が多いですが.この試作アプリではアニメ顔ゆえにOpenCVで行なっています.本当は領域認識もRCNN,YOLOやSSDなどを実装して一緒に推論したいところですが,今回はそこまで手を回せられなかったので

    // 予測
    func predicate(image: UIImage) {
        
        let image = CIImage(cgImage: image.cgImage!)
        let handler = VNImageRequestHandler(ciImage: image)
        do {
            let model = try VNCoreMLModel(for: self.newGameModel.model)
            let req = VNCoreMLRequest(model: model, completionHandler: self.handleClassification)
            try handler.perform([req])
        } catch {
            self.isComputing = false
            print(error)
        }
    }
    
    // 推定結果
    private func handleClassification(request: VNRequest, error: Error?) {
        
        guard let observations = request.results as? [VNClassificationObservation] else { fatalError() }
        guard let best = observations.first else { fatalError() }
        
        DispatchQueue.main.async {
        	// 識別した結果に対応する処理など
            print("best identifier: " + best.identifier + ", prob: " + String(best.confidence*100))
            var str:String = ""
            for ob in observations {
                str = str + ob.identifier + ", " + String(ob.confidence*100) + "%" + "\n"
            }
            print(str)            
        }
    }

Core MLでリアルタイム識別を走らせてると,端末が熱くなってくるんですよね.画像一枚ごとに識別するシーンより,時系列データで連続したデータを識別するシーンがこれから多くなると思うので,ちょっと不安になります.近々発表される新型 iPhone はこの計算に耐えられる高スペックのCPUやGPUを積んでくるんでしょうか.楽しみです.
posted by Seesaa京都スタッフ at 11:37| Comment(0) | iOS | このブログの読者になる | 更新情報をチェックする

2017年08月18日

機械学習,ディープラーニングやTensorFlowって何?

エモトです.これまで書き綴っていたGPD Pocketですが,7月末に無事到着しました.ファーストロットで報告されていたハードの不具合もなく,日々持ち歩き堪能しております.これスマホやタブレットでいいんじゃな?と思う時もありますが,UMPCには夢があります.ほら,物理キーボードあるし,なんたってOSはWindowsだよ.

機械学習やディープラーニングの超万能説

よっ!ディープラーニング!
ディープラーニングってやつでなんとかして!!!!

某VRやARを舞台にした映画作品にて,死者の意識や思考をAIとして復活させるため「ディープラーニング」が出てきました.わたし大学時代に機械学習を扱う研究室にいて少し齧ってたのですが,ディープラーニングにはそこまでの表現力はないし,機械学習一般においても実現は不可だと思ってます.

一方で,またボスに即死魔法をかけまくるほどバカなんでしょと,ある年齢層は不審に思われるかもしれません.最新作の11をはじめ,それ以降のAI戦闘は賢いし,適切に弱点攻撃してくれて,すごく便利なんです.とにかくマルティナがエロいんです!

機械学習は,今のところは汎用的な問題に対して非常に難しい.しかしながら,ある特定の問題に対して,強力かもしれないし,そうでもないかもしれない(個人的には,よくわからないAI万能説を掲げて営業されたら気をつけたほうが良いかも).そんな万能ではないが,いろいろ一人歩きしてる感がある機械学習についてちょっとまとめました.

機械学習とは?

Wikipedia から引用すると,「人工知能における研究課題の一つで、人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法のことである」と書かれています.

例えば,ある画像を与えて(入力して),その画像に写る物体が何なのかなどの認識させるための手法です.乱暴にいうと,入力データをある特徴量空間に写像して,それがどのクラスタにあるかを判定するようなものです.

ディープラーニングとは?

よく耳する話題のディープラーニング(深層学習)は,機械学習そのものではなく,機械学習を解くアプローチの1つです(機械学習に普遍的なアルゴリズムはなく,いろいろな手法が日々提案されています).ニューラルネットワークの入力層と出力層の間の隠れ層を複数にしたものがディーブラーニングと呼ばれています.

隠れ層を増やしたことで既存より高い性能を示したが,計算負荷が大きく現実的ではありませんでした.しかし,クラウドコンピューティングやGPUによる並列計算の普及により現実的な計算時間に収まる(それでも計算時間は長い)ようになり,現在人気があるアプローチになっています.ちな,わたしは確率モデルでゴリゴリする方が好きです.

TensorFlowとは?

TensorFlowがGoogleから発表されたとき,これをインストールすればすぐ機械学習できるんじゃね?と思ったかもしれません.しかし,それ自体は機械学習そのものではなく,深層学習用に便利な数値計算ライブラリです.

ディープラーニングの計算は,ニューラルネットワークのパラメータ最適化問題になります.その問題のアルゴリズムは複雑で数学的な知識やコーディング能力がなければ,わたしも含め多くの人が脱落します.それらのアルゴリズムをライブラリー化して配布されたことで,研究者や専門家ではない多くの一般人が参加することができ,現在の流行りが始まったと思います.

また時間があるときにディープラーニングやTensorFlowの説明,実際にニューラルネットワークを解く場合の説明記事を書こうと思います.
posted by Seesaa京都スタッフ at 11:10| Comment(0) | iOS | このブログの読者になる | 更新情報をチェックする