先交代一个可能让准备照着文章抄的人意外的事实到今天为止Ultralytics 官方仓库里并没有一个叫 YOLO26 的正式 release。社区里口口相传的 YOLO26要么是开发者在讨论下一个版本时的代号要么是某些个人或团队在 fork 分支里继续迭代的版本号。我写这篇东西目的不是去考证版本号而是想把从源码复现、自定义数据集训练评估到图片/视频推理这条完整链路彻底拆透——这套链路在 YOLO 系列工程里高度统一无论后续版本叫 26 还是 27你在这篇文章里学到的东西都能直接迁移过去。1. 动手之前先理清这条工程链路的真实边界1.1 关于版本号说点实在话目标检测这个领域每年都有新版本冒出来YOLO 系列的迭代尤其快。从 YOLOv5 到 YOLOv8、YOLO11、YOLO12每个版本发布的时候最先被大家关注的往往不是网络结构本身而是“训练命令变了没有”“权重文件能不能直接下”“我原来的代码还能不能跑”。这其实揭示了一个现实对绝大多数工程型选手来说YOLO 的价值不在于某个版本号的先进程度而在于它的代码框架收敛了数据集处理、训练、验证、推理的完整流程让你能腾出精力去搞自己的数据、调自己的业务。所以我会在开篇先把话说清楚这篇文章说的 YOLO26我把它当作“新版 YOLO 工程框架”的代名词来用。文中的命令和代码都以 Ultralytics 这套工程体系为主线官方仓库目前能稳定获取的预训练权重是 v8 和 v11 系列后续哪怕真的发布了 26 版本训练入口、数据格式、推理接口也不会有颠覆性变化到时候把模型文件名换掉就行。1.2 源码复现到底“复现”的是什么很多新手一听“源码复现”就头皮发麻以为是让你从零手写网络结构、自己把 C2f、SPPF 这些模块一行行敲出来。其实在工程语境下“从源码复现”指的是另一件事把官方仓库代码拉到本地把依赖环境配好把预训练权重跑到起来然后在此基础上复现出文档里说的训练效果。这个过程你可以理解为“把别人的工程原样在自家机器上跑通一遍”。这一点非常重要。我见过太多人一上来就想着改这改那网络结构还没跑明白就给自己加注意力模块、换损失函数结果环境都没配好报错信息堆了一屏。正确顺序永远是先原封不动跑通官方 demo再换数据集训练最后才谈改进。你连官方代码在这个环境里的表现基线都没建立起来后面改了什么导致效果变好还是变坏你根本说不清楚。1.3 适合谁、需要什么基础这篇东西适合两类人。一类是刚入门目标检测、想用 YOLO 跑通一个完整项目的学生或转行者你可以把它当成一条龙的操作手册另一类是有一定开发经验、但被环境配置和数据处理折磨过的人你可以跳过前面基础内容直接看数据集制作和训练参数调优的部分。硬件门槛其实没有想象中高。有 NVIDIA 显卡最好显存 6GB 以上就能比较舒服地训练小模型没有 GPU 也能跑只是速度慢一些。编程语言层面会 Python 基础语法就够了网络结构不懂不影响你跑通流程但如果后面想做改进还是建议补一下卷积、特征金字塔这些基本概念。我的建议是不用等学完理论再动手边跑边学遇到什么问题查什么这个效率是最高的。2. 环境配置把最容易翻车的 Conda/CUDA 一次说透环境配置是整个流程里最枯燥、却也最劝退人的环节。这个阶段出的问题大多不是代码问题而是系统中的 Python、CUDA、PyTorch 三者版本互相不匹配。我先给你一套我目前用下来最省心的配置路线。2.1 第一步确认显卡驱动到底支持到什么规格在装任何深度学习框架之前先打开终端敲一句nvidia-smi。这个命令会显示你的显卡型号、驱动版本以及驱动支持的 CUDA 版本上限。很多人在这里就犯了错去网上看到一个需要 CUDA 12.1 的 PyTorch 版本也不管自己驱动支不支持就开始装结果要么装完用不了要么得重新换驱动。需要明确一个概念nvidia-smi显示的是驱动支持的最高 CUDA 版本不代表你本地已经装了对应版本的 CUDA Toolkit。PyTorch 安装时会自带对应的 CUDA 运行库不需要你额外去折腾整套 CUDA Toolkit安装包。所以你要做的只是确认PyTorch 需要的 CUDA 版本不超过你驱动的上限即可。比如驱动支持 CUDA 12.4那你装 PyTorch 的 12.1 或 12.4 版本都没问题。显卡型号建议显存适合的训练规模GTX 1660 / 20606GByolo11n / yolo11s小数据集RTX 3060 / 40608-12GByolo11m中等数据集RTX 4070 及以上12GByolo11l / yolo11x大数据集2.2 第二步创建虚拟环境并安装 PyTorch强烈建议用 conda 或 venv 创建独立环境不要直接装在系统 Python 里。深度学习项目的依赖版本经常相互冲突独立环境可以让你在不同项目之间自由切换。创建环境的命令很简单conda create -n yolo26 python3.10 -y conda activate yolo26Python 版本选 3.10 比较稳妥太高或太低都可能碰到个别依赖包不支持的情况。接下来安装 PyTorch。安装命令去 PyTorch 官网的 get-started 页面用选择器选好环境配置就能拿到选 CPU 还是 CUDA 版本取决于你第一步里nvidia-smi的结果。CUDA 版本为 12.1 的话安装命令类似这样pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121装完后别急着下一步先验证 PyTorch 是否真的能用 GPUimport torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))如果第二行输出True说明 GPU 版本装好了。这里如果输出False最常见的原因是装了 CPU 版本或者 conda 自动装了不匹配的版本回上一步重新选安装源就行。2.3 第三步拉取源码并安装 Ultralytics 工程环境就绪后把官方仓库代码拉到本地git clone https://github.com/ultralytics/ultralytics.git cd ultralytics pip install -e .用-e参数安装的好处是源码目录和 Python 环境做了链接之后你修改仓库里的任何代码都会立即生效不需要重新安装。这对后续想做自定义改进特别重要。如果只是快速试用直接pip install ultralytics也可以但那样你就看不到源码了对“源码复现”这个目标来说不太够。装完后在项目根目录跑一句yolo predict modelyolo11n.pt sourcehttps://ultralytics.com/images/bus.jpg如果能正常下载权重并输出检测结果图那恭喜你环境这一关正式过了。顺手看一下工程目录结构ultralytics/下是核心代码cfg/下是各种配置文件examples/下有一些参考脚本不用全部看懂先混个脸熟。2.4 没有 NVIDIA GPU 的兜底方案如果你的电脑是纯 CPU 环境也别直接放弃。Ultralytics 工程支持 CPU 训练和推理只是速度会慢不少。训练一个几百张图片的小数据集CPU 可能要跑几小时GPU 十几分钟就完事。作为学习流程、验证代码是否跑通CPU 完全够用。安装时选择 CPU 版本的 PyTorch 即可pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu还有一个方案是使用云端的免费 GPU 算力比如 Google Colab 的免费 T4 实例。Colab 上几乎不需要配置环境新建 notebook 后直接pip install ultralytics就能开始训练。如果你只是先跑通流程Colab 是很香的选项。这一节最后再提醒一件事国内网络环境下git clone有时会很慢如果遇到超时可以手动去 GitHub 页面下载 zip 压缩包效果一样。PyTorch 的官方下载源如果速度不佳可以使用国内镜像站这里不展开讲搜索引擎上都能找到方法。3. 自定义数据集从采集图片到 YOLO 标签格式环境跑通之后真正的核心工作就开始了。目标检测项目的成败七成以上取决于数据数据量、数据质量、标注准确性。模型结构再先进喂进去的数据乱七八糟出来的结果一定乱七八糟。这一节我会把数据集制作的完整细节全部讲清楚。3.1 数据采集与划分别急着标完再分做自定义数据集第一步不是标数据而是先想清楚你要检测什么。比如你要做的是“生产线上的螺丝缺陷检测”那你要收集的就是有缺陷和没缺陷的螺丝图片如果做“鸟类目标检测”就要收集各种环境下、各种姿态的鸟类图片。数据量方面我的经验是每个类别至少收集 500 张图片作为起点理想状态是 1000 张以上。但注意“数量”不等于“有效数量”如果 500 张都是同一个角度、同一个光照条件下拍的那模型的泛化能力会非常差。数据多样性比绝对数量更重要。同一类目标要尽量涵盖不同拍摄角度、不同尺度、不同光照、不同遮挡情况。拿到图片后在标注之前先完成数据集划分。划分比例在 8:1:1 或 9:1 之间都可以即训练集 80%-90%验证集 10%测试集 10%。网上有些工具可以一键划分但我习惯用脚本按文件名随机分配然后把图片文件复制到对应的 train/val/test 目录下。划分之后再标注可以避免标注完成后才发现文件组织混乱。3.2 标注工具LabelImg 与 X-AnyLabeling 的选择标注工具的选择直接影响你的工作效率。我的建议是新手先用 LabelImg简单直接安装后新建框标注就行需要标注多边形、关键点等复杂格式时再换 X-AnyLabeling 或 Label Studio。用 LabelImg 时有两点设置要注意一是标注格式要选择 YOLO 格式这样保存出来的就是与图片同名的.txt文件不需要后期转换二是类别标签列表classes.txt要先编辑好确保所有标注员用的类别顺序一致。比如检测猫和狗两类classes.txt里写cat、dog那么cat的类别索引是 0dog是 1。这个顺序一旦定下来就别改改了这个顺序之前所有标注文件全部作废。标注流程不难但要保证质量需要耐心。我的习惯是对每张图先整体过一遍把全部目标框完再切换一遍检查遗漏。两遍检查能有效避免漏标——漏标在训练时会被当作背景处理这是很危险的负样本。标注完一个批次后随机抽样 10%-20% 的图片用可视化脚本把标注框画在原图上人工快速浏览一遍检查框的位置是否贴合目标。3.3 YOLO 标签格式的底层原理YOLO 标签格式用一句话概括就是每张图片对应一个.txt文件文件里每一行标注一个目标格式为class_id x_center y_center width height并且四个坐标值全部经过归一化。先看一个具体例子。有一张 1000×800 的图片图中有一只猫其目标框左上角坐标为 (200, 100)右下角坐标为 (400, 300)。那么宽高分别是 200 和 200。计算步骤如下x_center (200 400) / 2 / 1000 0.3 y_center (100 300) / 2 / 800 0.25 width (400 - 200) / 1000 0.2 height (300 - 100) / 800 0.25对应的标签文件内容就是0 0.3 0.25 0.2 0.25前面的 0 代表类别索引。归一化的好处是标签文件不依赖具体图像分辨率——你用 1000×800 的图训练也可以把标签复制到任何其他分辨率的图上使用因为坐标已经是相对值。实操中经常遇到的问题是这个标注工具可能导出的是 Pascal VOC 的 XML 格式或 COCO 的 JSON 格式这种情况不需要你手算坐标Ultralytics 工程有转换工具也推荐直接使用支持 YOLO 格式导出的标注工具。另一个高频问题来自标注边界某些目标的边界框挨着图像边缘归一化后可能会出现大于 1 或小于 0 的目标值训练时会报错。遇到这类情况稍微微调一下标注框位置即可。3.4 目录组织与 data.yaml 配置文件Ultralytics 工程对数据集目录有约定。组织好的目录结构大致如下datasets/ └── my_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml注意 labels 里每个子目录的文件名要和 images 里对应图片的文件名一致只是扩展名从.jpg等图片格式变成.txt。如果有无标签的图片也要逐一确认通常把完全没有任何目标的图片放到一个单独的 cleanup 目录里避免干扰。data.yaml是训练时告诉模型“数据在哪、有几类、类名是什么”的配置文件内容示例path: /path/to/datasets/my_dataset train: images/train val: images/val test: images/test nc: 2 names: [cat, dog]path是数据集根目录的绝对路径或相对于配置文件位置的路径train、val、test填的是相对path的子目录路径。nc是类别总数names是类别名称列表顺序必须和标注文件里的class_id一一对应。这个文件是所有后续命令的基础入口写错一个路径都会让训练直接失败值得反复确认三遍。4. 训练与评估真正能跑通且看得懂指标数据准备好就到了整个项目最核心的环节训练模型。这个阶段表面上只是一条命令的事但训出来的模型好坏差异巨大差别就在于参数怎么选、过程怎么监控、指标怎么解读。4.1 训练前必须做的一次完整检查很多人花了好几天标注数据急着想看到训练结果结果一跑就报错。其实训练前的检查只需要几分钟能省下大量调试时间。我会按顺序做三件事第一件事检查数据集目录结构。在终端里进入数据集根目录确认images/train和labels/train下的文件数量一致并且每个标签文件都有对应的图片文件。我写过一个简单的 Python 脚本遍历 labels 目录找出没有对应图片的 txt 文件基本能快速发现是不是有标注文件放错目录了。第二件事检查标签内容。用脚本读取几个标签文件打印内容观察坐标值是否都在 0 到 1 之间、类别索引是否小于nc值。如果出现class_id为 3 的文件而nc只写了 2训练时模型一定会报错提示 label class out of range。第三件事可视化抽查。用 OpenCV 或 matplotlib 把标签框画在原始图片上保存成一张新图肉眼检查标注框是否与目标对齐。这一步能发现标注工具有没有出现偏移、图片有没有旋转过、标签和图片是否对应错位等问题。千万不要跳过这一步训练完才发现标注错位返工成本会翻好几倍。4.2 训练命令与关键参数解读进入训练阶段命令长这样yolo detect train datadatasets/my_dataset/data.yaml modelyolo11n.pt epochs100 imgsz640 batch16 device0逐项理解这几个参数的意义。modelyolo11n.pt表示加载官方预训练权重使用迁移学习的方式训练你的自定义数据集这比从随机初始化训练收敛快得多。epochs100是训练轮数新手可以先设 50 轮跑通流程imgsz640是训练时输入的图像尺寸目标是 640×640如果目标在原图中很小可以适当提高到 832batch16是每批次图片数量显存不够就调小8、4、2 都行device0指定使用第一张 GPU。接下来是一组值得花精力理解的参数参数名默认值作用我的使用建议lr00.01初始学习率数据集小可降到 0.001optimizerauto优化器新手保持默认patience100早停等待轮数设为 20-30 可及时止损cacheFalse是否预加载图片到内存显存/内存大就开 True训练速度明显提升workers8数据加载线程数Windows 下建议调低到 2-4cos_lrFalse是否使用余弦学习率数据集较小时建议 Trueexist_okFalse是否覆盖同名输出目录用于多次实验时自动覆盖训练轮数方面“越多越好”是个误区。我见过太多人把epochs设成 1000跑到后面过拟合严重指标反而下降。更合理的做法是先跑 50 轮看曲线趋势如果 loss 还在持续下降就续跑如果验证集指标已经趋于平稳或下降就该停了。4.3 训练过程的监控训练启动后终端会滚动显示每个轮的 loss、精度、召回、mAP 等指标。很多新手盯着这些数字焦虑不知道什么算正常。记住一个原则只看趋势不纠结单轮数值。训练初期 loss 下降快这是正常的后期 loss 波动变缓也是正常的。真正需要警惕的是训练集 loss 持续下降但验证集 loss 不掉甚至上升这时候大概率是过拟合了。Ultralytics 支持在训练时自动记录日志训练结束后会在runs/detect/train/目录下生成一系列图表包括results.png训练曲线总览、confusion_matrix.png混淆矩阵、val_batch0_pred.jpg验证集预测结果可视化等。其中results.png是最值得研究的图它包含了 box_loss、cls_loss、dfl_loss 三条损失曲线和 precision、recall、mAP50、mAP50-95 四条指标曲线。分析时我看三件事损失是否收敛、mAP 曲线是否还在上升、训练集和验证集指标差距有多大。如果显存吃紧还可以把batch每步减半直到不报 OOM 为止。OOM 是新手最喜欢遇到的错误之一不丢人解决办法就是减 batch 或降低图片尺寸。注意 batch 改变后 GPU 的利用率会下降训练时间会变长但这是优先保证能跑起来的选择。4.4 评估指标怎么读才算真的懂训练完模型目录下会生成weights/best.pt和weights/last.pt前者是验证集上综合表现最好的权重推荐使用。评估指标中mAP0.5指的是 IoU 阈值为 0.5 时所有类别的平均精度均值mAP0.5:0.95则涵盖了从 0.5 到 0.95 多个 IoU 阈值前者对定位精度要求宽松后者更严格二者同时看才能判断模型到底是“检测到了目标但框不准”还是“框得又准又稳”。举例来说一个模型mAP0.50.95但mAP0.5:0.950.4说明检测能力不错但边界框的定位精度还有提升空间可以考虑提高imgsz或调整标注质量。反过来如果两个指标都低问题可能出在数据本身——检查一下类别是不是严重不平衡比如一个类有几千样本另一个只有几十个。类别不平衡会导致模型只学会预测多数类这时可以考虑对少样本类别做更多数据增强、复制采样或者干脆补充数据。我还建议跑完训练后用best.pt跑一遍测试集而不是只看验证集指标。测试集是训练时完全没见过的数据模型在测试集上的表现更能反映真实场景下的泛化能力。验证集在训练过程中被用来做早停判断严格来说已经“间接见过”了模型所以测试集的结果才最有说服力。5. 图片/视频/摄像头推理与性能调优模型训练完成工作只完成了一半。怎么把模型用起来做图片推理、视频推理甚至实时摄像头检测这是从“训练出模型”到“落地应用”的临门一脚。这也是很多教程忽略的部分。5.1 图片推理从单张到批量图片推理是最简单的场景命令行就能完成yolo detect predict modelruns/detect/train/weights/best.pt source./test_images device0source参数支持单张图片路径、图片文件夹路径、甚至远程 URL 地址。推理完成后结果图默认保存到runs/detect/predict/目录原图、预测框、类别名、置信度分数都会画在图上。如果你不想用命令行想在自己的 Python 项目里集成推理能力用到的是这样一套代码from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model.predict(test_images/cat001.jpg, conf0.25, saveTrue) for result in results: boxes result.boxes if boxes is not None: for box in boxes: cls_id int(box.cls[0]) score float(box.conf[0]) xyxy box.xyxy[0].tolist() print(f类别: {model.names[cls_id]}, 置信度: {score:.2f}, 框: {xyxy})conf参数控制置信度阈值默认 0.25意思是置信度低于 0.25 的预测框会被过滤。阈值设高了漏检变多但误检变少设低了则相反。应用场景不同这个值要实际去调不能一直用默认。5.2 视频推理与结果保存视频推理的命令和图片推理几乎一样只需要把source改成视频文件路径yolo detect predict modelbest.pt sourcetest_video.mp4 saveTruesaveTrue会生成一个带检测结果的视频文件。视频推理时要注意一个问题视频文件较大的情况下处理速度会比较慢因为模型要对每一帧做一次前向传播也就是每一帧都要做一次“看图找目标”的计算。如果你的视频是 1920×1080每一帧都被缩放到 640×640 再输入模型大量小目标细节可能会丢失。这时可以考虑把imgsz提高到 1280代价是推理速度会慢不少具体取舍取决于你对精度和速度的需求。Python 接口处理视频时还涉及视频编解码、逐帧读取、结果叠加画框、写回视频文件等操作。Ultralytics 直接封了一层命令行一键生成但如果要在自己的处理流程里逐帧拿结果可以用model.predict(video_path, streamTrue)生成迭代器逐帧处理推理结果这样能拿到每一帧的检测信息做进一步业务处理比如统计画面中出现目标的数量等。5.3 摄像头实时推理把source换成摄像头设备编号就能做实时检测yolo detect predict modelbest.pt source0 showTruesource0表示调用系统默认摄像头showTrue会在窗口里实时显示检测画面。这一节的操作感最强也是最能直观感受到模型能力的场景。我自己第一次把模型跑在电脑摄像头上对着自己挥手模型框出“person”那种成就感确实很奖励。不过实时推理对性能要求很高通常需要帧率到达 25-30 FPS 才能有流畅体验。如果你的 GPU 算力一般画面卡顿明显可以从三方面优化换更小的模型文件比如从 m 切换到 s 甚至 n 版本降低推理分辨率imgsz开启半精度推理halfTrue。画面流畅度很多时候比检测精度更能影响使用体验实时场景下优先保帧率是正常的工程取舍。5.4 推理性能进阶导出 ONNX 和 TensorRT当模型要在实际项目中部署时直接用 PyTorch 的.pt权重文件不是最理想的方案。PyTorch 推理自带一定开销如果部署在嵌入式平台、服务端或移动端通常要把模型导出成更高效的格式。Ultralytics 一条命令就能导出yolo export modelbest.pt formatonnx yolo export modelbest.pt formatengine device0第一条导出 ONNX 格式适合跨平台部署、通用性强第二条导出 TensorRT engine 格式是 NVIDIA GPU 上推理速度最快的方案但只在相同 GPU 型号上才能直接使用。实测下来在相同 GPU 上 TensorRT 相比 PyTorch 推理通常能带来 1.5 到 3 倍的提速这在高帧率视频流场景下非常关键。半精度推理是另一个见效极快的优化手段from ultralytics import YOLO model YOLO(best.pt) results model.predict(sourcetest_video.mp4, halfTrue, device0)halfTrue让模型以 FP16 精度进行推理兼容的 GPU 上速度几乎翻倍精度损失很小。注意一点老显卡可能不支持半精度跑之前可以先确认一下显卡算力。6. 踩坑记录与最后的建议6.1 我遇到且处理成本最高的几个坑入坑 YOLO 系列好几年环境、数据、训练、部署阶段的坑基本都踩了一遍。挑几个教训最深的记录下来希望能帮你避开。第一个坑是中文路径。项目目录、数据集路径、图片文件名里尽量不要出现中文和空格Windows 下尤其严重有时会出现读不到文件、保存乱码、训练中断这些奇怪的问题。解决方案是老老实实全用英文命名前期养成习惯后面少掉头发。第二个坑是标签和图片数量不匹配。有时从网上下载数据集发现 labels 目录里有几个 txt 没有对应图片或者某张图没有标签文件。训练时会报“No labels found in xxx”的错。排查方式是按 4.1 节说的写脚本遍历一遍谁也不要在检查上省时间。第三个坑是数据泄漏。有人做数据集划分时同一只目标既出现在训练集又出现在验证集或者存在相似图片跨集重复导致训练指标特别漂亮但一到真实场景就暴露真实水平。做划分时尽量保证同一个目标只在一个集合里出现测试集更要严格隔离。第四个坑是显存 OOMOut of Memory。训练时显存爆炸最简单的解法是减batch其次降低imgsz。但要注意batch改变会影响 BNBatch Normalization层的统计特性如果降到了 4 以下可以考虑把模型切换为更小的预训练版本或者关闭cache参数减少显存占用。第五个坑是训练集样本量过小。如果每个类别只有几十张图片训练出来必然会过拟合学到的特征只对训练集有效。我处理这类问题的方法是用现有数据先做两倍以上的数据增强——随机裁剪、反转、亮度调整、平移旋转。这些增强手段 Ultralytics 默认就开启了但增强后的数据并不能完全替代新数据的采集只能作为过渡手段。6.2 我的实战建议先用小任务完整跑通最后一节想分享一个我自己的方法论任何一次新环境、新模型、新数据的尝试我都会用一个极小的数据集先完整跑通整个流程。这个小数据集可以是官方自带的 coco8——它只有 4 张训练图、4 张验证图十几秒就能跑完一轮适合验证环境配置和命令是否正确。跑通之后再换成自己的数据。这件事听着简单却能避免最痛苦的一种局面环境、代码、数据同时有问题报错信息层层叠叠你根本不知道从哪查起。先把数据换成 coco8如果还报错那就是环境问题环境跑通了再换自己的数据如果出错那就是数据问题。用这种方式把变量逐个隔离问题定位效率极高。训练完成后我会把best.pt在开发机上跑一遍图片、视频、摄像头三个场景确认都能正常运行再做导出部署。这一步虽然不是必修课但能让你清楚了解这个模型在不同输入方式下的表现后面写接口、接业务时心里有底。如果你是想把 YOLO26 这套链路用于真实业务我的最后一条建议是不要把全部精力花在调整网络结构上先把自己的数据做到位。标注质量、类别平衡、场景覆盖这些数据层面的功课对最终效果的影响通常比你在网络结构上折腾几天还要大。先用最优的数据把这个版本的模型压榨到极限再考虑换更大的模型或者做架构改进这个顺序是效率最高的。