树莓派分类器:用树莓派识别不同型号的树莓派!

描述

在本教程系列的第一部分中,您将学习如何使用树莓派AI摄像头来检测不同的树莓派型号。本系列由David Plowman创建,他是树莓派工程师,专注于图像处理硬件、摄像头软件和算法研究。

您可以将AI摄像头对准树莓派4,屏幕上会显示“Raspberry Pi 4”;对准树莓派Zero时显示“Raspberry Pi Zero”,依此类推。

组装在树莓派5上的树莓派AI摄像头

分类器

这是一个强大的示例,展示如何训练树莓派进行实时目标检测推理。这也是探索树莓派AI摄像头API(应用程序接口)以及模型与推理之间关系的好方法。

设置AI摄像头

将您的树莓派 AI 相机连接到兼容的树莓派电脑。我们用的是树莓派5,但是AI相机兼容所有树莓派型号。更多信息可以阅读AI相机数据表。

 

树莓派AI相机采用索尼IMX500图像传感器,为相机应用提供低延迟、高性能的AI能力,而无需AI HAT+(或AI Kit)。它在IMX500传感器上运行定制的神经网络模型。

树莓派AI智能相机包含一个具有AI推理能力的索尼IMX500传感器

分类器

确保系统已更新,然后安装IMX500固件:

  •  

$ sudo apt install imx500-all

此命令会:

安装操作IMX500传感器所需的固件文件imx500_loader.fpk和imx500_firmware.fpk

将多个神经网络模型文件放入/usr/share/imx500-models/

安装IMX500后处理软件到rpicam-apps

安装索尼网络模型打包工具

现在重启树莓派:

  •  

$ sudo reboot

让我们来测试一下是否一切正常。以下命令运行带有对象检测后处理的rpicam-hello:

  •  

$ rpicam-hello -t 0s --post-process-file/usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30

以下命令运行rpicam-hello并进行姿态估计后处理:

  •  

$ rpicam-hello -t 0s --post-process-file/usr/share/rpi-camera-assets/imx500_posenet.json --viewfinder-width 1920 --view

获取代码

现在你的AI相机设置好了,你需要代码。对于本教程,最好从从GitHub复制文件开始。在终端中,输入:

  •  

$ git clone https://github.com/davidplowman/pi_classifier.git

进入pi_classifier目录,查看一下里面的内容:

  •  
  •  

$ cd pi_classifier$ ls

进入pi_classifier目录,您将看到三个文件:

demo.py:Python主程序

labels.txt:包含不同树莓派型号的标签

network.rpk:预训练的神经网络模型文件(针对IMX500传感器优化)

运行代码:

  •  

$ python demo.py

屏幕会显示摄像头预览窗口。将树莓派对准摄像头,预览窗口会根据labels.txt中的选项显示对应型号。

它是如何工作的

让我们在Thonny(或您选择的代码编辑器)中打开demo.py代码并查看一下:

  •  

$ thonny demo.py

parse_and_draw_classification_result

这个函数是作为回调函数提供给相机系统的,这意味着每当一个新的帧从相机到达时,它就会被自动调用,而不需要我们(应用程序)做任何额外的事情。因为我们使用的是索尼IMX500传感器,所以我们不仅获得了通常的相机图像,还获得了一个输出张量,列出了对图像运行神经网络的结果。

我们需要使用 parse_classification_result 解析神经网络结果,然后使用 draw_classification_result 将它们绘制到相机图像上。

parse_classification_result

这将分析IMX500传感器产生的输出张量,并确定图像是否属于网络训练的类别之一。有几件事需要注意。

分类器

检测树莓派3

首先,并不总是有输出张量。如果神经网络加速器没有及时完成对帧的处理,就会发生这种情况。当这种情况发生时,我们应该重用前一帧的结果;另一个框架,张量再次可用,将很快出现!

接下来,我们返回具有最高置信度值的类别。一些网络可能会告诉我们,我们应该对输出值使用softmax运算,以获得每个类的更真实的概率。

draw_classification_result

这里,我们在摄像机图像上绘制一个标签,指示设备类别和置信度值,但前提是置信度值足够高。

我们使用Picamera2的MappedArray以通常的方式访问实际的相机图像像素(而不是它的副本)。我们测量类别标签和置信度值将占据的框的大小,然后将图像的这一部分变暗,以便当我们随后将文本写在顶部时,它会更突出。

分类器

检测树莓派Zero

if __name__ == “__main__”

这部分代码只涉及配置IMX500、上传神经网络固件文件(network.rpk)以及让摄像机运行。有几件事需要指出:

1.我们首先创建IMX500相机辅助对象。这将为我们上传网络,并告诉我们IMX500是哪个摄像头。

2.NetworkIntrinsics对象是网络的助手,它会推荐我们可以使用的合适的帧速率,该帧速率应该与IMX500上的网络推断速率相匹配。

3.在启动相机之前,我们应该告诉IMX500助手,我们希望看到网络上传的进度条——否则很容易认为它可能卡住了!回想一下,网络固件在后续情况下上传更快,因为更多的固件块已经缓存在设备中。

4.最后,我们让脚本永远运行,所有的相机处理都在后台线程中进行。

下载树莓派分类器的完整demo.py代码。

https://github.com/themagpimag/rpimag-issue154/blob/master/pi_classifier/demo.py

原文地址:

https://www.raspberrypi.com/news/build-a-raspberry-pi-classifier-detect-different-raspberry-pi-models/

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分