GFGAN模型加速

简述

最近在使用sadTalker的时候,发现视频增强环节异常的慢,30秒的视频需要耗时16min左右,极大的影响体验,于是想通过多进程、多线程、tensorrt、onnx等方式加速。最终将16min缩减到了6min,可是很遗憾还是不够快。写这边文章主要记录一下tensorrt的加速操作,希望能给大家提供帮助。

操作过程

首先得你环境中必须已经安装了tensorrt,如果你的环境没有安装,可以参考下面链接安装一下:

Tensorrt安装及使用(python版本) - 知乎

然后我用下面这个项目来完成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,运维、开发等等

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值