LaMa Image Inpainting 图像修复 OnnxRuntime-GPU版 Demo

news2024/11/19 15:22:37

目录

介绍

效果 

模型信息

项目

代码

下载


LaMa Image Inpainting 图像修复 OnnxRuntime-GPU版 Demo

介绍

gihub地址:GitHub - advimman/lama: 🦙 LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WACV 2022

🦙 LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WACV 2022

效果 

CPU推理效果

GPU推理效果

模型信息

Model Properties
-------------------------
---------------------------------------------------------------

Inputs
-------------------------
name:image
tensor:Float[1, 3, 1000, 1504]
name:mask
tensor:Float[1, 1, 1000, 1504]
---------------------------------------------------------------

Outputs
-------------------------
name:inpainted
tensor:Float[1, 1000, 1504, 3]
---------------------------------------------------------------

项目

安装包及版本如下:

环境:

NVIDIA GeForce RTX 4060 Laptop GPU

cuda12.1+cudnn 8.8.1

代码

using OpenCvSharp;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;

namespace Onnx_Demo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string image_path = "";
        string image_path_mask = "";
        string model_path;
        Mat image;
        Mat image_mask;
        LaMa laMa;

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
            pictureBox1.Image = null;
            image_path = ofd.FileName;
            pictureBox1.Image = new Bitmap(image_path);
            textBox1.Text = "";
            image = new Mat(image_path);
            pictureBox2.Image = null;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (image_path == "")
            {
                return;
            }

            button2.Enabled = false;
            pictureBox2.Image = null;
            textBox1.Text = "";
            Application.DoEvents();

            image = new Mat(image_path);
            image_mask = new Mat(image_path_mask);

            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            Mat result = laMa.Run(image,image_mask);

            double costTime = stopwatch.Elapsed.TotalMilliseconds;

            if (chkUseGPU.Checked)
            {
                textBox1.Text = "GPU推理耗时:" + costTime + "ms";
            }
            else {
                textBox1.Text = "CPU推理耗时:" + costTime + "ms";
            }

            if (pictureBox2.Image!=null)
            {
                pictureBox2.Image.Dispose();
            }
            pictureBox2.Image = new Bitmap(result.ToMemoryStream());
            button2.Enabled = true;

            image_mask.Dispose();
            image.Dispose();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            model_path = "model/big_lama_regular_inpaint.onnx";
            laMa = new LaMa(model_path);

            image_path = "test_img/test.jpg";
            pictureBox1.Image = new Bitmap(image_path);

            image_path_mask = "test_img/mask.jpg";
            pictureBox3.Image = new Bitmap(image_path_mask);
        }

        private void chkUseGPU_CheckedChanged(object sender, EventArgs e)
        {
            if (chkUseGPU.Checked)
            {
                Program.useGPU = true;
                laMa = new LaMa(model_path);
            }
            else
            {
                Program.useGPU = false;
                laMa = new LaMa(model_path);
            }
        }
    }
}
 

using OpenCvSharp;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;

namespace Onnx_Demo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string image_path = "";
        string image_path_mask = "";
        string model_path;
        Mat image;
        Mat image_mask;
        LaMa laMa;

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
            pictureBox1.Image = null;
            image_path = ofd.FileName;
            pictureBox1.Image = new Bitmap(image_path);
            textBox1.Text = "";
            image = new Mat(image_path);
            pictureBox2.Image = null;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (image_path == "")
            {
                return;
            }

            button2.Enabled = false;
            pictureBox2.Image = null;
            textBox1.Text = "";
            Application.DoEvents();

            image = new Mat(image_path);
            image_mask = new Mat(image_path_mask);

            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            Mat result = laMa.Run(image,image_mask);

            double costTime = stopwatch.Elapsed.TotalMilliseconds;

            if (chkUseGPU.Checked)
            {
                textBox1.Text = "GPU推理耗时:" + costTime + "ms";
            }
            else {
                textBox1.Text = "CPU推理耗时:" + costTime + "ms";
            }

            if (pictureBox2.Image!=null)
            {
                pictureBox2.Image.Dispose();
            }
            pictureBox2.Image = new Bitmap(result.ToMemoryStream());
            button2.Enabled = true;

            image_mask.Dispose();
            image.Dispose();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            model_path = "model/big_lama_regular_inpaint.onnx";
            laMa = new LaMa(model_path);

            image_path = "test_img/test.jpg";
            pictureBox1.Image = new Bitmap(image_path);

            image_path_mask = "test_img/mask.jpg";
            pictureBox3.Image = new Bitmap(image_path_mask);
        }

        private void chkUseGPU_CheckedChanged(object sender, EventArgs e)
        {
            if (chkUseGPU.Checked)
            {
                Program.useGPU = true;
                laMa = new LaMa(model_path);
            }
            else
            {
                Program.useGPU = false;
                laMa = new LaMa(model_path);
            }
        }
    }
}

Common.cs

using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Onnx_Demo
{
    internal class Common
    {
        public static void Preprocess(Mat image, Mat image_mask,  Tensor<float> input_tensor, Tensor<float> input_tensor_mask)
        {
            Cv2.Resize(image, image, new OpenCvSharp.Size(1504, 1000));
            // 输入Tensor
            for (int y = 0; y < image.Height; y++)
            {
                for (int x = 0; x < image.Width; x++)
                {
                    input_tensor[0, 0, y, x] = image.At<Vec3b>(y, x)[0] / 255.0f;
                    input_tensor[0, 1, y, x] = image.At<Vec3b>(y, x)[1] / 255.0f;
                    input_tensor[0, 2, y, x] = image.At<Vec3b>(y, x)[2] / 255.0f;
                }
            }

            Cv2.Resize(image_mask, image_mask, new OpenCvSharp.Size(1504, 1000));
            //膨胀核函数
            Mat element1 = new Mat();
            OpenCvSharp.Size size1 = new OpenCvSharp.Size(11, 11);
            element1 = Cv2.GetStructuringElement(MorphShapes.Rect, size1);

            //膨胀一次,让轮廓突出
            Mat dilation = new Mat();
            Cv2.Dilate(image_mask, image_mask, element1);

            //输入Tensor
            for (int y = 0; y < image_mask.Height; y++)
            {
                for (int x = 0; x < image_mask.Width; x++)
                {
                    float v = image_mask.At<Vec3b>(y, x)[0];
                    if (v > 127)
                    {
                        input_tensor_mask[0, 0, y, x] = 1.0f;
                    }
                    else
                    {
                        input_tensor_mask[0, 0, y, x] = 0.0f;
                    }
                }
            }

        }

        public static Mat Postprocess(IDisposableReadOnlyCollection<DisposableNamedOnnxValue> result_infer)
        {
            // 将输出结果转为DisposableNamedOnnxValue数组
            DisposableNamedOnnxValue[] results_onnxvalue = result_infer.ToArray();

            // 读取第一个节点输出并转为Tensor数据
            Tensor<float> result_tensors = results_onnxvalue[0].AsTensor<float>();

            float[] result_array = result_tensors.ToArray();

            for (int i = 0; i < result_array.Length; i++)
            {
                result_array[i] = Math.Max(0, Math.Min(255, result_array[i]));
            }

            Mat result = new Mat(1000, 1504, MatType.CV_32FC3, result_array);

            return result;
        }
    }
}

下载

源码下载

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

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

相关文章

昇思25天学习打卡营第八天|保存与加载

背景 提供免费算力支持&#xff0c;有交流群有值班教师答疑的华为昇思训练营进入第八天了。 今天是第八天&#xff0c;前七天的学习内容可以看链接 昇思25天学习打卡营第一天|快速入门 昇思25天学习打卡营第二天|张量 Tensor 昇思25天学习打卡营第三天|数据集Dataset 昇思25天…

Python对象不可哈希?教你几招解决!

目录 1、什么是可哈希?🚀 1.1 哈希基础理论 1.2 可哈希对象定义🔍 示例代码: 1.3 Python中哈希的作用 1.4 哈希表与性能提升📈 应用实例代码: 2、Python中的哈希特性🔑 2.1 不变性与哈希值🔄 示例代码展示: 2.2 实现细节深入探讨📚 深入代码细节:…

深度学习论文: VanillaNet: the Power of Minimalism in Deep Learning

深度学习论文: VanillaNet: the Power of Minimalism in Deep Learning VanillaNet: the Power of Minimalism in Deep Learning PDF:https://arxiv.org/pdf/2305.12972 PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 1 概述 提出的VanillaNet通过简化设计&…

【机器学习】Python sorted 函数

目录&#xff1a; 什么是sorted()函数列表降序排序应用到字符串自定义排序规则实际应用 Python中的内置函数——sorted()。 1. 什么是sorted()函数 在Python中&#xff0c;sorted()是一个内置函数&#xff0c;用于对任何可迭代对象&#xff08;如列表、元组、字符串等&…

绿联NAS进入SSH的方法

1. 进入【设备管理】&#xff0c;在调试功能中&#xff0c;开启远程调试功能&#xff0c;发送手机验证码&#xff0c;你将得到一个3天有效期的验证码&#xff0c;就是ssh登录密码。 2. 使用终端工具或ssh命令直接登录SSH。 端口是922&#xff0c;账号是&#xff1a;root&#…

七月论文审稿GPT第5版:拿我司七月的早期paper-7方面review数据集微调LLama 3

前言 llama 3出来后&#xff0c;为了通过paper-review的数据集微调3&#xff0c;有以下各种方式 不用任何框架 工具 技术&#xff0c;直接微调原生的llama 3&#xff0c;毕竟也有8k长度了 效果不期望有多高&#xff0c;纯作为baseline通过PI&#xff0c;把llama 3的8K长度扩展…

李沐深度学习知识点—数值稳定性、模型激活函数、全连接层到卷积、卷积层

数值稳定性 其中h是一个向量&#xff0c;向量关于向量的倒数是一个矩阵&#xff0c;因此求梯度是求矩阵乘法 矩阵乘法带来了 梯度爆炸&#xff0c;梯度消失 模型初始化和激活函数 归一化&#xff1a;不管梯度多大&#xff0c;我都把梯度拉回来&#xff0c;否的出现梯度爆炸和梯…

【基础篇】第4章 Elasticsearch 查询与过滤

在Elasticsearch的世界里&#xff0c;高效地从海量数据中检索出所需信息是其核心价值所在。本章将深入解析查询与过滤的机制&#xff0c;从基础查询到复合查询&#xff0c;再到全文搜索与分析器的定制&#xff0c;为你揭开数据检索的神秘面纱。 4.1 基本查询 4.1.1 Match查询…

内容个性化的智能引擎:Kompas.ai如何满足用户需求

在数字化时代&#xff0c;用户对内容的消费趋向个性化和定制化。个性化内容不仅能提升用户体验&#xff0c;还能增强品牌与用户之间的互动。Kompas.ai作为一款先进的智能引擎&#xff0c;正通过其独特的技术满足用户的个性化需求。 个性化内容的重要性 个性化内容在提升用户体验…

2024 vue3入门教程:01vscode终端命令创建第一个vue项目

参考vue官网手册&#xff1a;https://cn.vuejs.org/guide/quick-start.html 一、找个盘符&#xff0c;新建文件夹存储以后得vue项目 我的是e盘下创建了vueproject 二、使用vscode打开存储vue项目的文件夹 因为我生成过项目&#xff0c;所以有文件&#xff0c;你们初次是没有…

分布式存储和分布式计算两个哪个更适合作为工作深入方向发展?

有朋友问&#xff0c;分布式存储比如hdfs&#xff0c;ceph&#xff0c;minio&#xff0c;tidb&#xff0c;glusterfs&#xff1b;分布式计算比如Hadoop&#xff0c;spark&#xff0c;flink&#xff1b;它们在实际工作中咋样&#xff1f;具体开发工作是啥&#xff1f;哪个更有发…

leetCode.96. 不同的二叉搜索树

leetCode.96. 不同的二叉搜索树 题目思路 代码 // 方法一&#xff1a;直接用卡特兰数就行 // 方法二&#xff1a;递归方法 class Solution { public:int numTrees(int n) {// 这里把 i当成整个结点&#xff0c;j当成左子树最左侧结点,并一次当根节点尝试// f[ i ] f[ j - 1…

《昇思25天学习打卡营第19天 | 昇思MindSporeDiffusion扩散模型》

19天 本节学了Diffusion扩散模型相关知识&#xff0c;并且通过实例完成扩散模型。Diffusion是从纯噪声开始通过一个神经网络学习逐步去噪&#xff0c;最终得到一个实际图像。 1.Diffusion对于图像的处理包括以下两个过程&#xff1a; 1.1我们选择的固定&#xff08;或预定义&…

Is ChatGPT a Good Personality Recognizer? A Preliminary Study?

ChatGPT是一个很好的人格识别者吗&#xff1f;初步调研 摘要1 介绍2 背景和相关工作3 实验3.1 数据集3.2 提示策略3.3 基线3.4 评估指标3.5 实现细节3.6 Overall Performance (RQ1)3.7 ChatGPT在人格识别上的公平性 (RQ2)3.8 ChatGPT对下游任务的人格识别能力&#xff08;RQ3&a…

python-求s=a+aa+aaa+aaaa+aa...a的值(赛氪OJ)

[题目描述] 求 saaaaaaaaaaaa...a 的值&#xff0c;其中 a 是一个一位的整数。 例如 &#xff1a;2222222222222222(此时共有 5 个数相加)。输入格式&#xff1a; 整数 a 和 n &#xff08; n 个数相加&#xff09;。输出格式&#xff1a; s 的值。样例输入 2 2样例输出 24数据…

操作系统精选题(四)(论述题)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;操作系统 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 一、银行家算法的一道例题 二、页…

Stateflow快速入门系列(七): 使用时序逻辑调度图动作

要定义 Stateflow 图在仿真时间的行为&#xff0c;请在图的状态和转移动作中包含时序逻辑运算符。时序逻辑运算符是内置函数&#xff0c;告知状态保持激活的时间长度或布尔条件保持为 true 的时间长度。使用时序逻辑&#xff0c;您可以控制以下各项的时序&#xff1a; 各状态之…

守护矿山安全生产:AI视频分析技术在煤矿领域的应用

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;其在煤矿行业的应用也日益广泛。AI视频智能分析技术作为其中的重要分支&#xff0c;为煤矿的安全生产、过程监测、效率提升和监管决策等提供了有力支持。 一、煤矿AI视频智能分析技术的概述 视频智慧煤矿AI…

[数据库]mysql用户管理权限管理

目录 ​编辑用户管理​编辑 权限管理 ​编辑 ​编辑 ​编辑案例​编辑 细节 ​编辑 用户管理 我们用创建的用户在登录之后可以看到他和root看到的数据库是完全不一样的 权限管理 案例 登录这个账户可以看到还看不到teatdb这个数据库, 因为还没有授权 分配权限 过来刷新…

OpenCV 张正友标定法(二)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在之前的博客OpenCV 张氏标定法中,我们没有考虑镜头畸变等因素,因此计算出的内参与外参均是理想情况下的数值,而如果我们考虑到镜头的畸变: 我们就需要考虑使用最小二乘法最小化像素坐标的重投影误差(上述所求…