TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

TF-IDFを使ってFAQに回答する

とある理由からBotについて調べています。最近はAIを使ったBotもありますが、古典的な方法として、あらかじめ質問と回答を用意しておき、ユーザが入力した質問と類似度の高い質問を選んで回答する方法があります。TF-IDFがその代表的なアルゴリズムになりま…

64bitのWindowsにMeCabをインストールする

MeCabの公式のサイトではWindows用は32bitのインストーラしか提供されていないため、64bitのWindowsで64bitのPythonから使おうとすると使用できない。64bit向けには、32bitのインストーラでインストールした後、個別にビルドしたファイルで実行ファイルとラ…

AIで質問の回答を選ぶ

ディープラーニングを使って自然言語の質問に、自然言語の選択肢から回答することを試します。例えば、 Which of the following is the primary advantage of sexual reproduction when compared to asexual reproduction? という質問文に、 (A) There is a …

WindowsでKerasを使う

とある理由でKerasを使い始めました。 備忘録を兼ねてWindowsでバックエンドにTensorFlowを使用してKerasを使う方法について書きます。 環境 Windows 10 Home 64bit Python 3.5.2(Anaconda 4.2.0 (64-bit)) Tensorflow-gpu (1.0.1) Keras (2.0.3) TensorFlow…

Windows(Bash on Windows)でfastTextを使う

word2vecより高速で学習できて精度がよいというfastTextを試してみました。 環境 Windows Home 64bit Bash on Windows 学習用データの準備 確認用にコンパクトなデータセットとして、Wikipediaの全ページの要約のデータを使用した。Index of /jawiki/latest/…

強化学習の教科書

昨日の日記で強化学習の勉強を始めたと書いたが、教科書についてまとめておく。購入した教科書は、昨日の日記で取り上げた と、TD学習を発案した著者による この本である。強化学習を体系的に記述してあり、本格的に学ぶなら後者の本がよいと思う。ただし、…

ホームページのデザイン変更

わりとどうでも良い話ですがホームページのデザインを変更しました。はてなブログに記事を書き始めてからほとんど更新しなくなっていますが、90年代のようなデザインを直したいと思っていました。最近CSSフレームワークの存在を知ったので、人気があるらしい…

強化学習の勉強

コンピュータ将棋の記事をちょっと書いたこともあり、強化学習について勉強を始めました。教科書として用いるのは、 この本です。この本で使用されているサンプルプログラムは、Octaveとg++が使用されいます。 Windowsで最新のOctaveとMSYS2で実行するのに少…

将棋でディープラーニングする その3(棋譜から学習)

プロの棋譜を使って前回の日記で作成したニューラルネットワークの学習を行った。棋譜サイトにあった竜王戦の棋譜を使用した。訓練データとテストデータの数は以下の通り。 訓練データ テストデータ 局数 3744 417 局面数 422852 47242 学習には非常に時間が…

将棋でディープラーニングする その2(ニューラルネットワークの構成)

先日の日記に続き、将棋でのディープラーニングの実装を試す。今回は、ニューラルネットワークの構成を検討する。 ネットワーク構成 ネットワーク構成は、AlphaGoのネットワーク構成を参考にし、13層の畳み込みニューラルネットワーク(DCNN)とする。 位置に…

将棋でディープラーニングする

先日の日記で1行もコードを書かずに、将棋におけるディープラーニングについて考察した。コードを書いて実験しないとただの机上の空論になるのでコードを書いて検証してみたいと思う。 といっても、将棋のプログラムの実装は行ったことがない。 一からコード…

コンピュータ将棋におけるディープラーニングの考察

先日の日記で、コンピュータ将棋とAlphaGoについて言及したが、次のPonanzaがディープラーニングに成功したということで、どのように適用しているのかが気になっている。そこで適当に考察してみる。電王戦のインタビューでもプロの棋譜との一致率について言…

Bonanzaメソッドの解説

昨日、電王戦 Ponanza×佐藤天彦名人の第1局をニコニコ生放送で見ていました。コンピュータ将棋には以前より興味があり、初めの頃から電王戦はウォッチしていました。名人に勝ったPonanzaは、次はディープラーニングを使うということですが、昨日の対戦で使わ…

3Dモデルから学習データを生成する その3(顔の向きを変える)

前回に続きBlenderで読み込んだ初音ミクのMMDモデルを使って、マンガキャラクターの顔パーツ検出用学習データの生成を試みる。前回は、トゥーンレンダリングを使用して3Dモデルからマンガ風の画像を生成した。 今回は、学習データのバリエーションを増やすた…

ボーカル音程モニター(Volcal Pitch Monitor)のバージョンアップ

約3ヶ月ぶりに、ボーカル音程モニター(Volcal Pitch Monitor)のバージョンアップしました。play.google.com変更点は以下の通りです。1.4.4 ・横方向にピンチズームできるようにした ・前回の縦軸の位置を保存するようにした ・縦軸に半音を表示するオプショ…

3Dモデルから学習データを生成する その2(トゥーンレンダリング)

前回に続きBlenderを使用してMMDの初音ミクの3Dモデルから、マンガキャラクターの顔パーツ検出用学習データの生成を試みる。BlenderでMMDのモデルを読み込むとそのままでは、シェーディングが有効になっており、レンダリングを行うと陰影のある画像となる。 …

3Dモデルから学習データを生成する

以前よりDCNNによるマンガキャラクターの顔パーツ検出に取り組んでいるが、学習データを手作業で準備するのが大変なので自動化できる方法を模索している。写真を線画化するする方法や、Free-Form Deformationを使う方法を試しているが、ここでは3Dモデルから…

SSDによる物体検出を試してみた

先日の日記でYOLOv2による物体検出を試してみたが、YOLOと同じくディープラーニングで物体の領域検出を行うアルゴリズムとしてSSD(Single Shot MultiBox Detector)がある。YOLOv2の方が精度が高いとYOLOv2の論文に書かれているが、SSDの精度も高いようなので…

WindowsにCaffeをインストールする

以前にWindowsでCaffeをビルドしてGPUで実行する方法について書きましたが、内容が古くなったので書き直します。以前に日記を書いた時点では、ビルド済みバイナリが配布されていなかったため、自分でビルドを行いましたが、ビルド済みバイナリが配布されるよ…

YOLOv2による物体検出を試してみた

前回の日記でWindowsにインストールしたDarknetを使ってYOLOv2による物体検出を試してみました。Darknetの学習済みモデルを使用して、ニコニコ動画の上位にあった動画に対して行ってみました。こちらの動画です。www.nicovideo.jp キャラクターがだいたいper…

DarknetをWindowsにインストールする

以前に行ったマンガの顔パーツ検出では、顔の領域の検出にdlibのHOG+SVMを使った方法で矩形領域を抽出してから、DCNNで顔パーツ検出を行っていた。 HOG+SVMである程度マンガから顔の領域を抽出できるが、少なからず検出漏れがあった。 また、スライディング…

Free-Form Deformationでテクスチャを変形する

前回までの日記で、OpenGLでテクスチャ(2D画像)を平面に描画する方法と、ベジエ曲面を描画する方法について記述した。 この2つを組み合わせて、テクスチャの変形を行う。テクスチャの変形には、自由形状変形(FFD: Free-Form Deformation)という手法を使う。 …

Pythonでベジエ曲面を描く

前回の日記でPythonでベジエ曲線を描いたが、今回はベジエ曲面(Bezier patches)を描く。ベジエ曲面は、以下の式で表される。 は、前回の日記で説明したバーンスタイン(Bernstein)多項式である。は、平面上に格子状に配置した制御点で、m, nは、それぞれu軸、…

Pythonでベジエ曲線を描く

Free-Form Deformation(FFD)を使用して2D画像の変形を行おうと試みているが、FFDはベジエ(Bezier)曲面で表される座標系を使用して変形する。 そこで、ベジエ曲線を復習を兼ねてmatplotlibで描画してみる。ベジエ曲線を2次元に拡張するとベジエ曲面となる。 …

PyOpenGLを使ってみる その6(テクスチャに頂点配列を使う)

テクスチャに頂点配列を使う。 import sys from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from PIL import Image def load_texture(): img = Image.open("sample2.png") w, h = img.size glTexImage2D(GL_TEXTURE_2D, 0, GL_…

PyOpenGLを使ってみる その5(頂点配列にnumpyを使う)

前回は頂点配列にPythonの組み込みのタプルとリストを使用したが、numpyを使うこともできる。 座標変換はOpenGLの機能で行った方が簡単だが、場合によってはnumpyを使用できると便利である。 import sys from OpenGL.GL import * from OpenGL.GLU import * f…

PyOpenGLを使ってみる その4(頂点配列)

頂点配列を使って描画を行う。 import sys from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * def display(): glClear(GL_COLOR_BUFFER_BIT) glEnableClientState(GL_VERTEX_ARRAY) glColor3f(1.0, 0.0, 0.0) glVertexPointerf([…

PyOpenGLを使ってみる その3(移動と回転)

前回表示したテクスチャを移動と回転させる。 import sys from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from PIL import Image def load_texture(): img = Image.open("sample1.png") w, h = img.size glTexImage2D(GL_TEXT…

PyOpenGLを使ってみる その2(テクスチャ)

PyOpenGLでテクスチャを表示する。 import sys from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from PIL import Image def load_texture(): img = Image.open("sample1.png") w, h = img.size glTexImage2D(GL_TEXTURE_2D, 0,…

PyOpenGLを使ってみる

前回の日記でPyOpenGLの導入を行った。2D画像の変形をOpenGLを使って行うことが目標だが、現時点でOpenGLの知識がほとんどない。 画像の変形はFree-Form Deformationという方法でポリゴンの頂点を変形させることで実現できそうだが、あせらず基礎的なことか…

WindowsのPythonでOpenGLを使う

写真の線画化を、iBUG 300-Wの300枚の画像に試してみたけど、あまりきれいな線画が生成できなかった。 学習データの生成には他のアプローチを試したい。 Live2Dのような方法で、線画のキャラクタの向きや表情のバリエーションを増やせないかと考えている。 L…

リアルタイムにマンガの顔パーツ検出を行ってみた

以前に書いた以下の日記の内容を組み合わせて、リアルタイムにマンガの顔パーツ検出を行ってみました。 dlibでマンガの顔認識をやってみた DCNNによるマンガキャラクターの顔パーツ検出 Surfaceのカメラでリアルタイムに顔器官検出を行う リアルタイムにマン…

Surfaceのカメラでリアルタイムに顔器官検出を行う

以前日記に書いたdlibを使った顔器官検出をSurfaceのカメラを使ってリアルタイムに行ってみました。 import sys import dlib import cv2 if len(sys.argv) != 2: print("realtime_shape_predictor.py model") exit() model = sys.argv[1] predictor = dlib.s…

SurfaceのカメラをPythonからリアルタイムに使う

SurfaceのカメラをPythonからリアルタイムに使うには、OpenCVを利用して以下のように記述する。 import cv2 video_capture = cv2.VideoCapture(1) while True: ret, frame = video_capture.read() cv2.imshow('Video', frame) if cv2.waitKey(1) & 0xFF == o…

写真を線画化する

マンガの顔パーツ検出を試みているが、マンガの顔画像と検出点がセットになった教師データを大量に入手することができない。自分で入力したデータで検出精度の実験を行って、ディープラーニングを使うことで、単一のコミックの画像であればかなりの精度で検…

TensorFlowをWindowsにインストール

以前の日記で公式バイナリをインストールする方法を書いていましたが、バージョン1.0がリリースされたことで内容が古くなったので、書き直します。公式のページを見ればわかる内容なので、あまり価値のある内容ではないですが。 前提ソフトウェアとして、以…

デブサミ2017 【DevBooks】で同人誌を出します

デブサミ2017 【DevBooks】で、Andirogueというサークルで頒布する同人誌に記事を寄稿しました。以前の日記で書いていたAlphaGoに関する記事です。1ページ目の内容はこんな感じ。 サークルのメンバが書いた技術的な内容からゆるふわな記事まであります。 よ…

DCNNによるマンガキャラクターの顔パーツ検出(追試3)

前回に続き、学習のハイパーパラメータの影響を考察する。今回は、ミニバッチサイズを変更した場合の影響について調べた。ニューラルネットワークの学習は、通常ミニバッチ単位で更新を行う。 ミニバッチのサイズは、大きくすると勾配のばらつきが安定するた…

DCNNによるマンガキャラクターの顔パーツ検出(追試2)

前回の日記で初期値の変更や正則化やBatch Normalization、フィルター枚数などを変更した場合の効果について調べた。ここでは、さらに畳み込み層のゼロパティングの有無とカーネルサイズの影響について調べた。 ゼロパティング 畳み込み層のパディングは、一…

DCNNによるマンガキャラクターの顔パーツ検出(追試)

前回の日記では正則化など行わずにRMSpropを使用して学習を行ったが、初期値の変更や正則化やBatch Normalizationなどを行った場合にどうなるか試してみた。 初期値の変更 ChainerのConvolution2Dのパラメータの初期値は、デフォルトではHeの初期値で初期化…

DCNNによるマンガキャラクターの顔パーツ検出

以前の日記でdlibを使用してマンガのキャラクターの顔パーツ検出を行った。しかし、dlibの方法は、マンガキャラクターには有効ではなく、顔パーツを検出できなかった。そこで、DCNNを使用して顔パーツ検出(顔器官検出)ができるか試してみた。 dlibで実装され…

音声スペクトルモニター(Audio Spectrum Monitor)をバージョンアップ

Androidアプリの音声スペクトルモニター(Audio Spectrum Monitor)をバージョンアップしました。前回のアプデートから1年以上更新していませんでしたが、ボーカル音程モニター(Vocal Pitch Monitor)の方で改善した内容を反映しました。あと、前回の日記で書い…

ゼロパティングを使用して自己相関関数でのピッチ推定の精度を向上する

前回の日記で自己相関関数によるピッチ推定の精度をN倍の位置のピークを使用することで向上できることを示した。Nを大きくすることで精度を高めることができるが、Nの上限はフレーム長により制限される。単純にフレーム長を長くした場合、応答性とのトレード…

自己相関関数でのピッチ推定の精度向上

以前の日記で、自己相関関数でのピッチ推定の誤差について検証した。自己相関関数で求めたピッチは、高周波数で誤差が大きくなることを示した。 ここでは、それを改善する方法について検証する。 自己相関関数のピークの位置をnとすると、周波数fは以下の式…

スマホでのFFTの処理時間

FFTでスペクトル推定を行う際、フレーム長を長くするほどより周波数領域で精度を上げることができる。しかし、フレーム長を長くすると実行時間も長くなる。スマホでリアルタイムで解析を行うような場合、実行時間について考慮が必要になる。ここでは、フレー…

自己相関関数とピッチ推定の誤差

ボーカル音程モニター(Vocal Pitch Monitor)では、ピッチ推定に自己相関関数を使用している。自己相関関数を使用するメリットとしては、 ノイズに強い 低周波数での誤差が少ない という点があげられる。逆にデメリットとしては、高周波数の誤差が大きくなる…

ゼロパディングとFFTによるスペクトル推定の精度

ボーカル音程モニター(Vocal Pitch Monitor)では、ピッチ推定に自己相関関数を使用しているが、精度を高めるために、FFTの値も使用している。離散フーリエ変換(FFT)で、スペクトル推定の分解能を高めるために、ゼロパディングという手法が用いられる。ここで…

ボーカル音程モニター(Volcal Pitch Monitor)のバージョンアップ

Androidアプリのボーカル音程モニター(Volcal Pitch Monitor)をバージョンアップしました。play.google.com 今回の更新内容は、以下の通りです。 音程の解析精度を向上 自動スクロールの速度の設定を追加 メイン画面からテンポ機能のオン/オフを可能とした …

新年あけましておめでとうございます

アプリ開発のモチベーション維持のために、このブログをはじめたのが2年前。 今年で3年目になります。飽きっぽい自分にしてはよく続いています。去年はAlphaGoに影響されて、ディープラーニングのネタを扱ったおかげでアクセスが増えた気がします。ディープ…

リアルタイム音程解析 VSTプラグイン(vst_pitch)の更新

リアルタイム音程解析 VSTプラグイン(vst_pitch)を更新しました。更新内容は解析精度の改善です。 正しいピッチの1/3の周波数に誤って判定されることがあったので修正しました。解析方法はAndroid版のボーカル音程モニター(Vocal Pitch Monitor)と同じで、An…