Halcon深度学习,异常值缺陷检测

前言

halcon深度学习分为常见的4大类。分类,语义分割,异常值检测,深度OCR。本篇主要针对halcon的异常值检测,如何训练和部署,并通过图像预处理的方式实现对异常值缺陷检测的精准实现。
异常值检测不同于语义分割的项目,异常值检测可以仅训练OK图像,不训练NG图像,但是使用NG图像训练可以显著提高准确度

1.总结程序

ImageDir := 'E:/New/图像文件/异常值检测单块'
ImageSubDirs := ['OK','NG']
OutputDir := 'E:/New/图像文件/异常值检测单块/样品'
ExampleSpecificPreprocessing := true

ImageWidth := 160
ImageHeight := 160

Complexity := 15

*******************1.拆分数据集***************
create_dict (GenParamDataset)
set_dict_tuple (GenParamDataset, 'image_sub_dirs', ImageSubDirs)
read_dl_dataset_anomaly (ImageDir, [], [], [], GenParamDataset, DLDataset)
* 

split_dl_dataset (DLDataset, 50, 10, [])
* 
* 加载异常值检测模型
read_dl_model ('initial_dl_anomaly_medium.hdl', DLModelHandle)
set_dl_model_param (DLModelHandle, 'image_width', ImageWidth)
set_dl_model_param (DLModelHandle, 'image_height', ImageHeight)
set_dl_model_param (DLModelHandle, 'complexity', Complexity)
* 校验GPU
query_available_dl_devices (['runtime','id'], ['gpu',0], DLDevice)
set_dl_model_param (DLModelHandle, 'device', DLDevice)
* 
* 设置参数和预处理模型
create_dict (PreprocessSettings)
set_dict_tuple (PreprocessSettings, 'overwrite_files', true)
create_dl_preprocess_param ('anomaly_detection', ImageWidth, ImageHeight, 3, [], [], 'constant_values', 'full_domain', [], [], [], [], DLPreprocessParam)
preprocess_dl_dataset (DLDataset, OutputDir, DLPreprocessParam, PreprocessSettings, DLDatasetFileName)
* 
get_dict_tuple (DLDataset, 'samples', DatasetSamples)
if (ExampleSpecificPreprocessing)
    read_dl_samples (DLDataset, [0:|DatasetSamples| - 1], DLSampleBatch)
    preprocess_dl_samples_bottle (DLSampleBatch)
    write_dl_samples (DLDataset, [0:|DatasetSamples| - 1], DLSampleBatch, [], [])
endif
*随机抽取检查标注情况
create_dict (WindowDict)
for Index := 0 to 9 by 1
    SampleIndex := int(rand(1) * |DatasetSamples|)
    read_dl_samples (DLDataset, SampleIndex, DLSample)
    dev_display_dl_data (DLSample, [], DLDataset, 'anomaly_ground_truth', [], WindowDict)
    dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
    * 
    get_dict_tuple (WindowDict, 'anomaly_ground_truth', WindowHandles)
    dev_set_window (WindowHandles[0])
    dev_disp_text ('Preprocessed image', 'window', 'top', 'left', 'black', [], [])
    * 
    stop ()
endfor
dev_close_window_dict (WindowDict)
* ***   2.) 训练   ***
* 
* 创建训练参数
* 
* C显示训练进度
EnableDisplay := true
* 
*设置最小训练误差和最大迭代次数
ErrorThreshold := 0.001
MaxNumEpochs := 30
* 
*控制每张图像的大小训练参数,越大可以增加准确率,但是训练时间会显著增加
DomainRatio := 0.25
* 
* 设置稳健性,当训练失败时,可以调高参数值
RegularizationNoise := 0.01
* 
create_dict (TrainParamAnomaly)
set_dict_tuple (TrainParamAnomaly, 'regularization_noise', RegularizationNoise)
set_dict_tuple (TrainParamAnomaly, 'error_threshold', ErrorThreshold)
set_dict_tuple (TrainParamAnomaly, 'domain_ratio', DomainRatio)
create_dl_train_param (DLModelHandle, MaxNumEpochs, [], EnableDisplay, 73, 'anomaly', TrainParamAnomaly, TrainParam)
* 
* 调用数据集,并开始训练
train_dl_model (DLDataset, DLModelHandle, TrainParam, 0, TrainResults, TrainInfos, EvaluationInfos)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 
dev_close_window ()
* ***   3.评估模型   ***
* 
* 计算异常评分系数,当缺陷过小时,可以提高系数,使得评估更准确
StandardDeviationFactor := 1.0
set_dl_model_param (DLModelHandle, 'standard_deviation_factor', StandardDeviationFactor)
* 
*预估阀值,用于分割缺陷和背景
create_dict (GenParamThreshold)
set_dict_tuple (GenParamThreshold, 'enable_display', 'true')
compute_dl_anomaly_thresholds (DLModelHandle, DLDataset, GenParamThreshold, AnomalySegmentationThreshold, AnomalyClassificationThresholds)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 
dev_close_window ()
* 
* 设置评估参数跟评估模型
create_dict (GenParamEvaluation)
set_dict_tuple (GenParamEvaluation, 'measures', 'all')
set_dict_tuple (GenParamEvaluation, 'anomaly_classification_thresholds', AnomalyClassificationThresholds)
evaluate_dl_model (DLDataset, DLModelHandle, 'split', 'test', GenParamEvaluation, EvaluationResult, EvalParams)
* 
* 设置显示参数
create_dict (GenParamDisplay)
*显示评估模型
set_dict_tuple (GenParamDisplay, 'display_mode', ['score_histogram','score_legend'])
create_dict (WindowDict)
dev_display_anomaly_detection_evaluation (EvaluationResult, EvalParams, GenParamDisplay, WindowDict)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', 'box', 'true')
stop ()
* 
dev_close_window_dict (WindowDict)
* 
* 可视化评估参数
set_dict_tuple (GenParamDisplay, 'display_mode', ['pie_charts_precision','pie_charts_recall','absolute_confusion_matrix'])
* 
ClassificationThresholdIndex := |AnomalyClassificationThresholds| - 1
set_dict_tuple (GenParamDisplay, 'classification_threshold_index', 0)
create_dict (WindowDict)
dev_display_anomaly_detection_evaluation (EvaluationResult, EvalParams, GenParamDisplay, WindowDict)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 
dev_close_window_dict (WindowDict)
* 
* 写出模型
write_dl_model (DLModelHandle, 'E:/New/图像文件/异常值检测/model_final.hdl')


* ***   4.推理   ***

InferenceClassificationThreshold := AnomalyClassificationThresholds[0]

InferenceSegmentationThreshold := AnomalySegmentationThreshold
create_dict (DLDatasetInfo)
set_dict_tuple (DLDatasetInfo, 'class_names', ['OK','NG'])
set_dict_tuple (DLDatasetInfo, 'class_ids', [0,1])
create_dict (WindowDict)

* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('E:/New/图像文件/异常值检测单块/OK', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    * Image Acquisition 01: Do something
    dev_set_color ('red')
    *预处理图像,将所要检测的区域提取出
    threshold (Image, Regions, 29, 156)
    closing_circle (Regions, RegionClosing, 20)
    fill_up (RegionClosing, RegionFillUp)
    reduce_domain (Image, RegionFillUp, ImageReduced)
    *缩放图像,将图像缩放到与训练预处理一致,方便筛选
    get_image_size (ImageReduced, Width, Height)
    zoom_image_size (Image, ImageZoom,160,160, 'constant')
    zoom_region (RegionFillUp, RegionZoom,0.89,0.89)
    *将图像加载进行推理
    gen_dl_samples_from_images (Image, DLSample)
    preprocess_dl_samples (DLSample, DLPreprocessParam)
    apply_dl_model (DLModelHandle, DLSample, [], DLResult)

      read_dict_object (AnomalyImage, DLResult, 'anomaly_image')
    read_dict_tuple (DLResult, 'anomaly_score', AnomalyScore)
    * 
    *使用二值化选择所需要的区域
    threshold (AnomalyImage, AnomalyRegion,0.2,0.6)
    *对图像取交集,提取所检测的区域
    intersection (AnomalyRegion, RegionZoom, RegionIntersection)
    connection (RegionIntersection, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 100, 50000000)
     gen_contour_region_xld (SelectedRegions, Contours, 'border')
     *统计NG的区域个数
     count_obj (Contours, Number)
     dev_get_window (WindowHandle)
     if (Number>0)
         disp_message (WindowHandle, 'NG', 'window', 12, 12, 'black', 'true')
         stop ()
     else
         disp_message (WindowHandle, 'OK', 'window', 12, 12, 'black', 'true')
     endif
     
     reduce_domain (ImageZoom, RegionZoom, ImageReduced1)
     dev_display (ImageReduced1)
     dev_set_color ('green')
     dev_display (Contours)
endfor
dev_close_window_dict (WindowDict)

2.程序分析

2.1预处理和选择路径

*图像输入
ImageDir := 'E:/New/图像文件/异常值检测单块'
*检测数组
ImageSubDirs := ['OK','NG']
*预处理输出路径
OutputDir := 'E:/New/图像文件/异常值检测单块/样品'
ExampleSpecificPreprocessing := true

ImageWidth := 160
ImageHeight := 160

Complexity := 15

*******************1.拆分数据集***************
create_dict (GenParamDataset)
set_dict_tuple (GenParamDataset, 'image_sub_dirs', ImageSubDirs)
read_dl_dataset_anomaly (ImageDir, [], [], [], GenParamDataset, DLDataset)

注意事项:1.选择输入的预处理图像时,需要满足图像的大小是20的进制倍数。当我们训练的图像非常小时,比如我要训练的图像200190 。那么应该选取的是160160的预处理模型。预处理模型只支持:40,80,160,320,640,4中预处理格式,如果设置的格式错误是预处理将无法进行下去

2.2设置训练参数

 ***   2.) 训练   ***
* 
* 创建训练参数
* 
* 显示训练进度
EnableDisplay := true
* 
*设置最小训练误差和最大迭代次数
ErrorThreshold := 0.001
MaxNumEpochs := 30
* 
*控制每张图像的大小训练参数,越大可以增加准确率,但是训练时间会显著增加
DomainRatio := 0.25
* 
* 设置稳健性,当训练失败时,可以调高参数值
RegularizationNoise := 0.01
* 
create_dict (TrainParamAnomaly)
set_dict_tuple (TrainParamAnomaly, 'regularization_noise', RegularizationNoise)
set_dict_tuple (TrainParamAnomaly, 'error_threshold', ErrorThreshold)
set_dict_tuple (TrainParamAnomaly, 'domain_ratio', DomainRatio)
create_dl_train_param (DLModelHandle, MaxNumEpochs, [], EnableDisplay, 73, 'anomaly', TrainParamAnomaly, TrainParam)
* 
* 调用数据集,并开始训练
train_dl_model (DLDataset, DLModelHandle, TrainParam, 0, TrainResults, TrainInfos, EvaluationInfos)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()

2.3显示评估混淆矩阵

 ***   3.评估模型   ***
* 
* 计算异常评分系数,当缺陷过小时,可以提高系数,使得评估更准确
StandardDeviationFactor := 1.0
set_dl_model_param (DLModelHandle, 'standard_deviation_factor', StandardDeviationFactor)
* 
*预估阀值,用于分割缺陷和背景
create_dict (GenParamThreshold)
set_dict_tuple (GenParamThreshold, 'enable_display', 'true')
compute_dl_anomaly_thresholds (DLModelHandle, DLDataset, GenParamThreshold, AnomalySegmentationThreshold, AnomalyClassificationThresholds)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 
dev_close_window ()
* 
* 设置评估参数跟评估模型
create_dict (GenParamEvaluation)
set_dict_tuple (GenParamEvaluation, 'measures', 'all')
set_dict_tuple (GenParamEvaluation, 'anomaly_classification_thresholds', AnomalyClassificationThresholds)
evaluate_dl_model (DLDataset, DLModelHandle, 'split', 'test', GenParamEvaluation, EvaluationResult, EvalParams)
* 
* 设置显示参数
create_dict (GenParamDisplay)
*显示评估模型
set_dict_tuple (GenParamDisplay, 'display_mode', ['score_histogram','score_legend'])
create_dict (WindowDict)
dev_display_anomaly_detection_evaluation (EvaluationResult, EvalParams, GenParamDisplay, WindowDict)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', 'box', 'true')
stop ()
* 
dev_close_window_dict (WindowDict)
* 
* 可视化评估参数
set_dict_tuple (GenParamDisplay, 'display_mode', ['pie_charts_precision','pie_charts_recall','absolute_confusion_matrix'])
* 
ClassificationThresholdIndex := |AnomalyClassificationThresholds| - 1
set_dict_tuple (GenParamDisplay, 'classification_threshold_index', 0)
create_dict (WindowDict)
dev_display_anomaly_detection_evaluation (EvaluationResult, EvalParams, GenParamDisplay, WindowDict)
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 
dev_close_window_dict (WindowDict)
* 
* 写出模型

2.3.1评估分数表

在这里插入图片描述
上图是二值化区域表,纵轴错误分类的图像比例,横轴代表匹配分数。通常来看OK与NG的交叉点是最小匹配分数的阈值。一般选取稍大的部分可以有效防止误判情况。以上图而言,可以选取0.15-0.2之间。

3.应用推理


* ***   4.推理   ***

InferenceClassificationThreshold := AnomalyClassificationThresholds[0]

InferenceSegmentationThreshold := AnomalySegmentationThreshold
create_dict (DLDatasetInfo)
set_dict_tuple (DLDatasetInfo, 'class_names', ['OK','NG'])
set_dict_tuple (DLDatasetInfo, 'class_ids', [0,1])
create_dict (WindowDict)

* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('E:/New/图像文件/异常值检测单块/OK', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    * Image Acquisition 01: Do something
    dev_set_color ('red')
    *预处理图像,将所要检测的区域提取出
    threshold (Image, Regions, 29, 156)
    closing_circle (Regions, RegionClosing, 20)
    fill_up (RegionClosing, RegionFillUp)
    reduce_domain (Image, RegionFillUp, ImageReduced)
    *缩放图像,将图像缩放到与训练预处理一致,方便筛选
    get_image_size (ImageReduced, Width, Height)
    zoom_image_size (Image, ImageZoom,160,160, 'constant')
    zoom_region (RegionFillUp, RegionZoom,0.89,0.89)
    *将图像加载进行推理
    gen_dl_samples_from_images (Image, DLSample)
    preprocess_dl_samples (DLSample, DLPreprocessParam)
    apply_dl_model (DLModelHandle, DLSample, [], DLResult)

      read_dict_object (AnomalyImage, DLResult, 'anomaly_image')
    read_dict_tuple (DLResult, 'anomaly_score', AnomalyScore)
    * 
    *使用二值化选择所需要的区域
    threshold (AnomalyImage, AnomalyRegion,0.2,0.6)
    *对图像取交集,提取所检测的区域
    intersection (AnomalyRegion, RegionZoom, RegionIntersection)
    connection (RegionIntersection, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 100, 50000000)
     gen_contour_region_xld (SelectedRegions, Contours, 'border')
     *统计NG的区域个数
     count_obj (Contours, Number)
     dev_get_window (WindowHandle)
     if (Number>0)
         disp_message (WindowHandle, 'NG', 'window', 12, 12, 'black', 'true')
         stop ()
     else
         disp_message (WindowHandle, 'OK', 'window', 12, 12, 'black', 'true')
     endif
     
     reduce_domain (ImageZoom, RegionZoom, ImageReduced1)
     dev_display (ImageReduced1)
     dev_set_color ('green')
     dev_display (Contours)
endfor
dev_close_window_dict (WindowDict)

3.1输入的图像

在这里插入图片描述
输入一张NG图像进行测试。如上图所示,在110的字符中心存在漏印的部分,

3.2将区域提取出来

在这里插入图片描述

*预处理图像,将所要检测的区域提取出
    threshold (Image, Regions, 29, 156)
    closing_circle (Regions, RegionClosing, 20)
    fill_up (RegionClosing, RegionFillUp)
    reduce_domain (Image, RegionFillUp, ImageReduced)
    *缩放图像,将图像缩放到与训练预处理一致,方便筛选
    get_image_size (ImageReduced, Width, Height)
    zoom_image_size (Image, ImageZoom,160,160, 'constant')
    zoom_region (RegionFillUp, RegionZoom,0.89,0.89)

在推理的过程中,由于异常值深度学习的特性,会导致将大量的背景定义为异常区域,所以在推理前需要将图像三角标志提取出来。

3.3匹配异常区域

 intersection (AnomalyRegion, RegionZoom, RegionIntersection)
    connection (RegionIntersection, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 100, 50000000)
     gen_contour_region_xld (SelectedRegions, Contours, 'border')
     *统计NG的区域个数
     count_obj (Contours, Number)

将提取成功的三角区域与异常区域取交集,即可完成NG图像的判定
在这里插入图片描述

4.总结

4.1为什么要使用异常值检测

异常值检测通常运用在缺陷检测的项目里面,他的特点是,可以不训练NG图,训练速度快,多特殊缺陷可以快速识别。
其次,可以针对图像中的缺陷类型不固定,缺陷区域不固定,物体大小不一等语义分割无法准确识别的缺陷。

4.2异常值检测缺点

精度不高,由于异常值检测的特性,背景图像需要也会被提取出来,所以在使用异常值检测进行推理时,还需要将物体区域进行预处理提取出来,再与异常区域取交集,所以异常值检测不能单独使用。
其次,对于内容越多的图像,异常值检测的误判率会越高,所以针对内容较多的图像,需要单独分区域去识别,会极大增加程序运行时间

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python】异常处理

前言 省略各种废话,直接快速整理知识点 try-except 基础 作用 程序不可能永远都是对的,当7除a,a由用户输入时,用户输入0就会报错。try-except就是解决这些问题。 结构 多分支自定义错误类型 上方的exception是一个错误类型…

Unity编辑器功能Inspector快捷自动填充数据和可视化调试

我们有时候可能需要在面板增加一些引用,可能添加脚本后要手动拖动,这样如果有大量的脚本拖动也是不小的工作量 实例 例如:我的脚本需要添加一个Bone的列表,一个个拖动很麻烦。 实现脚本 我们可以用这样的脚本来实现。 public…

Python 3 教程(2)

Python3 基础语法 编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*- 上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码&…

JavaSec 基础之 URLDNS 链

文章目录 URLDNS 链分析调用链复现反序列化复现 URLDNS 链分析 URLDNS是ysoserial里面就简单的一条利用链,但URLDNS的利用效果是只能触发一次dns请求,而不能去执行命令。比较适用于漏洞验证这一块,而且URLDNS这条利用链并不依赖于第三方的类…

幕译--本地字幕生成与翻译--Whisper客户端

幕译–本地字幕生成与翻译 本地离线的字幕生成与翻译,支持GPU加速。可免费试用,无次数限制 基于Whisper,希望做最好的Whisper客户端 功能介绍 本地离线,不用担心隐私问题支持GPU加速支持多种模型支持(中文、英语、日…

web服务,C/S框架,单设备登陆实现方案

背景: 原登陆接口,校验密码通过后,使用springsession记录会话信息,将信息存入在redis中 基于原逻辑进行多设备登陆开发,默认的时候多设备登陆开关开启,即按原来逻辑处理,只要密码登陆校验成功之后,都会将当前的会话信息存入redis中. 当多设备开关关闭时候,同一个账号同一时间只…

Vue.js+SpringBoot开发高校大学生创业管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统公告模块2.2 创业项目模块2.3 创业社团模块2.4 政府政策模块2.5 创业比赛模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 系统公告表3.2.2 创业项目表3.2.3 创业社团表3.2.4 政策表 四、系统展示五、核心代码5.…

【Spring Boot 源码学习】BootstrapContext的实际使用场景

《Spring Boot 源码学习系列》 BootstrapContext的实际使用场景 一、引言二、往期内容三、主要内容3.1 BootstrapContext3.2 BootstrapRegistry 初始化器实现3.3 BootstrapContext 的实际使用场景3.3.1 早期启动时3.3.2 环境配置准备完成时3.3.3 应用上下文准备完成后关闭 Boot…

Normalizer(归一化)和MinMaxScaler(最小-最大标准化)的区别详解

1.Normalizer(归一化)(更加推荐使用) 优点:将每个样本向量的欧几里德长度缩放为1,适用于计算样本之间的相似性。 缺点:只对每个样本的特征进行缩放,不保留原始数据的分布形状。 公式…

Linux--gdb(调试工具)

1. 背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 2. 命令 gdb binFile 退出: ctrl d 或 quit 调试命令&am…

如何压缩PDF文件大小?看完这篇文章,即可实现无损压缩!

平时工作或生活中,很多小伙伴是不是经常喜欢用PDF格式进行文件的保存,毕竟它具有较高的兼容性,且在不同设备中打开也不会出现排版错乱的情况。不过有时候PDF文件会因为内容过大,占用的内存过多,从而导致电脑卡顿的情况…

深入理解MySQL中的MVCC(多版本并发控制)

在MySQL中,MVCC是一种用于提供并发控制的技术,它允许数据库系统在事务并发执行的情况下保持数据的一致性,同时提高了数据库的并发性能。MVCC背后的理念是允许每个事务可以看到一个一致性的快照,从而避免了读取操作被写入操作所阻塞…

【Python刷题】环形链表

问题描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

树网的和 题解

先放一张图 作为一道蓝题,其实快接近紫题了。 --------------------------------------不怎么华丽的分割线-------------------------------------- 前置芝士:树的直径 一个点的最远点( y y y)到这个最远点的最远点( p p p)一定是一条树的直径。 假若…

Winform窗体随着屏幕的DPI缩放,会引起窗体变形及字体变形,superTabControl标签字体大小不匹配

一、前言 superTabControl做的浏览器标签(cefsharp)在缩放比例(125%,150%时字体不协调) 物联网浏览器,定制浏览器,多媒体浏览器(支持H264)参考栏目文章即可 二、配置参数 app.manifest参数 dpiAware =true <application xmlns="urn:schemas-microsoft-c…

Python快速入门系列-1

Python快速入门系列 第一章: Python简介1.1 Python的历史与发展1.2 Python的优势与特点1.2.1 易学易用1.2.2 动态类型1.2.3 丰富的标准库与第三方库1.2.4 面向对象与函数式编程1.2.5 广泛应用领域 1.3 Python的应用领域 第一章: Python简介 1.1 Python的历史与发展 Python是一…

Vue+SpringBoot打造个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

python 蓝桥杯之并查集

文章目录 总述合并过程查找过程算法实战实战1 总述 并查集&#xff08;Disjoint-set Union&#xff0c;简称并查集&#xff09;是一种用来管理元素分组情况的数据结构。它主要用于解决集合的合并与查询问题&#xff0c;通常涉及到以下两种操作&#xff1a; 合并&#xff08;Uni…

优化员工学习体验:企业内训APP的设计与开发方案详解

当下&#xff0c;设计并开发一款高效、便捷、个性化的企业内训APP已成为许多企业追求的目标。本文将探讨如何优化员工学习体验&#xff0c;以及企业内训APP的设计与开发方案。 一、了解员工需求 在设计和开发企业内训APP之前&#xff0c;首先需要深入了解员工的学习需求和偏好…

VSCode搭建ARM开发环境

为了构建Cortex M系列单片机免费开源的开发环境&#xff0c;网络上了解来看VSCODEGCCJLINK是一套比较高效的组合方式&#xff0c;下面记录环境搭建的流程。 我这边的PC环境为 WIN7专业版64bit。 需要用到的工具 Visual Studio CodeSTM32CubemxARM GCC 交叉编译工具链&#x…