3개월에 걸쳐 준비했던 대회가 마무리되었습니다.
CJ대한통운 물류기술연구소에서 운영하는 대회로, 올해로 3회째를 맞이했습니다.
상위 6개팀에게는 총 4300만원의 상금과 채용우대특전이 주어집니다.
이번 대회는 271팀이 지원했다고 합니다.
과제는 총 4개가 주어졌습니다.
그 중 1번 과제인 [스마트폰을 이용한 상자 체적 측정] 과제를 선택했습니다.
주요 포인트는 사진으로부터 상자를 인식하는 머신러닝 기술과 사진 좌표계를 공간좌표계로 변환하는 알고리즘이었습니다.
여기에 더해 모바일 환경에서 이 모든 것이 On-Device로 작동해야합니다.
iOS 와 안드로이드를 모두 지원할 수 있도록 하고 싶었기 때문에, 웹기반 기술을 이용하여 포팅하고자 했습니다.
따라서 웹에서 머신러닝을 돌리기 위해 ONNX RunTime 을 이용했고, 이미지 처리를 위해 OpenCVjs 를 이용했습니다.
머신러닝 모델 후보로는 detectron2, MRCNN, U2Net 세 가지가 있었고, 결과적으로 ONNX 포팅 문제와 모서리 추적 성능을 이유로 U2Net 을 이용하기로 결정했습니다.
다만, U2Net에서는 상자만을 따로 추출하는 것이 아니라 모든 Object를 가져오기 때문에 각 Object가 상자인지를 평가하는 알고리즘을 추가적으로 만들어야 했습니다.
성능 측면에서는 ONNX RunTime 이 WASM 을 이용하기 때문에 cpu 기준으로는 그렇게 느리진 않았지만, gpu 를 이용하는 것과 비교하면 지나치게 느렸습니다.
이를 해결하기 위한 방법으로는 webgl, webGPU 기술이 있기는 했지만, 아이폰에서는 webgl 이 지원되지 않았고, webGPU는 U2Net 모델과 호환이 되지 않았습니다.
성능측면에서는 아무래도 아쉬움이 남습니다.
공간좌표계로 변환하는 것은 바닥면을 대상으로만 진행했습니다.
윗면의 점은 각각 대응되는 아랫면의 점이 존재하기 때문에 우선순위는 구하기쉬운 바닥면이었습니다.
그러나 바닥면의 위상을 어떻게 알아낼지는 또 다른 문제였습니다.
그래서 바닥면의 위상구조를 알아내기 위한 방법으로 레퍼런스 이미지 인식 기능을 만들어야했습니다.
레퍼런스 이미지를 OpenCV 컨투어를 이용하여 특징을 검출해 찾아내는 것은 꽤 재미있었습니다.
그러나 위상구조의 세부항목인 거리, 각도, 초점거리, 틸트각은 상당히 골치아픈 부분이었습니다.
정말 다양한 방법을 시도해보았고 결론적으로 파라메트릭 서치를 적용하여 해결해낼 수 있었습니다.
그 이후로 실제 공간좌표계로 변환하는 과정은 기하학 구조를 이용하여 수식을 찾아내 적용했습니다.
그리고 높이를 구하는 부분은 영사점을 이용하여 측정해낼 수 있었습니다.
포팅은 기본적으로 웹뷰를 이용하려고 했습니다.
그러나 iOS 쪽에서는 골치아픈 문제가 있었습니다.
userMedia 를 이용하기 위해 https 또는 file 프로토콜을 이용해야했지만, iOS의 내부 파일구조는 해당 프로토콜을 제공하지 않아 권한이 부여되지 않는 문제가 있었습니다.
그래서 필요한 JS파일을 텍스트로 불러와서 하나의 파일로 임시 주소를 부여하여 웹뷰에 띄우는 형태로 처리했습니다.
그렇게 해결이 되나 했지만, fetch 에서 CORS 문제로 U2Net 모델을 불러오지 못하게 되었습니다.
결국 U2Net 모델을 base64 인코딩하여 텍스트로 저장하여 해결했습니다.
예선 때에는 간단한 프레젠테이션 발표와 함께 시나리오에 맞추어 상자의 크기를 직접 측정하여 점수를 기록했습니다.
개발환경과 차이가 있었음에도 꽤 정확하게 상자가 인식이 잘되었습니다.
그러나 막상 실제 값과 오차가 기대보다 크게 나왔습니다.
예선이 끝나고 보니 레퍼런스 크기를 잘못입력해두고 진행한 것을 뒤늦게 알게되었습니다.
만약 제대로 입력했다면 정말 정확한 값들이 나왔었기 때문에 아쉬움이 조금 남았습니다.
그래서 본선까지 남은 기간 동안에 추가 개발에 들어갔습니다.
레퍼런스 크기를 직접 입력하지 않아도 알아서 자동으로 크기를 인식할 수 있도록 하는 기능이었습니다.
A4 용지에 출력되어 있다면, 그 용지 크기로 부터 자동으로 레퍼런스 크기까지 인식해줍니다.
예선과 달리 본선에서는 다른 과제를 진행한 팀들과도 함께 경쟁을 해야했습니다.
즉, 결과물의 점수로 경쟁을 하는 것이 아니라 프레젠테이션에서 얼마나 높은 평가를 받을 수 있느냐가 중요했습니다.
그래서 프레젠테이션을 완전히 새로 만들었습니다.
각 과정을 구체적인 논리를 담아 근거를 추가했습니다.
최종 6팀에 선정이 되어 시상식에 참여하게 되었습니다.
당일 발표까지도 순위를 공개하지 않아서 참여하러 가면서까지도 설레는 마음이었습니다.
최종적으로 2등상인 금상을 수상하게 되었습니다.