OpenCV 학습을 위한 스테레오 카메라 테스트

다시금 4족 보행 로봇에 관심을 기울이게 되면서 기왕이면 OpenCV를 이용하여 Object Detection을 구현하고
낮은 수준의 자율주행 기능을 포함시키고 싶었다. 하지만 새로운 것을 공부해야 한다는 부담감 때문에 섣불리
손을 못대고 있다가 본능에 따라 한 번 들이대보기로 하였다.

 

아직은 정리할만큼도 학습을 못했기 때문에 실제 OpenCV에 대해서는 언급할 내용이 없고 오늘은 카메라에 대한
이야기나 조금 찌끄려보려고 한다.

 

USB Web CAM을 이용한 스테레오 카메라

사실 라즈베리파이에서 카메라 모듈을 2개 이상(4개까지) 연결하여 사용할 수 있는 모듈이 있다. 하지만 가격이
만만치 않다(6~7만원 선). 게다가 파이 카메라 모듈도 필요하고(그나마 V1.3 만 지원한다고 하니 파이 카메라
가격은 좀 저렴하게 구성할 수 있다), 어쨌든 대충 계산해도 한 10만원은 있어야 스테레오 카메라를 구성할 수
있을 것이다.

 

라즈베리파이에 4개까지 파이 카메라 V1.3을 연결할 수 있는 모듈

 

그래서 생각한 것이 저렴한 USB 웹캠 2개를 이용하면 되지 않을까 하는 생각이었다. 실제로 그렇게 구현한 예도
유튜브에 종종 보이고…그래서 일단 만원짜리 웹캠을 2개 샀다. 그리고 3D 프린터로 작은 홀더를 2개 만들어서
각각 등짝에 하나씩 붙여주고 8∅짜리 스테인레스 파이프로 연결하여 고정해주었다. 

 

 

그리고 라즈베리파이에 USB 웹캠을 연결을 하고 샘플 코드를 돌려보았다.
하지만…언제나 그렇듯이 유튜브에서 보여지는 것은 F1 레이싱카였지만 내가 돌리는 것은 애기들 태우는 전동차
수준…ㅠ.ㅠ 하드웨어 문제인지 뭔가 추가적인 코드가 더 필요한 것인지 영상이 엄청 끊기는데다가 2대의 카메라
영상이 거의 동기화가 되지 않았다…ㅠ.ㅠ

 

 

 

일단 바로 해볼 수 있는 해결 방법은 영상의 크기를 줄이는 방법! 그래서 코드에서 카메라 영상의 크기를 320X240
으로 줄이고 다시 시도해보았다. 역시나 사이즈가 작아지니 영상 끊김도 거의 없고 두 영상이 어느정도 동기화 되는
모습을 볼 수 있었다. 하지만 아직도 만족스러운 정도는 아니었다.

 

 

 

ELP Dual lense USB Camera module

계속해서 스테레오 카메라를 알아보고 있었는데 올 초부터 눈에 밟히는 녀석이 하나 있었다. 물론 전문적인 용도는
아니고 그냥 가볍게 사용해볼 수 있을만한 제품으로 보였다. 그럼에도 가격대는 역시 8만원대로 그리 만만한
녀석은 아니었다.

 

그리고…마침 로봇에 꽂혀 이것 저것 부품을 마련하는데 돈이 필요했던 나는 예전에 빅데이터와 클러스터링을
한번
 공부해보겠다고 어렵게 모은 맥미니 5대 중 3대를 팔아버리고 말았다…ㅠ.ㅠ 물론 가격은 구입 당시의 반토막
…ㅠ.ㅠ

 

그렇게 돈을 마련하고 제일 먼저 알리에서 이 제품을 구매했다. 그리고 생각보다 배송이 일찍되어 오늘 이렇게
라즈베리파이에 연결하여 확인을 해볼 수 있었다.

 

 

일단 하나의 모듈로 만들어진 제품이기 때문에 두 카메라로 입력된 영상이 하나의 영상의로 합쳐져 출력되었고
코드상에서도 하나의 VideoCapture 클래스만 사용하면 되었다. 영상의 동기화도 훌륭하고 기본으로 출력되는
320X240 정도의 크기(두 영상이 합쳐서 나오기 때문에 실제 가로는 640)에서는 영상 프레임도 상당히 좋은
수준을 보여줬다.

 

 

영상 사이즈를 640X480(전체 사이즈 1280X480)으로 출력했을 때도 영상이 끊기는 문제는 있었지만 적어도
프리징 되지는 않았고 동기화는 원활했다.

 

 

다만 사용하다보니 발열이 좀 있었고 하나의 영상의 입력되기 때문에 나중에 여러가지 처리를 하기 위해서는
영상을 둘로 나누는 코드가 필요할
것이다. 설마 이정도 코드 추가가 성능 저하를 일으키진 않겠지…-.-

 

정리

아직 이렇다할 작업 내용이 없어서 오늘은 2대의 웹캠을 이용한 것과 하나의 모듈로 구성된 2대의 카메라를 이용한
것의 영상 출력만을 비교해보았다. 앞으로 어느정도 학습이 진행이 되면 OpenCV에 대한 실습 내용을 위주로
블로그에 정리를 해보도록 하겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

 

2019/01/13 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #1

2019/01/21 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #2

2019/03/03 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #3

2019/03/11 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #4

2019/03/31 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #5

2019/06/09 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #6

2019/07/20 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #7

 

한동안 드론 작업을 못했다.
늘 그렇듯 관심사가 사방팔방으로 뻗치는 나로서는 당연하다면 당연한 일…-.-


최근에는 다시 4족 보행 로봇을 준비하고 있어 여러가지 부품도 사모으고 머릿속에서는 어떤 식으로 설계를
할 것인지에 대한 생각이 떠나질 않는다. 게다가 OpenCV 공부도 시작하여 책볼 시간도 할애를 해야 하고
아직 시작은 못했지만 곧 실습도 해봐야 하고…자연스레 진척이 더딘 드론 만들기는 뒷전이 되어 가고 있었다.

 

그래도 끝은 봐야겠기에 지난 2주동안 프레임도 새로 만들고 로드킬 당한 동물같은 처참한 모양이나마
조립도 하여 테스트를 해보았으나…어마어마한 중량(배터리 포함 무려 170g…ㅠ.ㅠ)으로 실패하고 말았다.
오늘은 간단하게 실패 영상이나 하나 올리고 마치려고 한다…-.-

 

진행 경과

 

지난 포스팅에서 일단 헤더핀을 모두 부착하고 점퍼케이블로 연결하여 겨우 모터를 정상적으로 돌리는데 성공을
하였다. 그 후 최초로 만들었던 회로에서 테스트했을 때 잘 안되었는데 계속 만지작대다보니 어느 순간 모터가
돌기 시작했다. 그래서 일단은 최초로 만든 회로를 프레임에 장착하기로 했다.

 

최초 만들었던 회로

 

프레임은 프로펠러 가드를 포함한 모양으로 만들었는데 사실 이 부분 때문에 무게가 폭증하였다. 
프레임은 123D Design으로 모델링하고 3D 프린터로 출력을 하였는데…출력 소음이 아이들 공부하는데 방해
된다는 클레임이 들어와 울며 겨자먹기로 출력 대행업체에 의뢰를 할 수 밖에 없었다…이 무슨 자린고비 굴비같은
상황인지…ㅠ.ㅠ

 

123D Design으로 모델링한 프레임

 

이렇게 우여곡절 끝에 조립을 하였지만 서두에 언급한대로 무게가 무려 170g…보통 미니 드론들이 40~50g
정도인 것을 생각하면 애초에 이녀석이 날 수 있을 것이란 기대는 안드로메다로 날아간 것이다…-,.-

그래도 일단 만들어는 놓았으니 돌려는 봐야겠지 않은가….


하지만 역시나…

 

 

추후 계획

 

일단 현재로싸는 무게가 가장 문제이기에 체중 감량에 중점을 두어 개선을 해야할 것으로 판단된다.
무게의 가장 큰 부분을 차지하는 자작 프레임은 과감하게 쓰레기통으로…ㅠ.ㅠ

 

그리고 처음 구입했던 Q100 타입의 드론 프레임을 다시 사용해야겠다. 그러려면 회로도 다시 납땜을
해야 한다. 이번에는 조금 더 차분하게 납땜을 해봐야겠다.

 

차선책으로는 모터를 바꾸는 것도 생각하고 있다. 사실 모터를 바꾸는 쪽이 조금은 더 수월할 것 같다.
아무래도 8520 코어리스 모터보다는 1106나 1406 정도의 BLDC 모터쪽이 추력이 더 강할테니…


물론 그렇게 되면 배터리 셀 수도 늘어나야 해서 배터리 무게와 또 ESC를 사용해야 하니 그 무게도
더해져서 무게가 더 늘어나긴 하겠지만 그정도는 커버할 수 있지 않을까 하는 계산이다(신빙성은 없다…-,.-).

일단은 이 2가지 계획을 순서대로 차근차근 진행해보자~

 

정리

 

뭔가 하나에 집중하지 못하는 성인 ADHD 환자같은 성격탓에 이 조그만 드론 하나에 몇달을 보내고 있다…ㅠ.ㅠ
하지만 느려도 황소걸음이라고 문제를 찾고 그 문제를 해결해가는 과정은 착실하게 진행되고 있다는 점에서는
나름 성취감을 느끼고 있다.

 

아직 원격 조정을 위한 소프트웨어 개발 문제가 남아있지만 일단 뜨는 것이라도 보면 속이 좀 후련하겠다…^^;;;
얼른 요 드론 놀이는 마치고 본격적인 로봇 개발을 시작하고 싶다. 사실 이 로봇 개발도 흔히 사람들이 선택하는
방법이 아니다보니 성공할 수 있을지 많이 불안하다. 하지만 뜻이 있는 곳이 길이 있나니!

 

더운 여름~
집구석에서 에이컨 쐬면서 드론하고 로봇이나 만들자~

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

 

2019/01/13 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #1

2019/01/21 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #2

2019/03/03 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #3

2019/03/11 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #4

2019/03/31 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #5

2019/06/09 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #6

2019/07/20 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #7

 

한동안 다른 짓거리를 하느라 드론은 손을 못대었다. 콩알만한 것이 금방 될 줄 알았는데 참 여러모로
속을 썪인다…ㅠ.ㅠ 게다가 남은 작업들이 계속 부품들을 교체해가면서 문제의 원인을 찾는 일이다 보니
한번 일을 하려면 맘먹고 시간을 내야하는데 아무래도 좀 더 쉽고 흥미로운 관심사에 우선순위를 뺐기기
일쑤다.

 

그래도 매주 주말이면 잠깐의 짬이라도 내서 조금씩 문제를 해결해 가고는 있지만 아직도 제대로 동작을
안하고 있다. 오늘은 오랫만에 그간의 진행 상황을 정리해보려고 한다.

 

새로운 회로의 구성


지난번 포스팅에서 언급했던 새로 주문한 모터는 4월 23일경 도착했다. 주문한 날짜는? 2월 19일…-.-
무려 2달 하고도 4일이 더 걸린 것이다. 게다가 레이서스타 8520 모터의 경우 4개씩 2세트를 주문했는데
모터 한 개가 증발하여 총 7개밖에 안왔다…ㅠ.ㅠ

 

그래도 와준 것이 어딘가 싶어 주섬주섬 브레드보드를 이용하여 새롭게 회로를 구성하고 테스트를 시작
하였다. 가장 먼저 모터 드라이버의 문제가 아닌가 싶어 다른 모터 드라이버를 이용해보았다. 우선은
가지고 있는 모터 드라이버 중 가장 눞은 출력을 가진 L298N 드라이버를 이용하여 모터를 연결하고
테스트를 해보았다.

 

하지만 여전히 모터까지 전류가 흐르기는 하는 듯 모터에서 찌르르 하는 소리는 들리는데 정작 모터가 
돌지 않는다. 일단 모터 드라이버의 문제는 아닌 것 같다.

 

다시 원래 사용했던 HR8833 기반의 초소형 모터 드라이버로 교체를 하고 여러가지 테스트를 해보았다.
여기서 발견한 것은 일단 모터 드라이버에 모터를 한 개만 연결하면 모터가 잘 돌아갔다. 하지만 하나의
드라이버에 모터를 2개 연결하는 경우에는 모터가 돌지 않았다.

 

브레드 보드를 이용한 구성

 

코드의 변경

 

처음 사용했던 코드는 딜레이 없이 모터 4개를 돌리도록 되어있었다. 하지만 아무리 작은 모터라도 처음
구동시에는 스펙상의 가장 큰 전류가 흐르기 때문에 이 코드로는 무리가 있지 않을까 하는 생각이 들었다.
그래서 코드를 다음과 같이 수정하였다.

 

const int MS1=3;
const int MS2=5;
const int MS3=6;
const int MS4=9;
  
void setup() {
	 pinMode(MS1, OUTPUT);
	 pinMode(MS2, OUTPUT);
	 pinMode(MS3, OUTPUT);
	 pinMode(MS4, OUTPUT);
}
 
void loop() {
	 MA1_Forward(50);
	 delay(1000);

	 MB1_Forward(50);
	 delay(1000);

	 MA21_Forward(50);
	 delay(1000);

	 MB21_Forward(50);
	 delay(2000);
 
	 MA1_Forward(100);

	 MB1_Forward(100);

	 MA21_Forward(100);

	 MB21_Forward(100);
	 delay(2000);
}
 
void MA1_Forward(int Speed1)  
{
	 analogWrite(MS1,Speed1);
  }
   
void MB1_Forward(int Speed1)
{
	 analogWrite(MS2,Speed1);  
 }

void MA21_Forward(int Speed1) 
{
	 analogWrite(MS3,Speed1);
 }

 void MB21_Forward(int Speed1)
{
	 analogWrite(MS4,Speed1);
 }

 

처음 구동시 각 모터별로 1초 정도의 딜레이를 주고 순차적으로 돌리기 시작하였다. 반응이 없던 모터들이 제대로 돌기
시작한 것이다. 이로써 적어도 부품이나 회로의 구성 상에는 문제가 없다는 것을 확인할 수 있었다. 그렇다면 기존에
만들어놓은 회로에는 무슨 문제가 있는 것일까?

 

 

 

납땜의 문제

 

드디어 모터가 제대로 돌기 시작했다는 것은 분명 한발짝 앞으로 나아간 것이긴 하지만 기존에 만들어놓은 회로에서
제대로 동작하지 않는 것은 여전히 의문이었다. 구성 자체는 브레드보드를 이용한 회로와 동일하였으나 다른 점이
있다면 납땜을 하여 회로를 구성했다는 것이 차이라면 차이였다.

 

이전에 만들었던 회로에서는 전혀 동작을 하지 않는 것을 확인했고 또 이 회로는 너무 복잡하게 납땜을 해서 더이상
손볼 여지가 없었기 때문에 이 프로젝트 처음 시작할 때 만들었던 회로에 추가로 모터 드라이버를 위한 배선과 전원
배선을 납땜하여 테스트 해보기로 하였다.

 

드론 프레임을 구매해 구성한 회로

 

최초에 만들었던 회로에 배선을 추가한 구성

하지만 추가로 구성한 회로 역시 문제가 있었다. 프로펠러가 장착되지 않은 상태에서는 모터가 원활하게 구동이
되었으나 프로펠러를 달기만 하면 모터가 제대로 돌아가지 않았다. 단 하나의 프로펠러만 달아도 전체 모터가 
구동되지 않았다.

 

 

 

 

 

결국 의심할 수 있는 문제라고는 이 회로들을 만들 때 납땜을 잘못했다는 가정 뿐이었다. 아무래도 케이블이 적절한
위치에 붙지 않았거나 납땜한 부분들 중 쇼트가 나는 부분이 있거나 한 것으로 판단된다. 간혹 손으로 조금 건드려
주거나 눌러주면 모터가 정상적으로 돌아가는 경우도 있어 더 상황 판단을 어렵게 만들었다.

 

점퍼 케이블 버전으로 완성

 

2번의 시도 모두 납땜에서 문제가 생겼다는 결론을 내린 이상 더이상 나의 납땜 실력을 신뢰할 수 없는 상황이 되었다.
남은 방법은 브레드보드에 구성한 회로를 그대로 사용하는 것 뿐… 그렇다고 그 무거운 브레드보드를 그냥 사용할 수는
없고 1:N으로 연결되는 부분만 브레드보드를 사용하면 되므로 양쪽 전원부만 잘라서 사용하기로 하고 나머지 부품은
점퍼 케이블로 연결을 하였다. 결국 엄청 복잡한 형태가 만들어졌다…ㅠ.ㅠ

 

최종 구성 - 점퍼 케이블을 이용한 회로 구성

 

그리고 비록 험악한 몰골을 하고는 있지만 동작은 아주 만족스러웠다.

 

 

 

하지만 이렇게 되면서 숙제가 하나 생겼다. 바로 프레임을 어떻게 할 것이냐는 것이다. 이 모양으로는 일반적인
형태의 드론 프레임은 도저히 사용할 수 없는 상태이다. 사실 회로의 구성 자체에는 문제가 없으니 구매한 프레임에
만든 형태로 다시 차근차근 납땜을 해도 좋겠지만…두 차례 실패를 거듭한 현 상황에서는 엄두가 나질 않는다…ㅠ.ㅠ

 

결국 3D 프린터의 힘을 빌릴 수밖에 없는 상황이 되었다. 하지만 다룰 줄 아는 모델링 프로그램이라고는 123D 
Design뿐인데다 그나마 익숙하지 않으니 어느 세월에 프레임을 만들까… 게다가 이렇게 복잡한 모양이 되어
버린 회로를 깔끔하게 담기 위해서는 얼마나 또 머리를 굴려야 할까…ㅠ.ㅠ

 

한동안 고생 꽤나 하게 생겼다.

 

정리

 

이번 작업으로 아주 중요한 교훈을 얻었다. 바로 납땜에 관련된 것…그 전까지는 아주 간단한 부분만 납땜을 해서
잘 몰랐는데, 그냥 땜납으로 붙어있다고 해서 납땜이 된 것이 아니라는 것을 알게 되었다. 앞으로도 다시 시도할
기회가 있겠지만 절대로 마구잡이로 할만한 작업은 아닌 것이다.

 

결국 차선책으로 아두이노용 점퍼 케이블을 이용하여 제대로 동작하는 버전을 만들기는 하였지만 역시나 흡족한
형태는 아니다. 다만 지금까지 너무 오랜 시간을 끌었기에 이 상태로 진행을 하고자 할 뿐…

 

당분간은 프레임 설계하고 출력 하느라 또 꽤 오랫동안 시간과 씨름을 해야 할 것 같다. 
언제가 될 지는 모르겠지만 드론이 뜨기 전까지는 이 프로젝트는 끝나지 않을 것이다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^




2019/05/13 - [Study/인공지능학습] - [인공지능] coral usb accelerator + Raspberry pi zero w

2019/05/16 - [Study/인공지능학습] - [인공지능] Coral USB Accelerator와 Edge TPU




지난 포스팅에서 구글의 Coral USB Accelerator를 구입하고 간단한 모델을 돌려본 것을 정리해보았다.

이번 포스팅에서는 Coral USB Accelerator(이하 coral)의 공식 홈페이지를 참조하여 요구 사항 및

엣지 컴퓨팅에 사용되는 Tesorflow Lite에 대해 간단하게 살펴보고자 한다.


각각의 공식 홈페이지는 다음과 같다.


Coral
Tensorflow Lite


Coral USB Accelerator


Coral 시리즈는 지금 소개하고자 하는 USB Accelerator 외에 완전한 보드 형태인 Coral Dev Board가

있으나 이번 포스팅에서는 USB Accelerator에 대해서만 다루도록 하겠다. 다른 부분에 대해서는 공식홈페이지를

참고하기 바란다.


우선 데이터시트를 보면 coral은 구글에서 자체적으로 만든 프로세서를 사용하며 USB 3.0 Type C 소켓을

지원하고 데비안 기반의 리눅스에서 작동을 한다. 하지만 데비안에서 파생된 우분투 리눅스도 사용 가능하며

x86-64 또는 ARMv8 명령어 집합을 포함하는 ARM32/64 기반의 프로세서에서 사용이 가능하다.


이 기준에 따르면 라즈베리파이 zero 시리즈는 ARMv6 명령어 셋 기반이라 지원이 안되지만 홈페이지에도

나와 있듯이 비공식적으로는 사용 가능하다. 또한 coral은 USB 3.0을 지원하지만 라즈베리파이는 아직 2.0만을

지원하기 때문에 속도면에서 손실이 있다.


coral을 사용하기 위해서는 Edge TPU runtime과 Python 라이브러리를 설치해야 하는데 기본적으로

Python 3.5 버전을 지원하며 만일 3.6 버전 이상인 경우 install.sh 스크립트 파일의 맨 마지막 줄에서

python3.5 대신 python3으로 수정한 후 설치하면 된다. 라이브러리가 설치되는 동안 coral이 연결된

상태였다면 설치 후 다시 연결을 해주어야 coral이 작동한다.


또한 이 과정에서 클록 주파수를 최대로 사용할 것인지를 묻는데 만일 최대로 사용하게 되면 추론 속도가

2배가 되지만 대신에 전력 소모량이 많아지며 발열이 증가한다. 심지어는 최대로 할 경우에는 손닿지 않는

곳에 장치를 두거나 부상을 막기 위해서는 기본 속도를 사용하라고 경고하고 있을 정도니 발열이 꽤나 심한
것 같다. 클록 주파수 설정은 단순히 라이브러리 설치를 다시 진행하여 변경할 수 있지만 2019년 4월 이전에

설치한 경우별도의 업데이트 과정을 거쳐야 한다.


coral에는 흰색 LED가 하나 장착이 되어있는데 신호는 매우 단순하다. 그냥 불이 들어와 있으면 초기 상태인

것이고 연산을 수행하면 LED가 점멸한다. 이게 끝이다…


coral을 작동시키기 위해서는 USB를 통해 적어도 5V 전압에 500mA의 전류를 공급해주어야 한다. 내가 

라즈베리파이 zero w를 사용하면서 usb 허브에 coral을 물릴 수밖에 없었는데 이 때 전원 공급이 가장 

우려되었지만 별도의 외부 전원 없이 coral이 정상 동작 하였다. 혹시 전원 공급이 약해서 속도가 느린가 하고 

usb 허브에 외부 전원을 넣어 봤으나 느린 건 매한가지였다…-.-


이번 포스팅에서는 여기까지만 다루기로 한다. 기타 상세한 내용에 대해해서는 공식 홈페이지를 참고하기바란다.


TensorFlow models on the Edge TPU - 개요

엣지 컴퓨팅에 사용되는 TensorFlow Lite는 TensorFlow 공식 홈페이지에 소개가 되어있지만 Coral

홈페이지에도 TensorFlow 관련 내용이 있어 먼저 Coral 홈페이지의 내용부터 정리를 해보겠다.

Edge TPU의 경우 낮은 전력을 소모하면서 빠른 신경망 연산을 처리해야 한다는 제약이 있기 때문에

조금 특별한 신경망 연산 기능과 구조를 가져야 한다. 때문에 Edge TPU에서도 CNN과 같은 심층 신경망을

실행할 수 있지만 TensorFlow Lite라는 특별한 버전만 지원되며 Edge TPU에 맞게 컴파일 되어야 한다.


TensorFlow Lite는 TensorFlow의 경량 버전으로 TensorFlow Lite의 모델과 인터프리터 커널의
바이너리 사이즈를 줄임으로써 모바일 기기나 임베디드 시스템에서 추론의 속도를 높였다. 다만 모델을 바로
훈련 시키지는 못하며 TensorFlow에서 훈련시킨 모델을 TensorFlow Lite converter라는 툴을 이용하여

변환해야 한다.


Edge TPU에 대한 최적화 과정에서 Quantizing이라는 용어가 나오는데 이는 사이즈를 줄이기 위해

가중치나 활성함수의 출력에 사용되는 32비트 부동 소수점 타입을 8비트 고정 소수점 타입으로 변환하는

과정이라고 한다. 이 과정을 통해 모델이 더 작고 빨라지게 되며, 비록 정밀도가 떨어지긴 하지만 추론의

정확도에는 큰 영향을 미치지 않는다고 한다.


이러한 이유로 새로 모델을 만들고 훈련시키는 과정이 조금 복잡한데 구글에서 새로운 데이터 셋으로 재학습을

하면 Edge TPU에서 사용 가능한 TensorFlow 모델들을 다수 제공하고 있으므로 필요한 경우 이를 활용하면

시간을 절약할 수 있을 것이다.


Edge TPU work process출처 : https://coral.withgoogle.com/docs/edgetpu/models-intro/



하지만 직접 모델을 만들어 Edge TPU에서 사용하려고 한다면 다음의 요구 조건을 충족시켜야 한다.


  • 텐서 파라미터는 8비트 고정 소수점 타입이어야 한다.
  • 텐서의 크기는 컴파일 시에 그 크기가 고정되어있어야 한다.
  • bias 텐서 같은 모델 파라미터 역시 컴파일 시에 크기가 고정되어있어야 한다.
  • 텐서들은 3차원 이하여야 한다. 만일 3차원 이상의 크기를 가지는 텐서를 사용할 경우 가장 안쪽의
    3개 차원만이 1보다 큰 크기를 갖게 된다.
  • 모델은 Edge TPU를 지원하는 연산만 사용 가능하다.


이 조건이 충족되지 않아도 컴파일은 되지만 Edge TPU 상에서는 일부만 실행될 것이다. 이렇게 조건을 충족하지
않는 연산이 있는 경우에는 모델의 그래프가 Edge TPU에서 실행 가능한 부분과 그렇지 않은 부분으로 나뉘게

되는데 이 중 Edge TPU에서 지원하지 않는 부분은 CPU에서 실행된다.


여기서 주의할 점은 현재의 Edge TPU 컴파일러는 이러한 분할을 한 번만 할 수 있기 때문에 만일 첫 번째

연산이 Edge TPU에서 실행 가능한 연산이고 두 번째 연산이 실행 불가능한 연산이라면 두 번째 이후의

모든 연산은 비록 Edge TPU에서 실행 가능하다 하더라도 모두 CPU에서 실행되어 버린다.


출처 : https://coral.withgoogle.com/docs/edgetpu/models-intro/



이렇게 CPU에서 실행되는 연산이 포함되면 당연히 100% Edge TPU에서 실행될 때보다 추론이 늦어지므로

Edge TPU에서 실행 가능한 연산만 포함되도록 노력해야 한다(참고로 Edge TPU 컴파일러는 컴파일이 종료되면 

Edge TPU에서 실행된 연산과 CPU에서 실행된 연산의 수를 알려준다고 한다).


앞서도 언급했지만 밑바닥부터 모델을 만드는 시간과 노력을 절약하기 위해서는 구글에서 이미 Edge TPU와

호환되도록 만들어놓은 모델을 재학습하여 사용하면 되는데 이 때 사용되는 기술이 Transfer Learning(이전 학습
또는 전이 학습) 혹은 fine tuning(세부 조정)이라는 기술이다. 또 다른 방법으로 Edge TPU 장비에서 직접
재학습을 수행하는 Python API를 이용한 weight imprinting이라는 방법이 있다.

Transfer Learning은 소개의 범위를 벗어나므로 더 상세한 내용은 Coral 홈페이지를 참조하기 바란다.

이렇게 만들어진 모델을 Edge TPU에서 실행하기 위해서는 Edge TPU runtime과 API 라이브러리가 호스트
시스템(라즈베리파이 등)에 설치가 되어있어야 한다. 하지만 Coral 제품 중 Coral Dev Board나 SoM 등은 
이미 이러한 것들이 설치되어 있어 설치 과정을 생략하고 바로 사용 가능하다.

현재 Coral 제품에서는 C++과 Python 기반의 API가 사용 가능하다.


정리

이렇게 간단하게나마 Coral Accelerator의 하드웨어적인 측면과 소프트웨어적인 측면의 개요를 정리해 보았다.
중요하게 알아야 할 것은 모바일 기기 또는 임베디드 시스템을 위해 만들어진 것이라 원하는 모든 것을 할 수는
없다는 점이다. 물론 이러한 기기들의 컴퓨팅 파워가 더 올라갈 수는 있겠지만 저전력이라는 매리트를 포기하지
않는 한은 한계가 있을 것이다.

추후 추가로 정리하겠지만 TensorFlow Lite에서 제공하고 있는 모델은 총 5가지가 있는데 다음의 모델들이다.

  • Image classification
  • Object detection
  • Smart reply
  • Pose estimation
  • Segmentation

  • 아직은 처음 두가지만 재학습 없이 테스트해보았지만 나머지 모델들도 확인을 해보고 싶다. 특히 Pose estimation은
    활용도가 꽤 있을 것 같다.

    처음에는 그저 호기심으로 인한 지름으로 시작했는데 하나하나 정리하다보니 나같이 머신러닝이나 딥러닝을 
    앝은 수준에서 시작해보려는 사람들에게는 좋은 학습 대상이 될 수 있을 것 같다. 특히나 ‘인공지능? 어따 써먹지?
    하는 사람들은 몸소 느끼면서 배울 수 있을 것 같다.

    일단 무작정 머리에 들어오지도 않는 책만 읽는 것 보다는 라즈베리파이와 Coral 그리고 TF Lite에서 주어진
    모델들을 이용하여 뭔가 하나 만들어보는 쪽으로 올해의 목표를 수정해야겠다.


    블로그 이미지

    마즈다

    이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^



    2019/05/13 - [Study/인공지능학습] - [인공지능] coral usb accelerator + Raspberry pi zero w

    2019/05/16 - [Study/인공지능학습] - [인공지능] Coral USB Accelerator와 Edge TPU




    뭔가 하나를 진득하니 끝내야 하는데…이놈에 호들갑스러운 호기심은 눈밭에 강아지 뛰놀듯한다…
    얼른 미니 드론 만들고 다음에 싱글콥터 그 다음에 4족 보행 로봇 최종판을 만들어야 하는데…
    도대체 어느세월에...ㅠ.ㅠ


    이번 호기심의 대상은 바로 구글에서 엣지 컴퓨팅 보드로 출시한 coral 시리즈 중에 usb 가속기인

    coral usb accelerator이다. 페이스북에서 어떤 분이 올려놓으신 엣지 컴퓨팅을 위한 보드들의
    성능을 비교한 해외 블로그를 보고 나니 궁금해서 견딜 수가 없었다.


    Benchmarking Edge Computing


    아직은 책만 줄창 읽어대고 있는 정도의 수준이라 내가 이걸 사서 제대로 써먹을 수나 있을지 의문이었지만
    지름의 기본 자세인 '그래도 언젠가는 써먹겠지’라는 마음가짐으로 하나 질렀다.

    그리고 다행히도 간단한 테스트 정도는 해볼 수 있었다…^^;



    Edge Computing이란?


    우선 본론에 들어가기 전에 엣지 컴퓨팅이란 것이 무엇인지 부터 알고 넘어가자.


    예전에 메인프레임을 쓸 때는 당연한 일이었고 웹 기반의 시스템이 자리를 잡은 후에도 대부분의 중요한

    연산은 서버에서 처리를 하고 클라이언트 기기(PC)에서는 자료를 입력하는 정도의 기능만 수행을 했다.

    그만큼 서버는 강력한 기능을 갖고 있었고 클라이언트로부터 전송되는 데이터들은 서버가 감당하기에

    충분한양이었다.


    하지만 스마트폰이 지배하는 세상이 되면서 클라이언트의 종류와 그로부터 전송되는 데이터는 점점 증가를

    하게 되었고 급기야 IoT라는, 모든 것을 인터넷에 연결시키겠다는 야심찬 시도가 진행되면서 이제 클라이언트는

    그 종류를 한정할 수 없게 되었고 그 수많은 클라이언트들로부터 올라오는 데이터의 양은 서버가 감당하기 어려운

    상황이 되어버렸다.


    한편, 스마트폰을 시작으로 한 클라이언트 기기들은 소형화와 고성능화로 인해 웬만한 작업은 그 기기 내에서 처리를

    할 수 있게 되었다. 예전같으면 워크스테이션에서나 가능했을 동영상 편집을 스마트폰에서도 할 수 있게 된 것이다.

    상황이 이렇다보니 클라이언트 기기를 단순히 서버로 데이터를 전송하는 용도로만 사용하는 것이 엄청난 자원의 낭비가

    된 것이다.


    결국 가능한 한 클라이언트에서 처리할 수 있는 부분은 처리를 하고 서버에서는 연산에 높은 성능이 필요한 부분을

    처리하려는 시도를 하게 되었고 이 과정에서 클라이언트 측에서 처리되는 부분을 Edge Computing이라고 부르게

    되었다.


    하지만 아무리 클라이언트 기기들의 성능이 좋아졌다고 해도 머신러닝이나 딥러닝을 처리하기에는 한계가 있다보니

    이러한 고성능의 연산을 보조해주기 위한 많은 장치들이 개발되었다. 그 자체로 보드형태를 가지고 나온 제품과

    기존의 소형 컴퓨터 보드인 라즈베리파이 등에 연결해서 사용 가능한 USB 기기 형태로 나온 제품들이 있는데

    처음 소개한 블로그에서는 바로 이러한 기기들의 성능을 벤치마킹하고 있는 것이다.



    무엇을 선택할 것인가?


    이 블로그를 보면 몇가지 대상에 대해 상당히 많은 항목을 벤치마킹 하고 있다. 하지만 영어 울렁증의 도움으로

    아주 가볍게 한 가지를 선택할 수 있었다. 바로 제일 처음 나오는 추론 속도에 대한 벤치마킹을 기준으로 가장

    가성비가 높은 제품을 고르기로 한 것이다.


    일단 추론 속도에 대한 벤치마킹 그래프를 보면 구글의 coral 시리즈가 매우 성능이 좋다. 그래서 1차로 coral 
    시리즈를 구입하기로 결정을 했다(사실 인텔의 NCS2를 더 먼저 알게 되었고 디자인도 NCS2의 사이버틱한

    디자인이 더 마음에 들었지만 벤치마킹 결과와 가성비에서 탈락했다).


    라즈베리파이가 없었다면 완전체인 coral dev board를 구입했겠지만 이미 예전에 빅데이터 클러스터 공부한다고

    깝죽대면서 사다놓은 라즈베리파이가 수두룩 빽빽하게 있어 비용면에서 더 저렴한 coral usb accelerator로

    선택을 했다.





    구매는 MOUSER에서 했으며 가격은 $74이다. 배송은 DHL로 약 2일만에 도착을 했고 배송비는 무료다!

    생각보다 빨리, 안전하게 도착해서 참 다행이었다(가장 최근의 해외 직구는 banggood에서 주문한 모터를

    2달 만에 받은 것이었다…-.-).



    장비 연결


    현재 집에 있는 라즈베리파이는 3B 모델이 5대, zero w 모델이 2대 있다. 그런데 생각해보니 3B 5대는

    클러스터 만들면서 스택 케이스에 다 연결하고 배선까지 꽁꽁 묶어놓아서 도무지 풀어서 사용할 엄두가

    나질 않았다.


    결국 zero w를 사용하기로 결정을 했는데 이게 또 만만치 않다.라즈베리파이 zero w의 경우 USB포트가

    마이크로 USB타입으로 꼴랑 2개 있다. 그나마 하나는 전원공급용이므로 실제 사용 가능한 것은 1개 뿐이다.

    게다가 w가 무색하게 빌트인 된 Wi-Fi 모듈은 잘 붙는공유기 찾기가 하늘의 별따기라 어쩔 수 없이 USB 형태의

    무선 랜카드를 별도로 사용해야 한다.


    이렇게 해서 일단 필요한 USB장비는 벌써 2개가 되었다. USB 랜카드와 coral…여기서 또 한가지 생각지 못한

    문제가 생겼다. 라즈베리파이 사 모을 때 파이 카메라 V2 버전을 같이 산 것이 있어 그 걸 사용하려고 했는데…

    아뿔싸! 라즈베리파이 3B와 zero w의 카메라용 필름 케이블 소켓 크기가 다르다…OTL 변환 케이블이 있긴 있는데…
    돈도 돈이고, 배송도 배송이고…ㅠ.ㅠ


    다행히 아이들이 학습용으로 사용하던 USB CAM이 있어서 그걸 사용하기로 했다.
    이렇게해서 총 3개의 USB장치를 붙여야 하는 상황이 되었다. 결국 USB 허브까지 하나 구매해서 어찌어찌

    연결은 성공하였다~^^ (사진은 카메라 연결 전이다.)


    사실 최대한 부피를 줄인 장치를 만들어보고 싶어서 보드로 zero w를 선택한 것인데 결과적으로는 배보다 배꼽이 

    더 큰 상황이 되어버렸다. 나중에 기회가 된다면 하우징들은 다 벗겨버리고 연결을 해서 작은 통합 기기를 만들어
    보고 싶다(하지만 성능 때문에 zero w는 못쓸 듯…-.-).






    라이브러리 설치 및 테스트


    공식적으로 coral usb accelerator가 지원하는 기기는 라즈베리파이 2와 3의 모델 B와 B+ 뿐이다.

    즉, zero w는 공식적으로는 지원하지 않는 보드이다. 하지만 비공식적으로 설치 가능한 라이브러리가 존재하고

    공식 사이트에서도 소개하고 있다. zero w에 대한 라이브러리 설치 방법은 아래 링크에서 확인 가능하다.


    support for Raspberry Pi Zero


    설치 방법은 매우 간단하며, 압축된 라이브러리 패키지를 다운로드 받고 압축을 해제한 후 install.sh를 실행하면

    끝이다. 그리고나서 공식 사이트에 있는 설명대로 데모 프로그램을 돌려보면 된다.우선 설치 후 2개의 데모 프로그램을 

    실행해보았다. 이미지 분류와 얼굴 인식을 하는 데모였는데 정상적으로결과가 나오는 것을 확인하였다. 


    특히 얼굴 인식의 경우 구글에서 받은 이미지로도 테스트를 해보았는데 대체로잘 인식이 되었으나 특정 사진 한장은 전혀 

    인식을 못하였다. 다양한 요인이 있을 것 같은데 정확한 이유는 모르겠다. 맨 처음 사진은 Mobilenet SSD v2에서 제공

    되는 사진이고 다음 3장은 구글에서 가져온 사진인데 맨 마지막 사진은 인식에 실패했다.









    성능의 문제

    사실 지금까지 라즈베리파이를 사용해오면서 딱히 성능을 확인해야 할만큼 부하가 걸리는 작업을 해본 적이
    없기에 굳이 따져보지 않았는데 막상 coral usb accelerator를 연결하여 이미지 분류나 인식 작업을 해보니
    라즈베리파이 3 모델 B와 zero w 사이에는 엄청난 성능의 차이가 있었다.

    라즈베리파이 3 모델 B에서 데모 프로그램 실행 시 얼마나 시간이 걸리는지 측정한 자료가 거의 없어 확인이
    쉽지 않았는데 유튜브에서 발견한 동영상 하나에서 대략 5초 정도 걸리는 것을 확인했다.

    그런데 zero w 모델에서는 15초 정도의 시간이 걸렸다. 처음에는 coral usb accelerator가 연결되지 않았는지
    의심도 해보았으나 연결되지 않은 경우에는 실행 시 오류가 발생을 하였고 또 연결되었을 때 연산 시 LED가 
    점멸하는 것도 확인을 하였으니 분명 coral usb accelerator가 작동을 하고 있는 것이었다.






    이러한 성능의 문제는 다음에 테스트한 동영상에서의 사물 인식의 경우에 더 심각하게 나타났다.


    카메라 테스트


    일단 앞서 말한대로 파이 카메라를 사용할 수가 없어 USB Cam을 사용하게 되었다. 
    그리고…이미 사물 인식을 하기도 전에 영상은 너무 끊겨서 적당한 수양의 과정을 거치지 않고서는 참고 
    보아줄 수 없는수준이었다.

    그래도 나름 참는데는 일각연이 있는 터라 테스트를 진행해보았다. 2개의 다른 소스로 진행을 해보았다.
    처음 테스트는 아래의 블로그를 참고하였다.

    Hands-on with the Google Coral USB Accelerator


    사용한 모델 및 실행 코드 정보가 모두 위의 블로그에 정리되어 있다. 그저 다운로드 받고 실행하기만 하면
    되는 생각보다 간단한 과정으로 진행할 수 있다. 아래 동영상을 보면 알겠지만 일단 상당히 느리다…ㅠ.ㅠ
    인식률 또한 상상했던 것보다 좋지 않은데 두 번째 테스트와 종합적으로 봤을 때 사람과 차에 대한 인식룰은
    기가 막히다. 특히 사람은 팔뚝만 슬쩍 보여도 사람으로 인식한다.

    하지만 드라이버와 커터는 인식을 못했고 귤은 사과로 인식하거나 햄스터를 새, 개 등으로 인식하고 있었다.
    두 번째 동영상은 유튜브에서 영상을 하나 틀어놓고 그 영상을 찍으면서 인식을 시킨 것인데 버스나 차를 대체로
    잘 인식하는 것 같았다.






    두 번째 테스트는 다음의 2개 사이트를 참고했다.

    프미케의 낙서장
    https://qiita.com/PINTO/items/dd6ba67643bdd3a0e595


    사용한 모델은 첫 번째 테스트와 동일하지만 실행코드가 조금 다르다. 두 번째 테스트용 실행코드에는 초당 프레임

    정보가 나오는데 위 링크한 블로그들의 프레임 수와 비교하면 형편없는 수준이다. 그리고 특이한 것이 처음 테스트에서는 
    커터를 인식하지 못했는데 두 번째 테스트에서는 커터를 인식하였다.





    정리


    대체로 뭔가 하나에 관심을 갖게 되어 실행을 해볼 때까지 구입, 준비, 실행의 과정이 꽤나 길었는데 이번에는
    관심을 갖게된 후 이 블로그 포스팅을 작성하기까지 정확히 5일 걸렸다. 거의 일사천리로 진행이 된 것이다.
    그거 하나로도 위안이 된다…^^;;

    하지만 앞에서도 강조했듯이 라즈베리파이 zero w는 작다는 것 외에는 그닥 쓸모가 없다는 것이 판명났다.
    적어도 엣지 컴퓨팅에서는…최소한 라즈베리파이 3 모델 B 이상은 되어야 암에 걸릴 확률을 낮출 수 있을것이다.
    아직은 내 수준이 남들 발바닥 언저리에서 노는 수준이다보니 근거는 없지만 뭔가 모델들이 사람이나 차량에
    특화된 것 같은 느낌이다. 자율주행 RC카 같은 것 만들어보면 재밌을 것 같다.

    물론 조금 더 실력이 된다면 수화 번역기 같은 것을 한 번 만들어보고 싶다.

    어쨌든 이렇게 또 하나의 가능성을 맛본 것으로 만족하면서 포스팅을 마친다.


    블로그 이미지

    마즈다

    이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^