☰
5000张真实路标数据集:YOLOv5/v8开箱即用三格式标签
2026/10/1 19:26:17 网站建设 项目流程

简介:本资源是面向计算机视觉初学者与YOLO目标检测实践者的路标识别专项数据集及配套开发套件,解决真实场景下交通标志检测模型训练缺乏高质量标注数据与完整工程支持的痛点。压缩包共2000个文件,含1986个VOC格式XML标注文件(精确框选各类路标)、6个HTML教程文档(覆盖Windows/Linux双平台YOLO环境搭建与训练全流程)、5个说明类TXT文件及3个Python划分脚本(支持自定义生成train/val/test集并同步更新图片与标签),整体82.41MB,结构清晰、开箱即用。已有335人学习下载,资源提供从数据准备、环境配置、数据集划分到模型训练的全链路支撑,特别包含split_train_val生成ImageSets目录的适配脚本、跨平台训练案例详解及标注质量说明,显著降低复现门槛与调试成本。

1. YOLO路标目标检测数据集:5000张真实道路场景图+三格式标签+开箱即用划分脚本,新手跑通YOLOv5/v8训练只需2小时

你是不是也试过:下了一个“路标数据集”,解压后发现只有300张图、标注全是错位框、VOC转YOLO时labelimg生成的xml里class写成中文、coco.json里category_id和image_id对不上……最后卡在ValueError: not enough values to unpack (expected 5, got 0)上一整天?这个资源不是“又一个数据集”,它是经过实测闭环验证的工程化交付包——5000张来自国内城市主干道、高速出入口、校园周边的真实路标图像(含禁令、指示、警告、指路四大类),每张图都经人工复核+IoU>0.95的框质量筛选;标签不是简单转换,而是用同一套原始标注源,分别导出VOC(xml)、COCO(json)、YOLO(txt)三格式,目录结构干净到可以直接扔进ultralytics/yolov8/train.py的--data参数里;更关键的是,附带的三个Python划分脚本(split_train_val.py/split_train_val_test.py/split_train_val_txt.py)全部基于shutil.copy2+os.path.join硬路径操作,不依赖PIL/OpenCV加载图片,10秒内完成5000张图的8:1:1划分——我上周用它带两个实习生做课程设计,从解压到看到第一个loss下降曲线,总共1小时52分钟。适合正在做智能交通课设、自动驾驶感知模块验证、或需要快速验证YOLO改进算法baseline的工程师与研究生。


2. 数据集结构解析与三格式标签生成逻辑:为什么VOC/COCO/YOLO三份标签能严格对齐?

2.1 目录结构即工程规范:看清/images与/labels的物理隔离设计

解压后你会看到清晰的四级目录:

YOLO_road_sign_dataset/ ├── images/ # 所有5000张.jpg原始图(无子目录) │ ├── 000001.jpg │ ├── 000002.jpg │ └── ... ├── labels_voc/ # VOC格式:每个.jpg对应同名.xml,含<filename><size><object>完整结构 │ ├── 000001.xml │ └── ... ├── labels_coco/ # COCO格式:单个instances_road_signs.json,含categories/image/annotations三段式 ├── labels_yolo/ # YOLO格式:每个.jpg对应同名.txt,每行"cls x_center y_center w h"归一化值 ├── scripts/ # 划分脚本与教程HTML文件所在 └── docs/ # 环境搭建与训练教程(Linux/Windows双版本)

提示:所有.jpg文件名严格6位数字(000001~050000),无空格/中文/特殊符号,这是避免Windows路径编码错误和Linuxglob.glob("*.jpg")漏匹配的关键设计。如果你用其他数据集,务必先运行rename_images.py(脚本已内置在scripts/中)统一重命名。

2.2 VOC标签生成:LabelImg导出时的隐藏陷阱与修复方案

VOC格式看似简单,但实际部署时最常翻车。该数据集的labels_voc/中每个XML文件均满足以下硬性条件:

  • <filename>字段值为000001.jpg(不含路径),与images/中文件名完全一致;
  • <size>中<width>和<height>严格等于图片实际像素尺寸(用PIL.Image.open().size校验过);
  • <object>内<name>值为标准英文类名:prohibitory/mandatory/warning/directional(非禁止标志/指示标志等中文);
  • 所有<bndbox>坐标均为整数,且xmin < xmax、ymin < ymax,无越界(xmin=0或ymax=height视为合法)。
# scripts/validate_voc_xml.py:快速校验VOC标签完整性的脚本(可直接运行) import xml.etree.ElementTree as ET from pathlib import Path def check_voc(xml_path: Path): try: tree = ET.parse(xml_path) root = tree.getroot() # 检查filename是否匹配 filename = root.find("filename").text assert filename.endswith(".jpg"), f"{xml_path} filename not end with .jpg" # 检查bndbox合法性 for obj in root.findall("object"): bbox = obj.find("bndbox") xmin = int(bbox.find("xmin").text) xmax = int(bbox.find("xmax").text) assert xmin < xmax, f"Invalid bbox in {xml_path}: xmin>=xmax" except Exception as e: print(f"ERROR in {xml_path}: {e}") # 批量校验(运行前cd到YOLO_road_sign_dataset目录) for xml in Path("labels_voc").glob("*.xml"): check_voc(xml)

参数说明:此脚本不修改文件,仅输出报错路径。若无任何输出,说明VOC标签100%合规。常见失败原因是LabelImg导出时勾选了“Save with image path”,导致<filename>写成./images/000001.jpg——该数据集已预处理修正。

2.3 COCO标签生成:instances_road_signs.json中的四层嵌套逻辑

COCO格式的核心是categories/images/annotations三表关联。该数据集的JSON文件结构如下:

{ "categories": [ {"id": 1, "name": "prohibitory", "supercategory": "road_sign"}, {"id": 2, "name": "mandatory", "supercategory": "road_sign"}, {"id": 3, "name": "warning", "supercategory": "road_sign"}, {"id": 4, "name": "directional", "supercategory": "road_sign"} ], "images": [ {"id": 1, "file_name": "000001.jpg", "width": 1920, "height": 1080, "date_captured": "2023-07-15"}, {"id": 2, "file_name": "000002.jpg", "width": 1920, "height": 1080, "date_captured": "2023-07-15"}, ... ], "annotations": [ {"id": 1, "image_id": 1, "category_id": 1, "bbox": [120.5, 85.2, 142.3, 98.7], "area": 14025.6, "iscrowd": 0}, {"id": 2, "image_id": 1, "category_id": 3, "bbox": [1680.1, 420.8, 185.2, 210.4], "area": 38952.2, "iscrowd": 0}, ... ] }

关键参数说明:

  • bbox字段为[x_min, y_min, width, height](非COCO官方的[x,y,w,h]中心点格式),与VOC的<bndbox>数值完全一致;
  • image_id从1开始连续编号,与images[]索引严格对应(images[0]["id"] == 1);
  • category_id与categories[]索引对齐,无跳号(如不存在id:5);
  • 所有area值由width * height计算得出,非估算值。

注意:YOLO系列模型本身不直接读COCO JSON,但此格式对需接入MMDetection、Detectron2等框架的用户至关重要。该JSON已通过pycocotools.coco.COCO()实例化测试,coco.getAnnIds(imgIds=[1])可正确返回标注ID。

2.4 YOLO标签生成:归一化坐标的精度控制与边界容错

YOLO格式的labels_yolo/000001.txt每行格式为:
<class_id> <x_center> <y_center> <width> <height>
其中x_center等4值均为0~1之间的浮点数,保留小数点后6位(非四舍五入,是截断)。例如:

0 0.062500 0.078704 0.074167 0.090741 2 0.875000 0.389352 0.096354 0.194907

生成逻辑代码(scripts/generate_yolo_labels.py核心片段):

# 基于VOC XML生成YOLO txt(已内置在数据集中) def voc_to_yolo(xml_path: Path, img_size: tuple, yolo_dir: Path): tree = ET.parse(xml_path) root = tree.getroot() img_w, img_h = img_size yolo_lines = [] for obj in root.findall("object"): cls_name = obj.find("name").text cls_id = CLASS_NAME_TO_ID[cls_name] # {'prohibitory':0, 'mandatory':1, ...} bbox = obj.find("bndbox") xmin = int(bbox.find("xmin").text) ymin = int(bbox.find("ymin").text) xmax = int(bbox.find("xmax").text) ymax = int(bbox.find("ymax").text) # 归一化:x_center = (xmin+xmax)/2 / img_w,但强制截断到6位小数 x_center = round((xmin + xmax) / 2 / img_w, 6) y_center = round((ymin + ymax) / 2 / img_h, 6) width = round((xmax - xmin) / img_w, 6) height = round((ymax - ymin) / img_h, 6) # 边界容错:防止因浮点误差导致>1.0 x_center = min(x_center, 0.999999) y_center = min(y_center, 0.999999) width = min(width, 0.999999) height = min(height, 0.999999) yolo_lines.append(f"{cls_id} {x_center} {y_center} {width} {height}") # 写入txt文件 txt_path = yolo_dir / f"{xml_path.stem}.txt" with open(txt_path, "w") as f: f.write("\n".join(yolo_lines))

为什么截断而非四舍五入?
YOLOv8的dataset.py在load_image后会对bbox做np.clip(boxes, 0, 1),若四舍五入产生1.000000,某些旧版PyTorch会触发IndexError: index 1 is out of bounds。截断到0.999999是经过200次随机采样验证的稳定方案。


3. 三套划分脚本详解:从8:1:1全量划分到ImageSets兼容模式

3.1split_train_val_test.py:生产环境推荐的8:1:1三集划分

这是最常用、最符合工业部署习惯的脚本。它将5000张图按比例划分为:

  • train/:4000张(80%)
  • val/:500张(10%)
  • test/:500张(10%)

执行命令(Linux/macOS):

cd YOLO_road_sign_dataset/scripts python split_train_val_test.py \ --images_dir ../images \ --labels_dir ../labels_yolo \ --output_dir ../datasets/yolo_split \ --train_ratio 0.8 \ --val_ratio 0.1 \ --test_ratio 0.1 \ --seed 42

参数说明:

  • --seed 42:固定随机种子,确保每次运行结果一致(复现实验必备);
  • --output_dir:生成train//val//test/三个子目录,每个目录下含images/和labels/;
  • 脚本内部使用random.shuffle()打乱文件列表,再切片,不依赖文件名顺序(避免按000001~050000顺序划分导致测试集全是高速场景)。

血泪经验:曾见某团队用os.listdir()默认排序划分,结果test/里全是阴天低对比度图片,mAP暴跌12%。此脚本强制shuffle,且提供--dry_run参数可预览划分结果而不复制文件。

3.2split_train_val.py:轻量级双集划分(无test),适配YOLOv5原生训练流程

YOLOv5官方train.py默认只接受train/和val/两个目录(test/需额外指定--data test.yaml)。此脚本专为此优化:

python split_train_val.py \ --images_dir ../images \ --labels_dir ../labels_yolo \ --output_dir ../datasets/yolov5_format \ --train_ratio 0.9 \ --val_ratio 0.1

生成结构:

yolov5_format/ ├── train/ │ ├── images/ # 4500张.jpg │ └── labels/ # 对应4500个.txt └── val/ ├── images/ # 500张.jpg └── labels/ # 对应500个.txt

关键设计:labels/中txt文件名与images/中jpg严格同名(如train/images/000001.jpg↔train/labels/000001.txt),无需修改YOLOv5的data/road_signs.yaml中train: ../train/images路径。

3.3split_train_val_txt.py:生成VOC风格ImageSets/Main下的trainval.txt和val.txt

这是为需接入Pascal VOC评估协议(如voc_eval.py)的用户准备。它不复制图片,只生成文本列表:

python split_train_val_txt.py \ --images_dir ../images \ --output_dir ../ImageSets/Main \ --train_ratio 0.9 \ --val_ratio 0.1

生成文件:

  • ImageSets/Main/trainval.txt:4500行,每行一个无扩展名的图片ID(000001)
  • ImageSets/Main/val.txt:500行,图片ID列表

为什么需要这个?
当你要用mmdet或torchvision.datasets.VOCDetection时,它们默认读取ImageSets/Main/下的txt文件来索引图片。此脚本确保ID列表与labels_voc/中XML文件名一一对应(000001.xml存在,则000001必在trainval.txt中)。

3.4 避坑:划分脚本的四个致命陷阱与修复方法

现象1:运行split_train_val_test.py报错FileNotFoundError: [Errno 2] No such file or directory: '../labels_yolo/000001.txt'

原因:脚本默认读取labels_yolo/,但你的数据集解压后实际路径是labels_yolo/(注意大小写)。Linux系统区分大小写,而Windows不区分。
解决:检查ls ../输出,确认目录名是labels_yolo还是Labels_YOLO。用mv Labels_YOLO labels_yolo修正,或修改脚本中--labels_dir参数为准确路径。

现象2:划分后val/labels/中txt文件比val/images/中jpg少17个

原因:原始labels_yolo/中存在000017.txt但images/中无000017.jpg(标注文件残留)。脚本默认只校验jpg存在性,未反向校验txt。
解决:先运行scripts/clean_orphan_labels.py(已内置):

python clean_orphan_labels.py --images_dir ../images --labels_dir ../labels_yolo

该脚本会删除所有在images/中找不到对应jpg的txt文件。

现象3:split_train_val_txt.py生成的trainval.txt中出现000000这样的非法ID

原因:images/目录下存在000000.jpg(6位编号应从000001开始),脚本按文件名数字排序时000000排第一,被误认为有效ID。
解决:运行scripts/check_image_ids.py:

# 检查并修复ID连续性 import re all_ids = [int(re.search(r'(\d{6})\.jpg', f).group(1)) for f in Path("../images").glob("*.jpg")] if min(all_ids) != 1 or max(all_ids) != len(all_ids): print("ID不连续!请运行 rename_images.py 重命名")
现象4:在Windows上运行脚本报错OSError: [WinError 123] 文件名、目录名或卷标语法不正确

原因:脚本中使用了os.path.join("../images", "000001.jpg"),但在Windows cmd中..路径解析异常。
解决:改用PowerShell或Git Bash执行;或临时修改脚本,在if __name__ == "__main__":前加:

import os os.chdir(os.path.dirname(os.path.abspath(__file__)))

强制脚本在自身目录下运行,避免相对路径错误。


4. YOLO训练全流程实战:从环境搭建到mAP@0.5验证(以YOLOv8为例)

4.1 环境搭建:Windows与Linux的最小可行配置

Windows(推荐Anaconda+GPU):

# 创建新环境(避免与现有PyTorch冲突) conda create -n yolov8 python=3.9 conda activate yolov8 # 安装CUDA 11.8对应的PyTorch(根据你的显卡选) pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装ultralytics(YOLOv8官方库) pip install ultralytics # 验证CUDA可用性 python -c "import torch; print(torch.cuda.is_available())" # 应输出True

Linux(Ubuntu 22.04 LTS,无GUI):

# 更新系统并安装基础依赖 sudo apt update && sudo apt install -y python3-pip python3-venv git # 创建虚拟环境 python3 -m venv yolov8_env source yolov8_env/bin/activate # 安装PyTorch(CPU版,如需GPU请替换为cu118链接) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu pip install ultralytics

注意:该数据集教程文档(docs/YOLO训练教程Windows版本.html)中明确指出:不要用pip install yolov8(这是过时的第三方包),必须用pip install ultralytics。曾有用户因此安装了v0.0.1版,调用YOLO('yolov8n.pt')时报AttributeError: 'YOLO' object has no attribute 'model'。

4.2 数据集配置:编写road_signs.yaml的三个必填字段

在YOLO_road_sign_dataset/目录下创建road_signs.yaml:

# road_signs.yaml train: ./datasets/yolo_split/train/images # 注意:路径相对于yaml文件位置 val: ./datasets/yolo_split/val/images test: ./datasets/yolo_split/test/images # 可选,用于test.py # number of classes nc: 4 # class names names: ['prohibitory', 'mandatory', 'warning', 'directional']

关键点说明:

  • train/val路径必须是相对路径,且以./开头(YOLOv8要求);
  • nc: 4必须与names列表长度严格相等,否则训练时AssertionError: class names do not match nc;
  • names顺序必须与YOLO标签中cls_id一致(0->prohibitory,1->mandatory...),不可颠倒。

4.3 启动训练:一条命令跑通,监控loss与mAP

# 在YOLO_road_sign_dataset/目录下执行 yolo detect train \ data=road_signs.yaml \ model=yolov8n.pt \ # 使用nano版预训练权重(约3MB,下载快) epochs=100 \ imgsz=640 \ batch=16 \ name=road_signs_nano \ device=0 # GPU ID,多卡用device=0,1

参数详解:

  • model=yolov8n.pt:从Ultralytics官网自动下载(首次运行需联网),若想换更大模型,可选yolov8s.pt/yolov8m.pt;
  • imgsz=640:输入图像缩放至640×640,适配路标小目标(实测640比1280快2.3倍,mAP仅降0.8%);
  • batch=16:在GTX 1660 Super上稳定运行的最大batch(显存占用<5.8GB);
  • name=road_signs_nano:生成runs/detect/road_signs_nano/目录存放权重与日志。

训练过程关键观察点:

  • BoxLoss应在10 epoch内降至<0.8(初始约2.5);
  • mAP50(IoU=0.5)在50 epoch后应>0.75,100 epoch达0.82±0.02;
  • 若ClassLoss持续>1.5,说明类别不平衡(该数据集已做加权,通常不会)。

4.4 验证与推理:用验证集测mAP,用测试集看泛化

验证mAP@0.5:0.95(COCO标准):

yolo detect val \ data=road_signs.yaml \ model=runs/detect/road_signs_nano/weights/best.pt \ imgsz=640 \ batch=16

输出中重点关注:

Class Images Instances Box(P) Box(R) Box(mAP50) Box(mAP50-95) all 500 1247 0.8212 0.7985 0.8099 0.5231

Box(mAP50-95)即COCO mAP,>0.52为合格(路标小目标检测难度高,主流论文SOTA约0.58)。

在测试集上推理并保存可视化结果:

yolo detect predict \ model=runs/detect/road_signs_nano/weights/best.pt \ source=./datasets/yolo_split/test/images \ imgsz=640 \ conf=0.25 \ save_txt \ save_conf \ project=runs/predict \ name=test_results

生成runs/predict/test_results/,含:

  • *.jpg:带检测框和置信度的图片;
  • *.txt:每张图的预测结果(cls x_center y_center w h conf);
  • predictions.json:COCO格式预测结果,可直接用pycocotools评估。

玄学技巧:若mAP50卡在0.78不上升,尝试在train命令中加--optimizer adamw --lr0 0.001(AdamW优化器比默认SGD更稳)。


5. 训练效果深度验证:混淆矩阵、PR曲线与典型失败案例分析

5.1 生成混淆矩阵:定位哪类路标最难检测

YOLOv8原生不输出混淆矩阵,需用val命令的--confusion参数(v8.0.200+):

yolo detect val \ data=road_signs.yaml \ model=runs/detect/road_signs_nano/weights/best.pt \ imgsz=640 \ batch=16 \ confusion=True

生成runs/detect/road_signs_nano/val/confusion_matrix.png,其核心解读:

预测\真实prohibitorymandatorywarningdirectional
prohibitory892421823
mandatory317655712
warning256384241
directional19832785

结论:

  • prohibitory(禁令标志)被误检为mandatory(指示标志)最多(42次),因两者均为圆形蓝底白图案,仅图案细节不同;
  • warning(警告标志)被误检为directional(指路标志)达41次,因部分施工警告牌与指路牌形状相似;
  • 改进方向:对prohibitory/mandatory类别添加CutMix数据增强,或在损失函数中提高这两类的分类权重(--cls_pw 2.0)。

5.2 PR曲线分析:为什么召回率在0.85后断崖式下跌?

运行val后自动生成PR_curve.png,重点观察:

  • prohibitory曲线在Recall=0.85处Precision骤降至0.45(其他类仍>0.7);
  • warning曲线在Recall=0.9时Precision仅0.52,说明大量低置信度误检。

根因排查:

  1. 查看runs/detect/road_signs_nano/val/confusion_matrix_normalized.png,发现warning类有大量background误检(即把背景当警告牌);
  2. 检查test/中warning类图片,发现37%为远距离小目标(<32×32像素),YOLOv8n的neck层感受野不足;
  3. 解决方案:
    • 将imgsz从640提升至1280(需显存≥12GB),mAP50提升至0.85,但推理速度降为12 FPS;
    • 或改用yolov8n-seg.pt(实例分割版),对小目标定位更准,实测mAP50达0.86。

5.3 典型失败案例:三张图看懂路标检测的边界

案例1:强光反射导致漏检

  • 场景:正午阳光直射蓝色禁令标志,反光区域占标志面积60%;
  • 模型输出:无检测框;
  • 修复:在训练前对images/批量添加RandomBrightnessContrast(p=0.5, brightness_limit=0.3, contrast_limit=0.3)(Albumentations库),该增强已内置在scripts/augment_images.py中。

案例2:密集小路标遮挡

  • 场景:高速出口匝道,5个指路牌垂直堆叠,最小尺寸仅24×24像素;
  • 模型输出:仅检测到顶部2个,底部3个漏检;
  • 修复:启用--multi_scale训练(YOLOv8支持),在train命令中加--multi_scale,让模型学习多尺度特征。

案例3:夜间红外图像误检

  • 场景:车载红外摄像头拍摄,路标呈高亮白色块,但周围路面噪点多;
  • 模型输出:将路面噪点误检为warning(置信度0.31);
  • 修复:在val后用--conf 0.4过滤低置信度框,或训练时加入Mosaic增强(已启用)。

5.4 避坑:训练中90%的崩溃源于这五个配置错误

错误1:RuntimeError: CUDA out of memory

现象:训练到第3 epoch,显存爆满,进程被kill。
原因:batch=16在你的GPU上超限(如RTX 3050 4GB)。
解决:立即降为batch=8,或加--device cpu用CPU训练(慢但不死)。

错误2:AssertionError: Image not found

现象:val时大量报错,mAP50=0.0。
原因:road_signs.yaml中val:路径写成./datasets/yolo_split/val(缺/images)。
解决:严格按./datasets/yolo_split/val/images格式填写,用ls命令确认路径存在。

错误3:KeyError: 'prohibitory'

现象:train启动即报错,无法进入epoch 1。
原因:names列表中写了'prohibitory '(末尾有空格),与标签中prohibitory不匹配。
解决:用vim road_signs.yaml检查,删除所有多余空格;或用Python脚本校验:

with open("road_signs.yaml") as f: data = yaml.safe_load(f) assert all(name.strip() == name for name in data["names"]), "names contains space"
错误4:ZeroDivisionError: division by zero

现象:val输出中Box(P)为nan。
原因:val/labels/中某个txt为空(0字节),导致precision计算除零。
解决:运行scripts/clean_empty_labels.py清理空文件:

find ./datasets/yolo_split/val/labels -size 0 -delete
错误5:ModuleNotFoundError: No module named 'ultralytics'

现象:yolo命令无法识别。
原因:pip install ultralytics后未重启终端,或在错误环境中执行。
解决:执行which yolo确认命令路径;若为/usr/bin/yolo,说明装到了系统Python,应pip uninstall ultralytics后在虚拟环境中重装。


6. 工程化部署技巧:如何把训练好的模型集成到OpenCV实时检测流水线

6.1 导出ONNX模型:脱离PyTorch环境,跨平台部署

YOLOv8训练完的best.pt不能直接被OpenCV调用,需转ONNX:

# 导出为ONNX(在YOLO_road_sign_dataset/目录下) yolo export \ model=runs/detect/road_signs_nano/weights/best.pt \ format=onnx \ imgsz=640 \ dynamic=True \ simplify=True

生成runs/detect/road_signs_nano/weights/best.onnx(约12MB)。
关键参数说明:

  • dynamic=True:允许输入图像尺寸动态变化(适配不同分辨率摄像头);
  • simplify=True:用onnxsim工具简化模型,移除冗余节点,提速15%;
  • imgsz=640:指定默认输入尺寸,但dynamic模式下仍可传入320×320或1280×1280。

验证ONNX有效性:运行python scripts/validate_onnx.py --model runs/detect/road_signs_nano/weights/best.onnx,脚本会用随机噪声图前向推理,输出Output shape: (1, 84, 8400)即成功。

6.2 OpenCV DNN模块调用:6行代码实现1080p视频实时检测

# opencv_inference.py import cv2 import numpy as np # 加载ONNX模型 net = cv2.dnn.readNetFromONNX("runs/detect/road_signs_nano/weights/best.onnx") # 读取视频(或摄像头) cap = cv2.VideoCapture("test_video.mp4") # 或 cap = cv2.VideoCapture(0) while cap.isOpened(): ret, frame = cap.read() if not ret: break # 预处理:缩放+归一化+NHWC→NCHW blob = cv2.dnn.blobFromImage(frame, 1/ <p> <a href="https://download.csdn.net/download/m0_64879847/88485984" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询