블로그 이미지
devtang
Instagram : @taebr0 devtaehyeong@gmail.com

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2020. 2. 28. 23:57 Jetson Nano

현재 Jetson nano에 깔려있는 CUDA 10.0 , JetPack 4.3 , OpenCV 3.4 버전을 기준으로 작성하였습니다.

 

 

 

YOLO ?

YOLO(You Only Look Once)는 이미지 내의 bounding box와 class probability를 single regression problem으로 간주하여, 이미지를 한 번 보는 것으로 객체의 종류와 위치를 추측합니다. 아래와 같이 single convolutional network를 통해 multiple bounding box에 대한 class probablility를 계산하는 방식입니다.

YOLO의 대한 자세한 원리와 설명은 아래 사이트를 참조해주세요.

 

https://github.com/zeuseyera/darknet-kr/blob/master/2_YOLO/yolo.md

 

 

zeuseyera/darknet-kr

:kr: 다크넷(darknet): C로 작성한 신경망 공개소스. Contribute to zeuseyera/darknet-kr development by creating an account on GitHub.

github.com

 

 

우선 YOLO 버전으로는 크게 두가지가 있습니다.

 

https://pjreddie.com/darknet/

 

Darknet: Open Source Neural Networks in C

Nightmare Use Darknet's black magic to conjure ghosts, ghouls, and wild badgermoles. But be warned, ye who enter here: no one is safe in the land of nightmares.

pjreddie.com

https://github.com/AlexeyAB/darknet

 

AlexeyAB/darknet

Windows and Linux version of Darknet Yolo v3 & v2 Neural Networks for object detection (Tensor Cores are used) - AlexeyAB/darknet

github.com

라즈베리파이나 젯슨 나노 보드에서 AlexeyAB 버전이 원활히 구동되는 것을 확인했습니다. 

두 버전의 차이는 알아보니 pjreddie버전이 원래 yolo v3의 저자가 만든 버전이고, AlexeyAB버전은 

아직까지도 활발한 업데이트를 하고 있으며 연구 목적(학습할때 mapping,손실율 등) 을 알 수 있습니다.

저는 AlexeyAB버전으로 설치하였습니다.

 

우선 기본적으로 업데이트를 한번 진행해줍니다.

sudo apt-get update
sudo apt-get upgrade

또한 YOLO는 실시간 객체인식 시스템 중 하나로 꽤 무겁기 때문에 GPU를 이용하여 돌려야 합니다.

Jetson nano는 초기 OS설치시에 CUDA가 기본적으로 설치가 되어 있기 때문에 설치할 필요가 없으며

경로만 export해줍니다. 

export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}

export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

 

darknet 을 받아줍니다.

git clone https://github.com/AlexeyAB/darknet

cd darknet

wget https://pjreddie.com/media/files/yolov3.weights

darknet에서는 coco data(COCO: Common Object in COntext)와 학습해 놓은 weights 파일을 제공하고 있는데, 

약 80개정도 사물을 학습해놓았습니다. 기본 제공해주는 데이터 파일로써, YOLO를 처음 접했을때 돌려보는 가장 기본적인 demo정도로 생각하면 됩니다. 추가적으로 Tensorflow Lite버전처럼 경량화된 샘플인 yolov3-tiny.weights 파일도 설치해주면 좋습니다.

wget https://pjreddie.com/media/files/yolov3-tiny.weights

이제 YOLO를 build하기 위해 Makefile을 vi 명령어를 통해 약간 수정해줍니다.

sudo vi Makefile

들어가면

GPU=1
CUDNN=1
OPENCV=1

이 세개부분이 원래 0으로 되어있으므로, 위에 사진처럼 1로 바꿔줍니다. 0쪽으로 방향키버튼을 통해 이동후 

s 버튼을 눌러 1로 변경후 ESC, 방향키버튼으로 이동후 s 버튼을 눌러 1로 변경후 ESC를 해줍니다.

 

*vi 명령어 

 

 

변경이 완료됬으면 Shift + ; ( : 콜론)누르고 wq! (쓰고 나가기) 를통해 vi창을 나갑니다.

명령어창으로 돌아와서 컴파일을 진행합니다.

make

이제 YOLO 설치는 끝이 났습니다. 정상적으로 설치되었는지 구동해보도록 하겠습니다.

 

간단한 사진예제 먼저 구동해보겠습니다.

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

tiny 버전으로 구동하고 싶다면 아래 명령어를 입력해줍니다. lite한 버전이라 위의 명령어보다 처리속도가 빨라요.

./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg

개와 자전거,트럭이 인식이 잘되는 것을 볼 수 있습니다.

사진이 정상적으로 인식 되는것으로 보아 YOLO가 잘 설치된 것 같습니다.

 

YOLO는 웹캠을 통해 출력되는 영상을 실시간으로 인식할 수 있습니다.

숫자 0으로 실행이 안되면 1로 바꿔서 해주시면 됩니다.

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights -c 0

마찬가지로 tiny 버전으로 구동하고 싶으면 아래 명령어를 입력해줍니다. 

./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -c 0

웹캠으로 실시간 인식한 구동 영상입니다.

 

tiny 버전으로 구동

위의 동영상은 tiny버전으로 GPU사용하여 구동하였습니다. 13~14 프레임으로

평균 10프레임 초중반대를 뽑아내줍니다. 일반yolov3.weight파일로 진행시 1~4프레임 정도밖에 안나오는데

라즈베리파이에서는 엄두도 못내는 실시간 인식을 꽤 괜찮은 성능으로 구동시켜주네요..

 

지금까지 YOLO의 기본 설정방법 및 예제 실행에 대해 글을 작성해 보았습니다.

서투른 글 읽어주셔서 감사합니다.

 

참고사이트)

*YOLO를 처음 접할때 어려웠던 부분이 많은데 몇년전 게시물임에도 불구하고 꾸준히 댓글로 질문들에 답변해주시고 계십니다. 

https://pgmrlsh.tistory.com/

 

개발자 이상현

Instagram:sh_lee77 머신비전, YOLO, 영상처리, Deep Learning, 딥러닝

pgmrlsh.tistory.com

 

'Jetson Nano' 카테고리의 다른 글

[OpenCV] Jetson nano에 OpenCV 3.4 설치  (0) 2020.02.28
[NVIDIA]Jetson nano OS 설치  (8) 2020.02.28
posted by devtang
2020. 2. 28. 16:51 Jetson Nano

제 나노 보드에 설치된 Jetson Nano Developer Kit image, CUDA 10.0, Jetpack 4.3 버전 기준으로 작성하였습니다.

 

우선 OpenCV 설치 전에 필요한 라이브러리 들을 설치해줍니다.

 

(참고) - pkg-config나 unzip 또는 cmake 같은 기본 도구들은 설치가 되어있는 상태에서 진행하였습니다.

위와 같은 문제는 구글 검색하면 쉽게 찾을수 있어요.

필요한 라이브러리

·pkg-config

·unzip

·cmake

·build-essential

 

버전 업데이트 및 업그레이드 설치를 해줍시다.

sudo apt-get update
sudo apt-get upgrade

OpenCV는 C++에비해 비교적 간결한 코드를 사용할 수 있는 python 을 지원합니다.

기본적으로 2.7이 설치되어있지만, numpy와 3버전대를 설치해줬습니다.

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

  OpenCV에 필요한 라이브러리를 설치해줍니다.

sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev v4l-utils 
sudo apt-get install libxvidcore-dev libx264-dev libxine2-dev
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install libgtk-3-dev
sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev
sudo apt-get install libatlas-base-dev gfortran libeigen3-dev

한번에 설치하면 안되는 경우도 있어서 혹시나 오류가 발생하면 

sudo apt-get install libjpeg-dev

sudo apt-get install libpng-dev 

이렇게 하나하나씩 직접 설치하셔도 괜찮습니다.

 

다 설치가 완료되면 본격적인 OpenCV 설치를 진행합니다.

mkdir opencv
cd opencv
wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.0.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.0.zip

opencv라는 폴더를 만들고 폴더안에 opencv.zip 과 opencv_contrib.zip 을 다운받아줍니다.

중요한것은 opencv 와 opencv_contrib 버전이 동일해야 합니다. (3.4.0)

 

설치가 완료되면 압축을 풀기위해 아래와 같은 명령어를 입력해줍니다.

unzip opencv.zip
unzip opencv_contrib.zip

이제 빌드 및 설치를 위해 build폴더를 생성하여 빌드 준비를 합니다.

cd opencv-3.4.0
mkdir build
cd build

build 주의! - 한글자라도 틀리면 안되니까 메모장 같은데 복사해놓고 쓰세요.

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 WITH_QT=OFF \
-D WITH_GTK=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.0/modules \
-D WITH_V4L=ON  \
-D WITH_FFMPEG=ON \
-D WITH_XINE=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D PYTHON2_INCLUDE_DIR=/usr/include/python2.7 \
-D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include/ \
-D PYTHON2_PACKAGES_PATH=/usr/lib/python2.7/dist-packages \
-D PYTHON2_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
-D PYTHON3_INCLUDE_DIR=/usr/include/python3.6m \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include/  \
-D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages \
-D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so \
../

이후 make 를 해줘야되는데 -j숫자(원하는 코어사용갯수)를 입력해줍니다.

-j4를 입력하게되면 코어4개를 다사용하므로 발열이 상당히 심합니다. (오류가 날 수도 있음)

쿨러나 보드를 식힐 수 있는 선풍기가 있을때 사용하는걸 추천합니다.

make -j4
make -j2

이과정에서 꽤 걸립니다!! 저는 -j4로 코어 다사용해서 돌렸는데도 50분정도 걸렸습니다.

발열도 심하고 굉장히 오래걸리니까, opencv 빌드중에는 보드 사용을 자제하는게 좋을것 같아요.

물론 엄청 느려져서 원활한 구동도 어렵습니다.

 

OpenCV 컴파일 결과물

sudo make install
sudo sh -c 'echo '/usr/local/lib' > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig

이렇게 해서 OpenCV가 설치가 완료됬습니다.

다음 게시물은 YOLO설치 및 구동을 올릴 예정입니다.

posted by devtang
2020. 2. 28. 14:43 Jetson Nano

NVIDIA에서 수백만개의 지능형 시스템 구축을 할수 있는 초소형 컴퓨터 Jetson nano를 출시했습니다.

Jetson nano

 

Bringing the Power of AI to Millions of Devices

NVIDIA Jetson Nano enables the development of millions of new small, low-cost, low-power AI devices.

www.nvidia.com

가격은 99달러로 우리나라에서 약 12~13만원에 구매가 가능합니다.

학생들이나, 개발자, 발명가들이 합리적인 가격으로 최신 AI를 구동할 수 있게 됬습니다.

 

라즈베리파이와 마찬가지로 SD카드에 이미지를 구워 구동시킬 수 있으며,

기본적인 사양은 라즈베리파이보단 성능이 조금 뛰어납니다.

사양은 1.4GHz 쿼드 코어 ARM A57 CPU, 128 코어 NVIDIA Maxwell GPU 및 4GB RAM를 갖추고 있습니다.

 

 

또한 Jetson nano에는 40개의 GPIO핀이 있어서 LED,모터,센서 등과 연결할 수 있습니다.

단점으로는 와이파이가 지원이 안되서 동글을 사용하거나 랜카드를 사용해야합니다.

라즈베리파이와 마찬가지로 sd카드에 os를 갖추어 꽂아서 사용하게 되어있습니다.

OS를 설치하기 위해서는, 아래 사이트에서 Jetson Nano Developer Kit SD Card Image 를 설치해야합니다.

https://developer.nvidia.com/embedded/downloads

 

Jetson Download Center

Get downloadable documentation, software, and other resources for the NVIDIA Jetson ecosystem.

developer.nvidia.com

이미지 파일을 다운받아서 압축을 풀고 난후, Win32DiskImager를 이용하여 os 세팅을 해줍니다.

sd-blob-b01.img 

sd 카드리더기를 이용하여 Write 버튼을 눌러줍니다.

100%될때까지 기다려줍니다.

끝나고 완료되고 나면 왼쪽하단에 Done. 표시와 함께 디스크를 사용하기 전에 포맷해야 한다는 문구가 열개이상 뜨는데

이때 모두 취소버튼을 눌러줍니다.

 

이렇게 하면 SD카드에 우분투가 세팅이 완료됩니다. 이제 SD카드를 Jetson nano에 부착시켜줍시다.

 

마이크로 USB로도 전원 연결을 할 수 있지만, 전력이 낮아 꺼지게 될 가능성이 높습니다.

저는 무선 마우스,키보드, 와이파이 동글을 이용하고 있으므로 전력소모가 커 5V DC어댑터를 전원으로 연결시켰습니다.

 

초록색 NVIDIA 문구와 함께 부팅이 시작됩니다.

우분투 기본 환경 설정중입니다.

자 모든설정이 완료가되고 정상적으로 Jetson nano에 OS를 깔았습니다.

다음엔 OpenCV를 설치하는 포스팅을 게시하겠습니다.  

posted by devtang
2020. 2. 26. 15:38 OpenCV

OpenCV를 이용하여 비주얼 스튜디오 2015 에서 지정된 이미지를 축소 하고 회전시킬 수 있습니다.

 

 

먼저 코드를 실행시킨 모습입니다.

원본 사진의 크기와 축소시킨 사진의 크기를 비교했습니다.

원본 사진의 해상도는 1280 X 1920이며 1/4 크기, 320 X 480로 축소시켰습니다.

	Mat image; // 빈 영상 생성
	image = imread("woman.JPG", IMREAD_COLOR); //이미지 읽기

	if (image.empty()) //이미지를 제대로 읽을 수 없으면 에러 메시지 출력
	{
		printf("Loading Error!");
		return 0;
	}

	/*콘솔창에 띄워주기*/
	printf("Original image is %d x %d\n", image.rows, image.cols);
	namedWindow("Original image"); // 원본 이미지를 전시할 창 만들기 
	imshow("Original image", image); // 원본 이미지 보여주기



	/* 축소 이미지띄우기 */
	Mat resized_image; //축소된 이미지 저장
	resize(image, resized_image, Size(), 0.25, 0.25, INTER_AREA);  //원본 이미지 크기 조정하기. 가로 세로 모두 1/4로 축소. 
	printf("Resized image is %d x %d\n", resized_image.rows, resized_image.cols); // 축소된 이미지 사이즈 출력
	namedWindow("Resized image");
	imshow("Resized image", resized_image); // 축소된 이미지 보여주기

이미지를 imread 함수로 불러온 후 resize 함수를 이용하여 0.25(1/4)로 축소하도록 선언했습니다.

상세 기능은 주석으로 달았습니다.

 

이번에 쓴 기능은 원본사진의 크기만큼 빈 이미지파일을 생성시킨후에 축소된 사진을 복사하여 넣었습니다.

 

/* 축소 이미지->원본사이즈에 대입 */
	Mat cover_image(image.rows, image.cols, CV_8UC3); // 원본사이즈만큼의 빈 이미지 생성
	resized_image.copyTo(cover_image(Rect(100, 100, resized_image.cols, resized_image.rows))); //축소한 이미지를 원본사이즈크기에 결합
	imshow("covered_image", cover_image);

cover_image라 이름을 짓고, copyTo를 이용하여 복사하여 넣습니다.

 

마지막으로 사진을 원하는 각도만큼 회전시킬 수 있습니다.

 

/*회전 이미지 띄우기 */
	Mat rotation; // 회전할 이미지
	Point2f pt(resized_image.cols / 2., resized_image.rows / 2.); //Point2f 로 회전시킬 이미지의 중심 설정 (정중앙)
	Mat r = getRotationMatrix2D(pt, 45, 0.7); // 사진 회전시키기 (사진 중앙값, 회전값, 사진 비율) 
	warpAffine(resized_image, rotation, r, Size(resized_image.cols, resized_image.rows)); //설정해준 값을 회전시켜줌
	imshow("rotate_image", rotation);

Point2f로 이미지를 회전시킬 때 중심을 설정해줍니다.

축소한 사진의 가로,세로에 2로 나누면 정중앙을 기준으로 회전합니다.

getRotationMatrix2D()함수를 이용해 각도, 사진의 크기 비율을 조절하여 회전시킬 준비를합니다.

warpAffine()함수는 설정해준 값을 기준으로 회전 시켜줍니다.

 

아래는 전체 소스입니다.

#include <opencv2/opencv.hpp> 
#include <iostream>

using namespace cv;

int main()

{

	Mat image; // 빈 영상 생성
	image = imread("woman.JPG", IMREAD_COLOR); //이미지 읽기

	if (image.empty()) //이미지를 제대로 읽을 수 없으면 에러 메시지 출력
	{
		printf("Loading Error!");
		return 0;
	}

	/*콘솔창에 띄워주기*/
	printf("Original image is %d x %d\n", image.rows, image.cols);
	namedWindow("Original image"); // 원본 이미지를 전시할 창 만들기 
	imshow("Original image", image); // 원본 이미지 보여주기



	/* 축소 이미지띄우기 */
	Mat resized_image; //축소된 이미지 저장
	resize(image, resized_image, Size(), 0.25, 0.25, INTER_AREA);  //원본 이미지 크기 조정하기. 가로 세로 모두 1/4로 축소. 
	printf("Resized image is %d x %d\n", resized_image.rows, resized_image.cols); // 축소된 이미지 사이즈 출력
	namedWindow("Resized image");
	imshow("Resized image", resized_image); // 축소된 이미지 보여주기

	/* 축소 이미지->원본사이즈에 대입 */
	Mat cover_image(image.rows, image.cols, CV_8UC3); // 원본사이즈만큼의 빈 이미지 생성
	resized_image.copyTo(cover_image(Rect(100, 100, resized_image.cols, resized_image.rows))); //축소한 이미지를 원본사이즈크기에 결합
	imshow("covered_image", cover_image);

	/*회전 이미지 띄우기 */
	Mat rotation; // 회전할 이미지
	Point2f pt(resized_image.cols / 2., resized_image.rows / 2.); //Point2f 로 회전시킬 이미지의 중심 설정 (정중앙)
	Mat r = getRotationMatrix2D(pt, 45, 0.7); // 사진 회전시키기 (사진 중앙값, 회전값, 사진 비율) 
	warpAffine(resized_image, rotation, r, Size(resized_image.cols, resized_image.rows)); //설정해준 값을 회전시켜줌
	imshow("rotate_image", rotation);

	waitKey(0);

	return 0;

}

감사합니다.

'OpenCV' 카테고리의 다른 글

[Python] OpenCV 비디오 출력하기  (0) 2020.07.29
[Python] OpenCV 이미지 출력하기  (0) 2020.07.29
posted by devtang
2020. 2. 25. 20:54 AI/TensorFlow Lite

*참고한 사이트는 게시글 하단에 남겨놓겠습니다.

 

 

Tensor Processing Unit

구글에서 Coral Edge TPU 라는 제품을 냈습니다.

 

Google Coral USB Accelerator

구글 코랄 USB 액셀레이터 / 컴퓨터에 꽂아 Google Edge TPU 보조프로세서로 기능하는 제품 / USB 3.0 C타입 / Google 클라우드와 호환 / 로컬 인공지능

www.devicemart.co.kr

 

USB 형식으로 컴퓨터에 꽂아 뉴럴 네트워크의 연산속도를 가속화 해주는 제품입니다.

컴퓨터 제품에 간단하게 꽂아서 쓸수 있어서 좋은점도 있지만, USB형식이라 라즈베리파이와 같은

싱글보드 컴퓨터에 호환이되는것이 흥미롭습니다.

 

되게 아담합니다. ( 소프트 점보 지우개 수준 )

Tensorflow Lite 버전밖에 지원이 되지 않지만 그래도 라즈베리파이에서 실시간 사물 인식을

꽤 높은 프레임으로 실행할 수 있어서 괜찮은 제품인 것 같습니다.

라즈베리파이에 USB를 꽂으면 기계에서 LED가 켜집니다.

 

라즈베리파이에 이용하려면 아래 3가지가 설치 되어있어야합니다.

(라즈베리파이가 지원되지만 Coral 공식 홈페이지에서는 3B+ 모델과 4 모델에만 테스트 했다고 합니다.)

 

1. Python 3.5 이상 설치

2. Edge TPU Runtime 설치

3. TensorFlow Lite 설치

 

1. Python 3.5 이상 설치

라즈베리파이 스트레치 버전(제 기준)에는 파이썬이 2.7.x 버전대로 설치되어 있으므로 아래와 같은 명령어로 파이썬을 설치해줍니다. 

sudo apt-get update
sudo apt-get install python3

 

2. Edge TPU Runtime 설치

coral에서 제공하는 클라우드 패키지를 라즈베리에 저장합니다.

echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt-get update

이제 TPU runtime을 설치합니다. 

표준 클럭으로 설치하려면 아래의 명령어를 입력하세요.

sudo apt-get install libedgetpu1-std

클럭을 최대로 높이고 설치하려면 아래의 명령어를 입력하세요. (라즈베리파이에 쿨러가 없다면 왠만하면 비추입니다.)

sudo apt-get install libedgetpu1-max

설치가  완료되면 Coral USB Accelerator를 라즈베리파이에 꼽고 Tensorflow Lite 설치를 합니다.

 

3. TensorFlow Lite 설치

 

라즈베리파이3 파이썬3.7.x 버전 이므로 아래와 같은 명령어를 입력하여 다운로드 합니다.

wget https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp37-cp37m-linux_armv7l.whl

다운로드 받은다음 pip 명령어로 설치합니다.

pip3 install https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp37-cp37m-linux_armv7l.whl

 

다른 버전의 TensorFlow Lite를 원하시면 아래 사이트를 참조하세요.

https://www.tensorflow.org/lite/guide/python

 

Python quickstart  |  TensorFlow Lite

Using TensorFlow Lite with Python is great for embedded devices based on Linux, such as Raspberry Pi and Coral devices with Edge TPU, among many others. This page shows how you can start running TensorFlow Lite models with Python in just a few minutes. All

www.tensorflow.org

 

이제 모든 설치가 완료되었으면, 정상적으로 구동이 되는지 확인해봅시다!

 

coral이라는 폴더를 생성하고 github에서 예제 코드를 받아옵니다.

mkdir coral &&  cd coral git clone https://github.com/google-coral/tflite.git

새(bird)를 분류하는 텐서플로우 기본 예제를 다운 받아옵니다.

cd tflite / python / examples / classification bash install_requirements.sh

parrot.jpg

파이썬으로 예제 그림을 추론할 수 있는지 돌려봅니다.

python3 classify_image.py \ 
--model models / mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \ 
--labels models / inat_bird_labels.txt \ 
--input images / parrot.jpg

아래와 같이 나오면 TensorFlow Lite 가 정상적으로 설치됬습니다.

INFO: Initialized TensorFlow Lite runtime.
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
15.3ms
3.0ms
2.8ms
2.9ms
2.9ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.76562

Ara macao가 무엇인고 찾아봤더니

금강앵무새라고 하네요. 사진보니 위의 예제 사진과 동일한 새입니다.

 

올바르게 설치된 것 같으니 이제는 사물인식 코드를 이용해서 실시간 웹캠으로 사물인식을 해보겠습니다.

 

https://github.com/google-coral/edgetpu/blob/master/examples/object_detection.py

 

google-coral/edgetpu

Source code for the Edge TPU API library. Contribute to google-coral/edgetpu development by creating an account on GitHub.

github.com

 

Lite버전임에도 불구하고 은근 정확도가 높습니다.

 

0  person
1  bicycle
2  car
3  motorcycle
4  airplane
5  bus
6  train
7  truck
8  boat
9  traffic light
10  fire hydrant
12  stop sign
13  parking meter
14  bench
15  bird
16  cat
17  dog
18  horse
19  sheep
20  cow
21  elephant
22  bear
23  zebra
24  giraffe
26  backpack
27  umbrella
30  handbag
31  tie
32  suitcase
33  frisbee
34  skis
35  snowboard
36  sports ball
37  kite
38  baseball bat
39  baseball glove
40  skateboard
41  surfboard
42  tennis racket
43  bottle
45  wine glass
46  cup
47  fork
48  knife
49  spoon
50  bowl
51  banana
52  apple
53  sandwich
54  orange
55  broccoli
56  carrot
57  hot dog
58  pizza
59  donut
60  cake
61  chair
62  couch
63  potted plant
64  bed
66  dining table
69  toilet
71  tv
72  laptop
73  mouse
74  remote
75  keyboard
76  cell phone
77  microwave
78  oven
79  toaster
80  sink
81  refrigerator
83  book
84  clock
85  vase
86  scissors
87  teddy bear
88  hair drier
89  toothbrush

89개의 객체가 학습되어있습니다. 가지고 놀다보면 꽤 재밌어요 ㅎㅎ

아래는 실시간 웹캠 영상입니다.

TensorFlow Lite를 이용한 사물 인식 영상으로 마무리 짓겠습니다.

 

서투른 글 읽어주셔서 감사합니다.

 

참고사이트

https://coral.ai/docs/edgetpu/multiple-edgetpu/

https://coral.ai/docs/accelerator/get-started#2-install-the-tensorflow-lite-library

https://www.tensorflow.org/lite/guide/python

 

Python quickstart  |  TensorFlow Lite

Using TensorFlow Lite with Python is great for embedded devices based on Linux, such as Raspberry Pi and Coral devices with Edge TPU, among many others. This page shows how you can start running TensorFlow Lite models with Python in just a few minutes. All

www.tensorflow.org

 

Get started with the USB Accelerator | Coral

Learn how to set up the Coral USB Accelerator and run some demo code.

coral.ai

 

Run multiple models with multiple Edge TPUs | Coral

 

coral.ai

 

posted by devtang
2020. 2. 25. 16:24 개인 프로젝트

 

연구실에서 개인적으로 진행해본 프로젝트 데모영상입니다.

 

출입알림시스템 데모 영상

 

 

계획하게된 계기

우선 저는 대학교 학부생으로 정보통신공학전공 연구실에 들어왔습니다.

라즈베리파이와 우분투 환경에대해 공부하던중에 ㅎㅎㅎ

교수님이 출입하시면 게임하다 걸리면 혼날거같아서 ㅎㅎㅎ

YOLO를 이용하여 연구실 인원 얼굴을 학습하여 출입시 누군지 인식하고 음성으로 알림 해주는 프로그램을 만들 계획을 짜게 되었습니다.

 

출입알림 시스템을 만들기 위해서 제가 간단히라도 공부했던 내용을 정리해보면

 

● YOLO 학습 ( 머신러닝의 원리, 데이터 학습원리 및 방법 )

● 라즈베리파이 

● OpenCV를 이용한 영상처리 기법

● TCP/IP 소켓 프로그래밍

● 카카오API, 구글 API를 활용한 TTS(Text to Speech), STT(Speech to Text)

 

2학년이 막 끝난 시점에 연구실에 처음 들어오게된 저로써는 , 처음에 그냥 공부하려니

되게 낯설었지만, 작은 프로젝트 하나라도 제대로 구현해보자 하는 마음으로 프로젝트에 

쓰일만한 내용을 학습했습니다.  특히~ 소켓 잡을때는 진짜 하기 싫었네요 ㅎㅎ

 

아무튼 어느정도 공부하면서 확실한 계획을 세웠습니다.

 

1단계 : 연구실 내의 모든 사람들의 얼굴을 학습한 후 실시간 감지 확인

 

 

첫번째로, 우리의 얼굴을 학습시킨후, 정상적으로 인식이 되는지 확인하였습니다.

 

YOLO는 Ubuntu환경에서 구동하였고, 1인당 1300~1400장의 얼굴 데이터를 학습시켰습니다.

 

 

얼굴 학습후 테스트 영상

YOLO 학습했던 내용은 추후에 추가 업로드 예정입니다.

 

2단계 : 양방향 소켓 통신 확인 (문자열 송수신)

 

소켓 프로그래밍은 도서관에서 책을빌려 병행하면서 공부했었네요

윤성우의 열혈 TCP/IP 프로그래밍

 

====== 오렌지 미디어 ======

             목록 서버1   서버2 강의시간 강의교안  PART 01 네트워크 프로그래밍의 시작    Chapter 01 네트워크 프로그래밍과 소켓의 이해        01-1. 네트워크 프로그래밍과 소켓의 이해① 27:43        01-1. 네트워크 프로그래밍과 소켓의 이해② 07:58        01-1. 네트워크 프로그래밍과 소켓의 이해③ 12:52        01-2. 리눅스 기반 파일 조작하기 27:27        01-3.

www.orentec.co.kr

 

라즈베리파이 <-> 우분투 간의 소켓 통신 확인후

YOLO에서 감지했을때 txt파일에 인식한 사람의 이름을 써주고

실시간으로 소켓으로 txt파일을 읽어서 라즈베리파이에 전송해주는 식으로 구상했습니다.

 

라즈베리파이로 출력하는 음성은 카카오 API 를 이용하여, 각 사람들의 음성파일을 만들었습니다.

 

MobaXterm을 이용한 음성파일 추출

소프트웨어적인 구현은 거의 완벽하게 진행되어있으나

하드웨어적 효율적 구현은 추후에 할예정입니다. 

 

YOLO가 인식하기에 카메라가 상당히 먼곳에 있어 인식이안되서 USB연장선으로 카메라를 땡겨왔습니다.

상당히 불편합니다..

USB 연장선을 더 추가하여 아예 벽쪽으로 몰아버리거나..

아니면 무선 영상 통신을 이용하여 영상을 받아 인식해주거나

생각좀 해봐야 할것 같네요.

posted by devtang
2020. 2. 25. 14:00 Raspberry Pi

*참고한 사이트는 게시글 하단에 남겨놓겠습니다.

 

저번 게시물에서 얼굴의 68개의 특징점을 잡아낸 알고리즘을 이용한 예제를 실행해봤습니다.

이번에는 5개의 랜드마크를 추출하는 알고리즘을 사용했습니다.

 

 

68개의 랜드마크를 추출하는 방식과 달리 ,이번 알고리즘은 

왼쪽 눈 2점, 오른쪽 눈 2점, 코 1점을 검출하여, 라즈베리파이에서 보다 더 나은 속도를 보여줍니다.

속도는 68개 추출에 비해 8-10% 향상되었으며, 잠재적으로 정확성은 조금 떨어질 수 있다고 합니다.

인식률이 상당히 좋습니다. 라즈베리파이에서 이정도 속도만 나와도 감사할 따름입니다...

실시간으로 웹캠을 통해 얼굴의 특징점이 인식됩니다.

또한

68 포인트 랜드마크 데이터 파일은 99.7MB정도였지만

5 포인트 랜드마크 데이터 파일은 9.2MB로 기존 파일에 비해 약 10배 정도 작아졌습니다.

 

구성환경으로는 전 게시물과 동일합니다.

Raspberry Pi 3B+

Picamera

OS : Raspbian Stretch 9.11

OpenCV, imutils, dlib,라이브러리 설치

 

소스코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# USAGE
 
# import the necessary packages
from imutils.video import VideoStream
from imutils import face_utils
import argparse
import imutils
import time
import dlib
import cv2
 
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-p""--shape-predictor", required=True,
    help="/home/pi/Desktop/faster_facial_landmarks/shape_predictor_5_face_landmarks.dat")
args = vars(ap.parse_args())
 
# initialize dlib's face detector (HOG-based) and then create the
# facial landmark predictor
print("[INFO] loading facial landmark predictor...")
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])
 
# initialize the video stream and sleep for a bit, allowing the
# camera sensor to warm up
print("[INFO] camera sensor warming up...")
#vs = VideoStream(src=0).start()
vs = VideoStream(usePiCamera=True).start() # Raspberry Pi
 
# loop over the frames from the video stream
while True:
    # grab the frame from the threaded video stream, resize it to
    # have a maximum width of 400 pixels, and convert it to
    # grayscale
    frame = vs.read()
    frame = imutils.resize(frame, width=400)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
    # detect faces in the grayscale frame
    rects = detector(gray, 0)
 
    # check to see if a face was detected, and if so, draw the total
    # number of faces on the frame
    if len(rects) > 0:
        text = "{} face(s) found".format(len(rects))
        cv2.putText(frame, text, (1020), cv2.FONT_HERSHEY_SIMPLEX,
            0.5, (00255), 2)
 
    # loop over the face detections
    for rect in rects:
        # compute the bounding box of the face and draw it on the
        # frame
        (bX, bY, bW, bH) = face_utils.rect_to_bb(rect)
        cv2.rectangle(frame, (bX, bY), (bX + bW, bY + bH),
            (02550), 1)
 
        # determine the facial landmarks for the face region, then
        # convert the facial landmark (x, y)-coordinates to a NumPy
        # array
        shape = predictor(gray, rect)
        shape = face_utils.shape_to_np(shape)
 
        # loop over the (x, y)-coordinates for the facial landmarks
        # and draw each of them
        for (i, (x, y)) in enumerate(shape):
            cv2.circle(frame, (x, y), 1, (00255), -1)
            cv2.putText(frame, str(i + 1), (x - 10, y - 10),
                cv2.FONT_HERSHEY_SIMPLEX, 0.35, (00255), 1)
 
    # show the frame
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1& 0xFF
 
    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break
 
# do a bit of cleanup
cv2.destroyAllWindows()
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

자세한 소스 코드 내용은, 이곳을 참조하세요.

 

코드 복사후, 동일한 폴더 내에 데이터 파일과 파이썬파일을 넣어줍니다.

(5 포인트 얼굴 랜드마크 추출 데이터 파일은 하단의 참조사이트에서 받을 수 있습니다.)

 

저는 Desktop 에 faster_facial_landmarks 라는 폴더를 생성하여 넣어주었습니다.

터미널에 명령어를 입력해줍니다.

1
2
pi@raspberrypi:~/Desktop/faster_facial_landmarks $ python faster_facial_landmarks.py -shape_predictor_5_face_landmarks.dat
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

이번 게시물은 5개의 특징점을 잡아내는 예제를 실행해봤습니다.

다음엔 졸음운전을 감지하는 시스템(?) 을 포스팅 하도록 하겠습니다.

 

서투른 글 읽어주셔서 감사합니다.

 

참고사이트

(Faster) Facial landmark detector with dlib

 

(Faster) Facial landmark detector with dlib - PyImageSearch

In this tutorial you'll learn how to use dlib's 5-point facial landmark model, over 10x smaller and 8-10% faster than the original 68-point facial landmark detector.

www.pyimagesearch.com

 

posted by devtang
2020. 2. 25. 12:54 Raspberry Pi

*참고한 사이트는 게시글 하단에 남겨놓겠습니다.

 

이번에 게시할 내용은 바로 dlib 와 OpenCV을 이용한 얼굴의 특징점을 찾아내는 예제입니다.

 

위와같이 얼굴의 특징점을 실시간으로 잡아주는 예제를 실행해봤습니다.

 

Facial Landmarks?

 

 

68개의 특징점을 추출한 포인트

사람의 얼굴에 특징점을 찍어낸 방법입니다.

Face Landmark estimation 알고리즘의 원리는 2014년도에 발명된 접근 방식입니다.

이것을 이용하여 카메라를 이용한 다양한 어플리케이션을 만들수도 있습니다.

 

저는 이것을 라즈베리파이로 실시간 캠영상을 받아, 얼굴에 랜드마크를 표시하는 예제를 실행해봤습니다.

실행한 환경으로는

 

Raspberry Pi 3B+

Picamera

OS : Raspbian Stretch 9.11

OpenCV, imutils, dlib,라이브러리 설치

(라즈베리파이 세팅, 라이브러리 설치 방법 등은 추후에 포스트할 예정입니다.)

 

shape_predictor_68_face_landmarks.dat 파일은 게시물 하단의 참고사이트나 메일로 연락주세요.

 

제가 실행해본 소스 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# USAGE
 
# import the necessary packages
from imutils.video import VideoStream
from imutils import face_utils
import datetime
import argparse
import imutils
import time
import dlib
import cv2
 
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-p""--shape-predictor", required=True,
    help="path to facial landmark predictor")
ap.add_argument("-r""--picamera", type=int, default=-1,
    help="whether or not the Raspberry Pi camera should be used")
args = vars(ap.parse_args())
 
# initialize dlib's face detector (HOG-based) and then create
# the facial landmark predictor
print("[INFO] loading facial landmark predictor...")
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])
 
# initialize the video stream and allow the cammera sensor to warmup
print("[INFO] camera sensor warming up...")
vs = VideoStream(usePiCamera=args["picamera"> 0).start()
 
# loop over the frames from the video stream
while True:
    # grab the frame from the threaded video stream, resize it to
    # have a maximum width of 400 pixels, and convert it to
    # grayscale
    frame = vs.read()
    frame = imutils.resize(frame, width=400)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
    # detect faces in the grayscale frame
    rects = detector(gray, 0)
 
    # loop over the face detections
    for rect in rects:
        # determine the facial landmarks for the face region, then
        # convert the facial landmark (x, y)-coordinates to a NumPy
        # array
        shape = predictor(gray, rect)
        shape = face_utils.shape_to_np(shape)
 
        # loop over the (x, y)-coordinates for the facial landmarks
        # and draw them on the image
        for (x, y) in shape:
            cv2.circle(frame, (x, y), 1, (00255), -1)
      
    # show the frame
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1& 0xFF
 
    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break
 
# do a bit of cleanup
cv2.destroyAllWindows()
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

소스코드의 자세한 내용은 , 이곳을 참조하세요.

 

소스코드를 저장한후 꼭 소스파일과 landmark 데이터 파일이 한 폴더 내에 있어야합니다.

 

터미널 창을 열어 명령어를 입력해줍니다.

1
pi@raspberrypi:~/Desktop $ python real_landmarks.py -shape_predictor_68_face_landmarks.dat
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

성공적으로 감지가 됩니다!!

 

라즈베리파이에서 구현시 프레임이 저하되긴 하지만 활용할만한 알고리즘인것 같습니다. 

다음 게시물엔 라즈베리파이에서 조금더 효율적으로 인식이되는 방법에대해 포스팅 할 예정입니다.

서투른 글 읽어주셔서 감사합니다.

참고사이트

기계 학습(Machine Learning, 머신러닝)은 즐겁다! Part 4

 

기계 학습(Machine Learning, 머신 러닝)은 즐겁다! Part 4

딥러닝(Deep Learning)을 사용한 최신 얼굴 인식(Face Recognition)

medium.com

Real-time facial landmark detection with OpenCV, Python, and dlib

 

Real-time facial landmark detection with OpenCV, Python, and dlib - PyImageSearch

In this tutorial, I demonstrate how to detect facial landmarks in video streams in real-time using OpenCV, Python, and dlib.

www.pyimagesearch.com

 

posted by devtang
prev 1 2 3 4 next