MindSpore应用系列:树莓派上运行YOLOv5进行实时目标检测(四)

接上回没完成的推理,

首先是看下mindyolo是啥吧。

MindYOLO是MindSpore Lab开发的AI套件,实现了最先进的YOLO系列算法,查看支持的模型算法。

MindYOLO使用Python语言编写,基于 MindSpore AI框架开发。

master 分支配套 MindSpore 2.0。

最新更新2023/06/15,新鲜出炉。

  • 支持 YOLOv3/v4/v5/v7/v8/X 等6个模型,发布了23个模型weights,详情请参考 MODEL ZOO。
  • 配套 MindSpore 2.0。
  • 支持 MindSpore lite 2.0 推理。
  • 新的教程文档上线!

当前版本基于GRAPH的静态Shape。后续将添加PYNATIVE的动态Shape支持,敬请期待。

新的代码采用yaml配置网络,配置文件如下

__BASE__: [
  '../coco.yaml',
  './hyp.scratch-low.yaml',
]

per_batch_size: 32  # 32 * 8 = 256
img_size: 640
sync_bn: False

# backbone/head calculate using fp16, loss fp32
ms_amp_level: O3
keep_loss_fp32: True


network:
  model_name: yolov5

  depth_multiple: 0.33  # model depth multiple
  width_multiple: 0.50  # layer channel multiple
  stride: [8, 16, 32]

  anchors:
    - [ 10,13, 16,30, 33,23 ]  # P3/8
    - [ 30,61, 62,45, 59,119 ]  # P4/16
    - [ 116,90, 156,198, 373,326 ]  # P5/32

  # YOLOv5 v6.0 backbone
  backbone:
    # [from, number, module, args]
    [ [ -1, 1, ConvNormAct, [ 64, 6, 2, 2 ] ],  # 0-P1/2
      [ -1, 1, ConvNormAct, [ 128, 3, 2 ] ],  # 1-P2/4
      [ -1, 3, C3, [ 128 ] ],
      [ -1, 1, ConvNormAct, [ 256, 3, 2 ] ],  # 3-P3/8
      [ -1, 6, C3, [ 256 ] ],
      [ -1, 1, ConvNormAct, [ 512, 3, 2 ] ],  # 5-P4/16
      [ -1, 9, C3, [ 512 ] ],
      [ -1, 1, ConvNormAct, [ 1024, 3, 2 ] ],  # 7-P5/32
      [ -1, 3, C3, [ 1024 ] ],
      [ -1, 1, SPPF, [ 1024 ] ],  # 9
    ]

  # YOLOv5 v6.0 head
  head:
    [ [ -1, 1, ConvNormAct, [ 512, 1, 1 ] ],
      [ -1, 1, Upsample, [None, 2, 'nearest']],
      [ [ -1, 6 ], 1, Concat, [ 1 ] ],  # cat backbone P4
      [ -1, 3, C3, [ 512, False ] ],  # 13

      [ -1, 1, ConvNormAct, [ 256, 1, 1 ] ],
      [-1, 1, Upsample, [None, 2, 'nearest']],
      [ [ -1, 4 ], 1, Concat, [ 1 ] ],  # cat backbone P3
      [ -1, 3, C3, [ 256, False ] ],  # 17 (P3/8-small)

      [ -1, 1, ConvNormAct, [ 256, 3, 2 ] ],
      [ [ -1, 14 ], 1, Concat, [ 1 ] ],  # cat head P4
      [ -1, 3, C3, [ 512, False ] ],  # 20 (P4/16-medium)

      [ -1, 1, ConvNormAct, [ 512, 3, 2 ] ],
      [ [ -1, 10 ], 1, Concat, [ 1 ] ],  # cat head P5
      [ -1, 3, C3, [ 1024, False ] ],  # 23 (P5/32-large)

      [ [ 17, 20, 23 ], 1, YOLOv5Head, [nc, anchors, stride] ],  # Detect(P3, P4, P5)
    ]

复制

正因为如此,将多个版本的yolo统一了。

此外提供了现成的模型文件和权重文件(mindir/ckpt),可以直接用于推理。

这里直接下载yolov5s的权重文件

https://download.mindspore.cn/toolkits/mindyolo/yolov5/yolov5s_300e_mAP376-860bcf3b.ckpt

使用demo目录下的predict.py

python predict.py --config ./configs/yolov5/yolov5s.yaml --weight=./yolov5s_300e_mAP376-860bcf3b.ckpt --image_path ./000000369812.jpg --device_target=CPU

测试图片是从验证集里面随便取的一张图片。

运行前需要安装依赖。pip install -r requirements.txt

这个错是pillow版本太高了。9.5就可以了。

cke_435164.png

pip reinstall pillow==9.5

这又是一个第三方库的版本问题numpy 小于 1.24

cke_522668.png

pip install numpy==1.23.5

终于推理成功。

原图:

推理图:

Speed: 72873.8/38.9/72912.8 ms inference/NMS/total per 640x640 image at batch-size 1

72s 一张图,看来直接推理是很慢的。

看来需要试试lite推理。

首先有个问题就是MindSpore Lite适配的python环境为3.7。。。

看来还是装个conda吧

Raspbian 下载 Miniconda 的方法和下载 Anacodna 差不多,可以使用 wget 命令:

wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-aarch64.sh

安装 Miniconda 基本也属于一键安装的模式,需要注意的是要设置一下安装的路径,具体操作如下:

sudo bash Miniconda3-latest-Linux-aarch64.sh

接下来根据提示,按 Enter 跳过安装协议

选择旧版本即可。

wget https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-Linux-aarch64.sh

添加 .bashrc 配置

vim ~/.bashrc

export PATH=“/home/ai/miniconda3/bin:”$PATH

source ~/.bashrc

因为刚才使用 sudo 安装,Miniconda3 的所有者是 root,需要先变更一下文件夹属性,具体操作如下:

sudo chown ai:ai -R /home/ai/miniconda3

conda init --all

这样环境就是python3.7了,然后进入deploy目录,安装依赖。

然后就是ckpt权重转为mindir模型

python ./deploy/export.py --config ./configs/yolov5/yolov5s.yaml --weight yolov5s_300e_mAP376-860bcf3b.ckpt --per_batch_size 1 --file_format MINDIR --device_target CPU

python deploy/predict.py --model_type Lite --model_path ./yolov5s.mindir --conifg ./configs/yolov5/yolov5s.yaml --image_path ./000000369812.jpg --device_target CPU

这文档明明是写了config配置的。

先去掉试试。

看来是不行。predict.py里面用到了很多配置。

mindyolo/utils/config.py 给config赋值

为什么报文件不存在?文件明明是有的啊?

还有mindyolo/infer_engine/lite.py 里面为什么默认是Ascend?

感觉问题好多,我先研究下代码。

未完待续~