본문 바로가기

스터디

[머신러닝] PointNet 스터디

 안녕하세요 이노도리입니다 :)

 몇 일간 블로그를 안 하고 있었는데요, ㅎㅎ 요즘 정말 재미있는 것에 빠져 헤어나지 못하고 있습니다. 머신러닝은 그동안 공부해오긴 했지만 2018년 이후에는 그렇구나라고만 이해하고 넘어가기만 해서 사실 이런 엄청난 연구가 나왔는지는 잘 모르고 있었답니다.(정작 이 연구는 2016년에 최초 공개였네요;; ㅎㅎ)

요즘 빠져있는 연구입니다 ㅎㅎ 이 포스팅만 쓰고 바로 코드 돌려보고 직접 파보려구요!

 이 연구의 제목은 다음과 같습니다.

최근 3D 물체의 연구에 대해서 거의 베이스연구라고 봐도 될정도로 엄청난 연구더라구요

 먼저 이 연구의 배경에 대해 설명을 하자면 우리가 머신러닝을 적용하는 분야는 주로 이미지와 같은 2D 세상에 적용을 했었습니다. 하지만 이러한 2D 이미지는 사실 매우 제한된 영역이라고 볼 수 있는것이 우리가 사는 세상은 3D 세상이고 2D 이미지처럼 정확히 픽셀 수가 고정되어 있는 세상도 아니랍니다 ㅎㅎ 머신러닝이 2D 이미지에서 큰 성공을 거둘동안 3D 물체에 대한 머신러닝은 한계에 봉착해 있었는데요, 기존 방법들은 3D 공간을 잘게 나누어 그 공간을 차지하고 있는 물체들로 기존 머신러닝 기법을 적용해보기도 했습니다. 하지만 이러한 방법들은 성공적이기 힘들었는데요, 그것은 바로 해상도의 한계 때문이었습니다. 우리가 어떤 공간을 32x32x32로 나눈다고 하면 이것만 해도 3만 개가 넘는 좌표가 나오게 됩니다. 하지만 어떤 물체를 표현할 때 해상도가 32x32x32라면 당연히 그 물체의 특징을 자세히 표현하기가 힘들답니다. 

비행기를 occupancy grid에 표현한 모습 딱 봐도 뭔가 구립니다.

 이러한 한계때문에 여러 방법이 시도되었었는데요, PointNet은 이러한 그리드를 사용하는 방법이 아닌 직접 point들을 받아서 처리하는 방법입니다. 저렇게 그리드를 사용하지 않게 되면서 해상도를 걱정하지 않아도 되게 되었는데요, 간단히 방법을 설명하면 다음과 같습니다. 

 어떤 물체들을 표현할 때 우리는 mesh나 point cloud 등으로 표현하게 되는데요, 이러한 mesh나 point cloud를 이용하면 학습에 필요한 데이터를 뽑아낼 수 있습니다. 이러한 과정을 sampling이라고 하는데요 쉽게 말해 어떤 표본에서 데이터를 랜덤으로 추출한다고 생각하시면 된답니다.

비행기를 mesh로 표현한 모습
비행기를 point cloud로 표현한 모습

 만약 저러한 mesh나 point cloud에서 랜덤으로 점을 10,000개 정도 뽑아낸다고 생각해볼까요? 그러면 당연히 10,000개의 점은 랜덤 하게 비행기의 형태를 따라 존재하게 될 겁니다. 그 10,000개의 점이 정확히 저 비행기의 모습을 재현하지는 못하겠지만 아마 가까운 형태의 모습을 재현하게 될 겁니다. 우리는 그것은 머신러닝으로 학습시키는 거지요 ㅎㅎ 

 사실 이 컨셉을 들었을 때 정말 머릿속에 번개가 치는 것 같았어요. 저 방법을 적용하면 지금 제가 하고 있는 여러 방법들에 적용해서 엄청난 것들을 해낼 수 있을 것만 같아서 너무도 신이 났거든요. 

 하지만 당연히 세상이 그렇게 쉽게 돌아가지는 않겠죠? 논문에서는 이 3D 머신러닝에서의 특성 때문에 여러가지 고려할 점이 존재한다고 말하고 있답니다. 먼저 3D point들은 정렬되어 있지가 않습니다.

 3D 점들이 정렬되어 있지 않다면 어떤 문제가 생기길래 그러는것일까요? 만약 입력으로 랜덤으로 추출한 3D 점들을 입력으로 주게 됐을 때 머신러닝 네트워크를 통과하는 어떤 순서에 점들도 같은 결과를 내놓아야 합니다. 조금 이해가 안 가시나요? 만약 입력으로 점 (1,0) (0,1)이 있고 네트워크를 통과할 때 아웃풋이 1이라면 입력으로 (0,1) (1,0)을 넣어도 아웃풋이 1이 나와야 한다는 이야기랍니다. 이러한 데이터의 성질을 unordered 즉 비정렬 데이터라고 한답니다. 그리고 저렇게 아웃풋이 같게 나오는 것을 가능하게 하기 위해서 이 논문에서는 symmetry function이라고 하는 방식을 사용하고 있습니다. (자세한 이야기는 논문을 참고하세요 :))

PointNet의 개략도

 또 다른 문제로는 3D 물체는 여러각도로 있을 수 있다는 점이에요. 2D로 예를 들어 글자가 있다고 해볼게요. 그러면 글자를 기울여서 쓰는 사람도 있을 거고 바로 세워서 쓰는 경우도 있을 거예요. 

요렇게 기울어진것도 인식할 수 있어야 착한 인공지능!

 2D에서는 저게 그렇게 큰 문제가 되지는 않았던 것 같아요. 단순 CNN만으로도 인식률 99%를 달성할 수 있을정도니까요. 하지만 3D에서는 회전 방향이 3D라는 문제가 있어서 그만큼 인식률이 떨어지는 문제가 있었던 것 같아요. 이러한 문제를 해결하기 위해 이전에는 canonical ordering이라는 방법을 사용했다고 해요.(저는 잘 모릅니다... ㅎㅎ) 하지만 이 논문에서는 더 간단한 방법을 제시했는데요, T-net이라는 것을 집어넣고 이 T-net에서 3D 물체의 affine transformation을 찾아낼 수 있도록 했다고 합니다. 이게 무슨 이야기인지 저도 이해하기 힘들었는데요, 쉽게 말해 3D 물체의 특징들이 똑같은 각도로 정렬될 수 있게 했다는 말이라고 합니다. (설명하는 저도 이해가 잘 안 됩니다!) 어쨌든 이 방법을 이용하면 회전된 물체들에 대해서도 동일한 아웃풋을 만들어낼 수 있도록 만드는 것이 가능하다고 합니다. Affine transformation은 좀 더 수학적인 내용인데 공부가 더 필요하다는 생각이 드네요 ㅎㅎ

 이렇게 PointNet을 이용하게 되면 기존에는 많이 힘들었던 3D 물체들에 대해 다양한 방법을 사용할 수 있게 됩니다. 3D 물체에 머신러닝을 적용하고 또 정확도 또한 높다니 정말 기대되지 않나요? 3D 머신러닝을 사용해서 할 수 있는 일들에 너무 기대가 됩니다. 논문에서는 이러한 방식으로 PointNet을 테스트 했답니다.

주어진 이미지와 비슷한 모델들 찾아내기
물체를 구성하고 있는 부분들 구분하기
센서 데이터로 물체 인식을 수행했다고 합니다 ㅎㅎ

 

 어떤가요? ㅎㅎ 이 논문에서는 주로 point cloud 데이터로 물체 인식에 대한 내용을 많이 다뤘는데요, 저는 CG 쪽에 시뮬레이션 쪽이다 보니 이쪽에도 많이 적용해볼 수 있는 아이템이 많을 거라는 생각이 드네요. 오랜만에 열정이 뿜뿜 해서 너무도 신나는 요즘입니다 ㅎㅎ

 그럼 저는 신나는 머신러닝 하러 가볼게요~

'스터디' 카테고리의 다른 글

[머신러닝] Point cloud 머신러닝 이야기  (4) 2021.02.09