Knowhow 105

Opencv imread/imwrite vs PIL open/save speed 및 memory 비교

이미지 파일을 읽을 때 opencv 혹은 PIL을 쓴다. 두 라이브러리의 기능적 차이는 없다만 경험적으로 보면 읽는 속도와 쓰는 속도가 다름을 알 수 있다. 상황에 따라서 opencv가 효율적일 때도, PIL이 효율적일 때도 있는데 각각 어떤 상황인지 파악해두었다. 왜 차이가 발생하는지 알 수 있는 경우는 이유도 같이 적는다. 이미지 읽기확장자가 PNG일 때 : opencv 써야 빠르다.cv2.imread/imwrite가 훨씬 빠르다. meta 정보를 포함한 DSLR 12MB 이미지의 경우, 10초 가량 차이가 날 때도 있다. 차이가 적을 땐 적지만 클 땐 10배도 난다. 웬만하면 opencv로 png 읽자.확장자가 JPG일 때 : PIL 써야 빠르다.Image.open으로 읽는 것이 약 2배 빠르다. ..

Knowhow/Vision 2024.06.22

원격 서버에 있는 폴더 mount 하기

원격 서버에 있는 폴더로부터 파일을 받거나, 폴더로 파일을 올리는 경우 터미널을 통해 하면 귀찮을 때가 많다. 특히 커맨드 실수했다간 파일을 통째로 날려먹을 일도 생길 수 있으니 개인적으로 파일 올리고 내리는 것은 GUI로 보고 drag and drop, copy and paste하는게 안전하다고 생각한다. SSD를 ubuntu에 마운트하듯이 ssh로 붙는 원격 서버의 폴더를 로컬 PC에 마운트할 수도 있는데 그 방법을 정리한다. 아주 간단하다. sudo apt updatesudo apt install sshfs # file system sshfs를 설치해둔 뒤, 다음 커맨드 한 방이면 끝난다. sshfs -p PORT_NUMBER USER@xxx.xxx.xx:SERVER_FOLDER_PATH LOCAL..

Knowhow/Linux 2024.05.24

Docker image 중 <none>:<none> 지우기

docker 이미지 빌드하다보면 빌드 실패 하는건 한 두 번 겪는 일이 아닌데 이 때 부산물로 :과 같은 이미지들이 생겨난다.  냅둬도 뭐 큰 상관은 없다만 이게 원래 만들고자 했던 이미지들의 용량을 그대로 들고 있기 때문에 너무 많이 쌓이면 메모리가 부족해진다. 따라서 명령어도 크게 안 복잡하니까 보이면 바로 바로 지우는게 좋다.sudo docker rmi $(sudo docker images -f "dangling=true" -q) # --force 가끔 아직 컨테이너에서 사용하고 있는 이미지라고 안 지워질 수도 있는데 십중팔구 쓰레기 컨테이너일 것이다. 그냥 --force 붙여서 강제 삭제해버리거나 확인 후 삭제하면 된다. sudo docker ps -asudo docker rm CONTAINER_..

Knowhow/Docker 2024.05.07

COCO bounding box format, scale factor

COCO bounding box format은 document를 보면 (x,y,w,h)을 따른다고 적혀있다. 순서대로 사각형의 left top (x, y) 값과 사각형의 (width, height)라는 뜻이다.  그런데 실제로 보면 값이 다음과 같이 0~1 값으로 normalize 되어있는 것을 볼 수 있다.45 0.479492 0.688771 0.955609 0.595545 0.736516 0.247188 0.498875 0.47641750 0.637063 0.732938 0.494125 0.51058345 0.339438 0.418896 0.678875 0.781549 0.646836 0.132552 0.118047 0.096937549 0.773148 0.129802 0.0907344 0.09722..

Knowhow/Vision 2024.04.25

ssh 원격 연결 후 파일 올리기/가져오기

ssh로 서버에 붙은 이후에 파일을 올리고 내릴 일이 많다. 서버에서 데이터를 꺼내서 보는 경우도 많고 실험용 데이터를 올리는 일도 많다. 이 때 scp를 이용하면 아주 간단하게 파일을 올리고 내릴 수 있는데 명령어를 맨날 헷갈려서 기록해둔다. 파일 올리기 scp -P [포트번호] -r [local경로, 상대경로 가능] SERVER_ID@SERVER_IP:[원격 경로, 절대경로로] 예시 scp -r /home/jseob/Desktop/data remote@xx.xx.xx:/home/data -r 을 추가하면 recursive하게 동작하므로 폴더 단위를 올릴 수 있고, 파일 1개일 경우 -r 빼면 된다. 중간에 띄어쓰기와 :을 잊지 말자 파일 가져오기 scp -P [포트번호] -r SERVER_ID@SER..

Knowhow/Linux 2024.04.17

Eigen 형변환 :Quaterniond, Vector3d to Matrix4d

Eigen을 활용해서 구현을 자주 하는데 그 때마다 quaternion과 translation을 표현하는 변수 타입이 섞이는 일이 많다. Vector4d가 편할 때, Quaterniond가 편할 때, Matrix4d가 편할 때가 각각 달라서 하나로 통일하긴 뭐하고 매번 서로 변환해가면서 쓴다. 같은 함순데 매번 새로 구현하는 것이 귀찮아서 이곳에 기록해둔다. 그냥 값을 일일이 복붙하는 식으로 구현해도 되지만 뒤에 ceres solver라도 붙이려고 한다면 메모리 주소가 공유돼서 연결되어 있어야 하므로 다음과 같이 구현하는 것이 좋더라. void qt2mat(Eigen::Quaterniond q, Eigen::Vector3d t, Eigen::Matrix4d& mat){ mat.block(0,0) = q...

Eigen Vector4d와 Quanterniond, 그리고 Ceres EigenQuaterniondParameterization()

Ceres를 이용하여 최적화 코드를 구현할 때 Eigen을 많이 활용한다. 특히 최적화 대상에 보통 rotation이 포함되는 경우가 많아서 Quaternion을 표기하는 과정에서 Eigen::Vector4d, Eigen::Quaterniond를 많이들 사용한다. 하지만 주의할 점이 있어 기록해두고자 한다. 그 내용은 각각 어떤 convention을 따르느냐는 것이다. 다시 말해 (w,x,y,z) 순서인지, (x,y,z,w) 순서인지 말이다. Eigen::Vector4dEigen::Vector4d는 (x,y,z,w) 순서를 사용한다. Hamilton convention으로 알려진 (w,x,y,z)이 아니다. argument 순서와 내부 데이터 저장 순서 동일하게 전부 (x,y,z,w) 순서를 사용한다. ..

Double sphere 모델 projection-failed region

광각 카메라 모델 중 double sphere 모델을 보면 수식 상 다음과 같이 projection이 실패하는 조건이 있다. 여기서 저 수식 (43)이 의미하는 범위가 대충 지금 광각 카메라가 표현할 수 있는 화각 범위 밖이라는 느낌은 오는데 정확히 어떤 형태인지가 궁금했다. 내가 캘리브레이션했었던 double sphere 모델 주변에 point를 채우고 수식(43) 조건에 필터링되는 point만 남기면 다음 그림과 같다.예상했던 것과 같이 카메라 뒤로 원뿔 형태로 퍼지는 영역이 잡힌다. 광각 이미지가 동심원을 그리듯 표현되어 있고 렌즈도 원이기 때문에 projection-failed 영역은 원뿔 모양이었다. invalid projection 을 그냥 무시하고 구현을 해왔었는데 영역을 보니... 무조건 ..

Knowhow/Vision 2024.02.28

Fisheye 카메라 모델도 solvePnP 이용해서 자세 초기화/추정하는 방법

카메라 자세를 초기화할 때 가장 많이 쓰이는 방법이 PnP를 사용하는 것이다. 이미 알고 있는 3D point set과 이미지에서 검출한 2D point set이 있을 경우, 수학적으로 자세를 아주 간단하게 구할 수 있고 심지어 opencv 함수로 구현되어 있기 때문에 단 한 줄이면 카메라 자세 값을 계산할 수 있다. 하지만 카메라가 광각 카메라여서 pinhole model로 표현이 안될 경우에는 이러한 접근이 어렵다. PnP 알고리즘은 3D point와 2D point 간의 관계가 서로 linear projection일 경우를 가정하기 때문이다. 다른 말로 표현하면 빛이 직진해서 바로 이미지로 맺혔을 경우에만 적용이 가능하다. 반면 광각 카메라 (특히 180도가 넘어가는) 의 경우, 2D point와 ..

Knowhow/Vision 2024.02.28

VScode를 활용한 container 원격 활용 방법 (VScode로 remote container 사용하기)

이전에 VScode를 running docker container에 붙여서 사용하는 방식을 정리한 바 있는데 (링크) 이번엔 VScode를 이용해 원격 PC에서 동작하고 있는 docker container에 접근하는 방법을 기록해보고자 한다. VScode가 보면 볼수록 편의성이 뛰어난 툴인 것 같다. Server PC에서 할 일 (원격 연결 당할 PC, container를 갖고 있는 PC) ssh 세팅을 완벽히 해두어야 한다. ssh로 연결됨을 확인해두면 특별히 VScode 관련해서 할 일은 없다. ssh 세팅은 이전 글 (링크) 참고해서 하면 되겠다. 계정 이름과 IP 그리고 포트 번호는 꼭 기억해두자. Client PC에서 할 일 (원격 연결 시도할 PC) 역시나 ssh 세팅은 당연히 되어있어야 한다..

Knowhow/Docker 2024.02.14