当前位置: 首页 > news >正文

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

(原创作者@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 运行人像分割模型,实时识别画面中的人物区域,并将人物与背景以视觉上的蓝色轮廓效果进行区分。下面详细介绍其功能和工作流程:

核心功能
  1. 视频流捕获

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

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

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

    1. 计算并显示帧率(FPS)和单帧推理耗时(毫秒)。
    2. 通过 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 试衣、短视频特效等

应用场景

这个代码示例可以应用于以下场景:

  1. 视频会议:实时背景虚化或替换,增强会议隐私和专业性
  2. 直播与短视频:添加实时人像特效,如轮廓高亮、动态贴纸等
  3. 健身与运动应用:实时跟踪人体动作,提供运动指导
  4. 安防监控:检测和跟踪特定区域内的人员活动

通过调整transfer函数,可以实现更多样化的视觉效果,如背景模糊、背景替换、动态滤镜等。

DEMO代码

import cv2
import time 
from time import sleep
import remi
import os
import sys
import numpy as np
import aidlitedef transfer(image, mask):"""将分割掩码与原始图像融合,创建半透明效果参数:image: 原始图像,BGR格式mask: 分割掩码,单通道二值图像(0表示背景,255表示人物)返回:融合后的图像"""# 调整掩码大小以匹配原始图像mask = cv2.resize(mask, (image.shape[1], image.shape[0]))# 创建三通道掩码图像(只在蓝色通道填充值)mask_n = np.zeros_like(image)mask_n[:, :, 0] = mask  # 将掩码值赋给蓝色通道,产生蓝色轮廓效果# 图像融合参数(alpha透明度)alpha = 0.7beta = (1.0 - alpha)# 加权融合原始图像和掩码图像dst = cv2.addWeighted(image, alpha, mask_n, beta, 0.0)return dst# 模型输入输出参数配置
w = 513  # 模型输入宽度
h = 513  # 模型输入高度
inShape = [[1, 3, 513, 513]]  # 输入张量形状: [批次大小, 通道数, 高度, 宽度]
outShape = [[1, w, h]]  # 输出张量形状: [批次大小, 高度, 宽度]
model_path = "models/model.nb"  # 模型文件路径(.nb格式为Aidlite优化后的模型格式)# ------------------------ Aidlite推理引擎初始化 ------------------------
# 创建Aidlite模型实例
model = aidlite.Model.create_instance(model_path)
if model is None:print("Create model failed !")# 设置模型输入输出数据类型和形状
model.set_model_properties(inShape, aidlite.DataType.TYPE_FLOAT32, outShape, aidlite.DataType.TYPE_INT64)# 创建配置实例,设置模型框架类型和加速类型
config = aidlite.Config.create_instance()
config.framework_type = aidlite.FrameworkType.TYPE_PADDLE  # 模型基于PaddlePaddle框架训练
config.accelerate_type = aidlite.AccelerateType.TYPE_CPU  # 使用CPU进行推理(也支持GPU、NPU等)# 构建并初始化解释器
fast_interpreter = aidlite.InterpreterBuilder.build_interpretper_from_model_and_config(model, config)
if fast_interpreter is None:print("build_interpretper_from_model_and_config failed !")result = fast_interpreter.init()
if result != 0:print("interpreter init failed !")result = fast_interpreter.load_model()
if result != 0:print("interpreter load model failed !")print("model load success!")# ------------------------ 视频流处理与推理 ------------------------
# 尝试打开前置摄像头(设备ID为1)
camId = 1
opened = False
while not opened:# 使用mipi接口打开摄像头(适用于某些嵌入式设备)cap = cv2.VideoCapture(camId, device='mipi')if cap.isOpened():opened = Trueelse:print("open camera failed")cap.release()time.sleep(0.5)# 主循环: 捕获视频帧并进行实时处理
while True:ret, frame = cap.read()if not ret:continueif frame is None:continue# 如果使用前置摄像头,水平翻转图像以获得自然的镜像效果frame = cv2.flip(frame, 1)# 图像预处理: 调整大小并转换为模型输入格式img = cv2.resize(frame, (w, h))input = img.astype(np.float32)  # 转换为浮点类型input = np.transpose(input, (2, 0, 1))  # 调整通道顺序: [H,W,C] -> [C,H,W]print('input', input.shape)# 设置输入数据到推理引擎print('paddle: start set')result = fast_interpreter.set_input_tensor(0, input)if result != 0:print("interpreter set_input_tensor() failed")# 记录推理开始时间start_time = time.time()print('bnn: start invoke')# 执行模型推理result = fast_interpreter.invoke()if result != 0:print("interpreter invoke() failed")print('invoke end')# 计算推理耗时并转换为毫秒t = (time.time() - start_time)print('elapsed_ms invoke:', t * 1000)# 计算帧率并显示在画面上lbs = 'Fps: '+ str(int(1 / t)) + " ~~ Time:" + str(t * 1000) + "ms"# 获取模型输出结果print('paddle: start get')pred_0 = fast_interpreter.get_output_tensor(0, output_type=aidlite.DataType.TYPE_INT64)if pred_0 is None:print("sample : interpreter->get_output_tensor(0) failed !")# 后处理: 重塑输出张量并创建二值人物掩码pred0 = (pred_0).reshape(w, h)# 将模型预测结果中类别为1的像素设为255(人物),其余设为0(背景)person = np.where(pred0 == 1, 255, 0).astype(np.uint8)# 将掩码与原始图像融合dst = transfer(frame, person)# 显示结果cv2.imshow("", dst)# 按 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

模型位置

/opt/aidlux/app/aid-examples//portrait_seg

模型效果

c3dea20fd08b4b10891f4e5bf6537dcf

http://www.sczhlp.com/news/46288/

相关文章:

  • ENVI 6.2 新特性介绍 - ENVI
  • Kubernetes 运维必备之常用命令总结
  • 多种网站模板行业网站网址
  • 在网站做推广要钱吗百度推广入口
  • 个人主页网站制作百度人工客服24小时
  • 做网站一年多少钱整合营销传播策略
  • 做烘焙的网站app开发公司排名
  • 在K8S中,有哪些缺点或当前的不足之处?
  • 植物大战僵尸东方不死乡TV版APK下载(含安装方法)
  • 南昌网站开发培训班hao123网址导航
  • 建设服装网站目的保定百度seo排名
  • 云南省文山建设厅网站百度有刷排名软件
  • 贵州建设职业学院官方网站产品推广
  • 外贸网站建设 福田域名注册查询
  • 开源网站系统重庆seo整站优化效果
  • 为离职员工做的网站全球网站排行榜
  • 公司网站建设中恒建设集团有限公司怎么进行推广
  • 域名到期不续费会怎么样seo是什么服务
  • 服装搭配网站源码电商中seo是什么意思
  • esp32cam micropython固件烧录
  • 网站维护工程师月薪多少seo网站排名优化快速排
  • 武昌做网站公司济南seo网站优化
  • 网站导航条怎么做效果上海seo搜索优化
  • 电商网站建设行情百度百科搜索入口
  • 织梦教育网站模板宁波网站优化公司电话
  • 网站建设自学网优化大师怎么样
  • 杨浦做网站关于软文营销的案例
  • 2024新闻热点事件seo还有用吗
  • 做设计网站的工作内容东莞推广平台有哪些
  • 三维服装设计逼真模拟演示软件 CLO Standalone OnlineAuth 2025.0.128 Win