wsj1995 commited on
Commit
c5907c2
·
1 Parent(s): a95b7ba

feat: init

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +2 -0
  2. code-5090/.DS_Store +0 -0
  3. code-5090/5090_依赖.txt +112 -0
  4. code-5090/Dockerfile +14 -0
  5. code-5090/README.md +15 -0
  6. code-5090/README_with_dev.md +47 -0
  7. code-5090/README_with_internal.md +105 -0
  8. code-5090/README_with_outer.md +231 -0
  9. python38.tar.gz → code-5090/aaa.jpg +2 -2
  10. code-5090/app.c +0 -0
  11. code-5090/app.cpython-39-x86_64-linux-gnu.so +3 -0
  12. code-5090/app.py +244 -0
  13. code-5090/app_local.c +0 -0
  14. code-5090/app_local.cpython-39-x86_64-linux-gnu.so +3 -0
  15. code-5090/app_local.py +247 -0
  16. code-5090/app_local_interval.cpython-39-x86_64-linux-gnu.so +3 -0
  17. code-5090/batch.cpython-39-x86_64-linux-gnu.so +3 -0
  18. code-5090/config/config.ini +23 -0
  19. code-5090/data/log/dh.log +21 -0
  20. code-5090/docker-compose.yml +22 -0
  21. code-5090/face_attr_detect/__init__.py +1 -0
  22. code-5090/face_attr_detect/face_attr.cpython-39-x86_64-linux-gnu.so +3 -0
  23. code-5090/face_attr_detect/face_attr_epoch_12_220318.onnx +3 -0
  24. code-5090/face_detect_utils/.DS_Store +0 -0
  25. code-5090/face_detect_utils/__init__.py +0 -0
  26. code-5090/face_detect_utils/face_detect.cpython-39-x86_64-linux-gnu.so +3 -0
  27. code-5090/face_detect_utils/head_pose.cpython-39-x86_64-linux-gnu.so +3 -0
  28. code-5090/face_detect_utils/resources/pfpld_robust_sim_bs1_8003.onnx +3 -0
  29. code-5090/face_detect_utils/resources/scrfd_500m_bnkps_shape640x640.onnx +3 -0
  30. code-5090/face_detect_utils/scrfd.cpython-39-x86_64-linux-gnu.so +3 -0
  31. code-5090/face_lib/__init__.py +0 -0
  32. code-5090/face_lib/face_detect_and_align/__init__.py +3 -0
  33. code-5090/face_lib/face_detect_and_align/face_align_5_landmarks.cpython-39-x86_64-linux-gnu.so +3 -0
  34. code-5090/face_lib/face_detect_and_align/face_align_utils.cpython-39-x86_64-linux-gnu.so +3 -0
  35. code-5090/face_lib/face_detect_and_align/scrfd_insightface/__init__.py +5 -0
  36. code-5090/face_lib/face_detect_and_align/scrfd_insightface/scrfd.cpython-39-x86_64-linux-gnu.so +3 -0
  37. code-5090/face_lib/face_parsing/__init__.py +6 -0
  38. code-5090/face_lib/face_parsing/face_parsing_api.cpython-39-x86_64-linux-gnu.so +3 -0
  39. code-5090/face_lib/face_restore/__init__.py +2 -0
  40. code-5090/face_lib/face_restore/gfpgan_onnx/gfpgan_onnx_api.cpython-39-x86_64-linux-gnu.so +3 -0
  41. code-5090/face_restore_gfpgan_thread_cam_pipeline.cpython-39-x86_64-linux-gnu.so +3 -0
  42. code-5090/face_restore_gfpgan_thread_pipeline.cpython-39-x86_64-linux-gnu.so +3 -0
  43. code-5090/h_utils/__init__.py +9 -0
  44. code-5090/h_utils/custom.cpython-39-x86_64-linux-gnu.so +3 -0
  45. code-5090/h_utils/obs_client.cpython-39-x86_64-linux-gnu.so +3 -0
  46. code-5090/h_utils/request_utils.cpython-39-x86_64-linux-gnu.so +3 -0
  47. code-5090/h_utils/sweep_bot.cpython-39-x86_64-linux-gnu.so +3 -0
  48. code-5090/h_utils/zip_utils.cpython-39-x86_64-linux-gnu.so +3 -0
  49. code-5090/http_req/http-client.env.json +14 -0
  50. code-5090/http_req/http_api.http +18 -0
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.so filter=lfs diff=lfs merge=lfs -text
37
+ *.jpg filter=lfs diff=lfs merge=lfs -text
code-5090/.DS_Store ADDED
Binary file (6.15 kB). View file
 
code-5090/5090_依赖.txt ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ albucore==0.0.23
2
+ albumentations==2.0.5
3
+ annotated-types==0.7.0
4
+ audioread==3.0.1
5
+ Brotli==1.0.9
6
+ certifi==2025.1.31
7
+ cffi==1.17.1
8
+ charset-normalizer==3.3.2
9
+ coloredlogs==15.0.1
10
+ #contourpy==1.3.1
11
+ cupy-cuda12x==13.4.1
12
+ cycler==0.12.1
13
+ Cython==3.0.12
14
+ decorator==5.2.1
15
+ dominate==2.9.1
16
+ easydict==1.13
17
+ einops==0.8.1
18
+ fastrlock==0.8.3
19
+ ffmpeg==1.4
20
+ filelock==3.13.1
21
+ flatbuffers==25.2.10
22
+ fonttools==4.57.0
23
+ fsspec==2025.3.2
24
+ gmpy2==2.2.1
25
+ huggingface-hub==0.30.2
26
+ humanfriendly==10.0
27
+ idna==3.7
28
+ imageio==2.37.0
29
+ imageio-ffmpeg==0.5.1
30
+ insightface==0.7.3
31
+ Jinja2==3.1.6
32
+ joblib==1.4.2
33
+ kiwisolver==1.4.7
34
+ kornia==0.8.0
35
+ kornia_rs==0.1.8
36
+ lazy_loader==0.4
37
+ librosa==0.11.0
38
+ llvmlite==0.43.0
39
+ lmdb==1.6.2
40
+ MarkupSafe==3.0.2
41
+ matplotlib==3.9.4
42
+ mkl-fft==1.3.1
43
+ mkl-random==1.2.2
44
+ mkl-service==2.4.0
45
+ mpmath==1.3.0
46
+ msgpack==1.1.0
47
+ #networkx==3.2.1
48
+ #numba==0.61.2
49
+ #numpy==2.2.4
50
+ nvidia-cublas-cu12==12.8.3.14
51
+ nvidia-cuda-cupti-cu12==12.8.57
52
+ nvidia-cuda-nvrtc-cu12==12.8.61
53
+ nvidia-cuda-runtime-cu12==12.8.57
54
+ nvidia-cudnn-cu12==9.8.0.87
55
+ nvidia-cufft-cu12==11.3.3.41
56
+ nvidia-cufile-cu12==1.13.0.11
57
+ nvidia-curand-cu12==10.3.9.55
58
+ nvidia-cusolver-cu12==11.7.2.55
59
+ nvidia-cusparse-cu12==12.5.7.53
60
+ nvidia-cusparselt-cu12==0.6.3
61
+ nvidia-nccl-cu12==2.26.2
62
+ nvidia-nvjitlink-cu12==12.8.61
63
+ nvidia-nvtx-cu12==12.8.55
64
+ onnx==1.17.0
65
+ #onnxruntime-gpu==1.21.0
66
+ opencv-python==4.11.0.86
67
+ opencv-python-headless==4.11.0.86
68
+ packaging==24.2
69
+ pillow==11.1.0
70
+ pip==25.0
71
+ platformdirs==4.3.7
72
+ pooch==1.8.2
73
+ prettytable==3.16.0
74
+ protobuf==6.30.2
75
+ pycparser==2.22
76
+ pydantic==2.11.3
77
+ pydantic_core==2.33.1
78
+ pyparsing==3.2.3
79
+ PySocks==1.7.1
80
+ python-dateutil==2.9.0.post0
81
+ #pytorch-triton==3.3.0+git96316ce5
82
+ PyYAML==6.0.2
83
+ regex==2024.11.6
84
+ requests==2.32.3
85
+ safetensors==0.5.3
86
+ #scikit-image==0.25.2
87
+ scikit-learn==1.6.1
88
+ #scipy==1.15.2
89
+ setuptools==75.8.0
90
+ simsimd==6.2.1
91
+ six==1.16.0
92
+ soundfile==0.13.1
93
+ soxr==0.5.0.post1
94
+ stringzilla==3.12.3
95
+ sympy==1.13.3
96
+ threadpoolctl==3.6.0
97
+ #tifffile==2025.3.30
98
+ timm==1.0.15
99
+ tokenizers==0.20.3
100
+ #torch==2.8.0.dev20250408+cu128
101
+ #torchaudio==2.6.0.dev20250408+cu128
102
+ #torchvision==0.22.0.dev20250408+cu128
103
+ tqdm==4.67.1
104
+ transformers==4.46.2
105
+ triton==3.1.0
106
+ typeguard==2.13.3
107
+ typing_extensions==4.12.2
108
+ typing-inspection==0.4.0
109
+ urllib3==2.3.0
110
+ wcwidth==0.2.13
111
+ wheel==0.45.1
112
+ xformers==0.0.30.dev1005
code-5090/Dockerfile ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM nvidia/cuda:11.6.1-base-ubuntu20.04
2
+
3
+ # 还需要一个chk.tar.gz
4
+ WORKDIR /code
5
+ COPY . /code
6
+
7
+
8
+ RUN pip install --upgrade -r /code/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ --timeout 600
9
+
10
+ # 6、运行服务
11
+ #CMD ["uvicorn", "http_api2:app", "--host", "0.0.0.0", "--port", "80"]
12
+ EXPOSE 22
13
+ EXPOSE 80
14
+ CMD /usr/sbin/sshd -D
code-5090/README.md ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## 表情驱动
2
+
3
+ #1.入口
4
+ main.py
5
+
6
+ # 安装1.虚拟环境
7
+ conda env create -f requirements.yaml
8
+ # 安装2.nvdiffrast,进入项目根目录
9
+ cd Deep3DFaceRecon_pytorch/nvdiffrast_bk
10
+
11
+ python setup.py install
12
+ # 测试流程
13
+ python main.py
14
+ # 输出目录
15
+ test_data/output
code-5090/README_with_dev.md ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##1.提交镜像并push到服务器上
2
+ ### sdk
3
+ <pre><code>
4
+ 原始镜像: face2face_train:0.0.1_origin_sdk(12.1G)
5
+ 镜像保存为tar文件: docker save -o face2faceweb.tar bedcce862ec3
6
+ 从当前容器生成镜像:
7
+ docker commit -m="facesdk init" -a="jc" <containerId> face2facesdk:<version>
8
+ 将新镜像推到docker服务器上:
9
+ # 1. 先把本地镜像名称和tag改成公司仓库的名称
10
+ docker tag face2facesdk:<version> base.image.docker:5000/python/face2face_train:<version>_sdk
11
+ # 2. 推送修改后的镜像到公司仓库
12
+ docker push base.image.docker:5000/python/face2face_train:<version>_sdk
13
+
14
+ base.image.docker:5000/python/face2face_train:0.0.3_sdk 13.1G
15
+ python app_local.py
16
+ </code></pre>
17
+ ### sdk slim
18
+ 从源镜像到slim:
19
+ 1.pip install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple
20
+ 2.执行package: https://digital-public.obs.cn-east-3.myhuaweicloud.com/vpp/1batchSynth/2/packaging_script.py
21
+ 3. 删除build下面的临时so包
22
+ <pre><code
23
+ docker commit -m="facesdk_slim init" -a="jc" <containerId> face2facesdk_slim:<version>
24
+ docker tag face2facesdk_slim:<version> base.image.docker:5000/python/face2face_train:<version>_sdk_slim
25
+ docker push base.image.docker:5000/python/face2face_train:<version>_sdk_slim
26
+ </code></pre>
27
+ ### web
28
+ <pre><code>
29
+ docker commit -m="faceweb init" -a="jc" <containerId> face2faceweb:<version>
30
+ docker tag face2faceweb:<version> base.image.docker:5000/python/face2face_train:<version>_web
31
+ docker push base.image.docker:5000/python/face2face_train:<version>_web 550M
32
+ python -m gradio_web.gradio_test
33
+ </code></pre>
34
+
35
+ ## 2.依赖项
36
+ ```shell script
37
+ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
38
+ pip install opencv-python-headless opencv-contrib-python-headless librosa onnxruntime-gpu einops cv2box -i https://mirrors.aliyun.com/pypi/simple
39
+ pip install scikit-image matplotlib pyyaml apstone numexpr flask -i https://mirrors.aliyun.com/pypi/simple
40
+ pip install typeguard==2.13.3 -i https://mirrors.aliyun.com/pypi/simple
41
+
42
+ 365 248 275 7h4no3 GJ20230901
43
+ guiji123
44
+ 180.96.14.117 base.image.docker
45
+ docker login base.image.docker:5000
46
+ admin/Guiji@123!
47
+ ```
code-5090/README_with_internal.md ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## Build And Deploy
2
+
3
+ ###1.环境要求
4
+ 需要docker
5
+
6
+ ###2.拉取镜像
7
+ 算法镜像(13.1G): ```sudo docker pull base.image.docker:5000/python/face2face_train:0.0.2_sdk```
8
+ 算法镜像(13.9G): ```sudo docker pull base.image.docker:5000/python/face2face_train:0.0.1_sdk_slim```
9
+ web镜像(550M): ```sudo docker pull base.image.docker:5000/python/face2face_train:0.0.2_web```
10
+
11
+ ###3.创建共享目录及配置
12
+ ####1.创建共享目录
13
+ sudo mkdir -p /data/face2face/web /data/face2face/sdk
14
+ ####2.web配置: /data/face2face/web/config.ini
15
+ <pre><code>
16
+ [path]
17
+ log=/code/data/log
18
+ temp=/code/data/temp
19
+ file_name=face2face_web.log
20
+
21
+ [face2face]
22
+ submit_url=http://<实际宿主机>:8383/easy/submit
23
+ query_url=http://<实际宿主机>:8383/easy/query
24
+ </code></pre>
25
+ ####3.sdk配置: /data/face2face/sdk/config.ini
26
+ <pre><code>
27
+ [log]
28
+ log_dir = /code/data/log
29
+ log_file = dh.log
30
+
31
+ [http_server]
32
+ server_ip = 0.0.0.0
33
+ server_port = 8383
34
+
35
+ [temp]
36
+ temp_dir = /code/data/temp
37
+ clean_switch = 1
38
+
39
+ [result]
40
+ result_dir = /code/data/result
41
+ clean_switch = 0
42
+
43
+ [digital]
44
+ batch_size = 4
45
+
46
+ </code></pre>
47
+
48
+ ###4.启动镜像
49
+ 算法镜像:
50
+ <pre><code>
51
+ sudo docker run -v /data/face2face:/code/data -v /data/face2face/sdk/config.ini:/code/config/config.ini -e PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512 \
52
+ --gpus all --shm-size 8G -itd --name facesdk -p 8383:8383 \
53
+ base.image.docker:5000/python/face2face_train:0.0.3_sdk python /code/app_local.py
54
+ </code></pre>
55
+ 算法slim镜像:
56
+ <pre><code>
57
+ sudo docker run -v /data/face2face:/code/data -v /data/face2face/sdk/config.ini:/code/config/config.ini -e PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512 \
58
+ --gpus all --shm-size 8G -itd --name facesdk -p 8383:8383 \
59
+ base.image.docker:5000/python/face2face_train:0.0.1_sdk_slim python /code/app_local.py
60
+ </code></pre>
61
+ web镜像:
62
+ <pre><code>
63
+ docker run -v /data/face2face:/code/data -v /data/face2face/web/config.ini:/code/config.ini \
64
+ -itd --name faceweb -p 7862:7862 \
65
+ base.image.docker:5000/python/face2face_train:0.0.2_web python -m gradio_web.gradio_test
66
+ </code></pre>
67
+ ###5.验证
68
+ 打开浏览器,输入 http://127.0.0.1:7862 即可打开合成页面
69
+ ###6.输出目录
70
+ /data/face2face/result
71
+ 页面也可以直接下载
72
+ ###7.停止服务
73
+ sudo docker stop faceweb && sudo docker rm faceweb
74
+ sudo docker stop facesdk && sudo docker rm facesdk
75
+
76
+
77
+ ## 遇到的问题及解决方案
78
+ Q:docker run 提示 libnvidia-ml.so.1:file exists: unknown
79
+ A:需要把cuda相关数据删除:
80
+ a.删除/etc/docker/daemon.json中与nvidia相关的内容,其中删除default-runtime和runtimes两个key对应的数据
81
+ <pre><code>
82
+ {
83
+ "default-runtime": "nvidia", # 需要删除
84
+ "runtimes": { # 需要删除
85
+ "nvidia": { # 需要删除
86
+ "path": "nvidia-container-runtime", # 需要删除
87
+ "runtimeArgs": [] # 需要删除
88
+ } # 需要删除
89
+ }, # 需要删除
90
+ "registry-mirrors": ["https://nq12ot3x.mirror.aliyuncs.com"],
91
+ "insecure-registries":["base.image.docker:5080","base.image.docker:5000"],
92
+ "data-root": "/home/docker",
93
+ "log-driver":"json-file",
94
+ "log-opts":{ "max-size" :"100m","max-file":"10"}
95
+ }
96
+ </code></pre>
97
+ b.从当前image中构建新image同时删除libnvidia-ml.so.1、libcuda.so.1和libcudadebugger.so.1三个文件
98
+ <pre><code>
99
+ FROM <当前imageId>
100
+ RUN rm -rf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 /usr/lib/x86_64-linux-gnu/libcuda.so.1 /usr/lib/x86_64-linux-gnu/libcudadebugger.so.1
101
+ </code></pre>
102
+
103
+
104
+
105
+
code-5090/README_with_outer.md ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <a name="top"></a>
2
+ ## build on window with wsl and ubuntu
3
+ 文档总共分为以下几个部分:
4
+ 1.[安装、部署及卸载](#first)
5
+ 2.[测试效果、效率、资源损耗](#second)
6
+ 3.[web页面使用说明](#third)
7
+ 4.[本地SDK调用](#fourth)
8
+
9
+ <a name="first"></a>
10
+ ## 安装、部署及卸载
11
+ ### 一.环境要求及授权
12
+ a.带nvidia显卡的操作系统,显卡型号3080及以上(其他nvidia显卡也可以,效率上会受影响),显存最小8G,cuda11.6及以上
13
+ b.docker需要的环境:
14
+ - 虚拟ubuntu环境:
15
+ - 可以是通过wsl安装的ubuntu,也可以是通过vmware安装的
16
+ - 安装docker: [Install Docker Engine on Ubuntu ](https://docs.docker.com/engine/install/ubuntu/)
17
+ - 验证docker: ```sudo docker ps ```
18
+ - 安装nvidia-container-runtime: [install the nvidia-container-runtime](https://nvidia.github.io/nvidia-container-runtime/)
19
+ - 验证nvidia-container-runtime: ```sudo nvidia-container-runtime --vesion```
20
+ - 完整性验证: ```sudo docker run -it --rm --gpus all hello-world```
21
+ - powershell环境:
22
+ - 安装docker: [Install Docker Desktop on Windows] (https://docs.docker.com/desktop/install/windows-install/) 安装之后会重启操作系统
23
+ - 安装nvidia-container-runtime: [Installing CUDA Development Tools](https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/#download-the-nvidia-cuda-toolkit)
24
+ - 完整性验证: ``` docker run -it --rm --gpus all hello-world```
25
+
26
+ c.授权license(咨询服务联系人):服务启动时需要指定license.txt文件, 请提供mac地址、显卡id
27
+ 注:服务首次启动时,必须连接外网进行首次激活,激活地址见sdk得配置文件
28
+ ### 二.拉取镜像
29
+ 算法镜像(13.4G): ```sudo docker pull base.image.docker:5000/python/face2face_train:0.0.7_sdk_slim```
30
+ web镜像(550M): ```sudo docker pull base.image.docker:5000/python/face2face_train:0.0.4_web```
31
+ powershell 环境: ```sudo```命令可以不要,直接执行docker及其后面的命令即可
32
+
33
+ ### 三.创建共享目录及配置
34
+ #### 1.创建共享目录
35
+ sudo mkdir -p /data/face2face/web /data/face2face/sdk
36
+ on powershell: 创建共享目录 F:\var\f2f\web、F:\var\f2f\sdk
37
+ #### 2.web配置: /data/face2face/web/config.ini
38
+ <pre><code>
39
+ [path]
40
+ log=/code/data/log
41
+ temp=/code/data/temp
42
+ file_name=face2face_web.log
43
+
44
+ [face2face]
45
+ submit_url=http://<实际宿主机ip>:8383/easy/submit
46
+ query_url=http://<实际宿主机ip>:8383/easy/query
47
+ </code></pre>
48
+ #### 3.sdk配置: /data/face2face/sdk/config.ini
49
+ <pre><code>
50
+ [log]
51
+ log_dir = /code/data/log
52
+ log_file = dh.log
53
+
54
+ [http_server]
55
+ server_ip = 0.0.0.0
56
+ server_port = 8383
57
+
58
+ [temp]
59
+ temp_dir = /code/data/temp
60
+ clean_switch = 1
61
+
62
+ [result]
63
+ result_dir = /code/data/result
64
+ clean_switch = 0
65
+
66
+ [digital]
67
+ batch_size = 4
68
+
69
+ [register]
70
+ url = http://172.16.160.51:12120
71
+
72
+ </code></pre>
73
+ #### 4.license.txt: /data/face2face/sdk/config.ini
74
+ 将license.txt放到共享目录: /data/face2face/sdk
75
+ on powershell: F:\var\f2f\sdk
76
+
77
+
78
+ ### 四.启动镜像
79
+ 算法镜像:
80
+ - on ubuntu :
81
+ <pre><code>
82
+ sudo docker run -v /data/face2face:/code/data -v /data/face2face/sdk/config.ini:/code/config/config.ini -v /data/face2face/sdk/license.txt:/code/license.txt -e PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512 \
83
+ --gpus all --shm-size 8G -itd --name facesdk -p 8383:8383 \
84
+ base.image.docker:5000/python/face2face_train:0.0.5_sdk_slim python /code/app_local.py
85
+ </code></pre>
86
+ - on powershell :
87
+ ```shell script
88
+ docker run -v F:\var\f2f:/code/data -v F:\var\f2f\sdk/config.ini:/code/config/config.ini -v F:\var\f2f\sdk/license.txt:/code/license.txt -e PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512 \
89
+ --gpus all --shm-size 8G -itd --name facesdk -p 8383:8383 \
90
+ base.image.docker:5000/python/face2face_train:0.0.5_sdk_slim python /code/app_local.py
91
+ ```
92
+ web镜像 :
93
+ - on ubuntu:
94
+ <pre><code>
95
+ sudo docker run -v /data/face2face:/code/data -v /data/face2face/web/config.ini:/code/config.ini \
96
+ -itd --name faceweb -p 7862:7862 \
97
+ base.image.docker:5000/python/face2face_train:0.0.4_web python -m gradio_web.gradio_test
98
+ </code></pre>
99
+ - on powershell
100
+ <pre><code>
101
+ docker run -v F:\var\f2f:/code/data -v F:\var\f2f\sdk/config.ini:/code/config.ini \
102
+ -itd --name faceweb -p 7862:7862 \
103
+ base.image.docker:5000/python/face2face_train:0.0.4_web python -m gradio_web.gradio_test
104
+ </code></pre>
105
+
106
+ ### 五.验证
107
+ 打开浏览器,输入 http://127.0.0.1:7862 即可打开合成页面
108
+ ### 六.输出目录
109
+ /data/face2face/result
110
+ on powershell: F:\var\f2f\result
111
+ ### 七.停止服务
112
+ sudo docker stop faceweb && sudo docker rm faceweb
113
+ sudo docker stop facesdk && sudo docker rm facesdk
114
+ powershell 环境: ```sudo```命令可以不要,直接执行docker及其后面的命令即可
115
+ <a name="second"></a>
116
+ ## 测试效果、效率、资源损耗
117
+ 1.测试环境
118
+ 显卡:NVIDIA Geforce RTX 3090 24G cuda:12.0
119
+ cpu:Intel(R) Xeon(R) Gold 6154 CPU @ 3.00GHz
120
+ 内存:251G
121
+ 2.测试耗时如下:
122
+
123
+ | 视频 | 音频| 超分 |合成耗时 | 耗时比例(音频时长:耗时) |
124
+ | --- | --- | --- | --- | --- |
125
+ | 124s 25fps 1920*1080 10049kbps | 10s 44.1khz pcm_s161e stereo 1411kb/s | 否 | 36.569s | 1:3.657 |
126
+ | 124s 25fps 1920*1080 10049kbps | 30s 44.1khz pcm_s161e stereo 1411kb/s | 否 | 83.434s | 1:2.781 |
127
+ | 124s 25fps 1920*1080 10049kbps | 60s 44.1khz pcm_s161e stereo 1411kb/s | 否 | 125.672s | 1:2.094 |
128
+ | 124s 25fps 1920*1080 10116kbps | 10s 44.1khz pcm_s161e stereo 1411kb/s | 是 | 41.870s | 1:4.187 |
129
+ | 124s 25fps 1920*1080 10116kbps | 30s 44.1khz pcm_s161e stereo 1411kb/s | 是 | 99.241s | 1:3.308 |
130
+ | 124s 50fps 1920*1080 10049kbps | 10s 44.1khz pcm_s161e stereo 1411kb/s | 否 | 54.575s | 1:5.457 |
131
+ | 124s 50fps 1920*1080 10049kbps | 30s 44.1khz pcm_s161e stereo 1411kb/s | 否 | 126.264s | 1:4.208 |
132
+ | 124s 50fps 1920*1080 10116kbps | 10s 44.1khz pcm_s161e stereo 1411kb/s | 是 | 72.791s | 1:7.279 |
133
+ | 124s 50fps 1920*1080 10116kbps | 30s 44.1khz pcm_s161e stereo 1411kb/s | 是 | 188.021s | 1:6.267 |
134
+
135
+ 3.测试结论:
136
+ a.资源损耗:
137
+ - 显存: sdk启动时,需要加载模型,显存最高到达10.4G;稳定运行时显存不超过7G
138
+ - 内存: 最大4G
139
+ - cpu: 最大16c
140
+
141
+ b.合成效率:影响合成效率的因素主要有原始视频是否清晰、原始视频的帧率、音频时长
142
+
143
+ <a name="third"></a>
144
+ ## web页面使用说明
145
+ ![图片alt](web_demo.jpg "图片title")
146
+
147
+ 页面使用简单,主要分为左右两个模块,左侧上传模块和右侧结果模块,合成主要分为三个步骤:
148
+ 1.上传模块中需要用户点击上传视频和音频:
149
+ - 视频支持mp4格式、360p~4K、H264编码,同时建议上传正面、单人脸、无遮挡视频
150
+ - 音频支持wav格式,建议音频为实际说话人声,无背景音,不然会影响最终的口型效果
151
+
152
+ 2.点击submit按钮,即可进入合成中。
153
+ 3.只需要等待一会,合成结束后结果会在右侧展示,支持结果下载与预览
154
+ <a name="fourth"></a>
155
+ ## 本地SDK调用
156
+ 前提:本地成功部署了base.image.docker:5000/python/face2face_train:0.0.4_sdk_slim并启动成功
157
+ ### Submit a task
158
+ request:
159
+ 其中audio_url和video_url对于链接和本地文件均支持,本地文件时将文件放置在sdk的共享目录即可
160
+ <pre><code>
161
+ POST http://127.0.0.1:8383/easy/submit
162
+ Content-Type: application/json
163
+
164
+ {
165
+ "audio_url": "https://digital-public.obs.cn-east-3.myhuaweicloud.com/vpp/1batchSynth/2/10s.wav",
166
+ "video_url": "https://digital-public.obs.cn-east-3.myhuaweicloud.com/vpp/1batchSynth/2/leader_nv.mp4",
167
+ "code": "146"
168
+ }
169
+ </code></pre>
170
+
171
+ response:
172
+ <pre><code>
173
+ {
174
+ "code": 10000,
175
+ "data": {},
176
+ "msg": 10000,
177
+ "success": true
178
+ }
179
+ </code></pre>
180
+
181
+ ### Qeury a task by code
182
+ request:
183
+ <pre><code>
184
+ GET http://127.0.0.1:8383/easy/query?code=146
185
+ </code></pre>
186
+ response:
187
+ 查询结果总共分为三个阶段,建议轮询结果
188
+ 当progress为100并且存在result时,则表示结果正确
189
+ <pre><code>
190
+ {
191
+ "code": 10000,
192
+ "data": {
193
+ "code": "146",
194
+ "msg": "文件下载完成",
195
+ "progress": 10,
196
+ "result": "",
197
+ "status": 1
198
+ },
199
+ "msg": "",
200
+ "success": true
201
+ }
202
+
203
+ {
204
+ "code": 10000,
205
+ "data": {
206
+ "code": "146",
207
+ "msg": "音频特征提取完成",
208
+ "progress": 20,
209
+ "result": "",
210
+ "status": 1
211
+ },
212
+ "msg": "",
213
+ "success": true
214
+ }
215
+
216
+ {
217
+ "code": 10000,
218
+ "data": {
219
+ "code": "146",
220
+ "msg": "任务完成",
221
+ "progress": 100,
222
+ "result": "/code/data/result/146-r.mp4",
223
+ "status": 2
224
+ },
225
+ "msg": "",
226
+ "success": true
227
+ }
228
+ </code></pre>
229
+
230
+ [回到顶部](#top)
231
+
python38.tar.gz → code-5090/aaa.jpg RENAMED
File without changes
code-5090/app.c ADDED
The diff for this file is too large to render. See raw diff
 
code-5090/app.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bbd105b591693e9a22ad37a0605382f963d619cefd0cf113606e4f9cf110f453
3
+ size 1435288
code-5090/app.py ADDED
@@ -0,0 +1,244 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/user/bin/env python
2
+ # coding=utf-8
3
+ """
4
+ @project : face2face_train
5
+ @author : huyi
6
+ @file : app.py
7
+ @ide : PyCharm
8
+ @time : 2023-12-06 19:04:21
9
+ """
10
+ import os
11
+
12
+ os.chdir('/code')
13
+ import time
14
+ import traceback
15
+ from enum import Enum
16
+
17
+ from h_utils.custom import CustomError
18
+ from y_utils.logger import logger
19
+ from flask import Flask, request
20
+ from y_utils.config import GlobalConfig
21
+ from service.trans_dh_service import TransDhTask, Status
22
+
23
+ import json
24
+ import uuid
25
+ import threading
26
+ import gc
27
+
28
+ app = Flask(__name__)
29
+
30
+
31
+ class EasyResponse:
32
+ def __init__(
33
+ self,
34
+ code,
35
+ success,
36
+ msg, data: dict):
37
+ self.code = code
38
+ self.success = success
39
+ self.msg = msg
40
+ self.data = data
41
+
42
+
43
+ class ResponseCode(Enum):
44
+ system_error = [9999, '系统异常']
45
+ success = [10000, '成功']
46
+ busy = [10001, '忙碌中']
47
+ error1 = [10002, '参数异常']
48
+ error2 = [10003, '获取锁异常']
49
+ error3 = [10004, '任务不存在']
50
+
51
+
52
+ @app.route('/easy/submit', methods=['POST'])
53
+ def easy_submit():
54
+ request_data = json.loads(request.data)
55
+ try:
56
+ if 'audio_url' not in request_data or request_data['audio_url'] == '':
57
+ return json.dumps(
58
+ EasyResponse(ResponseCode.error1.value[0], False, 'audio_url参数缺失', {}),
59
+ default=lambda obj: obj.__dict__,
60
+ sort_keys=True, ensure_ascii=False,
61
+ indent=4)
62
+ if 'video_url' not in request_data or request_data['video_url'] == '':
63
+ return json.dumps(
64
+ EasyResponse(ResponseCode.error1.value[0], False, 'video_url参数缺失', {}),
65
+ default=lambda obj: obj.__dict__,
66
+ sort_keys=True, ensure_ascii=False,
67
+ indent=4)
68
+ if 'code' not in request_data or request_data['code'] == '':
69
+ return json.dumps(
70
+ EasyResponse(ResponseCode.error1.value[0], False, 'code参数缺失', {}),
71
+ default=lambda obj: obj.__dict__,
72
+ sort_keys=True, ensure_ascii=False,
73
+ indent=4)
74
+ _audio_url = request_data['audio_url']
75
+ _video_url = request_data['video_url']
76
+ _code = request_data['code']
77
+ if 'watermark_switch' not in request_data or request_data['watermark_switch'] == '':
78
+ _watermark_switch = 0
79
+ else:
80
+ if str(request_data['watermark_switch']) == '1':
81
+ _watermark_switch = 1
82
+ else:
83
+ _watermark_switch = 0
84
+ if 'digital_auth' not in request_data or request_data['digital_auth'] == '':
85
+ _digital_auth = 0
86
+ else:
87
+ if str(request_data['digital_auth']) == '1':
88
+ _digital_auth = 1
89
+ else:
90
+ _digital_auth = 0
91
+ if 'chaofen' not in request_data or request_data['chaofen'] == '':
92
+ _chaofen = 0
93
+ else:
94
+ if str(request_data['chaofen']) == '1':
95
+ _chaofen = 1
96
+ else:
97
+ _chaofen = 0
98
+ if TransDhTask.instance().run_flag:
99
+ return json.dumps(
100
+ EasyResponse(ResponseCode.busy.value[0], True, ResponseCode.busy.value[1], {}),
101
+ default=lambda obj: obj.__dict__,
102
+ sort_keys=True, ensure_ascii=False,
103
+ indent=4)
104
+ if 'pn' not in request_data or request_data['pn'] == '':
105
+ _pn = 0
106
+ else:
107
+ if str(request_data['pn']) == '1':
108
+ _pn = 1
109
+ else:
110
+ _pn = 0
111
+ if TransDhTask.instance().run_flag:
112
+ return json.dumps(
113
+ EasyResponse(ResponseCode.busy.value[0], True, ResponseCode.busy.value[1], {}),
114
+ default=lambda obj: obj.__dict__,
115
+ sort_keys=True, ensure_ascii=False,
116
+ indent=4)
117
+ else:
118
+ try:
119
+ TransDhTask.instance().run_lock.acquire()
120
+ TransDhTask.instance().run_flag = True
121
+ TransDhTask.instance().task_dic[_code] = (Status.run, 0, '', '')
122
+ except Exception as e:
123
+ traceback.print_exc()
124
+ return json.dumps(
125
+ EasyResponse(ResponseCode.error2.value[0], False, ResponseCode.error2.value[1], {}),
126
+ default=lambda obj: obj.__dict__,
127
+ sort_keys=True, ensure_ascii=False,
128
+ indent=4)
129
+ finally:
130
+ TransDhTask.instance().run_lock.release()
131
+ threading.Thread(
132
+ target=TransDhTask.instance().work,
133
+ args=(_audio_url, _video_url, _code, _watermark_switch, _digital_auth, _chaofen, _pn)).start()
134
+ return json.dumps(
135
+ EasyResponse(ResponseCode.success.value[0], True, ResponseCode.success.value[0], {}),
136
+ default=lambda obj: obj.__dict__,
137
+ sort_keys=True, ensure_ascii=False,
138
+ indent=4)
139
+ except Exception as e:
140
+ traceback.print_exc()
141
+ return json.dumps(
142
+ EasyResponse(ResponseCode.system_error.value[0], False, ResponseCode.system_error.value[1], {}),
143
+ default=lambda obj: obj.__dict__,
144
+ sort_keys=True, ensure_ascii=False,
145
+ indent=4)
146
+ finally:
147
+ gc.collect()
148
+
149
+
150
+ @app.route('/easy/query', methods=['GET'])
151
+ def easy_query():
152
+ del_flag = False
153
+ get_data = request.args.to_dict()
154
+ try:
155
+ if get_data.get('code') is None and get_data.get('code') == '':
156
+ return json.dumps(
157
+ EasyResponse(ResponseCode.error1.value[0], False, 'code参数缺失', {}),
158
+ default=lambda obj: obj.__dict__,
159
+ sort_keys=True, ensure_ascii=False,
160
+ indent=4)
161
+ _code = get_data.get('code')
162
+ if _code in TransDhTask.instance().task_dic:
163
+ _status, _progress, _result, _msg = TransDhTask.instance().task_dic[_code]
164
+ if _status == Status.run:
165
+ return json.dumps(
166
+ EasyResponse(ResponseCode.success.value[0], True, '', {
167
+ 'code': _code,
168
+ 'status': _status.value,
169
+ 'progress': _progress,
170
+ 'result': _result,
171
+ 'msg': _msg
172
+ }),
173
+ default=lambda obj: obj.__dict__,
174
+ sort_keys=True, ensure_ascii=False,
175
+ indent=4)
176
+ elif _status == Status.success:
177
+ del_flag = True
178
+ return json.dumps(
179
+ EasyResponse(ResponseCode.success.value[0], True, '', {
180
+ 'code': _code,
181
+ 'status': _status.value,
182
+ 'progress': _progress,
183
+ 'result': _result,
184
+ 'msg': _msg
185
+ }),
186
+ default=lambda obj: obj.__dict__,
187
+ sort_keys=True, ensure_ascii=False,
188
+ indent=4)
189
+ elif _status == Status.error:
190
+ del_flag = True
191
+ return json.dumps(
192
+ EasyResponse(ResponseCode.success.value[0], True, '', {
193
+ 'code': _code,
194
+ 'status': _status.value,
195
+ 'progress': _progress,
196
+ 'result': _result,
197
+ 'msg': _msg
198
+ }),
199
+ default=lambda obj: obj.__dict__,
200
+ sort_keys=True, ensure_ascii=False, indent=4)
201
+ else:
202
+ return json.dumps(
203
+ EasyResponse(ResponseCode.error3.value[0], True, ResponseCode.error3.value[1], {}),
204
+ default=lambda obj: obj.__dict__,
205
+ sort_keys=True, ensure_ascii=False,
206
+ indent=4)
207
+ except Exception as e:
208
+ traceback.print_exc()
209
+ return json.dumps(
210
+ EasyResponse(ResponseCode.system_error.value[0], False, ResponseCode.system_error.value[1], {}),
211
+ default=lambda obj: obj.__dict__,
212
+ sort_keys=True, ensure_ascii=False,
213
+ indent=4)
214
+ finally:
215
+ if del_flag:
216
+ try:
217
+ TransDhTask.instance().run_lock.acquire()
218
+ del TransDhTask.instance().task_dic[_code]
219
+ TransDhTask.instance().run_lock.release()
220
+ except Exception as e:
221
+ traceback.print_exc()
222
+ return json.dumps(
223
+ EasyResponse(ResponseCode.error3.value[0], True, ResponseCode.error3.value[1], {}),
224
+ default=lambda obj: obj.__dict__,
225
+ sort_keys=True, ensure_ascii=False,
226
+ indent=4)
227
+
228
+
229
+ if __name__ == '__main__':
230
+ TransDhTask.instance()
231
+ time.sleep(15)
232
+ logger.info("******************* TransDhServer服务启动 *******************")
233
+ if not os.path.exists(GlobalConfig.instance().temp_dir):
234
+ logger.info("创建临时目录")
235
+ os.makedirs(GlobalConfig.instance().temp_dir)
236
+ if not os.path.exists(GlobalConfig.instance().result_dir):
237
+ logger.info("创建结果目录")
238
+ os.makedirs(GlobalConfig.instance().result_dir)
239
+
240
+ app.run(
241
+ host=str(GlobalConfig.instance().server_ip),
242
+ port=int(GlobalConfig.instance().server_port),
243
+ debug=False,
244
+ threaded=False)
code-5090/app_local.c ADDED
The diff for this file is too large to render. See raw diff
 
code-5090/app_local.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:42f511515f7623b0b030c26ae8956702963f6e33fc215f9fbd6fe1c32219f4ec
3
+ size 1434488
code-5090/app_local.py ADDED
@@ -0,0 +1,247 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/user/bin/env python
2
+ # coding=utf-8
3
+ """
4
+ @project : face2face_train
5
+ @author : huyi
6
+ @file : app.py
7
+ @ide : PyCharm
8
+ @time : 2023-12-06 19:04:21
9
+ """
10
+ import spaces
11
+ import os
12
+
13
+ os.chdir('/code')
14
+ import time
15
+ import traceback
16
+ from enum import Enum
17
+
18
+ from y_utils.logger import logger
19
+ from flask import Flask, request
20
+ from y_utils.config import GlobalConfig
21
+ from service.trans_dh_service import TransDhTask, Status,a
22
+
23
+ import json
24
+ import threading
25
+ import gc
26
+ import cv2
27
+
28
+ app = Flask(__name__)
29
+
30
+
31
+ class EasyResponse:
32
+ def __init__(
33
+ self,
34
+ code,
35
+ success,
36
+ msg, data: dict):
37
+ self.code = code
38
+ self.success = success
39
+ self.msg = msg
40
+ self.data = data
41
+
42
+
43
+ class ResponseCode(Enum):
44
+ system_error = [9999, '系统异常']
45
+ success = [10000, '成功']
46
+ busy = [10001, '忙碌中']
47
+ error1 = [10002, '参数异常']
48
+ error2 = [10003, '获取锁异常']
49
+ error3 = [10004, '任务不存在']
50
+
51
+ @app.route('/easy/submit', methods=['POST'])
52
+ @spaces.GPU
53
+ def easy_submit():
54
+ request_data = json.loads(request.data)
55
+ try:
56
+ if 'audio_url' not in request_data or request_data['audio_url'] == '':
57
+ return json.dumps(
58
+ EasyResponse(ResponseCode.error1.value[0], False, 'audio_url参数缺失', {}),
59
+ default=lambda obj: obj.__dict__,
60
+ sort_keys=True, ensure_ascii=False,
61
+ indent=4)
62
+ if 'video_url' not in request_data or request_data['video_url'] == '':
63
+ return json.dumps(
64
+ EasyResponse(ResponseCode.error1.value[0], False, 'video_url参数缺失', {}),
65
+ default=lambda obj: obj.__dict__,
66
+ sort_keys=True, ensure_ascii=False,
67
+ indent=4)
68
+ if 'code' not in request_data or request_data['code'] == '':
69
+ return json.dumps(
70
+ EasyResponse(ResponseCode.error1.value[0], False, 'code参数缺失', {}),
71
+ default=lambda obj: obj.__dict__,
72
+ sort_keys=True, ensure_ascii=False,
73
+ indent=4)
74
+ _audio_url = request_data['audio_url']
75
+ _video_url = request_data['video_url']
76
+ _code = request_data['code']
77
+
78
+ if 'watermark_switch' not in request_data or request_data['watermark_switch'] == '':
79
+ _watermark_switch = 0
80
+ else:
81
+ if str(request_data['watermark_switch']) == '1':
82
+ _watermark_switch = 1
83
+ else:
84
+ _watermark_switch = 0
85
+ if 'digital_auth' not in request_data or request_data['digital_auth'] == '':
86
+ _digital_auth = 0
87
+ else:
88
+ if str(request_data['digital_auth']) == '1':
89
+ _digital_auth = 1
90
+ else:
91
+ _digital_auth = 0
92
+ if 'chaofen' not in request_data or request_data['chaofen'] == '':
93
+ _chaofen = 0
94
+ else:
95
+ if str(request_data['chaofen']) == '1':
96
+ _chaofen = 1
97
+ else:
98
+ _chaofen = 0
99
+ if TransDhTask.instance().run_flag:
100
+ return json.dumps(
101
+ EasyResponse(ResponseCode.busy.value[0], True, ResponseCode.busy.value[1], {}),
102
+ default=lambda obj: obj.__dict__,
103
+ sort_keys=True, ensure_ascii=False,
104
+ indent=4)
105
+ if 'pn' not in request_data or request_data['pn'] == '':
106
+ _pn = 1
107
+ else:
108
+ if str(request_data['pn']) == '1':
109
+ _pn = 1
110
+ else:
111
+ _pn = 0
112
+ if TransDhTask.instance().run_flag:
113
+ return json.dumps(
114
+ EasyResponse(ResponseCode.busy.value[0], True, ResponseCode.busy.value[1], {}),
115
+ default=lambda obj: obj.__dict__,
116
+ sort_keys=True, ensure_ascii=False,
117
+ indent=4)
118
+ else:
119
+ try:
120
+ TransDhTask.instance().run_lock.acquire()
121
+ TransDhTask.instance().run_flag = True
122
+ TransDhTask.instance().task_dic[_code] = (Status.run, 0, '', '')
123
+ except Exception as e:
124
+ traceback.print_exc()
125
+ return json.dumps(
126
+ EasyResponse(ResponseCode.error2.value[0], False, ResponseCode.error2.value[1], {}),
127
+ default=lambda obj: obj.__dict__,
128
+ sort_keys=True, ensure_ascii=False,
129
+ indent=4)
130
+ finally:
131
+ TransDhTask.instance().run_lock.release()
132
+
133
+ threading.Thread(
134
+ target=TransDhTask.instance().work,
135
+ args=(_audio_url, _video_url, _code, _watermark_switch, _digital_auth, _chaofen, _pn)).start()
136
+ return json.dumps(
137
+ EasyResponse(ResponseCode.success.value[0], True, ResponseCode.success.value[0], {}),
138
+ default=lambda obj: obj.__dict__,
139
+ sort_keys=True, ensure_ascii=False,
140
+ indent=4)
141
+ except Exception as e:
142
+ traceback.print_exc()
143
+ return json.dumps(
144
+ EasyResponse(ResponseCode.system_error.value[0], False, ResponseCode.system_error.value[1], {}),
145
+ default=lambda obj: obj.__dict__,
146
+ sort_keys=True, ensure_ascii=False,
147
+ indent=4)
148
+ finally:
149
+ gc.collect()
150
+
151
+
152
+ @app.route('/easy/query', methods=['GET'])
153
+ def easy_query():
154
+ del_flag = False
155
+ get_data = request.args.to_dict()
156
+ try:
157
+ if get_data.get('code') is None and get_data.get('code') == '':
158
+ return json.dumps(
159
+ EasyResponse(ResponseCode.error1.value[0], False, 'code参数缺失', {}),
160
+ default=lambda obj: obj.__dict__,
161
+ sort_keys=True, ensure_ascii=False,
162
+ indent=4)
163
+ _code = get_data.get('code')
164
+ if _code in TransDhTask.instance().task_dic:
165
+ _status, _progress, _result, _msg = TransDhTask.instance().task_dic[_code]
166
+ if _status == Status.run:
167
+ return json.dumps(
168
+ EasyResponse(ResponseCode.success.value[0], True, '', {
169
+ 'code': _code,
170
+ 'status': _status.value,
171
+ 'progress': _progress,
172
+ 'result': _result,
173
+ 'msg': _msg
174
+ }),
175
+ default=lambda obj: obj.__dict__,
176
+ sort_keys=True, ensure_ascii=False,
177
+ indent=4)
178
+ elif _status == Status.success:
179
+ del_flag = True
180
+ return json.dumps(
181
+ EasyResponse(ResponseCode.success.value[0], True, '', {
182
+ 'code': _code,
183
+ 'status': _status.value,
184
+ 'progress': _progress,
185
+ 'result': _result,
186
+ 'msg': _msg
187
+ }),
188
+ default=lambda obj: obj.__dict__,
189
+ sort_keys=True, ensure_ascii=False,
190
+ indent=4)
191
+ elif _status == Status.error:
192
+ del_flag = True
193
+ return json.dumps(
194
+ EasyResponse(ResponseCode.success.value[0], True, '', {
195
+ 'code': _code,
196
+ 'status': _status.value,
197
+ 'progress': _progress,
198
+ 'result': _result,
199
+ 'msg': _msg
200
+ }),
201
+ default=lambda obj: obj.__dict__,
202
+ sort_keys=True, ensure_ascii=False, indent=4)
203
+ else:
204
+ return json.dumps(
205
+ EasyResponse(ResponseCode.error3.value[0], True, ResponseCode.error3.value[1], {}),
206
+ default=lambda obj: obj.__dict__,
207
+ sort_keys=True, ensure_ascii=False,
208
+ indent=4)
209
+ except Exception as e:
210
+ traceback.print_exc()
211
+ return json.dumps(
212
+ EasyResponse(ResponseCode.system_error.value[0], False, ResponseCode.system_error.value[1], {}),
213
+ default=lambda obj: obj.__dict__,
214
+ sort_keys=True, ensure_ascii=False,
215
+ indent=4)
216
+ finally:
217
+ if del_flag:
218
+ try:
219
+ TransDhTask.instance().run_lock.acquire()
220
+ del TransDhTask.instance().task_dic[_code]
221
+ TransDhTask.instance().run_lock.release()
222
+ except Exception as e:
223
+ traceback.print_exc()
224
+ return json.dumps(
225
+ EasyResponse(ResponseCode.error3.value[0], True, ResponseCode.error3.value[1], {}),
226
+ default=lambda obj: obj.__dict__,
227
+ sort_keys=True, ensure_ascii=False,
228
+ indent=4)
229
+
230
+
231
+ if __name__ == '__main__':
232
+ a()
233
+ TransDhTask.instance()
234
+ time.sleep(15)
235
+ logger.info("******************* TransDhServer服务启动 *******************")
236
+ if not os.path.exists(GlobalConfig.instance().temp_dir):
237
+ logger.info("创建临时目录")
238
+ os.makedirs(GlobalConfig.instance().temp_dir)
239
+ if not os.path.exists(GlobalConfig.instance().result_dir):
240
+ logger.info("创建结果目录")
241
+ os.makedirs(GlobalConfig.instance().result_dir)
242
+
243
+ app.run(
244
+ host=str(GlobalConfig.instance().server_ip),
245
+ port=int(GlobalConfig.instance().server_port),
246
+ debug=False,
247
+ threaded=False)
code-5090/app_local_interval.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a9bcb76f5fcf7df65b5f04a4ad51aefa4fa99d48f35750d95c29e02243041b2f
3
+ size 1398152
code-5090/batch.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:52127076ba3fb906d7af85964d07492d6b80966e5ee208e5ecd5e38658cf2d63
3
+ size 108568
code-5090/config/config.ini ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [log]
2
+ log_dir = /code/data/log
3
+ log_file = dh.log
4
+
5
+ [http_server]
6
+ server_ip = 0.0.0.0
7
+ server_port = 8383
8
+
9
+ [temp]
10
+ temp_dir = /code/data/temp
11
+ clean_switch = 1
12
+
13
+ [result]
14
+ result_dir = /code/data/result
15
+ clean_switch = 0
16
+
17
+ [digital]
18
+ batch_size = 30
19
+
20
+ [register]
21
+ url = http://172.16.160.51:12120
22
+ report_interval = 30
23
+ enable=0
code-5090/data/log/dh.log ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [2025-05-12 16:18:22,333] [cv_logging.py[line:27]] [INFO] [Use default multi mode: multi-thread, or you can set env 'CV_MULTI_MODE' to multi-process/torch-process]
2
+ [2025-05-12 16:18:34,084] [app_local.py[line:230]] [WARNING] [ -> 服务不进行注册]
3
+ [2025-05-12 16:18:34,084] [app_local.py[line:231]] [INFO] [TransDhTask init]
4
+ [2025-05-12 16:18:45,230] [cv_logging.py[line:27]] [INFO] [Use default multi mode: multi-thread, or you can set env 'CV_MULTI_MODE' to multi-process/torch-process]
5
+ [2025-05-12 16:18:47,909] [app_local.py[line:230]] [WARNING] [ -> 服务不进行注册]
6
+ [2025-05-12 16:18:47,909] [app_local.py[line:231]] [INFO] [TransDhTask init]
7
+ [2025-05-12 16:18:55,037] [cv_logging.py[line:27]] [INFO] [Use default multi mode: multi-thread, or you can set env 'CV_MULTI_MODE' to multi-process/torch-process]
8
+ [2025-05-12 16:18:57,325] [app_local.py[line:230]] [WARNING] [ -> 服务不进行注册]
9
+ [2025-05-12 16:18:57,325] [app_local.py[line:231]] [INFO] [TransDhTask init]
10
+ [2025-05-12 16:19:04,834] [cv_logging.py[line:27]] [INFO] [Use default multi mode: multi-thread, or you can set env 'CV_MULTI_MODE' to multi-process/torch-process]
11
+ [2025-05-12 16:19:07,502] [app_local.py[line:230]] [WARNING] [ -> 服务不进行注册]
12
+ [2025-05-12 16:19:07,502] [app_local.py[line:231]] [INFO] [TransDhTask init]
13
+ [2025-05-12 16:19:14,675] [cv_logging.py[line:27]] [INFO] [Use default multi mode: multi-thread, or you can set env 'CV_MULTI_MODE' to multi-process/torch-process]
14
+ [2025-05-12 16:19:17,393] [app_local.py[line:230]] [WARNING] [ -> 服务不进行注册]
15
+ [2025-05-12 16:19:17,393] [app_local.py[line:231]] [INFO] [TransDhTask init]
16
+ [2025-05-12 16:19:25,850] [cv_logging.py[line:27]] [INFO] [Use default multi mode: multi-thread, or you can set env 'CV_MULTI_MODE' to multi-process/torch-process]
17
+ [2025-05-12 16:19:28,075] [app_local.py[line:230]] [WARNING] [ -> 服务不进行注册]
18
+ [2025-05-12 16:19:28,075] [app_local.py[line:231]] [INFO] [TransDhTask init]
19
+ [2025-05-12 16:19:36,846] [cv_logging.py[line:27]] [INFO] [Use default multi mode: multi-thread, or you can set env 'CV_MULTI_MODE' to multi-process/torch-process]
20
+ [2025-05-12 16:19:39,085] [app_local.py[line:230]] [WARNING] [ -> 服务不进行注册]
21
+ [2025-05-12 16:19:39,085] [app_local.py[line:231]] [INFO] [TransDhTask init]
code-5090/docker-compose.yml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: '3.8'
2
+
3
+ services:
4
+ facesdk:
5
+ image: base.image.docker:5000/python/face2face_train:0.0.7_sdk_slim
6
+ container_name: facesdk
7
+ privileged: true
8
+ volumes:
9
+ - d:\face2face:/code/data
10
+ - d:\face2face\sdk/config.ini:/code/config/config.ini
11
+ - d:\face2face\sdk/license.txt:/code/license.txt
12
+ environment:
13
+ - PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512
14
+ deploy:
15
+ resources:
16
+ reservations:
17
+ devices:
18
+ - capabilities: [gpu]
19
+ shm_size: '8g'
20
+ ports:
21
+ - "8383:8383"
22
+ command: python /code/app_local.py
code-5090/face_attr_detect/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ from .face_attr import FaceAttr
code-5090/face_attr_detect/face_attr.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6d933036233cd826611f94e6b4bf9c51ef18755340410af071f03b0fd036cd21
3
+ size 400880
code-5090/face_attr_detect/face_attr_epoch_12_220318.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0fa6604beacd1e560ffc4cae6fa1537591d5f1a765a9f55473a295a1d22da3af
3
+ size 3723167
code-5090/face_detect_utils/.DS_Store ADDED
Binary file (6.15 kB). View file
 
code-5090/face_detect_utils/__init__.py ADDED
File without changes
code-5090/face_detect_utils/face_detect.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c0d142a32d76b9bb1afd186bed048ee8264bf5a817d0396f0a4ce26156c6c7b3
3
+ size 799576
code-5090/face_detect_utils/head_pose.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f901a9aa4321eb949398ffb6b2390a7b7068b8de9017310ee216bfc9c28169b8
3
+ size 679216
code-5090/face_detect_utils/resources/pfpld_robust_sim_bs1_8003.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8bd9913817152831562cccde7e51ed431d1cf4547d8f21e0876b58a0d82baa55
3
+ size 6889235
code-5090/face_detect_utils/resources/scrfd_500m_bnkps_shape640x640.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b467f878e26ff1e7ee05cd9936fdff63fa2a5af5d732ed17ee231f2dd5cc07ae
3
+ size 2524648
code-5090/face_detect_utils/scrfd.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4a29cf69c9d3df4c669fea04ba2d3320814ba9ba98df93995043754c6d0f34b0
3
+ size 1723736
code-5090/face_lib/__init__.py ADDED
File without changes
code-5090/face_lib/face_detect_and_align/__init__.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from .face_align_5_landmarks import FaceDetect5Landmarks
2
+ from .face_align_utils import estimate_norm
3
+
code-5090/face_lib/face_detect_and_align/face_align_5_landmarks.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d70fed7a4a31fc89fa39e96ebafb162d04c01d841b6f4da9b59a390fe8951d18
3
+ size 972896
code-5090/face_lib/face_detect_and_align/face_align_utils.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:398f7f7202392de6b25f35b7f6b3f6bea32ee780bb019082fa8eb1c0bcdc5d4c
3
+ size 967256
code-5090/face_lib/face_detect_and_align/scrfd_insightface/__init__.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # -- coding: utf-8 --
2
+ # @Time : 2021/11/10
3
+
4
+
5
+ from .scrfd import SCRFD
code-5090/face_lib/face_detect_and_align/scrfd_insightface/scrfd.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2d825dfa47071e0e667511b3330d0ee158d876b04dd99e1c623f267dfd13a9c2
3
+ size 1467080
code-5090/face_lib/face_parsing/__init__.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ # -- coding: utf-8 --
2
+ # @Time : 2022/3/29
3
+
4
+
5
+ from .face_parsing_api import FaceParsing
6
+ # from .dfl_xseg_net import XsegNet
code-5090/face_lib/face_parsing/face_parsing_api.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b3d88775fc6918c3e4b58d8f2c7e0a947bb7f146807f10454f5de8e6d3e17e1b
3
+ size 797232
code-5090/face_lib/face_restore/__init__.py ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+
2
+ from .gfpgan_onnx.gfpgan_onnx_api import GFPGAN
code-5090/face_lib/face_restore/gfpgan_onnx/gfpgan_onnx_api.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5f4a19e5d38750f84dbf30e8b987ffe1d607f9f1a01e6913f2ce46efd8a27bff
3
+ size 451848
code-5090/face_restore_gfpgan_thread_cam_pipeline.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:71b09f10f21e484574372fbd29eb67175d2b2748f384d2e8e92c4e0fb7737010
3
+ size 1008208
code-5090/face_restore_gfpgan_thread_pipeline.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4042f268595dbd52c597d01c07a10802cd852139f13a017800af92035ad7be6c
3
+ size 1176184
code-5090/h_utils/__init__.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ #!/user/bin/env python
2
+ # coding=utf-8
3
+ """
4
+ @project : dhp-service
5
+ @author : huyi
6
+ @file : __init__.py.py
7
+ @ide : PyCharm
8
+ @time : 2021-08-18 15:45:13
9
+ """
code-5090/h_utils/custom.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:51479d9416a2e85154784fc03661f0712e9e9384530c5a58c7610f8e0823e3aa
3
+ size 249168
code-5090/h_utils/obs_client.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8bbd2b9c6680513b38f4682c150aa1328c07d5bab463f6a5ba74aab9641a1c12
3
+ size 763368
code-5090/h_utils/request_utils.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9c08cfb2a8511c84a6f38cab9b5f98531c0ccbbe8e4443ceb769005d455a0023
3
+ size 793992
code-5090/h_utils/sweep_bot.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f84280033bdff79999642a7c9d4d429d0cac8c0681f52260baf43deedca66a80
3
+ size 471384
code-5090/h_utils/zip_utils.cpython-39-x86_64-linux-gnu.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f2a037e78bd3def7e7cb45ea2ef08b06e407f9d135b9b63e2d81cbae4f4f15fb
3
+ size 539808
code-5090/http_req/http-client.env.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "local": {
3
+ "host": "127.0.0.1",
4
+ "port": 8081
5
+ },
6
+ "192.168.4.42": {
7
+ "host": "192.168.4.42",
8
+ "port": 10058
9
+ },
10
+ "172.16.103.26": {
11
+ "host": "172.16.103.26",
12
+ "port": 8000
13
+ }
14
+ }
code-5090/http_req/http_api.http ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### 查询任务
2
+ #GET http://10.2.3.51:10066/easy/query?code=146
3
+ GET http://10.2.3.51:8383/easy/query?code=147
4
+
5
+
6
+ ### 提交任务
7
+ #POST http://10.2.3.51:10066/easy/submit
8
+ POST http://10.2.3.51:8383/easy/submit
9
+ Content-Type: application/json
10
+
11
+ {
12
+ "audio_url": "https://digital-public.obs.cn-east-3.myhuaweicloud.com/dh_news/wave/20240227165902_bd_tts_request_1709024766569.wav",
13
+ "video_url": "https://digital-public.obs.cn-east-3.myhuaweicloud.com/vpp/1batchSynth/2/cut_1080.mp4",
14
+ "code": "147"
15
+ }
16
+
17
+ ###
18
+