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은 STMicroelectronics의 STM32H743VI 마이크로 컨트롤러를 기반으로 하며, 이 마이크로 컨트롤러는 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은 필요 없고, 몇 가지 라이브러리 기능만 필요했습니다. 다음 게시물에서는 내장된 머신 러닝 예제를 살펴본 후, 탐지 프로젝트를 학습하고 배포하는 더 복잡한 예제로 넘어가 보겠습니다.
Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.
Visit TechForum


