행복한 하루

[교육후기] OpenCV와 TensorFlow Lite를 활용한 라즈베리 파이 지능형 비전 서비스 개발 - 2일 차 본문

Artificial Intelligence/Basic

[교육후기] OpenCV와 TensorFlow Lite를 활용한 라즈베리 파이 지능형 비전 서비스 개발 - 2일 차

변화의 물결 2023. 3. 2. 17:02

 

 

안녕하세요.

 

 1일 차 내용에 이어서 진행하지만, 교재가 얇게 제작되어 추가적인 부분은 강사분의 pdf 교재내용으로 진행되었습니다. 그리고 영상으로만 교육할 수 있었지만, Raspberry Pi 특성도 있고 IoT도 첨가되어야 했기 때문에 몇 가지 하드웨어 제어도 확인하였습니다.

 


1. Raspberry Pi 하드웨어 제어 실습

  - 간단하게 Raspberry Pi에 있는 IO Pin을 이용해서 Button과 LED제어 테스트를 합니다. 간단하게 Header Pin에 점퍼선을 그냥 연결해도 되지만, 연결성을 좋게 하기 위해서 액세서리 모듈과 브레드보드를 사용했습니다. LED는 GPIO2, Button은 GPIO4를 이용합니다

  - 라즈베리파이 LED와 Button 연동 파이썬 소스 확인

(Button을 누르면 High(1) 신호를 보내고, 그것을 확인해서 LED에 High(1)을 보내 켜지게 합니다. 단순히 테스트 이기 때문에 while로 핀을 검색하고 있는 것은 효율성이 좋지는 않습니다.) 

import RPi.GPIO as GPIO

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(2,GPIO.OUT) #led
GPIO.setup(4,GPIO.IN) #button

try:
    while True:
    	if (GPIO.input(4) == 1):
    		print("LED on")
    		GPIO.output(2, GPIO.HIGH)
    	else:
    		print("LED off")
    		GPIO.output(2, GPIO.LOW)
finally:
    GPIO.cleanup()

2 MQTT 작동 확인하기

2.1 MQTT 설치 및 동작 확인

  - MQTT 패키지 설치하고 Publisher, Subscriber, broker 개념 설명을 해줍니다.

   pip3 install paho-mqtt
   sudo apt install mosquitto mosquitto-clients -y

  - 위에서 테스트한 LED를 MQTT를 통해서 원격으로 제어할 수 있도록 테스트합니다. 강의실 내부망을 이용하되 한 분을 Broker 및 publisher로 하고 나머지 분들을 Subscriber로 설정한 후에 publisher에서 버튼을 이용해 on/off 토픽을 보내 구독(Subscribe)하는 사람들의 LED가 켜지고 꺼지는 것을 확인하였습니다.

 

  - 연결 및 메시지 동작 연결하는 코드의 일부분 및 동작시 on/off 출력이 콘솔창에 출력됩니다.

2.2. MQTT와 coAP과 간략하게 비교 설명

  1) MoM Service (메시지 지향 미들웨어) : TCP 작동, topic과 queue를 통해 서로를 찾음, IP리스트에 보내줌, 다수의 클라이언트들이 publisher와 subscriber 가능

  2) RESTful Web Service : HTTP Method를 통해서 자원을 처리, UDP기반, 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍처, 클라이언트/서버구조, 무상태성(서버에서 상태정보 기억할 필요 없음)

 

  3) MQTT : IP 기반, TCP 프로토콜 사용, IP제공하는 것이 아닌 topic 방식으로 Broker, Subscribe(구독자)와 Publish(발행자)로 나눠지고, 페이로드가 정해있지 않아서 유연하게  데이터 길이로 보낼 수 있다.

  - QoS-0 ( 보장 x , 되면 되고 안되면 안 되고)

  - QoS-1 (최소 한 번은 ok (ACK))

  - QoS-2 (100% 신뢰 보장)  

  - 토픽을 레벨화 시키 메시지 전송 부분에 있어서 유용하게 관리가 가능

   ( 와일드카드 제공 “+”, “*” : 중간 토픽 무시하기  K/+/Name, 전체에 보내기  K/* )

 

  4) CoAP 구조

  - URI 형식지원, IPv6, DTLS, 구조자체가 자원을 가진 장치와 자원을 요청하는 장치가 1:1로 주로 구성됨, 2가지 타입의 메시지 (확인필요, 불필요), UDP경우 HTTP에 비해 저전력 가능

  - URI 형식은 coap ://host[:port]/[path][?query]

 

5) kafka와 MQTT 연동에 대해서 질문하신 분이 있어 링크 확인

 - https://www.kai-waehner.de/blog/2021/03/15/apache-kafka-mqtt-sparkplug-iot-blog-series-part-1-of-5-overview-comparison/

 - https://velog.io/@jamangstangs/Apach-Kafka-and-MQTT-Overview

3. 웹서버를 이용해서 LED 제어

  - Python을 이용해서 웹서버를 만들어서 Web Page상에서 LED 제어하는 실습 진행합니다.

  - 웹페이지 동작 코드의 일부분

 

  - 웹페이지 접속 시 나타나는 화면

4. PiCamera와 MJPEG 이용한 스트리밍 테스트

  - Raspberry Pi에 Pi Camera 장착해서 프레임으로 읽어서 stream.mjpg 파일에 갱신해 줍니다. 그리고 웹페이지에서 이미지 파일로 계속 읽으면 영상처럼 보이게 됩니다.

 

  - PiCamera MJPEG Streaming Demo 소스의 일부분

  http://192.168.0.45:8000/index.html  웹페이지로 볼 때

  http://192.168.0.45:8000/stream.mjpg 웹상에서 이미지만 볼 때

  

 - 참고로, 이미지마다 시작하는 매직 넘버와 구분 방법

fp = fopen($_FILES["thumbnail"]["tmp_name"], "r");
image_stream = fread($fp, 64);
if ( preg_match( '/^\x89PNG\x0d\x0a\x1a\x0a/', $image_stream) )  {
    $type = "png";
} elseif ( preg_match( '/^GIF8[79]a/', $image_stream) )  {
    $type = "gif";
} elseif ( preg_match( '/^\xff\xd8/', $image_stream) )  {
    $type = "jpg";
}

5. OpenCV 라이브러리 샘플소스 테스트

5.1 투사(projection)

  - 점 4개의 좌표를 알고 이동관계를 알면 8개의 식이 도출되어 8개의 미지수를 구해 투시변환 행렬을 구할 수 있으며, 비스듬하게 찍은 사진을 정면에서 찍은 사진처럼 변환할 수 있다는 것을 호모그래피라고 합니다. 투시변환을 하는 용도로 사용하는 함수인 cv2.findHomography 사용예제를 테스트합니다.

5.2 파노라마

  - 여러 개 사진을 파노라마 처음과 끝부분의 Feature들을 잘 연결해서 하나의 이미지로 만들어냄

  - 특징점 매칭을 하고 투시변환의 상관관계를 계산하고 그 정보를 이용해서 영상을 결합이론을 간단한 stitch() 함수로 구한 예제를 테스트합니다.

 

5.3 모서리 검출

  - 해리스 코너 검출은 소벨(Sobel) 미분으로 경곗값을 검출하면서 경곗값의 경사도 변화량을 측정하여 변화량이 수직, 수평, 대각선 방향으로 크게 변화하는 것을 코너로 판단합니다. 이 cv.cornerHarris(gray,2,3,0.04) 함수를 사용해서 간단한 모서리 검출 테스트를 합니다.

 

5.4 탬플릿 매칭 기반 객체

  - 작은 윈도우를 움직였을 때 픽셀 변화 값의 차이를 찾아내는 기법으로 커널이 크면 속도가 빠르지만 정확도 떨어지고 커널이 작으면 느려지지만 정확도 높아지는 특성을 가지고 있습니다.

  - matchTemplate(gray, tmpl, cv2.TM_SQDIFF_NORMED) 함수를 사용해서 기본 이미지를 동영상에서 매칭해서 찾으며 조금씩 변화하는 이미지를 다시 매칭 기본 이미지로 변경합니다.

  - 지도학습으로 하나 학습한다고 생각한다면 비슷한 결과일 수 있습니다.

 

5.5 문자 추출

  - tesseract-ocr 라이브러리에 대해 간단한 원리를 설명하고 사용방법에 테스트합니다.

  - 이미지의 임계값을 이용하여 입력 이미지를 이진화를 진행합니다. 그리고 이진화한 이미지의 연결된 구성 요소를 분석하여 각 구성 요소의 외곽선을 추출하고, 이를 이진 데이터로 저장합니다. 텍스트 라인(text line)을 분석하여 구성요소를 체계화한 뒤, 문자의 자간에 따라 단어 단위로 나눈다. 단어 단위로 나뉜 요소를 단어 단위와 페이지 단위로 인식한다. Tesseract는 출력 파일의 형식이 존재하지 않으므로 출력 파일을 생성하기 위한 단계는 존재하지 않는다.

<참고> 한국멀티미디어학회논문지 (Journal of Korea Multimedia Society) 제18권 8호 / Pages.943-949 / 2015

 

   

sudo apt install tesseract-ocr tesseract-ocr-kor tesseract-ocr-script-hang tesseract-ocr-script-hang-vert -y
pip3 install pytesseract

6. TensorFlow Lite 설치 및 TinyML 설명

6.1.  텐서플로우 라이트 패키징 파일 설치 

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

 

 - 텐서플로우 라이트로 할 수 있는 것 리스트

https://tfhub.dev/s?deployment-format=lite

 

6.2 TinyML 강의진행

  - 임베디드 시스템(Tiny) + 기계학습(ML, machine learning)

  - MCU(micro controller unit) 수준에서 동작할 수 있는 기계학습 관련 모델 활용 및 서비스

  - ML에서 학습과 추론 크게 2 파트로 나누어 볼 수 있는데 여기서 학습 부분을 제외하고 학습한 모델을 변환하여 추론 파트 중점으로 해서 구현

  - 정규화 기법 : 인공신경망의 데이터는 weight sum 같이 주로 소수점이기 때문에 대한 특수성이 사라지게 하기 위함이며, 훈련 모델이 효과적으로 작동하려면 입력 값들의 크기가 서로 비슷해야 하기 때문에 사용합니다.

  

<기타 참고 자료 사이트 공유>

1. 코딩 없이 다양한 AI 모델을 테스트하고 결과를 확인하실 수 있는 플랫폼입니다.

https://www.kamp-ai.kr/

2. Seven - Segment OCR 관련

https://kr.mathworks.com/help/vision/ug/recognize-seven-segment-digits-in-image-using-ocr.html

https://github.com/jiweibo/SSOCR

https://www.instructables.com/Raspberry-Pi-Reading-7-Segment-Displays/

https://www.geeksforgeeks.org/license-plate-recognition-with-opencv-and-tesseract-ocr/

3. RESTful API 이란

https://velog.io/@somday/RESTful-API-%EC%9D%B4%EB%9E%80

 

 

Comments