Abstract


고해상도 표현은 위치에 민감한 vision problem(pose estimation, semantic segmentation)에서 상당히 중요하다. 기존까지 소개된 모델(ResNet, VGGNet, etc.)들은 Convolution과 maxpooling으로 고해상도 이미지가 저해상도로 연결되는 구조다. 이 논문은 전체 과정을 고화질로 유지하면서 이미지를 학습하는 High-Resolution Network를 소개한다.

Summary


HRNet은 두 가지 특성이 있다. 첫째로 고해상도 과정과 저해상도 과정을 병렬적으로 진행한다. 한 해상도 스트림(과정)이 Conv를 진행중일 때 동시에 다른 해상도 스트림도 Conv을 진행한다. 두번째로 반복적으로 두 과정 사이 정보를 주고받는다. 일정 시간 단위 동안 각자 Conv과정을 수행했다가 Stride Conv와 upsampling으로 각 과정 간 정보를 교환한다. 이 특성으로 인해 의미론적으로 풍부하고 공간적으로 정확한 결과를 얻을 수 있다. HRNet은 기존 모델들에 비해 Human Pose detection, Semantic segmentation, Object detection에서 우위를 나타냈다.

 

Fig 1, HRNet 기본 구조
Fig 2, multi-resolution fusion

HRNet의 진행과정은 다음과 같다. [Fig 1]

(1) 최초 이미지 입력시 two stride-2 3 X 3 convolution 맵을 통과시켜 해상도를 1/4로 줄인다.

(2) 여타 다른 모델들이 레이어를 통과하며 convolution과 maxpooling을 진행해서 해상도를 줄인 것과 달리, 일단 고해상도를 유지하며 convolution을 진행한다.

(3) 기존 고해상도 conv 과정은 유지한 채 Strided convolution으로 중저해상도인 채널 맵을 새로 제작해 conv 과정을 진행한다.

(4) Strided conv로 저해상도 채널 맵을 새로 제작하고, 총 3개의 진행과정 간 정보를 교환한다. 상대적 저해상도 채널 맵은 Up sampling 1X1으로 고해상도 채널 맵에 적용하고, 상대적으로 고해상도 채널 맵은 Strided conv 3X3으로 저해상도 채널 맵에 적용한다. [Fig 2]

(5) 4개 해상도 과정이 병렬적으로 진행됐다면 Representation Head로 출력한다. 출력방법에 따라 Representation Head는 HRNetV1, HRNetV2, HRNetV2p로 구분된다.

Fig 3, Header에 따른 HRNet의 종류. 왼쪽부터 HRNetV1, HRNetV2, HRNetV2p를 표현했다.

HRNetV1 : 오직 고해상도 스트림 결과물을 출력한다. 다른 3개 스트림 결과물은 무시된다. [Fig 3 (a)]

HRNetV2 : 저해상도 과정을 bilinear upsampling으로 고해상도 과정에 맞게 rescale하고 , 1X1 convolution 필터로 Fully connect 하며 4개 해상도 과정을 concat 한다. [Fig 3 (b)]

HRNetV2p : HRNetV2의 결과물을 downsampling 한다. [Fig 3 (c)]

 

이 논문에서는 Human Pose estimation(HPE)에 HRNetV1을, Semantic segemntation(SS)에 HRNetV2를, Object detection(OD)에 HRNetV2p를 적용했다. 데이터 셋은 HPE와 OD에는 COCO Dataset를, SS에는 Cityscape와 PASCAL-Context를 사용했다. 실험결과는 본문 참조 (세 분야 모두 SOTA급 성능을 보였다.)

의의, 느낀 점


기존 ResNet, VGGNet, U-Net은 모두 저해상도로 변환하는 과정이 필수 불가결 했지만, 본 HRNet은 고해상도를 유지하면서 Convolution을 진행하는 것이 괄목할만한 성능을 보임을 제시했다.

 Deoldify는 2018년 Jason Antic이 발표한 GAN 기반 흑백사진 채색 라이브러리다. 간단히 말해 흑백사진을 딥러닝으로 채색해 컬러사진으로 바꿔준다.

pytorch 기반으로 작성됐으며, Github에서 클론 후 개발 중인 Python 소스코드(.py)에 import 시켜서 사용할 수 있다.

또 Jupiter Notebook 파일 (.ipynb)로도 제공하고 있다. 간단히 사용만 해볼 목적이라면 Colab에서 Jupiter Notebook 파일을 사용해도 된다.

 

소스코드 및 사용법 : github.com/jantic/DeOldify 

 

jantic/DeOldify

A Deep Learning based project for colorizing and restoring old images (and video!) - jantic/DeOldify

github.com

 

 딥러닝을 접한지 얼마 안됐을때 컬러사진과 흑백사진을 1대1 라벨링 하여 Train Dataset으로 만들고 학습시키면 Validation 역할을 하는 무작위 흑백사진을 컬러사진으로 변환할 수 있지 않을까 하는 생각을 하곤 했다. 

비록 세부 원리는 달랐지만 같은 기능을 구현한 Deoldify가 나온 것을 보니 꽤 신기했다.


 

본 DeOldify 라이브러리는 기본적으로 GAN (Generative Adversarial Network) 모델 기반으로 SAGAN(Self-Attention

Generative Adversarial Network)과 NoGAN (말그대로 GAN이 아닌 학습법 (설명후술))을 차용해 모델을 구성했다. 따라서 GAN이 무엇인지부터 알아보자. 

 

1. GAN (Generative Adversarial Network)

 GAN은 직역하면 '생성 적대적 네트워크'라는 뜻이다. 생성 모델이란 '그럴듯한 가짜'를 만들어내는 모델이다. 수만명의 얼굴 이미지를 학습해 그럴듯한 가짜 얼굴을 만들어내는 모델을 들어본 적이 있을 것이다. 그렇게 현실에 존재하지 않는 그럴듯한 가짜를 만들어내는 모델을 생성 모델이라 한다.

 그렇다면 '적대적'이란 말은 무엇일까? 이는 GAN이 두 개의 모델을 적대적(Adversarial)하게 경쟁시키며 발전시킴을 의미한다. 그럴듯한 가짜 사진을 생성하는 '생성자 Generator'와 해당 사진이 가짜인지 진짜인지 구분하는 '구분자 Discriminator'를 만들어서, 생성자는 계속 사진을 만들게 시키고 구분자는 가짜 사진을 구분하게 시켜서 피드백을 준다. 그렇다면 생성자는 학습을 반복하며 구분자가 구분 할 수 없을정도로 사진 만드는 법을 배우게 되고, 시간이 흐르면 생성자의 가짜 사진은 완벽에 가깝게 발전한다. 

 

1번째 학습
생성자 : (가짜 사진을 하나 만들고) 이 사진 진짜로 찍은거게, 만든거게?  
구분자 : 엄청 티나;; 누가봐도 가짜잖아.
생성자 : 아 ㅇㅋ 이렇게 바꿔봐야지

2번째 학습
생성자 : (가짜 사진을 하나 만들고) 이 사진 진짜로 찍은거게, 만든거게?  
구분자 : 아니 티난다니까? 가짜잖아
생성자 : 아 ㅇㅋ 이번엔 이렇게 바꿔봐야지
.
.
151번째 학습
생성자 : (가짜 사진을 하나 만들고) 이 사진 진짜로 찍은거게, 만든거게? 
구분자 : 음.. 좀 긴가민가 한데.. 그래도 티가 나네. 가짜!
생성자 : 아 아직도 티가 나는가보네. ㅇㅋ 또 만들어 올게.
.
.
.
9372번째 학습
생성자 : (가짜 사진을 하나 만들고) 이 사진 진짜로 찍은거게, 만든거게?  
구분자 : 오 이건 진짜네 
생성자 : ㅋ 드디어 속는구만

 

'네트워크' 라는 말은 말그대로 뉴런 레이어를 쌓아 네트워크를 구성했다는 뜻으로, 우리가 흔히 알고 있는 Deep Learning을 사용했다는 뜻으로 이해하면 된다. 입력값이 뉴런들을 통과하며 가중치가 적용된 새 값을 갖게 되고, 그 다음 뉴런을 옮겨 옮겨 가며 가중치를 계속 적용시켜 결국 출력값을 내놓는다. 딥러닝을 학습시킨다는 것은 최적의 가중치를 찾아가게 됨을 의미한다. 이때 활성화 함수 (activation function)과 손실 함수 (Loss function), 오차 역전파(Backpropagation), 경사하강법(Gradient Descent)등의 여러 수학 함수와 방법들을 사용해 가중치를 업데이트 하게 된다. 자세한 사항은 내용이 너무 길어질 것 같아 기술하지 않겠다. (대신 여러 책에 매우 잘 써있다) 

 

 한문장으로 표현하자면 GAN은 생성이라는 문제를 풀기 위해 딥러닝 모델을 적대적으로 학습시키는 알고리즘이다.

 

2. cGAN과 SAGAN (Convolution GAN & Self-Attentioned GAN)

 상기한 GAN은 기본적으로 네트워크가 Fully connected 되어있기 때문에 Parameter가 최대치로 설정되어 있다. 이렇게 된다면 굳이 학습에 반영되지 않아도 될 주변 픽셀들이 같이 학습돼서 학습시간을 지연시킬 여지가 있다. 효율적이지 못한 것이다. 이를 극복하기 위해 CNN(Convolution Neural Network) 원리를 차용한 cGAN 이라는 방식이 대두됐다. 이는 간단히 표현하면 "이미지의 특징만 추출해서 학습시키겠다!"를 목표로 하는 모델이다. 굳이 이미지 전체의 픽셀을 학습하지 않고, Convolution Filter를 만들고 이미지를 통과시켜 특징만 추출 후 학습한다면 효율성이 커질 것이었다. 이는 가짜 이미지를 생성할 때 있어 효율을 대폭 증가시켰다. GAN 말고도 이미지 분류 (image classification) 등에서는 CNN 모델을 주로 쓰게 됐다.

 

 하지만 실무에서 사용해보니 cGAN이 이미지 내 공간 특징 (Geometry feature), 구조 특징 (Structure feature) 구현에 취약하다는 점이 제기됐다. 다음 예시를 보면 이해가 될 것이다. 

 

생성자 : (가짜 고양이 사진을 만들며) 봐바! 아주 귀여운 새끼 고양이 사진이야. 그럴듯 하지?

사람들 : 고양이 털 질감은 꽤 그럴듯 한데, 고양이 발이랑 땅바닥이랑 왜 붙어있지? 이게 고양이 다리인지 발인지 땅바닥에 붙어있는건지 구분이 안 돼;;

 

이는 충분한 Convolution 필터를 거치지 않았을 경우 추출한 특징과 멀리 떨어진 부분의 픽셀은 잘 이해하고 구현하지 못함을 의미한다. 이를 극복하려면 Convolution 필터를 더 많이 통과시켜야 하는데 이러면 학습시간이 크게 증가한다. 효율성을 위해 cGAN을 사용한건데 역으로 효율이 떨어지게 생겼다. 따라서 이를 보완한 SAGAN (Self-Attentioned GAN)이 제기됐다.

 

 SAGAN은 Convolution 특징 맵을 기반으로 이미지에서 집중해야 할 지역을 따로 표시한 'Attention map'을 또 만들어 이미지를 학습시킨다. 크게 도드라지는 특징만 내놓는 것이 아닌, 집중해야할 구역(Attention Region)을 만들고 그곳 특징을 추가로 추출해 정확도를 올리겠다는 목적이다. 자세한 구현법은 논문을 참조하자 : arxiv.org/abs/1805.08318

 

Self-Attention Generative Adversarial Networks

In this paper, we propose the Self-Attention Generative Adversarial Network (SAGAN) which allows attention-driven, long-range dependency modeling for image generation tasks. Traditional convolutional GANs generate high-resolution details as a function of o

arxiv.org

결국 이 전략은 완벽히 들어맞아 이미지 생성의 정확도를 한층 더 끌어올리는 결과로 이어졌다.

 

3. noGAN

 noGAN은 Deoldify 개발자 Jason Antic이 직접 제작한 알고리즘이다. 따라서 따로 논문은 없다 (개발자의 github에서 매우매우 강조하더라. 논문 따로 있냐고 문의를 많이 받은 듯).

 

 이 noGAN은 간단히 말해 '학습 횟수를 최소화 한 GAN'이다. Jason Antic은 SAGAN으로 Deoldify를 구현하며 일정 학습 횟수(epoch) 이상으로 올라가면 이미지가 나쁜 상태로 채색되는 현상을 발견했다. 예를 들어 피부가 지나치게 주황색으로, 입술이 지나치게 빨갛게 칠해지는 현상이 있던 것이다. 개발자는 사진 채색 마다 수많은 모델 체크포인트를 만들어 과적합 변곡점(Inflection point)를 찾았고, 그 변곡점의 평균치를 구해 조기 정지 시점으로 설정했다. 과적합이 일어나기 전에 학습을 끊어버리겠다는 목적이다. 훈련 손실 (Train Loss)가 최저로 도달하기 전에 학습을 중단하므로 채색 정확도가 떨어지는 단점이 있었지만, 이상한 색이 칠해지는 것 보다야 색을 좀 번지게 채색하는게 더 좋은 결과물이라 말할 수 있으므로 그렇게 설정했다고 한다.

 

기존 SAGAN Deoldify로 만든 채색 영상

 

noGAN 기반 Deoldify 채색 영상

 


 

백문이 불여일견. 직접 Deoldify로 채색한 사진을 소개한다. 부모님과 조부모, 증조부모님들의 사진을 직접 채색해봤다.

 

 

1. 1932년 6월, 할아버지의 소학교 수학여행 

 

 

 2. 1930년대 친척 어르신 장례식

 

 

3. 1957년 8월, 할아버지의 사무실 풍경

 

 

4. 1963년 8월, 할머니가 활동하시던 부녀자 모임 "꽃계"

 

 

5. 1971년 2월, 친가 결혼식 사진

 

 

6. 1976년 2월, 친가 가족사진

 

 

7. 1962년, 외할머니와 어머니, 큰 삼촌 

 

8. 1972년, 어머니와 중학교 친구 분

 

 

 

9. 1973년, 소양강 댐 나들이 가신 친가 어르신

 

 

10. 1977년, 아버지의 군시절 사진

 

 

 사실 이 모델에 관심이 갔던 이유는 부모님, 조부모님들의 옛날 흑백사진을 좀더 생생하게 만들어드리고 싶은 마음 때문이었다. 부모님이 보시고 매우 좋아하셔서 뿌듯했다. 흑백사진으로 남아있던 추억을 최신 기술로 채색해 다시 생생하게 살려내는 과정 자체가 너무 재밌었다. 

 인공지능의 발전은 새로운 미래를 개척하는 동시에 지나간 과거도 생생히 되살리는 역할을 함을 이번 기회에 크게 느꼈다. Deoldify의 원리를 살펴보고 구현법을 맛보는 동시에 부모님의 추억까지 되살릴 수 있어 뜻 깊은 기술 리뷰였다.  

 

 

 

 

 

참조 : qengineering.eu/install-opencv-4.5-on-raspberry-pi-4.html

webnautes.tistory.com/916

설치 환경 : Raspberry Pi 4, Rasbian OS January 11th 2021 (kernal 5.4), pi Camera 8MP

 

 

일반 개발 환경(윈도우, 리눅스 등)에선 pip로 openCV를 설치 할 수 있다.

pip install opencv-python

하지만 모종의 이유로 라즈비안OS에선 pip 사용이 불가하다. 따라서 openCV를 직접 빌드 및 컴파일 해서 설치해야 한다. 대략적인 설치 절차는 다음과 같다.

 

1. 기존에 깔린 openCV를 제거해준다

2. apt-get를 업데이트 및 업그레이드한다.

3. openCV 구동에 필요한 패키지를 설치한다.

4. openCV 설정을 입력하고 cmake로 빌드한다.

5. 스왑공간을 확장한다.

6. 컴파일한다.

7. openCV가 잘 설치됐는지 확인한다.

 

 

1. 기존 openCV 제거

Raspberry Pi OS with recommended software에는 openCV 2.4 가 기본 설치 되어있다. 4.5.0으로 업데이트 하기 위해선 반드시 삭제해줘야 한다.

 

ssh 또는 라즈베리파이 내 shell에서 다음 명령어로 openCV 버전을 확인한다.

pkg-config --modversion opencv

만약 다음과 같은 화면이 나오면 순정 상태이므로 바로 2번을 진행한다.

No package 'opencv' found

만약 다음과 같이 버전이 나오면 openCV를 제거해야 한다.

2.4.9.1

apt-get으로 패키지 삭제 툴을 다운받는다.

pi@raspberrypi:~ $ sudo apt-get purge  libopencv* python-opencv
pi@raspberrypi:~ $ sudo apt-get autoremove

다음 명령어로 기존 설치된 openCV 라이브러리를 삭제한다.

pi@raspberrypi:~ $ sudo find /usr/local/ -name "*opencv*" -exec rm  {} \;

 

 

2. apt-get 업데이트 및 업그레이드

apt는 리눅스 계열 OS의 프로그램 패키지 설치를 돕는 라이브러리다. 항상 최신으로 유지해주는게 중요하다.

apt의 업데이트, 업그레이드 진행 후 한번 재부팅 해준다.

pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get upgrade
pi@raspberrypi:~ $ sudo reboot

 

 

3. openCV 컴파일 전 패키지 설치

openCV 구동에 필요한 패키지를 설치한다.

 

- openCV는 C++ 기반이므로 리눅스 C컴파일러 cmake와 관련 라이브러리 툴 build-essential을 설치한다.

sudo apt-get install build-essential cmake

- 이미지 파일 읽기 쓰기에 필요한 패키지를 설치한다. 

sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev libwebp-dev libopenexr-dev

- 비디오 파일 읽기 쓰기 및 스트리밍에 필요한 패키지를 설치한다.

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev

- 리눅스 실시간 비디오 캡쳐 패키지인 v4l을 설치한다.

sudo apt-get install libv4l-dev v4l-utils

- openCV 작업 결과물이 보여질 GUI 라이브러리 gtk를 설치한다 (대체품 : libqt5-dev(일명 qt))

sudo apt-get install libgtk2.0-dev

- openCV 최적화 도구를 설치한다.

sudo apt-get install libatlas-base-dev gfortran libeigen3-dev

- openCV를 python 기반으로 사용할 것이므로 python 및 numpy를 설치해준다. 

sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy

 

 

 

4. openCV 소스코드 설치

openCV 설치파일을 담을 폴더를 제작하고 그 폴더로 이동한다.

sudo apt-get install python2.7-dev python3

mkdir opencv
cd opencv

 

정상적으로 이동했다면 다음과 같은 화면이 보인다.

pi@raspberrypi:~/opencv $

openCV 4.5.0 소스코드를 깃헙에서 직접 다운받고 압축을 풀어준다.

wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.0.zip
unzip opencv.zip

opencv_contrib 소스코드를 역시 직접 다운받고 압축을 풀어준다.

opencv_contrib은 opencv 구동에 필요한 추가 모듈이다.

wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.0.zip
unzip opencv_contrib.zip

opencv-4.5.0 폴더 내에서 build 폴더를 새로 만들어 준다. 컴파일은 이 폴더 내에서 이뤄진다.

cd opencv-4.5.0
mkdir build
cd build

정상적으로 이동했다면 다음과 같은 화면이 보인다.

pi@raspberrypi:~/opencv/opencv-4.5.0/build $  

 

 

5. cmake로 설정 입력 및 빌드

설치 설정은 cmake로 구성한다. 각 항목에 대한 설명은 생략한다.

다음을 복사해서 터미널에 붙여넣기 (Ctrl + shift + v) 해주면 된다.

  

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=OFF -D WITH_IPP=OFF -D WITH_1394=OFF -D BUILD_WITH_DEBUG_INFO=OFF -D BUILD_DOCS=OFF -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D ENABLE_NEON=ON -D ENABLE_VFPV3=ON -D WITH_QT=OFF -D WITH_GTK=ON -D WITH_OPENGL=ON -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.5.0/modules  -D WITH_V4L=ON -D WITH_FFMPEG=ON -D WITH_XINE=ON-D ENABLE_PRECOMPILED_HEADERS=OFF -D BUILD_NEW_PYTHON_SUPPORT=ON -D OPENCV_GENERATE_PKGCONFIG=ON -D WITH_OPENMP=ON -D BUILD_TIFF=ON -D WITH_FFMPEG=ON -D BUILD_TBB=ON -D WITH_EIGEN=OFF -D WITH_LIBV4L=ON -D WITH_VTK=OFF -D BUILD_opencv_python3=TRUE -D BUILD_EXAMPLES=OFF ..

 

* 4.5.0 버전이 아닌 다른 버전 설치를 원할 경우 상기 빨간색 4.5.0을 설치하고자 하는 버전으로 바꿔준다.

 

구성에 시간이 소요된다. 완료 시 다음과 같은 화면이 보이면 성공.

-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/opencv/opencv-4.5.0/build

 

 

6. 스왑메모리 확장

컴파일은 상당히 메모리를 많이 잡아먹는다. RAM 사용량 증가로 SD카드의 스왑메모리가 사용될 때를 대비해, 스왑메모리 용량 확장으로 메모리 부족 오류를 방지해야 한다.

  

nano 텍스트 에디터로 스왑메모리 관장 파일인 root/etc 폴더의 dphys-swapfile을 열어준다.

sudo nano /etc/dphys-swapfile

CONF_SWAPSIZE 를 100에서 2048로 수정 후 Ctrl + x로 저장, 종료한다.

# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don't want this, unless you have an special disk situation
CONF_SWAPSIZE=2048

스왑 서비스를 재시작하고 free 명령어로 스왑 메모리가 확장됐는지 확인한다.

sudo /etc/init.d/dphys-swapfile restart
free

다음과 같은 화면이 마지막 줄에 보이면 성공이다.

Swap:       2097148           0     2097148

 

 

7. 컴파일

모든 준비는 끝났다. make 명령어로 컴파일을 시작한다. 이때 소요시간 파악을 위해 time 명령어를 앞에 붙여준다.

멀티코어 사용을 위해 -j4를 뒤에 붙여준다. 

time make -j4

raspberry pi 4 4gb 기준 약 1시간 30분이 소요됐다. 과열 방지를 위해 시원한 환경에서 진행하거나 냉각팬을 구동하는 것을 권장한다. 하지만 필자는 아무 조치 없이도 과열은 일어나지 않았다.

 

컴파일이 완료되면 컴파일 결과물을 설치한다.

sudo make install

 

컴파일이 완료됐으므로 스왑메모리를 다시 원 값인 100으로 맞춰야 한다. 

nano 텍스트 에디터로 스왑메모리 관장 파일인 root/etc 폴더의 dphys-swapfile을 열어준다.

sudo nano /etc/dphys-swapfile

CONF_SWAPSIZE 를 2048에서 100로 수정 후 Ctrl + x로 저장, 종료한다.

# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don't want this, unless you have an special disk situation
CONF_SWAPSIZE=100

스왑 서비스를 재시작하고 free 명령어로 스왑 메모리가 확장됐는지 확인한다.

sudo /etc/init.d/dphys-swapfile restart
free

다음과 같은 화면이 마지막 줄에 보이면 성공이다.

Swap:        102396           0      102396

 

 

8. 설치 확인

먼저 openCV 설치버전을 확인해 볼 것이다.

python3 명령어로 파이썬 3.7을 실행하고 cv2를 임포트 후, 버전 출력 함수인 __version__을 사용한다.

pi@raspberrypi:~/opencv/opencv-4.5.0/build $ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import cv2
>>> cv2.__version__
'4.5.0'

'4.5.0'이 보이면 성공이다.

 

 

9. pi 카메라 설정 및 예시 소스코드 구동

일반 usb 형식 웹캠은 연결 시 바로 인식한다. 즉 딱히 다른 조치 없이도 바로 소스코드 구동이 가능하다.

일반 웹캠 사용자는 바로 10.으로 넘어가도 된다.

하지만 pi camera 사용자는 드라이버를 설치해야 한다.

 

먼저 pi camera를 라즈베리파이에 연결한다. (전원 끄고 연결을 추천)

후 콘솔에서 vcgencmd get_camera 명령어로 연결상태를 확인한다. 

supported 와 detected가 1이면 성공.

pi@raspberrypi:~ $ vcgencmd get_camera
supported=1 detected=1

 

modprobe 명령으로 bcm2835-v4l2 모듈을 로드한다.

이때 주의점으로 v4l2 에서 l은 알파벳 '엘'이다. (필자는 1로 오해해서 한참을 해멨었다.)

sudo modprobe bcm2835-v4l2

ls /dev/video0 -l 명령으로 /dev/video0 폴더가 생성됐는지 확인한다. (이때도 - 다음에 오는 글자는 알파벳 엘이다)

pi@raspberrypi:~ $ ls /dev/video0 -l
crw-rw----+ 1 root video 81, 0 Jun 25 15:57 /dev/video0

 

raspistill -0 image.jpg 명령어로 사진이 찍히는 지 확인해본다. 정상적이라면 바탕화면에 찍힌 사진이 저장된다.

raspistill -o image.jpg

 

다음은 opencv 기본 기능으로 실시간 영상을 출력하는 python 코드다.

소스코드를 복붙해서 main.py를 만들고, 이를 라즈베리파이 python에서 실행시켜 보면 정상적으로 영상이 송출될 것이다.

 

유의점으로 파이 카메라 사용시 cap = cv2.VideoCapture(-1)을 사용해야 한다. 

import numpy as np
import cv2

# 일반 웹캠이면 0 입력!
cap = cv2.VideoCapture(-1)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

 

 

 

 

 

 
 
 
 

 

준비물 : 라즈베리 파이 4 4GB, 32GB SD카드, USB3.0 충전기 (일반-고속 충전용 O, PD충전기 절대 X(과전압 우려))

 

1. 라즈비안 OS 다운로드

www.raspberrypi.org/software/operating-systems/#raspberry-pi-os-32-bit

 

Operating system images – Raspberry Pi

The Raspberry Pi is a tiny and affordable computer that you can use to learn programming through fun, practical projects. Join the global Raspberry Pi community.

www.raspberrypi.org

라즈베리파이 OS 버전은 3가지가 있다. 그중 두번째 Raspberry Pi OS with desktop (일명 vanilia)를 사용한다.

recommended software 버전은 개발에 필요한 여러 프로그램들이 내장되어 있는데, 어차피 프로그램-디펜던시는 그때그때 최신으로 다운받아 주는게 편하므로 순정 바닐라 버전을 선호한다. 

 

 

2. 라즈베리 파이 이미저로 라즈비안 OS를 SD 카드에 설치

www.raspberrypi.org/software/

 

Raspberry Pi OS – Raspberry Pi

The Raspberry Pi is a tiny and affordable computer that you can use to learn programming through fun, practical projects. Join the global Raspberry Pi community.

www.raspberrypi.org

OS를 SD카드에 씌워주기 위해 설치한다.

Operating System에서 방금 다운 받은 라즈비안 OS 설치파일을 선택하고

SD Card에서 설치할 SD카드를 선택한다.

Write 클릭하면 커피 한잔 마시면 설치 끝.

 

 

3. ssh 및 공유기 접속 파일 설치

라즈베리 파이는 마이크로 HDMI로 모니터 연결이 가능하나, 개발할 때 마다 모니터를 연결하는 수고로움을 덜기 위해  무선 원격으로 라즈베리 파이에 접근할 것이다.

 

요구사항은 다음과 같다.

(1) 라즈베리 파이가 부팅하자마자 무선 공유기에 연결함

(2) 라즈베리 파이가 무선 원격접속을 허용함.

 

(1)을 위해 wpa_supplicant.conf를 메모장으로 만들어 다음의 내용을 입력하고, SD카드 최상위에 위치시킨다.

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US
network={ ssid="와이파이 이름"
psk="와이파이 비번"
key_mgmt=WPA-PSK
}

 

(2)를 위해 ssh 파일을 메모장으로 만들어 SD카드 최상위에 위치시킨다. 

그냥 메모장 키고 아무 내용, 확장자 없이 ssh로 저장하면 된다. 그 후 sd카드 최상위에 위치 시킬 것.

이러면 부팅하면서 운영체제가 ssh 파일 존재를 확인하고 원격접속을 허용한다.

 

 

4. 공유기 설정에서 접속중인 라즈베리파이 아이피 확인 

공유기 관리자 페이지 접속 후, 연결 된 디바이스 확인란에서 라즈베리파이의 IP를 확인한다.

(공유기 제작사마다 관리자 페이지 주소가 다르므로 이는 검색이 필요하다. 필자는 iptime 공유기 사용 중으로 192.168.0.1로 접속함)

이때 아이피는 192.168 로 시작하는 공유 아이피여야 한다.

 

 

5. 윈도우 내장 원격 데스크탑 프로그램으로 접속

윈도우 검색창 - 원격 데스크톱 연결 - 라즈베리 파이 IP 입력 - 접속 클릭

기본 id, pw는 다음과 같다.

ID : pi

PW : raspberry

 

정상 접속 시 라즈비안 OS의 바탕화면이 보일 것이다. 말 그대로 원격접속이기 때문에 사용간 딜레이가 존재할 수 있다. 

 

 

(번외). putty로 라즈베리파이 콘솔 접속

상기 내용은 라즈비안 OS의 GUI 활용을 위해 원격 데스크탑 프로그램을 사용하는 과정이다.

라즈비안의 CUI만 사용을 원하면 putty 프로그램을 사용해 접속 가능하다.

www.putty.org/

 

Download PuTTY - a free SSH and telnet client for Windows

Is Bitvise affiliated with PuTTY? Bitvise is not affiliated with PuTTY. We develop our SSH Server for Windows, which is compatible with PuTTY. Many PuTTY users are therefore our users as well. From time to time, they need to find the PuTTY download link. W

www.putty.org

똑같이 5. 까지 진행 후 putty 실행하고 라즈베리파이 IP를 입력하면 콘솔로 접속이 가능하다.

 

+ Recent posts