C#Halcon深度学习预热与否的运行时间测试

news2025/1/4 19:20:58

       在深度学习推理应用阶段,涉及到提速,绕不开一个关键词“预热”。

       在其他地方的“预热”,预先加热到指定的温度。通常指预习准备做某一样事时,为此做好准备。

       而在深度学习推理应用阶段涉及的预热通常是指GPU预热,GPU在不用的时候是低功耗状态,它会把有些高性能的功能暂时关闭或降低性能,这时候如果把模型放上面处理,能明显感觉到有点慢,甚至从点击程序运行以后要等个几秒钟才出结果,因为这个阶段GPU要完成很多初始化工作【当然了,这也和显卡好坏有关系】。

     接下来的Demo案例主要是呈现预热与否的运行时间差异

首先呈现的是未经预热的第一次测试

未经预热的第二次测试

未经预热的第三次测试

预热后第一次应用

预热后第二次应用

预热后第N次应用

Demo案例预热方式仅采用部分内存释放与否的方式进行测试,仅为展示效果

附上C#UI代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ViewControl;
using HalconDotNet;
using System.Reflection.Emit;
using static System.Net.Mime.MediaTypeNames;
namespace DeepLearningTest1
{
    public partial class Form1 : Form
    {
        HalconView HW; //dll调用
        public static DeepLearning Dl = new DeepLearning();//类调用
        //全局变量
        HObject HIMage = new HObject();
        HTuple hv_DLDataset = new HTuple(), hv_DLPreprocessParam = new HTuple();
        HTuple hv_DLModelHandle = new HTuple(), hv_ImageFiles = new HTuple();
        public Form1()
        {
            InitializeComponent();
            HW = new HalconView();
            HW.HWindowControl.BackColor = Color.White;
            splitContainer1.Panel1.Controls.Add(HW);
            HW.Dock = DockStyle.Fill;
        }
        /// <summary>
        /// 加载图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                //openFileDialog.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
                openFileDialog.Filter = "图片文件(*.bmp;*.jpg;*.gif;*.png;*.tiff;*.tif)|*.bmp;*.jpg;*.gif;*.png;*.tiff;*.tif";
                openFileDialog.RestoreDirectory = true;
                openFileDialog.FilterIndex = 1;
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    label3.Text = openFileDialog.FileName;
                    HOperatorSet.ReadImage(out HIMage, label3.Text);
                    
                    HW.DispImage(HIMage, true);
                }               
            }
            catch (Exception ex)
            {
                MessageBox.Show("加载图片失败  " + ex.ToString());
            }

        }
        /// <summary>
        /// 模型预热
        /// </summary>
        Detect detectResult = new Detect();
        private Detect detectTest(HObject Hobj, string mode)
        {
            detectResult = new Detect();
            HObject ho_Image = new HObject(); ;
            HTuple hv_WindowDict = new HTuple(), hv_Index = new HTuple();
            HTuple hv_SampleIndex = new HTuple(), hv_DLSampleBatch = new HTuple();
            HTuple hv_DLResult = new HTuple(), hv_ClaID = new HTuple();
            HTuple hv_ClassSorce = new HTuple(), hv_ClassName = new HTuple();
            HTuple hv_ID = new HTuple(), hv_Sorce = new HTuple(), hv_N = new HTuple();
            HOperatorSet.GenEmptyObj(out ho_Image);
            try
            {
                HTuple t = new HTuple(), t1 = new HTuple(), T = new HTuple();
                hv_DLDataset.Dispose();
                HOperatorSet.ReadDict("E:/Halcon数据/测量程序/深度学习/1109/xin1109.hdict",
                    new HTuple(), new HTuple(), out hv_DLDataset);
                hv_DLPreprocessParam.Dispose();
                HOperatorSet.ReadDict("E:/Halcon数据/测量程序/深度学习/xin110900/训练-241109-153815/dl_preprocess_param.hdict",
                    new HTuple(), new HTuple(), out hv_DLPreprocessParam);
                hv_DLModelHandle.Dispose();
                HOperatorSet.ReadDlModel("E:/Halcon数据/测量程序/深度学习/xin110900/训练-241109-153815/best_model.hdl",
                    out hv_DLModelHandle);
                ho_Image.Dispose();
                ho_Image = Hobj;
                HW.DispImage(ho_Image, true);
                hv_DLSampleBatch.Dispose();
                Dl.gen_dl_samples_from_images(ho_Image, out hv_DLSampleBatch);
                Dl.preprocess_dl_samples(hv_DLSampleBatch, hv_DLPreprocessParam);
                HOperatorSet.CountSeconds(out t);
                hv_DLResult.Dispose();
                HOperatorSet.ApplyDlModel(hv_DLModelHandle, hv_DLSampleBatch, new HTuple(),
                    out hv_DLResult);
                HOperatorSet.CountSeconds(out t1);
                T = t1 - t;
                label11.Text = T.ToString();
                hv_ClaID.Dispose();
                HOperatorSet.GetDictTuple(hv_DLResult, "classification_class_ids", out hv_ClaID);
                hv_ClassSorce.Dispose();
                HOperatorSet.GetDictTuple(hv_DLResult, "classification_confidences", out hv_ClassSorce);
                hv_ClassName.Dispose();
                HOperatorSet.GetDictTuple(hv_DLResult, "classification_class_names", out hv_ClassName);
                hv_ID.Dispose();
                using (HDevDisposeHelper dh = new HDevDisposeHelper())
                {
                    hv_ID = hv_ClaID.TupleSelect(
                        0);
                }
                hv_Sorce.Dispose();
                using (HDevDisposeHelper dh = new HDevDisposeHelper())
                {
                    hv_Sorce = hv_ClassSorce.TupleSelect(
                        0);
                }
                label1.Text = hv_Sorce.ToString();
                hv_N.Dispose();
                using (HDevDisposeHelper dh = new HDevDisposeHelper())
                {
                    hv_N = hv_ClassName.TupleSelect(
                    0);
                }
                label2.Text = hv_N.ToString();
            }
            catch
            {
                detectResult = new Detect();
                detectResult.finishJudge_CCD2 = false;
            }
            ho_Image.Dispose();
            hv_WindowDict.Dispose();
            hv_Index.Dispose();
            hv_SampleIndex.Dispose();
            hv_DLSampleBatch.Dispose();
            hv_DLResult.Dispose();
            hv_ClaID.Dispose();
            hv_ClassSorce.Dispose();
            hv_ClassName.Dispose();
            hv_ID.Dispose();
            hv_Sorce.Dispose();
            hv_N.Dispose();
            return detectResult;
        }
        /// <summary>
        /// 图片检测
        /// </summary>
        /// <param name="Hobj"></param>
        /// <param name="mode"></param>
        /// <returns></returns>
        private Detect detectTest1(HObject Hobj, string mode)
        {
            detectResult = new Detect();
            HObject ho_Image = new HObject(); ;
            HTuple hv_WindowDict = new HTuple(), hv_Index = new HTuple();
            HTuple hv_SampleIndex = new HTuple(), hv_DLSampleBatch = new HTuple();
            HTuple hv_DLResult = new HTuple(), hv_ClaID = new HTuple();
            HTuple hv_ClassSorce = new HTuple(), hv_ClassName = new HTuple();
            HTuple hv_ID = new HTuple(), hv_Sorce = new HTuple(), hv_N = new HTuple();
            HOperatorSet.GenEmptyObj(out ho_Image);
            try
            {
                HTuple t = new HTuple(), t1 = new HTuple(), T = new HTuple();
                ho_Image.Dispose();
                ho_Image = Hobj;
                HW.DispImage(ho_Image, true);
                hv_DLSampleBatch.Dispose();
                Dl.gen_dl_samples_from_images(ho_Image, out hv_DLSampleBatch);
                Dl.preprocess_dl_samples(hv_DLSampleBatch, hv_DLPreprocessParam);
                HOperatorSet.CountSeconds(out t);
                hv_DLResult.Dispose();
                HOperatorSet.ApplyDlModel(hv_DLModelHandle, hv_DLSampleBatch, new HTuple(),
                    out hv_DLResult);
                HOperatorSet.CountSeconds(out t1);
                T = t1 - t;
                label13.Text = T.ToString();
                hv_ClaID.Dispose();
                HOperatorSet.GetDictTuple(hv_DLResult, "classification_class_ids", out hv_ClaID);
                hv_ClassSorce.Dispose();
                HOperatorSet.GetDictTuple(hv_DLResult, "classification_confidences", out hv_ClassSorce);
                hv_ClassName.Dispose();
                HOperatorSet.GetDictTuple(hv_DLResult, "classification_class_names", out hv_ClassName);
                hv_ID.Dispose();
                using (HDevDisposeHelper dh = new HDevDisposeHelper())
                {
                    hv_ID = hv_ClaID.TupleSelect(
                        0);
                }
                hv_Sorce.Dispose();
                using (HDevDisposeHelper dh = new HDevDisposeHelper())
                {
                    hv_Sorce = hv_ClassSorce.TupleSelect(
                        0);
                }
                label21.Text = hv_Sorce.ToString();
                hv_N.Dispose();
                using (HDevDisposeHelper dh = new HDevDisposeHelper())
                {
                    hv_N = hv_ClassName.TupleSelect(
                    0);
                }

                label20.Text = hv_N.ToString();
            }
            catch
            {
                detectResult = new Detect();
                detectResult.finishJudge_CCD2 = false;
            }
            ho_Image.Dispose();
            hv_WindowDict.Dispose();
            hv_Index.Dispose();
            hv_SampleIndex.Dispose();
            hv_DLSampleBatch.Dispose();
            hv_DLResult.Dispose();
            hv_ClaID.Dispose();
            hv_ClassSorce.Dispose();
            hv_ClassName.Dispose();
            hv_ID.Dispose();
            hv_Sorce.Dispose();
            hv_N.Dispose();
            return detectResult;
        }
        /// <summary>
        /// 模型预热
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            if (!HIMage.IsInitialized()) { MessageBox.Show("图片为空"); return; }
            Detect detectTemp = new Detect();
            HTuple t = new HTuple(), t1 = new HTuple(), T = new HTuple();
            HOperatorSet.CountSeconds(out t);
            detectTemp = detectTest(HIMage, "test");
            HOperatorSet.CountSeconds(out t1);
            T = t1 - t;
            label7.Text = T.ToString();
        }
        /// <summary>
        /// 图片检测
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            if (!HIMage.IsInitialized()) { MessageBox.Show("图片为空"); return; }
            Detect detectTemp = new Detect();
            HTuple t = new HTuple(), t1 = new HTuple(), T = new HTuple();
            HOperatorSet.CountSeconds(out t);
            detectTemp = detectTest1(HIMage, "test");
            HOperatorSet.CountSeconds(out t1);
            T = t1 - t;
            label17.Text = T.ToString();
        }
    }
}

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

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

相关文章

获取 Astro Bot AI 语音来增强您的游戏体验!

有很多用户尝试过Astro Bot&#xff0c;却被Astro Bot可爱的声音所吸引。您是否想知道如何使用 Astro Bot 语音来拨打恶作剧电话或用他的声音说话&#xff1f;如果您有&#xff0c;那么这篇文章适合您。我们将向您展示如何为 Astro Bot 提供逼真的 AI 声音并在在线对话中使用它…

重装操作系统后 Oracle 11g 数据库数据还原

场景描述&#xff1a; 由于SSD系统盘损坏&#xff0c;更换硬盘后重装了操作系统&#xff0c;Oracle数据库之前安装在D盘(另一个硬盘)&#xff0c;更换硬盘多添加一个盘符重装系统后盘符从D变成E&#xff0c;也就是之前的D:/app/... 变成了现在的 E:/app/...&#xff0c;重新安装…

IDEA+Docker一键部署项目SpringBoot项目

文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署 7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问…

UE5材质节点Camera Vector/Reflection Vector

Camera Vector相机向量&#xff0c;输出像素到相机的方向&#xff0c;结果归一化 会随着相机移动而改变 Reflection Vector 反射向量&#xff0c;物体表面法线反射到相机的方向&#xff0c;x和y和camera vector相反 配合hdr使用

python实现自动登录12306抢票 -- selenium

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 python实现自动登录12306抢票 -- selenium 前言其实网上也出现了很多12306的代码&#xff0c;但是都不是最新的&#xff0c;我也是从网上找别人的帖子&#xff0c;看B站视频&…

鸿蒙1.2:第一个应用

1、create Project&#xff0c;选择Empty Activity 2、配置项目 project name 为项目名称&#xff0c;建议使用驼峰型命名 Bundle name 为项目包名 Save location 为保存位置 Module name 为模块名称&#xff0c;即运行时需要选择的模块名称&#xff0c;见下图 查看模块名称&…

Docker安装(Docker Engine安装)

一、Docker Engine和Desktop区别 Docker Engine 核心组件&#xff1a;Docker Engine是Docker的核心运行时引擎&#xff0c;负责构建、运行和管理容器。它包括守护进程&#xff08;dockerd&#xff09;、API和命令行工具客户端&#xff08;docker&#xff09;。适用环境&#…

Ceph 手动部署(CentOS9)

#Ceph手动部署、CentOS9、squid版本、数字版本19.2.0 #部署服务:块、对象、文件 一、部署前规划 1、兼容性确认 2、资源规划 节点类型节点名称操作系统CPU/内存硬盘网络组件安装集群节点CephAdm01CentOS94U/8GOS:40G,OSD:2*100GIP1:192.169.0.9(管理&集群),IP2:…

springboot-启动流程

by shihang.mai 1. 启动流程图 查看springboot2.3.7源码后绘制下图。 springboot启动流程图 main启动&#xff0c;new SpringApplication()构造方法里面 判断当前应用程序类型reactive、servlet、none获取所有的ApplicationListener对应的对象获取所有的ApplicationContextInit…

Flutter:打包apk,详细图文介绍(一)

困扰了一天&#xff0c;终于能正常打包apk安装了&#xff0c;记录下打包的流程。建议参考我这篇文章时&#xff0c;同时看下官网的构建说明。 官网构建并发布 Android 应用详情 1、AS创建Flutter项目 2、cmd执行命令 生成一个sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

linux下安装tun模块详细教程

原本是要看tcp/ip协议栈&#xff0c;找到了https://github.com/chobits/tapip这个。然后需要支持tun&#xff0c;完了开始安装。 TUN/TAP是一个虚拟网络设备&#xff0c;用于实现用户态程序和内核网络协议栈之间的数据交互。 1、安装环境 我的系统是ubuntu16.04 VMWare虚拟机&a…

Ajax数据爬取

有时我们用requests 抓取页面得到的结果&#xff0c;可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据&#xff0c;而使用requests 得到的结果中并没有这些数据。这是因为 requests 获取的都是原始 HTML 文档&#xff0c;而浏览器中的页面是JavaScript 处理…

Docker 安装与配置 Nginx

摘要 1、本文全面介绍了如何在 Docker 环境中安装和配置 Nginx 容器。 2、文中详细解释了如何设置 HTTPS 安全连接及配置 Nginx 以实现前后端分离的代理服务。 2、同时&#xff0c;探讨了通过 IP 和域名两种方式访问 Nginx 服务的具体配置方法 3、此外&#xff0c;文章还涵…

SpringCloud微服务架构

文章目录 认识微服务&#xff1a;SpringCloud 服务拆分及远程调用实现夸远程服务调用使用RestTemplateEureka注册中心 搭建EruekaServer注册服务服务发现 Ribbon负载均衡 修改负载均衡规则解饿加载 Nacos注册中心&#xff08;nacos一部分功能&#xff09; 服务注册到nacosnacos…

WireShark4.4.2浏览器网络调试指南:TCP传输包分析(七)

概述 在使用Wireshark进行网络分析时&#xff0c;理解每一个数据包的组成部分对于网络分析非常重要。特别是在TCP协议中的“三次握手”过程中&#xff0c;每个数据包会包含多个层次的信息&#xff0c;从帧信息到TCP协议的详细内容。下面是对TCP握手过程中第一个SYN数据包的详细…

kafka使用常见问题

连接不上kafka,报下边的错 org.apache.kafka.common.KafkaException: Producer is closed forcefully.at org.apache.kafka.clients.producer.internals.RecordAccumulator.abortBatches(RecordAccumulator.java:760) [kafka-clients-3.0.2.jar:na]at org.apache.kafka.client…

用uniapp写一个播放视频首页页面代码

效果如下图所示 首页有导航栏&#xff0c;搜索框&#xff0c;和视频列表&#xff0c; 导航栏如下图 搜索框如下图 视频列表如下图 文件目录 视频首页页面代码如下 <template> <view class"video-home"> <!-- 搜索栏 --> <view class…

深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent

阅读原文 渐入佳境 我们都知道&#xff0c;通过编写一个提示词&#xff08;prompt&#xff09;&#xff0c;我们可以引导大模型生成回答&#xff0c;从而开启愉快的人工智能对话&#xff0c;比如让模型介绍一下卡皮巴拉。上边简图描述了这个过程&#xff0c;我们拆成两部分 pr…

Unity-Mirror网络框架-从入门到精通之Basic示例

文章目录 前言Basic示例场景元素预制体元素代码逻辑BasicNetManagerPlayer逻辑SyncVars属性Server逻辑Client逻辑 PlayerUI逻辑 最后 前言 在现代游戏开发中&#xff0c;网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架&#xff0c;专为多人…

【新方法】通过清华镜像源加速 PyTorch GPU 2.5安装及 CUDA 版本选择指南

下面详细介绍所提到的两条命令&#xff0c;它们的作用及如何在你的 Python 环境中加速 PyTorch 等库的安装。 1. 设置清华镜像源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这条命令的作用是将 pip &#xff08;Python 的包管理工具&#xf…