Blenderによる機械学習のための合成データセット生成


TLこれは機械学習のための合成データセット生成の最初の試みである.単純なトーラスを生成するだけで画像を生成し、それらを検出するためにモデルを訓練訓練機械.

訓練方法


参照this article about training a model for Tensorflow.js モデルを作成する.私はKaggleの上でカンガルーデータセットとトマトデータセットでテストしました.両方ともうまくいき、訓練されたモデルは私に良い予測を与えました.私はBlenderで生成されたデータセットにプロシージャを適用しました.

ステップ


場面を立てる


場面の起点にトーラスを入れましょう.私は、デフォルト点光とカメラをそのまま残しました.

次に、Shading タブと材料を作成します.デフォルトではPrincipled BSDF 表面遮光物として使用される.そのまま残しました.次の節で話しているようにBase Color ランダムにPrincipled BSDF トーラスの色を設定します.

スクリプティング


Blenderでは、オブジェクトのプロパティを制御し、レンダリングパラメータを設定するPythonスクリプトを書くことができます.これらのパラメータを設定した後、各レンダリング画像内のトーラスの境界ボックス(x min、y min、x max、y max)を計算し、入力として画像を描画するための注釈データセットを生成します.私はトレーニングのための600のイメージとtestringのための200のイメージを生成しました.私のスクリプトの一部を共有しましょう.(全文はこちらGithub . ありがとうa Blender forum article . 私はその記事のコードを使ってボンディングボックスを計算します
base_dir = "d:/rendering_result"
geometry_file_path = os.path.join(base_dir, "geometry.txt")
donut = bpy.data.objects["Torus"]
with open(geometry_file_path, "w") as file:
    for i in range(800):
        # Setting rotation
        donut.rotation_euler[0] = random() * math.pi
        donut.rotation_euler[1] = random() * math.pi
        donut.rotation_euler[2] = random() * math.pi
        # Setting rotation
        donut.location.x = random()
        donut.location.y = random()
        donut.location.z = random()
        # Setting material color
        color = (random(), random(), random(), 1)
        donut.active_material.node_tree.nodes['Principled BSDF'].inputs["Base Color"].default_value = color

        # Naming a file and render an image
        f = "image" + str(i) + ".png"
        path = os.path.join(base_dir, f)
        bpy.context.scene.render.filepath = path
        bpy.ops.render.render(write_still = True)

        # Calculating the bounding box
        b = camera_view_bounds_2d(bpy.context.scene, bpy.context.scene.camera, bpy.data.objects['Torus'])

        # Generating annotation CSV row and writing it in a file
        row = "%s,%i,%i,donut,%i,%i,%i,%i" % (f, 512, 512, b.x, b.y, b.x + b.width, b.y + b.height)
        file.write(row + "\n")
以下は画像と注釈データの例です


filename,width,height,class,xmin,ymin,xmax,ymax
image0.png,512,512,donut,207,143,333,285
image1.png,512,512,donut,262,157,324,311
image2.png,512,512,donut,253,122,411,267
image3.png,512,512,donut,268,146,420,301
image4.png,512,512,donut,243,185,401,286
...

データセットのトレーニング


私のトレーニングの詳細は説明しませんthe article I referred . しかし、私は記事がColabを使っているけれども、私のモデルに私のモデルを訓練しました.My notes あなたのローカルPCであなたのモデルを作りたいならば、助けるかもしれません.
使用する1000 トレーニングステップとして.最初に、私は記事のカンガルーモデルトレーニングと同じように7500を試みました、しかし、それはこのトレーニングのためにあまりに多くでした.

結果


200のテストデータセットで、検出結果を確認しました.ほとんどすべてのトーラスは、70 %の信頼以上の信頼で検出されます.

しかし、モデルは私のウェブカメラによって撮られたイメージでトーラスを認めませんでした(私は、ウェブカメラで私のPC画面の写真を撮りました).私は、データセットのトレーニングトーラスが現実の世界と比較してあまりにきれいであると思います.私は実際の写真画像を背景といくつかのノイズ、モーションぼかしなどのデータセットで含める必要があります.
このプロセスを通して、私は合成データセット生成を多少研究しましたが、私はまだ私のモデルを実世界(ARのような)で使用するために多くの改善をまだ持っています.コメントとして合成データセット生成についてのあなたの経験を共有してください!