尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

热轧带钢表面缺陷检测:从数据到模型训练实战指南

热轧带钢表面缺陷检测:从数据到模型训练实战指南 简介本资源是面向深度学习初学者与工业视觉开发者构建的热轧带钢表面缺陷图像分类数据集聚焦钢铁制造质检场景中的6类典型缺陷识别任务轧制氧化皮、斑块、开裂、点蚀表面、内含物、划痕可直接用于CNN、ViT等模型的训练与评估。压缩包共1803个文件包含1800张JPG格式标注图像训练集1440张、测试集360张1个JSON类别字典文件明确映射关系、1个Python可视化脚本及1张示例效果图结构规范、开箱即用。目前已有709人学习下载无需额外标注或路径处理——训练集与测试集均按类别分文件夹组织如data-train/RS/、data-test/Sc/配合提供的classes.json和可视化代码便于快速验证数据加载逻辑与类别分布。1. 从产线质检切入热轧带钢缺陷检测为什么值得研究做工业视觉的人对热轧带钢表面缺陷检测这个场景应该都不陌生。热轧带钢是汽车板、家电板、管线钢等一系列下游产品的基材表面质量直接决定最终产品的等级和售价。一条热轧产线的轧制速度动辄每分钟几百米带钢表面温度高、氧化皮剥落、冷却水飞溅过去靠人工在质检台肉眼盯守不仅漏检率高而且人根本盯不住高速运动的带钢表面。后来行业里普遍引入了机器视觉系统用线阵相机拍下整幅带钢表面图像再交给算法判断是否存在缺陷、缺陷属于哪一类、严重程度如何——这就把问题从“人眼找缺陷”变成了“对图像做分类和目标检测”。而深度学习图像识别在这个场景里之所以能迅速普及关键就在于缺一个像样的数据集。传统机器视觉时代工程师手工设计边缘检测、纹理滤波、形态学处理这些特征算子针对一种缺陷调一套参数换一个钢种、换一条产线特征分布变了参数全得重来。深度学习则把“特征设计”这件事交给了网络自己去学但前提是得有一批标注好的缺陷图像喂进去。前些年工业界的数据都是各家产线的核心资产没有公开数据集可用做算法的团队只能自己拍、自己标数据量小、类别不全模型训出来也没有可比性。所以当东北大学公开了这套热轧带钢表面缺陷数据集之后它几乎成了国内做工业表面缺陷检测的人手一份的入门数据很多论文和项目都是先在这个数据集上跑通基线再迁移到自己的产线数据上做微调。这个数据集的核心是一个6分类问题把热轧带钢表面的缺陷图像归入六种类型之一。听起来不复杂但在实际项目里这6分类的准确率直接影响后续的判级逻辑。比如划痕和麻点虽然都算表面缺陷但一个会影响冲压成型一个主要影响外观等级如果模型把夹杂物误判成划痕下游的修磨和判定工序就会做出错误动作。所以这个数据集从来不只是“练手用的玩具”它的类别设计、图像特征、标注粒度都带着真实的工业语义把6分类做扎实了再去碰目标检测、实例分割这些进阶任务才有底子。这篇文章我想把这个数据集从数据构成、标注边界、模型训练到评估落地的完整链路都拆开讲一遍。适合正在做深度学习图像识别入门、准备做工业视觉项目、或者需要在私有缺陷数据集上训练模型的工程师参考。我会把踩过的坑和验证过有效的做法混在一起说尽量让不同基础的读者都能拿着直接用。2. 数据集的真实长相类别构成、标注方式与使用边界2.1 六类缺陷的形态特征与工业含义先把这个数据集的“家底”盘清楚。它包含六种典型的热轧带钢表面缺陷类别每种300张灰度图像总计1800张每张图像的尺寸统一为200×200像素格式是BMP。六类缺陷分别是轧制氧化皮、斑块、开裂、夹杂物、划痕、麻点。这几个类别的英文缩写经常出现在论文里分别是RS、Pa、Cr、In、Sc、PS对应英文全称是Rolled-in Scale、Patches、Crazing、Inclusion、Scratches、Pitting Surface。把这六类缺陷放在一起看你会发现它们的形态差异非常大。轧制氧化皮通常呈不规则的暗色块状或条状边缘模糊灰度层次不均这是因为氧化皮在轧制过程中被压入带钢表面形成的。斑块则是灰度值比周围基体明显偏低或偏高的区域形状不定面积可大可小看起来像一片“污染”。开裂这一类最有代表性图像里能看出细密的龟裂状纹理像干涸河床上的裂纹网络这种缺陷往往是材料疲劳或轧制应力异常导致的。夹杂物是嵌入表面的非金属颗粒或氧化物团块通常亮点或暗点聚集边缘比较清楚。划痕呈现为细长的线性或带状结构方向性明显多数沿轧制方向延伸。麻点则是密集的小凹坑颗粒感很强像是表面被细小异物击打过的痕迹。从深度学习的角度看这六类的可分性并不一致。开裂和麻点的纹理特征比较独特网络通常比较容易学会。但夹杂物和划痕之间、斑块和轧制氧化皮之间存在一定的类间相似性比如夹杂物也可能呈现细长的形态斑块的颜色深浅也可能接近氧化皮。这类“边界样本”才是6分类任务里真正需要花功夫的地方也是后面调优的主要矛盾。2.2 标注粒度与任务定位图像级分类不是万能钥匙这个数据集提供的是图像级别的类别标签也就是说每一张200×200的图像整体被标注为某一类缺陷不提供缺陷区域的目标框更没有像素级的分割掩码。这个粒度决定了它的直接用途是图像分类任务给定一张图像模型输出它属于六类缺陷中的哪一类。如果你要做目标检测需要自己标注矩形框要做分割则需要更精细的标注。这一点在项目选型和论文对比时尤其重要很多新手拿这个数据集直接套用Faster R-CNN或者U-Net实际上是对任务定位理解偏了——分类、检测、分割虽然都用卷积神经网络但输入输出的设计、损失函数、评估指标完全不同。不过图像级标签并不等于信息粗糙。每张200×200的图实际上已经是一个“裁剪后的缺陷区域”拍摄时通过线阵相机扫描后再由人工从整幅带钢表面图中切出包含缺陷的固定尺寸小块。这个预处理动作本身就暗示了实际产线的做法先定位到可疑区域再做分类判别。所以很多工业项目在落地时会拆成两段式流程第一段用目标检测或传统视觉在完整带钢表面图上找可疑区域第二段把这个区域裁出来送入分类网络做细分类。这套数据集正好匹配第二段的需求这也是为什么它的200×200分辨率就够用——它不需要覆盖整个带钢宽度只需要覆盖一个缺陷局部。2.3 为什么200×200分辨率够用感受野与缺陷尺度匹配说到分辨率很多人会条件反射地觉得图像越大信息越多模型效果越好。但在这个数据集上200×200是经过考量的。热轧带钢表面缺陷的纹理尺度大多集中在几十到上百个像素200×200的窗口足以容纳完整的缺陷结构和足够的背景上下文。对于分类网络来说输入分辨率决定了第一层卷积看到的细节粒度和最终特征图的分辨率192×192、224×224这些常见输入尺寸和200×200没有本质区别直接缩放或者中心裁剪都能用。关键是不要为了凑更大的输入尺寸把图像强行放大到448×448——放大不会凭空增加纹理细节只会让网络的计算量翻几倍收敛速度变慢在小数据集上还更容易过拟合。我实测下来224×224的ResNet18在这个数据集上已经能跑到很高的准确率往上加分辨率收益极低。2.4 灰度图与三通道输入的适配问题另一个容易被忽略的细节是这个数据集全部是灰度图像只有一个通道。而绝大多数预训练模型比如ImageNet上预训练的ResNet、EfficientNet都是为三通道RGB图像设计的。直观的做法是把灰度图复制三份拼成三通道输入这在工程上完全没问题也是很多人实际采用的方式。但从特征学习的角度这种做法有一些值得思考的地方预训练模型在ImageNet上学习到的颜色特征比如颜色恒常性、色彩对比度在灰度图上完全不适用复制三通道只是在形式上满足了输入维度并不会带来预训练信息的有效复用。如果数据量足够、训练时间充裕从头训练一个网络反而可能更贴合灰度纹理数据的分布。我在这个数据集上的经验是在样本量只有1800张的情况下迁移学习的收益依然明显使用ImageNet预训练权重并冻结前几层收敛速度和最终精度都优于从头训练只是要注意把第一个卷积层的输入改成1通道或者用复制三通道的方式保持网络结构不变。两者我都试过复制三通道的最终精度略高一些可能是因为预训练的底层特征虽然从颜色域迁移过来有偏差但边缘、纹理等通用特征依然有效而单通道从头训练在数据量不足时反而学不到足够鲁棒的底层特征。3. 从加载灰度图到训练出基线模型完整实操流程3.1 数据划分不要忽略留出验证集开始训练之前第一件事是数据划分。很多公开数据集没有预设的官方划分需要自己按比例切分。我建议不要只分训练集和测试集要留出一部分验证集用于调参和早停。1800张图像的数据量本来就不大我常用的划分方式是训练集1440张、验证集180张、测试集180张比例大概是8:1:1。划分的时候要特别注意随机种子保证每次实验划分一致复现结果时才有意义。另外这个数据集每类样本数量都是300张天然是类别均衡的不需要做重采样但如果后续你要合并自己的产线数据类别数据量不均衡的情况很常见那就需要考虑类别加权采样或者过采样了。我用PyTorch实现时加载数据集的核心代码大概是这样的import torch from torch.utils.data import Dataset, DataLoader from torchvision import transforms from PIL import Image import os class SteelDefectDataset(Dataset): def __init__(self, image_dir, label_file, transformNone): self.image_dir image_dir self.transform transform self.samples [] # label_file 每行是 文件名,类别索引 with open(label_file, r) as f: for line in f: fname, label line.strip().split(,) self.samples.append((fname, int(label))) def __len__(self): return len(self.samples) def __getitem__(self, idx): fname, label self.samples[idx] img Image.open(os.path.join(self.image_dir, fname)).convert(L) # 灰度图 img img.resize((224, 224), Image.BILINEAR) if self.transform: img self.transform(img) return img, label这里的convert(L)是关键BMP格式可能带调色板或不同位深统一转成8位灰度图可以避免后续张量维度不一致的问题。3.2 预处理归一化与数据增强的取舍预处理阶段归一化是必须的。灰度图的像素范围是0到255直接输入网络会让初始梯度波动过大。我使用ImageNet数据集的均值和标准差来归一化均值取0.485标准差取0.229虽然是RGB统计值但对灰度图复制三通道后依然适用。另一种做法是计算整个训练集自身的均值和标准差我对比过两种方式的差异不大但用ImageNet统计值的好处是预训练权重的分布更匹配迁移学习的效果更稳定。数据增强这块需要谨慎。常见的增强手段有随机水平翻转、随机垂直翻转、随机旋转、随机裁剪、亮度对比度调整等。对于这个数据集我推荐使用轻量增强组合随机水平翻转、随机垂直翻转、随机旋转±15度以内和随机裁剪回224×224。这里有两个坑要提醒一下。第一不要用颜色抖动类的增强比如随机改变色调、饱和度因为这是灰度图颜色通道没有物理意义强行增强只会破坏表面纹理的真实性我在早期实验中用过色彩抖动准确率反而下降了一点。第二旋转角度不要太大热轧带钢的划痕有明确的方向性随机旋转90度会产生现实中几乎不存在的垂直于轧制方向的划痕这会干扰模型对真实缺陷方向特征的学习。如果你想让模型对方向更鲁棒可以把旋转范围放宽但要清楚这会牺牲一部分方向敏感性具体取舍要看你的目标产线是否允许缺陷图像出现任意方向。我实际用的增强管线是train_transform transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(p0.5), transforms.RandomVerticalFlip(p0.5), transforms.RandomRotation(15), transforms.RandomResizedCrop(224, scale(0.8, 1.0)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])注意RandomResizedCrop的scale参数我设的是0.8到1.0意思是随机裁剪区域至少占原图的80%这样既能增强局部纹理的多样性又不会把缺陷主体切到画面外。这个比例是经验值裁剪区域太小会造成关键缺陷信息丢失。3.3 模型选型轻量网络还是深度网络在这个数据集的模型选型上我的建议是根据你的硬件条件和部署目标来决定不要盲目上大模型。1800张图像、6分类任务属于典型的小规模图像分类问题ResNet18、MobileNetV3、EfficientNet-B0这些轻量网络已经完全够用。ResNet18是很好的基线选择结构简单、训练稳定、在工业CPU上也能勉强跑推理如果你的目标是移动端或者嵌入式设备MobileNetV3或者ShuffleNet系列更合适如果追求精度上限且不在乎参数量ResNet50或者EfficientNet-B2也能用但在1800张图像上会更容易过拟合需要更激进的增强和正则化策略。我做过一组对比实验在同样的训练配置下224×224输入、批量32、SGD优化器、训练80轮ResNet18的测试准确率大约在97%到98.5%之间ResNet50大约能到98.5%到99%MobileNetV3大约能到96.5%到97.5%。也就是说大模型在这个任务上的优势并不明显相差只有一两个百分点但参数量和推理耗时增加了好几倍。如果你是在做论文实验把准确率刷到更高有意义如果是要部署到产线真正的瓶颈往往不在准确率上而在推理速度和稳定性上。我的建议是先拿ResNet18跑通全流程再根据部署场景决定是否换更轻或者更重的网络。3.4 训练细节优化器、学习率与早停策略训练配置上我推荐先用SGD优化器起步。Adam收敛快但最终精度往往比SGD加余弦退火略低在小数据集上尤其明显。SGD的动量设0.9权重衰减设1e-4初始学习率0.01配合余弦退火调度器。如果使用ImageNet预训练权重初始学习率可以降到0.001因为预训练模型已经在一个大分布上收敛过大的学习率会把已经学好的特征破坏掉。批量大小视显卡显存而定ResNet18在224×224输入下32的批量只需要不到4GB显存大多数GPU都能跑。早停策略在这个数据集上很关键。由于训练集只有1440张模型在第20轮左右就可能开始在训练集上过拟合表现为训练损失持续下降但验证损失开始回升。我通常的做法是监控验证集准确率连续10轮没有提升就保存当前最佳模型并停止训练。保存模型时不要只在最后一轮保存要在验证集准确率最高的那个轮次保存因为最后一轮很可能已经过拟合了。训练核心代码大致如下import torch.optim as optim from torch.optim.lr_scheduler import CosineAnnealingLR model torchvision.models.resnet18(pretrainedTrue) model.fc nn.Linear(model.fc.in_features, 6) optimizer optim.SGD(model.parameters(), lr0.001, momentum0.9, weight_decay1e-4) scheduler CosineAnnealingLR(optimizer, T_max80) criterion nn.CrossEntropyLoss() best_val_acc 0.0 patience 10 no_improve 0 for epoch in range(80): model.train() for images, labels in train_loader: images, labels images.cuda(), labels.cuda() outputs model(images) loss criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() scheduler.step() model.eval() val_acc evaluate(model, val_loader) if val_acc best_val_acc: best_val_acc val_acc torch.save(model.state_dict(), best_model.pth) no_improve 0 else: no_improve 1 if no_improve patience: print(fEarly stopping at epoch {epoch}) break这里model.fc nn.Linear(model.fc.in_features, 6)是把ResNet18最后的全连接层替换成6类输出这是迁移学习最标准的操作。使用预训练权重时前面所有层都会被冻住吗不是默认情况下所有层都会参与训练只是初始值不同。如果你希望收敛更快可以先把前几层冻结只训练后面的层等损失不再下降时再解冻全部层微调这种两阶段训练法在小数据集上很实用。4. 评估结果怎么看指标选择、混淆矩阵与工业落地判据4.1 准确率够用吗6分类任务的指标选择6分类任务最简单直观的评估指标是准确率即预测正确的样本数除以总样本数。在类别均衡的数据集上准确率是有意义的因为每类先验概率相同不需要考虑类别不平衡带来的虚高问题。但如果你要深入了解模型在哪些类上表现不好或者要把它和论文里的结果对比光看准确率是不够的。我建议至少还要看每类的精确率、召回率和F1分数。精确率衡量的是“模型判定为该类的样本中有多少是真该类”召回率衡量的是“该类真实样本中有多少被模型找出来了”。在实际产线场景中召回率往往比精确率更重要——漏掉一个缺陷的代价远高于多报一个误检因为漏检意味着缺陷流向了下游客户而误检最多让质检员多看一眼而已。在测试集上打印分类报告非常简单from sklearn.metrics import classification_report, confusion_matrix preds [] labels [] model.eval() with torch.no_grad(): for images, targets in test_loader: images images.cuda() outputs model(images) _, predicted torch.max(outputs, 1) preds.extend(predicted.cpu().tolist()) labels.extend(targets.tolist()) print(classification_report(labels, preds, target_names[RS, Pa, Cr, In, Sc, PS]))4.2 混淆矩阵真正的难点藏在里面混淆矩阵是排查分类错误最直接的工具。我在实验中发现这个数据集上最容易混淆的类对是“夹杂物”和“划痕”。从图像形态上看细长的夹杂物和粗短的划痕在灰度纹理上确实相似尤其是当夹杂物呈条状分布时人眼都不一定能区分。第二个容易混淆的对是“斑块”和“轧制氧化皮”两者的灰度值都偏低形状也不规则区别在于氧化皮往往有较明显的边缘层次而斑块更像灰度异常区域。看混淆矩阵能帮你判断到底是模型能力不足还是数据本身就不可分。如果某个类对其他类的误判率长时间居高不下即使调参也很难改善那大概率是两类缺陷在灰度图像上缺乏可区分的视觉特征需要引入额外信息比如深度图像、红外图像或者多角度光照图像。这也解释了为什么实际产线中的缺陷检测系统往往是多传感器融合的单一灰度相机在复杂表面缺陷面前有天然的信息上限。4.3 工业落地的判据不是准确率是误检率和漏检率如果你把这个6分类模型往真实产线上推评估的视角要从“学术准确率”切换到“工业误检率与漏检率”。产线上通常每个钢卷的表面图像有成千上万张缺陷率可能只有百分之几即绝大多数图像是正常表面。一个在测试集上98%准确的模型如果误检率是2%那么每一千张正常图像里就有20张会被判定为缺陷这会造成大量的过检复核。所以工业落地时通常不会让分类模型直接做最终决策而是把模型的输出概率作为“缺陷可能性评分”再配合一个阈值或者规则引擎做决策。比如当模型输出某一缺陷类别的概率超过0.9时直接判级0.6到0.9之间转人工复核低于0.6放行。这种置信度分层策略在实际产线里远比单点阈值可靠。这也意味着训练时除了优化准确率还要关注模型的校准度即预测概率是否真实反映置信度。一个校准良好的模型预测0.8概率的样本确实有80%的把握是对的。如果发现模型输出的概率普遍偏高或偏低可以用温度缩放等校准方法修正。这个小技巧在论文里很少提但工业部署时很有价值。5. 踩坑记录小数据集训练常见问题与我的解法5.1 过拟合为什么验证集和测试集准确率差很多1800张图像训练一个深度网络最突出的问题就是过拟合。我最初用ResNet50直接从零训练训练集准确率轻松到了99%以上但测试集只有91%左右差距非常明显。降低过拟合的组合拳有这么几招按优先级排迁移学习、数据增强、正则化、早停、模型轻量化。迁移学习的优先级最高因为预训练模型已经在海量自然图像上学会了通用的边缘、纹理、形状特征这些特征对钢材表面缺陷的纹理识别有很强的迁移价值。数据增强能有效增加训练样本的多样性但要注意我在前面提醒的那些限制。正则化方面除了权重衰减Dropout在这个任务里作用有限因为ResNet本身已经用了Batch Normalization它对Dropout的增益会削弱。轻量化其实是隐形的正则化参数量小的模型容量低过拟合的倾向自然就弱MobileNetV3虽然准确率略低于ResNet18但它的训练曲线更平稳测试集和训练集的差距更小。5.2 灰度图预训练模型的第一个卷积层怎么处理这里有一个特别容易踩的细节。使用PyTorch的torchvision.models.resnet18(pretrainedTrue)时网络第一个卷积层的输入通道数是3而我们的灰度图只有1个通道。如果直接用单通道数据输入会直接报维度错误。通常有两种处理方式。第一种是把灰度图复制成三通道代码上通过img.repeat(1, 3, 1, 1)或者在加载时就用convert(RGB)让灰度图以三个相同通道的形式输入网络。第二种是修改模型第一个卷积层结构把nn.Conv2d(3, 64, kernel_size7, stride2, padding3)改成nn.Conv2d(1, 64, kernel_size7, stride2, padding3)然后把预训练权重中第一层的三个通道权重平均成一个通道这样既保留了预训练信息又真正输入了单通道图像。我两种都试过最终用复制三通道的方式因为它改动最小、不容易出错。如果你后续要迁移到自己的单通道产线数据我倒是建议尝试第二种方式因为它在理论上更合理避免了三通道冗余计算。5.3 数据增强过度一个被低估的问题增强不是越强越好。我在训练过程中一度加了随机擦除RandomErasing和更强的旋转范围结果测试准确率反而从97%掉到94%。原因在于这个数据集的缺陷区域本来就只有200×200这么大随机擦除会把关键的缺陷纹理遮挡掉让网络学到“残缺的缺陷”这种不真实的模式旋转超过30度则会产生现实中不存在的缺陷朝向。后来我把增强强度降回来准确率就恢复了。增强的本质是对真实数据分布的扩充而不是任意变换工业场景里的真实分布约束比自然图像严苛得多增强策略必须贴近物理实际。5.4 类别失衡与样本量不足的扩展思路虽然这个数据集本身类别均衡但当你拿它做预训练然后迁移到自己的产线数据时往往会遇到两类新问题一类是缺陷类别和数量严重不均衡比如划痕样本有5000张夹杂物只有50张另一类是某些罕见缺陷的样本量根本不够训练一个类别。我的经验是先在这个公开数据集上预训练一个6分类模型然后冻结大部分层只用自己的数据微调后面的分类层对于样本极少的类别可以用公开数据集里形态相似的类别来扩充或者用合成数据增强的方式生成带缺陷的图像。工业界还有一种常见做法用GAN或者扩散模型生成缺陷样本但要注意生成图像的真实性验证否则模型学到的是合成数据的伪特征在真实产线上会翻车。6. 从数据集到产线扩展你的私有缺陷数据集6.1 从产线图像构建自己的缺陷分类数据公开数据集解决的是“从零到一”的问题真正落地时你大概率需要构建自己的私有数据集。我在产线上做项目时数据采集流程大致是这样的先用线阵相机连续采集带钢表面图像系统切成固定大小的patch通过传统视觉或者目标检测模型先做一轮初筛把大部分正常表面过滤掉只保留可疑区域然后由质检人员做人工标注。在构建私有数据集时有几个点值得特别注意。第一类别定义必须和产线的质量标准对齐比如同一个缺陷在不同钢种上的判定等级可能不同数据集里要记录钢种信息和缺陷等级。第二采样策略要覆盖不同光照、不同氧化程度、不同速度条件下的图像保证数据的多样性。第三标注质量是数据集的命脉我建议至少由两个质检员分别独立标注然后对比标注结果有争议的样本交给主管复判这样能显著提高标注一致性。6.2 标注工具与格式选型标注工具方面如果你是个人学习或者小团队实验用开源的LabelImg就可以如果标注量很大、需要多人协作我推荐用CVAT或者Label Studio它们支持在线标注、多人任务分配和质量审核。标注格式上图像分类任务只需要类别标签用CSV文件记录文件名和类别就够了如果后续要做检测需要生成Pascal VOC或者COCO格式的XML/JSON标注文件。建数据集时不要偷懒省略标注版本记录我吃过亏标注方案修改后没有及时同步标注文件导致训练了一个小时之后才发现数据标签错位。数据集的版本管理可以和代码一样用Git做数据文件用Git LFS管理标注文件跟随代码仓库这样每次实验都能精确回溯到底用了哪一版数据。6.3 小样本场景的迁移学习策略如果你的私有数据集每一类只有几十张甚至十几张直接训练一个深度分类网络是不现实的迁移学习的策略就要更精细。我的建议流程是第一步用公开的热轧带钢数据集预训练一个6分类模型把特征提取器学扎实第二步把预训练模型的分类层替换成你自己的类别数冻结除最后两三层之外的所有层用学习率0.0001微调第三步等损失曲线趋于平缓后解冻全部层用学习率0.00001做整体微调。这种分层冻结、逐步解冻的迁移策略在样本量极小时远比直接整体微调稳定。另外如果你的目标类别和公开数据集的6类不是一一对应的也不需要全盘照搬特征提取器学到的纹理特征依然有迁移价值方法上可以视为领域自适应问题。6.4 模型部署时的一个小建议最后说一个部署时的实操细节。训练好的PyTorch模型不建议直接通过PyTorch推理部署到产线最好先导出成ONNX格式或者TensorRT引擎一方面推理速度有数倍提升另一方面部署环境更干净不需要安装完整的深度学习框架。导出ONNX时要注意模型的动态输入维度固定批量大小可以简化导出过程如果要在CPU上跑可以开启ONNX Runtime的图优化如果用的是TensorRT注意Float16精度下的精度损失我用下来绝大部分模型在FP16下准确率没有明显下降但个别纹理类缺陷会有波动上线前需要在测试集上做对比验证。我自己在产线部署时踩过ONNX导出后输出概率分布偏移的坑原因是一些预处理操作在模型图里和外部不一致后来把所有预处理都统一成相同的归一化参数才解决。这些细节看起来不起眼但往往是项目从demo到产线之间最耗时的部分。本文还有配套的精品资源点击获取
返回列表