使用 OpenMV Cam 快速开始将机器学习应用于物体检测

作者: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 英寸 (in.),其中包括:

  • 高端微控制器
  • 集成且可更换的相机模块
  • 电池连接器
  • USB 微型连接器
  • 三色 LED
  • microSD 插槽(最大支持 64 GB 的存储卡)
  • 扩展输入和输出 (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 模块通信以创建物联网设备。(图片来源:SparkFun)

板载微控制器是 STMicroelectronicsSTM32F765VIT6,其包含一个采用 100 引脚 LQFP 封装的 Arm Cortex-M7 处理器。该处理器的运行频率为 216 兆赫 (MHz),并具有 2 兆字节 (MB) 的闪存和 512 千字节 (KB) 的 RAM。该处理器集成双精度浮点单元 (FPU) 和全套 DSP 指令,因此功能极其强大,非常适合机器视觉应用。此外,这款微控制器还包括一个基于硬件的 JPEG 编码器,可以加速成像应用。STM32F765VIT6 的一般框图如图 3 所示。

STMicroelectronics 的 STM32F765VIT 包括 2 MB 闪存和 512 KB RAM 的示意图图 3:STM32F765VIT 包含 2 MB 的闪存,512 KB 的 RAM 和外设,例如基于硬件的 JPEG 编码和 DSP 指令,使其非常适合机器视觉应用。(图片来源:STMicroelectronics)

OpenMV H7 相机模块的独特之处在于它支持多个不同的相机模块。例如,如果开发人员不想使用分辨率为 640 x 480 的板载相机,则可以切换到支持 ON SemiconductorMT9V034 图像传感器的模块。MT9V034 是一款 1/3 英寸宽的 VGA 格式 CMOS 有源像素数字图像传感器,包含全局快门和高动态范围 (HDR) 模式。该传感器的图像分辨率为 752 x 480,设计用于 -30˚C 至 +70˚C 的宽温度范围。ON Semiconductor 为此图像传感器提供了一款开发板,即 MT9V034C12STCH-GEVB(图 4)。

ON Semiconductor 的 MT9V034C12STCH-GEVB 开发板图片图 4:MT9V034C12STCH-GEVB 是用于 MT9V034 图像传感器的开发板,其中包括内置镜头,可加快开发和测试速度。(图片来源:ON Semiconductor)

开发第一款物体检测应用

OpenMV H7 相机模块的应用开发全部通过 OpenMV IDE 完成,该 IDE 提供了 Python 接口进行应用开发(图 5)。借助 Python,无需了解低级编程语言。实际上,不仅脚本是用 Python 编写的,而且 OpenMV H7 相机模块还以原生方式运行 MicroPython。这为开发人员提供了一种极为简便的方法,可以毫不费力地开始编写机器视觉应用并运行 ML 推断。

OpenMV IDE 基于 Python 的接口图片(点击放大)图 5:OpenMV IDE 提供了一个基于 Python 的接口,可为 OpenMV H7 相机模块开发应用代码。然后将应用作为脚本发送至运行 MicroPython 的相机模块。(图片来源:Beningo Embedded Group)

设置好之后,开发人员要做的第一件事就是运行基本的 hello_world.py,其中包含清单 1 中所示的代码。该 Python 脚本展示了开发人员如何启用 OpenMV 相机并连续拍摄快照。这使开发人员能够获得实时视频并测量帧率。连接到 PC 时,帧率可能会有所不同,从每秒 25 帧 (fps) 到约 60 fps。只需使用屏幕左下角的连接按钮将 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 数据集含有 60,000 张图片,其中包含以下 10 种不同图像类别的 32 x 32 彩色图像:

  • 飞机
  • 汽车
  • 鹿
  • 青蛙
  • 卡车

有关如何训练模型并将其转换为可在 OpenMV 相机上运行的推断,超出了本文的论述范围。但是无需进行模型开发就可以运行经过 CIFAR-10 训练的网络:OpenMV IDE 已包括一个经过训练的 CIFAR-10 模型,只需将其加载到相机即可使用。

要使用此模型,请将 OpenMV 相机连接到 PC 和 OpenMV IDE。在 OpenMV IDE 中,单击 tools(工具)-> machine learning(机器学习)-> CNN Network Library(CNN 网络库)。随即将打开一个包含 OpenMV qtcreator models 文件夹的窗口。其中有两个选项:

  • cmsisnn
  • tensorflow

在 cmsisnn 下,导航至 cifar10 文件夹,单击 cifar10.network。然后将打开另一个窗口。该窗口可用于将经过训练的网络文件保存在 OpenMV 相机上。然后,用户可以选择相机随附的大容量存储驱动器来保存该网络。

保存网络后,通过转到 File(文件)-> Examples(示例)-> 25-Machine-Learning(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 脚本执行:通过单击左下角的 connect(连接)将 OpenMV IDE 连接到相机模块,然后单击 run(运行)。此时,相机将运行该脚本并尝试对所看到的图像进行分类。终端窗口将输出图像是否已分类,以及置信度是多少。

此时,开发人员只需展示 CIFAR-10 数据集中的不同物体,并让相机对它们进行分类。就本文的目的而言,为相机提供了猫(图 6)和飞机(图 7)的图像。虽然从图像中很难看到,但置信度约为 70%。由于训练图像与测试图像的差异、光照条件和其他因素,因此置信度可能较低。通过更多的训练并对相机环境加强控制,一定可以达到更高的置信度。

OpenMV IDE 相机运行 CNN 网络的图片(点击放大)图 6:OpenMV IDE 相机针对 CIFAR-10 数据集运行 CNN 网络(展示一只猫以供识别)。(图片来源:Beningo Embedded Group)

OpenMV IDE 相机针对 CIFAR-10 运行 CNN 网络的图片(点击放大)图 7:OpenMV IDE 相机针对 CIFAR-10 数据集运行 CNN 网络(展示一架飞机以供识别)。(图片来源:Beningo Embedded Group)

扩展 OpenMV H7 的功能

OpenMV 模块的扩展方式有很多,能用于不同相机模块和几乎无限数量外部传感器。

尽管 OpenMV 模块具有 I/O 扩展功能,但使用外部扩展板来额外获得电源、接地和通信信号,这将非常有用。一款有用的扩展板是 DFRobot 针对 OpenMV M7 模块推出的 DFR0578 Gravity 扩展板(图 8)。从图中可以看出,Gravity 模块能连接更多电源和接地引脚。它甚至扩展了附加的 I2C 线路,并提供了为模块供电的其他选项。这使得连接外部传感器和模块变得更加容易,无需使用试验板或接线。

DFRobot 的 Gravity 扩展板图片图 8:DFRobot 针对 OpenMV cam M7 推出的 Gravity 扩展板提供了多个易于访问的附加针座,以简化快速原型开发。(图片来源:DFRobot)

除 Gravity 板外,开发人员可能会发现另一款值得关注的扩展板也非常有用,就是 DFRobot 的 DFR0498 FireBeetle Covers – 相机和音频媒体板(图 9)。FireBeetle 开发模块包括:

  • 连接 IIS 编解码器的接口
  • 相机模块
  • 耳机
  • 麦克风

根据最终应用,还有许多其他扩展板可以连接到 OpenMV H7camera 模块。

DFRobot 的 FireBeetle DFR0498 图片图 9:DFRobot 的 FireBeetle DFR0498 包括用于麦克风等媒体设备的扩展功能。(图片来源:DFRobot)

使用 OpenMV 的技巧与诀窍

虽然开始使用 OpenMV H7 相机模块并不困难,但是开发人员在首次使用时应注意许多细微差别和决定。以下是开始使用该模块的一些“技巧与诀窍”:

  • 首次使用模块时,确保使用 OpenMV 文档中所述的步骤在模块上调整焦距。
  • 在 Files(文件)-> Examples(示例)菜单中,可访问几十个示例,从如何检测颜色到面部识别。
  • 要添加互联网连接,请考虑使用 Wi-Fi 扩展板。通过 Tools(工具)-> OpenMV Cam Settings(OpenMV Cam 设置)选项,可以在启动时自动启用 Wi-Fi 扩展板。
  • 考虑使用 TensorFlow Lite 为感兴趣的物体训练 ML 模型。

开发人员遵循这些“技巧与诀窍”后,便会发现初次使用 OpenMV H7 相机模块时,他们可以节省不少时间并省去很多麻烦。

总结

如上所述,OpenMV H7 相机模块特别适合帮助开发人员快速开始将 ML 原理应用于物体检测和相关应用。开发人员不仅可以利用现成的示例应用来加速设计,还可以使用许多相机和传感器扩展选项。开发人员只需知道如何编写几行 Python 代码即可上手,根据复杂程度,他们可以在几小时内拥有可以正常工作的应用。

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此作者

Jacob Beningo

Jacob Beningo 是一位嵌入式软件顾问,目前与十几个国家的客户保持合作,通过帮助客户改善产品质量、降低成本和加快上市时间来大幅改变他们的业务。Jacob 先后发表了 200 多篇关于嵌入式软件开发技术的文章,是一位广受欢迎的演讲者和技术培训师。他拥有三个学位,其中包括密歇根大学的工程硕士学位。如有需要,欢迎随时通过 jacob@beningo.com 与其联系,也可访问其网站 www.beningo.com,并订阅其月度 Embedded Bytes Newsletter

关于此出版商

DigiKey 北美编辑