feat:export release

This commit is contained in:
zpeng11 committed 2026-02-03 01:11:08 -05:00
1 parent 3dbc2c0942
commit 23fc058ac6
19 files changed
+78 -403

No files matched your search

+6
View File
@@ -0,0 +1,6 @@
@echo on
cd /D "%~dp0"
SET PATH=%~dp0envs\TensorRT-RTX-1.3.0.35_cu129\bin;%~dp0envs\python_embedded;%~dp0envs\python_embedded\Scripts;%~dp0envs\python_embedded\Library\bin;%PATH%
pythonw launcher2.py
+8
View File
@@ -0,0 +1,8 @@
@echo on
cd /D "%~dp0"
SET PATH=%~dp0envs\TensorRT-RTX-1.3.0.35_cu129\bin;%~dp0envs\python_embedded;%~dp0envs\python_embedded\Scripts;%~dp0envs\python_embedded\Library\bin;%PATH%
python launcher2.py
pause
-6
View File
@@ -1,6 +0,0 @@
@echo on
cd /D "%~dp0"
SET PATH=%~dp0envs\python_embedded;%~dp0envs\python_embedded\Scripts;%~dp0envs\python_embedded\Library\bin;%PATH%
pythonw launcher2.py
-8
View File
@@ -1,8 +0,0 @@
@echo on
cd /D "%~dp0"
SET PATH=%~dp0envs\python_embedded;%~dp0envs\python_embedded\Scripts;%~dp0envs\python_embedded\Library\bin;%PATH%
python launcher2.py
pause
@@ -1,74 +0,0 @@
@echo off
setlocal enabledelayedexpansion
cd /D "%~dp0"
SET PATH=%~dp0envs\python_embedded;%~dp0envs\python_embedded\Scripts;%~dp0envs\python_embedded\Library\bin;%PATH%
echo ================================================================================
echo THA4 学生模型 ONNX 和 TensorRT 转换工具
echo ================================================================================
echo.
REM 检查模型目录是否存在
if not exist "data\models\custom_tha4_models" (
echo [错误] 找不到模型目录: data\models\custom_tha4_models
pause
exit /b 1
)
echo 可用的 THA4 学生模型:
echo --------------------------------------------------------------------------------
set count=0
for /d %%i in (data\models\custom_tha4_models\*) do (
set /a count+=1
echo [!count!] %%~nxi
)
echo --------------------------------------------------------------------------------
echo.
if %count%==0 (
echo [错误] 未找到任何模型文件夹
pause
exit /b 1
)
echo 请输入要转换的模型文件夹名称:
set /p MODEL_NAME=^>
REM 检查输入是否为空
if "%MODEL_NAME%"=="" (
echo [错误] 模型名称不能为空
pause
exit /b 1
)
REM 检查模型文件夹是否存在
if not exist "data\models\custom_tha4_models\%MODEL_NAME%" (
echo [错误] 模型文件夹不存在: data\models\custom_tha4_models\%MODEL_NAME%
pause
exit /b 1
)
echo.
echo ================================================================================
echo 步骤 1/2: 导出 ONNX 模型
echo ================================================================================
echo 模型: %MODEL_NAME%
echo 命令: python onnx_export_tha4_student.py %MODEL_NAME% --cpu
echo --------------------------------------------------------------------------------
echo.
python onnx_export_tha4_student.py %MODEL_NAME% --cpu
echo ================================================================================
echo 步骤 2/2: 转换为 TensorRT 模型
echo ================================================================================
echo 模型: %MODEL_NAME%
echo 命令: python tha4_student_convert_onnx_to_trt.py %MODEL_NAME% fp32
echo --------------------------------------------------------------------------------
echo.
python tha4_student_convert_onnx_to_trt.py %MODEL_NAME% fp32
pause
+26 -1
View File
@@ -19,6 +19,7 @@ Updates:
* 使用 [waifu2x](https://github.com/nagadomi/waifu2x) 和 [real-esrgan](https://github.com/xinntao/Real-ESRGAN) 项目带来的输出超分辨率,对比anime4k效果提升显著(也使用更多gpu占用)
* 更漂亮的 WxPython 新启动器界面,带中文介绍更加简单易用
* 添加Spout2 支持输出原生透明通道给OBS
* 添加 [THA V4](https://github.com/pkhungurn/talking-head-anime-4-demo) 支持,拥有更好的图形输出
## Requirements
@@ -43,7 +44,7 @@ Updates:
使用Spout2插件可以提供透明通道给OBS,访问 https://github.com/Off-World-Live/obs-spout2-plugin/releases 项目,请选择与你的OBS版本兼容的插件安装exe。
### 启动项目
双击`02A.启动器.bat` 或 `02B.启动器(调试输出).bat` 启动器,如下图启动。
双击`01A.启动器.bat` 或 `01B.启动器(调试输出).bat` 启动器,如下图启动。
![](assets/02success.png)
之后请移步后文的输入输出&性能配置板块自行调节。如有问题请先参考本页末的FAQ再提出。
@@ -240,3 +241,27 @@ A卡I卡使用 DirectML,这个框架与显卡厂商的显卡驱动及 Direct12
> Q6: 本机有两张显卡,如何使用第二张副卡使用这个项目?
在运行前配置环境变量`EZVTB_DEVICE_ID`为你想要运行的GPU ID,此变量缺省为`0`
## References
```
@inproceedings{huang2022rife,
title={Real-Time Intermediate Flow Estimation for Video Frame Interpolation},
author={Huang, Zhewei and Zhang, Tianyuan and Heng, Wen and Shi, Boxin and Zhou, Shuchang},
booktitle={Proceedings of the European Conference on Computer Vision (ECCV)},
year={2022}
}
@misc{Khungurn:2022,
author = {Pramook Khungurn},
title = {Talking Head(?) Anime from a Single Image 3: Now the Body Too},
howpublished = {\url{http://pkhungurn.github.io/talking-head-anime-3/}},
year = 2022,
note = {Accessed: YYYY-MM-DD},
}
@InProceedings{wang2021realesrgan,
author = {Xintao Wang and Liangbin Xie and Chao Dong and Ying Shan},
title = {Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data},
booktitle = {International Conference on Computer Vision Workshops (ICCVW)},
date = {2021}
}
```
+1 -1
View File
@@ -318,7 +318,7 @@ class LauncherPanel(wx.Panel):
addOption('beta', title='Beta', desc='输入滤波速度补偿,\n越小越平滑,越大运动时越灵敏',
type=3, mapper=beta_mapper)
addOption('breath_cycle', title='Breath Cycle', desc='设置呼吸循环时间',
addOption('breath_cycle', title='Breath Cycle', desc='设置呼吸循环时间(会增加占用)',
choices=['No Breath', '3 seconds', '5 seconds', '7 seconds'],
mapping=['inf', '3.0', '5.0', '7.0'])
+34 -46
View File
@@ -6,61 +6,49 @@ REM 2. Rebase with the latest changes: git rebase main
REM ========================================================================
cd /D "%~dp0"
@REM git clean -fdx
@REM git submodule update --init --recursive
@REM if not exist "envs" mkdir envs
@REM if not exist "envs\miniconda3" mkdir envs\miniconda3
if not exist "envs" mkdir envs
if not exist "envs\miniconda3" mkdir envs\miniconda3
@REM IF not EXIST %~dp0envs\miniconda3\Scripts (
@REM @RD /S /Q %~dp0envs\miniconda3
@REM mkdir %~dp0envs\miniconda3
@REM echo "Downloading miniconda..."
@REM powershell -Command "Invoke-WebRequest -Uri 'https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Windows-x86_64.exe' -OutFile '.\envs\miniconda3.exe' -UseBasicParsing -Headers @{'User-Agent'='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36'}"
IF not EXIST %~dp0envs\TensorRT-RTX-1.3.0.35_cu129\bin (
@RD /S /Q %~dp0envs\TensorRT-RTX-1.3.0.35_cu129
cd /D "%~dp0\envs"
curl -L -o trt_rtx.zip https://developer.nvidia.com/downloads/trt/rtx_sdk/secure/1.3/TensorRT-RTX-1.3.0.35-win10-amd64-cuda-12.9-Release-external.zip
tar -xf trt_rtx.zip "TensorRT-RTX-1.3.0.35" && ren "TensorRT-RTX-1.3.0.35" "TensorRT-RTX-1.3.0.35_cu129" && del trt_rtx.zip
cd /D "%~dp0"
)
@REM echo "Installling minconda..."
@REM start /wait "" %~dp0envs\miniconda3.exe /S /AddToPath=0 /RegisterPython=0 /InstallationType=JustMe /D=%~dp0envs\miniconda3
@REM echo "Successfully install minconda"
@REM del envs\miniconda3.exe
@REM )
IF not EXIST %~dp0envs\miniconda3\Scripts (
@RD /S /Q %~dp0envs\miniconda3
mkdir %~dp0envs\miniconda3
echo "Downloading miniconda..."
powershell -Command "Invoke-WebRequest -Uri 'https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Windows-x86_64.exe' -OutFile '.\envs\miniconda3.exe' -UseBasicParsing -Headers @{'User-Agent'='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36'}"
@REM SET PATH=%~dp0envs\miniconda3\Scripts;%PATH%
echo "Installling minconda..."
start /wait "" %~dp0envs\miniconda3.exe /S /AddToPath=0 /RegisterPython=0 /InstallationType=JustMe /D=%~dp0envs\miniconda3
echo "Successfully install minconda"
del envs\miniconda3.exe
)
@REM call activate
@REM call conda env list
@REM call conda update -y --all
@REM call conda create -n ezvtb_rt_venv_release -c conda-forge conda-pack python=3.10 -y
@REM call conda activate ezvtb_rt_venv_release
@REM call conda env list
SET PATH=%~dp0envs\TensorRT-RTX-1.3.0.35_cu129\bin;%~dp0envs\miniconda3\Scripts;%PATH%
@REM call conda install -y -c conda-forge cudatoolkit=12.9.1 cudnn=12.9.1
@REM call conda install -y nvidia/label/cuda-12.9.1::cuda-nvcc-dev_win-64
@REM call conda install -y pycuda -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
call activate
call conda env list
call conda update -y --all
call conda create -n ezvtb_rt_venv_release python=3.10 -y
call conda activate ezvtb_rt_venv_release
call conda env list
@REM call conda-pack -n ezvtb_rt_venv_release -o %~dp0envs\python_embedded --format no-archive
call conda install -y conda-pack
call conda install -y conda-forge::pycuda
call conda install -y -c nvidia/label/cuda-12.9.1 cuda-nvcc-dev_win-64 cudnn cuda-runtime
call conda-pack -n ezvtb_rt_venv_release -o %~dp0envs\python_embedded --format no-archive
@REM SET PATH=%~dp0envs\python_embedded;%~dp0envs\python_embedded\Scripts;%~dp0envs\python_embedded\Library\bin;%PATH%
SET PATH=%~dp0envs\python_embedded;%~dp0envs\python_embedded\Scripts;%~dp0envs\python_embedded\Library\bin;%PATH%
call python -m pip install %~dp0envs\TensorRT-RTX-1.3.0.35_cu129\python\tensorrt_rtx-1.3.0.35-cp310-none-win_amd64.whl
call python -m pip install -r requirements.txt --no-warn-script-location
@REM call python -m pip install --upgrade pip wheel -i https://mirrors.aliyun.com/pypi/simple/
@REM echo yes|python -m pip install nvidia-cudnn-cu12 -i https://mirrors.aliyun.com/pypi/simple/
@REM echo yes|pip install tensorrt_cu12_libs==10.11.0.33 tensorrt_cu12_bindings==10.11.0.33 tensorrt==10.11.0.33 --extra-index-url https://pypi.nvidia.com
@REM call python -m pip install -r requirements.txt --no-warn-script-location -i https://mirrors.aliyun.com/pypi/simple/
@REM if not exist "data\models" mkdir data\models
@REM echo "Downloading model zip file..."
@REM powershell -Command "(New-Object Net.WebClient).DownloadFile('https://github.com/zpeng11/ezvtuber-rt/releases/download/0.0.1/20241220.zip', '.\data\models\model.zip')"
@REM echo "Unzipping model zip file..."
@REM powershell -Command "Expand-Archive -Path '.\data\models\model.zip' -DestinationPath '.\data\models\temp' -Force; Move-Item -Path '.\data\models\temp\20241220\*' -Destination '.\data\models\' -Force; Remove-Item -Path '.\data\models\temp' -Recurse -Force"
@REM del .\data\models\model.zip
@REM @REM To verify if environment works
@REM call python ezvtb_rt_interface.py
@REM Clean up step
echo "Cleaning up .trt files in data\models directory..."
for /R %~dp0data\models %%f in (*.trt) do del "%%f"
@RD /S /Q %~dp0envs\miniconda3
pause
-1
View File
@@ -1,6 +1,5 @@
numpy
scipy
matplotlib
protobuf
pynput
mediapipe==0.10.11
+3 -8
View File
@@ -1,6 +1,6 @@
import os
import sys
from .args import args
dir_path = os.path.dirname(os.path.realpath(__file__))
ezvtb_path = os.path.join(dir_path, "..", "ezvtuber-rt")
ezvtb_main_path = os.path.join(dir_path, "..", 'ezvtuber-rt-main')
@@ -45,6 +45,7 @@ def get_core(
from ezvtb_rt.core_trt import CoreTRT as Core
except:
print("TensorRT is not available, fallback to ONNX Runtime.")
args.use_tensorrt = False
from ezvtb_rt.core_ort import CoreORT as Core
else:
from ezvtb_rt.core_ort import CoreORT as Core
@@ -68,10 +69,4 @@ def get_core(
use_eyebrow=model_use_eyebrow,
)
return core
if __name__ == '__main__':
try:
from ezvtb_rt.trt_utils import check_build_all_models
check_build_all_models()
except:
print("TensorRT not available, skip building TRT models.")
-258
View File
@@ -1,258 +0,0 @@
# from pyanime4k import ac
# import pyanime4k
#
# parameters = ac.Parameters()
# # enable HDN for ACNet
# parameters.HDN = True
#
# a = ac.AC(
# type=ac.ProcessorType.CPU_ACNet,
# )
# a.set_arguments(parameters)
import struct
import cv2
#
# img = cv2.imread("character/test41.png")
#
# a.load_image_from_numpy(img,input_type=ac.AC_INPUT_BGR)
#
# a.get_processor_info()
#
# # start processing
# a.process()
#
# a.show_image()
# import numpy as np
# import zlib
# import bz2
# import lzma
# import time
#
# postprocessed_image=np.load('out.npy')
# tic=time.perf_counter()
# res=None
# for i in range(100):
# res=zlib.compress(postprocessed_image)
# print("zlib", len(res),(time.perf_counter() - tic) * 1000)
# tic = time.perf_counter()
# for i in range(100):
# zlib.decompress(res)
# print("zlib", len(res),(time.perf_counter() - tic) * 1000)
# tic = time.perf_counter()
# for i in range(100):
# res=bz2.compress(postprocessed_image)
# print("bz2",len(res), (time.perf_counter() - tic) * 1000)
# tic = time.perf_counter()
# for i in range(100):
# bz2.decompress(res)
# print("bz2", len(res),(time.perf_counter() - tic) * 1000)
# tic = time.perf_counter()
# for i in range(100):
# res=lzma.compress(postprocessed_image)
# print("lzma",len(res), (time.perf_counter() - tic) * 1000)
# tic = time.perf_counter()
# for i in range(100):
# lzma.decompress(res)
# print("lzma", len(res),(time.perf_counter() - tic) * 1000)
# tic = time.perf_counter()
#
#
# output_frame = cv2.cvtColor(postprocessed_image, cv2.COLOR_RGBA2BGRA)
# cv2.imshow("frame", output_frame)
# cv2.waitKey(100000)
# preview upscaled image
# img=a.save_image_to_numpy()
#
# print(img)
# import cv2
# import numpy as np
#
# rgb=[
# [[1,2,3],[2,2,3],[3,2,3],[4,2,3]],
# [[1,2,3],[2,2,3],[3,2,3],[4,2,3]],
# [[1,2,3],[2,2,3],[3,2,3],[4,2,3]],
# [[1,2,3],[2,2,3],[3,2,3],[4,2,3]]
# ]
# a=[
# [1,2,3,4],
# [1,2,3,4],
# [1,2,3,4],
# [1,2,3,4],
# ]
#
# print(cv2.merge((np.array(rgb),np.array(a))))
from multiprocessing import Value, Process, Queue
import queue
import socket
import errno
import time
import tha2.poser.modes.mode_20_wx
from tha2.mocap.ifacialmocap_constants import *
import numpy as np
ifm='127.0.0.1:11573'
class ClientProcess(Process):
def __init__(self):
super().__init__()
self.queue = Queue()
self.should_terminate = Value('b', False)
self.address = ifm.split(':')[0]
self.port = int(ifm.split(':')[1])
self.perf_time = 0
# self.ifm_converter = tha2.poser.modes.mode_20_wx.create_ifacialmocap_pose_converter()
self.a_min=None
self.a_max=None
def run(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.socket.setblocking(False)
self.socket.bind(("", self.port))
self.socket.settimeout(0.1)
while True:
if self.should_terminate.value:
break
try:
socket_bytes = self.socket.recv(8192)
except socket.error as e:
err = e.args[0]
if err == errno.EAGAIN or err == errno.EWOULDBLOCK or err == 'timed out':
continue
else:
raise e
# socket_string = socket_bytes.decode("utf-8")
osf_raw=(struct.unpack('=di2f2fB1f4f3f3f68f136f210f14f',socket_bytes))
# print(osf_raw[432:])
data={}
OpenSeeDataIndex=[
'time',
'id',
'cameraResolutionW',
'cameraResolutionH',
'rightEyeOpen',
'leftEyeOpen',
'got3DPoints',
'fit3DError',
'rawQuaternionX',
'rawQuaternionY',
'rawQuaternionZ',
'rawQuaternionW',
'rawEulerX',
'rawEulerY',
'rawEulerZ',
'translationY',
'translationX',
'translationZ',
]
for i in range(len(OpenSeeDataIndex)):
data[OpenSeeDataIndex[i]]=osf_raw[i]
data['translationY']*=-1
data['translationZ']*=-1
data['rotationY']=data['rawEulerY']
data['rotationX']=(-data['rawEulerX']+180)%360
data['rotationZ']=(data['rawEulerZ']-90)
OpenSeeFeatureIndex=[
'EyeLeft',
'EyeRight',
'EyebrowSteepnessLeft',
'EyebrowUpDownLeft',
'EyebrowQuirkLeft',
'EyebrowSteepnessRight',
'EyebrowUpDownRight',
'EyebrowQuirkRight',
'MouthCornerUpDownLeft',
'MouthCornerInOutLeft',
'MouthCornerUpDownRight',
'MouthCornerInOutRight',
'MouthOpen',
'MouthWide'
]
for i in range(68):
data['confidence'+str(i)]=osf_raw[i+18]
for i in range(68):
data['pointsX'+str(i)]=osf_raw[i*2+18+68]
data['pointsY'+str(i)]=osf_raw[i*2+18+68+1]
for i in range(70):
data['points3DX'+str(i)]=osf_raw[i*3+18+68+68*2]
data['points3DY'+str(i)]=osf_raw[i*3+18+68+68*2+1]
data['points3DZ'+str(i)]=osf_raw[i*3+18+68+68*2+2]
for i in range(len(OpenSeeFeatureIndex)):
data[OpenSeeFeatureIndex[i]]=osf_raw[i+432]
# print(data['rotationX'],data['rotationY'],data['rotationZ'])
a=np.array([
data['points3DX66']-data['points3DX68']+data['points3DX67']-data['points3DX69'],
data['points3DY66']-data['points3DY68']+data['points3DY67']-data['points3DY69'],
data['points3DZ66']-data['points3DZ68']+data['points3DZ67']-data['points3DZ69']
])
a=(a/np.linalg.norm(a))
data['eyeRotationX']=a[0]
data['eyeRotationY']=a[1]
# blender_data = json.loads(socket_string)
# data = self.convert_from_blender_data(socket_string)
# data=self.ifm_converter.convert(data)
# print(data)
# if(self.a_max is None):
# self.a_max=[x for x in data]
# else:
# self.a_max=[max(data[i],self.a_max[i]) for i in range(len(data))]
# if(self.a_min is None):
# self.a_min=[x for x in data]
# else:
# self.a_min=[min(data[i],self.a_min[i]) for i in range(len(data))]
# print([[self.a_min[i],self.a_max[i]] for i in range(len(data))])
cur_time = time.perf_counter()
fps = 1 / (cur_time - self.perf_time)
self.perf_time = cur_time
# print(fps)
try:
self.queue.put_nowait(data)
except queue.Full:
pass
self.queue.close()
self.socket.close()
@staticmethod
def convert_from_blender_data(blender_data):
data = {}
for item in blender_data.split('|'):
if item.find('#') != -1:
k, arr = item.split('#')
arr = [float(n) for n in arr.split(',')]
data[k.replace("_L", "Left").replace("_R", "Right")] = arr
elif item.find('-') != -1:
k, v = item.split("-")
data[k.replace("_L", "Left").replace("_R", "Right")] = float(v) / 100
to_rad = 57.3
data[HEAD_BONE_X] = data["=head"][0] / to_rad
data[HEAD_BONE_Y] = data["=head"][1] / to_rad
data[HEAD_BONE_Z] = data["=head"][2] / to_rad
data[HEAD_BONE_QUAT] = [data["=head"][3], data["=head"][4], data["=head"][5], 1]
# print(data[HEAD_BONE_QUAT][2],min(data[EYE_BLINK_LEFT],data[EYE_BLINK_RIGHT]))
data[RIGHT_EYE_BONE_X] = data["rightEye"][0] / to_rad
data[RIGHT_EYE_BONE_Y] = data["rightEye"][1] / to_rad
data[RIGHT_EYE_BONE_Z] = data["rightEye"][2] / to_rad
data[LEFT_EYE_BONE_X] = data["leftEye"][0] / to_rad
data[LEFT_EYE_BONE_Y] = data["leftEye"][1] / to_rad
data[LEFT_EYE_BONE_Z] = data["leftEye"][2] / to_rad
return data
if __name__ == '__main__':
client_process = ClientProcess()
client_process.daemon = True
client_process.start()
while True:
pass
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
View File
File renamed without changes.
File renamed without changes.
File renamed without changes.