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

资讯详情

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

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

Halcon深度学习分类模型实战:从数据准备到产线部署全流程 1. Halcon深度学习分类模型到底是个什么东西1.1 从产线质检的痛点说起我在做机器视觉项目这些年被问得最多的一类问题就是“这个划痕算不算不良”“这个字符有没有印歪”“这颗螺丝有没有装反”——这些问题用传统的Halcon算子比如find_shape_model、measure_pos、threshold能做但做得非常痛苦。因为传统算子本质上是靠边缘、灰度、几何特征去卡阈值一旦产品换批次、光照飘一点、来料表面有油污阈值就得重新调调到最后工程师自己都崩溃。Halcon的深度学习分类模型就是来解决这类“人一眼能看出来但写规则写到吐”的问题的。它属于Halcon Deep Learning系列里最基础、最容易上手的一类模型官方叫Deep Learning Classification底层是一个卷积神经网络CNN分类器。你给它一批已经分好类的图片比如“OK”和“NG”两个文件夹它自己学特征最后输出一个类别标签加一个置信度分数。这里要先把概念理清楚很多人一上来就搞混模型类型解决什么问题典型算子输出分类 Classification这张图属于哪一类classify_image类别 置信度检测 Detection图里有没有目标、在哪detect系列框 类别分割 Segmentation每个像素属于哪一类segment_image像素级掩膜异常检测 Anomaly没见过的不良长啥样apply_dl_model异常分数分类模型是这四类里数据标注成本最低的——你不需要画框不需要标像素只要把图片按文件夹分好类就行。这也是为什么我一般建议新手从分类模型入门跑通一遍整个流程再去碰检测和分割。1.2 它和OpenCV、YOLO那套有什么区别经常有人问我“Halcon深度学习和OpenCV、YOLO有啥区别我直接用YOLOv8分类不香吗”这个问题得分开看。YOLO系列包括v8、v11、v13这些本质是通用目标检测框架分类只是它的一个附带能力生态活跃、社区模型多、预训练权重丰富训练一般跑在Python PyTorch上。而Halcon的深度学习是深度集成在Halcon自己的算子体系里的它的优势不在模型本身有多先进而在于部署链路极短训练完的模型直接就是.hdl文件read_dl_model读进来就能在Halcon里推理不需要Python环境、不需要ONNX转换、不需要TensorRT折腾。和传统算子无缝混用你可以先用threshold粗定位再reduce_domain裁出ROI然后送进分类模型整个流程在一个.hdev里跑完。工业现场稳定性Halcon的推理对CPU/GPU的兼容性做得比较扎实产线上工控机没有独显也能跑慢一点而已。反过来说如果你追求SOTA精度、要做超大模型、要用LoRA微调、要玩多模态那Halcon确实不是首选该上PyTorch还是得上。工具没有优劣只有合不合适。产线单机部署、要求快速落地、工程师是Halcon背景的选Halcon分类模型基本不会错。1.3 适合谁来学需要什么前置基础这篇内容我假设你满足以下条件装好了Halcon20.11之后的版本对深度学习支持比较完整建议23.11或更新有可用的License深度学习模块需要单独的授权这点后面会专门讲。会基本的Halcon操作读图、开窗口、显示、写个简单的for循环。对“训练集/验证集/测试集”这三个词不陌生哪怕只是听说过。如果你连Halcon的界面都没打开过建议先去把read_image、dev_display、dev_open_window这几个算子跑一遍再回来。分类模型的代码量其实不大难的是数据准备和参数调优的思路这两块我会重点展开。2. 训练之前必须想清楚的几件事2.1 你的问题真的适合用分类模型吗这是我最想先泼的一盆冷水。分类模型的隐含前提是一张图或一个ROI里只有一个主体且这个主体整体属于某一类。举几个适合和不适合的例子你对号入座适合整块PCB板判断“良品/不良品”一个瓶盖判断“正/反”一颗药片判断“完整/破损”。不适合一张图里要同时找出3个缺陷并分别定位这是检测的活要判断缺陷的具体形状轮廓这是分割的活不良样本极少、根本凑不齐第二类这是异常检测的活。我见过太多人拿分类模型硬做检测的活最后精度上不去回头骂Halcon不行。不是模型不行是问题选错了工具。判断标准很简单如果你标注的时候只需要给整张图打一个标签那就是分类如果需要画框或涂像素那就换模型。2.2 数据集的三个硬指标Halcon分类模型对数据的要求我总结成三个硬指标缺一个都容易翻车。第一类别要平衡。假设你做OK/NG二分类OK有2000张NG只有50张模型会学出一个“无脑判OK”的偷懒策略准确率照样95%以上但NG一个都抓不到。经验值是每类至少100张起步类间数量比控制在1:3以内。NG样本实在少就靠数据增强旋转、亮度扰动、加噪声硬凑或者用gen_dl_samples配合增强参数。第二图像要一致。训练图和现场推理图必须来自同一套成像系统——同样的相机、镜头、光源、曝光、工作距离。我踩过最深的坑就是实验室用环形光拍的训练集现场换成条形光模型直接废掉。如果现场光照会波动训练集里就要主动把不同光照条件下的图都放进去让模型学会忽略光照差异。第三标注要干净。分类的“标注”就是文件夹分类听起来简单但错标一张图的代价比检测里错画一个框大得多。我一般会做两轮复核第一轮按文件夹抽查第二轮把模型训出来之后专门看置信度在0.5到0.7之间的那些图这些是模型“犹豫”的样本十有八九是标错了或者本身就是模棱两可的边界样本。2.3 网络选型pretrained_dl_classifier 那几档怎么选Halcon提供了几个预训练的分类网络骨干常见的有网络名称输入尺寸特点适用场景pretrained_dl_classifier_compact.hdl224x224最轻量速度快类别少、特征明显、算力紧张pretrained_dl_classifier_enhanced.hdl224x224中等容量大多数工业场景的默认选择pretrained_dl_classifier_resnet50.hdl224x224容量大精度高类别多、类间差异细微选型的逻辑是先用compact跑一版baseline如果验证集精度不够再往上升级。不要一上来就上ResNet50训练慢、显存吃得多而且在小数据集上反而容易过拟合。我做过一个药片缺陷分类的项目compact就能到98.5%换enhanced只涨了0.3%但训练时间翻倍完全不划算。另外要注意这些预训练模型是在ImageNet上训出来的输入尺寸固定224x224。你的原始图如果不是这个比例Halcon会做缩放缩放会丢细节。如果缺陷本身很小比如一个2像素的针孔缩到224之后可能就没了。这种情况要么把ROI裁得更紧要么考虑用检测模型。3. 从零到一完整训练流程拆解3.1 数据准备与目录结构Halcon读数据有两种方式一种是用read_dl_classifier_data从文件夹读另一种是用read_dl_samples从.hdict文件读。新手我强烈建议用文件夹方式直观、好排查。目录结构长这样dataset/ ├── train/ │ ├── ok/ │ │ ├── 001.png │ │ ├── 002.png │ │ └── ... │ └── ng/ │ ├── 001.png │ └── ... └── validation/ ├── ok/ └── ng/几个实操细节图片格式统一别混着png、bmp、jpg。jpg有压缩伪影工业场景尽量用png或bmp。文件名别用中文和空格Halcon某些版本对路径编码处理不友好容易读图失败。train和validation的划分比例我一般用8:2。如果数据量少于500张用7:3验证集多一点更能反映真实泛化能力。划分要随机但可复现。别按文件名顺序切否则可能train全是上午拍的、validation全是下午拍的光照一变就露馅。用shuffle打乱后再切。3.2 核心算子逐个讲透整个训练流程的核心算子其实就十来个我按执行顺序列出来每个都说说它到底在干嘛。第一步读数据。read_dl_classifier_data (dataset/train, class_name, TrainData, TrainLabels)这个算子会扫描目录把每个子文件夹名当作类别名返回图像路径元组和对应的标签元组。注意它返回的是路径不是图像本身真正读图是在后面生成batch的时候。第二步创建分类器。create_dl_classifier (pretrained_dl_classifier_enhanced.hdl, 2, \ softmax, DLClassifierHandle)第二个参数2是类别数这个必须和你文件夹里的类别数严格一致多一个少一个都会报错。softmax是输出层分类任务基本都用它。第三步设置超参数。set_dl_classifier_param (DLClassifierHandle, batch_size, 8) set_dl_classifier_param (DLClassifierHandle, learning_rate, 0.001) set_dl_classifier_param (DLClassifierHandle, momentum, 0.9) set_dl_classifier_param (DLClassifierHandle, weight_prior, 0.0001)这几个参数是调优的重灾区我后面单独开一节讲。第四步预处理参数。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)如果你用的是灰度图image_num_channels设1但预训练模型是按3通道训的设1会丢掉预训练权重的第一层精度可能受影响。我的做法是灰度图也复制成3通道保持和预训练一致。第五步训练。train_dl_classifier_batch (TrainData, TrainLabels, DLClassifierHandle)这个算子内部会自动做数据增强旋转、翻转、亮度扰动你不需要自己写增强代码。训练轮数通过set_dl_classifier_param的epochs控制或者用train_dl_classifier_batch的循环次数控制。第六步评估。evaluate_dl_classifier (ValidationData, DLClassifierHandle, EvaluationResult)返回的结果里包含混淆矩阵、各类精度、总体精度。重点看混淆矩阵它能告诉你模型到底把哪一类错判成了哪一类。第七步保存。write_dl_classifier (DLClassifierHandle, my_classifier.hdl)保存下来的.hdl文件就是最终产物部署时read_dl_classifier读进来即可。3.3 一个能直接跑的最小示例下面这段代码是我平时做baseline用的模板改改路径就能跑* 读训练数据 read_dl_classifier_data (dataset/train, class_name, TrainData, TrainLabels) read_dl_classifier_data (dataset/validation, class_name, ValData, ValLabels) * 创建分类器2类 create_dl_classifier (pretrained_dl_classifier_enhanced.hdl, 2, softmax, DLHandle) * 设置参数 set_dl_classifier_param (DLHandle, image_width, 224) set_dl_classifier_param (DLHandle, image_height, 224) set_dl_classifier_param (DLHandle, image_num_channels, 3) set_dl_classifier_param (DLHandle, batch_size, 8) set_dl_classifier_param (DLHandle, learning_rate, 0.001) set_dl_classifier_param (DLHandle, epochs, 30) * 训练 train_dl_classifier_batch (TrainData, TrainLabels, DLHandle) * 评估 evaluate_dl_classifier (ValData, ValLabels, DLHandle, EvalResult) * 保存 write_dl_classifier (DLHandle, pill_classifier.hdl)这段代码跑通你就完成了80%的工作。剩下的20%是调参和排查问题那才是真正拉开差距的地方。4. 参数调优与避坑实战4.1 学习率、batch_size、epochs 怎么配这三个参数是训练的核心我用一个表格把经验值列出来再说背后的逻辑。参数常用范围我的默认值调整方向learning_rate0.0001 ~ 0.010.001精度不涨就降震荡就再降batch_size4 ~ 328显存够就加大小数据集用4epochs20 ~ 10030看验证集精度曲线不再涨就停学习率是最关键的。太大loss来回震荡不收敛太小训练慢到怀疑人生。我的经验是从0.001起步如果训练loss在前5个epoch就掉到很低但验证精度上不去说明过拟合了降学习率没用得加数据或加正则。如果loss一直居高不下先检查数据标注是不是有问题。batch_size影响的是梯度估计的稳定性。batch太小比如2梯度噪声大训练不稳定batch太大泛化可能变差。工业场景数据量通常不大8是个比较稳的中间值。显存不够就降到4别硬撑。epochs不是越多越好。我一般会设一个较大的值比如100然后每5个epoch评估一次验证集精度连续3次不涨就提前停。Halcon本身没有内置的early stopping得自己在循环里写判断。4.2 数据增强Halcon帮你做了多少Halcon的train_dl_classifier_batch内部默认会做这些增强随机旋转小角度随机缩放随机亮度/对比度扰动随机裁剪这些对工业场景基本够用。但如果你有特殊需求比如产品会360度旋转那默认的小角度旋转就不够了得自己在预处理阶段用rotate_image把图转一圈生成多个副本。注意增强不是越多越好。过度增强会让模型学到“旋转不变性”这种在产线上根本不存在的特性反而降低精度。增强策略要贴合实际工况——产线上产品怎么摆放训练集就怎么增强。4.3 常见报错与排查速查表我把这些年踩过的坑整理成一张表遇到问题先对号入座现象可能原因排查方法训练loss不下降学习率过大/数据标注错乱降到0.0001重试抽查标注验证精度远低于训练精度过拟合加数据、加weight_prior、减epochs某一类精度特别低类间不平衡补充该类样本或调class_weights读图报错路径含中文/格式不支持改英文路径统一pngLicense报错深度学习模块未授权检查License是否含DL模块推理速度慢用了大网络/CPU推理换compact或启用GPU置信度普遍偏低训练不充分/域差异大加epochs检查训练与现场成像一致性关于License我要多说一句。Halcon的深度学习模块是需要单独授权的普通License跑不了create_dl_classifier。很多人下载安装完发现算子报错第一反应是版本问题其实是License没覆盖DL模块。这个在项目启动前就要确认别等到训练到一半才发现。4.4 推理部署训练完怎么用起来训练只是上半场部署才是见真章的地方。推理的核心算子就两个read_dl_classifier (pill_classifier.hdl, DLHandle) classify_image (Image, DLHandle, ClassName, Confidence)classify_image返回预测类别和置信度。实际产线上我一般会加一个置信度阈值判断置信度高于0.9直接判低于0.9的图单独存下来人工复核。这样既保证了产线节拍又不会漏掉边界样本。如果要在C或C#里调用思路是一样的ReadDlClassifier读模型ClassifyImage推理。Halcon的深度学习模型跨语言调用非常干净不像PyTorch模型还得转ONNX、装运行时这点在工业部署上是实打实的优势。5. 几个容易被忽略的进阶细节5.1 类别不平衡的补救手段前面提过类间数量比控制在1:3以内但现实中NG样本就是少怎么办三个办法加权损失Halcon支持通过class_weights给不同类别设权重让少样本类的loss贡献更大。这个参数在set_dl_classifier_param里设。过采样把NG样本复制多份配合不同的增强参数让每轮训练都能见到足够多的NG。合成样本用gen_dl_samples配合增强算子程序化生成变体。我一般优先用加权损失简单直接。过采样容易导致过拟合合成样本则要小心生成得太假。5.2 训练集和现场不一致怎么办这是工业视觉最头疼的问题。实验室训得好好的现场一上就拉胯。我的处理流程是先量化差异拿现场图跑一遍模型看置信度分布。如果普遍在0.6以下说明域差异很大。小样本微调从现场采几十张图混进训练集重新训。不需要全部重训在已有模型基础上继续train_dl_classifier_batch即可。在线迭代产线跑起来之后把置信度低的图定期回收人工标好再喂回去。这是个持续迭代的过程不是一锤子买卖。5.3 模型评估不能只看准确率准确率这个指标在类别不平衡时会骗人。OK占95%模型全判OK也有95%准确率但NG一个没抓到。所以我评估时必看三个东西混淆矩阵看清楚错判的方向。每类召回率NG的召回率才是产线真正关心的。置信度分布正常样本和异常样本的置信度是否分得开。如果NG召回率上不去宁可牺牲一点OK的准确率把判定阈值往NG方向偏。产线上漏检的代价远大于误检。6. 我个人的一些实操体会最后分享几个文档里不会写、但实际项目里特别管用的经验。第一先跑通再优化。别一上来就纠结网络选型、参数调优。用compact网络、默认参数、30个epoch先跑一版看看baseline在哪。有了baseline后面每一步调整才知道是涨了还是跌了。第二数据质量决定上限模型和参数只决定你能不能摸到上限。我见过太多人把时间花在调参上结果回头一看训练集里混了十几张标错的图。花半天时间把数据清洗干净比调三天参数管用。第三训练日志一定要存。每次训练的配置、精度、混淆矩阵都记下来最好连模型文件一起归档。产线上出问题回溯的时候你会感谢当时留了日志的自己。第四别迷信端到端。Halcon分类模型和传统算子结合使用效果往往比纯深度学习好。比如先用threshold把ROI裁出来再分类比整图直接分类精度高得多因为模型不用去学“忽略背景”这件事。第五模型是要养的。上线不是终点是起点。产线换料、换批次、换季节成像都会变。建立一个定期回收低置信度样本、人工复核、增量训练的闭环模型才能长期稳定。这套流程我在好几个项目上跑过从药片缺陷到瓶盖正反从PCB良品判定到字符印刷质量基本都能落地。Halcon的深度学习分类模型不是什么黑科技它就是一个把CNN封装成工业算子的工具用好它的关键不在模型本身而在你对问题的理解和对数据的把控。
返回列表