• 正文
  • 相关推荐
申请入驻 产业图谱

树莓派+OpenCV,打造物品识别与动物识别系统!

08/25 11:45
2458
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

今天的内容是:树莓派+OpenCV,打造物品识别与动物识别系统

在树莓派5上使用YOLO进行物体和动物识别-入门指南

出于历史兼容性考虑,我们保留了本旧版指南。如果您选择遵循本指南,在当前OPEN-CV与新版树莓派“Bullseye”操作系统兼容性尚不完善的情况下,我们强烈建议您先将之前的树莓派“Buster”操作系统刷写到Micro-SD卡上,再使用本指南]

如何将旧的“Buster”树莓派系统刷写到Micro-SD卡上:

https://core-electronics.com.au/guides/raspberry-pi/flash-buster-os-pi/

官方“Buster”镜像:

https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2021-05-28/

本指南将机器学习开源软件融入树莓派生态系统。其中使用的开源软件之一是Open-CV,它是一个庞大的资源库,有助于解决实时计算机视觉和图像处理问题。这是我们第二次探索Open-CV领域,第一次是《树莓派与面部识别》。我们还将利用Coco库中已训练好的物体和动物库。Coco(上下文中的常见物体)库是一个大规模的物体检测、分割和标注数据集。借助这个已训练的库,树莓派就能识别常见物体和动物的大致模样。您可以找到各种物体、生物、声音和动物的预训练库,因此,如果本指南中的这个特定库不符合您的需求,您可以在网上找到许多其他可免费访问的库。本指南使用的库将使我们的树莓派能够识别91种独特的物体/动物,并提供不断更新的置信度评分。本指南内容如下:

所需材料

代码演示与讲解

如何调整代码以查找单个物体

致谢

为物体检测设置Open-CV

代码和已训练的Coco库下载位置

设置完成后,您将能够使用来自树莓派摄像头的视频数据来识别各种日常物体。如下图所示,该系统在实时视频中以51%的置信度正确识别出我为人,以70%的置信度识别出杯子,以67%的置信度识别出手机。对于一台能装进您手掌大小的计算机来说,这简直太棒了,尤其是考虑到现场情况复杂,且摄像头角度奇特。

机器学习从未如此触手可及,本指南将对此进行演示。本页面底部附有一个可下载的zip文件,其中包含所有使用的代码和已训练的COCO库,让您能尽快上手使用。

所需材料

以下是让本系统快速运行所需的组件列表。

树莓派4B型(树莓派提供的额外计算能力对完成此任务至关重要)

树莓派官方摄像头模块V2(您也可以使用树莓派高清摄像头)

Micro SD卡

电源

显示器

HDMI线

鼠标和键盘

代码演示与讲解

在树莓派上快速实现物体识别的方法如下。首先,将一张Micro-SD卡刷写成最新版本的树莓派操作系统。如何将Micro-SD卡刷写成树莓派操作系统的链接在此。

https://core-electronics.com.au/guides/raspberry-pi/writing-sd-cards-for-raspberry-pi/

将Micro-SD卡刷写好后,可将其安装到树莓派上。

然后,确保树莓派已连接到带外设的显示器,并且树莓派摄像头已正确安装在插槽中,排线方向正确,然后开始下面的Open-CV安装过程。安装完成后,您将在最新版本的树莓派操作系统上安装好Open-CV。

https://core-electronics.com.au/guides/raspberry-pi/object-identify-raspberry-pi/#Set

接着,打开树莓派配置菜单(通过左上角的菜单找到并滚动到首选项),在“接口”选项卡下启用摄像头。启用后,重置您的树莓派。设置位置如下图所示。

完成上述步骤后,下一步是下载本页面底部的ZIP文件,并将内容解压到|/home/pi/Desktop|目录。重要的是,文件必须放在此目录中,因为代码将在此目录中搜索物体名称和已训练的库数据。本演示使用Coco库,因为它已训练识别大量常见的日常物体和动物。它还训练识别了一些不太可能遇到的动物,如长颈鹿和斑马。ZIP文件中包含一个记事本列表,列出了所有已训练的物体。

以下是使这一切运作的完整代码。您可以将其复制并粘贴到Thonny或Geany IDE(两者都是Python语言解释器软件)中。或者,您可以用Thonny IDE右键单击并打开文件|object-indent.py|。代码有完整注释,便于理解。

#Import the Open-CV extra functionalitiesimport cv2#This is to pull the information about what each object is calledclassNames = []classFile = "/home/pi/Desktop/Object_Detection_Files/coco.names"with open(classFile,"rt") as f:    classNames = f.read().rstrip("n").split("n")#This is to pull the information about what each object should look likeconfigPath = "/home/pi/Desktop/Object_Detection_Files/ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt"weightsPath = "/home/pi/Desktop/Object_Detection_Files/frozen_inference_graph.pb"#This is some set up values to get good resultsnet = cv2.dnn_DetectionModel(weightsPath,configPath)net.setInputSize(320,320)net.setInputScale(1.0/ 127.5)net.setInputMean((127.5, 127.5, 127.5))net.setInputSwapRB(True)#This is to set up what the drawn box size/colour is and the font/size/colour of the name tag and confidence label   def getObjects(img, thres, nms, draw=True, objects=[]):    classIds, confs, bbox = net.detect(img,confThreshold=thres,nmsThreshold=nms)#Below has been commented out, if you want to print each sighting of an object to the console you can uncomment below     #print(classIds,bbox)    if len(objects) == 0: objects = classNames    objectInfo =[]    if len(classIds) != 0:        for classId, confidence,box in zip(classIds.flatten(),confs.flatten(),bbox):            className = classNames[classId - 1]            if className in objects:                 objectInfo.append([box,className])                if (draw):                    cv2.rectangle(img,box,color=(0,255,0),thickness=2)                    cv2.putText(img,classNames[classId-1].upper(),(box[0] 10,box[1] 30),                    cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),2)                    cv2.putText(img,str(round(confidence*100,2)),(box[0] 200,box[1] 30),                    cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),2)
    return img,objectInfo#Below determines the size of the live feed window that will be displayed on the Raspberry Pi OSif __name__ == "__main__":    cap = cv2.VideoCapture(0)    cap.set(3,640)    cap.set(4,480)    #cap.set(10,70)
#Below is the never ending loop that determines what will happen when an object is identified.        while True:        success, img = cap.read()#Below provides a huge amount of controll. the 0.45 number is the threshold number, the 0.2 number is the nms number)        result, objectInfo = getObjects(img,0.45,0.2)        #print(objectInfo)        cv2.imshow("Output",img)        cv2.waitKey(1)

然后,像下图一样打开代码后,您可以点击运行代码,将看到一个窗口打开,显示树莓派4B型通过官方树莓派摄像头看到的实时视频。每当它看到认识的物体时,就会在该物体周围画一个绿框,并给出标签和置信度评分。如果它看到多个认识的物体,就会创建多个框和标签。您还可以调整阈值百分比值,增加这个值意味着软件只在绝对确定时才会在物体周围画框。另一个值得调整的选项是nms百分比值,增加这个值将限制同时识别的物体数量。说实话,树莓派在计算机视觉方面能如此聪明,简直令人难以置信。现在的乐趣在于试验它能识别和不能识别什么,例如,我们发现它不能识别某些鞋类品牌。说到鞋子,连续运行此代码会使树莓派发热,因此一定要给它采取一些冷却措施。

如何调整代码以查找单个物体

能够只查找单个物体而忽略其他所有物体非常有价值。这样,您可以观察一天中看到的杯子数量,而不观察拿着杯子的人类数量。这也是让树莓派以更高帧率运行实时预览窗口的一种非常有用的方法。

为此,我们将对提供的代码进行微小改动,实际上只需改动一行代码即可实现。我将第50行末尾稍作改动为|result, objectInfo = getObjects(img,0.45,0.2,objects=['cup']|。完成此操作后,保存并运行此脚本。您可以在下图中看到打开的脚本,以及更下方代码中我具体改动部分的特写。

运行上述代码将在树莓派操作系统上打开一个新窗口,该窗口将显示连接的树莓派摄像头看到的实时视频。树莓派将忽略除杯子之外的所有物体。然后,每当它看到认为是杯子的物体时,就会在实时视频中围绕该物体画一个框,并贴上标签和提供置信度评分。如下图所示进行演示,我的咖啡杯被识别出的置信度评分为77%,相当不错。

现在,如果您想识别杯子和马,且只识别这两种东西,您需要编辑第50行,使其如下所示|result, objectInfo = getObjects(img,0.45,0.2,objects=['cup','horse']|。然后,保存代码并点击播放,它将按您的期望运行。如下图所示运行此代码的效果(完全达到我们的目的),运行此代码的确切脚本是本页面底部的|object-ident-2.py|脚本。

有趣的是,您可以在此设置中添加各种代码,每当树莓派识别到物体时,这些代码将激活硬件。|object-ident-3.py|脚本添加了对伺服电机GPIO控制,这与《树莓派面部识别》指南中的GPIO伺服电机控制部分非常相似。

https://core-electronics.com.au/guides/raspberry-pi/face-identify-raspberry-pi/

因此,每当您的树莓派识别到杯子时,它将激活伺服电机,如下图所示。您可以通过下载本页面底部的zip文件查看运行此操作的确切代码。

致谢

以下两个网站对各种平台的开源机器学习非常有用,是学习深度学习和计算机视觉的绝佳工具:

1. https://www.computervision.zone/

2. https://www.pyimagesearch.com/

如果您对训练自己的库软件、通过手势控制无人机或深入了解此机器学习主题感兴趣,这些网站是绝佳的跳板,对我帮助很大。

为物体检测设置Open-CV

以下是让您的树莓派安装适用于物体识别计算机视觉的Open-CV的详细步骤。很快,我将创建一个脚本/单独的教程来简化此过程。打开一台运行最新版本树莓派“Buster”操作系统并连接到互联网的树莓派4B型。

通过点击左上角的终端按钮打开终端。将每个命令复制并粘贴到树莓派的终端中,按Enter键,并等待其完成后再执行下一个命令。如果提示“您想继续吗?(y/n)”,请按Y,然后按Enter键继续。

sudo apt-get update && sudo apt-get upgrade

现在,在运行下一组命令之前,我们必须扩展交换文件。为此,在终端中输入以下行。

sudo nano /etc/dphys-swapfile

将CONF_SWAPSIZE = 100更改为CONF_SWAPSIZE=2048。完成此操作后,按Ctrl-X、Y,然后按Enter键保存这些更改。此更改是暂时的,您应在完成后将其改回。为了让这些更改生效,我们必须通过向终端输入以下命令来重启交换文件。然后,我们将像往常一样继续输入终端命令。

sudo apt-get install build-essential cmake pkg-configsudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-devsudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-devsudo apt-get install libxvidcore-dev libx264-devsudo apt-get install libgtk2.0-dev libgtk-3-devsudo apt-get install libatlas-base-dev gfortransudo pip3 install numpywget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zipwget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zipunzip opencv.zipunzip opencv_contrib.zipcd ~/opencv-4.4.0/mkdir buildcd buildcmake -D CMAKE_BUILD_TYPE=RELEASE                                 -D CMAKE_INSTALL_PREFIX=/usr/local                                 -D INSTALL_PYTHON_EXAMPLES=ON                                 -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.4.0/modules                                 -D BUILD_EXAMPLES=ON ..make -j $(nproc)

此∣make∣命令将需要超过一个小时来安装,且不会有任何关于还需多长时间的指示。它也可能会冻结显示器。请耐心等待,它会正常工作的。一旦完成,您就完成了大部分工作。如果它在任何时候失败,您会收到类似∣make:∗∗∗[Makefile:163:all]Error2∣的消息,这时候只需重新输入并执行上面的行∣make−j(nproc)|。不要担心,它会记住所有已完成的工作,并从停止的地方继续。一旦完成,我们将继续输入终端命令。

sudo make install && sudo ldconfigsudo reboot

至此,安装过程的大部分已完成,现在您可以将交换文件改回,使CONF_SWAPSIZE = 100。

代码和已训练的Coco库下载位置

以下是本设置中使用的代码和Coco库。此外,zip文件中还包含Coco库训练的所有物体的列表。

值得注意的是——您可以找到各种物体、生物、声音和动物的预训练库,因此,如果本指南中的这个库不符合您的需求,您可以在网上找到许多其他库。树莓派硬件可以利用这些预训练库,但由于训练所需的计算能力巨大,我建议不要使用树莓派创建训练库。

附件 - Object_Detection_Files.zip

https://core-electronics.com.au/media/kbase/491/Object_Detection_Files.zip

很多人一直以为树莓派(Raspberry Pi)只是创客圈子里的小玩具——一块信用卡大小的开发板,用来点亮 LED、跑个 Python 脚本、或者给中学生上一堂入门编程课。然而,事实远比想象震撼:树莓派已经悄悄完成了从“教学演示”到“工业级主力”的华丽转身,正在产线、机房、实验室甚至外太空里 7×24 小时不间断服役。

相关推荐