-
在扩散模型中,除了 GroupNorm(GN),还有多种归一化方法因适配 “小批量训练”“噪声分布动态变化”“高分辨率生成” 等特性而被广泛应用。这些方法的核心设计目标是减少对批次统计的依赖,同时稳定特征分布,辅助模型精准学习噪声预测规律。以下是几类典型方法及其适配性分析:一、InstanceNorm 及变体(InstanceNorm, AdaIN)1. InstanceNorm(IN)原理:对每个样本的每个通道单独计算均值和方差(即 “单样本单通道归一化”),完全不依赖批次信息。 公式:y=σc,i2+ϵx−μc,i⋅γc+βc,其中μc,i和σc,i2是第i个样本第c通道的均值和方差。适配扩散模型的优势:比 GroupNorm 更 “关注单个样本的通道特性”,适合保留样本的独特风格(如色彩分布、纹理模式),在风格迁移类扩散模型中表现优异。完全摆脱批次依赖,即使批量大小为 1,归一化仍稳定,适合高分辨率图像的小批量训练。局限性:过度强调单通道独立性,可能破坏通道间的语义关联(如 RGB 三通道的颜色协同性),因此常与其他方法结合使用。2. AdaIN(Adaptive InstanceNorm)原理:在 InstanceNorm 基础上,引入外部条件(如文本嵌入、风格特征)动态调整归一化参数γ和β,使特征分布匹配条件信息。在扩散模型中的应用:常用于条件生成(如文本到图像),例如 Stable Diffusion 中,将文本的 CLIP 嵌入通过全连接层映射为 AdaIN 的γ和β,让归一化后的特征携带文本语义,增强生成结果与条件的匹配度。二、LayerNorm 及变体(LayerNorm, RMSNorm)1. LayerNorm(LN)原理:对单个样本的所有通道计算均值和方差(即 “单样本全局归一化”),不区分通道分组,直接归一化整个特征图的分布。 公式:y=σi2+ϵx−μi⋅γ+β,其中μi和σi2是第i个样本所有通道的全局均值和方差。适配扩散模型的优势:计算简单(无需分组),适合 Transformer 结构的扩散模型(如基于 Transformer 的 U-Net),能稳定自注意力层的特征分布。对通道数不敏感,在高通道数场景(如扩散模型的瓶颈层,通道数常达 1024 以上)仍能高效运行。局限性:全局归一化可能抹平局部特征的细微差异(如同一图像中不同区域的纹理),在依赖局部细节的生成任务(如人脸发丝)中效果略逊于 GroupNorm。2. RMSNorm(Root Mean Square Layer Norm)原理:LayerNorm 的简化版,用 “均方根” 替代 “方差” 计算(省去均值中心化步骤),减少计算量的同时保留归一化效果。在扩散模型中的应用:适合需要轻量化的场景(如移动端部署的小型扩散模型),在保证训练稳定性的同时提升推理速度。三、SwitchableNorm(SN)原理:动态融合 BatchNorm、InstanceNorm、LayerNorm 三种归一化方式,通过学习一个 “权重系数” 决定每种方式的贡献比例(如对某批样本,80% 依赖 InstanceNorm,20% 依赖 LayerNorm)。适配扩散模型的优势:自适应不同训练阶段的分布特性,例如:扩散早期(低t,样本接近真实数据):可能更依赖 InstanceNorm 保留细节;扩散晚期(高t,样本接近噪声):可能更依赖 LayerNorm 稳定全局分布。局限性:引入额外的学习参数,增加模型复杂度,训练成本略高,在追求效率的场景中较少使用。四、Conditional Norm(条件归一化)原理:将扩散步数t或条件信息(如类别标签)嵌入到归一化参数中,使归一化过程随t动态变化。例如,时间嵌入通过全连接层生成γ(t)和β(t),替代固定的可学习参数。在扩散模型中的典型应用:扩散模型的噪声预测高度依赖步数t,Conditional Norm 让归一化参数随t调整,帮助模型区分不同加噪阶段(如早期去噪侧重结构,晚期侧重细节),提升噪声预测精度。不同归一化方法的适用场景对比归一化方法核心优势适合的扩散模型场景典型应用案例GroupNorm平衡局部与全局特征,稳定性强高分辨率图像生成、通用场景DDPM、Stable Diffusion 基础架构InstanceNorm保留样本独特风格,适合风格迁移艺术风格生成、个性化图像生成基于扩散的风格迁移模型AdaIN结合条件信息,增强条件匹配度文本到图像、图像修复(根据上下文修复)Stable Diffusion 条件生成模块LayerNorm适配 Transformer 结构,计算简单基于 Transformer 的扩散模型(如 DiT)DiT(Diffusion Transformer)Conditional Norm随扩散步数动态调整,适配噪声阶段所有需区分加噪 / 去噪阶段的扩散模型多数扩散模型的时间嵌入融合方案总结扩散模型对归一化方法的核心要求是 **“低批次依赖、适配动态分布、辅助噪声预测”**。除 GroupNorm 外,InstanceNorm/AdaIN 适合风格化与条件生成,LayerNorm 适配 Transformer 结构,Conditional Norm 则通过结合时间信息进一步提升阶段感知能力。实际应用中,常根据模型架构(CNN/Transformer)、任务类型(通用生成 / 风格迁移)和资源约束选择或组合使用这些方法,以平衡生成质量与训练效率。
-
在图像生成领域(如扩散模型、GAN、VAE 等),GroupNorm(GN)凭借其不依赖批量统计、适配生成任务特性的优势,逐渐替代 BatchNorm 成为主流归一化方法,尤其在高分辨率图像生成、小批量训练场景中表现突出。以下是其核心优势及应用价值:一、摆脱对批量大小的依赖,适配小批量生成场景图像生成(尤其是高分辨率图像,如 256x256、512x512)常受限于 GPU 显存,批量大小(Batch Size)通常较小(如 8、4 甚至 1)。BatchNorm 的问题:依赖批次内的均值 / 方差统计,小批量时统计量波动极大(例如某批次中图像亮度偏高,会导致归一化偏差),直接影响生成模型对细节的学习(如纹理、边缘)。GroupNorm 的优势:在单个样本内部对特征通道分组归一化(如将 64 通道分为 8 组,每组内计算该样本的均值 / 方差),完全不依赖批量信息。无论批量大小是 1 还是 32,归一化效果稳定,避免了小批量导致的训练震荡,确保模型能稳定学习图像的结构规律。二、保留样本特异性,适配生成任务的 “多样性需求”图像生成的核心目标是生成多样化、个性化的样本(如不同风格的人脸、不同姿态的动物),而样本间的特征分布差异是多样性的基础。BatchNorm 的问题:会强行将同一批次的样本特征拉到相近分布(通过批次统计归一化),可能 “抹平” 样本的独特特征(如某张图像的特殊光影效果),导致生成结果趋同(如人脸表情单一、场景风格相似)。GroupNorm 的优势:仅在单个样本内归一化,保留不同样本的独特特征分布(如 A 样本的暖色调、B 样本的冷色调)。模型能学习到这种分布差异,从而生成更丰富多样的结果,避免 “模式崩溃”(生成样本单一化)。三、适配生成过程的动态分布变化生成模型的训练和推理过程中,数据分布常动态变化:例如,扩散模型的前向过程是 “数据→噪声” 的分布过渡,反向生成是 “噪声→数据” 的分布恢复;GAN 的生成器需要从随机噪声中逐步生成符合真实分布的图像。BatchNorm 的问题:依赖固定的批次统计,难以适配这种动态变化的分布(如扩散模型中不同步数t的样本分布差异极大),可能导致模型对 “分布过渡阶段” 的特征学习不准确(如混淆噪声与真实图像的特征)。GroupNorm 的优势:基于单个样本的实时统计,能自适应每个阶段的分布变化(如扩散模型中t=10的低噪声样本和t=900的高噪声样本,各自的归一化统计独立),让模型更精准地捕捉分布过渡的规律,生成过程更稳定。四、提升高分辨率图像的细节生成能力高分辨率图像生成(如 1024x1024)对细节(如发丝、纹理、边缘)的要求极高,而细节特征往往具有局部性(如某一区域的纹理仅与周围像素相关)。BatchNorm 的问题:基于全局批次统计的归一化会破坏局部特征的相关性(如将同一批次中不同图像的局部纹理强行归一化),导致生成的细节模糊或不一致(如人脸的左右眼纹理不对称)。GroupNorm 的优势:通过 “分组” 机制实现局部特征归一化(每组通道对应图像的局部语义,如边缘检测、纹理提取),在保留局部特征相关性的同时稳定分布。例如,生成人脸时,GN 能更好地保持 “左眼与右眼”“嘴唇与下巴” 的局部纹理一致性,细节更清晰自然。五、训练与推理一致,简化生成流程生成模型的推理过程(如从噪声生成图像)通常是 “单样本” 或 “小批量” 的,而 BatchNorm 在推理时需依赖训练阶段保存的 “移动平均统计量”,可能与推理时的分布不匹配,导致生成结果出现伪影(如局部亮度异常)。GroupNorm 的优势:训练和推理使用完全相同的归一化逻辑(均基于单个样本的分组统计),无需额外保存统计量,避免了 “训练 - 推理分布偏差” 问题,生成流程更简洁,结果更稳定。
-
在扩散模型中,GroupNorm(GN)常替代 BatchNorm(BN)作为归一化层,核心原因是扩散模型的训练特性(如小批量、噪声敏感)与 BN 的局限性存在冲突,而 GN 能更好地适配这些特性,提升训练稳定性和生成质量。以下是具体分析:一、BatchNorm 在扩散模型中的局限性BatchNorm 的核心逻辑是:对每个批次(Batch)的输入特征,计算批次内的均值和方差,将特征归一化到均值 0、方差 1,再通过可学习参数调整分布。但这一机制在扩散模型中存在明显问题:对批量大小敏感,小批量训练时统计不稳定扩散模型常处理高分辨率图像(如 256x256、512x512),受限于 GPU 显存,批量大小(Batch Size)通常较小(如 8~16,甚至更小)。BN 依赖批次内的均值 / 方差估计,小批量时统计量波动大(如某批次恰好包含亮度过高的图像,会导致均值异常),导致归一化后的特征分布不稳定。扩散模型的核心是学习 “噪声预测”,特征分布的微小波动会直接干扰噪声估计的准确性(如错误归一化可能让模型误判噪声强度)。与扩散过程的 “噪声特性” 冲突前向扩散过程会给数据逐步添加噪声,导致不同步数t的样本xt分布差异极大(从真实数据分布逐渐过渡到高斯噪声)。BN 的批次统计量会混合不同噪声水平的样本特征,破坏了 “不同t对应不同分布” 的特性,导致模型难以区分噪声阶段(如混淆早期低噪声样本和晚期高噪声样本)。例如,同一批次中既有t=10(接近真实图像)和t=900(接近纯噪声)的样本,BN 的均值 / 方差会被两者共同拉偏,无法准确反映各自的分布特性。推理阶段的 “批次依赖” 问题BN 在推理时需使用训练阶段保存的 “移动平均均值 / 方差”,而非当前批次的统计量。但扩散模型的生成过程是 “从噪声逐步去噪”,推理时的样本分布(噪声→数据)与训练时的分布(数据→噪声)存在差异,预存的统计量可能不匹配,导致生成结果出现伪影。二、GroupNorm 为何更适合扩散模型?GroupNorm 的改进思路是:不依赖批次信息,仅在单个样本内部对特征分组归一化,完美规避了 BN 的上述问题。不依赖批量大小,训练更稳定GN 的操作:将输入特征的通道分为若干组(如 16 个通道为一组),在每组内计算单个样本的均值和方差(而非批次统计),进行归一化。优势:无论批量大小是 1 还是 32,GN 的统计量仅来自样本自身,避免了小批量导致的统计波动,尤其适合扩散模型的高分辨率、小批量训练场景。适配扩散过程的 “噪声阶段差异”不同t的样本xt噪声水平不同,其特征分布差异显著。GN 在单个样本内归一化,能保留每个样本自身的分布特性(如t=10的样本保留真实图像的局部统计,t=900的样本保留噪声的局部统计)。这让模型能更清晰地感知 “当前样本所处的噪声阶段”,辅助时间嵌入(Time Embedding)更好地发挥作用,提升噪声预测的准确性。推理与训练一致,无统计量偏差GN 在训练和推理时使用完全相同的归一化逻辑(均基于单个样本的分组统计),无需依赖预存的移动平均统计量,避免了推理阶段的分布不匹配问题,生成结果更稳定。三、扩散模型中 GroupNorm 的典型配置在扩散模型(如 DDPM、Stable Diffusion)的 U-Net 结构中,GN 的配置通常遵循以下原则:分组数量:常见 8 或 16 组(如将 64 通道分为 8 组,每组 8 通道),分组过多会导致每组特征太少、统计不稳定;分组过少则失去局部归一化的意义。应用位置:通常在卷积层之后、激活函数之前,与残差连接配合使用(如 Conv→GN→ReLU→Conv→GN→+ 残差),稳定特征流动。与时间嵌入结合:GN 归一化后,常将时间嵌入(经全连接层映射后)以 “加性” 方式注入特征(如 AdaGN 变体),让归一化后的特征同时携带时间信息,增强模型对噪声阶段的感知。
-
机器学习领域特征选择与降维:在高维数据处理中,如基因数据、文本数据等,L1 正则化常被用于特征选择。它通过在损失函数中加入参数绝对值之和作为正则项,会使部分参数压缩至 0,从而剔除冗余特征,选出对模型影响较大的核心特征,降低模型复杂度和计算量。防止参数极端值:对于一些回归问题,如房价预测等,当特征之间存在较强相关性时,L2 正则化较为适用。它在损失函数中加入参数平方和作为正则项,不会将参数压缩至 0,而是让参数值更接近 0,避免某一特征的参数被过度放大,使模型对数据中的噪声更具鲁棒性。深度学习领域限制网络复杂度:Dropout 是深度学习中常用的结构正则化方法,尤其适用于神经网络层数较深、参数较多的场景,如在图像分类任务中的 ResNet 网络。它在训练时随机将部分神经元的输出设为 0,强制神经网络不依赖特定神经元,避免神经元之间的 “共适应”,迫使模型学习更鲁棒的特征,相当于同时训练多个子网络并取平均,从而降低过拟合风险。网络结构优化:结构正则化方法还可用于指导网络结构的搜索过程,通过约束搜索空间来提高搜索效率。例如,在神经架构搜索(NAS)中,正则化可以帮助自动搜索到具有较低复杂度和较高性能的网络结构,减少人工设计网络结构的成本和时间。工程结构设计领域几何形状规则化:在钢结构设计中,几何正则化通过确保结构的几何形状满足一定的规则性,避免出现奇异点或不连续性,从而简化计算并提高结构的整体稳定性。例如,在设计高层建筑钢结构时,引入几何正则化项可以使结构在风荷载和地震荷载下表现出更好的稳定性。材料特性标准化:材料正则化通过对材料特性进行标准化处理,使得设计参数更加统一,便于进行结构分析和优化。如在钢材设计中,标准化钢材的特性,能让工程师更准确地评估结构的性能,减少因材料参数差异导致的设计误差。数据分析与预测领域处理特征相关性:在金融预测等领域,当特征之间存在较强相关性时,弹性网络这种结合了 L1 和 L2 正则化的方法就显得尤为有用。它同时加入绝对值和平方惩罚项,既能像 L1 正则化一样进行特征选择,又能像 L2 正则化一样保持参数的平滑性,解决了 L1 在特征高度相关时的不稳定问题,从而更准确地捕捉数据中的规律,提高预测的准确性。平衡模型复杂度与拟合度:在一些数据量较小、特征维度较高的数据分析场景中,早停法是一种简单有效的结构正则化方法。它在模型训练过程中,实时监控验证集的损失,当验证损失不再下降时,提前停止训练,避免模型过度拟合训练数据,从而在模型复杂度和数据拟合度之间找到一个较好的平衡。
-
一、结构正则化限制记忆能力的核心逻辑模型之所以会 “记忆” 训练数据,本质是其容量过大(如参数过多、网络层数过深),导致它能拟合训练集中的所有样本(包括噪声和异常值),而非学习数据的底层分布。结构正则化的核心思路是:通过修改模型结构或在结构中嵌入约束,主动降低模型的 “过度拟合潜力”,让模型无法轻易记住训练数据的特殊细节,只能专注于提取对所有样本都通用的特征。简单来说,就是 “给模型的‘记忆空间’上一把锁”,避免它存储训练数据中的冗余信息。二、常见结构正则化方法及其限制记忆的具体机制不同的结构正则化方法,通过不同的约束逻辑限制模型记忆能力,以下是最常用的 3 类方法:1. Dropout:随机 “关闭” 神经元,打破特征依赖结构原理:在训练时,随机将模型中部分神经元的输出置为 0(如每次前向传播时,按 50% 概率关闭隐藏层神经元),测试时再将所有神经元的输出按概率缩放(或直接使用)。如何限制记忆:模型无法依赖某几个 “关键神经元” 记忆特定样本的细节(因为这些神经元可能被随机关闭),只能学习 “多个神经元共同表征的通用特征”。例如,若模型想记忆 “某张图片中的特定噪声点”,需依赖某个神经元专门编码该噪声;但 Dropout 会随机关闭这个神经元,迫使模型放弃对单个噪声点的记忆,转而学习图片的通用结构(如边缘、纹理)。适用场景:全连接层、卷积层、注意力层(如扩散模型的 U-Net 中常用)。2. 权重正则化(Weight Regularization):限制权重规模,避免参数极端化结构原理:在模型的损失函数中加入 “权重的正则项”,强制限制权重参数的取值范围,常见的有 L1 正则化(权重绝对值之和)和 L2 正则化(权重平方和,又称权重衰减)。如何限制记忆:模型若想 “记忆” 训练数据中的特殊样本,需要通过调整某些权重到极端值(如极大或极小),来拟合这些样本的特殊模式;而权重正则化会惩罚极端权重,迫使权重保持在合理范围,从而无法形成 “针对特殊样本的记忆性参数”。例如,L2 正则化会让权重倾向于 “小而分散”,避免某几个权重过大而主导模型对特殊样本的记忆,让模型更关注所有样本的共性特征。适用场景:所有带可训练参数的层(如卷积层、全连接层),尤其是参数规模大的模型。3. 归一化层(Normalization Layers):稳定特征分布,减少样本依赖结构原理:通过对层的输入特征进行归一化(如 BatchNorm、GroupNorm、LayerNorm),将特征分布调整到稳定范围(如均值 0、方差 1),减少输入数据分布波动对模型的影响。如何限制记忆:模型若想记忆训练数据中的特殊样本,往往会依赖这些样本的 “异常特征分布”(如某张图片的亮度远高于其他样本);归一化层会消除这种分布差异,让模型无法通过 “捕捉异常分布” 来记忆特殊样本,只能学习特征的相对关系(如亮度的相对变化,而非绝对亮度值)。例如,GroupNorm 将特征按通道分组归一化,不依赖批次内的样本统计,避免模型记忆 “某一批次样本的特殊亮度”,从而更关注通用的图像结构。适用场景:卷积层、Transformer 层(如扩散模型中常用 GroupNorm 替代 BatchNorm,避免小批量训练的统计波动)。
-
跳跃连接(Skip Connection)是 U-Net 及其衍生模型中平衡高层语义信息与底层细节信息的核心机制。它通过跨层级特征融合,让解码器在恢复空间分辨率的过程中,既能利用编码器提取的全局语义(如 “这是一只猫”),又能保留底层的细节特征(如 “猫的胡须纹理”),最终输出兼具准确性和精细度的结果。一、高层语义与底层细节的天然矛盾在深度学习的特征提取中,存在一个固有矛盾:底层特征(编码器浅层):空间分辨率高(如输入图像的 1/2、1/4),包含丰富的细节信息(边缘、纹理、局部轮廓),但语义信息弱(仅能识别 “这是一条曲线”,无法判断是 “猫的胡须” 还是 “树枝”)。高层特征(编码器深层):空间分辨率低(如输入图像的 1/16、1/32),经过多次下采样和卷积,抽象出全局语义信息(如 “这是猫的头部”“这是汽车的轮胎”),但细节信息几乎丢失(无法分辨具体纹理)。如果没有跳跃连接,解码器仅依赖高层语义特征恢复图像时,会出现细节模糊、边缘错位(如分割任务中物体边缘不精准,生成任务中图像缺乏纹理)。二、跳跃连接的工作机制:跨层级特征融合跳跃连接通过将编码器某一层的特征图,直接传递到解码器同尺度的对应层(即分辨率相同或接近的层),实现 “高层语义 + 底层细节” 的融合。具体方式有两种:1. 特征拼接(Concat)将编码器特征图与解码器上采样后的特征图在通道维度拼接(如编码器特征图为 [H, W, C1],解码器特征图为 [H, W, C2],拼接后为 [H, W, C1+C2])。例:U-Net 原始设计中,编码器第 2 层输出的 140x140x128 特征图,会与解码器对应层上采样后的 140x140x256 特征图拼接,形成 140x140x384 的融合特征。2. 特征相加(Add)将编码器特征图与解码器特征图在元素级别相加(要求两者通道数相同,如 [H, W, C] + [H, W, C] = [H, W, C]),类似 ResNet 的残差连接。优势:参数更少,计算效率更高,适合需要轻量化的场景。三、如何平衡两种信息?跳跃连接通过以下逻辑实现平衡,避免 “语义主导细节” 或 “细节淹没语义”:1. 语义信息提供全局 “指导”解码器的上采样过程本质是 “将抽象语义映射到具体像素”,而高层语义特征(来自编码器深层)为这一过程提供全局约束:例:在图像分割中,编码器深层特征已判断 “这一区域是猫的头部”,解码器在恢复细节时,会基于这一语义,优先保留 “耳朵、眼睛” 等头部特有的细节,而非错误地生成 “爪子” 的纹理。2. 细节信息补充局部 “精度”编码器浅层的细节特征(边缘、纹理)被跳跃连接传递到解码器后,能修正语义映射过程中的误差:例:解码器基于高层语义生成 “猫的轮廓”,但可能因上采样导致边缘模糊;此时,编码器浅层的边缘特征(如 “猫的胡须边缘”)通过跳跃连接补充进来,让解码器精准定位边缘,避免轮廓错位。3. 层级匹配确保融合有效性跳跃连接仅在 “同尺度” 层级间传递特征(如编码器下采样 2 次后的特征,对应解码器上采样 2 次后的特征),原因是:同尺度特征的空间分辨率接近,细节信息(如边缘位置)与语义信息(如该区域的类别)具有空间对应性,融合后不会出现 “细节与语义错位”(如将 “狗的纹理” 贴到 “猫的语义区域”)。四、实例:图像分割中的平衡效果以 “猫的图像分割” 为例,对比有无跳跃连接的差异:无跳跃连接:解码器仅用高层语义特征,能大致分割出猫的轮廓(知道 “哪里是猫”),但边缘模糊(分不清耳朵与头部的边界),且丢失胡须、毛发纹理等细节。有跳跃连接:编码器深层特征告诉解码器 “这是猫的头部,这是身体”(语义指导);编码器浅层的边缘特征(耳朵轮廓、胡须边缘)通过跳跃连接传递给解码器,帮助修正分割边界(细节补充);最终分割结果既准确划分猫与背景(语义正确),又精准保留耳朵、胡须等细节(边缘清晰)。总结跳跃连接的核心作用是打破 “编码器 - 解码器” 的信息单向流动,通过跨层级融合实现:高层语义为细节恢复提供 “全局定位”,避免细节错乱;底层细节为语义映射提供 “局部校准”,避免结果模糊。这种机制让模型在 “看懂全局” 的同时 “看清细节”,这也是 U-Net 能在分割、生成等任务中表现优异的根本原因。
-
U-Net 凭借 “编码器提取语义 + 解码器恢复细节 + 跳跃连接融合多尺度特征” 的核心优势,除图像生成外,还广泛应用于需精准空间定位或像素级预测的领域,尤其在医疗影像、遥感、工业检测等对细节精度要求高的场景中表现突出。以下是其主要应用领域及具体场景:一、医疗影像处理(最核心的经典应用领域)医疗影像的核心需求是 “精准分割、检测或量化病灶”,U-Net 能有效捕捉病灶的细微特征(如肿瘤边缘、血管分支),是该领域的主流架构之一。医学图像分割场景:肿瘤分割(如脑肿瘤、肺结节、肝肿瘤)、器官分割(如心脏、肾脏、胰腺)、组织分割(如视网膜血管、皮肤病变区域)。优势:通过跳跃连接保留病灶的边缘细节,避免因下采样导致的小病灶(如微小结节)丢失,助力医生精准定位病灶范围。案例:在肺 CT 影像中,U-Net 可分割出肺结节的轮廓,辅助早期肺癌筛查;在眼底图像中,分割视网膜血管,用于糖尿病视网膜病变诊断。医学图像修复与增强场景:CT/MRI 影像去噪(去除设备扫描产生的噪声)、图像补全(修复因扫描断层缺失的区域)、模态转换(如将低分辨率 MRI 转换为高分辨率 MRI,或 CT 与 MRI 图像互转)。原理:解码器通过学习 “正常组织的结构规律”,从受损影像中恢复缺失细节;编码器提取模态间的共性特征,实现跨模态的精准转换。二、遥感与地理信息(GIS)遥感影像通常具有 “大尺寸、多波段、地物类别复杂” 的特点,U-Net 能高效处理高分辨率遥感数据,实现地物的精细分类与提取。遥感图像分割与分类场景:土地利用分类(如耕地、林地、建筑用地、水体的像素级划分)、城市目标提取(如建筑物轮廓、道路网络、桥梁识别)、灾害监测(如地震后房屋损毁区域分割、洪水淹没范围提取)。优势:可处理遥感影像的多光谱通道(如 RGB + 近红外波段),通过编码器捕捉地物的全局分布(如大面积耕地的纹理),解码器定位细小地物(如窄道路、小型建筑)。案例:在城市遥感图中,U-Net 可分割出所有建筑物的轮廓,用于城市规划中的建筑面积统计;在洪涝灾害后,分割淹没区域,辅助灾情评估。遥感图像去云与去雾场景:去除遥感影像中的云层、雾霭遮挡,恢复地表真实信息(云层会遮挡耕地、建筑等关键地物,影响后续分析)。原理:将 “含云影像” 作为输入,“无云影像” 作为目标,U-Net 学习云层的特征规律,通过解码器生成无云的清晰影像,同时保留地表的细节(如农田的田埂、道路的标线)。三、工业检测与质量控制工业场景需 “快速定位产品缺陷”(如零件裂痕、表面划痕),U-Net 能实现像素级缺陷检测,替代人工检测,提升效率与精度。工业缺陷检测与分割场景:制造业(如金属零件的表面划痕、裂痕、孔洞检测;汽车车身的喷漆瑕疵分割)、电子行业(如 PCB 电路板的线路短路、元件缺失检测;半导体芯片的微小缺陷定位)。优势:对小尺寸缺陷(如微米级的芯片裂痕)敏感,通过跳跃连接保留缺陷的边缘特征,避免因下采样导致的缺陷漏检,且检测速度快(可适配工业流水线的实时需求)。案例:在光伏电池片检测中,U-Net 可分割出电池片上的隐裂区域,避免有缺陷的电池片组装成光伏板后影响发电效率。工业图像修复与重建场景:修复工业零件的磨损区域(如齿轮的齿面磨损)、重建残缺的工件模型(如铸造零件的局部缺失),辅助逆向工程或零件复用评估。原理:通过编码器学习 “完好零件的结构特征”,解码器根据周围完好区域的信息,补全残缺或磨损部分,生成符合工艺标准的修复后图像。四、计算机视觉其他领域除上述垂直场景外,U-Net 还在通用计算机视觉任务中发挥作用,核心是解决 “像素级预测” 或 “空间信息恢复” 类问题。图像分割(通用场景)场景:自动驾驶中的场景分割(如分割道路、行人、车辆、交通信号灯,为自动驾驶决策提供环境信息)、视频监控中的目标分割(如分割人群中的个体,用于人流统计)、农业场景中的作物分割(如分割稻田中的杂草,辅助精准除草)。案例:自动驾驶汽车的摄像头采集路面影像后,U-Net 分割出 “可行驶区域”(道路)和 “障碍物”(行人、车辆),为转向、刹车决策提供依据。图像修复与编辑场景:老照片修复(去除划痕、褪色,恢复人物面部细节)、图像内容擦除(如去除照片中的多余物体,如路人、电线杆)、超分辨率重建(将低分辨率图像(如模糊的监控截图)提升至高清,保留纹理细节)。优势:相比传统修复算法,U-Net 能更好地匹配修复区域与周围环境的风格(如老照片的复古色调),避免修复痕迹生硬。视频处理场景:视频帧插值(在两帧之间生成中间帧,提升视频流畅度)、视频去模糊(去除运动模糊,如高速运动物体的模糊影像)、视频分割(对视频中的目标进行逐帧分割,如电影中的人物抠图)。原理:将视频帧视为连续的图像序列,U-Net 学习帧间的运动规律,在解码器中恢复帧间的细节过渡,避免插值或去模糊后出现画面卡顿、细节丢失。五、其他跨模态或新兴领域生物医学图像分析场景:细胞分割(如显微镜下的癌细胞、干细胞分割,用于细胞计数或形态分析)、蛋白质结构预测辅助(如分割电子显微镜下的蛋白质分子结构,辅助解析蛋白质功能)。农业与生态监测场景:作物病虫害检测(分割叶片上的病斑区域,如小麦锈病、水稻稻瘟病)、植被覆盖度评估(分割卫星影像中的植被区域,计算植被覆盖率,用于生态环境监测)。总结U-Net 的应用核心是 **“处理需‘语义 + 细节’双重视角的任务”**—— 只要场景需要从 “全局语义定位” 到 “像素级细节恢复” 的完整流程,U-Net 及其变体(如 U-Net++、ResU-Net)就能发挥优势。其灵活性也使其能与其他技术(如注意力机制、Transformer)结合,适配更多复杂场景(如 3D 医学影像分割、多模态数据融合)。
-
U-Net 是一种经典的 Encoder-Decoder(编码器 - 解码器)结构,最初由 Olaf Ronneberger 等人在 2015 年提出,用于医学图像分割任务。其核心特点是 “对称的 U 形结构”,通过编码器提取特征、解码器恢复空间分辨率,并引入 “跳跃连接(Skip Connection)” 融合不同层级的特征,在语义信息和细节信息之间取得平衡。这种结构后来被广泛应用于图像生成(如扩散模型)、图像修复、超分辨率等任务,成为计算机视觉领域的基础架构之一。U-Net 结构的核心组成U-Net 的结构呈 “U” 形,分为三个关键部分:编码器(Encoder)、瓶颈(Bottleneck)、解码器(Decoder),以及连接编码器和解码器的跳跃连接。1. 编码器(Encoder):提取高层语义特征编码器由一系列 “卷积 + 下采样” 模块组成,逐步减少特征图的空间尺寸(如高、宽),同时增加通道数(特征维度),目的是捕捉图像的全局语义信息(如物体类别、整体结构)。操作流程: 每一层通常包含 2 次卷积(如 3x3 卷积)+ ReLU 激活函数,然后通过最大池化(如 2x2 池化,步长 2)或卷积步长为 2 的操作进行下采样,将特征图尺寸减半,通道数翻倍(如从 64→128→256...)。作用:模拟人类视觉的 “抽象过程”,从原始像素逐步提取边缘、纹理、部件到整体结构等层级特征。2. 瓶颈(Bottleneck):最深层特征融合编码器的最后一层是瓶颈层,是整个网络的 “最底部”,此时特征图尺寸最小(如输入为 512x512 时,瓶颈层可能为 16x16),但通道数最大(如 1024 或 2048)。作用:汇聚编码器提取的所有高层语义特征,是全局信息最集中的部分,为解码器的恢复过程提供 “语义锚点”。3. 解码器(Decoder):恢复空间细节解码器与编码器对称,由一系列 “上采样 + 卷积” 模块组成,逐步增大特征图的空间尺寸(恢复到输入图像的尺寸),同时减少通道数,目的是将高层语义信息映射回像素级别的细节,生成精细化的输出(如分割掩码、生成图像)。操作流程: 每一层通过转置卷积(Transposed Convolution,又称反卷积)或双线性插值 + 卷积进行上采样(将特征图尺寸翻倍),然后与编码器对应层级的特征图通过跳跃连接融合,再经过 2 次卷积 + ReLU 激活,通道数减半(如从 1024→512→256...)。作用:将抽象的语义信息 “具象化”,恢复图像的空间细节(如边缘、纹理),解决单纯下采样导致的细节丢失问题。4. 跳跃连接(Skip Connection):融合多尺度特征这是 U-Net 最核心的设计之一:解码器的每一层会与编码器中 “同尺度” 的特征图进行融合(通常是通道维度拼接或元素相加)。作用:编码器浅层特征(如第一层)包含丰富的细节信息(如边缘、纹理),但语义性弱;深层特征语义性强,但细节丢失。跳跃连接将两者结合,让解码器在恢复过程中既能利用高层语义指导全局结构,又能利用低层细节补充局部信息,最终输出更精准的结果。原始 U-Net 结构示意图(简化版)以输入图像尺寸为 572x572 为例,结构大致如下:plaintext 输入 (572x572x1) ↓ 编码器卷积+池化 → (284x284x64)卷积+池化 → (140x140x128)卷积+池化 → (68x68x256)卷积+池化 → (32x32x512) ↓ 瓶颈层卷积 → (32x32x1024) ↓ 解码器(上采样+跳跃连接)上采样 + 编码器(68x68x256)融合 → (64x64x512)上采样 + 编码器(140x140x128)融合 → (128x128x256)上采样 + 编码器(284x284x64)融合 → (256x256x128)上采样 + 编码器浅层特征融合 → (512x512x64) ↓ 输出层(1x1 卷积)输出 (388x388x2) # 如分割任务的类别掩码 U-Net 在扩散模型中的改进原始 U-Net 为分割任务设计,在扩散模型(如 DDPM、Stable Diffusion)中,为了更好地预测噪声,对结构进行了针对性改进:加入时间嵌入(Time Embedding):将扩散步数 t 转化为高维向量,通过全连接层注入 U-Net 的各层,让模型感知 “当前处于哪个加噪 / 去噪阶段”(早期侧重结构,晚期侧重细节)。引入注意力机制:在编码器和解码器的中间层加入自注意力(Self-Attention)或交叉注意力(Cross-Attention,如文本条件生成时结合文本嵌入),帮助模型捕捉长距离依赖(如图像中物体的位置关联)。归一化层调整:用 GroupNorm 替代 BatchNorm,避免小批量训练时的统计波动影响噪声预测,增强训练稳定性。输出层设计:最终输出与输入图像同尺寸的 “噪声预测图”(而非分割掩码),直接用于反向去噪过程。总结U-Net 的核心优势在于 **“通过对称结构和跳跃连接平衡语义与细节”**,这使其不仅适用于分割任务,也成为扩散模型等生成任务的首选架构 —— 通过编码器提取噪声中的潜在结构,解码器逐步恢复细节,最终实现从噪声到真实数据的生成。其灵活性和有效性使其在计算机视觉领域经久不衰,衍生出大量变体(如 U-Net++、ResU-Net 等)。
-
在扩散模型的训练中,过拟合表现为模型 “记住” 训练数据的细节(如特定噪声模式、数据集中的重复特征),导致生成结果缺乏多样性、泛化能力差(如生成图像出现训练集中的重复纹理,或在新场景下产生伪影)。由于扩散模型的训练目标是学习通用的 “噪声预测 - 去噪” 能力,而非拟合特定样本,需通过针对性策略防止过拟合。以下是具体方法:一、数据层面:增强数据多样性与泛化性扩散模型的性能高度依赖训练数据的分布覆盖度,数据单一或规模不足是过拟合的主要诱因。扩大训练数据集规模核心逻辑:更多样的样本能让模型学习到更通用的 “数据 - 噪声” 关联,而非特定样本的细节。实践:若数据量较小(如 < 10k 样本),可引入同类公开数据集(如训练人脸生成时补充 CelebA、FFHQ 等),或通过数据增强模拟更多样本。高强度数据增强针对图像等视觉数据,通过随机变换打破样本的 “特定特征绑定”,迫使模型学习更本质的结构:空间变换:随机裁剪、翻转(水平 / 垂直)、旋转(±15°)、缩放(0.8~1.2 倍),避免模型依赖固定的物体位置或角度。像素变换:随机调整亮度(±20%)、对比度(±20%)、饱和度(±20%)、色调(±10°),甚至加入轻微高斯噪声(不同于扩散过程的噪声,用于增强鲁棒性),防止模型过拟合到训练集的颜色分布。注意:增强强度需适中(如旋转角度不宜过大),避免破坏数据的语义结构(如人脸旋转过度导致失去面部特征)。二、模型结构层面:限制模型复杂度与增强正则化模型容量过大(如参数过多、网络过深)会导致其 “记忆” 训练数据,需通过结构设计和正则化约束降低过拟合风险。控制模型复杂度避免过度堆叠网络层:扩散模型的基础是 U-Net 结构,对简单任务(如 32x32 图像生成),可减少编码器 / 解码器的层数或通道数(如将中间层通道数从 512 减至 256);复杂任务(如 512x512 图像)则需平衡容量与正则化,而非盲目加深网络。注意力机制的合理使用:自注意力模块能捕捉长距离依赖,但计算成本高且易过拟合。可仅在网络中间层(负责全局结构)使用注意力,低层(负责局部特征)用普通卷积,或限制注意力的作用范围(如局部窗口注意力,如 Swin Transformer 中的窗口划分)。添加正则化模块Dropout:在 U-Net 的卷积层、注意力层后加入 Dropout(概率 0.1~0.3),随机丢弃部分神经元输出,迫使模型学习更鲁棒的特征组合,而非依赖特定神经元的激活。权重衰减(Weight Decay):通过优化器(如 AdamW)对模型权重施加 L2 正则化(系数 1e-4~1e-5),抑制权重过大,防止模型对训练数据的微小波动过度敏感。GroupNorm/InstanceNorm 替代 BatchNorm:BatchNorm 依赖批次内的统计信息,小批量训练时易引入噪声,且可能导致模型过拟合到批次特征;GroupNorm 或 InstanceNorm 不依赖批次统计,更适合扩散模型的训练稳定性,尤其在小数据集上效果更明显。三、训练策略层面:优化目标与过程约束调整损失函数基础扩散模型用 MSE 损失预测噪声,但 MSE 对异常值(如训练集中的噪声样本)较敏感,可能导致模型过度拟合这些样本。改进方案:采用 MAE(平均绝对误差)损失,降低异常值的影响;对损失进行截断(如忽略误差最大的 5% 样本),减少极端样本对训练的干扰;加入多样性约束:在条件生成中,可引入 “负样本损失”(如对比学习思想),让模型生成结果不仅匹配正条件,还与负条件(不相关的文本 / 标签)差异显著,避免生成单一模式。控制训练迭代次数与早停(Early Stopping)过拟合常发生在训练后期(模型已拟合数据分布,继续训练开始 “记忆” 噪声)。需通过验证集监控生成质量,而非仅看训练损失:定期(如每 10 个 epoch)在验证集上生成样本,观察是否出现重复纹理、伪影或多样性下降;若验证集生成质量开始恶化(如清晰度下降、样本趋同),即使训练损失仍在下降,也应提前停止训练。随机化扩散过程参数训练中对扩散参数引入随机性,增强模型对不同加噪模式的适应能力:随机调整加噪系数βt的范围(如在预设值 ±10% 内波动),避免模型过拟合到固定的加噪 schedule;对步数t的采样引入偏差,如在早期步数(低t,数据特征明显)和晚期步数(高t,接近噪声)分配不同采样概率,确保模型在各阶段都得到充分训练。四、其他实用技巧使用混合精度训练混合精度训练(如 FP16/FP32 混合)不仅能加速训练、节省显存,还能通过数值噪声(有限精度带来的微小扰动)间接起到正则化作用,抑制过拟合。数据清洗与去重训练集中的重复样本或低质量样本(如模糊、损坏的图像)会被模型优先 “记忆”,导致生成结果质量下降。需先对数据去重、过滤低质量样本,确保训练数据的纯净性。小批量训练配合梯度累积当显存有限无法使用大批次时,可采用梯度累积(如累积 4 次梯度再更新参数),等效于增大批量,减少梯度波动,提升模型对数据分布的整体估计能力。总结扩散模型防止过拟合的核心逻辑是:通过数据增强扩大分布覆盖、通过结构正则化限制模型记忆能力、通过训练策略引导模型学习通用规律。实际应用中,需结合数据规模(小数据侧重增强和正则化)、任务复杂度(复杂任务需平衡模型容量与约束)和生成质量反馈(早停机制)灵活调整,最终目标是让模型学到 “从噪声恢复任意合理样本” 的能力,而非复制训练数据。
-
在扩散模型的生成质量优化中,超参数调整是平衡模型性能(生成质量、多样性、效率)的关键环节。不同超参数影响模型的训练稳定性、噪声预测精度和采样效率,需要结合具体任务(如图像生成、文本生成)和数据特性(数据规模、复杂度)进行针对性调整。以下是核心超参数的调整策略及实践经验:一、扩散过程核心超参数(前向加噪阶段)1. 总扩散步数 T作用:控制加噪 / 去噪的精细程度。T 越大,前向过程越接近理想的高斯分布,反向去噪的 “梯度” 越平滑,但训练和采样成本越高(时间、计算资源)。调整策略:基础场景(如低分辨率图像生成,32x32):T=1000 是经典选择,平衡效果与效率。高分辨率场景(如 256x256 及以上):可适当增大到 T=2000∼4000,避免因步数不足导致细节丢失(但需配合高效采样方法如 DDIM 抵消耗时)。资源受限场景:可减小到 T=500,但可能导致生成图像模糊或出现伪影(需通过其他超参数补偿,如优化β调度)。2. 加噪系数 βt 调度(β1,β2,...,βT)作用:决定每步加噪强度的增长方式,直接影响前向过程中数据分布的平滑性和反向去噪的难度。常见调度及调整:线性调度(DDPM 原始方案):βt 从 β1=1e−4 线性增长到 βT=0.02。问题:后期βt增长过快,可能导致xT偏离标准高斯分布,增加反向建模难度。调整:适合简单数据(如 MNIST),复杂数据可缩小β范围(如5e−5∼1.5e−2),让加噪更平缓。余弦调度(改进方案):βt 基于余弦函数设计,前期增长慢(保留更多数据结构),后期加速(确保xT趋近高斯)。优势:对复杂数据(如自然图像)更友好,生成质量更稳定,推荐优先使用。调整:通过参数s(通常取 0.008)控制余弦曲线的 “平缓段长度”,s 增大则前期加噪更慢(适合细节丰富的数据)。二、训练过程超参数1. 批量大小(Batch Size)作用:影响模型对数据分布的估计精度和训练稳定性。过小的批量会导致梯度波动大,过大则占用更多显存,可能降低训练效率。调整策略:图像生成(如 64x64):单卡批量通常为 16~64(视 GPU 显存而定,如 12GB 显存可设为 32)。高分辨率(如 512x512):受限于显存,可减小到 8~16,或使用梯度累积(Gradient Accumulation)模拟大批量效果(如累积 4 次,等效批量 = 实际批量 ×4)。经验原则:确保每个批次覆盖足够多样的样本(如包含不同类别、姿态的图像),避免同类样本集中导致模型过拟合。2. 学习率(Learning Rate)作用:控制参数更新幅度,影响训练收敛速度和稳定性。扩散模型的噪声预测任务对学习率较敏感,过大易导致训练震荡,过小则收敛缓慢。调整策略:基础值:1e-4(适用于 Adam 优化器,配合默认参数β1=0.9,β2=0.999)。数据规模小(如 < 10k 样本):减小到 5e-5,避免过拟合。高分辨率或复杂模型(如带注意力的 U-Net):可降低到 5e-5~8e-5,减少梯度波动。动态调整:使用学习率衰减(如 StepLR,每 100 个 epoch 衰减为原来的 0.5),在训练后期精细化参数。3. 时间嵌入(Time Embedding)维度作用:将步数t转化为高维向量,帮助模型区分不同加噪阶段(早期去噪侧重结构,晚期侧重细节)。调整策略:基础值:与 U-Net 中间层通道数匹配(如中间层通道数为 256,则时间嵌入维度设为 256)。复杂任务(如条件生成):可增大到 512,增强模型对 “时间 - 条件” 关联的捕捉能力(如文本描述与去噪阶段的匹配)。实现细节:采用正弦余弦位置编码(Sinusoidal Embedding)比简单线性映射更有效,避免对t的数值敏感。三、采样过程超参数(反向去噪阶段)1. 采样步数(Sampling Steps)作用:训练完成后,从噪声生成数据的步数(可小于训练时的T,通过高效采样方法加速)。调整策略:质量优先:使用与训练T相同的步数(如 1000 步),配合随机采样(如 DDPM 原始采样),生成细节更丰富。效率优先:采用 DDIM、PLMS 等确定性采样方法,步数可降至 50~200 步(如 50 步 DDIM 生成质量接近 1000 步 DDPM)。经验:高分辨率图像建议至少保留 100 步,低分辨率可压缩至 50 步以内。2. 采样方差(Variance)控制作用:反向去噪时,采样分布的方差决定生成结果的随机性(多样性)和稳定性。方差过大会导致生成结果混乱,过小则多样性不足。调整策略:原始 DDPM:使用学习到的方差(通过模型预测),适合需要高多样性的场景(如生成不同风格的图像)。简化方案(如 DDIM):固定方差为 0(确定性采样),牺牲部分多样性换取稳定性和效率,适合对一致性要求高的任务(如图像修复)。折中方案:在采样后期(低t)减小方差(增强细节稳定性),前期增大方差(保留多样性)。3. guidance scale(条件生成专用)作用:在条件生成(如文本到图像)中,控制生成结果与条件信息(如文本描述)的匹配强度(仅用于有条件约束的模型,如 Stable Diffusion)。调整策略:基础值:7.5~10(平衡匹配度与图像质量)。文本描述简单明确:可降低到 5~7,避免过度约束导致图像生硬。文本描述复杂或抽象:增大到 10~15,强制模型贴合条件(但可能导致图像扭曲,需配合视觉质量检查)。四、调整原则与实践技巧控制变量法:每次只调整一个超参数,通过生成样本的视觉质量(清晰度、细节、多样性)和验证损失判断效果,避免多参数同时变动导致难以定位影响因素。结合数据特性:小数据集:优先减小学习率、增大批量(或梯度累积),避免过拟合。高细节数据(如人脸、风景):增大T、使用余弦调度、增加采样步数,强化细节恢复能力。参考经典配置:新手可先复用主流模型的超参数(如 Stable Diffusion 的T=1000、余弦调度、学习率 1e-4),再根据自身任务微调。工具辅助:使用 TensorBoard 记录不同超参数下的生成样本和损失曲线,直观对比效果;对关键超参数(如学习率、T)可进行网格搜索(Grid Search)寻找最优值。总结超参数调整的核心是 **“在任务需求(质量 / 效率 / 多样性)和资源约束之间找平衡”**:训练阶段:重点优化T、β调度、学习率,确保模型稳定学到噪声预测能力;采样阶段:通过调整采样步数、方差、guidance scale,在生成效率和质量间取舍。实际应用中,建议先固定基础超参数,再针对生成结果的具体问题(如模糊、伪影、多样性不足)定向调整相关参数。
-
扩散模型的训练过程围绕 “前向加噪 - 反向去噪” 的核心逻辑展开,目标是让模型学会从噪声中恢复出真实数据的分布。整个过程可拆解为数据准备、前向加噪模拟、模型训练(噪声预测学习) 三个核心步骤,最终通过反向过程让模型掌握 “去噪” 能力。以下是详细流程:一、训练前的准备数据准备收集目标分布的数据集(如图片、文本、音频等,以图片为例),并进行预处理(如归一化到 [0,1] 或 [-1,1] 区间、Resize 到固定尺寸)。定义扩散过程的超参数:总扩散步数 T(通常取 1000~4000,步数越多,加噪 / 去噪越精细,但训练和采样成本越高);加噪系数序列 {βt}t=1T(预设的递增序列,控制每步加噪强度,如 β1=1e−4,βT=0.02);衍生参数:αt=1−βt,αˉt=∏i=1tαi(前t步的 “保留系数”,随t增大而减小,用于快速计算任意t步的加噪结果)。模型初始化定义噪声预测模型 ϵθ(xt,t),通常采用 U-Net 结构(或其变体,如加入注意力机制的改进 U-Net),输入为 “第t步的加噪数据xt” 和 “步数t”,输出为 “该步加噪时使用的噪声ϵ” 的预测值。初始化模型参数θ(如随机初始化权重)。二、核心训练循环(迭代更新模型参数)训练的核心是让模型学会 “根据加噪后的样本xt和步数t,预测出该步加噪时的真实噪声ϵ”。具体步骤如下:1. 随机采样输入数据和步数从训练集中随机采样一批真实数据x0(如一批图片,形状为[B,C,H,W],B为批量大小)。从 1 到T中随机采样一个步数t(每个批次的t可不同,增强模型对不同加噪阶段的适应性)。2. 模拟前向加噪过程,生成xt随机采样一个与x0同形状的标准高斯噪声ϵ∼N(0,I)(这是前向加噪时的 “真实噪声”)。利用前向扩散的解析公式,直接从x0和ϵ计算xt:xt=αˉt⋅x0+1−αˉt⋅ϵ (无需逐步加噪,直接一步计算,提升训练效率)。3. 模型预测噪声并计算损失将xt和t输入模型ϵθ,得到模型预测的噪声ϵ^=ϵθ(xt,t)。计算损失函数:最小化 “预测噪声ϵ^” 与 “真实噪声ϵ” 的均方误差(MSE):L=Ex0,ϵ,t[∥ϵ−ϵ^∥2] (部分改进模型会用 MAE 或其他损失,但 MSE 是最基础且有效的选择)。4. 反向传播更新模型参数计算损失L对模型参数θ的梯度(通过自动微分框架如 PyTorch/TensorFlow 实现)。用优化器(如 Adam)更新参数:θ←θ−η⋅∇θL(η为学习率)。三、训练终止条件当模型在验证集上的损失趋于稳定(不再显著下降),或生成样本的质量达到预期(如图片清晰度、多样性满足需求)时,停止训练。训练过程中可定期保存模型 checkpoint,便于后续采样或继续训练。关键逻辑总结扩散模型的训练本质是 **“以噪声预测为目标的监督学习”**:前向加噪过程是 “标签生成器”,为每个x0和t生成带噪声的样本xt,并将加噪时的真实噪声ϵ作为 “监督标签”。模型通过学习 “xt和t到ϵ的映射”,间接掌握了 “从xt恢复x0” 的能力(因为知道ϵ后,可通过xt=αˉtx0+1−αˉtϵ反推x0)。这种设计的巧妙之处在于:前向过程完全可控(无需训练),只需专注训练反向过程的噪声预测,大幅降低了建模难度。
-
1、自然语言处理中的语义理解:从 BERT 到 LLaMA 的上下文建模技术cid:link_12、AI模型的边缘部署:TensorRT与ONNX Runtime的优化流程与性能调优cid:link_23、生成式AI服务的高并发架构设计:缓存策略与动态资源调度实践cid:link_34、稀疏Transformer的设计与应用:降低计算复杂度的核心技术解析cid:link_05、从卖工具到卖效果:RaaS如何重塑To B市场格局?cid:link_46、运营商 4A 安全平台:刚需逻辑与资深适配厂商全景分析cid:link_57、边缘安全访问技术:守护数字边界的新型安全屏障cid:link_68、Pi0 网络架构cid:link_79、开源英文图文数据集介绍cid:link_810、智能驾驶的 “最后一公里”:数据闭环与城市复杂场景的攻克cid:link_911、联邦学习:在数据隐私保护下,AI协同训练的实践与挑战cid:link_1012、一粒玉米种子获赔5000万元!种子“数字身份证”斩断侵权黑手cid:link_1113、私有云安全资源池:构建企业云端体系化防护的核心路径cid:link_12
-
OrangePi AI Studio Pro基于MindYolo实现YOLOv8模型训练及验证OrangePi AI Studio Pro是基于 2 个昇腾 310P 处理器的新一代高性能推理解析卡,提供基础通用算力+超强AI算力,整合了训练和推理的全部底层软件栈,实现训推一体。其中AI半精度FP16算力约为176TFLOPS,整数Int8精度可达352TOPS。本章将介绍如何在昇腾310上基于mindyolo实现YOLOv8模型的训练及验证。一、环境准备首先检查昇腾310P的NPU驱动,在命令行中输入:npu-smi info,可以看到两块昇腾310P的AICore的利用率和内存的占用情况。+--------------------------------------------------------------------------------------------------------+ | npu-smi v1.0 Version: 24.1.rc4.b999 | +-------------------------------+-----------------+------------------------------------------------------+ | NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) | | Chip Device | Bus-Id | AICore(%) Memory-Usage(MB) | +===============================+=================+======================================================+ | 30208 310P1 | OK | NA 41 0 / 0 | | 0 0 | 0000:77:00.0 | 0 1416 / 89608 | +-------------------------------+-----------------+------------------------------------------------------+ | 30208 310P1 | OK | NA 40 0 / 0 | | 1 1 | 0000:77:00.0 | 0 1622 / 89085 | +===============================+=================+======================================================+ +-------------------------------+-----------------+------------------------------------------------------+ | NPU Chip | Process id | Process name | Process memory(MB) | +===============================+=================+======================================================+ | No running processes found in NPU 30208 | +===============================+=================+======================================================+之后升级CANN的版本以及更新MindSpore,可以参考我的另一篇文章:如何在OrangePi Studio Pro上升级CANN以及的Pytorch和MindSpore,升级完成后,检查MindSpore的安装情况,我使用的版本是2.7.0。source /usr/local/Ascend/ascend-toolkit/set_env.sh python3 -c "import mindspore;mindspore.set_context(device_target='Ascend');mindspore.run_check()" [WARNING] ME(1621400:139701939115840,MainProcess):2025-09-24-10:46:21.978.000 [mindspore/context.py:1412] For 'context.set_context', the parameter 'device_target' will be deprecated and removed in a future version. Please use the api mindspore.set_device() instead. MindSpore version: 2.7.0 [WARNING] GE_ADPT(1621400,7f0e18710640,python3):2025-09-24-10:46:23.323.570 [mindspore/ops/kernel/ascend/acl_ir/op_api_exec.cc:169] GetAscendDefaultCustomPath] Checking whether the so exists or if permission to access it is available: /usr/local/Ascend/ascend-toolkit/latest/opp/vendors/customize_vision/op_api/lib/libcust_opapi.so The result of multiplication calculation is correct, MindSpore has been installed on platform [Ascend] successfully! 克隆mindyolo仓库,我们使用由天津大学发布的无人机视觉挑战赛数据集VisDrone-Dataset进行模型的训练及验证。git clone https://github.com/mindspore-lab/mindyolo.git正克隆到 'mindyolo'... remote: Enumerating objects: 3505, done. remote: Counting objects: 100% (157/157), done. remote: Compressing objects: 100% (69/69), done. remote: Total 3505 (delta 114), reused 88 (delta 88), pack-reused 3348 (from 2) 接收对象中: 100% (3505/3505), 6.74 MiB | 8.91 MiB/s, 完成. 处理 delta 中: 100% (2048/2048), 完成.我们将下载后的数据集首先转换成YOLO格式,具体的转换教程可以参考网上的公开资料,经过转换后的visdrone数据集包括以下内容:visdrone ├── train │ ├── images │ │ ├── 000001.jpg │ │ ├── 000002.jpg │ │ ├── ... │ │ └── ... │ └── labels │ ├── 000001.txt │ ├── 000002.txt │ ├── ... │ └── ... └── val ├── images │ ├── 000001.jpg │ ├── 000002.jpg │ ├── ... │ └── ... └── labels ├── 000001.txt ├── 000001.txt ├── ... └── ... 二、数据格式转换由于mindyolo中的train过程使用的数据是yolo格式,而eval过程使用coco数据集中的json文件,因此需要再增加coco格式的标注文件instances_train2017.json、instances_val2017.json以及train.txt和val.txt文件,经过转换后的visdrone数据集包括以下内容:visdrone_COCO_format ├── train.txt ├── val.txt ├── train │ ├── images │ │ ├── 000001.jpg │ │ ├── 000002.jpg │ │ ├── ... │ │ └── ... │ └── labels │ ├── 000001.txt │ ├── 000002.txt │ ├── ... │ └── ... ├── annotations │ ├── instances_train2017.json │ └── instances_val2017.json └── val ├── images │ ├── 000001.jpg │ ├── 000002.jpg │ ├── ... │ └── ... └── labels ├── 000001.txt ├── 000001.txt ├── ... └── ... 我们先把YOLO格式的数据集转换为COCO格式,在mindyolo中实现yolov5_yaml_to_coco.py脚本,具体代码如下:# -*- encoding: utf-8 -*- # @Author: SWHL # @Contact: liekkaskono@163.com import argparse import glob import json import os import shutil import time from pathlib import Path import cv2 import yaml from tqdm import tqdm def read_txt(txt_path): with open(str(txt_path), "r", encoding="utf-8") as f: data = list(map(lambda x: x.rstrip("\n"), f)) return data def mkdir(dir_path): Path(dir_path).mkdir(parents=True, exist_ok=True) def verify_exists(file_path): file_path = Path(file_path).resolve() if not file_path.exists(): raise FileNotFoundError(f"The {file_path} is not exists!!!") class YOLOV5CFG2COCO: def __init__(self, yaml_path): verify_exists(yaml_path) with open(yaml_path, "r", encoding="UTF-8") as f: self.data_cfg = yaml.safe_load(f) self.root_dir = Path(yaml_path).parent.parent self.root_data_dir = Path(self.data_cfg.get("path")) self.train_path = self._get_data_dir("train") self.val_path = self._get_data_dir("val") nc = self.data_cfg["nc"] if "names" in self.data_cfg: self.names = self.data_cfg.get("names") else: # assign class names if missing self.names = [f"class{i}" for i in range(self.data_cfg["nc"])] assert ( len(self.names) == nc ), f"{len(self.names)} names found for nc={nc} dataset in {yaml_path}" # 构建COCO格式目录 self.dst = self.root_dir / f"{Path(self.root_data_dir).stem}_COCO_format" self.coco_train = "train/images" self.coco_val = "val/images" self.coco_annotation = "annotations" self.coco_train_json = ( self.dst / self.coco_annotation / f"instances_train2017.json" ) self.coco_val_json = ( self.dst / self.coco_annotation / f"instances_val2017.json" ) mkdir(self.dst) mkdir(self.dst / self.coco_train) mkdir(self.dst / self.coco_val) mkdir(self.dst / self.coco_annotation) # 构建json内容结构 self.type = "instances" self.categories = [] self._get_category() self.annotation_id = 1 cur_year = time.strftime("%Y", time.localtime(time.time())) self.info = { "year": int(cur_year), "version": "1.0", "description": "For object detection", "date_created": cur_year, } self.licenses = [ { "id": 1, "name": "Apache License v2.0", "url": "https://choosealicense.com/licenses/apache-2.0/", } ] def _get_data_dir(self, mode): data_dir = self.data_cfg.get(mode) if data_dir: if isinstance(data_dir, str): full_path = [str(self.root_data_dir / data_dir)] elif isinstance(data_dir, list): full_path = [str(self.root_data_dir / one_dir) for one_dir in data_dir] else: raise TypeError(f"{data_dir} is not str or list.") else: raise ValueError(f"{mode} dir is not in the yaml.") return full_path def _get_category(self): for i, category in enumerate(self.names, start=1): self.categories.append( { "supercategory": category, "id": i, "name": category, } ) def generate(self): self.train_files = self.get_files(self.train_path) self.valid_files = self.get_files(self.val_path) train_dest_dir = Path(self.dst) / self.coco_train self.gen_dataset( self.train_files, train_dest_dir, self.coco_train_json, mode="train" ) val_dest_dir = Path(self.dst) / self.coco_val self.gen_dataset(self.valid_files, val_dest_dir, self.coco_val_json, mode="val") print(f"The output directory is: {self.dst}") def get_files(self, path): IMG_FORMATS = ["bmp", "dng", "jpeg", "jpg", "mpo", "png", "tif", "tiff", "webp"] f = [] for p in path: p = Path(p) if p.is_dir(): f += glob.glob(str(p / "**" / "*.*"), recursive=True) elif p.is_file(): # file with open(p, "r", encoding="utf-8") as t: t = t.read().strip().splitlines() parent = str(p.parent) + os.sep f += [ x.replace("./", parent) if x.startswith("./") else x for x in t ] else: raise FileExistsError(f"{p} does not exist") im_files = sorted( x.replace("/", os.sep) for x in f if x.split(".")[-1].lower() in IMG_FORMATS ) return im_files def gen_dataset(self, img_paths, target_img_path, target_json, mode): """ https://cocodataset.org/#format-data """ images = [] annotations = [] sa, sb = ( os.sep + "images" + os.sep, os.sep + "labels" + os.sep, ) # /images/, /labels/ substrings for img_id, img_path in enumerate(tqdm(img_paths, desc=mode), 1): label_path = sb.join(img_path.rsplit(sa, 1)).rsplit(".", 1)[0] + ".txt" img_path = Path(img_path) verify_exists(img_path) imgsrc = cv2.imread(str(img_path)) height, width = imgsrc.shape[:2] dest_file_name = f"{img_id:012d}.jpg" save_img_path = target_img_path / dest_file_name if img_path.suffix.lower() == ".jpg": shutil.copyfile(img_path, save_img_path) else: cv2.imwrite(str(save_img_path), imgsrc) images.append( { "date_captured": "2021", "file_name": dest_file_name, "id": img_id, "height": height, "width": width, } ) if Path(label_path).exists(): new_anno = self.read_annotation(label_path, img_id, height, width) if len(new_anno) > 0: annotations.extend(new_anno) else: raise ValueError(f"{label_path} is empty") else: raise FileNotFoundError(f"{label_path} not exists") json_data = { "info": self.info, "images": images, "licenses": self.licenses, "type": self.type, "annotations": annotations, "categories": self.categories, } with open(target_json, "w", encoding="utf-8") as f: json.dump(json_data, f, ensure_ascii=False) def read_annotation(self, txt_file, img_id, height, width): annotation = [] all_info = read_txt(txt_file) for label_info in all_info: # 遍历一张图中不同标注对象 label_info = label_info.split(" ") if len(label_info) < 5: continue category_id, vertex_info = label_info[0], label_info[1:] segmentation, bbox, area = self._get_annotation(vertex_info, height, width) annotation.append( { "segmentation": segmentation, "area": area, "iscrowd": 0, "image_id": img_id, "bbox": bbox, "category_id": int(category_id) + 1, "id": self.annotation_id, } ) self.annotation_id += 1 return annotation @staticmethod def _get_annotation(vertex_info, height, width): cx, cy, w, h = [float(i) for i in vertex_info] cx = cx * width cy = cy * height box_w = w * width box_h = h * height x0 = max(cx - box_w / 2, 0) y0 = max(cy - box_h / 2, 0) x1 = min(x0 + box_w, width) y1 = min(y0 + box_h, height) segmentation = [[x0, y0, x1, y0, x1, y1, x0, y1]] bbox = [x0, y0, box_w, box_h] area = box_w * box_h return segmentation, bbox, area def main(): parser = argparse.ArgumentParser("Datasets converter from YOLOV5 to COCO") parser.add_argument( "--yaml_path", type=str, default="dataset/YOLOV5_yaml/sample.yaml", help="Dataset cfg file", ) args = parser.parse_args() converter = YOLOV5CFG2COCO(args.yaml_path) converter.generate() if __name__ == "__main__": main() 之后在mindyolo目录下创建YOLO格式的配置文件visdrone.yaml:# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path: /root/workspace/dataset/visdrone # dataset root dir (absolute path) train: train/images # train images (relative to 'path') val: val/images # val images (relative to 'path') test: # test images (optional) nc: 12 # Classes,类别 names: 0: ignored regions 1: pedestrian 2: people 3: bicycle 4: car 5: van 6: truck 7: tricycle 8: awning-tricycle 9: bus 10: motor 11: others在终端中运行如下命令将YOLO格式的数据集转换为COCO格式:python3 yolov5_yaml_to_coco.py --yaml_path visdrone.yamltrain: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 6471/6471 [01:13<00:00, 88.07it/s] val: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 548/548 [00:03<00:00, 148.22it/s] The output directory is: visdrone_COCO_format再创建coco2yolo.py的Python脚本将COCO格式的标注文件.json导出为labels文件夹中YOLO格式的标注文件.txt:import json import os import argparse parser = argparse.ArgumentParser(description='Test yolo data.') parser.add_argument('-j', help='JSON file', dest='json', required=True) parser.add_argument('-o', help='path to output folder', dest='out',required=True) args = parser.parse_args() json_file = args.json output = args.out class COCO2YOLO: def __init__(self): self._check_file_and_dir(json_file, output) self.labels = json.load(open(json_file, 'r', encoding='utf-8')) self.coco_id_name_map = self._categories() self.coco_name_list = list(self.coco_id_name_map.values()) print("total images", len(self.labels['images'])) print("total categories", len(self.labels['categories'])) print("total labels", len(self.labels['annotations'])) def _check_file_and_dir(self, file_path, dir_path): if not os.path.exists(file_path): raise ValueError("file not found") if not os.path.exists(dir_path): os.makedirs(dir_path) def _categories(self): categories = {} for cls in self.labels['categories']: categories[cls['id']] = cls['name'] return categories def _load_images_info(self): images_info = {} for image in self.labels['images']: id = image['id'] file_name = image['file_name'] if file_name.find('\\') > -1: file_name = file_name[file_name.index('\\')+1:] w = image['width'] h = image['height'] images_info[id] = (file_name, w, h) return images_info def _bbox_2_yolo(self, bbox, img_w, img_h): x, y, w, h = bbox[0], bbox[1], bbox[2], bbox[3] centerx = bbox[0] + w / 2 centery = bbox[1] + h / 2 dw = 1 / img_w dh = 1 / img_h centerx *= dw w *= dw centery *= dh h *= dh return centerx, centery, w, h def _convert_anno(self, images_info): anno_dict = dict() for anno in self.labels['annotations']: bbox = anno['bbox'] image_id = anno['image_id'] category_id = anno['category_id'] image_info = images_info.get(image_id) image_name = image_info[0] img_w = image_info[1] img_h = image_info[2] yolo_box = self._bbox_2_yolo(bbox, img_w, img_h) anno_info = (image_name, category_id, yolo_box) anno_infos = anno_dict.get(image_id) if not anno_infos: anno_dict[image_id] = [anno_info] else: anno_infos.append(anno_info) anno_dict[image_id] = anno_infos return anno_dict def save_classes(self): sorted_classes = list(map(lambda x: x['name'], sorted(self.labels['categories'], key=lambda x: x['id']))) print('coco names', sorted_classes) with open('coco.names', 'w', encoding='utf-8') as f: for cls in sorted_classes: f.write(cls + '\n') f.close() def coco2yolo(self): print("loading image info...") images_info = self._load_images_info() print("loading done, total images", len(images_info)) print("start converting...") anno_dict = self._convert_anno(images_info) print("converting done, total labels", len(anno_dict)) print("saving txt file...") self._save_txt(anno_dict) print("saving done") def _save_txt(self, anno_dict): for k, v in anno_dict.items(): file_name = os.path.splitext(v[0][0])[0] + ".txt" with open(os.path.join(output, file_name), 'w', encoding='utf-8') as f: print(k, v) for obj in v: cat_name = self.coco_id_name_map.get(obj[1]) category_id = self.coco_name_list.index(cat_name) box = ['{:.6f}'.format(x) for x in obj[2]] box = ' '.join(box) line = str(category_id) + ' ' + box f.write(line + '\n') if __name__ == '__main__': c2y = COCO2YOLO() c2y.coco2yolo() 在终端中切换到mindyolo目录下依次运行如下命令导出instances_train2017.json和instances_val2017.json文件对应的YOLO格式的标注文件到labels文件夹中:python3 coco2yolo.py -j ./visdrone_COCO_format/annotations/instances_train2017.json -o ./visdrone_COCO_format/train/labelspython3 coco2yolo.py -j ./visdrone_COCO_format/annotations/instances_val2017.json -o ./visdrone_COCO_format/val/labels最后创建generate_txt.sh脚本在COCO数据集目录下生成train.txt和val.txt,指定训练图片和验证图片的在数据集中的相对路径:#!/bin/bash # 检查是否提供了数据集路径参数 if [ $# -eq 0 ]; then echo "Usage: $0 <dataset_path>" echo "Example: $0 /path/to/visdrone" exit 1 fi # 获取数据集路径 DATASET_PATH="$1" # 检查数据集路径是否存在 if [ ! -d "$DATASET_PATH" ]; then echo "Error: Dataset path '$DATASET_PATH' does not exist." exit 1 fi # 定义训练和验证图片目录 TRAIN_DIR="$DATASET_PATH/train/images" VAL_DIR="$DATASET_PATH/val/images" # 检查训练和验证目录是否存在 if [ ! -d "$TRAIN_DIR" ]; then echo "Error: Train directory '$TRAIN_DIR' does not exist." exit 1 fi if [ ! -d "$VAL_DIR" ]; then echo "Error: Validation directory '$VAL_DIR' does not exist." exit 1 fi # 生成 train.txt TRAIN_TXT="$DATASET_PATH/train.txt" ls "$TRAIN_DIR" | grep '\.jpg$' | sort | sed 's/^/\.\/train\/images\//' > "$TRAIN_TXT" echo "Generated $TRAIN_TXT" # 生成 val.txt VAL_TXT="$DATASET_PATH/val.txt" ls "$VAL_DIR" | grep '\.jpg$' | sort | sed 's/^/\.\/val\/images\//' > "$VAL_TXT" echo "Generated $VAL_TXT" echo "Successfully generated train.txt and val.txt in $DATASET_PATH" 在终端中运行generate_txt.sh,并传入前面COCO数据集的路径:chmod +x generate_txt.sh ./generate_txt.sh visdrone_COCO_formatGenerated visdrone_COCO_format/train.txt Generated visdrone_COCO_format/val.txt Successfully generated train.txt and val.txt in visdrone_COCO_format最终生成的visdrone_COCO_format数据集的格式如下,可以直接用于MindYOLOv8模型的训练:visdrone_COCO_format ├── train.txt ├── val.txt ├── train │ ├── images │ │ ├── 000001.jpg │ │ ├── 000002.jpg │ │ ├── ... │ │ └── ... │ └── labels │ ├── 000001.txt │ ├── 000002.txt │ ├── ... │ └── ... ├── annotations │ ├── instances_train2017.json │ └── instances_val2017.json └── val ├── images │ ├── 000001.jpg │ ├── 000002.jpg │ ├── ... │ └── ... └── labels ├── 000001.txt ├── 000001.txt ├── ... └── ... 三、模型训练MindYOLO支持yaml文件继承机制,因此新编写的配置文件只需要继承MindYOLO提供的原生yaml文件现有配置文件:在configs目录下编写MindYOLO数据集的yaml配置文件,指定训练图片和验证图片的路径以及模型的类别标签:data: dataset_name: visdrone_COCO_format train_set: /root/workspace/mindyolo/visdrone_COCO_format/train.txt val_set: /root/workspace/mindyolo/visdrone_COCO_format/val.txt test_set: /root/workspace/mindyolo/visdrone_COCO_format/val.txt nc: 12 # class names names: ['ignored regions', 'pedestrian', 'people', 'bicycle', 'car', 'van', 'truck', 'tricycle', 'awning-tricycle', 'bus', 'motor', 'others' ] train_transforms: [] test_transforms: [] 修改configs/yolov8s.yaml文件,注释掉原有的coco.yaml配置文件,指定我们自己的数据集,同时添加epochs、img_size、per_batch_size、multi-stage data augment等自定义训练参数:__BASE__: [ # '../coco.yaml', '../visdrone.yaml', './hyp.scratch.low.yaml', './yolov8-base.yaml' ] overflow_still_update: False network: depth_multiple: 0.33 # scales module repeats width_multiple: 0.50 # scales convolution channels max_channels: 1024 epochs: 10 img_size: 1024 per_batch_size: 16 data: num_parallel_workers: 8 # multi-stage data augment train_transforms: { stage_epochs: [ 5, 5 ], trans_list: [ [ { func_name: mosaic, prob: 1.0 }, { func_name: resample_segments }, { func_name: random_perspective, prob: 1.0, degrees: 0.0, translate: 0.1, scale: 0.5, shear: 0.0 }, {func_name: albumentations}, {func_name: hsv_augment, prob: 1.0, hgain: 0.015, sgain: 0.7, vgain: 0.4}, {func_name: fliplr, prob: 0.5}, {func_name: label_norm, xyxy2xywh_: True}, {func_name: label_pad, padding_size: 160, padding_value: -1}, {func_name: image_norm, scale: 255.}, {func_name: image_transpose, bgr2rgb: True, hwc2chw: True} ], [ {func_name: letterbox, scaleup: True}, {func_name: resample_segments}, {func_name: random_perspective, prob: 1.0, degrees: 0.0, translate: 0.1, scale: 0.5, shear: 0.0}, {func_name: albumentations}, {func_name: hsv_augment, prob: 1.0, hgain: 0.015, sgain: 0.7, vgain: 0.4}, {func_name: fliplr, prob: 0.5}, {func_name: label_norm, xyxy2xywh_: True}, {func_name: label_pad, padding_size: 160, padding_value: -1}, {func_name: image_norm, scale: 255.}, {func_name: image_transpose, bgr2rgb: True, hwc2chw: True} ]] } test_transforms: [ {func_name: letterbox, scaleup: False, only_image: True}, {func_name: image_norm, scale: 255.}, {func_name: image_transpose, bgr2rgb: True, hwc2chw: True} ] 在终端中运行train.py进行模型训练,指定模型的配置文件以及使用昇腾NPU:python3 train.py --config ./configs/yolov8/yolov8s.yaml --device_target Ascend默认是跑在0卡上也可以在环境变量中指定DEVICE_ID让模型的训练代码跑在1卡上:import os os.setenv("DEVICE_ID", 1) 如果不想设置环境变量也可以修改mindyolo\mindyolo\utils\utils.py中默认的参数:import os import random import yaml import cv2 from datetime import datetime import numpy as np import mindspore as ms from mindspore import ops, Tensor, nn from mindspore.communication.management import get_group_size, get_rank, init from mindspore import ParallelMode from mindyolo.utils import logger def set_seed(seed=2): np.random.seed(seed) random.seed(seed) ms.set_seed(seed) def set_default(args): # Set Context ms.set_context(mode=args.ms_mode) ms.set_recursion_limit(args.max_call_depth) if args.ms_mode == 0: ms.set_context(jit_config={"jit_level": "O2"}) if args.device_target == "Ascend": ms.set_device("Ascend", int(os.getenv("DEVICE_ID", 1))) ... 2025-10-23 14:48:02,364 [INFO] parse_args: 2025-10-23 14:48:02,364 [INFO] task detect 2025-10-23 14:48:02,364 [INFO] device_target Ascend 2025-10-23 14:48:02,364 [INFO] save_dir ./runs/2025.10.23-14.48.02 2025-10-23 14:48:02,364 [INFO] log_level INFO 2025-10-23 14:48:02,364 [INFO] is_parallel False 2025-10-23 14:48:02,364 [INFO] ms_mode 0 2025-10-23 14:48:02,364 [INFO] max_call_depth 2000 2025-10-23 14:48:02,364 [INFO] ms_amp_level O0 2025-10-23 14:48:02,364 [INFO] keep_loss_fp32 True 2025-10-23 14:48:02,364 [INFO] anchor_base False 2025-10-23 14:48:02,364 [INFO] ms_loss_scaler static 2025-10-23 14:48:02,364 [INFO] ms_loss_scaler_value 1024.0 2025-10-23 14:48:02,364 [INFO] ms_jit True 2025-10-23 14:48:02,364 [INFO] ms_enable_graph_kernel False 2025-10-23 14:48:02,364 [INFO] ms_datasink False 2025-10-23 14:48:02,364 [INFO] overflow_still_update False 2025-10-23 14:48:02,364 [INFO] clip_grad False 2025-10-23 14:48:02,364 [INFO] clip_grad_value 10.0 2025-10-23 14:48:02,364 [INFO] ema True 2025-10-23 14:48:02,364 [INFO] weight 2025-10-23 14:48:02,364 [INFO] ema_weight 2025-10-23 14:48:02,364 [INFO] freeze [] 2025-10-23 14:48:02,364 [INFO] epochs 10 2025-10-23 14:48:02,364 [INFO] per_batch_size 16 2025-10-23 14:48:02,364 [INFO] img_size 1024 2025-10-23 14:48:02,364 [INFO] nbs 64 2025-10-23 14:48:02,364 [INFO] accumulate 1 2025-10-23 14:48:02,364 [INFO] auto_accumulate False 2025-10-23 14:48:02,364 [INFO] log_interval 100 2025-10-23 14:48:02,364 [INFO] single_cls False 2025-10-23 14:48:02,364 [INFO] sync_bn False 2025-10-23 14:48:02,364 [INFO] keep_checkpoint_max 100 2025-10-23 14:48:02,364 [INFO] run_eval False 2025-10-23 14:48:02,364 [INFO] run_eval_interval 1 2025-10-23 14:48:02,364 [INFO] conf_thres 0.001 2025-10-23 14:48:02,364 [INFO] iou_thres 0.7 2025-10-23 14:48:02,364 [INFO] conf_free True 2025-10-23 14:48:02,364 [INFO] rect False 2025-10-23 14:48:02,364 [INFO] nms_time_limit 20.0 2025-10-23 14:48:02,364 [INFO] recompute False 2025-10-23 14:48:02,364 [INFO] recompute_layers 0 2025-10-23 14:48:02,364 [INFO] seed 2 2025-10-23 14:48:02,364 [INFO] summary True 2025-10-23 14:48:02,364 [INFO] profiler False 2025-10-23 14:48:02,364 [INFO] profiler_step_num 1 2025-10-23 14:48:02,364 [INFO] opencv_threads_num 0 2025-10-23 14:48:02,364 [INFO] strict_load True 2025-10-23 14:48:02,364 [INFO] enable_modelarts False 2025-10-23 14:48:02,364 [INFO] data_url 2025-10-23 14:48:02,364 [INFO] ckpt_url 2025-10-23 14:48:02,364 [INFO] multi_data_url 2025-10-23 14:48:02,364 [INFO] pretrain_url 2025-10-23 14:48:02,364 [INFO] train_url 2025-10-23 14:48:02,364 [INFO] data_dir /cache/data/ 2025-10-23 14:48:02,364 [INFO] ckpt_dir /cache/pretrain_ckpt/ 2025-10-23 14:48:02,364 [INFO] data.dataset_name result 2025-10-23 14:48:02,364 [INFO] data.train_set /root/workspace/mindyolo/visdrone_COCO_format/train.txt 2025-10-23 14:48:02,364 [INFO] data.val_set /root/workspace/mindyolo/visdrone_COCO_format/val.txt 2025-10-23 14:48:02,364 [INFO] data.test_set /root/workspace/mindyolo/visdrone_COCO_format/val.txt 2025-10-23 14:48:02,364 [INFO] data.nc 12 2025-10-23 14:48:02,364 [INFO] data.names ['ignored regions', 'pedestrian', 'people', 'bicycle', 'car', 'van', 'truck', 'tricycle', 'awning-tricycle', 'bus', 'motor', 'others'] 2025-10-23 14:48:02,364 [INFO] train_transforms.stage_epochs [5, 5] 2025-10-23 14:48:02,364 [INFO] train_transforms.trans_list [[{'func_name': 'mosaic', 'prob': 1.0}, {'func_name': 'resample_segments'}, {'func_name': 'random_perspective', 'prob': 1.0, 'degrees': 0.0, 'translate': 0.1, 'scale': 0.5, 'shear': 0.0}, {'func_name': 'albumentations'}, {'func_name': 'hsv_augment', 'prob': 1.0, 'hgain': 0.015, 'sgain': 0.7, 'vgain': 0.4}, {'func_name': 'fliplr', 'prob': 0.5}, {'func_name': 'label_norm', 'xyxy2xywh_': True}, {'func_name': 'label_pad', 'padding_size': 160, 'padding_value': -1}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}], [{'func_name': 'letterbox', 'scaleup': True}, {'func_name': 'resample_segments'}, {'func_name': 'random_perspective', 'prob': 1.0, 'degrees': 0.0, 'translate': 0.1, 'scale': 0.5, 'shear': 0.0}, {'func_name': 'albumentations'}, {'func_name': 'hsv_augment', 'prob': 1.0, 'hgain': 0.015, 'sgain': 0.7, 'vgain': 0.4}, {'func_name': 'fliplr', 'prob': 0.5}, {'func_name': 'label_norm', 'xyxy2xywh_': True}, {'func_name': 'label_pad', 'padding_size': 160, 'padding_value': -1}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}]] 2025-10-23 14:48:02,364 [INFO] data.test_transforms [{'func_name': 'letterbox', 'scaleup': False, 'only_image': True}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}] 2025-10-23 14:48:02,364 [INFO] data.num_parallel_workers 8 2025-10-23 14:48:02,364 [INFO] optimizer.optimizer momentum 2025-10-23 14:48:02,364 [INFO] optimizer.lr_init 0.01 2025-10-23 14:48:02,364 [INFO] optimizer.momentum 0.937 2025-10-23 14:48:02,364 [INFO] optimizer.nesterov True 2025-10-23 14:48:02,364 [INFO] optimizer.loss_scale 1.0 2025-10-23 14:48:02,364 [INFO] optimizer.warmup_epochs 3 2025-10-23 14:48:02,364 [INFO] optimizer.warmup_momentum 0.8 2025-10-23 14:48:02,364 [INFO] optimizer.warmup_bias_lr 0.1 2025-10-23 14:48:02,364 [INFO] optimizer.min_warmup_step 1000 2025-10-23 14:48:02,364 [INFO] optimizer.group_param yolov8 2025-10-23 14:48:02,364 [INFO] optimizer.gp_weight_decay 0.0005 2025-10-23 14:48:02,364 [INFO] optimizer.start_factor 1.0 2025-10-23 14:48:02,364 [INFO] optimizer.end_factor 0.01 2025-10-23 14:48:02,364 [INFO] optimizer.epochs 10 2025-10-23 14:48:02,364 [INFO] optimizer.nbs 64 2025-10-23 14:48:02,364 [INFO] optimizer.accumulate 1 2025-10-23 14:48:02,364 [INFO] optimizer.total_batch_size 16 2025-10-23 14:48:02,364 [INFO] loss.name YOLOv8Loss 2025-10-23 14:48:02,364 [INFO] loss.box 7.5 2025-10-23 14:48:02,364 [INFO] loss.cls 0.5 2025-10-23 14:48:02,364 [INFO] loss.dfl 1.5 2025-10-23 14:48:02,364 [INFO] loss.reg_max 16 2025-10-23 14:48:02,364 [INFO] network.model_name yolov8 2025-10-23 14:48:02,364 [INFO] network.nc 80 2025-10-23 14:48:02,364 [INFO] network.reg_max 16 2025-10-23 14:48:02,364 [INFO] network.stride [8, 16, 32] 2025-10-23 14:48:02,364 [INFO] network.backbone [[-1, 1, 'ConvNormAct', [64, 3, 2]], [-1, 1, 'ConvNormAct', [128, 3, 2]], [-1, 3, 'C2f', [128, True]], [-1, 1, 'ConvNormAct', [256, 3, 2]], [-1, 6, 'C2f', [256, True]], [-1, 1, 'ConvNormAct', [512, 3, 2]], [-1, 6, 'C2f', [512, True]], [-1, 1, 'ConvNormAct', [1024, 3, 2]], [-1, 3, 'C2f', [1024, True]], [-1, 1, 'SPPF', [1024, 5]]] 2025-10-23 14:48:02,364 [INFO] network.head [[-1, 1, 'Upsample', ['None', 2, 'nearest']], [[-1, 6], 1, 'Concat', [1]], [-1, 3, 'C2f', [512]], [-1, 1, 'Upsample', ['None', 2, 'nearest']], [[-1, 4], 1, 'Concat', [1]], [-1, 3, 'C2f', [256]], [-1, 1, 'ConvNormAct', [256, 3, 2]], [[-1, 12], 1, 'Concat', [1]], [-1, 3, 'C2f', [512]], [-1, 1, 'ConvNormAct', [512, 3, 2]], [[-1, 9], 1, 'Concat', [1]], [-1, 3, 'C2f', [1024]], [[15, 18, 21], 1, 'YOLOv8Head', ['nc', 'reg_max', 'stride']]] 2025-10-23 14:48:02,364 [INFO] network.depth_multiple 0.33 2025-10-23 14:48:02,364 [INFO] network.width_multiple 0.5 2025-10-23 14:48:02,364 [INFO] network.max_channels 1024 2025-10-23 14:48:02,364 [INFO] config ./configs/yolov8/yolov8s.yaml 2025-10-23 14:48:02,364 [INFO] rank 0 2025-10-23 14:48:02,364 [INFO] rank_size 1 2025-10-23 14:48:02,364 [INFO] total_batch_size 16 2025-10-23 14:48:02,364 [INFO] callback [] 2025-10-23 14:48:02,364 [INFO] 2025-10-23 14:48:02,365 [INFO] Please check the above information for the configurations 2025-10-23 14:48:02,441 [WARNING] Parse Model, args: nearest, keep str type 2025-10-23 14:48:02,451 [WARNING] Parse Model, args: nearest, keep str type 2025-10-23 14:48:02,528 [INFO] number of network params, total: 11.160279M, trainable: 11.140228M [WARNING] GE_ADPT(336686,7ff4350e8740,python3):2025-10-23-14:48:13.472.732 [mindspore/ops/kernel/ascend/acl_ir/op_api_exec.cc:169] GetAscendDefaultCustomPath] Checking whether the so exists or if permission to access it is available: /usr/local/Ascend/ascend-toolkit/latest/opp/vendors/customize_vision/op_api/lib/libcust_opapi.so 2025-10-23 14:48:14,547 [WARNING] Parse Model, args: nearest, keep str type 2025-10-23 14:48:14,558 [WARNING] Parse Model, args: nearest, keep str type 2025-10-23 14:48:14,646 [INFO] number of network params, total: 11.160279M, trainable: 11.140228M .2025-10-23 14:48:30,416 [INFO] ema_weight not exist, default pretrain weight is currently used. 2025-10-23 14:48:30,421 [INFO] No dataset cache available, caching now... Scanning images: 0%| | 0/6471 [00:00<?, ?it/s]WARNING ⚠️ /root/workspace/mindyolo/visdrone_COCO_format/train/images/000000000335.jpg: 1 duplicate labels removed Scanning '/root/workspace/mindyolo/visdrone_COCO_format/train.cache' images and labels... 397 found, 0 missing, 0 empty, 0 corrupted: 6%|████ | 397/6471 [00:00<00:01, 3960.91it/s]WARNING ⚠️ /root/workspace/mindyolo/visdrone_COCO_format/train/images/000000000427.jpg: 1 duplicate labels removed Scanning '/root/workspace/mindyolo/visdrone_COCO_format/train.cache' images and labels... 1261 found, 0 missing, 0 empty, 0 corrupted: 19%|████████████▋ | 1261/6471 [00:00<00:01, 4238.38it/s]WARNING ⚠️ /root/workspace/mindyolo/visdrone_COCO_format/train/images/000000001492.jpg: 1 duplicate labels removed Scanning '/root/workspace/mindyolo/visdrone_COCO_format/train.cache' images and labels... 3866 found, 0 missing, 0 empty, 0 corrupted: 60%|██████████████████████████████████████▊ | 3866/6471 [00:00<00:00, 4332.85it/s]WARNING ⚠️ /root/workspace/mindyolo/visdrone_COCO_format/train/images/000000003868.jpg: 1 duplicate labels removed Scanning '/root/workspace/mindyolo/visdrone_COCO_format/train.cache' images and labels... 5607 found, 0 missing, 0 empty, 0 corrupted: 87%|████████████████████████████████████████████████████████▎ | 5607/6471 [00:01<00:00, 4337.04it/s]WARNING ⚠️ /root/workspace/mindyolo/visdrone_COCO_format/train/images/000000005742.jpg: 1 duplicate labels removed Scanning '/root/workspace/mindyolo/visdrone_COCO_format/train.cache' images and labels... 6471 found, 0 missing, 0 empty, 0 corrupted: 100%|█████████████████████████████████████████████████████████████████| 6471/6471 [00:01<00:00, 4307.45it/s] 2025-10-23 14:48:32,028 [INFO] New cache created: /root/workspace/mindyolo/visdrone_COCO_format/train.cache.npy 2025-10-23 14:48:32,029 [INFO] Dataset caching success. 2025-10-23 14:48:32,051 [INFO] Dataloader num parallel workers: [8] 2025-10-23 14:48:32,135 [INFO] Dataset Cache file hash/version check success. 2025-10-23 14:48:32,135 [INFO] Load dataset cache from [/root/workspace/mindyolo/visdrone_COCO_format/train.cache.npy] success. Scanning '/root/workspace/mindyolo/visdrone_COCO_format/train.cache.npy' images and labels... 6471 found, 0 missing, 0 empty, 0 corrupted: 100%|███████████████████████████████████████████████████████████████████████| 6471/6471 [00:00<?, ?it/s] 2025-10-23 14:48:32,157 [INFO] Dataloader num parallel workers: [8] 2025-10-23 14:48:32,273 [INFO] Registry(name=callback, total=4) 2025-10-23 14:48:32,273 [INFO] (0): YoloxSwitchTrain in mindyolo/utils/callback.py 2025-10-23 14:48:32,273 [INFO] (1): EvalWhileTrain in mindyolo/utils/callback.py 2025-10-23 14:48:32,273 [INFO] (2): SummaryCallback in mindyolo/utils/callback.py 2025-10-23 14:48:32,273 [INFO] (3): ProfilerCallback in mindyolo/utils/callback.py 2025-10-23 14:48:32,273 [INFO] 2025-10-23 14:48:32,276 [INFO] got 1 active callback as follows: 2025-10-23 14:48:32,276 [INFO] SummaryCallback() 2025-10-23 14:48:32,276 [WARNING] The first epoch will be compiled for the graph, which may take a long time; You can come back later :). albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) [INFO] albumentations load success albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) [INFO] albumentations load success albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) [INFO] albumentations load success [INFO] albumentations load success [INFO] albumentations load success [INFO] albumentations load success [INFO] albumentations load success [INFO] albumentations load success albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) [INFO] albumentations load success albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) [INFO] albumentations load success albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) [INFO] albumentations load success albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) [INFO] albumentations load success albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) [INFO] albumentations load success albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) [INFO] albumentations load success albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) [INFO] albumentations load success albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8)) [INFO] albumentations load success .........2025-10-23 14:52:54,293 [INFO] Epoch 1/10, Step 100/404, imgsize (1024, 1024), loss: 5.5585, lbox: 3.2052, lcls: 0.4855, dfl: 1.8678, cur_lr: 0.09257426112890244 2025-10-23 14:52:55,203 [INFO] Epoch 1/10, Step 100/404, step time: 2629.27 ms 2025-10-23 14:55:40,115 [INFO] Epoch 1/10, Step 200/404, imgsize (1024, 1024), loss: 4.5693, lbox: 2.5884, lcls: 0.4230, dfl: 1.5578, cur_lr: 0.08514851331710815 2025-10-23 14:55:40,138 [INFO] Epoch 1/10, Step 200/404, step time: 1649.36 ms 2025-10-23 14:58:25,055 [INFO] Epoch 1/10, Step 300/404, imgsize (1024, 1024), loss: 3.9681, lbox: 2.1428, lcls: 0.3853, dfl: 1.4400, cur_lr: 0.07772277295589447 2025-10-23 14:58:25,078 [INFO] Epoch 1/10, Step 300/404, step time: 1649.39 ms 2025-10-23 15:01:10,020 [INFO] Epoch 1/10, Step 400/404, imgsize (1024, 1024), loss: 3.6795, lbox: 2.0528, lcls: 0.3339, dfl: 1.2929, cur_lr: 0.07029703259468079 2025-10-23 15:01:10,044 [INFO] Epoch 1/10, Step 400/404, step time: 1649.65 ms 2025-10-23 15:01:17,111 [INFO] Saving model to ./runs/2025.10.23-14.48.02/weights/yolov8s-1_404.ckpt 2025-10-23 15:01:17,111 [INFO] Epoch 1/10, epoch time: 12.75 min. 2025-10-23 15:04:02,010 [INFO] Epoch 2/10, Step 100/404, imgsize (1024, 1024), loss: 3.5361, lbox: 1.9678, lcls: 0.3183, dfl: 1.2500, cur_lr: 0.062162574380636215 2025-10-23 15:04:02,018 [INFO] Epoch 2/10, Step 100/404, step time: 1649.07 ms 2025-10-23 15:06:46,939 [INFO] Epoch 2/10, Step 200/404, imgsize (1024, 1024), loss: 3.3767, lbox: 1.8395, lcls: 0.3042, dfl: 1.2329, cur_lr: 0.05465514957904816 2025-10-23 15:06:46,947 [INFO] Epoch 2/10, Step 200/404, step time: 1649.28 ms 2025-10-23 15:09:31,885 [INFO] Epoch 2/10, Step 300/404, imgsize (1024, 1024), loss: 3.3604, lbox: 1.8753, lcls: 0.3134, dfl: 1.1718, cur_lr: 0.0471477210521698 2025-10-23 15:09:31,894 [INFO] Epoch 2/10, Step 300/404, step time: 1649.46 ms 2025-10-23 15:12:16,806 [INFO] Epoch 2/10, Step 400/404, imgsize (1024, 1024), loss: 3.2902, lbox: 1.8262, lcls: 0.2795, dfl: 1.1846, cur_lr: 0.03964029625058174 2025-10-23 15:12:16,814 [INFO] Epoch 2/10, Step 400/404, step time: 1649.20 ms 2025-10-23 15:12:23,860 [INFO] Saving model to ./runs/2025.10.23-14.48.02/weights/yolov8s-2_404.ckpt 2025-10-23 15:12:23,860 [INFO] Epoch 2/10, epoch time: 11.11 min. 2025-10-23 15:15:08,782 [INFO] Epoch 3/10, Step 100/404, imgsize (1024, 1024), loss: 3.3220, lbox: 1.7991, lcls: 0.3124, dfl: 1.2106, cur_lr: 0.031090890988707542 2025-10-23 15:15:08,791 [INFO] Epoch 3/10, Step 100/404, step time: 1649.30 ms 2025-10-23 15:17:53,703 [INFO] Epoch 3/10, Step 200/404, imgsize (1024, 1024), loss: 3.1162, lbox: 1.6879, lcls: 0.2824, dfl: 1.1460, cur_lr: 0.02350178174674511 2025-10-23 15:17:53,711 [INFO] Epoch 3/10, Step 200/404, step time: 1649.20 ms 2025-10-23 15:20:38,631 [INFO] Epoch 3/10, Step 300/404, imgsize (1024, 1024), loss: 3.0332, lbox: 1.6024, lcls: 0.2703, dfl: 1.1605, cur_lr: 0.015912672504782677 2025-10-23 15:20:38,639 [INFO] Epoch 3/10, Step 300/404, step time: 1649.28 ms 2025-10-23 15:23:23,580 [INFO] Epoch 3/10, Step 400/404, imgsize (1024, 1024), loss: 3.1371, lbox: 1.7095, lcls: 0.2808, dfl: 1.1469, cur_lr: 0.008323564194142818 2025-10-23 15:23:23,589 [INFO] Epoch 3/10, Step 400/404, step time: 1649.49 ms 2025-10-23 15:23:30,617 [INFO] Saving model to ./runs/2025.10.23-14.48.02/weights/yolov8s-3_404.ckpt 2025-10-23 15:23:30,617 [INFO] Epoch 3/10, epoch time: 11.11 min. 2025-10-23 15:26:15,527 [INFO] Epoch 4/10, Step 100/404, imgsize (1024, 1024), loss: 3.2965, lbox: 1.8179, lcls: 0.2614, dfl: 1.2172, cur_lr: 0.007029999978840351 2025-10-23 15:26:15,535 [INFO] Epoch 4/10, Step 100/404, step time: 1649.18 ms 2025-10-23 15:29:00,451 [INFO] Epoch 4/10, Step 200/404, imgsize (1024, 1024), loss: 3.1855, lbox: 1.7697, lcls: 0.2504, dfl: 1.1654, cur_lr: 0.007029999978840351 2025-10-23 15:29:00,459 [INFO] Epoch 4/10, Step 200/404, step time: 1649.24 ms 2025-10-23 15:31:45,369 [INFO] Epoch 4/10, Step 300/404, imgsize (1024, 1024), loss: 2.9900, lbox: 1.6270, lcls: 0.2307, dfl: 1.1323, cur_lr: 0.007029999978840351 2025-10-23 15:31:45,378 [INFO] Epoch 4/10, Step 300/404, step time: 1649.18 ms 2025-10-23 15:34:30,277 [INFO] Epoch 4/10, Step 400/404, imgsize (1024, 1024), loss: 3.1742, lbox: 1.7506, lcls: 0.2590, dfl: 1.1646, cur_lr: 0.007029999978840351 2025-10-23 15:34:30,285 [INFO] Epoch 4/10, Step 400/404, step time: 1649.07 ms 2025-10-23 15:34:37,315 [INFO] Saving model to ./runs/2025.10.23-14.48.02/weights/yolov8s-4_404.ckpt 2025-10-23 15:34:37,316 [INFO] Epoch 4/10, epoch time: 11.11 min. 2025-10-23 15:37:22,195 [INFO] Epoch 5/10, Step 100/404, imgsize (1024, 1024), loss: 2.9632, lbox: 1.6123, lcls: 0.2424, dfl: 1.1085, cur_lr: 0.006039999891072512 2025-10-23 15:37:22,204 [INFO] Epoch 5/10, Step 100/404, step time: 1648.88 ms 2025-10-23 15:40:07,094 [INFO] Epoch 5/10, Step 200/404, imgsize (1024, 1024), loss: 2.7776, lbox: 1.4777, lcls: 0.2025, dfl: 1.0975, cur_lr: 0.006039999891072512 2025-10-23 15:40:07,103 [INFO] Epoch 5/10, Step 200/404, step time: 1648.99 ms 2025-10-23 15:42:52,021 [INFO] Epoch 5/10, Step 300/404, imgsize (1024, 1024), loss: 2.7209, lbox: 1.4253, lcls: 0.2130, dfl: 1.0826, cur_lr: 0.006039999891072512 2025-10-23 15:42:52,029 [INFO] Epoch 5/10, Step 300/404, step time: 1649.26 ms 2025-10-23 15:45:36,965 [INFO] Epoch 5/10, Step 400/404, imgsize (1024, 1024), loss: 2.7360, lbox: 1.4817, lcls: 0.2157, dfl: 1.0387, cur_lr: 0.006039999891072512 2025-10-23 15:45:36,973 [INFO] Epoch 5/10, Step 400/404, step time: 1649.44 ms 2025-10-23 15:45:44,037 [INFO] Saving model to ./runs/2025.10.23-14.48.02/weights/yolov8s-5_404.ckpt 2025-10-23 15:45:44,037 [INFO] Epoch 5/10, epoch time: 11.11 min. 2025-10-23 15:48:28,914 [INFO] Epoch 6/10, Step 100/404, imgsize (1024, 1024), loss: 2.6675, lbox: 1.4472, lcls: 0.2042, dfl: 1.0161, cur_lr: 0.005049999803304672 2025-10-23 15:48:28,923 [INFO] Epoch 6/10, Step 100/404, step time: 1648.85 ms 2025-10-23 15:51:13,798 [INFO] Epoch 6/10, Step 200/404, imgsize (1024, 1024), loss: 2.7114, lbox: 1.4235, lcls: 0.1986, dfl: 1.0893, cur_lr: 0.005049999803304672 2025-10-23 15:51:13,807 [INFO] Epoch 6/10, Step 200/404, step time: 1648.84 ms 2025-10-23 15:53:58,688 [INFO] Epoch 6/10, Step 300/404, imgsize (1024, 1024), loss: 2.6783, lbox: 1.4169, lcls: 0.1985, dfl: 1.0629, cur_lr: 0.005049999803304672 2025-10-23 15:53:58,697 [INFO] Epoch 6/10, Step 300/404, step time: 1648.90 ms 2025-10-23 15:56:43,578 [INFO] Epoch 6/10, Step 400/404, imgsize (1024, 1024), loss: 2.7539, lbox: 1.4734, lcls: 0.2037, dfl: 1.0768, cur_lr: 0.005049999803304672 2025-10-23 15:56:43,586 [INFO] Epoch 6/10, Step 400/404, step time: 1648.89 ms 2025-10-23 15:56:50,613 [INFO] Saving model to ./runs/2025.10.23-14.48.02/weights/yolov8s-6_404.ckpt 2025-10-23 15:56:50,613 [INFO] Epoch 6/10, epoch time: 11.11 min. 2025-10-23 15:59:35,561 [INFO] Epoch 7/10, Step 100/404, imgsize (1024, 1024), loss: 2.9109, lbox: 1.6203, lcls: 0.2210, dfl: 1.0696, cur_lr: 0.00406000018119812 2025-10-23 15:59:35,569 [INFO] Epoch 7/10, Step 100/404, step time: 1649.56 ms 2025-10-23 16:02:20,470 [INFO] Epoch 7/10, Step 200/404, imgsize (1024, 1024), loss: 2.6941, lbox: 1.4727, lcls: 0.2068, dfl: 1.0147, cur_lr: 0.00406000018119812 2025-10-23 16:02:20,479 [INFO] Epoch 7/10, Step 200/404, step time: 1649.10 ms 2025-10-23 16:05:05,384 [INFO] Epoch 7/10, Step 300/404, imgsize (1024, 1024), loss: 2.8098, lbox: 1.4810, lcls: 0.2188, dfl: 1.1101, cur_lr: 0.00406000018119812 2025-10-23 16:05:05,391 [INFO] Epoch 7/10, Step 300/404, step time: 1649.12 ms 2025-10-23 16:07:50,302 [INFO] Epoch 7/10, Step 400/404, imgsize (1024, 1024), loss: 2.8426, lbox: 1.5529, lcls: 0.2108, dfl: 1.0788, cur_lr: 0.00406000018119812 2025-10-23 16:07:50,310 [INFO] Epoch 7/10, Step 400/404, step time: 1649.18 ms 2025-10-23 16:07:57,341 [INFO] Saving model to ./runs/2025.10.23-14.48.02/weights/yolov8s-7_404.ckpt 2025-10-23 16:07:57,342 [INFO] Epoch 7/10, epoch time: 11.11 min. 2025-10-23 16:10:42,225 [INFO] Epoch 8/10, Step 100/404, imgsize (1024, 1024), loss: 2.4095, lbox: 1.2257, lcls: 0.1704, dfl: 1.0134, cur_lr: 0.0030700000934302807 2025-10-23 16:10:42,233 [INFO] Epoch 8/10, Step 100/404, step time: 1648.92 ms 2025-10-23 16:13:27,126 [INFO] Epoch 8/10, Step 200/404, imgsize (1024, 1024), loss: 2.6034, lbox: 1.3788, lcls: 0.1872, dfl: 1.0374, cur_lr: 0.0030700000934302807 2025-10-23 16:13:27,134 [INFO] Epoch 8/10, Step 200/404, step time: 1649.00 ms 2025-10-23 16:16:12,032 [INFO] Epoch 8/10, Step 300/404, imgsize (1024, 1024), loss: 2.6074, lbox: 1.3916, lcls: 0.1787, dfl: 1.0371, cur_lr: 0.0030700000934302807 2025-10-23 16:16:12,041 [INFO] Epoch 8/10, Step 300/404, step time: 1649.07 ms 2025-10-23 16:18:56,946 [INFO] Epoch 8/10, Step 400/404, imgsize (1024, 1024), loss: 2.8867, lbox: 1.4981, lcls: 0.2189, dfl: 1.1697, cur_lr: 0.0030700000934302807 2025-10-23 16:18:56,954 [INFO] Epoch 8/10, Step 400/404, step time: 1649.13 ms 2025-10-23 16:19:03,973 [INFO] Saving model to ./runs/2025.10.23-14.48.02/weights/yolov8s-8_404.ckpt 2025-10-23 16:19:03,973 [INFO] Epoch 8/10, epoch time: 11.11 min. 2025-10-23 16:21:48,883 [INFO] Epoch 9/10, Step 100/404, imgsize (1024, 1024), loss: 2.8544, lbox: 1.6248, lcls: 0.2181, dfl: 1.0115, cur_lr: 0.0020800000056624413 2025-10-23 16:21:48,891 [INFO] Epoch 9/10, Step 100/404, step time: 1649.18 ms 2025-10-23 16:24:33,791 [INFO] Epoch 9/10, Step 200/404, imgsize (1024, 1024), loss: 2.9393, lbox: 1.6026, lcls: 0.2223, dfl: 1.1145, cur_lr: 0.0020800000056624413 2025-10-23 16:24:33,799 [INFO] Epoch 9/10, Step 200/404, step time: 1649.08 ms 2025-10-23 16:27:18,695 [INFO] Epoch 9/10, Step 300/404, imgsize (1024, 1024), loss: 2.4632, lbox: 1.2884, lcls: 0.1701, dfl: 1.0047, cur_lr: 0.0020800000056624413 2025-10-23 16:27:18,703 [INFO] Epoch 9/10, Step 300/404, step time: 1649.04 ms 2025-10-23 16:30:03,567 [INFO] Epoch 9/10, Step 400/404, imgsize (1024, 1024), loss: 2.7216, lbox: 1.4867, lcls: 0.2002, dfl: 1.0346, cur_lr: 0.0020800000056624413 2025-10-23 16:30:03,575 [INFO] Epoch 9/10, Step 400/404, step time: 1648.72 ms 2025-10-23 16:30:10,627 [INFO] Saving model to ./runs/2025.10.23-14.48.02/weights/yolov8s-9_404.ckpt 2025-10-23 16:30:10,627 [INFO] Epoch 9/10, epoch time: 11.11 min. 2025-10-23 16:32:55,537 [INFO] Epoch 10/10, Step 100/404, imgsize (1024, 1024), loss: 2.5899, lbox: 1.4239, lcls: 0.1668, dfl: 0.9992, cur_lr: 0.0010900000343099236 2025-10-23 16:32:55,545 [INFO] Epoch 10/10, Step 100/404, step time: 1649.18 ms 2025-10-23 16:35:40,433 [INFO] Epoch 10/10, Step 200/404, imgsize (1024, 1024), loss: 2.5535, lbox: 1.3745, lcls: 0.1813, dfl: 0.9976, cur_lr: 0.0010900000343099236 2025-10-23 16:35:40,441 [INFO] Epoch 10/10, Step 200/404, step time: 1648.95 ms 2025-10-23 16:38:25,358 [INFO] Epoch 10/10, Step 300/404, imgsize (1024, 1024), loss: 2.4509, lbox: 1.2441, lcls: 0.1717, dfl: 1.0351, cur_lr: 0.0010900000343099236 2025-10-23 16:38:25,366 [INFO] Epoch 10/10, Step 300/404, step time: 1649.25 ms 2025-10-23 16:41:10,260 [INFO] Epoch 10/10, Step 400/404, imgsize (1024, 1024), loss: 2.6832, lbox: 1.4217, lcls: 0.1896, dfl: 1.0719, cur_lr: 0.0010900000343099236 2025-10-23 16:41:10,268 [INFO] Epoch 10/10, Step 400/404, step time: 1649.02 ms 2025-10-23 16:41:17,324 [INFO] Saving model to ./runs/2025.10.23-14.48.02/weights/yolov8s-10_404.ckpt 2025-10-23 16:41:17,324 [INFO] Epoch 10/10, epoch time: 11.11 min. 2025-10-23 16:41:17,742 [INFO] End Train. 2025-10-23 16:41:18,446 [INFO] Training completed.平均每个epoch耗时约10min左右,在训练过程中我们也可以查看AI Core的利用率以及内存的占用情况:npu-smi info+--------------------------------------------------------------------------------------------------------+ | npu-smi v1.0 Version: 24.1.rc4.b999 | +-------------------------------+-----------------+------------------------------------------------------+ | NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) | | Chip Device | Bus-Id | AICore(%) Memory-Usage(MB) | +===============================+=================+======================================================+ | 30208 310P1 | OK | NA 52 11372 / 11372 | | 0 0 | 0000:77:00.0 | 99 24288/ 89608 | +-------------------------------+-----------------+------------------------------------------------------+ | 30208 310P1 | OK | NA 42 0 / 0 | | 1 1 | 0000:77:00.0 | 0 1576 / 89085 | +===============================+=================+======================================================+ +-------------------------------+-----------------+------------------------------------------------------+ | NPU Chip | Process id | Process name | Process memory(MB) | +===============================+=================+======================================================+ | 30208 0 | 336686 | python3 | 22835 | +===============================+=================+======================================================+四、模型验证这里我们仅训练了10个epoch进行模型的验证,可以看到模型的精度和召回率如下:python3 test.py --config ./configs/yolov8/yolov8s.yaml --device_target Ascend --weight ./runs/2025.10.23-14.48.02/weights/yolov8s-10_404.ckpt2025-10-23 16:46:18,824 [INFO] parse_args: 2025-10-23 16:46:18,824 [INFO] task detect 2025-10-23 16:46:18,824 [INFO] device_target Ascend 2025-10-23 16:46:18,824 [INFO] ms_mode 0 2025-10-23 16:46:18,824 [INFO] ms_amp_level O0 2025-10-23 16:46:18,824 [INFO] ms_enable_graph_kernel False 2025-10-23 16:46:18,824 [INFO] precision_mode None 2025-10-23 16:46:18,824 [INFO] weight ./runs/2025.10.23-14.48.02/weights/yolov8s-10_404.ckpt 2025-10-23 16:46:18,824 [INFO] per_batch_size 16 2025-10-23 16:46:18,824 [INFO] img_size 1024 2025-10-23 16:46:18,824 [INFO] single_cls False 2025-10-23 16:46:18,824 [INFO] rect False 2025-10-23 16:46:18,824 [INFO] exec_nms True 2025-10-23 16:46:18,824 [INFO] nms_time_limit 60.0 2025-10-23 16:46:18,824 [INFO] conf_thres 0.001 2025-10-23 16:46:18,824 [INFO] iou_thres 0.7 2025-10-23 16:46:18,824 [INFO] conf_free True 2025-10-23 16:46:18,824 [INFO] seed 2 2025-10-23 16:46:18,824 [INFO] log_level INFO 2025-10-23 16:46:18,824 [INFO] save_dir ./runs_test/2025.10.23-16.46.18 2025-10-23 16:46:18,824 [INFO] enable_modelarts False 2025-10-23 16:46:18,824 [INFO] data_url 2025-10-23 16:46:18,824 [INFO] ckpt_url 2025-10-23 16:46:18,824 [INFO] train_url 2025-10-23 16:46:18,824 [INFO] data_dir /cache/data/ 2025-10-23 16:46:18,824 [INFO] is_parallel False 2025-10-23 16:46:18,824 [INFO] ckpt_dir /cache/pretrain_ckpt/ 2025-10-23 16:46:18,824 [INFO] data.dataset_name result 2025-10-23 16:46:18,824 [INFO] data.train_set /root/workspace/mindyolo/visdrone_COCO_format/train.txt 2025-10-23 16:46:18,824 [INFO] data.val_set /root/workspace/mindyolo/visdrone_COCO_format/val.txt 2025-10-23 16:46:18,824 [INFO] data.test_set /root/workspace/mindyolo/visdrone_COCO_format/val.txt 2025-10-23 16:46:18,824 [INFO] data.nc 12 2025-10-23 16:46:18,824 [INFO] data.names ['ignored regions', 'pedestrian', 'people', 'bicycle', 'car', 'van', 'truck', 'tricycle', 'awning-tricycle', 'bus', 'motor', 'others'] 2025-10-23 16:46:18,824 [INFO] train_transforms.stage_epochs [5, 5] 2025-10-23 16:46:18,824 [INFO] train_transforms.trans_list [[{'func_name': 'mosaic', 'prob': 1.0}, {'func_name': 'resample_segments'}, {'func_name': 'random_perspective', 'prob': 1.0, 'degrees': 0.0, 'translate': 0.1, 'scale': 0.5, 'shear': 0.0}, {'func_name': 'albumentations'}, {'func_name': 'hsv_augment', 'prob': 1.0, 'hgain': 0.015, 'sgain': 0.7, 'vgain': 0.4}, {'func_name': 'fliplr', 'prob': 0.5}, {'func_name': 'label_norm', 'xyxy2xywh_': True}, {'func_name': 'label_pad', 'padding_size': 160, 'padding_value': -1}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}], [{'func_name': 'letterbox', 'scaleup': True}, {'func_name': 'resample_segments'}, {'func_name': 'random_perspective', 'prob': 1.0, 'degrees': 0.0, 'translate': 0.1, 'scale': 0.5, 'shear': 0.0}, {'func_name': 'albumentations'}, {'func_name': 'hsv_augment', 'prob': 1.0, 'hgain': 0.015, 'sgain': 0.7, 'vgain': 0.4}, {'func_name': 'fliplr', 'prob': 0.5}, {'func_name': 'label_norm', 'xyxy2xywh_': True}, {'func_name': 'label_pad', 'padding_size': 160, 'padding_value': -1}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}]] 2025-10-23 16:46:18,824 [INFO] data.test_transforms [{'func_name': 'letterbox', 'scaleup': False, 'only_image': True}, {'func_name': 'image_norm', 'scale': 255.0}, {'func_name': 'image_transpose', 'bgr2rgb': True, 'hwc2chw': True}] 2025-10-23 16:46:18,824 [INFO] data.num_parallel_workers 8 2025-10-23 16:46:18,824 [INFO] optimizer.optimizer momentum 2025-10-23 16:46:18,824 [INFO] optimizer.lr_init 0.01 2025-10-23 16:46:18,824 [INFO] optimizer.momentum 0.937 2025-10-23 16:46:18,824 [INFO] optimizer.nesterov True 2025-10-23 16:46:18,824 [INFO] optimizer.loss_scale 1.0 2025-10-23 16:46:18,824 [INFO] optimizer.warmup_epochs 3 2025-10-23 16:46:18,824 [INFO] optimizer.warmup_momentum 0.8 2025-10-23 16:46:18,824 [INFO] optimizer.warmup_bias_lr 0.1 2025-10-23 16:46:18,824 [INFO] optimizer.min_warmup_step 1000 2025-10-23 16:46:18,824 [INFO] optimizer.group_param yolov8 2025-10-23 16:46:18,824 [INFO] optimizer.gp_weight_decay 0.0005 2025-10-23 16:46:18,824 [INFO] optimizer.start_factor 1.0 2025-10-23 16:46:18,824 [INFO] optimizer.end_factor 0.01 2025-10-23 16:46:18,824 [INFO] loss.name YOLOv8Loss 2025-10-23 16:46:18,824 [INFO] loss.box 7.5 2025-10-23 16:46:18,824 [INFO] loss.cls 0.5 2025-10-23 16:46:18,824 [INFO] loss.dfl 1.5 2025-10-23 16:46:18,824 [INFO] loss.reg_max 16 2025-10-23 16:46:18,824 [INFO] epochs 10 2025-10-23 16:46:18,824 [INFO] sync_bn True 2025-10-23 16:46:18,824 [INFO] anchor_base False 2025-10-23 16:46:18,824 [INFO] opencv_threads_num 0 2025-10-23 16:46:18,824 [INFO] network.model_name yolov8 2025-10-23 16:46:18,824 [INFO] network.nc 80 2025-10-23 16:46:18,824 [INFO] network.reg_max 16 2025-10-23 16:46:18,824 [INFO] network.stride [8, 16, 32] 2025-10-23 16:46:18,824 [INFO] network.backbone [[-1, 1, 'ConvNormAct', [64, 3, 2]], [-1, 1, 'ConvNormAct', [128, 3, 2]], [-1, 3, 'C2f', [128, True]], [-1, 1, 'ConvNormAct', [256, 3, 2]], [-1, 6, 'C2f', [256, True]], [-1, 1, 'ConvNormAct', [512, 3, 2]], [-1, 6, 'C2f', [512, True]], [-1, 1, 'ConvNormAct', [1024, 3, 2]], [-1, 3, 'C2f', [1024, True]], [-1, 1, 'SPPF', [1024, 5]]] 2025-10-23 16:46:18,824 [INFO] network.head [[-1, 1, 'Upsample', ['None', 2, 'nearest']], [[-1, 6], 1, 'Concat', [1]], [-1, 3, 'C2f', [512]], [-1, 1, 'Upsample', ['None', 2, 'nearest']], [[-1, 4], 1, 'Concat', [1]], [-1, 3, 'C2f', [256]], [-1, 1, 'ConvNormAct', [256, 3, 2]], [[-1, 12], 1, 'Concat', [1]], [-1, 3, 'C2f', [512]], [-1, 1, 'ConvNormAct', [512, 3, 2]], [[-1, 9], 1, 'Concat', [1]], [-1, 3, 'C2f', [1024]], [[15, 18, 21], 1, 'YOLOv8Head', ['nc', 'reg_max', 'stride']]] 2025-10-23 16:46:18,824 [INFO] network.depth_multiple 0.33 2025-10-23 16:46:18,824 [INFO] network.width_multiple 0.5 2025-10-23 16:46:18,824 [INFO] network.max_channels 1024 2025-10-23 16:46:18,824 [INFO] overflow_still_update False 2025-10-23 16:46:18,824 [INFO] config ./configs/yolov8/yolov8s.yaml 2025-10-23 16:46:18,824 [INFO] rank 0 2025-10-23 16:46:18,824 [INFO] rank_size 1 2025-10-23 16:46:18,824 [INFO] 2025-10-23 16:46:18,898 [WARNING] Parse Model, args: nearest, keep str type 2025-10-23 16:46:18,909 [WARNING] Parse Model, args: nearest, keep str type 2025-10-23 16:46:18,984 [INFO] number of network params, total: 11.160279M, trainable: 11.140228M [WARNING] GE_ADPT(540183,7efcd8e26740,python3):2025-10-23-16:46:22.493.658 [mindspore/ops/kernel/ascend/acl_ir/op_api_exec.cc:169] GetAscendDefaultCustomPath] Checking whether the so exists or if permission to access it is available: /usr/local/Ascend/ascend-toolkit/latest/opp/vendors/customize_vision/op_api/lib/libcust_opapi.so 2025-10-23 16:46:23,434 [INFO] Load checkpoint from [./runs/2025.10.23-14.48.02/weights/yolov8s-10_404.ckpt] success. 2025-10-23 16:46:23,437 [INFO] No dataset cache available, caching now... Scanning '/root/workspace/mindyolo/visdrone_COCO_format/val.cache' images and labels... 548 found, 0 missing, 0 empty, 0 corrupted: 100%|█████████████████████████████████████████████████████████████████████████████| 548/548 [00:00<00:00, 3754.44it/s] 2025-10-23 16:46:23,595 [INFO] New cache created: /root/workspace/mindyolo/visdrone_COCO_format/val.cache.npy 2025-10-23 16:46:23,595 [INFO] Dataset caching success. 2025-10-23 16:46:23,597 [INFO] Dataloader num parallel workers: [8] 2025-10-23 16:46:23,607 [WARNING] unable to load fast_coco_eval api, use normal one instead Warning: tiling offset out of range, index: 32 ..2025-10-23 16:46:55,297 [INFO] Sample 35/1, time cost: 30512.14 ms. 2025-10-23 16:46:57,108 [INFO] Sample 35/2, time cost: 1722.38 ms. 2025-10-23 16:46:58,628 [INFO] Sample 35/3, time cost: 1420.95 ms. 2025-10-23 16:47:00,538 [INFO] Sample 35/4, time cost: 1809.91 ms. 2025-10-23 16:47:02,502 [INFO] Sample 35/5, time cost: 1865.30 ms. 2025-10-23 16:47:04,321 [INFO] Sample 35/6, time cost: 1718.46 ms. 2025-10-23 16:47:06,724 [INFO] Sample 35/7, time cost: 2303.35 ms. 2025-10-23 16:47:08,940 [INFO] Sample 35/8, time cost: 2117.25 ms. 2025-10-23 16:47:11,018 [INFO] Sample 35/9, time cost: 1978.46 ms. 2025-10-23 16:47:13,101 [INFO] Sample 35/10, time cost: 1982.41 ms. 2025-10-23 16:47:14,871 [INFO] Sample 35/11, time cost: 1671.05 ms. 2025-10-23 16:47:17,112 [INFO] Sample 35/12, time cost: 2140.79 ms. 2025-10-23 16:47:19,142 [INFO] Sample 35/13, time cost: 1930.53 ms. 2025-10-23 16:47:20,984 [INFO] Sample 35/14, time cost: 1741.35 ms. 2025-10-23 16:47:23,393 [INFO] Sample 35/15, time cost: 2307.50 ms. 2025-10-23 16:47:25,557 [INFO] Sample 35/16, time cost: 2060.89 ms. 2025-10-23 16:47:27,324 [INFO] Sample 35/17, time cost: 1664.00 ms. 2025-10-23 16:47:29,254 [INFO] Sample 35/18, time cost: 1824.31 ms. 2025-10-23 16:47:31,281 [INFO] Sample 35/19, time cost: 1921.78 ms. 2025-10-23 16:47:33,331 [INFO] Sample 35/20, time cost: 1942.85 ms. 2025-10-23 16:47:35,806 [INFO] Sample 35/21, time cost: 2368.87 ms. 2025-10-23 16:47:38,165 [INFO] Sample 35/22, time cost: 2255.00 ms. 2025-10-23 16:47:40,453 [INFO] Sample 35/23, time cost: 2182.96 ms. 2025-10-23 16:47:42,588 [INFO] Sample 35/24, time cost: 2029.14 ms. 2025-10-23 16:47:44,490 [INFO] Sample 35/25, time cost: 1796.02 ms. 2025-10-23 16:47:46,804 [INFO] Sample 35/26, time cost: 2207.91 ms. 2025-10-23 16:47:49,181 [INFO] Sample 35/27, time cost: 2270.69 ms. 2025-10-23 16:47:50,926 [INFO] Sample 35/28, time cost: 1638.70 ms. 2025-10-23 16:47:53,079 [INFO] Sample 35/29, time cost: 2046.37 ms. 2025-10-23 16:47:55,061 [INFO] Sample 35/30, time cost: 1875.28 ms. 2025-10-23 16:47:57,140 [INFO] Sample 35/31, time cost: 1972.00 ms. 2025-10-23 16:47:59,895 [INFO] Sample 35/32, time cost: 2647.24 ms. 2025-10-23 16:48:02,196 [INFO] Sample 35/33, time cost: 2191.50 ms. 2025-10-23 16:48:04,739 [INFO] Sample 35/34, time cost: 2434.77 ms. ..2025-10-23 16:48:20,509 [INFO] Sample 35/35, time cost: 15723.18 ms. 2025-10-23 16:48:20,509 [INFO] loading annotations into memory... 2025-10-23 16:48:20,639 [INFO] Done (t=0.13s) 2025-10-23 16:48:20,639 [INFO] creating index... 2025-10-23 16:48:20,650 [INFO] index created! 2025-10-23 16:48:20,650 [INFO] Loading and preparing results... 2025-10-23 16:48:21,106 [INFO] DONE (t=0.46s) 2025-10-23 16:48:21,106 [INFO] creating index... 2025-10-23 16:48:21,134 [INFO] index created! 2025-10-23 16:48:21,135 [INFO] Running per image evaluation... 2025-10-23 16:48:21,135 [INFO] Evaluate annotation type *bbox* 2025-10-23 16:48:31,087 [INFO] DONE (t=9.95s). 2025-10-23 16:48:31,087 [INFO] Accumulating evaluation results... 2025-10-23 16:48:31,996 [INFO] DONE (t=0.91s). 2025-10-23 16:48:31,996 [INFO] Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.019 2025-10-23 16:48:31,996 [INFO] Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.036 2025-10-23 16:48:31,996 [INFO] Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.019 2025-10-23 16:48:31,996 [INFO] Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.016 2025-10-23 16:48:31,997 [INFO] Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.024 2025-10-23 16:48:31,997 [INFO] Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.056 2025-10-23 16:48:31,997 [INFO] Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.009 2025-10-23 16:48:31,997 [INFO] Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.049 2025-10-23 16:48:31,997 [INFO] Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.076 2025-10-23 16:48:31,997 [INFO] Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.057 2025-10-23 16:48:31,997 [INFO] Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.106 2025-10-23 16:48:31,997 [INFO] Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.161 2025-10-23 16:48:31,997 [INFO] Speed: 99.0/100.3/199.3 ms inference/NMS/total per 1024x1024 image at batch-size 16; 2025-10-23 16:48:31,997 [INFO] Testing completed, cost 133.18s.使用predict.py测试训练模型参数的结果并进行可视化推理,运行方式如下:python3 examples/finetune_visdrone/predict.py --config ./configs/yolov8/yolov8s.yaml --weight=./runs/2025.10.23-14.48.02/weights/yolov8s-120_404.ckpt --image_path ./visdrone_COCO_format/val/images/000000000001.jpg训练120个epoch后,模型的推理效果如下:五、小结本文详细阐述了在OrangePi AI Studio Pro上基于昇腾310P使用MindYolo框架实现YOLOv8模型训练与验证的完整流程,涵盖环境准备、数据集格式转换、模型训练参数配置及性能评估。
-
为方便开发者们参照实操案例进行智果(AgentArts)产品体验特地把收录进案例中心的AgentArts相关案例搬运过来,方便查看后续持续更新~hi~ 来试试构建出彰显个人创意的AI Agent智能体(小助手) 案例标题入口更新时间推荐值案例创作方NEW~ 敏感词猎手:用AgentArts工作流一键扫描文档风险LINK2026/06/11 ⭐⭐⭐⭐⭐官方案例中心【免费版订阅指导】华为云智能体构建平台AgentArts Agent免费版订阅使用指导LINK2025/11/20⭐⭐⭐⭐官方案例中心基于华为开发者空间-Versatile Agent构建实时股票分析助手LINK2026/01/21 ⭐⭐⭐⭐官方案例中心基于华为开发者空间-Versatile Agent构建旅游出行助手LINK2025/10/22⭐⭐⭐⭐官方案例中心华为开发者空间云开发环境+Versatile Agent,构建AI轻量级智能办公助手LINK2025/11/25 ⭐⭐⭐⭐官方案例中心基于华为开发者空间开发平台 MCP资产快速构建AI Agent应用LINK2025/11/12 ⭐⭐⭐官方案例中心基于华为开发者空间开发平台构建We码会议助手LINK2025/10/10 ⭐⭐⭐⭐官方案例中心基于华为开发者空间-云开发环境(容器)与Versatile Agent构建AI自动评分助手 LINK2026/01/12 ⭐⭐⭐⭐⭐贡献用户:tmq244基于华为开发者空间-云开发环境(容器)与Versatile Agent构建AI轻量级智能笑话机器人助手LINK2026/01/29⭐⭐⭐⭐贡献用户:liujxu【案例共创】基于华为云开发者空间-Versatile Agent开发平台构建昇腾C算子开发知识库LINK2025/11/17⭐⭐⭐⭐⭐贡献用户:黄生【案例共创】使用开发者空间 AI Agent+RAG+高德地图MCP开发班车出行助手LINK2025/07/05 ⭐⭐⭐贡献用户:神一样的老师【案例共创】基于华为开发者空间Versatile agent平台快速搭建智能搜索可视化应用LINK2025/11/17 ⭐⭐⭐贡献用户:胡琦【案例共创】基于华为开发者空间-AI Agent开发平台构建旅游规划助手LINK2025/11/17 ⭐⭐⭐贡献用户:yd_272483742【案例共创】基于华为开发者空间开发平台 MCP资产快速构建税务AI助手服务LINK2025/11/17 ⭐⭐⭐贡献用户:小草飞上天【案例共创】基于华为云开发者空间-Versatile Agent开发平台零基础开发购房助手LINK2025/11/17 ⭐⭐⭐贡献用户:CC07 < 华为云智果(AgentArts)智能体平台 官网主页> (点击进入)
AgentArts运营小助手
发表于2025-10-24 14:23:11
2025-10-24 14:23:11
最后回复
yd_212847908
2026-05-20 18:29:38
887 4 -
当大模型参数向万亿级跨越、多模态应用对算力提出指数级需求时,长期主导 AI 训练的 GPU 架构,正面临功耗、成本与专用性的三重挑战。从谷歌 TPU 的脉动阵列到寒武纪思元的智能处理器,从专注训练的 DPU 到面向边缘推理的 NPU,各类专用 AI 芯片架构如雨后春笋般涌现,试图在算力竞赛中抢占下一代核心赛道。这些新兴架构究竟是对 GPU 的补充,还是颠覆式的替代?它们在并行计算效率、软硬件生态适配、成本控制等维度,与传统 GPU 相比有哪些核心优势与短板?在生成式 AI、自动驾驶、科学计算等不同场景下,又该如何选择最优的算力架构?欢迎分享你的观点:你认为哪种芯片架构最有可能成为 GPU 之后的下一代算力核心?其技术突破点与商业化瓶颈分别是什么?一起探讨 AI 芯片架构的革新方向与产业格局的未来演变。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签