“实时头发分割”案例源码详解

1. 构建APP框架和添加主要控件
2. 头发分割的方法

打开实时头发分割案例

1.在VScode中进入代码编辑状态。

2.代码存在路径在/examples_gpu/hair/testhair.py。

导入相关库

1. cv2模块是OpenCV 2.0的简写,在计算机视觉项目的开发中,OpenCV作为较大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务。
2. remi是一个用于python应用程序的gui库,它将应用程序的接口转换成html并在web浏览器中呈现。这消除了特定于平台的依赖关系,使用户可以轻松地在python中开发跨平台应用程序
3. sys模块包括了一组非常实用的服务,内含很多函数方法和变量,用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互。
4. NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。在机器学习算法中大部分都是调用Numpy库来完成基础数值计算的。
5. cvs图形控件模块
6. tflite_gpu,GPU加速代码由AID提供,TensorFlow Lite 支持多种硬件加速器。
7. GPU 是设计用来完成高吞吐量的大规模并行工作的。因此,它们非常适合用在包含大量运算符的神经网络上,
8. 一些输入张量可以容易的被划分为更小的工作负载且可以同时执行,通常这会导致更低的延迟。
9. 在最佳情况下,用 GPU 在实时应用程序上做推理运算已经可以运行的足够快,而这在以前是不可能的。

图像与蒙板之间的转化(transfer)


1.

def transfer(image, mask):#将mask的像素矩阵(在python中是一个二维数组)改成与image同行数同列数mask = cv2.resize(mask, (image.shape[1], image.shape[0]))#np.zeros_like函数主要是想实现构造一个矩阵mask_n,其维度与矩阵image一致#并为其初始化为全0#这个函数方便的构造了新矩阵,无需参数指定shape大小mask_n = np.zeros_like(image)
    mask_n[:, :, 0] = maskalpha = 0.7 beta = (1.0 - alpha)#cv2.addWeighted是Python-OpenCV图像叠加or图像混合加权方法#其中image是第一个输入的数列#alpha是第一个数列诸元素的权重#mask_n是一个输入数列,它的大小和通道数与image必须相同#beta即第二个数列诸元素的权重#0.0处填入一个标量,需要加到每一个和值上dst = cv2.addWeighted(image, alpha, mask_n, beta, 0.0)return dst

设置图像和相机、开始读图

#宽高各512
w=512
h=512
#输入形状设置为512*512
input_shape=[w,h]
#语义:[一副图像*(512*512)像素*rgb加上alpha共四通道*4字节]
inShape =[1 * w * h *4*4,]
#语义:[一副图像*(512*512)像素*二通道*4字节]
outShape= [1 * w*h*2*4,]
#指定模型路径
model_path="models/hair_segmentation.tflite"
#参数语义:4代表四个通道、0代表使用GPU
print('gpu:',tflite.NNModel(model_path,inShape,outShape,4,0))
#指定一个摄像机ID,并捕捉该摄像机的视频流
#cvs.VideoCapture(1)是调用手机前置摄像头,如果是cvs.VideoCapture(0)就是调用手机后置摄像头。
camid=1
cap=cvs.VideoCapture(camid)#np.zeros是np包的置零方法,用于给一个n维数组(在tensorflow中称为张量)初始化为全0
#(512,512,4)是三个维度的长度,表示512*512像素,4通道(RGB、透明通道)。
#dtype=np.float32设置元素类型为32位浮点型。
in_tensor = np.zeros((512,512,4),dtype=np.float32)
masa = np.zeros((512,512),dtype=np.float32)
while True:#读取摄像头画面到帧frame=cap.read()#直到读取到摄像头的图像为止if frame is None:continue
 #flip()的作用是使图像进行翻转,cv2.flip(filename, flipcode) #filename:需要操作的图像,flipcode:翻转方式,1水平翻转,0垂直翻转,-1水平垂直翻转#如果是前置摄像头,需要翻转图片,想象照镜子的原理if camid==1:# frame=cv2.resize(frame,(720,1080))frame=cv2.flip(frame,1)
 #改变img为与读取到的帧同大小img =cv2.resize(frame,(input_shape[0],input_shape[1]))#cv2.cvtColor(p1,p2) 是颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式。#cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式(蓝绿红到红绿蓝)  #cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)print("image:", img)#img = (img / 255-0.5)*2# img读入Python后都是RGB值数组从0~255归一化至0~1img = img / 255
 in_tensor[:,:,0:3] = imgin_tensor[:,:,3] = masa# in_tensor[:,:,0:3] = img_preprint ('img',img.shape)

启动模型,进行头发分割


1.

 # interpreter.set_tensor(input_details[0]['index'], img[np.newaxis,:,:,:])#此处也采用Fp32(三十二位浮点),512*512像素tflite.setTensor_Fp32(in_tensor,input_shape[1],input_shape[1])
 #设置启动时间start_time = time.time()#启动网络tflite.invoke()t = (time.time() - start_time)# print('elapsed_ms invoke:',t*1000)#标签lbs = 'Fps: '+ str(int(1/t))+" ~~ Time:"+str(t*1000) +"ms"cvs.setLbs(lbs)
 #pred变量存放张量组pred = tflite.getTensor_Fp32(0)#pre0:前景(人脸)#变为512*512像素pred0=(pred[0::2 ]).reshape(w,h)#pred1:背景(头发)#变为512*512像素pred1=(pred[1::2]).reshape(w,h)#前景(人脸)复制到backback=((pred0)).copy()#背景(头发)复制到frontfront=((pred1)).copy()
 #求差值,赋给遮罩变量(前景减去背景)mask=front-back# print (list(mask))#此处可视为对mask的值进行二值逻辑化,从彩色图到非黑即白#将正值全部归纳至255,负值全部归纳为0mask[mask>0.0]=255mask[mask<0.0]=0#masa是mask单位化(将取值缩放到0~1)后的变量masa=mask/255# mask=masa# mask=cv2.merge([mask,mask,mask])# frame = cv2.resize(frame, (512,512))dst=transfer(frame,mask)# dst=(mask*128)+(1-mask)*frame#cvs.imshow(mask)#显示图像cvs.imshow(dst)#调用sleep()函数让当前线程暂停1ssleep(1)
import apkneed
import apkneed

AidLux“实时头发分割”案例源码详解相关推荐

  1. AidLux“人像抠图”案例源码详解 (Python)

    "人像抠图"案例源码详解 (Python) seg_gui_meet.py用于人像抠图 导入基础包作用详解 构建程序图形化类 初始化处理函数(人体抠图应用启动时首先被调用) 程序入 ...

  2. AidLux“换脸”案例源码详解 (Python)

    "换脸"案例源码详解 (Python) faceswap_gui.py用于换脸,可与facemovie_gui.py身体互换源码(上一篇文章)对照观看 打开faceswap_gui ...

  3. AidLux “人脸测试”案例源码详解

    "人脸检测"案例源码详解 testface.py用于进行人脸检测 构建APP框架和添加主要控件 人脸关键点识别的方法 打开人脸测试案例 1.在VScode中进入代码编辑状态. 2. ...

  4. Android开发之GPS测试完整案例源码详解之实时检测GPS的状态

    获取Android系统Location位置服务实例: /*** Get location manager system service** @return LocationManager*/publi ...

  5. 开源 2D 实时水面反射效果,源码详解!

    引言:插件 Easy NavMesh.BenchMark 性能检测的作者孙二喵,从开发者王师傅的论坛分享中获得启发,实现了 2D 实时水面反射效果,Demo 免费开源. 2D 实时水面反射 Demo ...

  6. 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】

    卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10) 在上一章已经完成了卷积神经网络的结构分析,并通过各个模块理解 ...

  7. Redis从精通到入门——数据类型Zset实现源码详解

    Redis数据类型之Zset详解 Zset简介 Zset常用操作 应用场景 Zset实现 源码阅读 Zset-ziplist实现 图解Zset-ziplist Zset-字典(dict) + 跳表(z ...

  8. 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】

    卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...

  9. Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解

    Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 目录 Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 一.OpenGL ES渲染管线 1.基本处 ...

最新文章

  1. git warning: LF will be replaced by CRLF in 解决办法
  2. vs2015中文乱码
  3. 浅谈ASP.NET的Postback
  4. python 制作wordcloud词云
  5. Mpvue+koa开发微信小程序——wx.request()的封装及应用
  6. linux 上传网页文件大小,Linux:上传未完成的文件 – 文件大小检查(scp / rsync)
  7. 查询oracle 表达小,oracle中sql语句小练习(使用连接查询)
  8. 转载:C#正则表达式
  9. c++ windows编译器 amd平台_不同操作系统下的C/C++ 编译器,C/C++新手须知,零基础学习C语言...
  10. return 输出为空php,thinkphp5 返回json数据的方法---以及返回json为空的原因
  11. k8s核心技术-Pod(调度策略)_影响Pod调度(污点和污点容忍)---K8S_Google工作笔记0027
  12. 罗永浩回应被中消协点名;传前淘宝直播运营负责人因贪污被阿里通报;TypeScript 4.0 Beta发布​ | 极客头条...
  13. ICS共享上网方案与配置
  14. Java好还是Python好?一张图告诉你!
  15. paip.输入法编程---输入法ATIaN历史记录 v8b
  16. LabVIEW安装第三方VISA软件后NI VISA失效
  17. mac电脑如何设置开机启动项
  18. 软件设计师- 系统工程知识
  19. 业内人士给龙年买房人的15条忠告 看到的有福了
  20. Vibrant Ink Theme for IntelliJ IDEA

热门文章

  1. java 上传图片 生成缩略图_将图片生成缩略图Java代码实现
  2. JAVA命名规范(阿里巴巴)及其口语化总结
  3. V4L2调试之(五)
  4. created是什么牌子_最好用的防晒喷雾排行榜2021(防晒喷雾哪个牌子最好用)
  5. 【SLAM】SLAM环境配置 Win10+VS2019+OpenCV+PCL+g2o+Vcpkg
  6. Photoshop快速把人物图片转黑白素描画(1)
  7. jupyter中中文显示不正常_解决jupyter notebook显示不全出现框框或者乱码问题
  8. Promox VE日常维护
  9. 微信公众平台开发三:微信的OAuth2.0登录开发
  10. java面试笔记二:java的面向对象