风格迁移开发记录(DCT-Net)

1.DCT-Net部署

阿里旗下的 modelscope社区,丰富的开源风格迁移算法模型
image.png
DCT-Net GitHub链接

git clone https://github.com/menyifang/DCT-Net.git
cd DCT-Netpython run_sdk.py下载不同风格的模型

如下图每个文件夹代表一种风格,有cartoon_bg.pb, cartoon_h.pb两个模型,bg是全图风格模型,h是脸部风格模型:
image.png

模型转换

export_model.py

模型转换方式,不能将pb模型全部转换,要取中间节点,有些前后节点rknn或ncnn不支持需放在cpu处理
pb->tflite->rknn
pb->onnx->ncnn

"""
@File   : export_model.py
@Author : 
@Date   : 2023/12/13
@Desc   : 
"""
import os
import shutil
import tensorflow as tf
import cv2
import tf2onnx
import onnx
import time
import onnxruntime
import subprocess
import numpy as np# python -m tf2onnx.convert --graphdef .\damo\cv_unet_person-image-cartoon_compound-models\cartoon_bg.pb --output .\damo\cv_unet_person-image-cartoon_compound-models\cartoon_bg.onnx --
# inputs input_image:0 --outputs output_image:0 
def convert_pb2tflite(model_path, input_shape, model_dir, type_name):converter = tf.compat.v1.lite.TFLiteConverter.from_frozen_graph(graph_def_file = model_path + '.pb',input_arrays = ["strided_slice_1"],output_arrays = ["strided_slice_4"],input_shapes = {'strided_slice_1' : input_shape})# converter = tf.lite.TFLiteConverter.from_frozen_graph(model_path + '.pb', input_arrays=["input_image"], output_arrays=output_name, input_shapes={"input_image": input_shape})# converter.optimizations = [tf.lite.Optimize.DEFAULT]# converter.target_spec.supported_types = [tf.float16]tflite_model = converter.convert()bgh = model_path.split('/')[-1]save_path = os.path.join(model_dir, type_name + '_' + bgh + '.tflite')print('===> ', save_path, bgh)# exit()open(save_path, "wb").write(tflite_model)interpreter = tf.lite.Interpreter(model_content=tflite_model)input = interpreter.get_input_details()print('===> input: ', input)output = interpreter.get_output_details()print('===> output: ', output)def pb2tflite_2():pb_dir = './damo/'bg_model = 'cartoon_bg'h_model = 'cartoon_h'tflite_dir = './damo/tflite_model'# 自定义设置输入shape# bg_input_shape = [1, 720, 720, 3]# bg_input_shape = [1, 1920, 1080, 3]# bg_input_shape = [1, 2560, 1440, 3]bg_input_shape = [1, 1280, 720, 3]head_input_shape = [1, 288, 288, 3]tflite_dir = tflite_dir + str(bg_input_shape[1]) + "x" + str(bg_input_shape[2])if not os.path.exists(tflite_dir):os.makedirs(tflite_dir)for i in os.listdir(pb_dir):if not i.startswith('cv_unet'):continuemodel_dir = os.path.join(pb_dir, i)bg_path = os.path.join(model_dir, bg_model)h_path = os.path.join(model_dir, h_model)print('============', i)type_name = i.split('-')[-2]type_name = type_name.split('_')[0]print('===> ', i, type_name, bg_path)convert_pb2tflite(bg_path, bg_input_shape, tflite_dir, type_name)# convert_pb2tflite(h_path, head_input_shape, tflite_dir, type_name)# exit(0)def pb2onnx(bg_path, bg_input_shape, onnx_dir, type_name):# 定义要执行的命令行命令pb_path = bg_path + '.pb'onnx_name = type_name + '_' + bg_path.split('/')[-1] + '.onnx'onnx_path =  os.path.join(onnx_dir, onnx_name)  command = "python -m tf2onnx.convert --graphdef {pb_path} --output {onnx_path} --inputs strided_slice_1:0 --outputs add_1:0 --inputs-as-nchw strided_slice_1:0 --outputs-as-nchw add_1:0"# 使用字符串格式化将变量插入命令中formatted_command = command.format(pb_path=pb_path, onnx_path=onnx_path)# 使用 subprocess.Popen 执行命令p = subprocess.Popen(formatted_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)# 获取命令行输出和错误信息output, error = p.communicate()# 将二进制输出转换为字符串并打印出来print(output.decode())time.sleep(5)# onnx-simonnx_sim, _ = os.path.splitext(onnx_path)onnx_sim_path = onnx_sim + '-sim.onnx'n = bg_input_shape[0]c = bg_input_shape[3]h = bg_input_shape[1]w = bg_input_shape[2]print(bg_input_shape, onnx_path, onnx_sim_path)command2 = 'python -m onnxsim {onnx_path} {onnx_sim_path} --overwrite-input-shape {n},{c},{h},{w}'# 使用字符串格式化将变量插入命令中formatted_command = command2.format(onnx_path=onnx_path, onnx_sim_path=onnx_sim_path, bg_input_shape=bg_input_shape, n=n, c=c, h=h, w=w)# 使用 subprocess.Popen 执行命令p = subprocess.Popen(formatted_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)# 获取命令行输出和错误信息output, error = p.communicate()# 将二进制输出转换为字符串并打印出来print(output.decode())def tfpb2onnx():pb_dir = './damo/'bg_model = 'cartoon_bg'h_model = 'cartoon_h'onnx_dir = './damo/onnx_model'# bg_input_shape = [1, 1024, 1024, 3]# bg_input_shape = [1, 1920, 1080, 3]bg_input_shape = [1, 2560, 2560, 3]head_input_shape = [1, 288, 288, 3]onnx_dir = onnx_dir + str(bg_input_shape[1]) + "x" + str(bg_input_shape[2])if not os.path.exists(onnx_dir):os.makedirs(onnx_dir)for i in os.listdir(pb_dir):if not i.startswith('cv_unet'):continuemodel_dir = os.path.join(pb_dir, i)bg_path = os.path.join(model_dir, bg_model)h_path = os.path.join(model_dir, h_model)print(f'============>bg_path: {bg_path}, h_path: {h_path}')type_name = i.split('-')[-2].split('_')[0]# type_name = type_name.split('_')[0]print(f'type_name: {type_name}, i: {i}')# exit(0)pb2onnx(bg_path, bg_input_shape, onnx_dir, type_name)pb2onnx(h_path, head_input_shape, onnx_dir, type_name)# exit()# tf2onnx# python -m tf2onnx.convert --graphdef damo/cv_unet_person-image-cartoon_compound-models/cartoon_bg.pb --output damo/cv_unet_person-image-cartoon_compound-models/cartoon_bg.onnx  # --inputs strided_slice_1:0 --outputs add_1:0 --inputs-as-nchw strided_slice_1:0# simplifier onnx# python -m onnxsim cartoon_bg.onnx cartoon_bg-sim.onnx --overwrite-input-shape 1,3,1024,1024def onnx2ncnn():onnx_dir = './damo/onnx_model2560x2560'for i in os.listdir(onnx_dir):if not i.endswith('.onnx'):continueif 'h-sim' in i:continueonnx_path = os.path.join(onnx_dir, i)onnx_name, ext = os.path.splitext(onnx_path)# print(onnx_name)ncnn_param = onnx_name + '.param'ncnn_bin = onnx_name + '.bin'print(f'onnx_name: {onnx_name}, ncnn_param: {ncnn_param}, ncnn_bin {ncnn_bin}')command3 = "./ncnn-20231027-ubuntu-2204/bin/onnx2ncnn {onnx_path} {ncnn_param} {ncnn_bin}"# 使用字符串格式化将变量插入命令中formatted_command = command3.format(onnx_path=onnx_path, ncnn_param=ncnn_param, ncnn_bin=ncnn_bin)# 使用 subprocess.Popen 执行命令p = subprocess.Popen(formatted_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)# 获取命令行输出和错误信息output, error = p.communicate()# 将二进制输出转换为字符串并打印出来print(output.decode())# exit(0)def ncnn_optimize():onnx_dir = './damo/onnx_model1024x1024'for i in os.listdir(onnx_dir):if not i.endswith('.param'):continueparam_path = os.path.join(onnx_dir, i)bin_path = param_path.replace('.param', '.bin')opt_param_path = param_path.replace('.param', '-opt.param')opt_bin_path = bin_path.replace('.bin', '-opt.bin')print(f'param_path: {param_path}, bin_path: {bin_path}, opt_param_path {opt_param_path}, opt_bin_path {opt_bin_path}')command3 = "./ncnn-20231027-ubuntu-2204/bin/ncnnoptimize {param_path} {bin_path} {opt_param_path} {opt_bin_path} 1"# 使用字符串格式化将变量插入命令中formatted_command = command3.format(param_path=param_path, bin_path=bin_path, opt_param_path=opt_param_path, opt_bin_path=opt_bin_path)# 使用 subprocess.Popen 执行命令p = subprocess.Popen(formatted_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)# 获取命令行输出和错误信息output, error = p.communicate()# 将二进制输出转换为字符串并打印出来print(output.decode())if __name__ == '__main__':pb2tflite_2()# tfpb2onnx()# onnx2ncnn()# ncnn_optimize()

tflite2rknn.py

import os
import time
import shutil
import numpy as np
import cv2
from rknn.api import RKNNdef show_outputs(outputs):output = outputs[0][0]index = sorted(range(len(output)), key=lambda k : output[k], reverse=True)fp = open('./labels.txt', 'r')labels = fp.readlines()top5_str = 'mobilenet_v1\n-----TOP 5-----\n'for i in range(5):value = output[index[i]]if value > 0:topi = '[{:>4d}] score:{:.6f} class:"{}"\n'.format(index[i], value, labels[index[i]].strip().split(':')[-1])else:topi = '[  -1]: 0.0\n'top5_str += topiprint(top5_str.strip())def dequantize(outputs, scale, zp):outputs[0] = (outputs[0] - zp) * scalereturn outputsdef letterbox(im, new_shape=(640, 640), color=(0, 0, 0)):# Resize and pad image while meeting stride-multiple constraintsshape = im.shape[:2]  # current shape [height, width]if isinstance(new_shape, int):new_shape = (new_shape, new_shape)# Scale ratio (new / old)r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])# Compute paddingratio = r, r  # width, height ratiosnew_unpad = int(round(shape[1] * r)), int(round(shape[0] * r))dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1]  # wh paddingdw /= 2  # divide padding into 2 sidesdh /= 2if shape[::-1] != new_unpad:  # resizeim = cv2.resize(im, new_unpad, interpolation=cv2.INTER_LINEAR)top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1))left, right = int(round(dw - 0.1)), int(round(dw + 0.1))im = cv2.copyMakeBorder(im, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)  # add borderreturn im, ratio, (dw, dh)def post_process(rknn_result):rknn_result = rknn_result.clip(-0.999999, 0.999999)rknn_result = (rknn_result + 1) * 127.5cartoon_img = rknn_result.astype('uint8')# onnx_result = cv2.cvtColor(onnx_result, cv2.COLOR_RGB2BGR)# cv2.imwrite('8_anime.jpg', rknn_result)return cartoon_imgdef export_rknn(tflite_model_path, QUANTIZE_ON, DATASET):# Create RKNN objectrknn = RKNN(verbose=True)# Pre-process configprint('--> Config model')# rknn.config(mean_values=[128, 128, 128], std_values=[128, 128, 128], target_platform='rk3566')rknn.config(target_platform='rk3588')print('done')# Load model (from https://www.tensorflow.org/lite/examples/image_classification/overview?hl=zh-cn)print('--> Loading model')ret = rknn.load_tflite(model=tflite_model_path)if ret != 0:print('Load model failed!')exit(ret)print('done')# Build modelprint('--> Building model')ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET)if ret != 0:print('Build model failed!')exit(ret)print('done')# Export rknn modelprint('--> Export rknn model')ret = rknn.export_rknn(tflite_model_path.replace('.tflite', '.rknn'))if ret != 0:print('Export rknn model failed!')exit(ret)print('done')# Init runtime environmentprint('--> Init runtime environment')ret = rknn.init_runtime()if ret != 0:print('Init runtime environment failed!')exit(ret)print('done')# Set inputsIMG_PATH = './16.png'IMG_SIZE = (288, 288)  # w, himg = cv2.imread(IMG_PATH)# img, ratio, (dw, dh) = letterbox(img, new_shape=(IMG_SIZE[0], IMG_SIZE[1]))# img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img = cv2.resize(img, IMG_SIZE)# img = img.astype('float32')# img = img / 127.5 - 1img = np.expand_dims(img, 0)print(f'===> input shape: {img.shape}')# Inferenceprint('--> Running model')outputs = rknn.inference(inputs=[img], data_format=['nhwc'])print(f'===> output shape: {outputs[0].shape}')# np.save('./tflite_mobilenet_v1_qat_0.npy', outputs[0])# show_outputs(dequantize(outputs, scale=0.00390625, zp=0))cartoon_img = post_process(outputs[0])cv2.imwrite(model_path.replace('.tflite', '.jpg'), cartoon_img)print('done')rknn.release()if __name__ == '__main__':model_dir = './StyleTransfer/DCT-Net-main/damo/tflite_head'QUANTIZE_ON = FalseDATASET = './dataset.txt'for i in os.listdir(model_dir):if not i.endswith('.tflite'):continuemodel_path = os.path.join(model_dir, i)print(f'model path: {model_path}')export_rknn(model_path, QUANTIZE_ON, DATASET)

RKNN和NCNN推理代码

GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++STL详解(一)——String接口详解(上)!!!

目录 一.string类介绍 二.string类的构造赋值 2.1string类的拷贝和构造函数 2.2深拷贝 三.string类的插入 3.1push_back 3.2append 3.3操作符 3.4insert 四.string的删除 4.1pop_back 4.2erase 五.string的查找 5.1find 5.2rfind 六.string的比较 6.1compare函…

深入浅出WebRTC—Pacer

平滑发包(Pacer)是 WebRTC 实现高质量实时通信不可或缺的一部分。在视频通信中,单帧视频可能包含大量的数据,如果未经控制地立即发送,可能瞬间对网络造成巨大压力。Pacer 能够根据网络条件动态调整发送速率&#xff0c…

python库(14):Arrow库简化时间处理

1 Arrow简介 Arrow 是一个被称为程序员的时间处理利器的 Python 库。 从诞生起,它就是为了填补 Python 的 datetime 类型的功能空白而生的。为程序员提供了一种更简单、更直观的方式来处理日期和时间。 2 安装Arrow库 pip install arrow -i https://pypi.tuna.ts…

什么是设备运维管理系统?有什么作用?(6款设备运维管理系统推荐)

一、什么是设备运维管理系统? 设备运维管理系统是一种集成了监控、管理、维护和优化设备性能的软件平台。它旨在通过自动化的手段,提高设备运行的可靠性和效率,降低运维成本,并优化资源利用。 设备运维管理系统能够实时监控设备…

【1】Python机器学习之基础概念

1、什么是机器学习 最早的机器学习应用——垃圾邮件分辨 传统的计算机解决问题思路: 编写规则,定义“垃圾邮件”,让计算机执行对于很多问题,规则很难定义规则不断变化 机器学习在图像识别领域的重要应用: 人脸识别…

带您详细了解安全漏洞的产生和防护

什么是漏洞? 漏洞是 IT、网络、云、Web 或移动应用程序系统中的弱点或缺陷,可能使其容易受到成功的外部攻击。攻击者经常试图寻找网络安全中的各种类型的漏洞来组合和利用系统。 一些最常见的漏洞: 1.SQL注入 注入诸如 SQL 查询之类的小代…

BUU [PASECA2019]honey_shop

BUU [PASECA2019]honey_shop 技术栈:任意文件读取、session伪造 开启靶机,我有1336金币,买flag需要1337金币 点击上面的大图,会直接下载图片 抓包看看,感觉是任意文件读取 修改下路径读一下 读到了session密钥是Kv8i…

Springboot validated JSR303校验

1.导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency> 2.测试类 package com.jmj.gulimall.product.testC;import lombok.Data;import javax.val…

C++《类和对象》(中)

一、 类的默认成员函数介绍二、构造函数 构造函数名与类同名内置类型与自定义类型析构函数拷贝构造函数 C《类和对象》(中) 一、 类的默认成员函数介绍 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。 那么我们主要学习的是1&…

Linux环境docker部署Firefox结合内网穿透远程使用浏览器测试

文章目录 前言1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox 前言 本次实践部署环境为本地Linux环境&#xff0c;使用Docker部署Firefox浏览器后&#xff0c;并结合cpolar内网穿…

手动搭建微型计算机(涉及:CPU、内存、寄存器等)

目录 微型计算机基础元件及作用CPU地址总线数据总线 内存地址总线数据总线内存大小的计算 寄存器先将Z80CPU与TC5517内存相连参考文章 微型计算机基础元件及作用 CPU、内存、I/O CPU 包含地址总线引脚和数据总线引脚。 以Z80CPU为例&#xff1a; 地址总线 地址总线引脚…

Apache Bigtop 正式支持 openEuler,共创大数据新生态

近日&#xff0c;在OpenAtom openEuler&#xff08;简称"openEuler"&#xff09;BigData SIG与Linaro的携手努力下&#xff0c;** Apache Bigtop于2024年7月8日发布的3.3.0新版本中&#xff0c;正式宣告了对openEuler操作系统的原生支持**。这一里程碑式的进展&#…

[微信小程序] css 解决纯数字或字母不自动换行的问题、控制文字行数

效果 css 代码 word-break: break-all; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;解释 word-break: break-all; 作用&#xff1a;这个属性允许在单词内部进行换行&#xff0c;即使单词很长也…

Mysql - 索引

目录 一、存储引擎 二、索引 索引结构 索引分类 索引语法 联合索引 前缀索引 索引使用规则 最左前缀法则 范围查询使索引失效 字段做运算操作索引失效 字符串字段不加单引号索引失效 字段做前模糊查询索引失效 or连接条件索引失效 数据发布情况索引失效 指定使用…

AIGC高频产品面试题(二)

什么叫大模型&#xff0c;人工智能大模型是什么&#xff1f; 之前&#xff0c;人工智能大多针对特定的场景应用进行训练&#xff0c;生成的模型难以迁移到其他场景&#xff0c;属于“小模型”的范畴。整个训练过程中&#xff0c;不仅手工调参工作量大&#xff0c;还需要给机器“…

[ECCV 2024] [复旦]RECE:扩散模型概念移除,只需3秒即可充分移除风险概念!

本文内容来自公众号粉丝投稿&#xff0c;作者来自复旦大学的视觉与学习实验室(FVL)。研究团队提出了一种可靠、高效的概念移除方法&#xff08;RECE&#xff09;。该方法以解析解的形式&#xff0c;迭代地进行风险概念移除、风险概念嵌入推导&#xff0c;从而确保模型彻底移除风…

【MySQL进阶之路 | 高级篇】优化数据库结构和大表优化

目录结构&#xff1a; 目录 目录结构&#xff1a; 1. 优化数据库结构 1.1 拆分表&#xff1a;冷热数据分离 1.2 增加冗余字段 1.3 优化数据类型 情况1&#xff1a;对整数类型数据进行优化 情况2&#xff1a;既可以使用文本类型也可以使用整数类型的字段&#xff0c;要选…

LeetCode热题100刷题17:124. 二叉树中的最大路径和、437. 路径总和 III、199. 二叉树的右视图

124. 二叉树中的最大路径和 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nul…

Github 2024-07-17 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-17统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量非开发语言项目3Python项目3Rust项目2TypeScript项目2MDX项目1项目化学习 创建周期:2538 天协议类型:MIT LicenseStar数量:161973 个Fork数量…

基于51单片机的指纹红外密码电子锁

基于51单片机的指纹红外密码电子锁 1、系统功能介绍2、演示视频3、系统框图4、系统电路介绍4.1、STC89C52单片机最小系统设计4.2、LCD12864显示屏电路设计4.3、矩阵键盘按键控制部分电路设计4.4、AS608指纹模块电路设计 5、程序设计5.1、LCD12864屏幕初始化5.2、AT24C02存储芯片…