尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Halcon深度学习分类模型实战:从训练到部署全流程指南

Halcon深度学习分类模型实战:从训练到部署全流程指南 1. Halcon深度学习分类模型到底是什么1.1 从一个实际场景说起很多做机器视觉的朋友第一次接触Halcon的深度学习模块都是被一个很朴素的需求推着走的产线上有一堆零件需要按外观分成合格、划痕、脏污、变形几类传统方法写了几百行特征提取代码换个批次或者换一批光照就崩了。这时候有人告诉你Halcon里有现成的深度学习分类模型喂图就能用于是你打开了Halcon的Deep Learning工具包然后发现——文档全是英文示例代码跑不通参数一大堆不知道从哪下手。这篇文章就是来解决这个问题的。我会把Halcon深度学习分类模型从概念到训练到落地部署的完整链路拆开讲清楚包括它底层用的是什么网络结构、数据要怎么准备、参数怎么调、训练过程中遇到报错怎么排查。不管你是刚接触Halcon深度学习的新手还是已经用过传统算子想升级到深度学习的老手都能从里面找到可以直接抄作业的内容。1.2 Halcon分类模型的本质是什么Halcon的深度学习分类模型本质上是一个图像级分类器。你给它一张图它输出一个类别标签和对应的置信度分数。注意这里的关键词是“图像级”——它判断的是整张图属于哪一类而不是像目标检测那样框出物体位置也不是像语义分割那样标出每个像素的类别。从网络结构上看Halcon的分类模型基于卷积神经网络CNN这是深度学习里处理图像最经典的架构。CNN的核心思想是用卷积核在图像上滑动做特征提取浅层卷积提取边缘、纹理这些低级特征深层卷积提取形状、部件这些高级特征最后通过全连接层输出每个类别的概率。Halcon把这些网络结构封装好了你不需要自己搭网络只需要准备数据、配置参数、启动训练就行。Halcon提供的分类模型有几个预训练的主干网络可选比如pretrained_dl_classifier_compact.hdl和pretrained_dl_classifier_enhanced.hdl。前者模型小、推理快适合对实时性要求高、类别区分度大的场景后者模型大、特征提取能力强适合细粒度分类或者类别之间差异很小的场景。选哪个不是拍脑袋决定的后面我会详细讲选型逻辑。1.3 它能解决什么问题不能解决什么问题Halcon分类模型能做的事情很明确图像级的多分类任务。比如产品表面缺陷分类合格、划痕、凹坑、脏污字符区域分类数字、字母、符号医学图像分类正常、异常食品分拣不同等级、不同成熟度但它不能做的事情也要心里有数不能定位缺陷位置只能告诉你这张图有没有缺陷不能处理多标签场景一张图只能属于一个类别不能直接做像素级分割那是分割模型的事对训练数据量有要求每类至少几十张起步太少效果很难保证注意很多人拿分类模型去做缺陷检测结果发现只能判断“有没有缺陷”但不知道“缺陷在哪”然后又回头改方案。如果你的需求是定位缺陷位置应该用Halcon的异常检测或者目标检测模型不要硬套分类模型。2. 训练前的核心准备工作2.1 数据采集与标注的实操要点数据是深度学习的地基地基没打好后面调参调到天荒地老也没用。Halcon分类模型的数据准备有几个硬性要求第一每个类别至少准备一定数量的图像。官方建议每类至少50张但根据我的实际经验如果类别之间差异明显比如合格品和严重划痕每类30-40张也能跑出不错的效果如果类别之间差异细微比如轻微色差每类至少100张起步而且最好覆盖不同光照、不同角度、不同批次的变化。第二图像要覆盖实际生产中的各种变化。很多人采集数据的时候只采了理想条件下的图结果上线后遇到光照变化、产品位置偏移就翻车。正确的做法是在采集阶段就刻意引入变化不同时间段采、不同光照条件采、不同操作员采、不同批次的产品都采一些。这样训练出来的模型泛化能力才强。第三标注要准确且一致。Halcon分类模型的数据组织方式是按文件夹分类每个类别一个文件夹文件夹名就是类别名。比如dataset/ ├── good/ │ ├── 001.png │ ├── 002.png │ └── ... ├── scratch/ │ ├── 001.png │ ├── 002.png │ └── ... ├── dirt/ │ ├── 001.png │ └── ... └── deformation/ ├── 001.png └── ...这种组织方式很简单但有一个坑同一个样本不能同时属于两个类别。如果你有一张图既有划痕又有脏污必须选一个主导类别放进去或者单独建一个“划痕脏污”的复合类别。标注不一致是分类模型训练失败最常见的原因之一。2.2 数据集划分的策略与比例Halcon训练分类模型时需要把数据集分成三部分训练集、验证集、测试集。训练集用来更新网络权重模型从这部分数据中学习特征验证集用来监控训练过程中的性能判断是否过拟合调整超参数测试集用来最终评估模型性能训练过程中绝对不能碰常见的划分比例是70%训练、15%验证、15%测试或者80%训练、10%验证、10%测试。但这不是死规定如果数据量少可以适当提高训练集比例比如85%训练、10%验证、5%测试。划分的时候有一个关键原则同一批次或同一产品的图像不能同时出现在训练集和测试集中。否则模型可能记住了这个批次的特征测试集准确率虚高上线后实际效果很差。这个问题在工业场景里特别常见因为很多工厂的数据是按批次采集的如果不注意训练集和测试集里都有同一批产品的图评估结果就不可信了。Halcon提供了split_dl_dataset算子来帮助划分数据集它可以按比例随机划分也支持按文件名前缀分组划分。我一般建议在采集数据阶段就给不同批次的图加前缀比如batch01_001.png、batch02_001.png然后用分组划分的方式确保同一批次的图只出现在一个集合里。2.3 Halcon环境配置与License注意事项在开始训练之前需要确认Halcon环境配置正确。Halcon的深度学习功能需要深度学习License普通的Halcon License是不包含深度学习模块的。如果你在调用深度学习算子时遇到报错第一件事就是检查License是否支持。Halcon深度学习对硬件也有要求GPU强烈建议使用NVIDIA GPUHalcon的深度学习训练和推理都支持GPU加速。没有GPU的话训练速度会慢到让你怀疑人生。显存建议8GB以上如果图像分辨率高或者batch size大可能需要更大显存。CUDA和cuDNNHalcon对CUDA和cuDNN版本有要求不同版本的Halcon对应的CUDA版本不同。安装之前一定要查清楚你的Halcon版本支持哪个CUDA版本版本不匹配会导致GPU无法调用。CPU也支持纯CPU训练和推理但速度慢很多只适合验证流程或者小数据集测试。提示Halcon的深度学习License分为训练License和推理License。训练License允许你训练模型推理License只允许你运行已经训练好的模型。如果你只是部署模型到产线不需要训练买推理License就够了成本会低很多。3. 分类模型训练全流程拆解3.1 创建与配置分类模型Halcon训练分类模型的第一步是创建模型。核心算子有两个* 读取预训练模型 read_dl_classifier (pretrained_dl_classifier_compact.hdl, DLClassifierHandle) * 或者创建新的分类模型 create_dl_classifier (pretrained_dl_classifier_compact.hdl, classification, DLClassifierHandle)创建模型之后需要设置一系列参数* 设置图像尺寸 set_dl_classifier_param (DLClassifierHandle, image_width, 224) set_dl_classifier_param (DLClassifierHandle, image_height, 224) set_dl_classifier_param (DLClassifierHandle, image_num_channels, 3) * 设置类别名称 set_dl_classifier_param (DLClassifierHandle, class_names, [good, scratch, dirt, deformation]) * 设置batch size set_dl_classifier_param (DLClassifierHandle, batch_size, 16) * 设置学习率 set_dl_classifier_param (DLClassifierHandle, learning_rate, 0.001)这里有几个参数需要重点解释image_width和image_height输入图像的尺寸。Halcon会把所有训练图像缩放到这个尺寸。常用的尺寸有224x224、256x256、320x320。尺寸越大模型能看到的细节越多但训练和推理速度越慢显存占用也越大。我的经验是如果缺陷特征比较细微用320x320如果缺陷比较明显224x224就够了。batch_size每次迭代送入网络的图像数量。batch size越大训练越稳定但显存占用越大。一般从8或16开始试如果显存不够就往下调。注意batch size不能超过训练集的总样本数。learning_rate学习率控制权重更新的步长。太大容易震荡不收敛太小收敛慢。Halcon默认的学习率一般是0.001如果训练过程中loss下降很慢可以适当调大如果loss震荡厉害就调小。3.2 数据加载与预处理Halcon加载分类数据集的方式很直接就是指定数据集路径* 设置数据集路径 set_dl_classifier_param (DLClassifierHandle, data_directory, dataset) * 或者分别指定训练集和验证集 read_dl_classifier_data (DLClassifierHandle, dataset/train, train) read_dl_classifier_data (DLClassifierHandle, dataset/val, validation)Halcon会自动从文件夹结构中读取类别信息文件夹名就是类别名。加载完成后可以用get_dl_classifier_param查看类别列表和样本数量确认数据读取正确。数据预处理方面Halcon在训练时会自动做几件事图像缩放把所有图像缩放到设定的image_width和image_height归一化把像素值归一化到一定范围通常是[0,1]或[-1,1]数据增强Halcon支持在训练时开启数据增强包括随机旋转、随机裁剪、随机翻转、颜色抖动等数据增强是提升模型泛化能力的利器特别是当训练数据量不够的时候。Halcon通过set_dl_classifier_param设置增强参数* 开启数据增强 set_dl_classifier_param (DLClassifierHandle, augmentation, true) * 设置增强类型 set_dl_classifier_param (DLClassifierHandle, augmentation_rotation, 15) set_dl_classifier_param (DLClassifierHandle, augmentation_scale, 0.1) set_dl_classifier_param (DLClassifierHandle, augmentation_brightness, 0.1)注意数据增强不是越多越好。如果你的缺陷是方向敏感的比如划痕方向是分类依据就不要开随机旋转。如果颜色是分类依据就不要开颜色抖动。增强策略要和实际场景匹配。3.3 训练过程与参数调优Halcon训练分类模型的核心算子是train_dl_classifier* 设置训练参数 set_dl_classifier_param (DLClassifierHandle, epochs, 50) set_dl_classifier_param (DLClassifierHandle, learning_rate, 0.001) set_dl_classifier_param (DLClassifierHandle, momentum, 0.9) set_dl_classifier_param (DLClassifierHandle, weight_decay, 0.0001) * 开始训练 train_dl_classifier (DLClassifierHandle, dataset/train, dataset/val)训练过程中Halcon会输出每个epoch的训练loss和验证准确率。你需要盯着这些指标判断训练状态训练loss持续下降验证准确率持续上升正常训练中训练loss下降验证准确率不升反降过拟合了需要增加数据增强、减少模型复杂度、或者提前停止训练训练loss不下降学习率可能太小或者数据有问题训练loss震荡厉害学习率可能太大或者batch size太小epochs训练轮数即整个训练集被遍历多少次。太少模型没学够太多容易过拟合。一般从30-50开始试观察验证准确率曲线如果在某个epoch之后验证准确率不再提升甚至下降就可以停在那里。momentum动量加速梯度下降并抑制震荡。一般设0.9。weight_decay权重衰减防止过拟合。一般设0.0001到0.001。训练完成后用evaluate_dl_classifier在测试集上评估模型性能* 评估模型 evaluate_dl_classifier (DLClassifierHandle, dataset/test, top1_error, Top1Error)Top1Error就是top-1错误率越低越好。如果错误率很高需要回头检查数据质量、类别平衡性、参数设置。3.4 模型保存与推理部署训练完成后把模型保存下来* 保存模型 write_dl_classifier (DLClassifierHandle, my_classifier.hdl)推理的时候加载模型然后对单张图或批量图进行分类* 加载模型 read_dl_classifier (my_classifier.hdl, DLClassifierHandle) * 对单张图分类 read_image (Image, test.png) apply_dl_classifier (Image, DLClassifierHandle, DLClassifierResult) * 获取分类结果 get_dl_classifier_result (DLClassifierResult, predicted_classes, PredictedClass) get_dl_classifier_result (DLClassifierResult, confidences, Confidence)推理阶段有几个优化点批量推理如果有多张图要分类可以组成batch一起推理比单张推理快很多GPU推理确保推理时也使用GPU速度比CPU快一个数量级图像预处理一致性推理时的图像预处理必须和训练时一致包括缩放尺寸、归一化方式等否则准确率会下降4. 常见问题与排查技巧实录4.1 训练不收敛或准确率上不去这是最常见的问题原因可能有很多我按排查优先级列一下问题现象可能原因排查方法解决方案loss不下降学习率太小查看loss曲线调大学习率比如从0.001调到0.01loss震荡学习率太大或batch size太小查看loss曲线调小学习率或增大batch size验证准确率远低于训练准确率过拟合对比训练和验证指标增加数据增强、增加数据量、减小模型所有样本预测为同一类类别严重不平衡查看类别分布补充少数类样本或设置类别权重准确率始终在随机水平数据标注错误或图像尺寸不对人工检查数据修正标注、检查预处理类别不平衡是工业场景里特别常见的问题。比如合格品有1000张划痕只有30张模型会倾向于把所有图都预测为合格品因为这样loss最低。解决办法有几种一是补充少数类样本这是最直接有效的二是在训练时设置类别权重让少数类的loss权重更大三是用数据增强对少数类进行过采样。Halcon支持通过set_dl_classifier_param设置类别权重set_dl_classifier_param (DLClassifierHandle, class_weights, [1.0, 5.0, 5.0, 5.0])4.2 GPU显存不足与训练速度优化显存不足的报错信息通常是out of memory或者CUDA error。解决办法减小batch size这是最直接的方法从16降到8甚至4减小图像尺寸从320x320降到224x224使用更小的模型从enhanced换成compact清理显存确保没有其他程序占用GPU训练速度优化方面除了用GPU之外还可以使用SSD硬盘数据加载速度对训练速度影响很大机械硬盘会成为瓶颈预加载数据Halcon支持把数据预加载到内存减少IO等待混合精度训练如果GPU支持可以开启混合精度速度能提升30%以上4.3 推理阶段准确率下降的排查训练时准确率很高上线后准确率下降这是部署阶段最让人头疼的问题。常见原因光照变化训练数据的光照条件和实际产线不一致。解决办法是在训练数据里加入各种光照条件的图或者在推理前做光照归一化。图像预处理不一致训练时用了某种缩放和归一化方式推理时用了另一种。检查推理代码中的预处理步骤是否和训练时完全一致。相机或镜头更换换了相机或镜头后图像的色彩、畸变、分辨率都可能变化。解决办法是重新采集数据微调模型或者做图像校正。产品批次变化新批次的产品外观和训练数据有差异。这是最难的只能通过持续采集新数据、定期更新模型来解决。实操心得我一般会在产线部署后持续收集推理时的图像和分类结果定期人工抽检。如果发现某些样本分类错误就把这些样本加入训练集重新训练模型。这个过程叫“主动学习”是保持模型长期有效的关键。4.4 Halcon版本兼容性与License问题Halcon不同版本之间的深度学习功能有差异比如Halcon 20.11和Halcon 23.11的API可能有变化。如果你从网上找的示例代码跑不通先检查Halcon版本是否匹配。License问题也是高频坑点。深度学习License和普通License是分开的如果没有深度学习License调用create_dl_classifier等算子时会直接报错。另外训练License和推理License也不同训练License可以推理但推理License不能训练。还有一个容易忽略的点Halcon深度学习模型文件.hdl是版本相关的。用Halcon 20.11训练的模型在Halcon 23.11上可能加载不了。如果要在不同版本之间迁移模型需要确认版本兼容性或者用对应版本重新训练。5. 从训练到落地的完整经验总结5.1 数据质量决定上限模型调参只是逼近上限这句话我在很多场合说过但还是要再强调一遍。我见过太多人花大量时间调学习率、调batch size、换模型结构但训练数据只有几十张而且标注还不准确最后效果怎么都上不去。深度学习的上限是由数据决定的模型和参数只是让你逼近这个上限。在工业场景里数据采集和标注的成本往往比训练本身高得多。我的建议是在项目开始阶段就把数据采集规划好尽量覆盖各种变化条件标注规范要统一。如果数据量不够宁可先花时间采集数据也不要急着训练模型。5.2 小步快跑先跑通再优化Halcon深度学习分类模型的训练流程其实不复杂但涉及很多参数和配置。我的建议是先用少量数据跑通整个流程确认环境配置、数据加载、训练、评估、推理都能正常工作然后再逐步增加数据量、调整参数、优化性能。不要一上来就追求完美先把baseline跑出来哪怕准确率只有70%至少你知道流程是通的。然后在这个基础上分析错误样本有针对性地补充数据或调整参数一步步把准确率提上去。5.3 模型部署后的持续维护模型部署到产线不是终点而是起点。产线的光照、产品、环境都会变化模型需要持续维护。我一般会做几件事记录推理日志保存每张推理图像和分类结果方便后续分析定期抽检每周或每月人工抽检一批推理结果统计实际准确率错误样本收集把分类错误的样本收集起来加入训练集定期更新模型根据新收集的数据每隔一段时间重新训练模型这套流程看起来麻烦但比起模型突然失效导致产线停线这点维护成本是值得的。5.4 关于Halcon深度学习分类模型的个人体会Halcon的深度学习分类模型最大的优势是集成度高、上手快。你不需要自己搭网络、写训练循环、处理数据加载Halcon把这些都封装好了你只需要准备数据、配置参数、调用算子就行。对于工业视觉从业者来说这大大降低了深度学习的门槛。但它也有局限性。Halcon的模型结构和训练策略是固定的你没法像PyTorch那样自由地修改网络结构、自定义损失函数、实现复杂的训练策略。如果你的需求比较特殊比如多标签分类、细粒度分类、小样本学习Halcon的现成模型可能不够用需要考虑用其他框架训练好模型再集成到Halcon里。另外Halcon深度学习的文档和社区资源相对PyTorch、TensorFlow来说少很多遇到问题更多要靠自己排查和实验。但这也意味着如果你把Halcon深度学习用熟了在工业视觉领域会是一个很有竞争力的技能。最后分享一个小技巧Halcon的深度学习模型训练时可以先用小图像尺寸快速试错比如128x128确认流程和参数没问题后再用224x224或320x320正式训练。这样能节省大量时间特别是在调试阶段。
返回列表