简述
最近在使用sadTalker的时候,发现视频增强环节异常的慢,30秒的视频需要耗时16min左右,极大的影响体验,于是想通过多进程、多线程、tensorrt、onnx等方式加速。最终将16min缩减到了6min,可是很遗憾还是不够快。写这边文章主要记录一下tensorrt的加速操作,希望能给大家提供帮助。
操作过程
首先得你环境中必须已经安装了tensorrt,如果你的环境没有安装,可以参考下面链接安装一下:
然后我用下面这个项目来完成torch到tensorrt的转化:
GitHub - bychen7/Face-Restoration-TensorRT: A simple face restoration TensorRT deployment solution.
这个项目也是有限制的,他的输出是512*512的,所以你肯定得不到长方形的图片,如果你想得到长方形图片,只能用拼接的方式。
这个项目安装和使用也很简单,这个项目的readme也都写了。
我也稍微对demo.cpp改造了一下:
批处理
我们可以提前将图片存储在一个文件中,然后用这个工程批处理图片,这样可以一定程度上减少在python代码中的耗时。
#include <chrono>
#include <string>
#include <iostream>
#include <fstream>
#include <opencv2/opencv.hpp>
#include "face_restoration.hpp"
// #define DEVICE 0 // GPU id
int main(int argc, char **argv) {
if (argc != 8 || std::string(argv[2]) != "-i") {
std::cerr << "arguments not right!" << std::endl;
std::cerr << "For Example:" << std::endl;
std::cerr << "./demo ../models/model.engine -i ../images/filelist -d 1 -o out/" << std::endl;
return -1;
}
std::string device_str = argv[5];
const int device = std::stoi(device_str);
cudaSetDevice(device);
const std::string engine_file_path = argv[1];
const std::string input_image_path = argv[3];
const std::string out_image_path = argv[7];
std::ifstream inputFile(input_image_path);
if (!inputFile.is_open()) {
std::cerr << "Failed to open file A.txt" << std::endl;
return 1;
}
FaceRestoration sample = FaceRestoration(engine_file_path);
std::string line;
while (std::getline(inputFile, line)) {
if (!line.empty()) {
cv::Mat img = cv::imread(line);
cv::Mat res;
size_t position = line.find_last_of("/\\");
std::string img_name = line.substr(position+1, line.length()-position-1);
// warm up
for (int i = 0; i < 10; i++) {
sample.infer(img, res);
}
float times = 0.0;
int count = 0;
for (int i = 0; i < 100; i++) {
auto start = std::chrono::system_clock::now();
sample.infer(img, res);
auto end = std::chrono::system_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
// std::cout << "count: " << count << std::endl;
times += elapsed;
count++;
}
std::cout << "times: " << times / count / 1000 << " ms" << std::endl;
cv::imwrite(out_image_path+'/'+img_name, res);
}
}
return 0;
}
##
祝你好运
# 有问题可以进群聊聊
614809646 qq群->数字人和tts,运维、开发等等