TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

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

前回に続きBlenderを使用してMMD初音ミクの3Dモデルから、マンガキャラクターの顔パーツ検出用学習データの生成を試みる。

BlenderMMDのモデルを読み込むとそのままでは、シェーディングが有効になっており、レンダリングを行うと陰影のある画像となる。
陰影をなくして、マンガの学習データとして適した画像にしたい。

ゲームやCGアニメなどで用いられているトゥーンレンダリングの技法で、陰影をなくした画像にすることができる。
トゥーンレンダリングは、影の有り無しで2階調で表現するが、マンガ風にするには、影部分は不要なので、1階調とする。
また、輪郭を線で描画する。

Blenderでそれらを行うには、マテリアルのシェーディングをオフにして、Freestyle機能で輪郭に線を描画する。

マテリアルのシェーディングをオフにする

GUIから行うには、Compositingレイアウトで、マテリアルタブを選択し、材質を選んでShadelessにチェックする。

Pythonのコードから行うには、以下のように実行する。

for m in bpy.data.materials:
    m.use_shadeless = True

顔と背景を白色にする

グレースケール化したときに顔は白色としたいので、材質3(顔)、材質16(目の白い部分)を白色にする。

bpy.data.materials['材質3'].diffuse_color = (1.0, 1.0, 1.0)
bpy.data.materials['材質16'].diffuse_color = (1.0, 1.0, 1.0)

背景も白色にする。

bpy.data.worlds["World"].horizon_color = (1.0, 1.0, 1.0)

Freestyle機能で輪郭に線を描画する

DefaultレイアウトでSceneタブ(カメラアイコン)を選んで、Freestyleにチェックする。
またデフォルトでは線が太すぎるので、Line Thicknessを0.5pxにする。
Pythonでは以下のように実行する。

scene = bpy.data.scenes['Scene']
scene.render.use_freestyle = True
scene.render.line_thickness = 0.5

この状態でレンダリングを行うと、
f:id:TadaoYamaoka:20170329224531p:plain
このように、鼻の位置に不要な線が描画される。

この不要な線をなくすには、LineStyleタブを選んで、Freesyleのプロパティで、Crease Angleを120°に設定する。

scene.render.layers.active.freestyle_settings.crease_angle = radians(120)

レンダリングを行うと、
f:id:TadaoYamaoka:20170329224908p:plain
このようになり、グレースケール化するとこうなる。
f:id:TadaoYamaoka:20170329225126p:plain

以上のようにして、3Dモデルからマンガに近い画像が生成できる。