Knowhow 111

[TensorRT 튜토리얼] 1. Installing TensorRT

끄적끄적 딥러닝 모델을 써보거나 개발하는 일은 주로 하다보니 자연스레 실제 사용할 수 있는 형태로 가공하는 것까지 이야기가 나왔고, 결국 경량화하는 영역에 닿게 됐다. 경량화라는 이름 범주 안에 knowledge distillation부터 pruning, quantization, architecture search 등 많은 이론적 내용들이 있는데 그것들을 커버하는 것과 별개로, 어떻게 갖고 있는 하드웨어에서 빠르게 동작하도록 만들 것인지도 고려해야 했다. 그래서 가장 유명하고 document가 잘되어 있는 TensorRT를 A to Z 따라가면서 감을 한 번 잡아보고자 한다. 나는 컴퓨터 공학과 출신도 아니고 이런 low level(?) 내용을 다루어본 적이 없어서 사실 자신 없는데 구르면서 한 번 배워..

Knowhow/Others 2024.01.17

COLMAP[python] pycolmap 보다 편하게 colmap 사용하기

각종 논문에서 camera pose를 얻는 기본 방법으로 웬만하면 SfM을 사용하는데 그 때마다 SfM == COLMAP으로 생각하는게 당연할 만큼 COLMAP은 자주 접하게 되는 툴이다.  하지만 COLMAP은 기본적으로 c/c++ 기반으로 되어있어서 python 위주로 코딩할 때 사용성이 그렇게 좋은 편은 아니고 독자적인 포맷도 맞춰줘야 하기 때문에 뚝딱 쓰기엔 조금 시간이 걸린다. 더불어 SIFT 이하 feature 만을 사용하는 COLMAP이기 때문에 더 좋은 deep feature가 있어도 이를 COLMAP에 내장시켜 사용하는 것은 더 오래 걸린다. pycolmap이 있어서 python binding된 형태로 사용할 수 있지만, pycolmap 역시 deep feature를 기반으로 동작하도록 ..

Knowhow/Vision 2023.12.07

RealityCapture camera coordinate to opencv(vision) camera coordinate

RealityCapture 라고 유명한 photogrammetry 툴이 있다. 연구하는 입장에서는 colmap보다 훨씬 좋은 성능과 속도로 SfM을 돌려주는 툴이라고도 볼 수 있는데 graphics쪽 좌표계와 각종 설정이 섞여있어 좌표계가 자주 쓰는 좌표계와 완전히 다르게 되어 있다. 결과적으로 RealityCapture에서 뱉어주는 카메라를 별도의 후처리 없이 그대로 사용하게 되면 카메라가 지멋대로 돌아가있다.  온갖 검색을 해봐도 정확히 이해될 만한 좌표계 설명이 없고, 일반적으로 쓰는 roll, pitch, yaw 가 각각 x축, y축, z축 회전에 대응되는 것이 아니라 또 새로 정의한 순서이기 때문에 변환하는 일이 만만치 않았다. 결국 나도 온갖 자유도의 transformation과 roll, p..

Knowhow/Vision 2023.12.06

Open3d를 이용한 디버깅용 camera, bbox, origin visualization

데이터를 다루다 보면 주어진 3D point와 camera pose가 좌표계가 잘 맞춰져 있는지, coordinate origin을 어디인지, 방향은 맞는지 확인하는 것이 생각보다 귀찮고 까다롭다. 수십, 수백개나 되는 xyz 값이나 se3 값을 봐서는 알 방법이 없기 때문에 보통 시각화해서 보는데, colmap 외 사용 가능한 툴들도 제한적이고 매번 포맷을 맞추는 것도 귀찮다. 나 같은 경우, 간단히 open3d를 이용해 시각화하는 식으로 해결해왔는데 매번 반복적으로 코드를 구현하는 것이 귀찮아서 여기에 내가 주로 사용하는 디버깅용 코드를 기록해두려고 한다. Helper function들 def Rt2T(R, t): T = np.eye(4) T[:3, :3] = R T[:3, -1] = t.reshap..

Knowhow/Vision 2023.12.06

Sphere 상에서 normal vector uniform sampling

sphere상에서 normal vector를 뽑는 방법이 가장 간단하게는 위, 경도 상에서 uniform sampling해서 환산하는 방법일 것이다. 하지만 이 방법은 생각해보면 Equi-rectangular projection된 이미지 상에서 뽑아내는 것과 같은 효과이기 때문에 3D 공간 측면에서 생각해보면 극점 (north pole, south pole)에서 뽑히는 샘플이 많고 적도(equator)에서 뽑히느 샘플은 적으므로 충분히 고르다고 할 수 없다. 그러면 3D 공간 상에서 고르게 normal vector를 뽑으려면 어떻게 해야하는가? 머리를 굴려보면 대충 계산할 순 있겠다만 간단한 방식이 있다. sphere에서 고르게 normal vector를 뽑아내는 수식은 정의된 바가 있다. patchma..

Knowhow/Vision 2023.11.07

STL vector 팁들

.reserve() vs .resize() 이 두 개를 검색해보면 둘 다 vector의 크기를 사전에 할당해두는 함수들이라고 나오고 혼동하기 쉬운데, 전자는 초기값이 없고 후자는 있다는 차이 이상의 내용이 있다. 먼저 .reserve(A) 를 사용하면 A만큼의 메모리 공간을 해당 vector에 부여하고 잡아두는 것이 맞다. 하지만 메모리가 먼저 잡혀있는 것이지 실제 vector 사이즈가 A로 만들어지는 것이 아니다. 따라서 indexing이 안된다. 따라서 .reserve()를 사용하는 경우는, push_back으로 vector에 계속 넣어줄 것인데 이 과정에서 사이즈를 명시하지 않으면 내부적으로 확장하고 복사하고 확장하고 복사하고 하면서 시간 잡아먹으니 이 시간 효율을 높이고 싶을 때 쓴다. 반대로 ...

TBB 팁

1) TBB는 install 하고 나서 CMakeLists.txt 내에 find_package(TBB REQUIRED)만 추가해준다면 못 찾는 경우가 빈번함. 아래에 적힌 2개의 문장처럼 뭔 오류인지 모르겠는 말이 계속 나온다면 TBB를 못찾고 있는게 맞다. undefined reference to `tbb::interface7::internal::task_arena_base~~~ tbb::interface9::global_control::global_control(tbb::interface9::global_control::parameter, unsigned long) ~~~ 해결법은 미리 cmake되어서 모듈화되어있는 TBB를 연결해주는 방법이다. https://github.com/justusc/Fin..

Boost serialization 팁들

Tips 1) shared_ptr 와 같이 쓴 변수들은 A에 serialize() overriding을 해줬더라도 오류가 난다. 다음 include 필수. 세트로 도 잊지 말자. #include #include 2) 다음와 같은 오류명이 잔뜩 뜰 수 있음 [build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::detail::basic_iarchive::next_object_pointer(void*)' [build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::basic_binary_oprimitive::init()' [build] /u..

Boost serialization

c++에서 새로운 클래스를 정의하고 이로 만든 객체를 저장하고 싶을 경우가 있다. 나는 대표적으로 Frame이라는 클래스 내에 이미지, 이미지 경로, 이미지 feature, intrinsic parameters 등 전부 담아둔 뒤, 모든 입력 이미지를 Frame 객체로 만들어두는 작업에서 필요성을 느꼈다. 이 경우 저장을 어떻게 할지 멤버 변수마다 하나하나 지정해줘서 저장 함수를 구현해야 하기 마련인데 이게 도통 귀찮은 일이 아니기 때문에 이를 지원하는 기능이 boost에 있었다. boost의 serialization 기능을 이용해 객체 자체를 직렬화해버리고 그냥 파일에 써버리는 것이다. 당연히 human readable 형태는 아니지만 deserialization 기능을 이용해 다시 원복했을 때 저장했..

CMake 백과사전

CMake를 다룰 때 개념을 잡기 위해 반드시 보면 좋을 문서를 찾았다. 제목이 쪼오오금 도움이 되는 문서지만 실제로 도움이 많이 된다. 내용을 옮겨적기에 방대한 양이지만 다 쓸모있는 내용들로 길어진 것이어서 다 읽어볼만 하다. https://gist.github.com/luncliff/6e2d4eb7ca29a0afd5b592f72b80cb5c CMake 할때 쪼오오금 도움이 되는 문서 CMake 할때 쪼오오금 도움이 되는 문서. GitHub Gist: instantly share code, notes, and snippets. gist.github.com