作者:Jacob Beningo
关键词 : 开发工具, 方案
在嵌入式系统行业中,将机器学习 (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插槽(最大支持64GB的存储卡)
- 扩展输入和输出 (I/O)
扩展I/O为开发人员提供了来自微控制器的一系列外设功能(图2)。这些功能包括通信接口,例如:
- UART
- SPI
- I2C
- CAN
扩展I/O还包括控制和数据通道,用于驱动伺服器、通过数模转换器 (DAC) 生成信号,或通过模数转换器 (ADC) 读取传感器值。这些扩展I/O使得OpenMV模块非常适合家庭自动化、机器人导引、工业自动化以及物体检测和跟踪空间领域的视觉应用。
板载微控制器是STMicroelectronics的STM32F765VIT6,其包含一个采用100引脚LQFP封装的Arm Cortex-M7处理器。该处理器的运行频率为216兆赫 (MHz),并具有2兆字节 (MB) 的闪存和512千字节 (KB) 的RAM。该处理器集成双精度浮点单元 (FPU) 和全套DSP指令,因此功能极其强大,非常适合机器视觉应用。此外,这款微控制器还包括一个基于硬件的JPEG编码器,可以加速成像应用。STM32F765VIT6的一般框图如图3所示。
OpenMV H7相机模块的独特之处在于它支持多个不同的相机模块。例如,如果开发人员不想使用分辨率为640 x 480的板载相机,则可以切换到支持ON Semiconductor的MT9V034图像传感器的模块。MT9V034是一款1/3英寸宽的VGA格式CMOS有源像素数字图像传感器,包含全局快门和高动态范围 (HDR) 模式。该传感器的图像分辨率为752 x 480,设计用于-30˚C至+70˚C的宽温度范围。ON Semiconductor为此图像传感器提供了一款开发板,即MT9V034C12STCH-GEVB(图4)。
物体检测应用开发起步
OpenMV H7相机模块的应用开发全部通过OpenMV IDE完成,该IDE提供了Python接口进行应用开发(图5)。借助Python,无需了解低级编程语言。实际上,不仅脚本是用Python编写的,而且OpenMV H7相机模块还以原生方式运行MicroPython。这为开发人员提供了一种极为简便的方法,可以毫不费力地开始编写机器视觉应用并运行ML推断。
设置好之后,开发人员要做的第一件事就是运行基本的hello_world.py,其中包含清单1 中所示的代码。该Python脚本展示了开发人员如何启用OpenMV相机并连续拍摄快照。这使开发人员能够获得实时视频并测量帧率。连接到PC时,帧率可能会有所不同,从每秒25帧 (fps) 到约60 fps。只需使用屏幕左下角的连接按钮将OpenMV相机连接到OpenMV IDE,然后单击绿色的运行按钮,即可执行该应用。
清单1
# 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 (320×240) 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)。
清单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 (320×240) sensor.set_windowing((128, 128)) # Set 128×128 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 H7的功能
OpenMV模块的扩展方式有很多,能用于不同相机模块和几乎无限数量外部传感器。
尽管OpenMV模块具有I/O扩展功能,但使用外部扩展板来额外获得电源、接地和通信信号,这将非常有用。一款有用的扩展板是DFRobot针对OpenMV M7模块推出的DFR0578 Gravity扩展板(图8)。从图中可以看出,Gravity模块能连接更多电源和接地引脚。它甚至扩展了附加的I2C线路,并提供了为模块供电的其他选项。这使得连接外部传感器和模块变得更加容易,无需使用试验板或接线。
除Gravity板外,开发人员可能会发现另一款值得关注的扩展板也非常有用,就是DFRobot的DFR0498 FireBeetle Covers – 相机和音频媒体板(图9)。FireBeetle开发模块包括:
- 连接IIS编解码器的接口
- 相机模块
- 耳机
- 麦克风
根据最终应用,还有许多其他扩展板可以连接到OpenMV H7camera模块。
使用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代码即可上手,根据复杂程度,他们可以在几小时内拥有可以正常工作的应用。
———————————————————–
如有任何问题,欢迎联系得捷电子Digi-Key客服团队。
中国(人民币)客服
- 400-920-1199
- service.sh@digikey.com
- QQ在线实时咨询 |QQ号:4009201199
中国(美金)/ 香港客服
- 400-882-4440
- 8523104-0500
- china.support@digikey.com
到微信搜寻“digikey”或“得捷电子”
关注我们官方微信
并登记成会员,
每周接收工程师秘技,
赚积分、换礼品、享福利