找回密码
 立即注册
首页 业界区 安全 高通手机跑AI系列之——人像与背景分割 ...

高通手机跑AI系列之——人像与背景分割

明思义 4 小时前
(原创作者@CSDN_伊利丹~怒风)
环境准备

手机

测试手机型号:Redmi K60 Pro
处理器:第二代骁龙8移动--8gen2
运行内存:8.0GB ,LPDDR5X-8400,67.0 GB/s
摄像头:前置16MP+后置50MP+8MP+2MP
AI算力:NPU 48Tops INT8 && GPU 1536ALU x 2 x 680MHz = 2.089 TFLOPS
提示:任意手机均可以,性能越好的手机运行速度越快
软件
APP:AidLux2.0
系统环境:Ubuntu 20.04.3 LTS
提示:AidLux登录后代码运行更流畅,在代码运行时保持AidLux APP在前台运行,避免代码运行过程中被系统回收进程,另外屏幕保持常亮,一般息屏后一段时间,手机系统会进入休眠状态,如需长驻后台需要给APP权限。
算法Demo

代码功能介绍

这段代码实现了一个基于深度学习的实时人像分割应用,它通过摄像头捕获视频流,利用轻量级推理引擎 Aidlite 运行人像分割模型,实时识别画面中的人物区域,并将人物与背景以视觉上的蓝色轮廓效果进行区分。下面详细介绍其功能和工作流程:
核心功能


  • 视频流捕获

    • 使用 OpenCV 的VideoCapture接口打开前置摄像头(设备 ID=1),持续读取视频帧。
    • 支持 MIPI 接口(适用于嵌入式设备),具有自动重试机制,确保摄像头成功开启。

  • 人像分割模型推理

    • 加载预训练的人像分割模型(.nb格式,由 Aidlite 优化)。
    • 模型输入为 513×513 像素的 RGB 图像,输出为每个像素的分类结果(0 = 背景,1 = 人物)。
    • 使用 Aidlite 推理引擎执行模型计算,支持 CPU 加速,可在移动设备上实时运行。

  • 实时图像处理

    • 对每一帧视频进行预处理:缩放、通道转换、数据类型转换。
    • 将模型输出的分割掩码转换为二值图像(人物区域为白色,背景为黑色)。
    • 通过图像融合技术(cv2.addWeighted),将蓝色半透明轮廓叠加到原始画面的人物区域上。

  • 性能监控与显示

    • 计算并显示帧率(FPS)和单帧推理耗时(毫秒)。
    • 通过 OpenCV 窗口实时展示处理后的视频效果。

技术组件详解

1. 推理引擎 - Aidlite
Aidlite 是一个轻量级的深度学习推理引擎,专为嵌入式设备和移动设备优化。它具有以下特点:

  • 多框架支持:可以运行来自 TensorFlow、PyTorch、PaddlePaddle 等不同框架训练的模型
  • 硬件加速:支持 CPU、GPU、NPU 等多种硬件后端,充分利用设备算力
  • 模型优化:通过量化、剪枝等技术减小模型体积,提高推理速度
  • 轻量级设计:内存占用小,适合资源受限的设备
在这段代码中,Aidlite 被配置为使用 PaddlePaddle 框架训练的模型,并通过 CPU 进行推理。
2. 计算机视觉库 - OpenCV (cv2)
OpenCV 是一个强大的计算机视觉库,在这段代码中主要用于:

  • 视频捕获与处理:通过cv2.VideoCapture获取摄像头视频流
  • 图像处理:调整图像大小 (cv2.resize)、翻转 (cv2.flip)
  • 图像融合:使用cv2.addWeighted实现半透明效果
  • 显示结果:通过cv2.imshow显示处理后的图像
3. AI 模型功能
代码中使用的 AI 模型是一个人像分割模型,它能够:

  • 输入:RGB 图像 (513×513 像素)
  • 输出:像素级别的分类结果 (每个像素被分类为 "人物" 或 "背景")
  • 工作原理:基于深度学习的语义分割技术,识别图像中的人物区域
  • 应用场景:视频会议背景虚化、AR 试衣、短视频特效等
应用场景
这个代码示例可以应用于以下场景:

  • 视频会议:实时背景虚化或替换,增强会议隐私和专业性
  • 直播与短视频:添加实时人像特效,如轮廓高亮、动态贴纸等
  • 健身与运动应用:实时跟踪人体动作,提供运动指导
  • 安防监控:检测和跟踪特定区域内的人员活动
通过调整transfer函数,可以实现更多样化的视觉效果,如背景模糊、背景替换、动态滤镜等。
DEMO代码
  1. import cv2
  2. import time
  3. from time import sleep
  4. import remi
  5. import os
  6. import sys
  7. import numpy as np
  8. import aidlite
  9. def transfer(image, mask):
  10.     """
  11.     将分割掩码与原始图像融合,创建半透明效果
  12.    
  13.     参数:
  14.         image: 原始图像,BGR格式
  15.         mask: 分割掩码,单通道二值图像(0表示背景,255表示人物)
  16.         
  17.     返回:
  18.         融合后的图像
  19.     """
  20.     # 调整掩码大小以匹配原始图像
  21.     mask = cv2.resize(mask, (image.shape[1], image.shape[0]))
  22.     # 创建三通道掩码图像(只在蓝色通道填充值)
  23.     mask_n = np.zeros_like(image)
  24.     mask_n[:, :, 0] = mask  # 将掩码值赋给蓝色通道,产生蓝色轮廓效果
  25.    
  26.     # 图像融合参数(alpha透明度)
  27.     alpha = 0.7
  28.     beta = (1.0 - alpha)
  29.     # 加权融合原始图像和掩码图像
  30.     dst = cv2.addWeighted(image, alpha, mask_n, beta, 0.0)
  31.     return dst
  32. # 模型输入输出参数配置
  33. w = 513  # 模型输入宽度
  34. h = 513  # 模型输入高度
  35. inShape = [[1, 3, 513, 513]]  # 输入张量形状: [批次大小, 通道数, 高度, 宽度]
  36. outShape = [[1, w, h]]  # 输出张量形状: [批次大小, 高度, 宽度]
  37. model_path = "models/model.nb"  # 模型文件路径(.nb格式为Aidlite优化后的模型格式)
  38. # ------------------------ Aidlite推理引擎初始化 ------------------------
  39. # 创建Aidlite模型实例
  40. model = aidlite.Model.create_instance(model_path)
  41. if model is None:
  42.     print("Create model failed !")
  43. # 设置模型输入输出数据类型和形状
  44. model.set_model_properties(inShape, aidlite.DataType.TYPE_FLOAT32, outShape, aidlite.DataType.TYPE_INT64)
  45. # 创建配置实例,设置模型框架类型和加速类型
  46. config = aidlite.Config.create_instance()
  47. config.framework_type = aidlite.FrameworkType.TYPE_PADDLE  # 模型基于PaddlePaddle框架训练
  48. config.accelerate_type = aidlite.AccelerateType.TYPE_CPU  # 使用CPU进行推理(也支持GPU、NPU等)
  49. # 构建并初始化解释器
  50. fast_interpreter = aidlite.InterpreterBuilder.build_interpretper_from_model_and_config(model, config)
  51. if fast_interpreter is None:
  52.     print("build_interpretper_from_model_and_config failed !")
  53. result = fast_interpreter.init()
  54. if result != 0:
  55.     print("interpreter init failed !")
  56. result = fast_interpreter.load_model()
  57. if result != 0:
  58.     print("interpreter load model failed !")
  59. print("model load success!")
  60. # ------------------------ 视频流处理与推理 ------------------------
  61. # 尝试打开前置摄像头(设备ID为1)
  62. camId = 1
  63. opened = False
  64. while not opened:
  65.     # 使用mipi接口打开摄像头(适用于某些嵌入式设备)
  66.     cap = cv2.VideoCapture(camId, device='mipi')
  67.     if cap.isOpened():
  68.         opened = True
  69.     else:
  70.         print("open camera failed")
  71.         cap.release()
  72.         time.sleep(0.5)
  73. # 主循环: 捕获视频帧并进行实时处理
  74. while True:
  75.     ret, frame = cap.read()
  76.     if not ret:
  77.         continue
  78.     if frame is None:
  79.         continue
  80.    
  81.     # 如果使用前置摄像头,水平翻转图像以获得自然的镜像效果
  82.     frame = cv2.flip(frame, 1)
  83.    
  84.     # 图像预处理: 调整大小并转换为模型输入格式
  85.     img = cv2.resize(frame, (w, h))
  86.     input = img.astype(np.float32)  # 转换为浮点类型
  87.     input = np.transpose(input, (2, 0, 1))  # 调整通道顺序: [H,W,C] -> [C,H,W]
  88.     print('input', input.shape)
  89.    
  90.     # 设置输入数据到推理引擎
  91.     print('paddle: start set')
  92.     result = fast_interpreter.set_input_tensor(0, input)
  93.     if result != 0:
  94.         print("interpreter set_input_tensor() failed")
  95.    
  96.     # 记录推理开始时间
  97.     start_time = time.time()
  98.     print('bnn: start invoke')
  99.    
  100.     # 执行模型推理
  101.     result = fast_interpreter.invoke()
  102.     if result != 0:
  103.         print("interpreter invoke() failed")
  104.     print('invoke end')
  105.     # 计算推理耗时并转换为毫秒
  106.     t = (time.time() - start_time)
  107.     print('elapsed_ms invoke:', t * 1000)
  108.     # 计算帧率并显示在画面上
  109.     lbs = 'Fps: '+ str(int(1 / t)) + " ~~ Time:" + str(t * 1000) + "ms"
  110.    
  111.     # 获取模型输出结果
  112.     print('paddle: start get')
  113.     pred_0 = fast_interpreter.get_output_tensor(0, output_type=aidlite.DataType.TYPE_INT64)
  114.     if pred_0 is None:
  115.         print("sample : interpreter->get_output_tensor(0) failed !")
  116.     # 后处理: 重塑输出张量并创建二值人物掩码
  117.     pred0 = (pred_0).reshape(w, h)
  118.     # 将模型预测结果中类别为1的像素设为255(人物),其余设为0(背景)
  119.     person = np.where(pred0 == 1, 255, 0).astype(np.uint8)
  120.     # 将掩码与原始图像融合
  121.     dst = transfer(frame, person)
  122.     # 显示结果
  123.     cv2.imshow("", dst)
  124.     # 按 'q' 键退出循环
  125.     if cv2.waitKey(1) & 0xFF == ord('q'):
  126.         break
  127. # 释放资源
  128. cap.release()
  129. cv2.destroyAllWindows()
复制代码
模型位置

/opt/aidlux/app/aid-examples//portrait_seg
模型效果

1.gif


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册