基于Halcon深度学习之分类

news2025/6/9 3:13:41
*****
***环境准备***
***系统:win7以上系统
***显卡:算力3.0以上
***显卡驱动:10.1以上版本(nvidia-smi查看指令)

***读取深度学习模型***
read_dl_model ('pretrained_dl_classifier_compact.hdl', DLModelHandle)
***获取模型中的图象张量及对应的灰度值范围
get_dl_model_param (DLModelHandle, 'image_width', ImgWidth)
get_dl_model_param (DLModelHandle, 'image_height', ImgHeight)
get_dl_model_param (DLModelHandle, 'image_num_channels', ImgChannel)
get_dl_model_param (DLModelHandle, 'image_range_min', ImgRangMin)
get_dl_model_param (DLModelHandle, 'image_range_max', ImgRangMax)


************预处理数据准备及拆分**********
classNames := ['1-2','1-3','1-4','2-4','3-5','4-7','5-6']
rawImageFolders := '../images/' + classNames
***把原图像数据转换为对应的Dataset格式***
read_dl_dataset_classification (rawImageFolders, 'last_folder', DLDataset)
***对数据集进行拆分***
trainPrecent := 60 // 用于训练的比例
validdatatPrecent := 20 // 用于测试的比例
GenSplitParam := dict{overwrite_split:'true'}
split_dl_dataset (DLDataset, trainPrecent, validdatatPrecent, GenSplitParam)
***预处理数据***
*1、创建预处理参数
** 预处理数据存储路径
processFolder := 'ProcessData'
** 定义预处理参数文件路径
dlProcessFileName := processFolder + '/dl_preprocess_param.hdict'
** 检查文件是否存在
file_exists (processFolder, FileExists)
if(not FileExists)
    make_dir (processFolder)
endif
** 创建预处理参数
create_dl_preprocess_param ('classification', ImgWidth, ImgHeight, ImgChannel, \
                            ImgRangMin, ImgRangMax, 'none', 'full_domain',\
                            [], [], [], [], DLPreprocessParam)
** 对数据进行预处理
GenParam := dict{overwrite_files:'true'}
preprocess_dl_dataset (DLDataset, processFolder, DLPreprocessParam, \
                       GenParam, DLDatasetFileName)
** 保存预处理参数文件
write_dict (DLPreprocessParam, dlProcessFileName, [], [])

************使用预处理数据对模型进行训练************
** 总周期(所有图片训练一次为一个周期)
numEpochs := 100
** 批次数(一个周期本分割的份数)
batchSize := 5
** 评估周期(每训练几个周期进行一次评估)
evluationIntervalEphochs := 2
** 学习率
learningRate := 0.001
**** 设置模型参数
set_dl_model_param(DLModelHandle, 'class_names', classNames)
set_dl_model_param(DLModelHandle, 'image_dimensions', [ImgWidth,ImgHeight,ImgChannel])
set_dl_model_param(DLModelHandle, 'learning_rate', learningRate)
set_dl_model_param (DLModelHandle, 'batch_size', batchSize)
** 设置增强参数
GenParamName := []
GenParamValue := []
** 定义参数字典,增强参数
augmentParam := dict{}
augmentParam.augmentation_percentage := 100
augmentParam.mirror := 'rc'
GenParamName := [GenParamName,'augment']
GenParamValue := [GenParamValue,augmentParam]

** 定义存储最佳模型路径和最终模型路径
augmentBest := dict{}
augmentBest.type := 'best'
augmentBest.basename := processFolder + '/model_best'
GenParamName := [GenParamName,'serialize']
GenParamValue := [GenParamValue,augmentBest]

augmentFinal := dict{}
augmentFinal.type := 'final'
augmentFinal.basename := processFolder + '/model_final'
GenParamName := [GenParamName,'serialize']
GenParamValue := [GenParamValue,augmentFinal]
** 创建训练参数及执行训练
create_dl_train_param (DLModelHandle, numEpochs, evluationIntervalEphochs, \
                       'true', 32, GenParamName, GenParamValue, TrainParam)
** 执行模型训练
train_dl_model (DLDataset, DLModelHandle, TrainParam, 0,\
                TrainResults, TrainInfos, EvaluationInfos)
** 释放资源
clear_dl_model (DLModelHandle)
** 关闭训练窗口
stop()
dev_close_window()
dev_close_window()

***********模型评估***********
** 定义评估模型文件路径
retainModelFile := processFolder + '/model_best.hdl'
** 读取训练后的模型
read_dl_model (retainModelFile, RetainDLModelHandle)
** 定义评估的指标
evaluateGenParam := ['f_score','recall','precision','absolute_confusion_matrix',\
                     'relative_confusion_matrix']
evaluateDict := dict{measures:evaluateGenParam}
** 执行模型评估
evaluate_dl_model(DLDataset, RetainDLModelHandle, 'split', 'test', \
                  evaluateDict, EvaluationResult, EvalParams)
** 显示评估结果
GenDispParam := dict{}
GenDispParam.display_mode := ['measures','pie_charts_recall','pie_charts_precision',\
                              'absolute_confusion_matrix','relative_confusion_matrix']
WindowHandleDict := dict{}
dev_display_classification_evaluation(EvaluationResult, EvalParams,\
                                      GenDispParam, WindowHandleDict)
stop()
dev_close_window_dict(WindowHandleDict)


***********模型推断***********
** 读取推断数据
list_image_files('../test_image','bmp',[],ImageFiles)
** 读取预处理参数
read_dict(dlProcessFileName,[],[],DLPreprocessParam)
** 设置显示字体大小
dev_get_window(WindowHandle)
set_display_font(WindowHandle, 26, 'mono', 'true', 'false')
** 循环检测每一张图像
for Index :=0 to |ImageFiles| -1 by 1
    ** 获取当前图像
    read_image(Image,ImageFiles[Index])
    ** 生产样本图像
    gen_dl_samples_from_images(Image, DLSampleBatch)
    ** 把推断图像处理成预处理图像数据
    preprocess_dl_samples(DLSampleBatch, DLPreprocessParam)
    **  使用模型进行推断类别
    apply_dl_model(RetainDLModelHandle, DLSampleBatch, [], DLResultBatch)
    ** 评估结果显示
    className := DLResultBatch.classification_class_names[0]
    score := DLResultBatch.classification_confidences[0]
    ** 显示图像上面
    dev_disp_text('类别:'+className+',分数:'+score, 'window',\
                  'top', 'left', 'white', 'box_color', 'forest green')
    stop()
endfor

clear_dl_model(RetainDLModelHandle)

以上为halcon源码,联合C#编程操作界面

C#源码

        /// <summary>
        /// 分类类别名称
        /// </summary>
        private HTuple classNames;

        /// <summary>
        /// 模型文件
        /// </summary>
        public string[] ModelFiles { get; private set; }

        #region 主界面相关事件
        public HomePage()
        {
            InitializeComponent();
        }

        private void HomePage_FormClosing(object sender, FormClosingEventArgs e)
        {
        }
        private void HomePage_Load(object sender, System.EventArgs e)
        {           
            // UI 显示日志
            ViewAppender viewAppender = new ViewAppender(dgvLog)
            {
                Location = "",
            };
            LogCombiner.Ins.Append(viewAppender);
            // 初始化网络模型
            InitializeModels();

            // 模型评估默认参数
            // recall
            cbMetric.SelectedIndex = 0;
            // test
            cbSampleSelectValues.SelectedIndex = 0;
        }
        #endregion

        #region 设置HWindowControl控件的显示方式
        private void DispImage(HImage image, HWindow window)
        {
            int imageWidth, imageHeight, winRow, winCol, winWidth, winHeight, partWidth, partHeight;
            try
            {
                image.GetImageSize(out imageWidth, out imageHeight);
                window.GetWindowExtents(out winRow, out winCol, out winWidth, out winHeight);
                if (winWidth > winHeight)
                {
                    partWidth = imageWidth;
                    partHeight = imageWidth * winHeight / winWidth;
                }
                else
                {
                    partWidth = imageHeight * winWidth / winHeight;
                    partHeight = imageHeight;
                }

                // 设置显示图像在窗口中间
                var offsetX = (imageWidth - partWidth) / 2;
                var offsetY = (imageHeight - partHeight) / 2;
                // 设置窗口显示区域
                HOperatorSet.SetPart(window, offsetY, offsetX, partHeight + offsetY - 1, partWidth + offsetX - 1);
                // 显示图形
                HOperatorSet.DispObj(image, window);
            }
            catch (HalconException hEx)
            {
                MessageBox.Show(hEx.Message);
            }
        }

        /// <summary>
        /// 把HObject转化为对应的HImage方法
        /// </summary>
        /// <param name="hObject"></param>
        /// <param name="image"></param>
        private HImage HObject2HImage(HObject hObject)
        {
            HImage image = new HImage();
            // 获取当前传人对象的通道数【灰度/彩色】
            HOperatorSet.CountChannels(hObject, out var channels);
            if (channels.I == 0)
            {
                return image;
            }
            // 判断通道数
            if (channels.I == 1)
            {
                // 获取传人图形的数据
                HOperatorSet.GetImagePointer1(hObject,
                    out var pointer, out var type, out var width, out var height);
                // 生成当通道图形
                image.GenImage1(type, width, height, pointer);
            }
            else
            {
                // 彩色图
                HOperatorSet.GetImagePointer3(hObject, out var pointerRed, out var pointerGreen,
                    out var pointerBlue, out var type, out var width, out var height);
                image.GenImage3(type, width, height, pointerRed, pointerGreen, pointerBlue);
            }

            return image;
        }
        #endregion

        #region 加载模型文件选择下拉框
        private void InitializeModels()
        {
            // 获取项目编译路径
            ModelFiles = Directory.GetFiles(Path.Combine(Directory.GetCurrentDirectory(), "hdl"),"*.hdl");
            // 把模型文件添加至下拉框中
            foreach(string modelFile in ModelFiles)
            {
                // 获取模型文件名
                string modelName = Path.GetFileNameWithoutExtension(modelFile);
                // 添加到下拉列表
                cbBackBone.Items.Add(modelName);
            }
            // 判断是否有模型文件
            if(ModelFiles.Length > 0)
            {
                // 默认选择第一个文件
                cbBackBone.SelectedIndex = 0;
                Logger.Notify("model load finished .", "Preprocess");
            }
            else
            {
                // 如果没有模型文件,下拉框禁用
                cbBackBone.Enabled = false;
                Logger.Warn("model files not found .", "Preprocess");
            }
        }
        #endregion

        #region 读取模型参数
        private void cbBackBone_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                // 读取选择的网络模型文件
                string modelFile = ModelFiles[cbBackBone.SelectedIndex];
                // 加载模型 read_dl_model
                HOperatorSet.ReadDlModel(modelFile, out var dLModelHandle);
                // 判断模型不为空
                if(dLModelHandle == null)
                {
                    Logger.Warn("read_dl_model failure .", "Preprocess");
                    return;
                }
                // 读取模型张量数
                HOperatorSet.GetDlModelParam(dLModelHandle, "image_width", out HTuple imageWidth);
                HOperatorSet.GetDlModelParam(dLModelHandle, "image_height", out HTuple imageHeight);
                HOperatorSet.GetDlModelParam(dLModelHandle, "image_num_channels", out HTuple imageChannels);
                HOperatorSet.GetDlModelParam(dLModelHandle, "image_range_min", out HTuple imageRangMin);
                HOperatorSet.GetDlModelParam(dLModelHandle, "image_range_max", out HTuple imageRangMax);
                // 数据填充至对应文本框
                tbImgWidth.Text = imageWidth.ToString();
                tbImgHeight.Text = imageHeight.ToString();
                tbChannel.Text = imageChannels.ToString();
                tbGrayMin.Text = imageRangMin.ToString();
                tbGrayMax.Text = imageRangMax.ToString();

                // 释放加载的模型
                HOperatorSet.ClearDlModel(dLModelHandle);
                dLModelHandle.Dispose();
                dLModelHandle = null;
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message, "Preprocess");
            }
        }
        #endregion

        #region 选择样本路径和存储路径
        private void btnSelectRawPath_Click(object sender, EventArgs e)
        {
            using (FolderBrowserDialog dlg = new FolderBrowserDialog())
            {
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    // 重新创建,防止重复添加
                    classNames = new HTuple();
                    tbRawPath.Text = dlg.SelectedPath;
                    // 获取选择文件夹下面的所有文件夹名称
                    string[] folder = Directory.GetDirectories(tbRawPath.Text);
                    // 把文件夹名添加到元组中
                    foreach (var item in folder)
                    {
                        classNames.Append(new DirectoryInfo(item).Name);
                    }
                }
            }
        }

        private void btnSelectPrePath_Click(object sender, EventArgs e)
        {
            using (FolderBrowserDialog dlg = new FolderBrowserDialog())
            {
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    tbPreStorPath.Text = dlg.SelectedPath;
                }
            }
        }
        #endregion

        #region 执行数据预处理操作
        private async void btnExecPreprocess_Click(object sender, EventArgs e)
        {
            // 获取预处理对象
            var preprocess = Classification.ProcessAction;
            // 绑定更新方法
            preprocess.UpdateImageAction += Preprocess_UpdateImageAction; 
            // 获取界面的参数
            var imageWith = Convert.ToInt32(tbImgWidth.Text);
            var imageHeight = Convert.ToInt32(tbImgHeight.Text);
            var imageNumChannels = Convert.ToInt32(tbChannel.Text);
            var imageRangeMin = Convert.ToInt32(tbGrayMin.Text);
            var imageRangeMax = Convert.ToInt32(tbGrayMax.Text);
            var backBoneFileName = ModelFiles[cbBackBone.SelectedIndex];
            var rawImagePath = tbRawPath.Text;
            var preprocessPath = tbPreStorPath.Text;

            // 设置到预处理对象属性中
            preprocess.ImageHeight = imageHeight;
            preprocess.ImageWidth = imageWith;
            preprocess.ImageNumChannels = imageNumChannels;
            preprocess.ImageRangeMin = imageRangeMin;
            preprocess.ImageRangeMax = imageRangeMax;
            preprocess.BackBonePath = backBoneFileName;
            preprocess.PreProcessPath = preprocessPath;
            preprocess.SamplesPath = rawImagePath;
            // 设置分类名称
            preprocess.ClassNames = classNames;
            // 界面显示信息
            HalconDLTool.set_display_font(hWinPre.HalconWindow, 20, "mono", "true", "false");
            // 调用预处理对象的预处理方法
            var res = await preprocess.ExecutePreProcess();
            // 判断执行结果
            if (res > 0)
            {
                HOperatorSet.DispText(hWinPre.HalconWindow, "Preprocess finished .", "window", 12, 12, "white", "box_color", "forest green");
                Logger.Notify("Preprocess finished .", "Preprocess");
            }
            else
            {
                HOperatorSet.DispText(hWinPre.HalconWindow, "Preprocess failure .", "window", 12, 12, "white", "box_color", "red");
                Logger.Error("Preprocess failure .", "Preprocess");
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="obj"></param>
        /// <exception cref="NotImplementedException"></exception>
        private void Preprocess_UpdateImageAction(HObject obj)
        {
            try
            {
                if (obj != null)
                {
                    var hw = hWinPre.HalconWindow;
                    hw.ClearWindow();
                    hw.SetWindowParam("flush", "false");
                    DispImage(HObject2HImage(obj), hw);
                    hw.FlushBuffer();
                }
            }
            catch (Exception)
            {

                throw;
            }
        }
        #endregion

        #region 选择训练的数据集文件
        private string SelectFile(string filter)
        {
            using(OpenFileDialog dlg = new OpenFileDialog())
            {
                dlg.Filter = filter;
                if(dlg.ShowDialog() == DialogResult.OK)
                {
                    return dlg.FileName;
                }
                return null;
            }
        }
        private void btnSelectData_Click(object sender, EventArgs e)
        {
            // 获取选择的数据集文件路径
            string datasetFile = SelectFile("Dataset(*.hdict)|*.hdict");
            // 把数据集路径存放至控件的Tag属性,并显示文件名称
            tbDataPath.Tag = datasetFile;
            if(datasetFile != null)
            {
                // 将数据集名称显示至文本框
                tbDataPath.Text = Path.GetFileNameWithoutExtension(datasetFile);
            }
            //  获取当前文件所在的路径,模型文件也在当前目录下
            Classification.TrainingAction.ModelFilePath = Path.GetDirectoryName(datasetFile);
        }
        #endregion

        #region 执行模型训练
        private async void btnTrain_Click(object sender, EventArgs e)
        {
            // 获取训练对象
            var training = Classification.TrainingAction;
            // 获取界面的数据
            var batchSize = Convert.ToInt32(tbBatchSize.Text);
            var learningRate = Convert.ToDouble(tbLearningRate.Text);
            var numEpochs = Convert.ToInt32(tbNumEpochs.Text);
            var evaluateNumEpochs = Convert.ToInt32(tbEvluationIntervalEphochs.Text);
            var trainingPrecent = Convert.ToInt32(tbTrainPrecent.Text);
            var validationPercent = Convert.ToInt32(tbValiddatatPrecent.Text);
            // 设置训练对象的属性
            training.TraingPercent = trainingPrecent;
            training.ValidationPercent = validationPercent;
            training.BatchSize = batchSize;
            training.LearningRate = learningRate;
            training.NumEpochs = numEpochs;
            training.EvaluateNumEpoch = evaluateNumEpochs;
            // 设置显示窗口的的背景
            var hw = hWinTrain.HalconWindow;
            hw.SetWindowParam("background_color", "light gray");
            training.TrainWindow = hw;

            // 调用模型训练的方法
            int res = await training.ExecuteTraining();

            if (res > 0)
            {
                Logger.Notify("training finished .", "Training");
            }
            else
            {
                Logger.Error("training exception .", "Training");
            }
        }
        #endregion

        #region 执行评估
        private void btnEvaluate_Click(object sender, EventArgs e)
        {
            // 获取评估对象并给属性赋值
            var evaluate = Classification.EvaluateAction;
            evaluate.EvaluateMetric = cbMetric.Text;
            evaluate.EvaluateDataName = cbSampleSelectValues.Text;
            evaluate.EvaluateWindow = hWinEvaluate.HalconWindow;

            // 执行模型评估
            int res = evaluate.ExecuteEvaluate();

            if (res > 0)
            {
                Logger.Notify("evaluate finished .", "Evaluate");
            }
            else
            {
                Logger.Error("evaluate error .", "Evaluate");
            }
        }
        private void btnSelectEvaluateModel_Click(object sender, EventArgs e)
        {
            // 获取选择的数据集文件路径
            string datasetFile = SelectFile("Model(*.hdl)|*.hdl");
            if (datasetFile != null)
            {
                // 将数据集名称显示至文本框
                tbEvaluateModelFile.Text = Path.GetFileNameWithoutExtension(datasetFile);
            }
            // 设置完成的模型路径
            Classification.EvaluateAction.EvaluateModelFileName = datasetFile;
        }
        #endregion

        #region 执行推断
        private void btnSelectInferModel_Click(object sender, EventArgs e)
        {
            // 获取选择的数据集文件路径
            string datasetFile = SelectFile("Model(*.hdl)|*.hdl");
            // 把数据集路径存放至控件的Tag属性,并显示文件名称
            tbInferModel.Tag = datasetFile;
            if (datasetFile != null)
            {
                // 将数据集名称显示至文本框
                tbInferModel.Text = Path.GetFileNameWithoutExtension(datasetFile);
            }
            // 设置推断使用的模型文件
            Classification.InferenceAction.ModelTypeName = datasetFile;
        }
        private void btnSelectInferImg_Click(object sender, EventArgs e)
        {

            var dialog = new FolderBrowserDialog();
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                // 获取用户选择的目录
                var inferDataPath = dialog.SelectedPath;
                // 给文本框赋值
                tbInferPath.Text = inferDataPath;
                // 设置推断文件,这里可以进行优化文件后缀,避免放置非图像文件
                Classification.InferenceAction.InferImages = Directory.GetFiles(inferDataPath).ToList();
            }
        }
        private async void btnSigInfer_Click(object sender, EventArgs e)
        {
            // 获取推断对象
            var infer = Classification.InferenceAction;
            infer.UpdateInvoker += InferOnece_UpdateInvoker;

            // 调用推断方法
            int res = await infer.ExecuteInfer(InferType.ONECE);

            if (res > 0)
            {
                // 赋值推断结果
                tbClass.Text = infer.Class;
                tbScore.Text = (infer.Score*100).ToString("F2");
                tbTicks.Text = (infer.Ticks * 1000).ToString("F4");
                Logger.Log($"{infer.Index}.Type:{infer.Class},Score:{(infer.Score * 100).ToString("F2")}", "Inference");
            }
            else
            {
                Logger.Log("infer method error.", "Inference");
            }
        }

        private void InferOnece_UpdateInvoker(HObject obj)
        {
            if (obj != null)
            {
                var hw = hWinInfer.HalconWindow;
                // 关闭窗口缓存更新
                hw.SetWindowParam("flush", "false");
                // 把上一次窗口显示数据清空
                hw.ClearWindow();
                // 显示采集图像
                DispImage(HObject2HImage(obj), hw);
                // 更新创建数据
                hw.FlushBuffer();
            }
        }

        private async void btnContinueInfer_Click(object sender, EventArgs e)
        {
            // 获取推断对象
            var infer = Classification.InferenceAction;
            infer.ContinueUpdateInvoker += InferContinue_UpdateInvoker;

            // 调用推断方法
            int res = await infer.ExecuteInfer(InferType.CONTINUE);

            if (res > 0)
            {
                // 赋值推断结果
                Logger.Notify("continue inference finished.", "Inference");
            }
            else
            {
                Logger.Log("continue infer method error.", "Inference");
            }
        }

        private void InferContinue_UpdateInvoker(HObject obj, Inference inference)
        {
            if (obj != null)
            {
                var hw = hWinInfer.HalconWindow;
                // 关闭窗口缓存更新
                hw.SetWindowParam("flush", "false");
                // 把上一次窗口显示数据清空
                hw.ClearWindow();
                // 显示采集图像
                DispImage(HObject2HImage(obj), hw);
                // 更新创建数据
                hw.FlushBuffer();

                // 多线程中调用必须使用异步调用方式
                BeginInvoke(new Action(() =>
                {
                    // 赋值推断结果
                    tbClass.Text = inference.Class;
                    tbScore.Text = (inference.Score*100).ToString("F2");
                    tbTicks.Text = (inference.Ticks * 1000).ToString("F4");
                }));
                Logger.Log($"{inference.Index}.Type:{inference.Class},Score:{(inference.Score * 100).ToString("F2")}", "Inference");
            }
        }
        #endregion

完整打包资料资料包​​​​​​​

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

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

相关文章

技巧小结:根据寄存器手册写常用外设的驱动程序

需求&#xff1a;根据STM32F103寄存器手册写DMA模块的驱动程序 一、分析标准库函数的写法&#xff1a; 各个外设的寄存器地址定义在stm32f10x.h文件中&#xff1a;此文件由芯片厂家提供;内核的有关定义则定义在core_cm3.h文件中&#xff1a;ARM提供; 1、查看外设区域多级划分…

设计模式(代理设计模式)

代理模式解释清楚&#xff0c;所以如果想对一个类进行功能上增强而又不改变原来的代码情况下&#xff0c;那么只需要让这个类代理类就是我们的顺丰&#xff0c;对吧?并行增强就可以了。具体增强什么?在哪方面增强由代理类进行决定。 代码实现就是使用代理对象代理相关的逻辑…

从代码学习深度强化学习 - 初探强化学习 PyTorch版

文章目录 前言强化学习的概念强化学习的环境强化学习中的数据强化学习的独特性总结前言 本文将带你初步了解强化学习 (Reinforcement Learning, RL) 的基本概念,并通过 PyTorch 实现一些简单的强化学习算法。强化学习是一种让智能体 (agent) 通过与环境 (environment) 的交互…

ELK日志管理框架介绍

在小铃铛的毕业设计中涉及到了ELK日志管理框架&#xff0c;在调研期间发现在中文中没有很好的对ELK框架进行介绍的文章&#xff0c;因此拟在本文中进行较为详细的实现的介绍。 理论知识 ELK 框架介绍 ELK 是一个流行的开源日志管理解决方案堆栈&#xff0c;由三个核心组件组…

【Linux】sed 命令详解及使用样例:流式文本编辑器

【Linux】sed 命令详解及使用样例&#xff1a;流式文本编辑器 引言 sed 是 Linux/Unix 系统中一个强大的流式文本编辑器&#xff0c;名称来源于 “Stream EDitor”&#xff08;流编辑器&#xff09;。它允许用户在不打开文件的情况下对文本进行筛选和转换&#xff0c;是命令行…

机器学习:聚类算法及实战案例

本文目录&#xff1a; 一、聚类算法介绍二、分类&#xff08;一&#xff09;根据聚类颗粒度分类&#xff08;二&#xff09;根据实现方法分类 三、聚类流程四、K值的确定—肘部法&#xff08;一&#xff09;SSE-误差平方和&#xff08;二&#xff09;肘部法确定 K 值 五、代码重…

【p2p、分布式,区块链笔记 MESH】 论文阅读 Thread/OpenThread Low-Power Wireless Multihop Net

paperauthorThread/OpenThread: A Compromise in Low-Power Wireless Multihop Network Architecture for the Internet of ThingsHyung-Sin Kim, Sam Kumar, and David E. Culler 目录 引言RPL 标准设计目标与架构设计选择与特性shortcomIngs of RPL设计选择的反面影响sImulta…

moon游戏服务器-demo运行

下载地址 https://github.com/sniper00/MoonDemo redis安装 Redis-x64-3.0.504.msi 服务器配置文件 D:\gitee\moon_server_demo\serverconf.lua 貌似不修改也可以的&#xff0c;redis不要设置密码 windows编译 安装VS2022 Community 下载premake5.exe放MoonDemo\server\moon 双…

Qt学习及使用_第1部分_认识Qt---学习目的及技术准备

前言 学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面. 参考书:<Qt 6 C开发指南>(以下称"本书") 标识说明:概念用粗体倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字), 本书原话内容用深蓝色标识,比较重要的内容用加粗倾…

湖北理元理律师事务所:债务咨询中的心理支持技术应用

债务危机往往伴随心理崩溃。世界卫生组织研究显示&#xff0c;长期债务压力下抑郁症发病率提升2.3倍。湖北理元理律师事务所将心理干预技术融入法律咨询&#xff0c;构建“法律方案心理支持”的双轨服务模型。 一、债务压力下的心理危机图谱 通过对服务对象的追踪发现&#x…

阿里云域名怎么绑定

阿里云服务器绑定域名全攻略&#xff1a;一步步轻松实现网站“零”障碍上线&#xff01; 域名&#xff0c;您网站在云端的“身份证”&#xff01; 在数字化浪潮中&#xff0c;拥有一个属于自己的网站或应用&#xff0c;是个人展示、企业运营不可或缺的一环。而云服务器&#x…

能上Nature封面的idea!强化学习+卡尔曼滤波

2025深度学习发论文&模型涨点之——强化学习卡尔曼滤波 强化学习&#xff08;Reinforcement Learning, RL&#xff09;与卡尔曼滤波&#xff08;Kalman Filtering, KF&#xff09;的交叉研究已成为智能控制与状态估计领域的重要前沿方向。 强化学习通过试错机制优化决策策…

Markdown基础(1.2w字)

1. Markdown基础 这次就没目录了&#xff0c;因为md格式太乱了写示例&#xff0c;展示那些都太乱了&#xff0c;导致目录很乱。 &#xff08;我是XX&#xff0c;出现了很多错误&#xff0c;有错误和我说&#xff09; 1.1 Markdown简介 Markdown是一种轻量级的标记语言&#…

LabVIEW与PLC液压泵测控系统

针对液压泵性能测试场景&#xff0c;采用LabVIEW与西门子 PLC 控制系统&#xff0c;构建高精度、高可靠性的智能测控系统。通过选用西门子 PLC、NI 数据采集卡、施耐德变频电机等&#xff0c;结合LabVIEW 强大的数据处理与界面开发能力&#xff0c;实现液压泵压力、流量、转速等…

【HarmonyOS5】UIAbility组件生命周期详解:从创建到销毁的全景解析

⭐本期内容&#xff1a;【HarmonyOS5】UIAbility组件生命周期详解&#xff1a;从创建到销毁的全景解析 &#x1f3c6;系列专栏&#xff1a;鸿蒙HarmonyOS&#xff1a;探索未来智能生态新纪元 文章目录 前言生命周期全景图详细状态解析与最佳实践&#x1f3ac; Create状态&#…

c++ 静态成员变量

Student.h头文件内容&#xff1a; #pragma once #include <string> using namespace std;class Student { public:string name;int score;static int totalScore; // 静态局部变量声明Student(string name, int score);~Student();void print() const; };Student.cpp源文…

数据分析之OLTP vs OLAP

数据处理系统主要有两种基本方法&#xff1a;一种注重数据操作(增删查改)&#xff0c;另一种注重商业智能数据分析。 这两种系统是&#xff1a; 联机事务处理&#xff08;OLTP&#xff09; 联机分析处理&#xff08;OLAP&#xff09; Power BI专为与OLAP系统兼容而构建&…

dvwa5——File Upload

LOW 在dvwa里建一个testd2.php文件&#xff0c;写入一句话木马&#xff0c;密码password antsword连接 直接上传testd2.php文件&#xff0c;上传成功 MEDIUM 查看源码&#xff0c;发现这一关只能提交jpg和png格式的文件 把testd2.php的后缀改成jpg&#xff0c;上传时用bp抓包…

【优选算法】C++滑动窗口

1、长度最小的子数组 思路&#xff1a; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 滑动窗口// 1.left0,right0// 2.进窗口( nums[right])// 3.判断// 出窗口// (4.更新结果)// 总和大于等于 target 的长度最小的 子数组…

关于GitHub action云编译openwrt

特别声明:此教程仅你有成功离线编译的经验后,使用下列教程更佳 不建议没有任何成功经验的人进行云编译 1、准备工作 使用GitHub云编译模板 GitHub - jxjxcw/build_openwrt: 利用Actions在线云编译openwrt固件,适合官方源码,lede,lienol和immortalwrt源码,支持X86,电…