树莓派5使用 MobileNet v2 及时推理相机视频

打印 上一主题 下一主题

主题 1658|帖子 1658|积分 4974

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Pytorch 对于树莓派提供了较好的支持,可以使用 Pytorch 在树莓派上进行试试推理,本文将尝试在树莓派5上使用 CPU 及时推理 MobileNet v2 分类模型。github 项目: https://github.com/Taot-chen/raspberrypi_dl
0 准备



  • 树莓派 5 大概树莓派 4 Model B 2GB以上内存即可
  • 树莓派摄像头模块
  • 散热片和风扇(可选,但建议使用)
  • 5V 5A USB-C 电源(针对树莓派5)
  • SD 卡(至少 8GB)
  • SD 卡读卡器/写入器
PyTorch 仅为 Arm 64 位 (aarch64) 提供 pip 包,因此需要在树莓派上安装 64 位版本的 OS。树莓派系统安装过程很平常,这里不再赘述,有需要可以参看这篇博客;https://blog.csdn.net/qq_38342510/article/details/142289792。
1 安装 PyTorch 和 OpenCV

PyTorch 和需要的所有其他库都有 ARM 64 位/aarch64 变体,因此可以通过 pip 安装它们,而且像任何其他 Linux 系同一样工作:
  1. python3 -m pip install torch torchvision torchaudio
  2. python3 -m pip install opencv-python
  3. python3 -m pip install numpy --upgrade
复制代码
查抄 torch 是否统统安装正确:
  1. python3 -c "import torch; print(torch.__version__)"
  2. python3 -c "import cv2; print(cv2.__version__)"
复制代码
2 视频采集

对于视频采集,使用 OpenCV 来传输视频帧。 这里不使用 picamera 是由于 picamera 在 64 位 Raspberry Pi OS 上不可用,而且比 OpenCV 慢得多。OpenCV 直接访问 /dev/video0 装备来抓取帧。
这里使用的模型 (MobileNetV2) 吸取 224x224 的图像巨细,因此可以直接从 OpenCV 以 36fps 的速度请求该巨细。目标模型帧率为 30fps,但我们请求的帧率略高于此值,以便始终有足够的帧。
  1. import cv2
  2. from PIL import Image
  3. cap = cv2.VideoCapture(0)
  4. cap.set(cv2.CAP_PROP_FRAME_WIDTH, 224)
  5. cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 224)
  6. cap.set(cv2.CAP_PROP_FPS, 36)
复制代码
OpenCV 返回一个 BGR 格式的 numpy 数组,因此需要读取并进行一些调解才气将其转换为预期的 RGB 格式:
  1. ret, image = cap.read()
  2. # convert opencv output from BGR to RGB
  3. image = image[:, :, [2, 1, 0]]
复制代码
3 图像预处置惩罚

获取帧并将其转换为模型期望的格式:
  1. from torchvision import transforms
  2. preprocess = transforms.Compose([
  3.     # convert the frame to a CHW torch tensor for training
  4.     transforms.ToTensor(),
  5.     # normalize the colors to the range that mobilenet_v2/3 expect
  6.     transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
  7. ])
  8. input_tensor = preprocess(image)
  9. # The model can handle multiple images simultaneously so we need to add an
  10. # empty dimension for the batch.
  11. # [3, 224, 224] -> [1, 3, 224, 224]
  12. input_batch = input_tensor.unsqueeze(0)
复制代码
4 模型加载

aarch64 版本的 pytorch 需要使用 qnnpack 引擎:
  1. import torch
  2. torch.backends.quantized.engine = 'qnnpack'
复制代码
为了获得更好的推理性能,使用量化和融合的模型。量化意味着使用 int8 进行盘算,比标准的 float32 数学运算性能高得多;融合意味着连续的操纵已尽可能融合在一起,例如,像激活函数 (ReLU) 如许的东西可以在推理过程中归并到前一层 (Conv2d) 中。使用 torchvision 开箱即用的预量化和融合版本的 MobileNetV2:
  1. from torchvision import models
  2. net = models.quantization.mobilenet_v2(pretrained=True, quantize=True)
复制代码
通过 jit 模型,以淘汰 Python 开销并融合任何操纵,从而进步推理性能:
  1. net = torch.jit.script(net)
复制代码
如果禁用了用户界面和默认启用的所有其他背景服务,可以获得更高的性能和更稳固的推理帧率。
完备推理代码:
  1. import timeimport torchimport numpy as npfrom torchvision import models, transformsimport cv2from PIL import Imagetorch.backends.quantized.engine = 'qnnpack'cap = cv2.VideoCapture(0, cv2.CAP_V4L2)cap.set(cv2.CAP_PROP_FRAME_WIDTH, 224)cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 224)cap.set(cv2.CAP_PROP_FPS, 36)preprocess = transforms.Compose([    transforms.ToTensor(),    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),])net = models.quantization.mobilenet_v2(pretrained=True, quantize=True)net = torch.jit.script(net)
  2. started = time.time()last_logged = time.time()frame_count = 0with torch.no_grad():    while True:        # read frame        ret, image = cap.read()        if not ret:            raise RuntimeError("failed to read frame")        # convert opencv output from BGR to RGB        image = image[:, :, [2, 1, 0]]        permuted = image        # preprocess        input_tensor = preprocess(image)        # create a mini-batch as expected by the model        input_batch = input_tensor.unsqueeze(0)        # run model        output = net(input_batch)        # do something with output ...        # log model performance        frame_count += 1        now = time.time()        if now - last_logged > 1:            print(f"{frame_count / (now-last_logged)} fps")            last_logged = now            frame_count = 0
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表