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

资讯详情

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

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

Halcon深度学习分类模型实战:从数据标注到产线部署全流程 1. Halcon深度学习分类模型到底是个什么东西1.1 从产线质检的痛点说起我在做视觉项目的这些年被问得最多的一类问题就是“这个划痕算不算不良”“这个字符有没有印歪”“这颗螺丝有没有装反”。早期用传统算法靠的是边缘提取、灰度阈值、模板匹配那一套规则写得好确实能跑但一旦产品换批次、光照有波动、来料表面有油污参数就得重新调维护成本高得吓人。后来Halcon把深度学习模块做进来很多以前“写规则写到吐”的场景终于有了另一条路。Halcon里的深度学习分类模型说白了就是一个“看图打标签”的网络。你给它一张图它输出一个类别比如OK/NG或者A料/B料/C料。它和检测模型Detection、分割模型Segmentation最大的区别在于分类模型不告诉你“东西在哪”只告诉你“这张图整体属于哪一类”。所以它特别适合那些目标占满画面、或者你只关心整图判定的场景比如整片玻璃的外观分级、整块PCB的良品判定、织物瑕疵的粗分类。这里要先把一个概念掰清楚Halcon的深度学习分类本质上是基于整图的分类不是目标检测。很多新手一上来就想用它去框出缺陷位置结果发现标注方式完全不对。分类模型的标注是“文件夹即类别”你把同一类的图丢进同一个文件夹训练时它自动读标签不需要画框、不需要描边。这一点和YOLO那套标注逻辑完全不同别混着用。1.2 分类模型能解决什么问题不能解决什么问题能解决的问题很明确整图级别的良莠判定、材质分级、外观分档、字符有无、装配是否到位这类“一张图一个结论”的任务。我做过一个连接器外观分选的项目六种颜色外壳混线生产传统方法用颜色空间阈值加形态学遇到反光和阴影就翻车换成Halcon分类模型后标注了每类三百来张图训练完准确率直接上到99%以上而且换批次基本不用重调。不能解决的问题也要说清楚它给不出缺陷的坐标和尺寸。如果你的需求是“标出划痕在哪、量出划痕多长”那分类模型帮不了你得用检测或分割模型。另外分类模型对“类间差异极小、类内差异极大”的任务比较吃力比如同一类产品因为拍摄角度不同导致外观差异巨大这时候要么增加数据覆盖要么先做图像对齐预处理。提示判断该不该用分类模型就问自己一句话——“我是不是只需要一个整图结论”是就用分类不是去看检测或分割。1.3 Halcon分类模型的技术底座Halcon的深度学习分类底层用的是卷积神经网络CNN这是深度学习的经典结构靠卷积核在图像上滑动提取特征层层抽象最后接全连接层输出各类别的概率。Halcon把这些封装成了几个算子你不需要自己搭网络、不需要写反向传播调几个参数就能跑。它内部支持多种骨干网络比如pretrained_dl_classifier_compact、pretrained_dl_classifier_enhanced这类预训练模型你可以理解为“别人已经在大数据集上练过的底子”你拿来做迁移学习用少量自己的图就能收敛。迁移学习是这里的关键。从零训练一个分类网络动辄需要几万张标注图普通人根本凑不齐。Halcon的做法是加载预训练权重冻结大部分底层特征提取层只微调高层这样几百张图就能出效果。这也是为什么Halcon深度学习在工业现场落地快——它把门槛压到了“会标注、会调参”就能用的程度。2. 训练之前必须搞清楚的准备工作2.1 环境与授权别在第一步卡住Halcon的深度学习模块不是所有授权都带的这一点必须先确认。你需要的是带深度学习功能的License普通版跑不了训练和推理。我见过太多人代码写得没问题一运行报错最后发现是授权不对。所以动手前先确认你的License支持DL这是硬门槛。软件版本上建议用Halcon 20.11之后的版本越新的版本对DL的支持越完善算子也更稳定。老版本有些分类相关的参数和算子缺失照着新教程操作会对不上。安装路径别带中文和空格这是老生常谈但真的会出问题尤其是读取模型文件的时候。硬件方面训练阶段强烈建议用NVIDIA显卡Halcon的DL训练支持GPU加速CPU训练慢到你会怀疑人生。显存建议8G起步分类模型相对轻量8G基本够用但如果你的输入图像分辨率很高、batch size开得大就得往上加。推理阶段可以用CPU速度也能接受但产线节拍紧的话还是上GPU。2.2 数据采集决定成败的80%我个人的经验是深度学习项目里数据质量占七成调参占两成剩下那一成靠运气。分类模型尤其如此因为它的输入就是整图图里任何无关的干扰都会被网络学进去。采集时要注意几个点。第一每个类别至少准备200到300张图这是底线低于这个数模型很难稳定。类别越多每类需要的图越多。第二类内要有多样性同一类产品在不同光照、不同角度、不同批次下的样子都要覆盖到否则模型学到的只是“这一批的样子”换一批就废。第三类间要平衡别一类五百张另一类五十张这样模型会偏向多数类少数类全判错。还有一个坑背景要一致。如果你训练时背景是白色台面现场却是黑色传送带模型大概率翻车。采集数据的环境要尽量贴近实际部署环境这一点怎么强调都不过分。2.3 数据标注文件夹结构就是标签Halcon分类模型的标注方式非常朴素——一个类别一个文件夹。比如你要分OK和NG两类就建两个文件夹名字叫OK和NG把对应的图分别丢进去。训练时Halcon读取文件夹名作为类别标签就这么简单。但简单不代表随便。文件夹命名要用英文或拼音别用中文避免编码问题。每个文件夹里的图要干净别混入错误类别的图一张错标图可能就让模型学歪。我习惯在标注完成后随机抽检10%的图肉眼过一遍这个动作花不了多少时间但能省掉后面反复重训的麻烦。图像格式上Halcon支持常见的bmp、png、jpg等。建议统一格式和尺寸虽然Halcon会在预处理时做缩放但源图尺寸差异太大对训练没好处。分辨率不用追求极致分类任务通常把图缩到224x224或更小就能跑太大反而拖慢训练。3. Halcon分类模型训练的完整实操流程3.1 第一步读取和预处理数据Halcon训练分类模型的核心算子链路大致是这样的先创建分类器再读取数据集然后训练最后评估和保存。我按实际操作顺序拆开讲。创建分类器用create_dl_classifier这里要指定骨干网络。常用的有pretrained_dl_classifier_compact和pretrained_dl_classifier_enhanced前者轻量、推理快适合产线节拍紧的场景后者精度更高但更重。选哪个看你的需求我一般先用compact试效果不够再换enhanced。读取数据集用read_dl_classifier_data_set传入你的根目录它会自动扫描子文件夹把文件夹名当类别、图当样本。这个算子会返回所有图像路径和对应标签你可以在这一步做训练集和验证集的划分。我通常按8:2分训练集用来学验证集用来盯过拟合。预处理这块Halcon提供了preprocess_dl_classifier_images之类的算子主要做尺寸归一化和像素值标准化。标准化很重要它把像素值缩放到网络期望的范围不做的话训练很难收敛。这一步的参数一般用默认值就行除非你有特殊需求。3.2 第二步设置训练参数参数设置是新手最容易懵的地方我挑几个关键的讲。图像尺寸通过set_dl_classifier_param设置image_width和image_height。分类任务不需要太高分辨率224x224是常见选择。尺寸越大训练越慢、显存占用越高但细节保留越多。如果你的判别依据是细微纹理可以适当加大到320或512。批次大小batch_size一次喂给网络多少张图。太小训练不稳定太大显存吃不消。8到32之间比较常见显存够就往上调。我一般从16开始试。学习率learning_rate控制每次更新的步长。太大震荡不收敛太小训练慢。迁移学习场景下学习率通常设小一点0.001到0.01之间。Halcon有些版本会自动调学习率那就省心了。训练轮数epochs整个数据集过多少遍。太少欠拟合太多过拟合。分类任务一般几十轮就够配合验证集观察验证集准确率不再上升就可以停。这些参数没有万能值得根据你的数据试。我的习惯是先跑一个小轮数看看loss曲线正常的话再加大轮数正式训。3.3 第三步执行训练并监控过程训练用train_dl_classifier这个算子会跑完整个训练流程。训练过程中Halcon会输出loss和准确率信息你要盯着看。loss持续下降、准确率持续上升是正常的如果loss不降或者剧烈震荡说明学习率或数据有问题。训练时间取决于数据量、图像尺寸、显卡性能。几百张图、224尺寸、中端显卡通常几分钟到十几分钟能跑完。如果跑了一两个小时还没完检查一下是不是用了CPU训练或者图像尺寸设太大了。训练完成后用evaluate_dl_classifier在验证集上评估它会给出混淆矩阵和各类准确率。混淆矩阵特别有用能看出模型把哪一类错判成了哪一类。比如OK被大量判成NG可能是NG类样本里混了太多和OK相似的图或者两类本身界限模糊。3.4 第四步保存模型与部署推理训练满意后用write_dl_classifier把模型保存成文件后缀一般是.hdl。这个文件就是你的成果部署时加载它就行。推理阶段用read_dl_classifier加载模型然后对每张待测图调用apply_dl_classifier它会返回每个类别的置信度取最高的那个作为判定结果。实际产线里我通常还会设一个置信度阈值比如最高置信度低于0.8就判为“不确定”转人工复检这样能避免模型在边界样本上乱判。部署时要注意推理用的预处理必须和训练时一致尺寸、标准化参数都要对上否则结果会偏。这一点很多人忽略训练时好好的上线就拉胯八成是预处理没对齐。4. 实战中踩过的坑与排查技巧4.1 训练不收敛怎么办这是最常见的问题。先查学习率太大就调小一个数量级再试。再查数据是不是标注错了、类别文件夹搞混了。还查预处理标准化有没有做。我遇到过一次折腾半天发现是图像路径里有中文Halcon读取时静默失败样本根本没读进去loss自然不动。所以路径全英文这是铁律。4.2 训练集准但验证集差典型的过拟合。解决办法有几个增加数据量、做数据增强旋转、翻转、亮度扰动、减小网络复杂度、加正则化。Halcon支持在训练时开数据增强把augmentation相关参数打开能明显缓解过拟合。另外早停也是个好办法验证集不再提升就停。4.3 现场效果和训练时差距大多半是数据分布不一致。训练时的光照、背景、相机参数和现场不同模型就懵了。解决办法是拿现场图重新标注补充进训练集或者固定现场拍摄条件让推理环境和训练环境尽量一致。我现在的习惯是训练数据里一定混入现场实拍的图哪怕只有几十张效果也比纯实验室数据好。4.4 常见问题速查表问题现象可能原因排查方向训练loss不下降学习率过大、数据未正确读取、预处理缺失调小学习率、检查路径、确认标准化验证集准确率低过拟合、数据量不足加数据、开增强、早停某类总是判错类间相似、该类样本少补充该类样本、检查标注推理结果异常预处理不一致、模型加载错误对齐预处理参数、确认模型文件训练极慢用了CPU、图像尺寸过大切GPU、缩小输入尺寸4.5 几条压箱底的经验第一先跑通再优化。别一上来就追求高精度先用少量数据把整个流程跑通确认环境、算子、保存加载都没问题再回头加数据调参。这样出问题容易定位。第二验证集要独立。别拿训练用过的图当验证集那样准确率虚高没有参考价值。验证集要从一开始就分出来训练过程中不参与学习。第三模型不是越新越好。compact骨干网络在很多工业场景下足够用推理还快。别盲目追大模型产线要的是稳定和节拍。第四保留训练日志。每次训练的参数字、数据版本、准确率都记下来后面复现和对比全靠它。我吃过亏调出一个好模型没记录参数想复现死活调不回来。5. 分类模型之外你还可以这样扩展Halcon的深度学习不止分类这一条路。如果你的任务需要定位缺陷可以看检测模型需要像素级分割可以看分割模型。分类模型往往是入门深度学习视觉的第一站因为它标注简单、流程清晰跑通一遍之后再学检测和分割会顺很多。另外分类模型可以和传统算法结合用。比如先用传统方法做ROI提取把感兴趣区域裁出来再送进分类模型这样能排除背景干扰提升准确率。我在字符有无判定的项目里就这么干过先定位字符区域再分类判断有没有印上比整图分类稳得多。还有一个思路是用分类模型做粗筛把明显OK的放行可疑的再送检测模型细判这样能平衡速度和精度。产线上节拍紧的时候这种分级策略很实用。说到底Halcon深度学习分类模型不是什么黑魔法它就是一个工具。工具好不好用取决于你对场景的理解和对数据的把控。把数据做扎实把流程跑通把参数调明白它就能在产线上稳稳干活。我在实际项目里最大的体会是别指望一次训练就完美迭代是常态第一版能到90%准确率就已经可以上线试跑了剩下的靠现场数据慢慢喂。
返回列表