利用 aidlux 在手机上运行水果分类模型的实现 Aidlux练习第四课笔记

   大家好,我今天要和大家分享一下我是如何利用 aidlux 软件将我训练好的水果分类模型迁移到手机上运行的。下面我将详细描述我所使用的代码和步骤。

  首先,我导入了所需的工具包,这些工具包将帮助我实现整个水果分类模型的迁移和运行。具体导入的工具包包括 OpenCV、cvs、NumPy 以及 PIL(Python Imaging Library),而且我还导入了 aidlite_gpu 包,它是我用来在手机上运行模型的重要工具。

# 导入工具包
import cv2
from cvs import *
import numpy as np
from PIL import Image, ImageFont, ImageDraw
import aidlite_gpu

 接下来,我指定了中文字体并选择了字体大小,以便在后续的图片上写上分类结果。然后,我载入了一个包含类别名称与ID映射表的文件,该映射表将帮助我将模型的预测结果转化为可读的类别名。

# 导入中文字体,指定字体大小
font = ImageFont.truetype ('SimHei.ttf', 32)

# 载入类别名称与ID映射表
idx_to_labels = np.load ('shuiguotuxiangfenlei_suoyin.npy', allow_pickle=True).item ()

  紧接着,我指定了模型的路径,并设置了一些参数,比如类别个数(NUM_CLASS)等。我使用了 aidlite_gpu 包的功能来加载我的水果分类模型,并指定了模型的输入维度、输出维度、线程数以及是否开启 NNAPI 加速。这是确保模型在手机上能够高效运行的重要一步。

# 载入模型
model_path = 'shuiguotuxiangfenlei.tflite'
NUM_CLASS = 30  # 指定类别个数
aidlite = aidlite_gpu.aidlite ()

# 模型路径 输入维度 输出维度 线程数 
# https://docs.aidlux.com/#/intro/ai/ai-aidlite?id=_4fast_annmodel
aidlite.FAST_ANNModel (model_path, [256 * 256 * 3 * 4], [NUM_CLASS * 4], 3, 0)

 然后,我初始化了摄像头,选择了要使用的摄像头(0 代表后置摄像头,1 代表前置摄像头)。我使用 cvs 包中的 VideoCapture 功能来捕获摄像头的画面。

# 初始化摄像头
Camera_ID = 0  # 摄像头ID 0-后置 1-前置
cap = cvs.VideoCapture (Camera_ID)

 在代码的主要循环中,我开始逐帧处理从摄像头捕获到的图像。首先,我使用 process_frame 函数对每一帧图像进行处理。在这个函数中,我首先进行了预处理操作,包括将图像尺寸缩放为模型所需的大小,然后对图像进行归一化操作,以便能够与模型的输入数据相匹配。

接着,我使用 aidlite_gpu 包的功能将预处理后的图像输入到模型中,然后进行推理预测。我提取了预测结果,找出了具有最高置信度的类别 ID,并通过之前载入的类别映射表将其转换为类别名称。

为了让结果更加直观,我将预测的中文类别名称写在了图像上。我首先将图像从 BGR 格式转换为 RGB 格式,然后将其转换为 PIL 图像对象。我使用 PIL 中的 ImageDraw 功能在图像上绘制了预测类别的文字,并设定了位置、字体、颜色等属性。最后,我将处理后的图像转换回 BGR 格式,以便后续显示和输出。

在处理完一帧图像后,我还计算了处理该帧所用的时间,并通过时间差来计算每秒处理图像的帧数(FPS)。我将 FPS 信息以字符串的形式写在了图像上,让我能够了解整个处理过程的性能情况。

def process_frame(img_bgr):
    # 记录该帧开始处理的时间
    start_time = time.time ()

    ## 预处理
    img_tensor = cv2.resize (img_bgr, (256, 256))  # 尺寸缩放
    mean = (0.485, 0.456, 0.406)  # 三通道的均值
    std = (0.229, 0.224, 0.225)  # 三通道的标准差
    img_tensor = ((img_tensor / 255) - mean) / std
    img_tensor = img_tensor.astype ('float32')

    ## 推理预测
    aidlite.setInput_Float32 (img_tensor)  # 装填数据
    aidlite.invoke ()  # 推理预测
    result = aidlite.getOutput_Float32 ()  # 获得推理预测结果

    ## 解析预测结果
    pred_id = np.argmax (result)  # 置信度最高类别 ID
    pred_class = idx_to_labels[pred_id]  # 置信度最高类别名称

    ## 将预测中文类别写在图片上
    img_rgb = cv2.cvtColor (img_bgr, cv2.COLOR_BGR2RGB)  # BGR转RGB
    img_pil = Image.fromarray (img_rgb)  # array 转 PIL
    draw = ImageDraw.Draw (img_pil)
    draw.text ((50, 150), pred_class, font=font, fill=(0, 0, 255, 1))  # 文字坐标,中文字符串,字体,rgba颜色
    img_rgb = np.array (img_pil)  # PIL 转 array
    img_bgr = cv2.cvtColor (img_rgb, cv2.COLOR_RGB2BGR)  # RGB 转 BGR

    # 记录该帧处理完毕的时间
    end_time = time.time ()
    # 计算每秒处理图像帧数FPS
    FPS = 1 / (end_time - start_time)
    # 在画面上写字:图片,字符串,左上角坐标,字体,字体大小,颜色,字体粗细
    FPS_string = 'FPS {:.2f}'.format (FPS)  # 写在画面上的字符串
    img_output = cv2.putText (img_bgr, FPS_string, (50, 120), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    return img_output

最后,在主循环中,我通过不断从摄像头读取图像,并对每帧图像都进行相同的处理流程。处理后的图像将通过 cvs 包中的 imshow 函数显示出来,我可以通过手机摄像头实时看到水果分类模型的预测结果。

# 逐帧实时处理手机摄像头拍摄的画面-代码模板
while True:
    img_bgr = cap.read ()

    if img_bgr is None:
        continue

    img_bgr = process_frame (img_bgr)

    cvs.imshow (img_bgr)

相关演示视频如下:(可以看出,目前模型的识别效果还是太差,但是我们已经完成了调佣实践摄像头进行识别的这一大步,后续会继续调整参数改进模型预测效果)

  

aidlux部署手机第四课

总的来说,我利用了 aidlux 软件、OpenCV、NumPy、PIL 等工具包以及 aidlite_gpu 包中的功能,成功地将我训练好的水果分类模型迁移到了手机上并实现了实时分类预测。这个过程中,我经历了导入工具包、载入模型、图像预处理、推理预测、结果展示等多个步骤,最终让手机能够实时地对摄像头捕获到的画面进行水果分类。这个经历不仅让我更加了解了深度学习模型在移动设备上的应用,还增强了我对计算机视觉领域的兴趣和实践能力。

 最后,以上所有笔记和资源都是在观看了同济子豪兄的相关视频和在相关的开源平台Github上获取的,模型也是按照相关的教程一步一步训练出来的,所以我在文章的最后强调一下资源的来源,但是从视频看,即使我在云GPU平台上通过修改相关参数训练了多次,但是仍然可以看出我训练的模型的分类效果仍然很差,可能是因为数据集数量太少,或者数据集中的照片清晰度太低,质量太差的原因,也可能是背景泰安或者光线太亮的原因,也可能是因为训练的时候,相关参数没有调整好导致模型过于拟合的原因,但是在接下来的时间里我也会慢慢修改我的训练参数进行多次训练,并借助Aidlux这个平台更好的将我的模型部署到手机上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值