Blender로 기계 학습을 위한 합성 데이터 세트 생성: 첫 시도

TL;DR 이것은 기계 학습을 위한 합성 데이터 세트 생성의 첫 번째 시도에 대한 메모입니다. 간단한 원환체 렌더링 이미지와 훈련된 기계 학습 모델을 생성하여 이를 감지합니다.

교육 방법



모델을 만들기 위해 this article about training a model for Tensorflow.js을 참조했습니다. Kaggle에서 캥거루 데이터셋과 토마토 데이터셋으로 테스트했습니다. 둘 다 잘 작동했고 훈련된 모델은 나에게 좋은 예측을 제공했습니다. Blender에서 생성한 데이터 세트에 절차를 적용했습니다.

단계



장면 설정



장면의 원점에 원환체를 배치해 보겠습니다. 기본 포인트 라이트와 카메라는 그대로 두었습니다.



다음으로 Shading 탭으로 이동하여 재질을 만듭니다. 기본적으로 Principled BSDF가 표면 셰이더로 사용됩니다. 나는 그대로 떠났다. 다음 섹션에서 이야기하면서 토러스의 색상을 설정하기 위해 Base Color에서 Principled BSDF를 무작위로 변경했습니다.



스크립팅



블렌더에서 파이썬 스크립트를 작성하여 객체의 속성을 제어하고 렌더링 매개변수를 설정하는 등의 작업을 수행할 수 있습니다. 저는 이미지 렌더링, 토러스 이동/회전, 무작위 색상 변경을 자동화했습니다. 이러한 매개 변수를 설정한 후 각 렌더링된 이미지에서 토러스의 경계 상자(x min, y min, x max, y max)를 계산하여 교육용 주석 데이터 세트를 생성하고 렌더링된 이미지를 입력으로 사용했습니다. 훈련용으로 600개의 이미지를 생성했고 테스트용으로 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을 사용하고 있지만 내 PC에서 내 모델을 훈련했습니다. My notes은 로컬 PC에서 모델을 만들려는 경우 도움이 될 수 있습니다.

훈련 단계로 1000를 사용했습니다. 우선 글에 나온 캥거루 모델 훈련과 동일하게 7500을 해봤는데 이번 훈련은 과했다.

결과



200개의 테스트 데이터 세트로 탐지 결과를 확인했습니다. 거의 모든 토러스가 70% 이상의 신뢰도로 탐지됩니다.



그러나 모델은 내 웹캠으로 찍은 이미지에서 원환체를 인식하지 못했습니다(웹캠으로 내 PC 화면을 촬영했습니다). 데이터 세트의 훈련 토러스가 실제 세계에 비해 너무 깨끗하다고 ​​생각합니다. 실제 사진 이미지를 배경으로 포함하고 일부 노이즈, 모션 블러 등을 데이터 세트에 포함해야 합니다.

이 과정을 통해 합성 데이터 세트 생성이 어느 정도 작동한다는 것을 배웠지만 현실 세계(예: AR)에서 내 모델을 사용하기 위해 도입해야 할 개선 사항이 여전히 많이 있습니다. 합성 데이터 세트 생성에 대한 경험을 댓글로 공유해주세요!

좋은 웹페이지 즐겨찾기