尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
YOLOv5单目测距落地指南:标定、地平面法与工程避坑
简介这是一份面向计算机视觉学习者以及自动驾驶、机器人导航方向开发者的 YOLOv5 单目测距 Python 实现包重点解决仅凭单目摄像头估算目标距离、减少深度传感硬件依赖的问题。压缩包共 132 个文件约 13.87MB其中 yaml、yml 用于数据与模型参数配置py 脚本承担训练、推理和测距流程pt 文件提供预训练权重sh、Dockerfile 与 md 文档辅助环境搭建和结果复现另有少量图像、工程配置和示例材料。已有 3869 人学习下载。读者可以从中理解目标检测框与单目深度估计的衔接方式查看模型加载、训练测试、参数调整与容器化运行思路并借助目录结构和说明文档完成复现实验与二次开发。配置与脚本按数据、训练、验证和可视化环节组织便于逐模块查阅检测加测距的完整工程链路也适合希望积累部署排错经验的中级实践者系统研读。1. 一个地下车库的问题YOLOv5 单目测距到底在算什么上个月有人在群里丢了一张地下车库截图问能不能只用一个普通摄像头算出那辆白车离立柱还有几米。这其实就是 YOLOv5 单目测距要解决的典型场景不装激光雷达、不上双目一帧图加一台标定过的相机把检测框换算成米。反直觉的地方在于它并非重建三维测距本质上是在强假设下做尺度换算——要么假设目标真实高度已知要么假设目标脚底就踩在地面上。所以这类项目能不能落地靠的往往不是模型多强而是标定准不准、先验尺寸对不对。它适合园区停车管理、工地安全距离预警、课堂演示这类允许 10%~20% 误差的场景真要毫米级测量结构光或者双目才是正路别在这里死磕。2. 工程骨架目录分工、依赖版本与三种测距模型的取舍拿到一份测距代码第一件事不是急着跑是看它把检测和测距这两件事分没分开。分开了你换模型、换相机、换公式都不用动另一坨没分开detect 脚本里又 load 模型又算距离又画图改一次哭一次。这个项目按职责切成了四层配置、检测、测距、可视化主脚本只负责串流程。2.1 目录结构与每个文件的责任yolov5-monodepth/ ├── configs/ │ ├── camera_front.yaml # 前向相机内参、安装高度、俯仰角、图像尺寸 │ └── camera_side.yaml # 侧向相机参数完全独立 ├── models/ │ └── yolov5s.torchscript # 导出的推理模型不依赖训练代码 ├── calib/ │ ├── calibrate.py # 标定脚本生成 configs/camera_*.yaml │ └── samples/ # 标定用的参照物照片 ├── core/ │ ├── detector.py # letterbox 推理 NMS只吐 bbox │ ├── distance.py # 三种测距实现 时序平滑 │ └── visualizer.py # 画框、画距离文字、画地面参考线 ├── tools/ │ ├── detect_image.py │ ├── detect_video.py │ └── export_model.py # pt - torchscript / onnx ├── data/ │ └── real_size.yaml # 类别 - 真实尺寸米 └── requirements.txtcore/里三个文件的边界要守住detector.py只认像素不认米distance.py只认数字不认图像visualizer.py只认结果不做计算。这样你哪天想把 YOLOv5 换成别的检测器只需要保证detector.py的返回值是[x1, y1, x2, y2, conf, cls_id]的列表其余代码一行不动。data/real_size.yaml是先验尺寸表高度法全靠它# 类别 - 真实尺寸先验单位米 # 注意width 只在该类别经常正对相机时才有意义侧身时误差极大 person: height: 1.70 width: 0.45 car: height: 1.50 width: 1.80 truck: height: 3.20 width: 2.40 cone: height: 0.70 width: 0.35这张表是血泪经验攒出来的不是查资料查来的。同一个person类别成人、小孩、蹲着的人能差出一倍距离。我一般会按业务场景取一个偏保守的值然后在输出上加一句置信区间 ±20%别让用的人以为这是激光测距仪。2.2 依赖版本为什么 torch 和 opencv 要锁版本# 建议用 conda 建一个干净环境python 3.8~3.10 都能跑 conda create -n monodepth python3.9 -y conda activate monodepth # CPU 版 torch体积小、装得快有卡再换成对应 CUDA 版本 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cpu pip install opencv-python4.8.1.78 numpy1.24.3 pyyaml6.0 onnxruntime1.16.3锁版本不是为了洁癖。numpy上到 2.x 之后一批老代码里的np.float、np.int会直接抛AttributeErroropencv-python4.9 之后部分发行版对cv2.dnn.NMSBoxes的返回结构做过调整从[[x]]变成[x]取下标会翻车。我第一次在别人的机器上复现时就踩了这个本机跑得好好的换台机器 NMS 结果全空查了半小时才发现是版本漂移。所以requirements.txt里全部写死别写。模型文件用 TorchScript 而不是原始.pt理由很实际.pt在torch.load时要依赖训练时的模块路径换台机器、换个目录就报ModuleNotFoundErrorTorchScript 是序列化后的计算图只依赖 torch 本身。导出脚本大概长这样# tools/export_model.py import torch # 传入训练好的模型对象已 eval导出为可脱离源码运行的 TorchScript model torch.load(models/yolov5s.pt, map_locationcpu)[model].eval() example torch.zeros(1, 3, 640, 640) # 固定输入尺寸导出后不能动态改 traced torch.jit.trace(model, example) traced.save(models/yolov5s.torchscript) print(exported:, traced.code[:60])参数说明example的尺寸必须和你实际推理时的imgsz完全一致TorchScript trace 会把 shape 固化进图里推理时送 1280×1280 会直接报维度不匹配。想支持动态尺寸就在 trace 前调用torch.jit.script或者用 ONNX 的 dynamic_axes但工程上没必要——固定 640 反而更快。2.3 三种测距公式的适用边界单目测距绕不开三条路选错了再怎么调参都是白费方法核心公式需要的先验适用场景主要误差源像素高度法D f·H / h_px目标真实高度、像素焦距 f人、车这类高度稳定的目标目标被遮挡、蹲姿、远近尺度变化宽度法D f·W / w_px目标真实宽度正对相机的车辆、集装箱侧身、斜向行驶地平面法D H_cam / tan(θ arctan((y_b−c_y)/f))相机安装高度、俯仰角、主点脚踩地面的目标、道路场景相机抖动、俯仰角标定误差、坡道实操里的取舍很直接监控杆上装的相机俯角一般 15°~30°看的是地面上的行人和车地平面法最稳因为不依赖目标本身尺寸矮个子高个子测出来一样手持设备或者相机基本水平高度法更靠谱。这个项目两种都实现了通过configs/camera_front.yaml里的mode字段切换运行时会先算一遍地平面法如果算出来的距离超过 80 米或者为负自动回退到高度法——这是防玄学的一道保险。3. 标定链路从一张参照物照片反推焦距 f 和相机高度测距精度八成取决于标定模型只占两成。很多人拿到代码直接改两行就开跑结果测出来永远是 3.5 米然后开始怀疑模型——其实是他根本没标定用了代码里默认的假参数。3.1 焦距标定用已知距离的参照物反推 f像素焦距 f 的物理含义是无穷远物体成像时光心到像平面的像素距离。它有两个来源镜头标称参数换算或者实测反推。前者快但粗后者准但要在现场站一会儿。# calib/calibrate.py import math def f_from_intrinsic(f_mm: float, sensor_h_mm: float, img_h_px: int) - float: 由镜头标称焦距换算像素焦距。 f_mm: 镜头标称焦距如 6mm sensor_h_mm: 传感器靶面高度1/2.8 约 3.6mm img_h_px: 图像高度像素数如 1080 return f_mm / sensor_h_mm * img_h_px def f_from_reference(pixel_h: float, real_h_m: float, distance_m: float) - float: 实测反推让人站在已知距离外量出他在图里的像素高度。 相似三角形real_h / distance pixel_h / f f pixel_h * distance / real_h return pixel_h * distance_m / real_h_m参数说明和实操细节real_h_m用 1.70distance_m用卷尺量到 5.0 米让人站直、脚尖对齐地面刻度线拍一张。然后在图上量他 bbox 的像素高度pixel_h代进去。我一般会让人分别站 3 米、5 米、8 米各拍一张三个 f 值取中位数如果三个值相差超过 15%说明测量过程有问题重来。如果拿不到镜头参数f_from_intrinsic就用不上如果能拿到两条路算出来的 f 互相验证一下差值在 5% 以内基本可信。注意 1/2.8 传感器的靶面高度是 3.6mm 左右但不同厂商会裁切标称值只能当参考最终还是要用实测值覆盖。3.2 相机高度与俯仰角地平面法的两个关键量H_cam是相机光心到地面的垂直距离卷尺量别猜。常见错误是把相机外壳底部当成光心差个 5~10 厘米在 30 米外就是 1 米的误差。俯仰角θ更好别用水平仪量用画面反推更准找一个已知距离D0的地面标志物比如地面上的停车位线交点量出它在图里的 y 坐标y0然后反解# calib/calibrate.py def solve_pitch(y0: float, cy: float, f_py: float, cam_h: float, d0: float) - float: 已知地面点距离 d0 和它的像素 y 坐标反解俯仰角弧度向下为正 alpha math.atan2(cam_h, d0) # 该点相对水平面的俯角 beta math.atan2(y0 - cy, f_py) # 该点相对光轴的夹角 return alpha - beta # 俯仰角 两者之差这个函数的价值在于它把相机到底低头多少度这个说不清的玄学量变成了一个可计算、可复现的数字。cy是主点纵坐标理想情况等于图像高度的一半但很多摄像头模组装配有偏差实际可能偏移十几像素。严谨一点的做法是打印一张棋盘格做一次内参标定把(fx, fy, cx, cy)一起解出来偷懒的做法就是假设cf H/2误差通常在 2% 以内工程上够用。3.3 标定结果的落盘格式与校验# configs/camera_front.yaml camera_id: front_gate_01 image_size: [1920, 1080] # 宽, 高必须和推理时一致 focal_px: 1420.5 # 由 3.1 实测得到优先级高于 focal_mm focal_mm: 6.0 sensor_h_mm: 3.6 principal_point: [960.0, 548.0] # cx, cycy 比 540 大 8 像素是正常的 height_m: 4.20 # 相机光心离地高度 pitch_deg: 18.7 # 下俯角由 solve_pitch 得到 mode: ground # ground | height | auto fallback_max_m: 80.0 # 超过这个距离认为不可信回退高度法落盘之后一定要做一次校验别信纸面数字。我的做法是让一个人站在 5 米、10 米、20 米三个位置各跑一遍把结果和卷尺读数填进一张表里。如果 5 米处偏差小于 0.3 米、20 米处偏差小于 1.5 米这套参数就能用如果 20 米处偏差到 5 米以上八成是pitch_deg差了 2~3 度用 3.2 的方法重新解一遍。4. 核心模块拆解一个 bbox 从敲进 distance.py 到吐出三维测距结果流程拆开看就四步图像 letterbox 成 640×640 送进模型、模型吐归一化坐标、坐标还原回原图尺度、bbox 送进测距模块。最容易被忽略的是第三步——还原错了后面算什么都白搭。4.1 detector.pyletterbox 与坐标还原# core/detector.py import cv2 import numpy as np import torch class Detector: def __init__(self, weights, imgsz640, conf0.25, iou0.45, devicecpu): self.imgsz, self.conf, self.iou imgsz, conf, iou self.model torch.jit.load(weights, map_locationdevice).eval() self.device device def letterbox(self, img): 等比缩放后居中填充到 imgsz×imgsz返回缩放比和左上角填充量。 网络只见过这种带灰边的图直接 resize 会把长宽比拉变形检测框跟着偏。 h, w img.shape[:2] r min(self.imgsz / h, self.imgsz / w) nh, nw int(round(h * r)), int(round(w * r)) top, left (self.imgsz - nh) // 2, (self.imgsz - nw) // 2 canvas np.full((self.imgsz, self.imgsz, 3), 114, np.uint8) # 114 是惯例灰 canvas[top:top nh, left:left nw] cv2.resize(img, (nw, nh)) return canvas, r, left, top def __call__(self, img): canvas, r, left, top self.letterbox(img) x canvas[:, :, ::-1].transpose(2, 0, 1)[None] # BGR-RGB, HWC-CHW, 加 batch x torch.from_numpy(np.ascontiguousarray(x)).float().div(255.0).to(self.device) with torch.inference_mode(): # 比 no_grad 更省内存 pred self.model(x)[0] # (N, 5num_cls)xywhobjcls return self._nms(pred, r, left, top, img.shape[:2]) def _nms(self, pred, r, left, top, orig_hw): pred pred[pred[:, 4] self.conf] if not len(pred): return [] boxes_xywh pred[:, :4].cpu().numpy() scores pred[:, 4].cpu().numpy() cls pred[:, 5:].argmax(1).cpu().numpy() # xywh - xyxy并减掉 padding、除以缩放比还原到原图坐标系 xyxy np.stack([boxes_xywh[:, 0] - boxes_xywh[:, 2] / 2, boxes_xywh[:, 1] - boxes_xywh[:, 3] / 2, boxes_xywh[:, 0] boxes_xywh[:, 2] / 2, boxes_xywh[:, 1] boxes_xywh[:, 3] / 2], axis1) xyxy[:, [0, 2]] (xyxy[:, [0, 2]] - left) / r xyxy[:, [1, 3]] (xyxy[:, [1, 3]] - top) / r xyxy[:, [0, 2]] xyxy[:, [0, 2]].clip(0, orig_hw[1]) xyxy[:, [1, 3]] xyxy[:, [1, 3]].clip(0, orig_hw[0]) out [] for i in cv2.dnn.NMSBoxes(xyxy.tolist(), scores.tolist(), self.conf, self.iou): out.append((*xyxy[i], scores[i], int(cls[i]))) return out三个细节值得单独说。第一canvas填充用的是 114 灰而不是 0这是训练时的惯例填 0 会让边缘出现不自然的强对比模型偶尔会误检。第二(xyxy - left) / r这两行是还原的核心left和top是填充量r是缩放比顺序不能反——先减再除反过来就全错了。第三torch.inference_mode()在推理场景比no_grad()更快因为它连版本计数都不维护了。返回结构统一成[x1, y1, x2, y2, conf, cls_id]后面所有模块只依赖这个契约换检测器只改这一个文件。4.2 distance.py双公式实现与时序平滑# core/distance.py import math from collections import deque class DistanceEstimator: def __init__(self, cfg, real_sizes, smooth_win7): self.cfg cfg self.real_sizes real_sizes self.f cfg[focal_px] self.cx, self.cy cfg[principal_point] self.cam_h cfg[height_m] self.pitch math.radians(cfg[pitch_deg]) self.buf {} # track_id - deque做时序平滑 self.win smooth_win def by_height(self, box, cls_name): 像素高度法D f * H_real / h_px。bbox 越矮算出来越远。 h_px box[3] - box[1] real_h self.real_sizes[cls_name][height] if h_px 8: # 太小的框不谈精度直接丢弃 return None return self.f * real_h / h_px def by_ground(self, box, cls_name): 地平面法只用 bbox 底边中心和类别尺寸无关。 y_bottom box[3] beta math.atan2(y_bottom - self.cy, self.f) angle self.pitch beta if angle math.radians(89.0) or angle 0: return None # 贴近地平线数值会炸直接判无效 return self.cam_h / math.tan(angle) def estimate(self, box, cls_name, track_idNone): d None if self.cfg[mode] in (ground, auto): d self.by_ground(box, cls_name) if self.cfg[mode] auto and (d is None or d self.cfg[fallback_max_m]): d self.by_height(box, cls_name) else: d self.by_height(box, cls_name) if d is None: return None if track_id is not None: # 有跟踪 id 才做平滑否则会串目标 b self.buf.setdefault(track_id, deque(maxlenself.win)) b.append(d) d sorted(b)[len(b) // 2] # 中位数比均值抗离群点 return round(d, 2) def backproject(self, box, d): 把距离反投影成相机坐标系下的 (X, Y, Z)也就是常说的三维测距输出。 u (box[0] box[2]) / 2 v box[3] X (u - self.cx) * d / self.f Y (v - self.cy) * d / self.f return round(X, 2), round(Y, 2), round(d, 2)by_ground里angle的判断很关键angle接近 90° 意味着目标贴近地平线tan趋于无穷算出来的距离会从 50 米跳到 5000 米再跳到负数画面上的数字疯狂闪烁这就是很多人以为模型在抖的真相。加了这个判断之后无效值返回None上层直接不画。by_height里h_px 8的阈值是按 1080p 估的8 像素对应大约 60 米外的人再远就没什么意义了。如果你换成 4K 相机这个阈值要跟着翻倍。backproject输出的(X, Y, Z)是相机坐标系下的伪三维Z来自前两种方法X/Y由像素坐标线性缩放得到。它不是真实的三维重建因为Z本身就带着 10%~20% 的误差会等比放大到X/Y。对外输出时我一般只报Z和一个方位角报完整坐标反而容易被当成精确值。4.3 detect_video.py主循环与结果落盘# tools/detect_video.py import csv, cv2, yaml from core.detector import Detector from core.distance import DistanceEstimator cfg yaml.safe_load(open(configs/camera_front.yaml)) sizes yaml.safe_load(open(data/real_size.yaml)) names {0: person, 2: car, 7: truck} # cls_id - real_size.yaml 的键 det Detector(models/yolov5s.torchscript, imgsz640) est DistanceEstimator(cfg, sizes) cap cv2.VideoCapture(data/sample.mp4) writer csv.writer(open(out/distance_log.csv, w, newline)) writer.writerow([frame, cls, x1, y1, x2, y2, conf, dist_m]) idx 0 while True: ok, frame cap.read() if not ok: break for x1, y1, x2, y2, conf, cid in det(frame): cname names.get(cid) if cname is None or cname not in sizes: continue # 类别不在尺寸表里跳过 box (x1, y1, x2, y2) d est.estimate(box, cname, track_idNone) # 单帧无跟踪先不平滑 if d is None: continue cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2) cv2.putText(frame, f{cname} {d:.1f}m, (int(x1), int(y1) - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) writer.writerow([idx, cname, f{x1:.1f}, f{y1:.1f}, f{x2:.1f}, f{y2:.1f}, f{conf:.3f}, d]) cv2.imwrite(fout/frame_{idx:05d}.jpg, frame) idx 1track_id传None意味着不做平滑每帧独立算。这样跑出来的数字会跳但它是最诚实的结果——你能直接看到单帧误差有多大。等接了跟踪器比如把 bbox 和上一帧按 IoU 匹配上给个自增 id再把 id 传进去平滑才生效。顺序别搞反先用脏数据看清误差来源再去平滑否则问题会被中位数掩盖掉。CSV 落盘这件事看起来土但排查问题时是唯一的后悔药。有一次现场反馈车开到 15 米就报 60 米手上只有视频没有数值只能一帧帧数。后来养成习惯所有测距输出都同步写 CSV出问题直接sort一下看距离分布五分钟定位是不是某几帧的 bbox 底边被裁到了画面外。5. 避坑与排查标定、坐标系、性能上最容易翻车的 5 个点这套代码我前后在三个不同的现场部署过下面五条是出现频率最高的。5.1 标定与前处理相关的三个坑坑一不管人站哪儿测出来都是 3.5 米左右。现象是数值稳定得可疑从画面这头走到那头只变 0.2 米。原因是模型输出的 bbox 是 letterbox 之后的 640 坐标系代码直接拿去算像素高度没做(x - left) / r还原所有框的大小都被压缩到同一个数量级。解决就是老老实实做还原并且打日志确认还原后的 bbox 落在原图范围内——如果x2恒等于 640说明还原根本没生效。坑二换一台相机距离全部翻倍。现象是同一套参数在 A 相机上准搬到 B 相机上差一倍。原因是focal_px和image_size是绑定的B 相机分辨率是 1280×720focal_px还是按 1920×1080 算的。解决办法是每台相机一份独立配置camera_id作为文件名的后缀启动时强制校验image_size和实际读到的帧尺寸是否一致不一致直接抛异常别让它带着错参数跑。坑三人一蹲下距离立刻变远一倍。现象是站着的时候挺准蹲下或者只露出上半身数值暴涨。原因是高度法用的是 bbox 高度人蹲下时真实高度从 1.7 变成 0.9但代码里还是按 1.7 算D f·H/h里h变小了、H没跟着变结果自然偏大。解法是切换到地平面法它只看底边和身高无关如果必须用高度法就引入宽高比判断h/w明显偏小的时候标记为姿态不可信输出None而不是硬报一个数。5.2 推理与部署相关的两个坑坑四开发机上 30fps现场盒子上 3fps。现象是代码一模一样换硬件就掉十倍。原因通常是没做这几件事每帧都在torch.from_numpy之后重复分配内存、没有inference_mode、模型还是.pt走的 Python 前向。解决路径是先看单帧耗时分布如果预处理占了 40% 以上就把letterbox的np.full换成预分配的复用缓冲区如果推理占大头导出 ONNX 用 onnxruntime 跑纯 CPU 上通常能快 1.5~2 倍再不够就上 TensorRT但要注意 TensorRT 对动态 shape 支持一般输入尺寸必须锁死。坑五坡道上测距全错平地上没事。现象是同一套参数车库平地准出口那个 8% 的坡上误差到 30%。原因是地平面法假设地面是水平的相机高度H_cam是常数坡道上这个假设不成立目标脚下那一点的真实高度变了。严格解法是把地面建个简单平面模型按像素位置查高度工程解法是在坡道区域换用高度法或者干脆在配置里给每个 ROI 单独一套height_m和pitch_deg进哪块区域用哪套参数。别指望一个公式通吃全场。提示这五条里前三条占了现场问题的八成。部署前先在目标机器上跑一段录像把 CSV 拉出来看距离分布比对卷尺实测比在代码里猜要快得多。6. 二次开发换类别、接实时流、加俯仰角自适应改造之前先想清楚一件事你要改的是测什么还是怎么测。换类别、加目标动real_size.yaml和names映射就够了改测距精度动distance.py接新视频源动主循环。三条线互不干扰。先说换类别最常见的是从人扩到车、电动车、锥桶。data/real_size.yaml里加一条names映射里加一行跑一遍就行。但有个坑car这一类高度法要谨慎用因为轿车、SUV、面包车的高度从 1.4 到 2.0 米不等统一按 1.5 算误差能到 30%地平面法在这种场景下明显更稳。真正需要精确的场景我会按检测框的宽高比再细分一次h/w 0.7判为轿车否则判为 SUV/面包车用不同的先验。这个判据不严谨但在固定机位下够用。接实时流把cv2.VideoCapture(data/sample.mp4)换成 RTSP 地址即可但必须加两件事一是cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)把缓冲区降到 1否则读到的永远是几秒前的旧帧画面看着像卡住二是断流重连用一个带退避的循环包住VideoCapture的创建网络抖动是常态不加这个进程半夜就挂了import time, cv2 def open_stream(url, retries5): for i in range(retries): cap cv2.VideoCapture(url, cv2.CAP_FFMPEG) cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) # 关键不缓冲旧帧 if cap.isOpened(): return cap time.sleep(min(2 ** i, 30)) # 指数退避别把服务端打挂 raise RuntimeError(fstream unreachable: {url})俯仰角自适应是这套东西里我最想推荐的一个改进。相机装在杆上风吹、螺丝松动、被人撞一下俯仰角就会偏一两度测距跟着漂。做法是每帧在画面里找地面消失点把检测到的行人底边中心点做一次直线拟合多条线的交点纵坐标就是消失点v0而tan(θ) (v0 - cy) / f俯仰角就实时解出来了。拟合至少需要 3 个不同距离的行人人少的时候退回配置里的固定值。这个方法不需要额外硬件纯软件就能把长期漂移压到 0.5 度以内。验证方法要固定成流程改完参数拿同一段包含 3 个已知距离点位的录像跑一遍把 CSV 里那三帧的数值拉出来跟卷尺读数比。我给自己定的门槛是 10 米内误差小于 0.5 米、30 米内小于 2 米过了才能上现场。有一次我图省事跳过了这一步结果把俯仰角的符号搞反了现场测出来全是负数被现场的人当成目标在相机后面。从那以后我每次改完distance.py的任何一个符号都强制走一遍这三个点位的回归验证哪怕只改了一行注释。希望这套流程能帮你少走几趟现场。本文还有配套的精品资源点击获取
RELATED

相关推荐

YOLOv5单目测距:USB摄像头像素框转三维坐标实战

YOLOv5单目测距:USB摄像头像素框转三维坐标实战

简介:YOLOv5单目测距(Python)实现方案面向计算机视觉入门到中阶开发者,也适合在自动驾驶、机器人导航、智能监控等方向做场景验证的工程人员,核心解决单摄像头条件下如何由二维图像推断目标距离的问题:先用…

📅 2026/11/6 5:28:31
利用python中matplotlib.pyplot库绘制图

利用python中matplotlib.pyplot库绘制图

plot 绘制折线图import matplotlib.pyplot as pltplt.plot(x,y) # x,y是每个点的坐标,plot()把每个点按顺序画折线scatter 绘制散点图import matplotlib.pyplot as pltplt.scatter(x,y)可以设置color属性,设置颜色也可以导入数据绘制。只需指定好x y…

📅 2026/11/6 5:23:31
【Git】第3期 多人协作与企业级开发规范详解

【Git】第3期 多人协作与企业级开发规范详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/11/6 5:23:31
MORE NEWS

更多资讯

📰

(论文速读)IterativePFN:让点云去噪真正学会迭代

论文题目: IterativePFN: True Iterative Point Cloud Filtering(IterativePFN:真正的迭代式点云滤波) 会议: CVPR 2023 摘要: 点云质量常受到采集噪声影响,因此去噪是三维视觉中的基础任务。现…

📰

项目资金闭环如何用大模型分析

项目资金闭环分析的核心是把资金来源、拨付、合同、发票、付款、保证金、决算、审计之间的勾稽链条组织起来,让每一笔资金的来路与去向都能追溯,让链条上的断点能被自动发现。多数企业的资金问题不是账不平,而是"不知道哪里不平"—…

📰

国产长芯微LP7415完全pin-pin替代TPS7A4700,40V、1A快速动态响应超低噪声LDO

产品描述LP7415 是一款低压差稳压器,专为低噪声和快速瞬态响应而优化。该器件能够提供 1A 的输出电流, 典型压降为 276mV。工作静态电流为 1mA,关机时降至 1μA,同时压差模式下静态电流控制良好。除了快速瞬态响应外,L…

📰

CAN 技术系列 04 · CAN 帧格式

📚 CAN总线技术系列 持续更新中 本系列从差分电气层一路打到 Linux SocketCAN,把"两根线"背后的电气/协议/控制器/驱动/实战全拧成一根线。 👉 想系统追更,戳这里查看完整专栏: 【CAN 技术系列】 👉 其他技…

📰

第四章-无人机天空端多R的MRC技术以及干扰无人机的影响

什么是MRC Maximal Ratio Combining,最大比合并,接收分集最优线性合并算法,多路天线收到同一个发射源的信号,先把各路信号相位对齐,然后“信号好的支路给高权重、噪声大的支路压低权重”再加起来,合并之后输…

📰

记忆机制:对话内与跨对话的记忆

很多人对大模型记忆有一个根深蒂固的误解:以为对话多了,模型就"认识"你了,就"记得"你上周说过什么。这个错觉很危险,因为它把工程的归工程的、模型的归模型的,全搅在了一起。今天我把这件事讲清楚…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬