TinyML 및 OpenMV를 사용하여 머시 비전 시작하기 – 1부

머신 러닝 및 tinyML은 임베디드 시스템 엔지니어를 위해 많은 응용 프로그램 문제를 해결할 수 있습니다. 처음부터 코딩하기가 매우 어려운 한 가지 고유한 문제는 이미지 내에서 객체를 감지하고 인식하는 것입니다. 공교롭게도 객체를 감지하고 인식하는 것은 tinyML에 대한 완벽한 응용 분야입니다. 그러나, tinyML 및 머신 비전(MV)을 시작하는 것은 복잡할 수 있습니다. 이후 여러 게시물을 통해, OpenMV 카메라를 사용하여 MV를 시작하는 방법을 탐구해 보도록 하겠습니다.

OpenMV Cam H7에 대한 소개

마이크로 컨트롤러를 사용하는 저전력 응용 제품용 MV에 관심이 있다고 간주해 보겠습니다. 이 경우, 카메라 모듈을 맞춤형으로 설계하거나 이미 상업적으로 사용 가능한 카메라 모듈을 찾아야 합니다. 맨 처음부터 모듈을 생성하는 것은 재미있는 과정이지만 시간과 비용이 많이 듭니다. 상업적으로 사용 가능한 흥미로운 솔루션 중 하나는 OpenMV Cam입니다.

OpenMV Cam은 소형의, Arduino 유사 개발 기판으로, 개발자가 MV를 시작하는 데 필요한 모든 것이 포함되어 있습니다. 먼저, 다양한 하드웨어 버전이 있다는 것을 인식해야 합니다. 최신 버전은 OpenMV Cam H7(그림 1)입니다. Cam H7은 STMicroelectronicsSTM32H743VI 마이크로 컨트롤러를 기반으로 하며, 이 마이크로 컨트롤러는 480MHz 클록 속도의 Arm Cortex-M7 아키텍처를 사용합니다. 이 부품은 또한 1MB의 SRAM과 2MB의 플래시를 제공합니다. MV 및 러닝 응용 프로그램에 사용할 경우, 사용 가능한 메모리가 클수록 좋습니다. Cam H7은 640 x 320(8비트 그레이스킬(40fps 기준) 및 320 x 240 QVGA(40fps ~ 80fps 기준)의 이미지를 캡처할 수 있는 MT9M114 카메라 모듈을 사용합니다. 이 카메라 모듈은 응용 제품의 요구 사항에 따라 변경할 수 있습니다.

그림 1: OpenMV Cam H7 모듈에는 MV 설계를 시작하는 데 필요한 모든 것이 포함되어 있습니다. (이미지 출처: OpenMV)

OpenMV 개발 환경

그림 2에 표시된 OpenMV 통합 개발 환경(IDE)은 개발자가 Cam H7과 상호 작동하는 방식입니다. 이 IDE를 통해 개발자는 모듈에서 실행되는 Python 스크립트를 편집할 수 있습니다. Cam H7은 마이크로 컨트롤러 기반 시스템에서 실행되도록 특별히 설계된 C Python의 한 포트인 MicroPython을 사용합니다. 이제 개발자들은 Cam H7에 연결해서 스크립트를 장치에 불러와 응용 프로그램을 실행할 수 있습니다. IDE는 또한 Cam H7 프레임 버퍼 이미지의 라이브 피드를 얻는 데 사용할 수 있습니다.

그림 2: OpenMV 개발 환경에는 텍스트 편집기, 단자 및 이미지 캡처 디스플레이 같이 개발자가 Cam H7을 프로그래밍하고 이와 상호 작동하는 데 필요한 모든 것이 포함되어 있습니다. (이미지 출처: OpenMV)

머신 비전 및 머신 러닝을 위한 모듈 사용을 시작하려는 개발자는 멀리 볼 필요가 없습니다. OpenMV IDE에는 시스템을 저전력 모드에 배치하는 것부터 객체 및 얼굴 감지에 이르는 예제 스크립트가 포함되어 있습니다. 또한 모듈과 Wi-Fi, 관성 측정 장치(IMU) 및 다른 옵션과 같은 외부 개발 기판을 연결하는 예도 포함되어 있습니다.

이미지 내 원 감지

OpenMV IDE에는 개발자가 카메라에 연결하여 프레임 버퍼를 제공하는 사진을 찍을 수 있는 HelloWorld 스크립트가 포함되어 있습니다. 이 게시물을 위해, 저는 이미지 내에서 원과 같은 무언가를 감지할 수 있는 예를 찾아보는 것이 흥미로울 것 같았습니다.

OpenMV IDE를 열고 File->Examples->Feature-Detection->find_circles.py를 클릭하면(그림 3 참조) 해당 스크립트가 표시됩니다. 이 스크립트를 테스트하는 것은 매우 쉽습니다. 먼저, 종이나 스티커 메모지에 원을 그려야 합니다(제 그림 솜씨가 꽤 참혹합니다. 이해해 주세요!). 다음으로, IDE의 왼쪽 아래에서 연결 버튼을 찾습니다. 이 버튼을 클릭하여 Cam H7에 연결합니다. 이제, 연결 버튼 바로 아래에 있는 녹색 재생 버튼을 클릭합니다. 마지막으로, 아까 그린 원에 Cam H7를 위치시키고 OpenMV IDE의 프레임 버퍼를 모니터링합니다.

그림 3: OpenMV IDE에서 find_circles.py 예제 스크립트를 찾기 위해 탐색합니다. (이미지 출처: Beningo Embedded Group)

프레임 버퍼에, 직접 그린 원과 겹치는 빨간색 원이 그려집니다(그림 4). 제 부족한 예술적 능력에도 불구하고, Cam H7은 캡처된 이미지에 원과 유사한 것이 있음을 감지할 수 있었습니다. 원은 이 블로그 시리즈의 첫 번째 감지에 불과합니다. 해당 기능을 이해하기 위한 예제 스크립트를 살펴 보겠습니다.

그림 4: find_circles.py 예제 스크립트는 프레임 버퍼에 빨간색 원을 추가하여, 원이 감지되면 강조 표시합니다. (이미지 출처: Beningo Embedded Group)

find_circles.py 예제 분석

원을 감지하기 위해 OpenMV IDE가 제공하는 스크립트는 간단합니다. 먼저, 이 스크립트는 필요한 Python 라이브러리를 가져와 카메라 센서 및 클록을 초기화합니다(목록 1 참조).

복사import sensor, image, time

sensor.reset()
sensor.set_pixformat(sensor.RGB565) # grayscale is faster
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()

목록 1: 카메라 센서를 초기화하는 예제 코드. (코드 소스: OpenMV)

다음으로, 표준 임베디드 응용 프로그램에서처럼, 무한 루프가 연속적으로 응용 프로그램을 실행합니다. 마지막으로 감지를 일으키는 마술 같은 일이 벌어집니다. 목록 2를 검토해 봅니다.

복사while(True):
  clock.tick()
  img = sensor.snapshot().lens_corr(1.8)

  for c in img.find_circles(threshold = 2000, x_margin = 10, y_margin = 10, r_margin = 10,
      r_min = 2, r_max = 100, r_step = 2):
    img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0))
    print(c)

  print("FPS %f" % clock.fps())

목록 2: 카메라 센서를 판독하고 이미지에서 원을 찾는 예제 코드. (코드 출처: OpenMV)

목록 2의 코드는 스냅샷 이미지를 찍는 것으로 시작합니다. OpenMV 라이브러리에 포함된 find_circles라는 메서드가 이미지에서 원을 검색하는 데 사용됩니다. 파라미터에 대한 자세한 내용은 실제 소스 코드 예제의 주석을 참조할 수 있지만 가장 관심이 가는 부분은 r_min, r_max 및 r_step 파라미터입니다. r_min 파라미터는 감지할 수 있는 최소 원 반지름을 지정합니다. r_max 파라미터는 최대값을 설정합니다. 이 예제에서 프로그램은 2픽셀과 100픽셀 사이의 원을 찾습니다.

원이 감지되면 원 x, y 및 반지름 값과 함께 draw_circle 메서드를 사용하여 감지된 원 위에 원을 그립니다. 이 경우 R, G, B 표기법으로 색이 지정되어 있으며 빨간색 원이 그려집니다.

결론

개발자는 머신 비전 및 TinyML을 활용하여 거의 무한대의 사용 사례에 적용할 수 있습니다. 이 게시물에서는 OpenMV Cam H7 및 OpenMV IDE를 소개하고 원을 감지하기 위해 준비 및 실행하는 방법에 대해 알아보았습니다. 그러나 원을 감지하는 데에는 tinyML은 필요 없고, 몇 가지 라이브러리 기능만 필요했습니다. 다음 게시물에서는 내장된 머신 러닝 예제를 살펴본 후, 탐지 프로젝트를 학습하고 배포하는 더 복잡한 예제로 넘어가 보겠습니다.

작성자 정보

Image of Jacob Beningo

Jacob Beningo는 임베디드 소프트웨어 컨설턴트로서 현재 십여 개국 이상의 국가에 있는 고객들과 협력하여 제품 품질, 비용, 출시 기간을 향상시켜 고객의 비즈니스를 극적으로 변화시키고 있습니다. 그는 인기 있는 강연자이자 기술 교육자이며 임베디드 소프트웨어 개발 기술에 대해 200개 이상의 기사를 발표했습니다. 그는 미시간 대학교 공학 석사 학위를 비롯하여 세 개의 학위를 소지하고 있습니다. 월간 Embedded Bytes 뉴스레터를 수신하려면 jacob@beningo.com 및 Jacob Beningo의 웹 사이트인 www.beningo.com으로 언제든지 문의해 주세요.

More posts by Jacob Beningo
 TechForum

Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.

Visit TechForum