ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Halcon深度学习分类模型实战:从数据准备到推理部署全流程

Halcon深度学习分类模型实战:从数据准备到推理部署全流程 1. Halcon深度学习分类模型到底是个什么东西很多人第一次在Halcon里看到深度学习这几个字第一反应是这不是Python那套东西吗怎么一个做传统视觉的工业软件也搞起神经网络了。我当初也是这个反应。后来实际用下来才发现Halcon的深度学习模块定位非常明确——它不跟你比谁的网络结构更花哨它解决的是工业产线上那些传统算子搞不定、但又必须稳定出结果的分类和检测问题。先把概念理清楚。Halcon里的深度学习分类模型本质上是一个基于卷积神经网络CNN的图像分类器。你给它一张图它告诉你这张图属于哪个类别。听起来简单但它的价值在于你不需要自己搭网络、不需要写训练循环、不需要配CUDA环境Halcon把这一整套东西封装成了几个算子。你负责准备数据、调几个参数剩下的它来。那它和OpenCV那套有什么区别OpenCV本身不提供端到端的深度学习训练框架你得自己接PyTorch或TensorFlow。而Halcon是从数据标注、训练、评估到推理部署全链路打通的而且推理阶段可以直接跑在CPU上不需要GPU也能上线。这一点在工业现场特别重要——很多产线工控机根本没有独立显卡。Halcon的深度学习分类模型主要覆盖这几类任务图像分类Classification整张图分到某个类别比如判断产品是合格还是缺陷目标检测Object Detection在图中框出目标并分类比如找出一块PCB板上的所有元件语义分割Semantic Segmentation像素级分类比如把缺陷区域的精确轮廓分割出来异常检测Anomaly Detection只学好样本偏离正常的就是异常这篇主要聊分类模型因为它是最容易上手、最容易出效果、也最容易被低估的一个。很多人觉得分类太简单了不就是分个类嘛。但实际在产线上大量的问题本质上就是分类问题——这个焊点好不好、这个表面有没有划痕、这个字符有没有印错。你把分类做扎实了很多场景根本不需要上检测和分割。一个常见的误解以为Halcon深度学习必须用GPU。实际上训练阶段强烈建议用GPU否则等到天荒地老但推理阶段CPU完全够用一张图几十毫秒的事。2. 训练之前必须想清楚的几件事2.1 你的问题真的适合用分类模型吗这是我最想先说的。很多人一上来就想用深度学习结果发现传统算子其实能解决白白浪费了标注和训练的时间。分类模型适合什么场景我总结了一个简单的判断标准适合分类的场景缺陷类型固定且可枚举、缺陷在整张图中占比较大、不同类别之间的差异是全局性的比如整体颜色、纹理、形状分布。举个例子判断注塑件表面是合格划痕气泡杂质这四类每张图拍的就是整个零件这就很适合分类。不适合分类的场景缺陷极小占图不到5%、缺陷位置不固定且需要精确定位、一张图里同时存在多个缺陷。这种你硬上分类准确率会很难看应该用检测或分割。我踩过的一个坑有个项目要检测布面上的瑕疵点瑕疵非常小我一开始用分类做整张图分有瑕疵和无瑕疵结果模型根本学不到东西因为瑕疵像素占比太低网络看到的几乎都是正常纹理。后来改成先切图再分类或者直接用异常检测效果才上来。2.2 数据量和数据质量的门槛Halcon官方给的参考是每个类别至少准备几十张图但这是下限。我的实际经验是类别数每类最少图片数能跑通每类推荐图片数效果稳定2类30-50张150-300张3-5类50-80张200-400张5类以上80-100张300张以上但比数量更重要的是数据的均衡性和代表性。什么叫代表性就是你的训练图要覆盖实际产线上可能出现的各种情况——不同的光照、不同的产品姿态、不同批次的色差。我见过一个项目训练集全是白天拍的图结果晚上产线灯光一变模型直接崩了。还有一个特别容易被忽略的点负样本的质量。如果你做的是二分类合格/不合格不合格样本一定要涵盖各种不合格的形态。只放一种划痕模型就只认识那一种划痕。2.3 图像采集环节的坑这个必须单独拎出来说。深度学习再强也救不了垃圾数据。在采集阶段要注意光照一致性训练和推理的光照条件要尽量一致。如果产线光照会变训练集里就要包含不同光照的图焦距和距离相机到产品的距离要固定否则同一类产品在图中大小不一网络会困惑背景干净背景越简单越好减少无关干扰图像分辨率不是越高越好。Halcon分类网络有固定的输入尺寸要求太高的分辨率会被缩放反而丢失细节。一般建议产品主体在图中占据合理比例即可实操心得采集数据时我习惯用Halcon的grab_image配合write_image批量存图存的时候按类别分文件夹。这样后面标注和训练都省事。文件名用类别_序号的格式比如ok_001.pngscratch_001.png一眼就能看出类别。3. Halcon分类模型的训练全流程拆解3.1 环境准备与版本选择Halcon的深度学习模块从18.11版本开始就比较成熟了建议用20.11及以上的版本算子更稳定支持的模型也更多。安装的时候注意勾选深度学习组件默认安装有时候不带。关于license深度学习功能需要单独的深度学习license普通的Halcon license是不含这个模块的。这一点很多人第一次用会卡住——算子能调用但一执行就报license错误。所以动手之前先确认你的license支持深度学习。硬件方面训练强烈建议NVIDIA GPU显存6GB起步8GB以上更舒服。Halcon用的是cuDNN加速训练速度比CPU快几十倍推理CPU就行i5以上都能跑单张图推理时间通常在10-50ms3.2 数据标注的正确姿势Halcon分类模型的数据组织方式很朴素——一个类别一个文件夹。你不需要画框、不需要标点只要把图分门别类放好就行。这是分类模型相比检测和分割最大的便利。目录结构大概长这样dataset/ ├── good/ │ ├── good_001.png │ ├── good_002.png │ └── ... ├── scratch/ │ ├── scratch_001.png │ └── ... ├── bubble/ │ └── ... └── impurity/ └── ...然后Halcon提供了一个算子read_dl_dataset_classification直接读这个目录结构自动生成数据集。你还可以指定验证集的比例它会自动帮你划分。这里有个细节类别文件夹的命名就是最终的类别名推理时输出的就是这个字符串。所以命名要规范别用中文虽然支持但容易出编码问题用英文或拼音。3.3 数据预处理与增强Halcon在训练时会自动做一些增强比如随机裁剪、翻转、亮度扰动。但你可以通过参数控制增强的强度。我的建议是几何增强如果你的产品在图中姿态会变开启旋转和翻转增强光照增强如果产线光照不稳定开启亮度和对比度扰动不要过度增强增强太猛会让模型学到不真实的特征。比如你的产品永远是正放的就别开大角度旋转预处理方面Halcon会自动把图像缩放到网络要求的输入尺寸。你不需要手动resize但要保证原图的长宽比不要和网络输入差太多否则缩放后形变严重。3.4 网络选型不是越深越好Halcon提供了几种预训练网络骨架可选常见的有网络类型特点适用场景pretrained_dl_classifier_compact轻量速度快类别少、差异明显、追求推理速度pretrained_dl_classifier_enhanced中等复杂度大多数工业场景的默认选择pretrained_dl_classifier_resnet50深表达能力强类别多、差异细微、数据量充足我的选型逻辑很简单先用compact跑一版看效果不够再换enhanced还不够再上resnet。很多时候compact就够用了推理还快。上来就用resnet50训练慢不说数据量不够还容易过拟合。3.5 训练参数怎么调Halcon训练分类模型的核心算子调用大概是这样# 伪代码示意实际用HDevelop或Halcon的Python接口 read_dl_dataset_classification(DatasetDir, class_names, validation_split, 0.2, DLDataSet) create_dl_train_param(DLDataSet, 20, true, true, ..., TrainParam) train_dl_classifier(DLClassifierHandle, DLDataSet, TrainParam, DLClassifierHandleTrained)关键参数就几个epochs训练轮数一般20-50轮。太少欠拟合太多过拟合。看验证集准确率曲线不再上升就可以停batch_size批大小显存够就大一点8、16、32都行。显存不够就调小learning_rate学习率Halcon有默认值一般不用改。如果loss不下降可以适当调小validation_split验证集比例0.2左右比较合适实操心得训练时一定要盯着验证集的准确率而不是训练集的。训练集准确率99%但验证集只有70%那就是过拟合了得加数据或者减网络复杂度。Halcon训练完会输出混淆矩阵这个特别有用能看出哪两个类别容易混。4. 训练完了怎么评估和调优4.1 看懂混淆矩阵训练结束后Halcon会生成一个混淆矩阵这是评估分类模型最直观的工具。矩阵的行是真实类别列是预测类别对角线上的数字就是分对的。重点看非对角线上的大数字。比如划痕被大量分成了杂质说明这两类在你的数据里可能本身就长得像或者标注的时候标准不统一。这时候要么重新审视标注标准要么增加这两类的区分度高的样本。4.2 准确率不够怎么办这是最常被问的问题。我按优先级给几个方向加数据最有效没有之一。特别是加那些分错的类别的样本检查标注有没有标错的我见过太多项目模型没问题是标注的人把类别搞混了换网络compact换enhancedenhanced换resnet调增强增强不够或者过度都会影响效果检查数据均衡如果某一类样本特别少模型会偏向多数类。可以适当补充少数类样本4.3 推理部署的注意事项训练好的模型保存下来是一个.hdl文件推理时用read_dl_classifier加载然后apply_dl_classifier出结果。推理阶段有几个坑输入图像要和训练时一致包括通道数灰度还是彩色、位深。训练用彩色推理用灰度结果肯定不对推理速度优化如果嫌慢可以设置set_dl_classifier_param里的batch_size批量推理比单张快置信度阈值apply_dl_classifier会输出每个类别的置信度你可以设一个阈值低于阈值的判为不确定交给人工复核。这在工业上很实用5. 几个真实项目里踩出来的经验5.1 类别不平衡的处理产线上合格品永远占绝大多数不合格品可能只占1%。如果你按真实比例采样模型会倾向于全判合格准确率看着有99%但一个缺陷都抓不到。我的做法是人为平衡训练集让每个类别的样本数差不多。推理时再通过调整置信度阈值来控制误报和漏报的平衡。Halcon的create_dl_train_param里有个class_weights参数也可以给少数类加权但我更倾向于直接在数据层面平衡更直观。5.2 增量训练与模型迭代产线不是一成不变的新产品、新工艺、新缺陷类型都会出现。这时候不需要从头训练可以在已有模型基础上做增量训练。Halcon支持加载已训练的模型继续训练这样收敛快也不容易遗忘之前学的东西。我的习惯是每次产线出现新的缺陷类型就采集一批新样本加到数据集里用较低的学习率跑几轮增量训练。这样模型能持续进化。5.3 和传统算子的配合别把深度学习当成万能药。我实际项目里最常见的架构是传统算子做预处理和定位深度学习做最终分类。比如先用find_shape_model把产品区域抠出来再送进分类网络。这样网络只需要关注产品本身不受背景干扰准确率和稳定性都会好很多。Halcon的好处就在于传统算子和深度学习算子可以在同一个流程里无缝衔接这是它相比纯Python方案的一个明显优势。5.4 关于训练时间最后说个实际的。用GPU训练几百张图、20轮大概十几分钟到半小时。用CPU训练同样的数据可能要几个小时甚至更久。所以如果只是做实验建议找台带GPU的机器。如果实在没有GPU可以把epochs调少、图片数量减少先跑通流程验证思路再上GPU正式训练。另外Halcon训练过程中会输出进度和当前的loss、准确率你可以实时看到训练状态。如果loss一直不降别硬等停下来检查数据和参数。
返回列表