'전체 글'에 해당되는 글 44건

  1. 2021.10.10 일요일을 혼자 보내는 방법.
  2. 2021.09.08 opencv SimpleBlobDetector, blob size 정리
  3. 2021.09.06 Ubuntu TensorFlow(2.6) GPU 설치

일요일을 혼자 보내는 방법.

아침의 늑장은 대게 이유가 있는 법이다. 누군가는 원래 아침은 체질상 약하다고 이야기 할 수 있겠지만, 과연 그도 소풍 전날, 새벽 비행기 타기 전날 보통날처럼 늑장을 부릴까. 약속이 없으며, '쉬는' 일정조차 없는 일요일. 전날 11시에 누웠음에도 불구하고, 8시에 이미 깨어있었음에도 불구하고, 자동 조명 장치가 8시 45분에 맞춰 모든 불을 켰음에도 불구하고, 오후 2시가 되어서야 침대에서 기어 나올 수 있었다. 


창문을 너무 오래 닫고 있어서 산소 농도가 떨어졌나 하고 손목의 스마트 워치를 봤지만 디스플레이에는 높은 산소 포화도가 적혀있었고, 바디 배터리 값은 4시간 전부터 100%를 유지하고 있었다. 자취 초반에는 이러한 일이 익숙했다. 그 당시 연애를 하지 않아서도 있었겠다만 통학으로 버려진 시간만큼 하루가 길어져 주말에는 이렇다 할 일이 남아있지 않았다. 


세수를 하면서 냉장고 내용물을 기억해내며 아침을 결정, 감동란 두 알과 베이컨, 토마토 주스다. 이정도 메뉴면 평상시 아침에 비해 과하게 호화로운 편. 아 점심이니 딱히 그렇지도 않으려나. 전날에 설거지하다 남긴 식기를 정리하며 아침, 아니 점심을 같이 준비했다. 


'늑장의 이유는 역시 커피를 마시지 않았기 때문'이라는 핑계를 막기 위해 식사 후 커피부터 내렸다. 저 우악스러운 커피콩 가는 소리는 알람시계 대용으로 써도 되지 않을까 하는 생각을 하며 필터지와 드리퍼를 준비했다. 핸드드립 주전자는 팔을 끝까지 뻗어야 닫는 위치에 있으니 쓰지 말자. 팔을 반의 반만 뻗은 위치에 있던 전기포트의 물을 바로 담아 아침커피를 내렸다. 그래, 먹은 것은 점심이지만, 커피는 아침커피이다. 


어제부터 필터가 막혀 작동을 멈춘 수족관 여과기를 청소하고, 일주일치 옷들의 다림질을 마치고 화장실을 호텔처럼 바꿔두니 3시 50분을 넘어가고 있었다. 오늘을 위해 넣어둔 샴페인을 누구랑 마실까 생각을 하다가 불렀을 때 올 수 있는 사람이 없다는 생각에 미치자 책을 한권 가방에 우겨넣고 무작정 밖으로 나왔다.


일요일을 혼자 보내는 방법. 정말 어려운 주제이다. '일요일을 보내는 방법'과 '혼자 시간을 보내는 방법'의 두 가지가 겹쳐졌으니 말이다. 아이러니하게도 일요일이 아닌 날에는 일요일을 보내고 싶어하며, 약속과 연구 미팅이 잡힌 당일에는 막상 혼자있고 싶어하는데 이 두 가지가 합쳐지니 당혹스럽기 짝이 없다. 마치 민트초코마냥 둘이 섞이니 (사람에 따라 생각이 다르겠지만) 기어오는 혼돈이 탄생했다.


이럴 때에는 무언가 생산적인 일을 하러간다고 변명이 되는 서점이 최고다. 저녁 식사도 같이 외부에서 마칠 생각이었기 때문에 강남 교보문고를 선택했다. 역 근처 일본 스파게티 집에서 리조또를 먹고 서점으로 향했다. 요리에 나왔던 향신료를 찾아보고 싶어서 요리책 코너를 서성이다가 결국 미스테리/스릴러 서적 코너에 종착했다. 얼마 전 배송비를 아끼기 위해서 함께 구매했던 책이 매대 위에 올라와있는 것을 보고 스스로의 탁월한 선택에 실웃음을 짓고 산 책과 죽은 책의 비율을 잠시 생각한 뒤 빈손으로 카페를 찾았다. 


마음 같아선 최근 참여하게 된 TRPG모임 사람들과 게임도 하고 맥주도 같이 마시고 싶었는데 지금이 딱 시험기간이라 그런지 다들 여유롭지 않은가보다. 시험 전에 모임을 한번 잡아보려고 운을 띄웠으나 펌블이 나와버렸다. 다음에 시험 끝난 누군가가 방을 살릴 때까지 조용히 있어야겠다.


할일은 많지만 10월 10일 일요일을 다른 무언가를 하기 위한 날이 아니라 순전히 일요일 그 자체로 즐기고 싶었다. 결국 남은 것은 책 세 챕터를 읽은 것과 이 글 뿐이지만 IT 정보만 가득한 죽 같은 블로그에 감정 한 조각을 올렸다는 것으로 만족해야겠다.   

'Mind Storage > Short Thoughts' 카테고리의 다른 글

21DEC12  (0) 2021.12.12
[키워드 에세이] 즐거움  (0) 2021.11.25
자취방 생필품 리스트  (3) 2019.03.01
Posted by Knowblesse

1. SimpleBlobDetector

parameter로 넣어준 조건에 따라 blob을 찾아줌.

알고리즘

  1. source image에 threshold를 적용.
    - parameter에 넣은 minThreshold 값(포함)과 maxThreshold 값(불포함) 사이를 thresholdStep으로 나누어 각각의 threshold를 사용해서 binary image로 바꾼다. 처음부터 binary를 넣어주려는 경우 기본 파라미터에서는 minThreshold=50, maxThreshold=220, thresholdStep=10 으로 설정이 되어있기에 이를 만져주어야 한다.
    binary image를 0과 255로 구성되도록 설정하고, minThreshold=253, maxThreshold=255, thresholdStep=1로 설정하면 최소한의 threshold 연산만 사용할 수 있다.
  2. 각각의 binary image에 대해서 findContours 함수를 적용해서 center를 계산.
  3. 각각의 binary image에서 찾은 contour들을 하나로 묶어줌.
    이때 minDistBetweenBlobs parameter를 사용한다.
  4. 찾아낸 Contour를 사용해서 blob의 최종 center와 radius를 확정. 이를 keypoint로 return

예시코드

import cv2 as cv

parameter = cv.SimpleBlobDetector_Params()
parameter.filterByArea = True
parameter.filterByConvexity = True
parameter.filterByCircularity = True
parameter.filterByInertia = False
parameter.filterByColor = False
parameter.minArea = 500  # this value defines the minimum size of the blob
parameter.maxArea = 10000  # this value defines the maximum size of the blob
parameter.minDistBetweenBlobs = 1 # not used in binary image
parameter.minConvexity = 0.3
parameter.minCircularity = 0.3

detector = cv.SimpleBlobDetector_create(parameter)
detected_blob = detector.detect(denoised_mask)
print(len(detected_blob))

2. keypoint size

keypoint는 pt 값과 size 값을 가지고 있는데 (다른 값들도 있지만 이 연산에서는 무의미한 것으로 추정) pt는 blob center의 x, y 좌표를 의미하지만 도무지 size에 대한 이야기가 없다.

내가 원하는 정보는 찾아낸 blob의 크기 (이를 둘러쌀 수 있는 최소한의 원의 반지름 이라던가 실제 blob의 픽셀 수라던가...)인데 나오는 size 값은 blob의 모양에 따라서 제각각이다.

blob detection 을 한뒤 pt를 기준으로 size/2 만큼의 radius를 가지는 원을 그린 결과물

4번째 스텝인 "찾아낸 Contour를 사용해서 blob의 최종 center와 radius를 확정." 에서 대체 무슨일이 일어나는 것이길래 이런 값이 출력되는지 모르겠다. 원 같은 경우는 그나마 비슷하긴 하지만 실제 위의 그림에서 볼 수 있듯이 지름 100px짜리 원의 blob 크기는 99.0151로 나온다. 여러 contour 들을 합치는 알고리즘을 들여다봐야 알겠지만 SimpleBlobDetector가 return하는 keypoint의 값만 사용해서 실제 blob의 크기를 알아낼 방법은 없는 것으로 보인다.

3. parameter의 minArea / maxArea

한 가지 주목할 점은 parameter로 사용하는 minArea / maxArea의 경우는 실제 blob으로 잡힌 object의 크기를 비교한다는 것이다. 한 변의 길이가 100px인 정사각형에 대한 keypoint의 size 값은 111.8034이지만 filterByArea 옵션을 켜고 minArea를 10000(100 * 100)으로 잡으면 정사각형을 찾지만, 10001을 사용하는 경우 정사각형을 찾지 못한다. circle의 경우는 사용한 radius를 사용해 수학적으로 계산한 넓이와 10 이하로 차이가 나는 것으로 보아 실제 pixel 수를 기준으로 filter 하는 것으로 보인다.

 

4. findContours 함수를 사용한 정확한 blob detection

때문에 내부에서 찾아낸 blob의 정확한 사이즈를 뽑아낼 수 있을 것이라고 기대했으나 실패했다.

사실 실제 4단계 step 중에서 사용하는 부분이 두 번째 step 뿐이기에 이쯤되면 그냥 findContous 함수를 써서 raw level에서 처리하는 것이 더 나을 것으로 보인다.

 

cnt = cv.findContours(binary_image, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)[0]

# Some basic features of the contour object
(x,y), radius = cv.minEnclosingCircle(k)
rect = cv.minAreaRect(k) # ((center x, center y), (width, height), rotation)
size = cv.contourArea(k)

뽑아내야 하는 blob의 수를 알고 있다면 area, 둘러싸는 직사각형의 가로 세로 사이즈 등등의 값을 얻은 뒤 단계적으로 filter를 적용하는 방법도 사용할 수 있다.

 

 

Posted by Knowblesse

Google아 TF2.6이 나온지 언젠데 아직도 install 페이지에 TF2.4 설치방법이 있더라.

일 안하니?

 

 

망할 파이썬을 쓰다보면 인생의 교훈을 한가지 얻을 수 있다.

새로운 것 나왔다고 바로 쓰지말고 나온지 좀 된 것을 쓰자.

 

그런데 기왕 셋업하는 김에 좀 최신 것을 쓰려고 했다가 시간을 엄청 날렸다. TensorFlow 자체 documentation 은 금방금방 업데이트를 해주는데 설치방법은 왜 여전히 그대로인지... 내가 설치할 당시에는 2.5 기준으로 documentation이 나와있었는데 2.5는 CUDA 11.2 버전이 필요하고, 홈페이지에 나와있는 설치방법은 11.0을 기준으로 나와있어서 그대로 설치했다가는 'tf 2.5 에서는 cuda 11.2 버전이 필요합니다' 에러를 낸다.

 

문제는 이 cuda 11.2가 그당시 완성이 덜 되어있어서 몇몇 라이브러리가 없었는데 이 때문에 수동으로 라이브러리를 다운받아 이름을 변경하여 넣어야 돌아갔다. 세상에.

 

화난 개발자들이 올린 글들의 도움을 얻어 어찌저찌 설치를 했는데 왜 이 글을 쓰냐... apt-get autoclean과 apt-get autoremove 를 썼다가 수동으로 다운받아둔 라이브러리가 다 날아갔다. 이왕 다시 셋업 하는거 기록으로 남겨두자는 마음으로 글을 작성한다.

 

docker를 쓰는 쉬운 방법도 있다는 것 같지만 docker에 대한 필요성을 딱히 못 느끼기에 사용하지 않았다. 그래도 가상환경을 사용하지 않고 새로운 패키지를 까는 것을 죄악이니 꼭 conda는 사용하길 바란다.

 

0. tensorflow 2.6 설치

혹시 설치하지 않은 경우...

pip install tensorflow==2.6

1. NVIDIA GPU driver 설치

자기 그래픽 카드에 맞게 최신으로 설치.

https://www.nvidia.com/download/index.aspx?lang=en-us 

 

Download Drivers | NVIDIA

 

www.nvidia.com

 

2. CUDA Toolkit 11.4 Update 1 (11.4.1) 설치

https://developer.nvidia.com/cuda-toolkit-archive

 

CUDA Toolkit Archive

Previous releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please select the release you want from the list below, and be sure to check www.nvidia.com/drivers for more recent production

developer.nvidia.com

콘솔에서 커맨드 실행전에 sudo 명령어를 사용하는 다른 명령을 사용해두는 것이 좋다.

안그러면 첫줄만 돌아가고 root password를 묻는 통에 둘째 라인부터 실행이 되지 않는다.

 

Ubuntu 18.04

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda-repo-ubuntu1804-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu1804-11-4-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

Ubuntu 20.04

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.1-470.57.02-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

3-1. cuDNN v8.2.2 for CUDA 11.4 다운

아래 사이트에서 cuDNN Library for Linux (x86_64)를 다운받으면 된다.

 

원래 Debian Package (dpkg)를 사용해서 설치하는 것이 제일 간단한데 이게 왜인지 실행이 제대로 되지 않는다.

 

혹시 시도를 해보려면 아래 링크에서 cuDNN Runtime Library for Ubuntu18.04 x86_64 (Deb)를 받으면 된다.

 

Ubuntu 20.04인 경우 해당 버전에 맞는 것을 받자. Developer 버전을 받지 않아도 된다.

 

아래 설치는 dpkg가 아닌 library를 통째로 받은 것을 전제로 진행할 것이다.

 

https://developer.nvidia.com/rdp/cudnn-archive

 

cuDNN Archive

NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks.

developer.nvidia.com

3-2. cuDNN v8.2.2 for CUDA 11.4 설치

https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html

 

Installation Guide :: NVIDIA Deep Learning cuDNN Documentation

The NVIDIA® CUDA® Deep Neural Network library™ (cuDNN) is a GPU-accelerated library of primitives for deep neural networks. cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, pooling, normalizati

docs.nvidia.com

위 링크에서 자세한 설치 방법을 알 수 있으나, 아래에 간략히 요약하겠다.

 

받은 파일은  .tgz 확장자로 tar.gz 파일이다. 내장 파일탐색기 nautilus로도 압축을 풀 수 있고, 터미널에서 tar -xzvf 다운받은파일명 으로 풀 수 있다.

 

내장 파일탐색기로 푸는 것이 쉬우니 그 방법을 추천한다.

 

tar 명령어로 푸는 방법은 아래와 같다.

더보기
tar -xzvf cudnn-11.4-linux-x64-v8.2.2.26.tgz

참고로, xzvf는 extract, gzip, verbosely list files processed, file 의 약자다.

 

다음으로 라이브러리를 CUDA Toolkit이 찾을 수 있는 장소에 넣어주어야 한다.

 

일반적으로 이는 /usr/local/cuda 폴더이며, 앞서 CUDA Toolkit을 설치하면 자동으로 생성되었을 것이다.

 

일단 터미널을 열고 압축을 풀어서 나온 cuda 폴더가 보이는 위치까지 간 뒤 아래 명령을 실행한다. 두 번째 명령이 파일이 많아서 시간이 조금 걸린다.

 

sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64 
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

4. 설치 종합

tensorflow v2.6 : tensorflow

CUDA Toolkit v 11.4.1 : CUDA 그 자체이다.

cuDNN v8.2.2 : library로 tensorflow 사용시 dynamic library 문제가 발생했다고 하면 이 친구가 문제인 것.

 

꼭 CUDA Toolkit은 cuDNN보다 먼저 설치해야 한다.

5. 확인

python에서 아래 코드로 GPU 사용을 확인해보자.

 

import tensorflow as tf

if tf.config.list_physical_devices('GPU'):
    print('TF is using GPU')
else:
    print('TF is NOT using GPU')

 

실행시 Information, Warning, Error로 로그가 나오는데, E만 없어도 대체로 정상작동하더라.

 

꼭 GPU로 돌아가는지 확인을 해보고 실행을 하자!

 

 

 

감사는 댓글이나 커피로 표현해주시면 감사히 받겠습니다.

paypal.me/knowblesse

 

 

 

Posted by Knowblesse