OpenMV 캠으로 머신 러닝을 물체 감지에 빠르게 적용

작성자: Jacob Beningo

DigiKey 북미 편집자 제공

머신 러닝(ML)을 응용한 물체 감지 및 분류는 내장형 시스템 산업, 특히 사물 인터넷(IoT), 보안, 고급 운전 지원 시스템(ADAS), 산업 자동화 기반 시스템에는 필수적으로 요구됩니다. 하지만 물체 감지는 복잡한 주제이고 ML은 상대적으로 새로운 주제이므로 물체 감지를 위한 ML 응용 제품을 개발하는 것이 어렵고 번거로울 수 있습니다.

예를 들어 전통적으로 물체 감지를 성공적으로 구현하려면 개발자가 OpenCV와 같은 프레임워크를 학습하고 수천 달러에 상당하는 컴퓨터 장비를 구입해야 했습니다. 따라서 물체 감지와 머신 비전에 대한 기존의 접근 방식은 많은 시간과 비용이 듭니다.

ML에 대한 전문성 없이 장비에 큰 비용을 들이지 않고 물체 감지 및 머신 비전 응용 분야에 ML을 적용하려는 엔지니어에게 SparkFun Electronics의 Python 프로그래밍 가능 OpenMV H7 카메라 모듈은 혁신적인 솔루션입니다. 이 모듈은 이미지 처리 및 감지를 위한 저비용 “Arduino”형 모듈로 설계되었습니다. 따라서 이 모듈 및 소프트웨어 에코시스템은 저비용 모듈 형태로 ML을 이용하여 손쉽게 물체를 감지하여 분류할 수 있는 고유하고 흥미로운 솔루션을 제공합니다.

이 기사에서는 OpenMV H7 카메라 모듈을 소개하고 개발자가 CIFAR-10 컴퓨터 비전 이미지 데이터 세트를 사용하여 물체 감지에 ML을 적용하는 방법을 보여줍니다.

OpenMV H7 카메라 모듈

풍부한 기능을 갖춘 소프트웨어 라이브러리를 갖춘 OpenMV H7 카메라 모듈을 사용하면 개발자가 ML 응용 제품을 빠르게 생성할 수 있습니다. 예를 들어 개발자는 OpenMV 카메라를 사용하여 얼굴 및 눈을 감지하고 동공을 정밀하게 추적할 수 있습니다. 색상을 추적하는 물방울 또는 마커를 생성하는 데에도 이 카메라를 사용할 수 있습니다. ML을 사용하여 맞춤형 물체를 감지 및 추적하는 방법을 보여주는 예제도 있습니다.

OpenMV H7 카메라 모듈은 기존 머신 비전 시스템보다 적은 비용으로 ML 기반 물체 감지 및 분류에 필요한 모든 하드웨어 부품을 포함하는 단일 통합 개발 기판입니다. 이 모듈은 1.4인치 x 1.75인치의 상대적으로 작은 크기에 다음을 포함합니다.

  • 하이엔드 마이크로 컨트롤러
  • 교체 가능한 통합 카메라 모듈
  • 배터리 커넥터
  • USB 마이크로 커넥터
  • 3색 LED
  • microSD 소켓(최대 64GB 카드 지원)
  • 확장 입력 및 출력(I/O)

SparkFun Electronics의 OpenMV H7 카메라 모듈 이미지그림 1: OpenMV H7 카메라 모듈은 ML을 사용하여 머신 비전 응용 제품을 빠르게 개발 및 배포하는 데 필요한 모든 부품에 완벽하게 통합됩니다. (이미지 출처: SparkFun Electronics)

확장 I/O는 개발자에게 마이크로 컨트롤러의 광범위한 주변 장치 기능을 제공합니다(그림 2). 이러한 기능에는 다음과 같은 통신 인터페이스가 포함됩니다.

  • UART
  • SPI
  • I2C
  • CAN

또한 확장 I/O는 서보를 구동하거나, 디지털 아날로그 컨버터(DAC)를 통해 신호를 생성하거나, 아날로그 디지털 컨버터(ADC)를 통해 센서 값을 읽기 위한 제어 및 데이터 채널을 포함합니다. 이러한 확장 I/O는 OpenMV 모듈을 가정 자동화, 로봇 안내, 산업 자동화, 물체 감지 및 추적 공간 내 비전 응용 분야에 매우 유용하게 만들어 줍니다.

SparkFun의 OpenMV H7 카메라 모듈 핀 구성 표그림 2: OpenMV H7 카메라 모듈은 많은 확장 가능한 I/O 핀과 함께 제공됩니다. 이러한 핀을 사용하여 서보 모터 또는 샘플 센서를 제어하거나 Wi-Fi 모듈과 통신하여 IoT 장치를 생성할 수 있습니다. (이미지 출처: SparkFun)

기판 실장 마이크로 컨트롤러는 STMicroelectronicsSTM32F765VIT6이며 100핀 LQFP에 Arm Cortex-M7 프로세서가 포함되어 있습니다. 이 프로세서는 216MHz로 실행되며 2Mbytes 플래시와 512Kbytes RAM을 포함합니다. 이 프로세서는 성능이 매우 뛰어나며 배정밀도 부동 소수점 처리 장치(FPU)와 전체 DSP 명령으로 인해 머신 비전 응용 분야에 적합합니다. 또한 마이크로 컨트롤러는 이미징 응용 분야를 가속화할 수 있는 하드웨어 기반 JPEG 인코더를 포함합니다. 그림 3은 STM32F765VIT6의 일반 제품 구성도를 보여줍니다.

2Mbytes 플래시와 512Kbytes RAM을 포함하는 STMicroelectronics의 STM32F765VIT 구성도그림 3: STM32F765VIT는 2Mbytes 플래시, 512Kbytes RAM 및 주변 장치(예: 머신 비전 응용 분야에 완벽하게 어울리는 하드웨어 기반 JPEG 인코딩 및 DSP 명령)를 포함합니다. (이미지 출처: STMicroelectronics)

OpenMV H7 카메라 모듈은 다양한 카메라 모듈을 고유하게 지원합니다. 예를 들어 개발자는 640 x 480 분해능의 기판 실장 카메라를 원치 않을 경우 ON SemiconductorMT9V034 이미지 센서를 지원하는 모듈로 전환할 수 있습니다. MT9V034는 글로벌 셔터와 높은 작동 범위(HDR) 모드를 포함하는 1/3인치 폭 VGA 형식 CMOS 활성 픽셀 디지털 이미징 센서입니다. 이 센서는 이미지 분해능이 752 x 480이고 -30˚C ~ +70˚C의 폭넓은 온도 범위에서 작동하도록 설계되었습니다. ON Semiconductor는 이 이미지 센서를 위한 개발 기판인 MT9V034C12STCH-GEVB를 제공합니다(그림 4).

ON Semiconductor의 MT9V034C12STCH-GEVB 개발 기판 이미지그림 4: MT9V034C12STCH-GEVB는 개발 및 테스트 가속화를 위한 내장 렌즈를 포함하는 MT9V034 이미지 센서용 개발 기판입니다. (이미지 출처: ON Semiconductor)

첫 번째 물체 감지 응용 제품 개발

OpenMV H7 카메라 모듈을 위한 응용 제품 개발은 응용 제품 개발용 Python 인터페이스를 제공하는 OpenMV IDE를 통해 완전히 수행됩니다(그림 5). Python을 사용하면 하위 수준 프로그래밍 언어를 몰라도 됩니다. 실제로 스크립트가 Python에서 작성되고 OpenMV H7 카메라 모듈에서 기본적으로 MicroPython을 실행합니다. 따라서 개발자가 최소한의 노력으로 머신 비전 응용 제품 작성과 ML 추론 실행을 매우 쉽게 시작할 수 있습니다.

OpenMV IDE의 Python 기반 인터페이스 이미지(확대하려면 클릭)그림 5: OpenMV IDE는 OpenMV H7 카메라 모듈용 응용 제품 코드를 개발하는 데 필요한 Python 기반 인터페이스를 제공합니다. 그런 다음 응용 제품 코드는 MicroPython을 실행 중인 카메라 모듈에 스크립트로 전송됩니다. (이미지 출처: Beningo Embedded Group)

설정 후 개발자가 가장 먼저 수행해야 하는 것 중 하나는 목록 1에 표시된 코드를 포함하는 기본 hello_world.py를 실행하는 것입니다. 이 Python 스크립트는 개발자에게 OpenMV 카메라를 활성화하고 스냅샷을 연속으로 찍는 방법을 보여줍니다. 그러면 개발자는 라이브 동영상을 가져와서 프레임 속도를 측정할 수 있습니다. 프레임 속도는 PC에 연결된 동안 25fps ~ 약 60fps 사이에서 변경될 수 있습니다. 화면 왼쪽 하단에 있는 연결 버튼을 사용하여 OpenMV 카메라를 OpenMV IDE에 연결한 다음 녹색 실행 버튼을 클릭하면 응용 제품이 실행됩니다.

복사 # Hello World Example # # Welcome to the OpenMV IDE! Click on the green run arrow button below to run the script!
import sensor, image, time sensor.reset() # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE) sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240) sensor.skip_frames(time = 2000) # Wait for settings take effect.
clock = time.clock() # Create a clock object to track the FPS.
while(True): clock.tick()  # Update the FPS clock.
img = sensor.snapshot() # Take a picture and return the image.
print(clock.fps()) # Note: OpenMV Cam runs about half as fast when connected # to the IDE. The FPS should increase once disconnected. 

목록 1: OpenMV IDE hello_world.py 응용 제품은 OpenMV 카메라 모듈을 활성화하여 라이브 동영상을 제공합니다. (코드 출처: OpenMV)

첫 번째 물체 감지 및 분류 테스트를 실행하기 위해 원하는 물체 감지 클래스를 사용하여 ML 네트워크를 교육해야 합니다. 물체 감지 모델을 교육하고 모델이 잘 작동하는지 테스트하는 데 일반적으로 사용되는 이미지 데이터 세트는 CIFAR-10 데이터 세트입니다. CIFAR-10 데이트 세트는 다음 10가지 이미지 클래스에 대한 32 x 32 컬러 이미지를 포함하는 60,000개의 이미지로 구성됩니다.

  • 비행기
  • 자동차
  • 고양이
  • 사슴
  • 개구리
  • 트럭

모듈을 교육하고 OpenMV 카메라에서 실행 가능한 추론으로 변환하는 데 사용되는 공정은 이 기사의 범위를 벗어납니다. 하지만 모델 개발을 검토하지 않고 CIFAR-10 교육 네트워크를 실행할 수 있습니다. OpenMV IDE에는 카메라에 로드하면 되는 CIFAR-10용으로 교육된 모델이 이미 포함되어 있습니다.

이 모델을 사용하려면 OpenMV 카메라를 PC 및 OpenMV IDE에 연결합니다. OpenMV IDE에서 도구 -> 머신 러닝 -> CNN 네트워크 라이브러리를 클릭합니다. OpenMV qtcreator 모델 폴더가 있는 창이 열립니다. 다음과 같은 두 가지 옵션이 있습니다.

  • cmsisnn
  • tensorflow

cmsisnn에서 cifar10 폴더로 이동한 다음 cifar10.network를 클릭하여 엽니다. 그러면 다른 창이 열립니다. 이 창에서는 교육된 네트워크 파일을 OpenMV 카메라에 저장합니다. 그런 다음 사용자는 카메라에 표시되는 네트워크를 저장할 대용량 스토리지 드라이브를 선택할 수 있습니다.

네트워크를 저장한 후 파일 -> 예제 -> 25 머신 러닝 -> nn_cifar10_search_whole_window.py로 이동하여 CIFAR-10 머신 러닝 예제를 로드합니다. 그러면 아래와 같은 예제 스크립트가 로드됩니다(목록 2).

복사 # CIFAR-10 Search Whole Window Example # # CIFAR is a convolutional neural network designed to classify its field of view into several # different object types and works on RGB video data.
# # In this example we slide the LeNet detector window over the image and get a list of activations # where there might be an object. Note that use a CNN with a sliding window is extremely compute # expensive so for an exhaustive search do not expect the CNN to be real-time.
import sensor, image, time, os, nn sensor.reset() # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE) sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240) sensor.set_windowing((128, 128)) # Set 128x128 window.
sensor.skip_frames(time=750) # Don't let autogain run very long.
sensor.set_auto_gain(False) # Turn off autogain.
sensor.set_auto_exposure(False) # Turn off whitebalance.
# Load cifar10 network (You can get the network from OpenMV IDE).
net = nn.load('/cifar10.network') # Faster, smaller and less accurate.
# net = nn.load('/cifar10_fast.network') labels = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] clock = time.clock() while(True): clock.tick() img = sensor.snapshot() # net.search() will search an roi in the image for the network (or the whole image if the roi is not # specified). At each location to look in the image if one of the classifier outputs is larger than # threshold the location and label will be stored in an object list and returned. At each scale the # detection window is moved around in the ROI using x_overlap (0-1) and y_overlap (0-1) as a guide.
# If you set the overlap to 0.5 then each detection window will overlap the previous one by 50%. Note # the computational work load goes WAY up the more overlap. Finally, for mult-scale matching after     # sliding the network around in the x/y dimensions the detection window will shrink by scale_mul (0-1) # down to min_scale (0-1). For example, if scale_mul is 0.5 the detection window will shrink by 50%.
# Note that at a lower scale there's even more area to search if x_overlap and y_overlap are small...
# contrast_threshold skips running the CNN in areas that are flat.
for obj in net.search(img, threshold=0.6, min_scale=0.5, scale_mul=0.5, \ x_overlap=0.5, y_overlap=0.5, contrast_threshold=0.5): print("Detected %s - Confidence %f%%" % (labels[obj.index()], obj.value())) img.draw_rectangle(obj.rect(), color=(255, 0, 0)) print(clock.fps()) 

목록 2: OpenMV IDE nn_cifar10_search_whole_window.py 예제 응용 제품은 이미지를 분류하고 분류에 대한 신뢰 수준을 측정하는 데 사용됩니다. (코드 출처: OpenMV)

hello_world.py 스크립트에 따라 테스트 응용 제품을 실행할 수 있습니다. 즉, 왼쪽 하단에서 연결을 클릭하여 OpenMV IDE를 모듈에 연결한 다음 실행을 클릭합니다. 그러면 카메라에서 스크립트를 실행하고 표시된 이미지를 분류하려고 시도합니다. 단자 창에 이미지를 분류할지 여부와 신뢰 수준이 출력됩니다.

이제 개발자는 CIFAR-10 데이터 세트 내에 있는 다른 물체를 제공하여 카메라에서 물체를 분류하도록 해야 합니다. 이 기사에서는 고양이 이미지(그림 6) 및 비행기 이미지(그림 7)와 함께 카메라를 제공했습니다. 이미지에서 잘 보이지 않지만 신뢰 수준은 약 70%입니다. 교육된 이미지와 테스트 이미지, 조명 조건 및 기타 요소의 차이로 인해 신뢰 수준이 낮아질 수 있습니다. 추가적인 교육과 카메라 환경에 대한 엄격한 제어를 통해 더 높은 신뢰 수준을 달성할 수 있습니다.

CNN 네트워크를 실행 중인 OpenMV IDE 카메라 이미지(확대하려면 클릭)그림 6: 인식용 고양이와 함께 제공된 CIFAR-10 데이터 세트용 CNN 네트워크를 실행 중인 OpenMV IDE 카메라 (이미지 출처: Beningo Embedded Group)

CIFAR-10용 CNN 네트워크를 실행 중인 OpenMV IDE 카메라 이미지(확대하려면 클릭)그림 7: 인식용 비행기와 함께 제공된 CIFAR-10 데이터 세트용 CNN 네트워크를 실행 중인 OpenMV IDE 카메라 (이미지 출처: Beningo Embedded Group)

OpenMV H7의 기능 확장

OpenMV 모듈을 확장하여 다양한 카메라 모듈과 거의 무제한의 외부 센서에 사용할 수 있습니다.

OpenMV 모듈에는 I/O 확장 기능이 있지만 전력, 접지 및 통신 신호에 추가적으로 액세스할 수 있는 외부 확장 기판을 사용하는 것이 좋습니다. 유용한 확장 기판으로는 DFRobot의 OpenMV M7 모듈용 DFR0578 Gravity 확장 실드가 있습니다(그림 8). 그림에서 알 수 있듯이 Gravity 모듈을 사용하여 많은 전력 및 접지 핀에 액세스할 수 있습니다. 또한 추가 I2C 라인을 확장하고 추가적인 모듈 구동 옵션을 제공합니다. 따라서 브레드 기판을 사용하거나 전선을 연결하지 않고 외부 센서 및 모듈을 쉽게 연결할 수 있습니다.

DFRobot의 Gravity 확장 기판 이미지그림 8: OpenMV 캠 M7용 DFRobot Gravity 확장 기판은 빠른 시제품 제작을 간소화하는 액세스하기 쉬운 다양한 추가 헤더를 제공합니다. (이미지 출처: DFRobot)

Gravity 기판 이외에 개발자에게 유용한 다른 흥미로운 확장 기판으로는 DFRobot DFR0498 FireBeetle 덮개 – 카메라 및 오디오 미디어 기판이 있습니다(그림 9). FireBeetle 개발 모듈에는 다음이 포함되어 있습니다.

  • IIS 코덱 연결 인터페이스
  • 카메라 모듈
  • 이어폰
  • 마이크

최종 응용 분야에 따라 OpenMV H7 카메라 모듈에 연결할 수 있는 많은 다른 확장 기판이 있습니다.

DFRobot의 FireBeetle DFR0498 이미지그림 9: DFRobot FireBeetle DFR0498에는 미디어 장치용 확장(예: 마이크)이 포함되어 있습니다. (이미지 출처: DFRobot)

OpenMV 작업을 위한 유용한 정보

OpenMV H7 카메라 모듈을 시작하는 것은 어렵지 않지만 이 모듈을 처음으로 사용하는 개발자가 알아야 하는 여러 미묘한 차이와 결정 사항이 있습니다. 다음은 모듈을 시작하기 위한 몇 가지 “유용한 정보”입니다.

  • 모듈을 처음으로 사용하는 경우 OpenMV 설명서에 요약된 절차에 따라 모듈에서 초점을 조정해야 합니다.
  • 파일 -> 예제 메뉴에서 색상 감지 방법, 얼굴 인식 등 수십 가지 예제에 액세스할 수 있습니다.
  • 인터넷 연결을 추가하려면 Wi-Fi 실드를 사용하는 것이 좋습니다. OpenMV IDE의 도구 -> OpenMV 캠 설정 옵션에서 시작 시 Wi-Fi 실드를 자동으로 활성화하도록 설정할 수 있습니다.
  • TensorFlow Lite를 사용하여 원하는 물체에 대해 ML 모듈을 교육하는 것이 좋습니다.

개발자가 “유용한 정보”를 따르면 OpenMV H7 카메라 모듈을 처음으로 사용할 때 많은 시간을 절약하고 문제를 방지할 수 있습니다.

결론

위에서 살펴본 바와 같이 OpenMV H7 카메라 모듈은 개발자가 ML 원칙을 물체 감지 및 관련 응용 분야에 빠르게 적용할 수 있도록 도와줍니다. 개발자가 설계를 가속화하기 위해 활용할 수 있는 예제 응용 분야뿐 아니라 카메라 및 센서를 위한 다양한 확장 옵션도 제공됩니다. 개발자는 몇 줄의 Python 코드를 작성하는 방법만 익히면 시작할 수 있습니다. 그러면 복잡도에 따라 몇 시간 이내에 작동하는 응용 제품을 작성할 수도 있습니다.

DigiKey logo

면책 조항: 이 웹 사이트에서 여러 작성자 및/또는 포럼 참가자가 명시한 의견, 생각 및 견해는 DigiKey의 의견, 생각 및 견해 또는 DigiKey의 공식 정책과 관련이 없습니다.

작성자 정보

Image of Jacob Beningo

Jacob Beningo

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

게시자 정보

DigiKey 북미 편집자