0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

告别性能瓶颈:使用 Google Coral TPU 为树莓派注入强大AI计算力!

上海晶珩电子科技有限公司 2025-03-25 09:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

bc27e802-0918-11f0-9434-92fbcf53809c.jpg

使用机器学习的应用程序通常需要高计算能力。这些计算通常发生在显卡的GPU上。Raspberry Pi并不专门设计用于运行计算密集型应用程序。但Google Coral USB加速器能在此提供帮助!借助此设备,我们可以在视频中实现实时计算,如对象识别。

在本教程中,我们将探讨如何在Raspberry Pi上集成和使用Google Coral。然后,我们将利用Raspberry Pi摄像头中的视频流创建实时对象检测。

所需硬件部件

我在本教程中使用了以下硬件部件。许多组件在之前的教程中已经使用过。

Raspberry Pi*

Edge TPU:Google Coral USB加速器

官方Raspberry Pi摄像头模块 或 USB网络摄像头

用于识别的简单对象(办公用品、水果等)

最佳选择:一个为Raspberry Pi和USB加速器配备散热器的外壳(也可3D打印)。

Google Coral USB加速器比Raspberry Pi4小,应通过USB 3.0端口连接。

bc3d4238-0918-11f0-9434-92fbcf53809c.png

Google Coral USB加速器用于什么?

Google Coral USB加速器包含一个专门为神经网络计算而设计的处理器。这个处理器被称为Edge-TPU(Tensor Processing Unit)。

以下视频对神经网络进行了很好的解释,包括它们到底是什么,以及为什么你经常在阅读机器学习相关内容时会看到它们:


因此,主要任务之一是解决这些神经网络(以矩阵的形式),而Edge TPU特别擅长于此。Google提供了特殊的库,以便我们可以利用Coral USB加速器的特性。

在Raspberry Pi上安装Google Coral Edge TPU

为了使用Coral Edge TPU的处理能力,我们需要安装一些软件包。为此,我们主要遵循TPU网站的步骤。使用 USB 加速器入门:https://coral.ai/docs/accelerator/get-started/使用 SSH 和 Putty 远程访问树莓派https://tutorials-raspberrypi.com/raspberry-pi-remote-access-by-using-ssh-and-putty/打开终端(或通过SSH连接),然后输入以下命令:

echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.listcurl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -sudo apt-get update

之后,我们可以安装Edge TPU运行时:

sudo apt-get install libedgetpu1-std

注意:如果你想安装一个“更快”的运行时(意味着:频率更高),请使用以下命令:sudo apt-get install libedgetpu1-max。但是,请记住,不能同时安装这两个版本。此外,高频版本会使工作温度升高,因此你应仅在具备足够好的散热条件时使用它。

安装完成后,你可以将USB加速器连接到Raspberry Pi(最好连接到蓝色的USB 3.0端口)。如果在安装之前已经连接,请暂时断开并重新连接。

现在,我们安装Python软件包。为此,以下命令已足够:

sudo apt-get install python3-pycoral --yes

安装TensorFlow Lite

我们还需要TensorFlow Lite。首先,我们检查版本:

pip3 show tflite_runtime

我的结果如下:

Name: tflite-runtimeVersion: 2.5.0Summary: TensorFlow Lite is for mobile and embedded devices.Home-page: https://www.tensorflow.org/lite/Author: Google, LLCAuthor-email: packages@tensorflow.orgLicense: Apache 2.0Location: /usr/lib/python3/dist-packagesRequires:Required-by: pycoral

如果你尚未安装TensorFlow,可以按以下方式操作,然后再次运行命令:

echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.listcurl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -sudo apt-get updatesudo apt-get install python3-tflite-runtime

使用Google Coral和Raspberry Pi摄像头在视频中进行对象识别

接下来,我们希望在视频流中实时激活对象检测。计算将在Edge TPU上运行。为了显示图像,我们有几个选项。我们可以使用例如PyGame、PiCamera或OpenCV等软件包。我更喜欢OpenCV,因为它允许我们使用计算机视觉领域的更多功能。

首先,我们通过CSI连接Raspberry Pi摄像头,或通过USB连接网络摄像头。大多数网络摄像头会自动被检测到

让我们从一个示例项目开始。再次打开终端:

mkdir google-coral && cd google-coralgit clone https://github.com/google-coral/examples-camera --depth 1

下一步,我们加载预训练模型。您也可以选择使用自己训练的模型。然而,在我们这个简单的例子中,我们只加载了MobileNet SSD300模型:,它已经可以识别许多物体。

MobileNet SSD300模型:https://resources.wolframcloud.com/NeuralNetRepository/resources/SSD-MobileNet-V2-Trained-on-MS-COCO-Data

cd examples-camerash download_models.sh

这个过程需要几分钟。之后,我们切换到OpenCV文件夹并安装依赖项(如果你想使用另一个示例,这里有这个选项)。

cd opencvbash install_requirements.sh

现在我们可以启动示例应用程序了。为此,你需要一个桌面环境。如果你不是直接在Raspberry Pi上工作,我建议使用远程桌面连接。

如何建立 Raspberry Pi 远程桌面连接:https://tutorials-raspberrypi.com/raspberry-pi-remote-desktop-connection/

python3 detect.py

这会打开一个新的窗口,显示视频流。在视频流中,检测到的物体会用矩形标记出来。你还可以看到计算出的物体被检测到的概率(以百分比表示)(即根据算法,这个物体被识别为特定物体的可能性有多大)。

bc5d8e4e-0918-11f0-9434-92fbcf53809c.jpg

现在让我们仔细查看代码,以了解发生了什么:

# Copyright 2019 Google LLC## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## https://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License. """A demo that runs object detection on camera frames using OpenCV. TEST_DATA=../all_models Run face detection model:python3 detect.py \ --model ${TEST_DATA}/mobilenet_ssd_v2_face_quant_postprocess_edgetpu.tflite Run coco model:python3 detect.py \ --model ${TEST_DATA}/mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite \ --labels ${TEST_DATA}/coco_labels.txt """import argparseimport cv2import os from pycoral.adapters.common import input_sizefrom pycoral.adapters.detect import get_objectsfrom pycoral.utils.dataset import read_label_filefrom pycoral.utils.edgetpu import make_interpreterfrom pycoral.utils.edgetpu import run_inference def main(): default_model_dir = '../all_models' default_model = 'mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite' default_labels = 'coco_labels.txt' parser = argparse.ArgumentParser() parser.add_argument('--model', help='.tflite model path', default=os.path.join(default_model_dir,default_model)) parser.add_argument('--labels', help='label file path', default=os.path.join(default_model_dir, default_labels)) parser.add_argument('--top_k', type=int, default=3, help='number of categories with highest score to display') parser.add_argument('--camera_idx', type=int, help='Index of which video source to use. ', default = 0) parser.add_argument('--threshold', type=float, default=0.1, help='classifier score threshold') args = parser.parse_args() print('Loading {} with {} labels.'.format(args.model, args.labels)) interpreter = make_interpreter(args.model) interpreter.allocate_tensors() labels = read_label_file(args.labels) inference_size = input_size(interpreter) cap = cv2.VideoCapture(args.camera_idx) while cap.isOpened(): ret, frame = cap.read() if not ret: break cv2_im = frame cv2_im_rgb = cv2.cvtColor(cv2_im, cv2.COLOR_BGR2RGB) cv2_im_rgb = cv2.resize(cv2_im_rgb, inference_size) run_inference(interpreter, cv2_im_rgb.tobytes()) objs = get_objects(interpreter, args.threshold)[:args.top_k] cv2_im = append_objs_to_img(cv2_im, inference_size, objs, labels) cv2.imshow('frame', cv2_im) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() def append_objs_to_img(cv2_im, inference_size, objs, labels): height, width, channels = cv2_im.shape scale_x, scale_y = width / inference_size[0], height / inference_size[1] for obj in objs: bbox = obj.bbox.scale(scale_x, scale_y) x0, y0 = int(bbox.xmin), int(bbox.ymin) x1, y1 = int(bbox.xmax), int(bbox.ymax) percent = int(100 * obj.score) label = '{}% {}'.format(percent, labels.get(obj.id, obj.id)) cv2_im = cv2.rectangle(cv2_im, (x0, y0), (x1, y1), (0, 255, 0), 2) cv2_im = cv2.putText(cv2_im, label, (x0, y0+30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 2) return cv2_im if __name__ == '__main__': main()

  • 首先,包含了所需的PyCoral库。
  • 在主函数中,定义了可以从命令行传递的参数(如指定模型等)。
  • 加载模型及其标签,并根据模型确定尺寸(此处为300×300)。
  • 然后打开视频流(cap = cv2.VideoCapture(args.camera_idx))。

接下来是核心部分:

objs = get_objects(interpreter, args.threshold)[:args.top_k]

  • 此过程中会确定“分类分数”最高的3个元素(且分数需高于阈值)。
  • 随后,在图像上标记每个检测到的物体。

响应特定对象

如果我们想在检测到某个特定对象(例如一个人)时立即触发一个动作,现在应该怎么做呢?

为此,我们首先来看一下get_objects函数的返回值:

[Object(id=16, score=0.5, bbox=BBox(xmin=-2, ymin=102, xmax=158, ymax=296)), Object(id=0, score=0.16015625, bbox=BBox(xmin=6, ymin=114, xmax=270, ymax=300)), Object(id=61, score=0.12109375, bbox=BBox(xmin=245, ymin=166, xmax=301, ymax=302))]

我们看到,每个检测到的对象都包含一个ID、一个分数以及一个带有坐标的边界框。为了确定检测到了哪个对象,我们需要查看标签:

{0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', 4: 'airplane', 5: 'bus', 6: 'train', 7: 'truck', 8: 'boat', 9: 'traffic light', 10: 'fire hydrant', 12: 'stop sign', 13: 'parking meter', 14: 'bench', 15: 'bird', 16: 'cat', 17: 'dog', 18: 'horse', 19: 'sheep', 20: 'cow', 21: 'elephant', 22: 'bear', 23: 'zebra',24: 'giraffe', 26: 'backpack', 27: 'umbrella', 30: 'handbag', 31: 'tie', 32: 'suitcase', 33: 'frisbee', 34: 'skis', 35: 'snowboard', 36: 'sports ball', 37: 'kite', 38: 'baseball bat', 39: 'baseball glove', 40: 'skateboard', 41: 'surfboard', 42: 'tennis racket', 43: 'bottle', 45: 'wine glass', 46: 'cup', 47: 'fork', 48: 'knife', 49: 'spoon', 50: 'bowl', 51: 'banana', 52: 'apple', 53: 'sandwich', 54: 'orange', 55: 'broccoli', 56: 'carrot', 57: 'hot dog', 58: 'pizza', 59: 'donut', 60: 'cake', 61: 'chair', 62: 'couch', 63: 'potted plant',64: 'bed', 66: 'dining table', 69: 'toilet', 71: 'tv', 72: 'laptop', 73: 'mouse', 74: 'remote', 75: 'keyboard', 76: 'cell phone', 77: 'microwave', 78: 'oven', 79: 'toaster', 80: 'sink', 81: 'refrigerator', 83: 'book', 84: 'clock', 85: 'vase', 86: 'scissors', 87: 'teddy bear', 88: 'hair drier', 89: 'toothbrush'}

在我的案例中,识别到的对象有猫(ID=16)、人(ID=0)和椅子(ID=61)。

如果你想知道这些标签是从哪里来的:它们是在模型中训练的,因此被包含在内。如果你创建自己的模型,也可以只包含对你而言重要的一个或几个对象。例如,识别你自己的脸也是可能的。在上面的例子中,我们想在检测到某个特定对象(例如ID=5的公交车)时立即触发一个动作。为此,我们首先查找该对象的ID。接下来,我们需要检查是否找到了具有该ID的对象。我们还可以为分数添加一个阈值(例如0.8)。伪代码看起来像这样:

found_scores = [o.score for o in objs if o.id == 5]if len(found_scores) > 0 and max(found_scores) >= 0.8:# do something

正如你所见,对其做出反应非常简单。之后,我们可以保存照片。

结论

对于那些觉得Raspberry Pi的计算能力不够的人来说,Google的Edge TPU提供了一个很好的机会。与高端显卡相比,USB加速器也非常便宜。高端显卡的平均价格超过一千美元。

以300x300px的分辨率运行对象检测非常流畅。也可以使用更高的分辨率,但你必须注意设备的温度。我建议为连续运行增加一个额外的风扇。

此外,Google还提供了其他包含学习内容的存储库。对于Coral的其他用例,这个存储库仍然很有趣,并且除了其他内容外,还配备了图像识别的示例。

https://github.com/google-coral/pycoral顺便说一下,我们也可以使用TensorFlow创建自己的对象识别模型。为此,我们首先需要标注图像,然后训练一个模型。如果你感兴趣,未来将提供相关的教程。

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

    关注

    89

    文章

    38090

    浏览量

    296518
  • TPU
    TPU
    +关注

    关注

    0

    文章

    164

    浏览量

    21533
  • 树莓派
    +关注

    关注

    122

    文章

    2069

    浏览量

    109689
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    从CPU、GPU再到TPUGoogleAI芯片是如何一步步进化过来的?

    趋势了,我认为这也是Google生产Tensor processing unit的一个重要出发点。至此,TPU便登上历史舞台。随着机器学习算法越来越多的应用在各个领域并表现出优越的性能,例如街景、邮件
    发表于 03-15 11:40

    阿里云MaxCompute,用计算力让数据发声

    产品,用计算力让数据发声。计算的价值绝不止计算本身,而是让本不会说话的数据发声。从***到圆周率,从万有引力定律到二进制,从固化的物体到虚拟的思维都由数据注入。阿里云大数据
    发表于 01-22 17:45

    好奇~!谷歌的 Edge TPU 专用 ASIC 旨在将机器学习推理能力引入边缘设备

    或者嵌入式 CPU 的硬件方案相比,Edge TPU 的模型推理性能应该明显更强。大约一个月之前,我们在 Geekbench 网站上发现了一段来自“Google Coral”这一神秘设
    发表于 03-05 21:20

    CORAL-EDGE-TPU:珊瑚开发板TPU

    ,可在低功耗转换机器学习(ML)边缘计算功能中实现高性能,本地推理。Coral Dev Board TPU的小巧外形可实现快速原型设计,涵盖物联网(IOT)和需要快速设备ML推理的通用
    发表于 05-29 10:43

    树莓是什么

    树莓树莓是什么树莓(英文名为Raspberry Pi,简写
    发表于 11-12 06:09

    BHR-AI-HX-M1产品概述

    基于ZYNQ7020的低成本低功耗嵌入式AI计算模组1 产品概述BHR-AI-HX-M1,内嵌EMBEDEEP EEP-TPU AI处理核,
    发表于 12-14 08:58

    谷歌人工智能之路:以强大创造AI注入发展活力

    长期以来,谷歌一直在其核心产品中大量使用AI技术,不断研发新的AI产品。以强大创造AI
    发表于 11-12 10:38 1064次阅读

    2018中国AI计算力报告发布

    今天上午,浪潮公司联合IDC在2018中国人工智能计算大会上发布了《2018中国AI计算力发展报告》(以下简称《报告》)。报告通过对AI计算力
    的头像 发表于 09-15 08:37 4697次阅读

    炸裂!小小树莓要搭上 Google 的人工智能了

    树莓以及 Google 获取进一步信息,对方都表示暂时未能透露更多信息,但有望可在 2017 年见到新进展。Google 向来都致力于
    发表于 04-02 14:48 464次阅读

    Python的PyCoral迎来多项更新,边缘AI注入更多精彩

    针对 Edge TPU 优化 https://coral.ai/models Coral(https://coral.ai)是一个可用于构建本地
    的头像 发表于 11-26 09:47 2858次阅读

    什么叫AI计算AI计算力是什么?

    什么叫AI计算AI计算力是什么? 随着科技的不断发展,人工智能(AI)已经成为当今最热门的技术之一。而在人工智能中,
    的头像 发表于 08-24 15:49 8903次阅读

    树莓携手Hailo其新品注入人工智能功能

    套件用于支持树莓5的AI功能。此次合作将以先进的人工智能功能助力专业以及创作爱好者在智能家居、安全、机器人等领域中提升解决方案效率。 Hailo的首席执行官兼联合创始人Orr Danon表示:“我们非常荣幸能为
    的头像 发表于 06-06 10:18 809次阅读

    树莓新推AI HAT+:26 TOPS高性能版本震撼登场

     在成功推出树莓AI套件与AI摄像头后,树莓再次扩大其A
    的头像 发表于 11-07 13:44 2019次阅读

    性能飙升!使用Python并行计算榨干树莓

    Deepseek的引爆,让AI大模型的本地化部署并应用于实际项目中变为可能。开发者们意识到——除了提升硬件性能,边缘设备的算优化也是未来趋势!当全球创客都在用树莓
    的头像 发表于 03-26 17:08 691次阅读
    让<b class='flag-5'>性能</b>飙升!使用Python并行<b class='flag-5'>计算</b>榨干<b class='flag-5'>树莓</b><b class='flag-5'>派</b>算<b class='flag-5'>力</b>!

    树莓5 与 树莓4:深度对比与独特优势!

    随着技术的不断发展,推动创新与创造的工具和设备也在不断升级。其中,树莓派系列凭借其多功能性和强大性能,在从简单的DIY项目到复杂的计算任务
    的头像 发表于 05-21 13:15 2064次阅读
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>5 与 <b class='flag-5'>树莓</b><b class='flag-5'>派</b>4:深度对比与独特优势!