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

资讯详情

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

目标检测与定位技术全景:从YOLO到三维检测的实战指南

目标检测与定位技术全景:从YOLO到三维检测的实战指南 目标检测和定位这两个词在计算机视觉圈里基本是绑定出现的。你问十个做视觉的工程师最近在搞什么八个会跟你说在调检测模型。但很多人把检测和定位混为一谈觉得模型画个框就算完事等到真去落地的时候才发现框里的目标到底在真实世界的哪个位置、距离多远、尺寸多大这些问题一个比一个棘手。这篇概述就是想把这些事情掰开揉碎从经典的检测算法脉络讲到坐标回归、三维定位、小目标场景再到工程化部署和数据集构建帮想入门或者正在被项目折磨的同学建立一张完整的技术地图。我自己在这个领域踩过的坑不算少从最早用滑动窗口加HOG特征做行人检测到后来切到YOLO系列再到现在做红外小目标和三维检测每一轮技术迭代都带来了新的定位精度要求。这篇文章没有太多虚的都是实际项目里能直接用的思路和结论。1. 核心概念检测和定位到底在解决什么问题1.1 检测是什么定位又是什么先说定义。目标检测的任务是回答两个问题图像里有什么目标目标在哪里。前者是分类问题后者就是定位问题。定位的粗粒度形式是画一个轴对齐的矩形框也就是bounding box用四个坐标值表示细粒度形式可以是像素级的分割掩码也可以是目标的中心点加宽高甚至是一组关键点坐标。很多初学者容易把定位等同于画框这个理解在二维图像检测里问题不大但放到实际项目里就会出偏差。比如你做一个工厂安全帽检测系统模型输出一个框说这里有个人戴了安全帽但如果你要联动闸机或者机械臂做自动拦截单靠图像的二维框是不够的。你需要知道这个人在相机坐标系下的位置离闸机多远这就涉及从像素坐标到物理坐标的映射问题。所以真正的定位至少包含三个层次图像内的位置用像素坐标表示的边界框或目标点相机坐标系下的位置结合相机内参和外参将像素坐标转换为相对相机的空间坐标世界坐标系下的位置进一步结合姿态估计和多视角信息得到目标在真实场景中的全局位置这篇文章讨论的核心主要在第一个层次同时会延伸到第二个层次。因为如果你连图像内的定位都做不精准后面的空间定位都是空中楼阁。1.2 从滑动窗口到端到端回归的两条技术路线早期目标检测的主流思路是滑动窗口加手工特征。你在图像上密集地滑过一个固定尺寸的窗口每个窗口提取HOG、SIFT这类特征然后丢给SVM分类器判断窗口里有没有目标。这种方法的问题是窗口尺寸和长宽比很难覆盖所有目标形态而且计算量巨大。一个1024x768的图光滑动窗口就要跑上万次分类完全没法实时。后来深度学习方法统一了特征提取和分类回归这两个步骤。但内部依然分化成两条路线anchor-based和anchor-free。anchor-based方法比如Faster R-CNN、YOLOv2/YOLOv3预先在图像上铺设大量不同尺寸和比例的候选框网络学习的是对这些候选框的修正值。anchor-free方法比如CenterNet、FCOS则直接预测目标的中心点或者关键点不再依赖预定义框。从我的实际体验看anchor-free方法在训练时不用调anchor参数省心很多但在小目标场景下纯中心点回归容易丢失空间信息需要额外设计。这个细节在后面难例场景部分会展开。2. 主流方法全景两阶段、单阶段与Transformer三足鼎立2.1 两阶段检测器R-CNN系列为什么慢而准两阶段检测器的代表是R-CNN家族。第一个阶段生成候选区域第二个阶段对每个候选区域做分类和框回归。R-CNN最早用选择性搜索生成约2000个候选区域然后对每个区域缩放后分别送进CNN提取特征再交给SVM分类和线性回归修正框。到了Fast R-CNN作者把特征提取改成全图只做一次卷积候选区域在特征图上做ROI Pooling速度提升了近一个数量级。Faster R-CNN更进一步用Region Proposal NetworkRPN替代选择性搜索把候选区域生成也变成了可学习的模块真正实现了端到端训练。这套粗选-精修的流程决定了它的特点精度高因为第二阶段对每个候选框都做了精细的二次回归速度慢因为即使有了RPN还是要对上千个候选框逐一处理。在离线场景或者对单张图处理时间不敏感的工程里Faster R-CNN依然是精度上限的优选。我见过不少遥感图像检测项目最后都是Faster R-CNN系列的变体在扛大梁。2.2 单阶段检测器YOLO系列为什么能统治工程落地YOLO把检测重新定义为一个回归问题。输入图像被划分成SxS的网格每个网格负责预测固定数量的框、置信度和类别概率。这个设计的精髓在于把分类和定位合并到一次前向推理里速度直接拉满。YOLO演进到今天已经形成庞大的家族。YOLOv3引入了多尺度预测在三个不同尺寸的特征图上分别做检测小目标召回率明显提升这是它至今仍有大量项目在用的原因。YOLOv5、YOLOv8在工程易用性上做到了极致提供了从训练到导出的完整工具链尤其是YOLOv8的Anchor-Free设计和C2f模块在精度和速度之间找到了很好的平衡。单阶段检测器为什么能快而不太差因为它砍掉了候选区域生成这个耗时的中间步骤让网络直接在密集的采样位置上做预测。代价是正负样本极度不平衡——绝大部分网格里没有目标。YOLO的解决方案是引入objectness置信度先让网络学会区分有没有目标再做更细的分类。这个损失设计的细节是复现YOLO时最容易忽略却最关键的部分。工程上我的建议是如果项目对实时性有硬性要求无人机巡检、视频监控、机器人导航直接用YOLO系列的较新版本别在旧模型上浪费时间。YOLOv8配合TensorRT部署在边缘设备上跑30帧以上是常规操作。2.3 DETR类方法Transformer给检测带来的变化DETR是2020年提出的工作它把Transformer的序列到序列框架引入目标检测用一组可学习的object queries替代了anchor和NMS。整个模型不再需要手工设计的候选区域、锚框和后处理结构上简洁了很多。DETR的核心思路是把检测建模为集合预测问题。模型输出固定数量比如100个的预测框通过匈牙利算法和真实框做双向匹配计算损失。匹配的过程就是定位的过程每个query最终学会去关注图像中的某个区域并输出对应的框。DETR的问题也很明显训练收敛慢小目标检测效果差。后续Deformable DETR通过可变形注意力机制把注意力集中在目标附近的稀疏采样点上同时在多尺度特征图上操作解决了收敛速度和小目标问题。RT-DETR则是百度提出的实时版本在速度和精度上都和YOLOv8有得一拼。现在Transformer类检测器的定位精度和收敛速度已经不是短板了。如果你的任务是多类别、复杂场景可以试试DETR系列如果追求极致的部署效率和社区生态YOLO仍然是最稳的选择。3. 定位精度的核心细节从边界框到精确坐标3.1 边界框回归的四个参数检测模型的定位头输出通常是四个值中心点坐标tx, ty和宽高tw, th。在训练时这四个值不是直接回归绝对像素值而是回归相对anchor或网格的偏移量再通过解码得到最终的坐标。以YOLOv3为例每个网格预测t_x、t_y、t_w、t_h四个值经过sigmoid和指数变换后映射到特征图坐标。这里有个容易踩的坑t_x和t_y经过sigmoid是为了保证中心点落在当前网格内但如果目标中心正好在网格边界sigmoid的输出会接近0或1梯度很小导致这个位置的回归变得困难。实际训练中你会发现框总是偏目标中心一点点就是这个原因。更精细的定位往往需要回归不只是四个值。比如旋转目标检测会额外预测角度参数使用带角度的旋转框这在遥感图像和文档图像场景中非常常见。还有多边形检测直接回归四边形或更多边形的顶点坐标用于文本检测的DBNet就是这样设计的。定位头的设计决定了精度的上限。我的经验是如果项目对IOU要求特别高比如要精确到框内目标面积占比在90%以上可以考虑在回归头里引入IoU-aware分支或者用GIoU、CIoU来替代普通的Smooth L1损失。这个改动实现起来不难但对精度的提升往往比换更大的骨干网络还明显。3.2 关键点检测与中心点定位除了边界框回归另一类定位方式是预测目标的关键点或中心点。CenterNet把目标检测建模为关键点检测问题先用全卷积网络输出一个热力图热力图的峰值位置就是目标的中心然后从峰值位置回归出目标的宽高和类别。这种方法的优点在于本质上是逐像素预测天然不依赖anchor也没有NMS后处理推理时只需要找到热力图的局部极大值。在目标存在遮挡、相互靠近的场景下中心点定位比anchor回归更加稳定因为即使两个目标的框有大量重叠它们的中心点仍然可以清晰区分。关键点定位的典型应用还有人体姿态估计。这时候网络输出的不是中心点而是一组人体关节点的热力图每个关节点的位置由热力图峰值确定。目标检测和关键点检测经常被联合训练比如一个人体检测器同时输出检测框和17个关键点形成一个完整的检测定位解决方案。不过关键点方法对热力图的空间分辨率很敏感。原始图像下采样倍数越大峰值位置的量化误差就越大。实际工程中通常会在最后几个feature map使用较小的stride或者用deconv上采样恢复分辨率再做关键点预测。3.3 定位质量怎么评价IoU和它的变体们评价一个检测框定位得好不好最常用的指标是IoU也就是预测框和真实框的交并比。IoU 0.5时算正确检测这是Pascal VOC的惯例COCO数据集要求更严格会分别计算IoU从0.5到0.95、步长0.05的一系列阈值下的AP然后取平均记作AP[.5:.95]。实际使用中普通IoU有个问题当预测框和真实框没有重叠时IoU为0梯度也为0对回归网络来说就失去学习信号了。所以出现了GIoU它在IoU基础上加了一个惩罚项即使两个框不相交也能提供梯度。DIoU进一步考虑了中心点距离CIoU则在DIoU基础上加入了宽高比的惩罚。这些损失函数在YOLOv5之后的版本里基本都是默认配置我强烈建议不要手动改回Smooth L1。我自己做过对比实验在同样的数据上CIoU比普通IoU损失在AP[.5:.95]上能提升1到2个点这个收益等于额外加了大量训练数据完全白捡的。4. 定位再深入一层三维目标检测和多模态融合4.1 从二维像素到三维空间应用场景在哪二维检测给出的是图像坐标但像自动驾驶、机器人抓取、AR导航这类场景你最终需要的是目标在三维空间中的位置和姿态。三维目标检测的任务就是输出目标的3D边界框包括中心坐标x, y, z、长宽高l, w, h和朝向角yaw一共七个自由度。基于纯图像的三维检测难度不小因为单目图像天然缺失深度信息。一个简单但有效的思路是几何约束已知目标在图像中的二维框和目标的物理尺寸通过相机投影模型反推距离。比如知道一辆车大约4.5米长在图像里占了200像素宽结合相机焦距就能反算出目标距离相机大约多少米。这种方法在特定场景下精度尚可但误差会随距离增大而变大。更靠谱的方案是融合多模态数据。图像提供丰富的纹理和语义信息激光雷达点云提供精确的几何结构两者互补。多模态检测通常先在图像上检测目标再把2D检测框投影到3D点云中裁剪出对应区域进行精细的3D估计。这个流程在KITTI和nuScenes等数据集上取得了很好的效果。4.2 基于鸟瞰图的三维目标检测思路另一个很实用的三维检测方法是将特征投影到鸟瞰图BEV视角在BEV空间里做检测和定位。BEV视角的好处是目标和目标之间的遮挡降到最低而且这个空间本身就是物理空间的俯视投影后续规划控制模块可以直接使用。BEV方法的经典框架是LSSLift, Splat, Shoot它把每个相机像素的特征同时估计深度分布然后抬起到三维空间中再splat到BEV网格上形成统一的特征图。后续的检测头在这个BEV特征图上工作输出目标的3D位置和朝向。这个方向目前工程落地还是有一定门槛的。BEV特征图的网格分辨率直接决定了定位精度网格太粗位置误差大网格太细计算量爆炸。我在实际项目中做过多相机融合的BEV检测经验是先根据精度需求反推网格大小如果要求横向定位误差小于20厘米在覆盖50米范围的场景里网格至少要256x256这对算力是个考验。4.3 多模态融合的工程权衡多模态检测听起来美好工程上最大的坑是传感器标定和数据同步。相机和激光雷达外参标定不准图像到点云的投影就会错位后续融合的精度根本无从谈起。我自己在这上面吃过不少苦头最后总结的经验是先做严格的标定验证用棋盘格或者特征点在图像上画出投影点云肉眼确认误差在几个像素以内再开始做检测融合。还有一个容易被忽视的问题是时间对齐。相机和激光雷达的采集频率不同如果时间戳没有同步目标在高速运动时会产生严重的错位误差。现在很多方案采用硬触发同步也有在软件层做插值对齐的。5. 难例场景实战小目标、红外目标与图像退化5.1 小目标检测为什么难怎么破小目标在COCO中的定义是像素面积小于32x32的目标。小目标检测难在几个方面经过多次下采样后小目标在深层特征图上可能只剩一两个像素信息几乎丢失正样本数量少训练时数据不平衡问题严重标注质量差小目标的边界框很难画准确噪声占比高。实践中最有效的解决方案是多尺度特征融合。FPN特征金字塔网络通过自顶向下的路径把深层语义信息传递到浅层高分辨率特征图上PAN则在FPN基础上增加自底向上的路径强化浅层定位信息。YOLOv8的Head部分就整合了类似的思路在不同层的输出上分别做预测。数据增强也能显著改善小目标检测。马赛克Mosaic增强把四张图拼在一起训练增加了小目标的数量和多样性Copy-Paste增强把大图里的小目标复制粘贴到其他位置人为扩充小目标样本。有个思路特别值得试把训练图像切成多块分别送入模型训练相当于把小目标放大来学。这个方法在遥感检测的比赛中屡试不爽。对于极其微小的目标比如红外图像里几个像素的亮点单纯靠CNN特征已经很难了。这时候会把时序信息引入利用目标的运动轨迹辅助检测。红外小目标检测通常先做背景抑制得到候选点再通过多帧关联确认真实目标。这里涉及一个常用指标信杂比增益SCR Gain和背景抑制因子BSF用来评价算法对背景的抑制效果。5.2 图像超分辨率和去模糊到底能不能帮检测很多人会想到用超分辨率重建来提升小目标检测的精度思路是先放大图像再检测。这个方向在理论上成立但实际工程里效果常常不如直接优化检测器。因为超分辨率重建网络本身会引入伪影尤其对微小目标重建出的纹理可能完全是编造的这反而干扰了后续的特征提取。我做过对比实验对同一批小目标图像一组先经过超分网络增强再送到检测器另一组直接训练检测器。结果第二轮检测的mAP反而更高因为超分网络的额外延迟和失真抵消掉了分辨率提升带来的收益。但如果目标是几十像素大小的中号目标超分增强的效果就比较明显尤其是在检测器backbone固定的情况下超分相当于做了一次特征级的数据增强能提供更多高频信息。图像去模糊也是同样的逻辑。去模糊能够恢复边缘锐度对定位精度的提升是有帮助的。但需要注意的是去模糊网络生成的图像在像素统计上往往和自然图像有偏差直接用预训练的检测器去跑效果可能不升反降。正确的做法是如果要用去模糊预处理那么检测模型应该用去模糊后的数据重新fine-tune保证特征分布一致。5.3 数据集构建与标注对你的模型影响有多大做目标检测的人都知道一句老话垃圾进垃圾出。模型的上限由数据和标注质量决定。很多开源数据集在类目和场景上和你的项目差异很大直接拿来训练往往效果不好你需要构建自己的领域数据集。鸟类目标检测数据集的构建就是个好例子。鸟类的种类多、姿态复杂、外观多变而且经常出现在树叶、草丛等复杂背景中。数据集构建时要注意类别平衡和场景多样性。只拍一种鸟和一种背景模型学到的可能只是背景特征。我见过有人做鸟种识别用了一万张都是蓝天背景的照片放到森林场景里直接就废了。泥石流和滑坡检测这类地质灾害场景数据本身很难采集。这类数据集往往来自遥感影像标注时不仅要对滑坡体轮廓做精标注还要对滑动边界做区分标注工作量很大。合理的选择是先用已有的预训练模型做辅助标注人工修正再用修正后的数据fine-tune。LabelMe、Label Studio和CVAT都是常用的标注工具支持多边形、矩形框、关键点等多种标注类型。遥感图像的检测还有自己的特殊性目标方向任意密集排列小目标占比极高。这类任务需要对检测器做两个适配一是将普通水平框换成旋转框避免多目标重叠时将框对象合并二是采用大图切小图推理防止在整张大图上直接做检测导致显存溢出和小目标分辨率不足。6. 工程化部署的要点从模型选型到实际落地6.1 模型太大跑不动怎么办超轻量检测模型现实世界的很多场景没有强大的GPU机器人、嵌入式设备、移动端的算力非常有限。一个只占5MB左右的目标检测模型在工程上特别受欢迎。要做到这么轻量核心手段是模型压缩和高效结构设计。模型压缩常用技术包括剪枝、量化和蒸馏。剪枝把网络里对输出影响小的权重或通道去掉可以直接减少计算量。量化把FP32的权重和激活值压缩到INT8推理速度可以提升2到4倍精度损失一般控制在1到2个百分点以内。蒸馏则用一个大模型当老师指导小模型学习让小模型达到超越它自身容量的精度。我之前在一个移动端项目里把YOLOv8n做了INT8量化加上通道剪枝模型从6MB左右压到了3MB在手机CPU上单帧推理速度从85ms降到35msmAP只掉了0.8完全够用。轻量化模型的关键是找准应用场景的上限做一个够用就好的模型而不是一味追求精度指标。6.2 推理速度和精度的平衡怎么把握目标检测工程里最核心的权衡就是速度与精度的平衡。同样一个任务最准的模型可能需要500毫秒才能出一帧最快的模型可能只要10毫秒但精度跌了20个百分点。你要清楚场景的底线在哪里生产线上漏检一个次品可能损失几百块钱但在高速公路上漏检一个行人可能就是不可接受的。我的思路是先定帧率需求再选模型。视频监控场景至少要25帧每秒那就直接排除两阶段检测器在YOLOv8s和RT-DETR之间做选择。工业静态检测对帧率要求不高可以上YOLOv8l甚至Faster R-CNN。模型选型的依据不是公开榜单上的排名而是你自己的测试集上的实测数据测推理时间、测不同距离下的检全率、测小目标表现。部署框架也会影响实际速度。PyTorch直接推理在边缘设备上通常跑不快需要转到ONNX、TensorRT或OpenVINO这些推理引擎。TensorRT对NVIDIA GPU的优化非常激进FP16推理通常能带来约1.5倍的速度提升。实测YOLOv8s在Jetson Orin上通过TensorRT能跑到40帧以上这个精度和速度组合在嵌入式场景里相当能打。6.3 从检测框到目标定位权限和地图坐标的链路这里说的定位已经不只是图像里的定位了而是真实世界的地理定位。无人机拍一张图检测出画面里的目标但指挥中心需要知道目标在地图上的实际位置才能调度资源。从像素坐标到经纬度坐标需要一整套变换链路相机内参矩阵将像素坐标变换到相机坐标POS数据提供相机的位置和姿态然后通过共线方程解算出地面坐标。链路中任何一个环节的误差都会累积到最终定位精度上。相机内参不标定像素坐标就有系统偏差无人机POS里的俯仰角、翻滚角有偏差投影到地面就是好几米甚至几十米的误差。做无人机目标定位时我会先做一个静态验证让无人机悬停在已知点上方把检测目标投影回地图看目标的估计位置和实际位置的偏差有多大然后根据偏差反推哪个环节出了问题。地面监控场景做定位则更常用单应矩阵的方法。如果相机位置固定先在图像中选取四个已知地面坐标的参考点计算出单应矩阵之后检测框的中心点直接左乘矩阵就能得到地面坐标。这套方法实现简单在工厂、仓库的视觉引导场景中非常实用。6.4 环境搭建和依赖问题避坑工程落地时环境搭建的坑往往比算法本身还折磨人。以ROSRobot Operating System环境为例不少人在安装ROS Noetic完整版时遇到无法定位软件包ros-noetic-desktop-full的报错。这个问题的根源通常是软件源没有更新或者没有添加ROS软件源也有系统版本和ROS版本不匹配的情况。我的建议是严格按照官方文档一步步来先确认Ubuntu版本和ROS版本对应关系再正确添加软件源最后别忘了apt update。如果是国内网络环境记得换国内的镜像源能避免大量超时卡顿。类似的坑也出现在Qt相关的动态库加载上。报无法定位程序输入点于动态链接库多半是版本冲突系统里有多个版本的Qt5Core.dll或者环境变量PATH里混入了其他目录的DLL。排查思路是先确认应用程序依赖的是哪个路径下的DLL然后手动删除旧版本的残留。这类问题看着奇怪实际上就是动态库路径搜索顺序导致的老问题。7. 常见问题与排查技巧实录现象可能原因排查方向训练loss不降学习率过大或过小、数据标注有噪声先跑过拟合单batch验证代码逻辑再看loss曲线检测框整体偏移特征图坐标解码错误、数据增强时框没同步变换单独检查解码函数在增强后可视化验证框是否对齐小目标完全检不到下采样倍数过大、Anchor尺寸不匹配增加浅层检测头、减小stride检查anchor设计推理速度慢模型太大、未用推理引擎优化换轻量骨干网络转TensorRT/ONNX开启INT8量化定位精度虚高但实际偏评价指标选取不合适只看AP0.5同时看AP[.5:.95]在真实场景下做端到端验证类别间互相误检类别相似度高、难负样本没有挖掘加难例挖掘损失增大负样本比例模型跑起来内存爆满批量大小太大、特征图太大减小batch size降低输入分辨率开启梯度累积部署前后精度不一致量化感知训练未做、预处理差异部署前做QAT校准保证推理端和训练端预处理完全一致表格里这几个问题都是我在实际项目里实打实遇到过的。特别是部署前后精度不一致这一点很多团队会忽略。Keras或者PyTorch训练的模型到了TensorRT推理就掉精度最常见的原因就是预处理没有对齐训练时用的是BGR加归一化部署时代码却用的是RGB或者resize的插值方式不一致。这类问题排查起来耗时很长建议提前把预处理流程封装成统一的函数训练和部署共用。关于定位精度虚高还有一个经典案例一个室内的目标跟随项目在测试集上AP跑到了90多但实际运行时跟踪总是丢。后来发现测试集的标注框画得太宽松IoU0.7都算正确实际业务要求定位误差小于10厘米模型在7米距离外根本达不到。最后重新设计了指标按物理距离的误差阈值来评估才真实反映出了模型在业务场景中的表现。小目标检测还有一个容易被低估的坑标注本身就存在人眼误差。几个像素的小框不同标注员画出来的可能差出一倍。如果对检测精度要求高我建议对同一张小目标图让两个人独立标注然后计算标注一致性质量差的样本要重标。数据质量检查应该是一个持续迭代的过程而不是一次性标注完就不管了。8. 模型训练加速和效果提升的几个实用心得先讲一下训练策略。迁移学习是标配大多数目标检测项目都会用COCO预训练权重做初始化因为底层特征的通用性很强。但有一个问题容易被忽略——当你的数据和COCO分布差异很大比如红外图像、医学影像直接使用预训练权重有时反而有害。此时我建议分两步走先用数据集在低学习率下对整体网络做一段热身把全局特征对齐再解冻全部层正常训练。数据增强是提升mAP最好用的免费午餐。除了前面提到的Mosaic还可以把随机仿射变换缩放、旋转、平移和颜色抖动组合成一个pipeline。但增强一定要和目标任务对齐如果应用场景里不存在旋转目标就不要加随机旋转否则误检率会上升。在文档检测场景中我只会用轻微的随机缩放和亮度扰动直接去掉90度旋转增强因为在真实单据里不会出现倒着放的文档。最后聊聊失败集分析。模型训练完不要只看mAP一定要把样本按照错误类型归类哪些是漏检、哪些是误检、哪些是定位偏差大。这一步花的时间抵得上调试模型结构的时间。我通常的做法是在验证集上把所有错误case可视化出来按类别统计分布定位偏差大的就仔细看是不是边界框回归不够细漏检多的就看是否小目标过多需要加浅层检测头。这种基于数据的诊断远比我拍脑袋调参有效得多。这个项目内容后续还可以怎么拓展如果你已经跑通了一个基础的检测流程下一步可以试试引入时序信息做视频检测跟踪或者把检测和分割结合做一个实例分割模型这些方向在业务场景里的通用性都很强。有些同学问我怎么选方向我通常说先把手里的检测项目做到稳定落地再考虑多模态和三维方向基础扎实了往后走会顺很多。
返回列表