简介:这份资源是一套基于YOLO11与DeepSORT的目标跟踪算法实战项目,适合有一定目标检测基础、希望系统掌握检测与多目标跟踪链路搭建的开发者。项目将YOLO11作为检测前端,DeepSORT负责轨迹关联与身份匹配,覆盖从模型权重加载、预处理到视频推理输出的完整流程。资源共54个文件,以Python脚本(29个py)、编译生成的pyc文件(15个)、说明文档(3个md)、模型权重(2个pt)、测试视频(2个mp4)、配置文件(yaml)与授权文件(license)为主,压缩包大小约27.92MB。配套内容包含可运行的track.py主程序、utils工具模块、weights模型权重及deepsort配置目录,便于直接调试与二次开发。目前已有462人学习下载,适合课程设计、算法调研或工程实践参考。
1. 把检测和跟踪串起来:YOLO11+DeepSORT这个组合到底能干什么
做视频目标分析的人,十有八九都卡在同一个问题上:检测器只能给单帧画框,一旦物体动起来、被挡住、或者离开画面再回来,框就丢了。YOLO11+DeepSORT这个项目组合,解决的就是从“每帧框在哪”到“这个物体从哪来、到哪去、是谁”的跨越。YOLO11负责单帧检测,DeepSORT负责跨帧关联,给每个目标分配一个稳定ID,顺便输出轨迹。这个方案特别适合做车流统计、行人计数、安防监控、甚至体育赛事分析——凡是需要知道“谁在什么时间出现在什么位置”的场景,都能直接套用。新手拿到这套代码,先跑通再改自己的数据,是最快的落地路径;熟手则可以把注意力集中在检测与跟踪的接口改造和参数调优上。下面从选型逻辑开始,逐步拆到可以照着复现的程度。
2. 为什么选 YOLO11 做检测、DeepSORT 做关联:先想清楚任务分工
2.1 检测与跟踪的分工:逐帧画框不算跟踪
很多刚接触目标跟踪的人,第一反应是“我每帧用YOLO检测一次,然后把框连起来不就行了”。这在静止画面、目标少、无遮挡的情况下确实能跑,但只要目标一交叉、一遮挡,ID立刻全乱。因为检测器没有任何“记忆”,它不知道这一帧的框跟上一帧的框是不是同一个物体。跟踪器存在的意义,就是给检测结果做时间上的关联:用运动信息预测目标下一帧的位置,用外观特征确认“这是同一张脸/同一辆车”。YOLO11在单帧上的检测精度再高,也替代不了这个时序逻辑。反过来,DeepSORT没有检测能力,它只能接收检测框。所以两者是天然的上下游关系:检测器输出每帧的边界框、类别、置信度;跟踪器拿到这些框,结合历史轨迹,输出带ID的轨迹集合。这个分工决定了整个项目的代码结构,也决定了调试时该分别看哪一端的日志。
2.2 YOLO11 相比 YOLOv8/YOLOv5 在跟踪场景里的升级点
YOLO11 是 ultralytics 在 YOLOv8 之后推出的检测模型,网络结构上最大的变化是主干里引入了 C3k2 模块——你可以把它理解为 C3 和 C2f 的融合变体,用更少的参数量保留多尺度特征表达能力。颈部继续沿用 PAN-FPN 结构,但把上采样和拼接后的卷积做了细化。对跟踪场景而言,YOLO11 的价值不在于那 1%~2% 的 mAP 提升,而是小目标检测更稳了。视频中远处的行人、车辆往往只占几十个像素,YOLO11 的 anchor-free 检测头和新的特征融合策略,对这一类目标的召回率有实打实的提升。召回率上去了,DeepSORT 的输入框就更连续,不会因为目标时有时无导致 ID 频繁切换。
另一个实际优势是部署性。YOLO11 有 n/s/m/l/x 五个规格,其中 YOLO11n 在 CPU 上也能跑到接近实时的速度,对于不打算上 GPU 的监控项目非常友好。而且 ultralytics 官方包同时支持检测、分割、姿态,跟 DeepSORT 对接时只需要取results[0].boxes,接口统一,少踩很多版本坑。
2.3 DeepSORT 的关联逻辑:级联匹配、马氏距离、外观特征各起什么作用
DeepSORT 的核心理念是“先易后难”的关联策略。每次处理一帧时,它先对每个已有轨迹用卡尔曼滤波预测下一时刻的位置,得到预测框;然后计算预测框与当前检测框之间的两个距离:一个是 IoU 距离(或者叫运动距离),另一个是外观特征之间的余弦距离。级联匹配是 DeepSORT 最精华的一步——它按照轨迹的年龄(连续未匹配帧数)从新到旧排序,优先匹配刚出现不久的新轨迹,后匹配长期未被确认的旧轨迹。这样做的原因很现实:新轨迹的不确定度低,预测位置更可信;旧轨迹可能已经丢失很久,预测框漂移严重,如果跟它们先匹配反而会引入噪声。
马氏距离负责把“位置和速度的相似度”拉进同一个量纲,它会考虑卡尔曼滤波的协方差矩阵,所以能自动对不同方向上的不确定性做加权。外观特征则是用一个独立的 ReID 模型提取目标的外观向量(通常是 128 维或 512 维),用余弦距离判断“长得像不像”。两者用加权公式合并成一个总距离:distance = lambda * 马氏距离 + (1 - lambda) * 余弦距离,其中lambda默认取 0,意思是几乎完全信任外观特征。这个细节很反直觉,但在行人跟踪上确实比纯运动模型更稳。
2.4 什么场景该选 YOLO11+DeepSORT,什么场景该换 BoT-SORT / ByteTrack
YOLO11+DeepSORT 最舒服的场景是:目标类别相对固定(行人、车辆)、目标之间外观差异明显、遮挡不是特别频繁、帧率能保证在 10 FPS 以上。典型如十字路口车流统计、商场客流分析、园区安防。因为 DeepSORT 的外观特征能扛住短期遮挡,只要目标重新出现时露出的外观足够分辨,ID 就能找回来。
但如果你的视频是拥挤人群、目标密集且互相遮挡严重,DeepSORT 的级联匹配就容易翻车。这时候常见做法是换 ByteTrack——它不做外观特征,纯靠运动+检测置信度做关联,反而在密集场景更稳,而且极快。或者上 BoT-SORT,它在 ByteTrack 基础上融合了相机运动补偿和更鲁棒的关联策略。还有一类场景是无人机的俯视视角,目标很小、移动快,DeepSORT 的卡尔曼滤波可能跟不上,建议先用 YOLO11 把小目标召回率拉起来,再换 SORT 系算法。也就是说,YOLO11+DeepSORT 不是万能组合,但它是第一个值得你跑通并理解关联流程的基线方案。跑通之后你再往别的跟踪器迁移,会发现接口几乎都能复用,因为大家都在谈 detection、track、match 这三件事。
3. 环境配置与项目结构:从零跑通 YOLO11+DeepSORT 的流程教程
3.1 创建虚拟环境并安装 YOLO11 依赖
拿到项目源码后,第一步不是打开 IDE 读代码,而是先复现出能跑的环境。YOLO11 的依赖比 DeepSORT 干净得多,核心就是一个 ultralytics 包。建议用 Python 3.9 或 3.10,避免 3.12 上一些旧版编译包缺失的兼容问题。
# 创建独立虚拟环境,避免污染系统 Python conda create -n yolo11_track python=3.10 -y conda activate yolo11_track # 安装 PyTorch,先装 CPU 版跑通流程,再换 CUDA 版 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 YOLO11 依赖(ultralytics 会自行匹配配套版本) pip install ultralytics pip install opencv-python这里有个经验:不要一开始就pip install -r requirements.txt,有些项目里锁定的版本过旧或过新,容易跟当前 Python 不匹配。先装好 ultralytics,再用import ultralytics; ultralytics.checks()验证版本,再回头看项目自带 requirements,缺什么补什么。CUDA 版本建议跟随你的显卡驱动,用nvidia-smi看支持的 CUDA 版本,然后去 PyTorch 官网选对应安装命令。
3.2 DeepSORT 依赖:py-torchreid、scipy、lap
DeepSORT 本身不是独立 pip 包,项目里通常直接把deep_sort_pytorch源码目录拿过来用。它的依赖中有两个容易踩坑的库:scipy用于线性分配(linear_sum_assignment),lap用于提速的 Jonker-Volgenant 算法。lap在 Windows 上没有官方 wheel,经常编译失败,常见做法是换成lapx或者直接用scipy.optimize.linear_sum_assignment兜底。
# DeepSORT 核心依赖 pip install scipy>=1.6 pip install lap # 如果失败,执行下面两行兜底 pip install lapx另外,外观特征提取需要 ReID 模型,项目里常见的做法是使用torchreid包训练好的 ResNet50 特征提取器。这个包比较老,安装后先做一次冒烟测试:
python -c "import torchreid; print(torchreid.__version__)"如果报错No module named 'torchreid',检查项目是否自带deep_sort_pytorch/deep_sort/deep/下的模型定义,很多项目已经把这个子模块内嵌了,不需要额外装 torchreid。
3.3 下载权重与测试视频,跑通第一个推理命令
大多数 YOLO11+DeepSORT 项目会自带一个yolov11n.pt或要求你从 ultralytics 下载。测试视频建议先用项目自带的示例视频,如果没带,随便找一个行人过马路的公开视频即可。跑通的最小命令通常是这样的:
python main.py --source test.mp4 --yolo-weights yolov11n.pt --reid-weights weights/osnet_x1_0.pth --conf 0.4 --save-video具体参数名因项目而异,但核心逻辑一致:给一个视频源,加载检测权重和 ReID 权重,输出标注后的视频。如果项目提供的是track.py,那输入参数多半是--source和--yolo-model,先用python track.py --help看一遍再跑。跑通后你会看到终端每隔几帧打印跟踪结果,包括目标 ID、类别、置信度、坐标。这一步的意义是验证整个链路——摄像头读取、检测、特征提取、关联、可视化——都通着。
3.4 项目文件结构说明:detector、tracker、utils 各司其职
YOLO11+DeepSORT 的源码包结构大同小异,理解文件职责比记住路径重要。典型结构如下:
| 目录/文件 | 职责 | 关键模块 |
|---|---|---|
detector/ | 封装 YOLO11 检测器 | YOLODetector 类,返回 boxes、scores、classes |
deep_sort/ | DeepSORT 跟踪器 | tracker.py、nn_matching.py、linear_assignment.py |
deep_sort/deep/ | ReID 特征提取 | feature_extractor.py,加载模型输出 512 维向量 |
tracker/或main.py | 主流程 | 调用检测器,转换格式,更新 tracker,可视化 |
utils/ | 画框、轨迹、统计工具 | draw_bboxes.py、io_utils.py |
weights/ | 存放模型权重 | yolov11n.pt、osnet_x1_0.pth |
调试时最常改动的是main.py里的检测结果转 tracking 输入的代码,以及deep_sort/deep_sort.py里的 tracker 参数初始化。建议第一次跑通之前不要改任何代码,只改路径。跑通后再逐行读主流程,你会发现所谓的“接入”其实只有二十几行核心代码。
4. 把 YOLO11 接到 DeepSORT 上:核心代码改造与 4 个必调参数
4.1 将 YOLO11 检测结果转为 DeepSORT 的 detections 输入
DeepSORT 的Detection数据结构需要四样东西:左上角坐标、宽高、置信度、外观特征。YOLO11 输出的是xyxy(左上右下坐标),所以要先换算成xywh,再构造Detection对象。下面是完整的最小转换代码:
import numpy as np from deep_sort.deep_sort.detection import Detection from deep_sort.deep_sort.tracker import Tracker from deep_sort.deep_sort import nn_matching from deep_sort.deep_sort.deep.reid_model import ReIDModel # 初始化 ReID 模型 reid_model = ReIDModel("weights/osnet_x1_0.pth", device="cuda") # 初始化跟踪器 max_cos_dist = 0.4 metric = nn_matching.NearestNeighborDistanceMetric("cosine", max_cos_dist) tracker = Tracker(metric, max_iou_distance=0.7, max_age=70, n_init=5) def yolo11_to_deepsort_detections(boxes_xyxy, scores, classes): """将 YOLO11 检测结果转为 DeepSORT 的 Detection 列表""" detections = [] for box, score, cls in zip(boxes_xyxy, scores, classes): x1, y1, x2, y2 = box w, h = x2 - x1, y2 - y1 # YOLO11 的 xyxy 转 DeepSORT 需要的 xywh bbox_xywh = [x1, y1, w, h] # 提取外观特征,维度 512 crop = frame[int(y1):int(y2), int(x1):int(x2)] # 对太小的裁剪块保护 if crop.size == 0 or w < 2 or h < 2: continue feature = reid_model.extract(crop) detections.append(Detection(bbox_xywh, score, feature, cls)) return detections # 每帧调用示例 boxes_xyxy, scores, classes = yol11_detector.detect(frame) detections = yolo11_to_deepsort_detections(boxes_xyxy, scores, classes) tracker.predict() # 卡尔曼预测 tracker.update(detections) # 关联更新 for track in tracker.tracks: if track.is_confirmed() and track.time_since_update <= 1: x1, y1, w, h = track.to_tlwh() track_id = track.track_id这段代码里的ReIDModel和yol11_detector是项目里已有的封装,重点理解Detection的四个参数顺序:(bbox_xywh, score, feature, cls)。注意cls不是 DeepSORT 原生参数,而是很多项目为了后续按类别过滤自己加的,如果项目没改过,这里要去掉。
4.2 外观特征提取:ReID 模型的接入与维度对齐
DeepSORT 对特征维度没有硬性要求,但它内部做余弦距离时需要特征向量长度一致。常见项目用的 ResNet50 输出 512 维,OSNet 输出 512 维,MobileNet 输出 128 维。如果接入时报维度错误,多半是两个模块之间的feature_dim没对齐。
# nn_matching 里初始化距离度量时指定维度 nn_matching.NearestNeighborDistanceMetric("cosine", max_cos_dist, max_feature_dim=512) # 特征提取后必须 L2 归一化 feature = feature / np.linalg.norm(feature)归一化这步很容易忽略。DeepSORT 的余弦距离计算会默认输入已经归一化,如果没做,距离范围就不是 [0,2],max_cos_dist的阈值就会失真。另外,ReID 模型的输入尺寸是 64x128(宽高),YOLO11 的检测框裁剪出来是任意尺寸,所以裁剪后要先resize到 64x128,还要做一次 padding 保持比例,否则特征质量会崩。
4.3 参数调优:max_dist、max_iou_distance、max_age、n_init
这四个参数直接决定跟踪的“性格”。max_dist(即 max_cos_dist)是外观匹配阈值,越大越容易匹配上,但代价是误匹配多;max_iou_distance是运动匹配的 IoU 阈值,默认 0.7 表示 IoU 小于 0.3 就算不匹配;max_age是轨迹失联后保留多少帧,太大导致 ID 切换变慢、计算量增加,太小导致短暂遮挡后轨迹直接消失;n_init是轨迹要连续匹配多少帧才确认,默认 5,值越大误报越少但确认越慢。
我一般在车辆跟踪项目上这样设:max_dist=0.3,因为车辆颜色形状差异大,阈值严一点不容易串 ID;行人项目设0.5,因为行人外观相似度高,太严会频繁新建轨迹。max_iou_distance固定 0.7,这个是 DeepSORT 作者的默认值,经验上不太需要改。max_age根据遮挡时长来定,行人最多被挡 3~5 秒,按 25 FPS 算就是 75~125,取 70~100 比较稳;车辆在十字路口被大车遮挡可能长达 10 秒,这时要设到 200 以上,否则过路口就换 ID。
tracker = Tracker( metric, max_iou_distance=0.7, max_age=100, n_init=3 )n_init我这里改成 3,因为测试视频里目标在画面边缘一闪而过时,连续出现 3 帧就应该认成轨迹,5 帧太保守了。如果你的场景误检多,反而要加大到 8~10,避免把误检也当成轨迹确认。
4.4 跟踪 ID 跳变与丢失:如何用置信度阈值过滤
跟踪效果差,一半原因不在跟踪器,而在检测器输出的置信度阈值。YOLO11 默认conf=0.25,在低光照、运动模糊视频里会产生大量低置信度框。这些框进 DeepSORT 后,会跟真实目标抢匹配名额,导致 ID 跳变。常见做法是调高到 0.4~0.5,宁可漏检少数目标,也不要让噪声进入关联流程。
results = self.model(frame, conf=0.45, iou=0.5, classes=[0, 2]) # 只留人/车另一个技巧是按类别设置动态阈值:行人容易被遮挡导致置信度波动,阈值可以低一点;车辆在远处很小,阈值要更高才能过滤树影误检。你可以在yolo11_to_deepsort_detections里按cls做分级过滤,而不是统一阈值。还有一点,YOLO11 的iou参数默认 0.7,NMS 时框之间重叠越多越容易留下靠前的框,这会导致密集人群里的检测框抖动,建议调成 0.5,让相邻目标各归各框。
5. 避坑:YOLO11+DeepSORT 实战中的 5 个高频翻车现场
5.1 现象:装了 ultralytics 后 import deep_sort 仍然报 ModuleNotFoundError
这是几乎每个人都遇到过的坑。原因是项目源码里的deep_sort_pytorch目录没有加入 Python 路径,或者你把代码克隆到中文路径下导致某些老库的导入逻辑异常。还有一个隐蔽原因:你 pip 安装了另一个同名deep-sort包,跟项目自带的源码目录重名,导入时去了 site-packages。
解决办法分三步走:先确认项目根目录有deep_sort文件夹,并在主脚本开头显式把根目录加入sys.path:
import sys, os sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))再查一下有没有安装多余的同名包:pip list | grep deep,有就pip uninstall。最后,把整个项目移到纯英文路径,比如D:/yolo11_deepsort/,不要放桌面或带中文的用户目录下。这一步能顺带解决 ReID 模型权重文件读取失败的问题。
5.2 现象:GPU 显存占用高但 FPS 只有个位数
新手最容易犯的错是抱着 YOLO11 检测器每帧做全图推理,还开着最大的yolov11x权重,再加上 ReID 特征提取又开一遍前向,两个模型在 GPU 上来回切换,时间全花在调度上了。真正的瓶颈通常在特征提取:DeepSORT 默认每个检测框都要过一遍 ReID 网络,行人多时一次可能几十个框,每个都要前向,比检测还慢。
解决方法是把特征提取从 GPU 挪到 CPU 上跑,或者把批量剪裁框攒起来只做一次前向。实践里我常用的是固定最大特征提取数:当检测框数量超过 20 个时,只取置信度最高的 20 个来提取特征,其余直接丢弃低置信度框。另一个更有效的手段是换更轻的 ReID 模型,比如osnet_x0_25或 MobileNetV2,精度下降不到 2%,FPS 能翻倍。
# 用半精度推理,显存减半,速度提升显著 python main.py --fp16 --yolo-weights yolov11n.pt如果项目原本不支持--fp16,可以在检测代码里加model.half(),并把输入图像转成frame = frame.half()。注意 CPU 上不能开半精度,只有 CUDA 支持。
5.3 现象:跟踪 ID 频繁切换(同一个目标,框旁边的编号一直在变)
ID 切换的原因要分两类排查。第一类是检测框本身不稳定:目标在移动时 YOLO11 的框会抖,导致同一目标的中心点位移超过卡尔曼预测范围,匹配失败。这时可以给检测框加时间平滑,用指数移动平均来稳定框的位置:
# 对每个 track 的 bbox 做 EMA 平滑 alpha = 0.7 track.smooth_bbox = alpha * track.smooth_bbox + (1 - alpha) * new_bbox第二类是外观特征太弱。光照变化、目标转身、分辨率低都会让 ReID 特征漂移。常见办法是给每个 track 保存最近 100 帧的特征集合,匹配时用最小余弦距离,而不是只比最后一帧的特征。DeepSORT 源码里的NearestNeighborDistanceMetric默认就支持这个,你只需要调大budget参数:
metric = nn_matching.NearestNeighborDistanceMetric( "cosine", max_cos_dist, budget=100 )budget是每个轨迹保留的特征数量上限,默认是 100。如果你发现 ID 切换问题严重,可以改到 150,但要注意内存占用。
5.4 现象:密集场景下目标框乱跳,互相抢 ID
DeepSORT 在人群密集时的最大软肋是 IoU 关联会在目标紧挨着时把框错配给旁边的人。现象就是两个目标走近后,出来时编号互换。这不是参数能根治的,而是算法的固有局限。能做的缓解手段有三个:第一个是把max_iou_distance从 0.7 调小到 0.5,迫使关联更严格;第二个是开启 DeepSORT 的“马氏距离门控”,让预测位置离谱的候选直接不被匹配;第三个是降低 ReID 特征距离阈值,只允许“非常像”的目标互相匹配。
如果这都不行,就该考虑换跟踪器了。上面提过 ByteTrack 在密集场景更强,尤其是它对低置信度检测框采用了 second association,能保留更多可能的匹配。YOLO11+ByteTrack 的代码结构与 DeepSORT 几乎一样,只是把匹配部分换成了 BYTETracker。
5.5 现象:YOLO11 权重无法加载,报错提示模型结构不匹配
这个坑大多发生在你下了旧版 YOLOv8 的.pt文件,然后改文件名为yolov11n.pt试图骗过代码。ultralytics 在加载时会检查模型 YAML 配置,版本不一致就直接报错。另外,权重文件的路径里如果有特殊字符(比如#或中文),也会被 torch 的torch.load拒绝。
解决方法是直接从 ultralytics 官方模型仓库下载对应版本:
from ultralytics import YOLO model = YOLO("yolov11n.pt") # 会自动下载官方权重 model = YOLO("yolov11s.pt")下载完成后用model.predict(source="bus.jpg")做一次单图验证。能跑完说明权重没问题。如果你的项目是改过的 YOLO11 结构(比如加了小目标增强模块),那必须使用项目提供配套的权重文件,不能用官方原版替代。这属于特殊定制场景,调权重时一定要核对项目 README 里写的自定义结构说明。
6. 用 MOTA、IDF1 和轨迹可视化来验证跟踪效果:我从菜鸟到老手的实操习惯
跟踪做完了,不能只在输出视频上“看着差不多”。要说服自己或别人这套 YOLO11+DeepSORT 方案可靠,至少要从三个维度验证:身份保持能力、检测召回率、轨迹平滑度。先看身份保持,对应的是 MOTA 和 IDF1 两个指标。MOTA 综合了漏检、误检和 ID 切换,但它对 ID 切换的惩罚没有单独列出;IDF1 则是只看 ID 匹配正确率,能更直观反映“目标是不是老换号”。计算这两个指标需要真实标注框和预测跟踪轨迹做匹配,公开数据集标准做法是用一个叫py-motmetrics的库:
import motmetrics as mm acc = mm.MOTAccumulator(auto_id=True) # 每一帧:gt_ids 为真实目标ID,pred_ids 为跟踪ID,ious 为两两IoU矩阵 for frame_idx in range(total_frames): acc.update( gt_ids[frame_idx], pred_ids[frame_idx], ious[frame_idx] ) mh = mm.metrics.create() summary = mh.compute(acc, metrics=["num_switches", "idf1", "mota", "motp"])你的真实标注如果没有,就先人工标几十帧。我一般在项目里留一个validation/video1_gt.txt,格式是frame_id, track_id, x, y, w, h。这是做跟踪绕不开的活,别嫌烦。
其次是轨迹可视化。OpenCV 画轨迹是个简单但极有用的调试工具:给每个 ID 维护一个 deque 存最近 30 帧中心点,然后cv2.polylines连接,这样能直接看到轨迹是否平滑、是否在遮挡时跳飞。我习惯把轨迹的透明度和颜色与 ID 绑定,同一个 ID 颜色不变,轨迹线逐渐变淡,看起来更直观。
import cv2, collections trajectory = collections.defaultdict(lambda: collections.deque(maxlen=30)) for track in tracker.tracks: if not track.is_confirmed(): continue tid = track.track_id x1, y1, w, h = track.to_tlwh() cx, cy = int(x1 + w/2), int(y1 + h/2) trajectory[tid].append((cx, cy)) # 画最近轨迹线 for i in range(1, len(trajectory[tid])): alpha = i / len(trajectory[tid]) color = (int(255*alpha), 0, 255-int(255*alpha)) cv2.line(frame, trajectory[tid][i-1], trajectory[tid][i], color, 2)最后说一个我踩过的大坑:验证时用了训练视频的同一段。跟踪模型很容易在“见过的画面”上表现虚高,一旦换新场景,ID 切换率立刻翻倍。正确的习惯是留出独立的一周采集数据作为验证集,跑完指标后,把max_dist、max_age再微调一轮,直到MOTA和IDF1都稳定。我自己做行人跟踪项目时,第一版 IDF1 只有 42%,调完budget=150和conf=0.45后涨到 63%。这种提升不是靠算法创新,而是靠把上面这几个参数和验证流程老老实实走一遍。希望这套流程对你也有同样的帮助。
本文还有配套的精品资源,点击获取