Unity 검색

공유

Is this article helpful for you?

Thank you for your feedback!

인공지능 분야를 크게 발전시킨 지도형 머신러닝(ML)은 수많은 혁신적인 제품을 만들어 냈습니다. 그러나 지도형 머신러닝은 수집에 비용이 많이 드는 크고 복잡한 데이터세트가 필요합니다. 또한 레이블 품질을 보장하고, 훈련 데이터가 프로덕션 데이터를 대표하도록 해야 하는 등 다양한 문제가 있습니다. 이 문제는 대형 합성 데이터세트를 생성하여 해결할 수 있으며 특히 오브젝트 감지 작업에서 효과적입니다. 합성 데이터를 이용하면 머신러닝 모델을 훈련하는 데 필요한 대규모의 레이블링된 데이터세트를 보다 쉽게 얻을 수 있습니다.

이번 블로그 포스팅은 Unity로 합성 데이터 생성하는 방법을 다룬 시리즈의 세 번째 파트입니다. 합성 데이터에 대한 첫 번째 블로그 포스팅에서는 컴퓨터 비전 작업을 수행하는 머신러닝 모델을 훈련하는 과정에서 다량의 레이블링된 이미지를 수집할 때의 어려움에 대해 살펴보았으며, 최근에는 Unity Perception 툴을 사용하여 레이블링된 데이터 프레임을 생성하는 방법을 알아보았습니다.

이 포스팅에서 살펴볼 내용은 다음과 같습니다.

  1. Unity Simulation을 사용하여 새로운 환경에서 원하는 오브젝트의 데이터세트 대규모로 생성하기
  2. 합성 데이터세트를 사용하여 오브젝트 감지 모델(Faster R-CNN) 훈련하기
  3. 소규모 실제 세계 예시를 바탕으로 모델 미세 조정하기

이번 포스팅에서 소개드릴 모델은 새로운 실제 세계 데이터세트에서 우수한 성능을 발휘하며, 실제 데이터로만 훈련한 모델보다 성능이 더 우수합니다. 또한 환경을 만들고, 데이터를 생성하고, 커스터마이즈된 에셋과 데이터로 모델을 훈련하기 위한 파이프라인과 지침은 datasetinsights에서 이용하실 수 있습니다.

Unity Simulation을 사용하여 대규모로 합성 데이터 생성하기

일상 생활 속 식료품 63가지를 감지하기 위해 Faster R-CNN을 사용해 보았습니다. Faster R-CNN 모델을 훈련하려면 원하는 오브젝트의 3D 에셋을 만들고, 씬을 자동으로 생성한 후 이미지 데이터를 렌더링하고, 바운딩 박스 레이블을 생성해야 합니다.

이 프로젝트를 위해 63개 오브젝트 전체에 대해 3D 에셋 스캔을 제작하고 Unity Perception 패키지를 사용하여 레이블링된 데이터를 자동으로 생성했습니다. 이전 블로그 포스팅과 마찬가지로 렌더링마다 대상 오브젝트의 배치와 방향, 그리고 배경 오브젝트의 배열, 모양, 텍스처를 통제했습니다. 또한 렌더링된 각 이미지에 대해 조명과 오브젝트 색깔, 블러, 노이즈를 무작위로 선택했으며, Perception 패키지를 사용하여 각 바운딩 박스마다 RGB 이미지와 JSON 파일을 캡처했습니다.

그림 1: 바운딩 박스와 관련 메타데이터 JSON이 표시된 합성 데이터의 예시.

환경 제작을 위해 두 가지 유형의 에셋, 즉 전경 에셋과 배경 에셋을 사용했습니다. 전경 에셋은 감지된 오브젝트의 스캔본이며, 배경 오브젝트는 배경을 구성하거나 대상 오브젝트를 가립니다(방해물).

에셋 제작 과정에서는 두 가지를 고려했습니다. 첫째로, 배경과 방해물 오브젝트를 만들 때 다양한 텍스처와 색깔을 노출시켜야 했습니다. 둘째로, 전경 에셋이 사실적이어야 했습니다. 따라서 전경 오브젝트를 스캔할 때 더 많은 주의를 기울였고, 스캔 후 처리 작업도 필요했습니다.

실제 세계 데이터세트 제작하기

실제 세계 데이터세트를 제작하기 위해 제품을 구매한 후 유니티 벨뷰 사무실의 여러 장소에 배치하고 여러 장의 사진을 찍었습니다. 실제 세계 데이터세트의 다양성을 위해, 다양한 조명과 배경 조건을 적용하여 오브젝트를 배치했습니다. 또한 사진마다 오브젝트 집합을 다르게 하고 오브젝트 위치, 방향, 구성도 다르게 했습니다.

VGG Image Annotator 툴을 사용하여 이미지에 주석을 달았으며, 품질을 높이고 데이터 정확성 문제를 해결하는데 총 200시간 이상이 들었습니다. 주석을 다는 과정이 마무리되고, 바운딩 박스와 클래스 레이블이 적용된 이미지를 1,267개 확보했습니다. 이 데이터는 각각 훈련용 이미지 760장, 검증용 이미지 253장으로 나누고, 나머지 254장은 테스트용으로 남겨 두었습니다. 훈련에 실제 세계 이미지를 사용한 모든 모델이 이 훈련 세트를 사용했습니다. 그리고 검증용 이미지 세트를 사용하여 가장 성능이 좋은 모델을 추려내고 과적합을 방지했습니다. 마지막으로, 남겨 둔 테스트 세트를 사용하여 모델 성능을 기록했습니다. 남겨 둔 세트는 사전에 모델에게 노출되지 않았으며, 모델을 선택하거나 모델 하이퍼파라미터를 설정하는 용도로 해당 데이터를 암시적으로, 혹은 명시적으로 활용하지 않았습니다.

그림 2: 사람이 직접 주석을 단 바운딩 박스 레이블이 표시된 실제 세계 데이터의 예시.

실제 데이터와 합성 데이터로 오브젝트 감지 모델 훈련하기

이 실험에서는 널리 사용되는 Faster R-CNN 모델과 ImageNet에서 사전 훈련된 ResNet50 백본, 그리고 torchvision에서 공개 배포한 구현을 사용했습니다. 쿠브플로우 파이프라인을 포함한 실제 코드는 유니티의 오픈소스 datasetinsights의 Python 패키지에서 이용 가능합니다.

모델 성능 측정에는 COCOPASCAL VOCOpenImages 챌린지에서 사용된 세 가지 표준 지표가 사용되었습니다. 이 측정 지표를 통해 모델의 1종 오류율, 바운딩 박스의 정확도, 2종 오류율 정도를 측정할 수 있습니다. 일반적으로 예측된 바운딩 박스와 실측 바운딩 박스 간 IoU(Intersection over Union)의 임계값을 사용하여 예측이 참인지 거짓인지 판단합니다. IoU가 0.5 이상(mAPIoU=0.5)인 오브젝트 감지 mAP(mean Average Precision)를 사용하여 1종 오류 감지율을 측정합니다. 또한 임계값 0.5~0.95(학습률 0.05) 사이의 평균 mAP를 사용하여 바운딩 박스가 얼마나 정확하게 오브젝트 상에 위치하는가를 측정합니다. mAP 값의 개선은 바운딩 박스의 정확도 개선을 의미하지만, 감지 정확도의 개선(즉, 1종 오류율 감소)을 측정하는 보다 일반적인 방법은 mAPIoU=0.5입니다. 마지막으로, 최대 100개의 검출 대상을 바탕으로(mAR100) 모델의 mAR(mean Average Recall)을 측정합니다. mAR100의 개선은 2종 오류율의 감소를 나타냅니다. 이러한 지표의 계산 방법에 대한 자세한 정보는 PASCAL VOC 개발자 키트와 COCO 감지 평가를 참조하세요.

모든 모델은 초기 학습률 2×10-4, 배치 사이즈 4로 훈련했습니다. 훈련 전에 먼저 훈련 데이터를 훈련 세트와 검증 세트로 나누고, 검증 세트에서 가장 높은 mAPIoU=0.5와 mAR100을 가진 모델을 선택했습니다.

실제 세계 데이터만 사용한 훈련에서는 760개 이미지를 사용했으며, 실제 세계 검증 데이터세트를 기준으로 mAPIoU=0.5와 mAR100을 사용하여 가장 성능이 좋은 모델을 선택했습니다. 합성 데이터를 사용한 훈련에서는 400,000개 이미지를 사용했으며, 마찬가지로 합성 검증 세트에서의 성능을 기반으로 가장 성능이 좋은 모델을 찾아냈습니다. 마지막으로는 가장 성능이 좋은 합성 모델에 실제 세계 이미지를 사용하여 미세 조정했습니다. 여기에서는 실제 세계 검증 세트에서의 성능을 기준으로 가장 성능이 좋은 모델을 선택했습니다.

합성 데이터와 실제 세계 데이터로 훈련한 모델의 성능 비교

IoU 임계값 [0.5:0.95] 사이에서 구한 mAP, 단일 IoU 임계값 0.5에서 구한 mAP(mAPIoU=0.5), 나머지 실제 세계 이미지 254개에서 최대 100개의 검출 대상을 바탕으로 측정한 mAR은 다음과 같습니다.

훈련 데이터 종류(훈련 예시 개수)mAPmAPIoU=0.5mAR100
1.1 실제 세계(760)0.480.730.59
1.2 합성(400,000)0.400.620.52
1.3 합성(400,000) + 실제 세계(76)0.600.830.67
1.4 합성(400,000) + 실제 세계(380)0.680.890.74
1.5 합성(400,000) + 실제 세계(760)0.700.920.75
그림 3: 각 모델의 이미지 예시: 녹색 바운딩 박스는 올바른 예측을 나타내며 빨간색 바운딩 박스는 1종 오류 감지를 나타냅니다. 합성 데이터를 사용하면 오브젝트의 방향, 구성, 조명 조건이 까다로운 상황에서 모델의 성능이 향상됩니다.

일반적인 머신러닝 워크플로에서는 소규모의 실제 세계 데이터세트로 Faster R-CNN과 같은 기성 모델을 훈련합니다. GroceriesReal 데이터세트의 경우 Faster R-CNN이 준수한 결과를 냈습니다(mAP 0.48, mAPIoU=0.5 0.73, mAR100 0.59). 위 이미지를 통해 오클루전이 없고 제품 이름이 앞을 향하는 경우 모델의 성능이 우수하다는 사실을 알 수 있습니다. 그러나 방해물 오브젝트와 오클루전이 있는 경우에는 1종 오류 예측이 많았습니다. 반대로, 조명이 복잡한 경우 제대로 감지되지 않은 경우가 많았습니다(2종 오류). 이러한 결과는 Faster R-CNN이 이 작업을 수행할 수 있음을 보여주지만, 바운딩 박스의 정확도(mAP), 1종 오류율(mAPIoU=0.5), 그리고 2종 오류율(mAR100)에는 개선의 여지가 많습니다. 유니티에서는 성능 향상을 위해 실제 세계 데이터를 많이 수집하기보다 대량의 무작위 데이터를 합성했습니다.

합성 데이터를 사용할 때의 한 가지 이점은 지루하고 시간이 많이 소요되는 데이터 수집 과정 없이 데이터세트에 대해 빠른 속도로 반복 작업을 할 수 있다는 점입니다. 유니티에서는 활용할 만한 합성 데이터세트를 생성하기 위해 데이터세트 생성 과정의 많은 부분에서 반복 작업을 진행했습니다. 처음에는 주변광 효과나 오클루전 효과를 포함시키지 않았으며, 이러한 데이터세트로 훈련한 모델은 실제 세계 데이터에서 좋은 성능을 발휘하지 못했고 1종 오류와 2종 오류가 많이 나왔습니다. 오류를 최소화하기 위해서는 배경 오브젝트나 다른 대상 오브젝트로 주변광 효과와 오클루전을 구현하는 것이 중요하다는 것을 알게 되어, Unity Simulation과 Unity Perception 패키지로 데이터세트를 손쉽고 빠르게 커스터마이즈할 수 있도록 파라미터화가 잘 된 환경을 제작했습니다. 다양한 도메인 무작위화 파라미터가 있는 새로운 대규모 데이터세트는 몇 분 안에 생성할 수 있었습니다.

주변광과 오클루전 효과를 포함시킨 후, 400,000개의 합성 예시로 모델을 훈련했습니다. 이 모델은 실제 이미지에서 성능이 좋지 못했습니다(위 표 참조). 특히 오클루전이 심하고 조명이 어두운 상황에서 실패율이 높았습니다. 반면 오브젝트의 방향이 복잡한 경우에는 비교적 좋은 성능을 발휘했습니다(그림 3). 이 결과를 통해 도메인 갭이 문제라는 생각을 하게 되었고, 가설을 테스트하기 위해 모델을 일부 실제 세계 훈련 데이터로 미세 조정해 보았습니다.

가장 먼저 합성 데이터로 훈련한 모델을 76개의 실제 세계 이미지로 미세 조정했습니다. 이처럼 실제 세계 예시의 10%를 사용했을 때, 실제 세계 데이터로만 훈련한 모델보다 더 나은 성능을 보였습니다. 특히 1종 오류와 2종 오류 개수가 크게 감소했습니다. 바운딩 박스의 정확도에서도 주목할 만한 개선이 있었습니다. 그러나 조명이 복잡한 경우에는 여전히 성능이 저조했습니다(그림 3의 3열 3행)

하지만 모델을 380개의 실제 세계 예시로 미세 조정하자 모든 지표에서 놀랄 만한 개선이 이루어졌습니다. 실제 세계 데이터로만 훈련한 모델과 비교할 때 mAPIoU=0.5는 22%에 가까운 개선을 보였고 mAR100은 약 12%의 개선을 보였습니다. 더 나아가 mAP는 42%나 개선되었습니다. 이는 합성 데이터로 훈련한 모델을 실제 데이터로 미세 조정하면 바운딩 박스의 정확도도 개선된다는 것을 보여줍니다. 특히 여기저기 흩어진 예시에서 미세 조정된 모델은 몇 개의 1종 오류만을 냈을 뿐 좋은 성능을 보였습니다. 또한 미세 조정된 모델은 조명이 까다로운 환경에서도 거의 모든 오브젝트를 감지했습니다. 이러한 결과를 통해, 대규모로 생성한 무작위 합성 데이터세트는 모델의 1종 오류율과 2종 오류율을 감소시킨다는 것을 알 수 있습니다.

주요 요점과 결론

실제 세계에서 합성 데이터로 모델을 훈련하려면 유용한 데이터세트를 생성하는 방법과 관련한 몇 가지 도전 과제가 따릅니다. 오브젝트 감지의 경우 어떻게 대상 오브젝트의 디지털 트윈을 제작하고, 합성 데이터세트를 다양화하며, 해당 데이터세트를 사용하여 모델을 훈련할지에 대해 고려해야 합니다. 에셋 스캐닝 솔루션을 사용하면 Unity에서 대상 에셋의 합성 버전을 제작할 수 있으며, Unity Simulation을 사용하여 에셋과 환경의 파라미터를 다양하게 설정하고 합성 데이터를 대규모로 생성할 수 있습니다.

무료 체험하기

이전 블로그 포스팅에서 공개한 Python 패키지를 이용하면 Unity Simulation에서 생성된 합성 데이터세트를 파싱하고, 통계를 계산하고, 차트를 생성하여 데이터세트를 이해할 수 있습니다. 이제 해당 패키지는 github에서 완전한 오픈 소스로 이용할 수 있으며, 모델 훈련 코드와 쿠브플로우 파이프라인을 포함하여 프로젝트의 기능이 확장되었습니다. 이제 합성 데이터로 모델을 훈련하고 소규모의 실제 데이터로 모델을 미세 조정하여 포스팅과 동일한 결과를 낼 수 있습니다.

업데이트된 패키지에는 통합 파이프라인 실행을 위한 가이드가 함께 제공되어 데이터세트를 생성하고 Faster-RCNN 모델을 훈련한 다음 새로운 주피터 노트북에서 모델 예측을 평가 및 시각화할 수 있습니다. 가이드에는 좋은 성능을 내기 위한 전이 학습을 수행하는 방법과 유니티의 사전 훈련된 모델을 사용하여 예측을 실행하는 방법도 수록되어 있습니다.

이 파이프라인과 실제 세계 데이터세트, 합성 데이터 생성을 위해 제공되는 파라미터를 모두 활용하면 실제 세계에서 오브젝트 감지를 수행하도록 모델을 훈련할 수 있습니다. 또한 각자 제작한 모델 또는 유니티의 모델을 사용하여 실제 오브젝트 감지를 수행할 수 있는 소스 코드, iOS AR 애플리케이션, ML 모델 호스팅 지침도 제공해 드립니다.

Unity Perception 패키지, Unity Simulation, datasetinsights를 사용하면 애플리케이션을 위한 합성 데이터 생성과 모델 훈련을 무료로 시작할 수 있습니다.

기능 추가를 요청하거나, 사용 사례를 공유하고 싶다면 유니티에 문의하거나 Unity 포럼을 방문하시기 바랍니다.