個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。以前よりDCNNによるマンガキャラクターの顔パーツ検出に取り組んでいるが、学習データを手作業で準備するのが大変なので自動化できる方法を模索している。Deformationを使う方法を試しているが、ここでは3Dモデルから2Dの学習データを生成する方法を試してみる。3Dモデルを使用して、ランダムに顔の向きに回転を加えて2D画像を生成するれば、1つの3Dモデルから異なる学習データを大量に生成できる。顔パーツの検出点も手動で入力しなくても回転元の座標から計算で求めることができる。Deformationによる方法の方がよりマンガに適した変形を加えることができると思うが、デフォーマーを手動で作成するのは大変である。3Dモデルで顔の向きを変えてそこからデフォーマーを学習するとデフォーマーを手動で作成しなくてよくなると考えている。使用する3Dモデルデータ元となる3Dモデルを一から作成するにはモデリングのスキルが全くないため、フリーで公開されている3Dモデルを使用することにする。そこで、MMDの初音ミクのモデルを使用することにした。モデリングソフト3Dモデルに回転を加えて2D画像を生成する過程を自動的に行いたいので、Pythonによるコントロールが可能なBlenderを使用して生成を行う。BlenderでMMDのモデルを取り込むプラグイン(mmd_tools)が公開されているのでそれを使用してBlenderにMMDの初音ミクのモデルを取り込んだ。そこから2D画像を生成したいのだが、Blenderは元より3Dモデリングの知識がほとんどないため、以下のことを順番に模索しながら行っていきたいと思う。LayoutをScriptingに変更する。コンソールが表示され、Pythonを対話形式で使用可能になる。カメラを顔の中心に向けるMMDの初音ミクのモデルを読み込んだ後、顔の中心にカメラを向ける。読み込んだ初音ミクのモデルは、足元が原点となっており、正面が負のY軸方法で、頭の方向が正のZ軸方向となっている。メッシュが体のパーツごとにグループ分けされており、顔の中心はグループ「目.L」と「目.R」の中心から求めることができる。y座標は0で、z座標を目の中心の位置に合わせる。目の中心のz座標は以下のようにして求める。2上記コードはモデルの全メッシュの頂点に振られたグループ番号が目のグループ番号と一致するものを抜き出し、そのZ座標の中間の値を求めている。0]camera.locationで、カメラの座標を指定して、camera.rotation_eulerでカメラの向きを指定している。カメラの座標は、顔の目の高さに合わせて、少しY軸方向に退いた位置に配置している。カメラの向きは、オイラー角をラジアン単位で指定する。0]の時、負のZ軸方向で、スクリーンの上側が正のY軸方向を向いているので、X軸方向に90°回転することで、顔の正面に向けている。ライトを正面向きの平行光源にするライトを正面向き(正のY軸方向)に向けて、光源の種類を平行光源にする。'SUN'lamp_obj.locationでライトの座標を正面から少し退いた位置に配置している。lamp_obj.rotation_eulerで、向きを顔の正面に向けている。lamp.typeで、光源の種類を平行光源(SUN)に指定している。レンダリングを行う一旦ここで、レンダリングの結果を確かめてみる。学習データとして顔の領域を100px×100pxに切り出すので、それよりも少し広い150px×150pxの解像度でレンダリングを行う。レンダリングの解像度は、Python側でのコードが見つけられなかったのでBlenderのUIで設定を行った。※2017/3/30追記Pythonで設定するには以下のように実行する。150F12キーを押して、レンダリングを行うと以下のようになる。陰影が付いており、そのままではマンガの学習データとしては適していない。次回以降で、トゥーンレンダリング(セルシェーディング)を行い、マンガの学習データとして使用できる方法を試す予定。»プロフィールid:TadaoYamaokaスマホアプリ開発とディープラーニングを使った将棋ソフトの開発を行っています。)はてなブログをはじめよう!TadaoYamaokaさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。