
简介本资源是一套开箱即用的YOLOv3安全帽检测完整实现方案面向计算机视觉初学者、工业安全智能监控开发者及AI项目落地工程师解决施工现场人员安全装备识别这一典型工业视觉任务。压缩包共166个文件含28个核心Python脚本训练/推理/评估、23个配置类YAML/YML文件模型结构与超参、20张标注JPG样本及对应XML标签、6个预训练PT权重文件以及PR曲线图、mAP统计CSV、TensorBoard日志events文件等结果产出物整体体积546.6MB。已有639人学习下载所有代码适配YOLOv5环境兼容YOLOv3架构无需重新训练即可直接运行检测配套runs文件夹完整保存150轮训练过程中的精度曲线、召回率变化与损失收敛轨迹便于复现高指标mAP与Recall均超90%并开展模型调优分析。1. 项目背景与核心价值最近在整理硬盘时翻出了一个几年前做的老项目——基于YOLOv3的安全帽检测。虽然现在YOLOv8、YOLOv10甚至各种Transformer检测器层出不穷但这个项目在当时以及对于很多刚入门目标检测、想找一个“能跑起来、有实际价值”的练手项目的朋友来说依然有很强的参考意义。安全帽检测是工业安全、智慧工地等场景下一个非常经典且刚需的应用它不像人脸识别那样涉及复杂的伦理隐私问题数据集相对容易获取和标注模型效果也直观可见非常适合作为从“跑通Demo”到“解决实际问题”的桥梁。这个项目包含了完整的YOLOv3模型权重、训练和推理代码以及一个我当年自己收集和标注的数据集。你可能在网上看过很多YOLO教程但很多要么只给代码不给权重要么只给权重不给数据集要么数据集质量参差不齐。我这个项目的价值在于它提供了一个“开箱即用”的完整包你拿到手几分钟内就能看到检测效果同时代码结构清晰注释也比较详细你可以清晰地看到从数据准备、模型训练到模型评估、部署推理的完整链路。这对于理解一个目标检测项目的全生命周期尤其是YOLOv3这个承上启下、结构经典的模型非常有帮助。2. YOLOv3模型架构与在本项目中的适配YOLOv3You Only Look Once version 3是YOLO系列的一个里程碑式版本它奠定了后续很多版本的基础设计思路。很多人学目标检测都从它开始不是没有道理的。它的结构清晰在速度和精度上取得了很好的平衡并且引入的多尺度预测思想影响深远。2.1 核心网络结构Darknet-53与特征金字塔YOLOv3的主干特征提取网络是Darknet-53。这个名字里的“53”指的是它有53个卷积层包含1x1和3x3卷积。相比前代使用的Darknet-19它更深并且大量使用了残差连接Residual Connections。残差连接是解决深层网络梯度消失、便于训练的关键它让网络可以学习输入和输出之间的“残差”而不是直接学习一个复杂的映射。在实际训练安全帽这种小目标时深的网络能提取更丰富、更具判别性的特征尤其是安全帽的轮廓、颜色和与头部的相对位置关系。但仅仅有深的主干网络还不够。安全帽在图像中可能以不同大小出现近处工人的安全帽很大远处工人的安全帽可能只有几十个像素。YOLOv3采用了特征金字塔网络FPN的一种变体来解决多尺度问题。具体来说它在三个不同尺度的特征图上进行预测第1个尺度在主干网络深层输出的特征图下采样32倍上进行预测。这个尺度的特征图语义信息丰富但分辨率低适合检测图像中的大目标。在我们的场景里可能就是画面最前方、占据像素较多的安全帽。第2个尺度将第1个尺度的特征图上采样然后与主干网络中层的特征图下采样16倍进行融合再预测。这个尺度兼顾语义和细节适合检测中等目标。第3个尺度将第2个尺度的特征图上采样与主干网络浅层的特征图下采样8倍进行融合再预测。这个尺度的特征图分辨率最高包含丰富的细节信息最适合检测像远处工人头上那样的小目标。这个多尺度预测机制是YOLOv3能较好地检测不同大小安全帽的关键。在我的项目代码配置中你需要关注cfg文件夹下的配置文件比如yolov3-spp.cfg或yolov3.cfg里面明确定义了这三个预测头[yolo]层分别连接在哪一层以及每个头对应的锚框Anchor尺寸。这些锚框尺寸是需要根据你的数据集聚类得到的我提供的权重已经使用了针对安全帽数据集聚类好的锚框尺寸。2.2 边界框预测与损失函数YOLOv3的每个预测框会输出4个坐标值tx, ty, tw, th、1个客观性得分Objectness score和C个类别置信度对于安全帽检测C2即“安全帽”和“头部”或“人”取决于你的具体类别设计。坐标预测它预测的是相对于该网格单元左上角的偏移量以及相对于预设锚框尺寸的宽高缩放。这种参数化方式比直接回归绝对坐标更稳定。客观性得分预测这个框内包含目标的概率与类别无关。类别置信度使用独立的逻辑回归Sigmoid函数为每个类别预测一个置信度而不是Softmax。这意味着一个框可以同时属于多个类别多标签分类虽然安全帽检测中通常一人一帽是互斥的但这种设计更具灵活性。损失函数由几部分组成坐标损失通常使用均方误差MSE或更优的CIoU Loss来计算预测框与真实框的差异。我提供的代码中可能使用的是MSE但你可以尝试替换为CIoU Loss以获得更好的收敛效果。客观性损失使用二元交叉熵BCE损失判断每个预测框是否包含物体。类别损失同样使用BCE损失计算每个类别的置信度。在训练安全帽数据集时一个常见的挑战是正负样本不均衡。一张图片里可能只有几个戴安全帽的人正样本但模型会生成成千上万个锚框其中绝大部分都是背景负样本。如果直接训练负样本会主导损失函数导致模型对正样本学习不足。YOLOv3通过目标置信度损失只对包含目标的预测框正样本和精选的一部分不含目标的预测框负样本进行计算缓解了这个问题。在代码中这体现在正负样本的筛选逻辑上。2.3 非极大值抑制NMS的后处理模型会为同一个安全帽生成大量重叠的预测框。NMS的作用就是滤除这些冗余框只保留最可靠的一个。其过程简单来说就是将所有预测框按置信度客观性得分 * 最大类别置信度排序。选取置信度最高的框将其加入最终输出列表。计算这个框与剩余所有框的交并比IoU。剔除所有IoU超过某个阈值如0.5的框因为它们很可能和选中的框是同一个物体。重复步骤2-4直到处理完所有框。在utils/general.py或类似的工具文件中你可以找到non_max_suppression函数的实现。这是推理环节至关重要的一步阈值设置得太高如0.7可能导致漏检两个框明明是一个帽子但因为重叠度不够高而被保留了两个设置得太低如0.3则可能误把相邻两个人的帽子当成一个而抑制掉一个。对于安全帽这种通常间距明确的物体0.45-0.5是一个不错的起点。3. 安全帽检测数据集构建详解我提供的这个数据集虽然规模可能比不上一些开源大数据集但贵在“干净”和“有针对性”。它主要来源于网络爬取的工地监控图片和部分公开数据集经过人工清洗和标注。3.1 数据收集与清洗最初的图片来源比较杂质量参差不齐。我制定了几个清洗原则分辨率剔除分辨率低于640x480的图片因为过低的像素不利于小目标检测。场景相关性只保留明确包含建筑工地、工厂车间、电力巡检等需要佩戴安全帽的场景图片。街景、办公室等无关图片一律删除。光照与遮挡适当保留一些背光、阴影、部分遮挡的图片以增加模型的鲁棒性但完全无法辨认的极端情况会剔除。类别平衡确保数据集中既有“佩戴安全帽”的正样本也有“未佩戴安全帽”的负样本即头部区域。这对于模型学习“什么是安全帽”以及“什么情况下需要报警未佩戴”至关重要。3.2 标注规范与工具标注采用PASCAL VOC格式的XML文件这也是当时最通用的格式之一。每个XML文件对应一张图片里面记录了图片尺寸、每个目标安全帽的类别名和边界框坐标xmin, ymin, xmax, ymax。标注时有几个关键细节框的紧密度边界框应尽可能紧密地贴合安全帽的边缘但可以稍微外扩1-2个像素避免因为标注误差导致模型学习到“框必须严丝合缝”的坏习惯。遮挡处理对于被部分遮挡的安全帽只要可见部分超过50%且能明确判断它是一个安全帽就应该标注。框体仅包含可见部分。微小目标对于远处极小的安全帽比如小于20x20像素标注时需要格外仔细。这类目标对模型挑战极大但又是实际监控中常见的漏检点。我选择保留并标注它们但在训练时会通过数据增强如Mosaic来帮助模型学习。类别定义本项目只定义了一个类别hardhat安全帽。有些人会把“人”或“头部”也作为一个类别进行关联检测。我这里简化了只检测安全帽本身。检测到安全帽即视为合规未检测到则报警。这种设计更直接但无法区分“没戴帽子的人”和“背景”后续可以在此基础上扩展。标注工具我使用的是LabelImg它开源免费支持PASCAL VOC和YOLO格式。在标注了几百张后我写了一个简单的脚本将VOC XML格式转换成了YOLO格式的txt文件每个txt文件一行一个目标格式为class_id x_center y_center width height坐标和宽高都是相对于图片宽高的归一化值。YOLO格式更节省空间也是训练时直接读取的格式。3.3 数据集划分与配置文件准备清洗标注完成后我按大约8:1:1的比例随机划分了训练集、验证集和测试集。训练集用于模型参数更新。验证集在训练过程中每隔一定epoch评估一次用于监控模型是否过拟合、调整超参数如学习率。测试集在模型训练完成后进行一次性的最终评估得到最能代表模型泛化能力的指标如mAP。测试集在训练过程中绝对不能被使用。划分好后需要创建两个关键的配置文件data/hardhat.data这个文件指明了类别数、训练集/验证集列表文件的路径、类别名称文件的路径以及预训练权重和模型保存的目录。classes1 traindata/train.txt validdata/val.txt namesdata/hardhat.names backupbackup/data/hardhat.names一个简单的文本文件每行一个类别名。hardhattrain.txt和val.txt里面是训练集和验证集图片的绝对路径或相对于可执行文件的相对路径每行一个。这些文件看似简单但路径错误是新手训练时最常见的“坑”之一。务必确保这些文件中的路径在你的运行环境下是有效的。4. 模型训练全流程与调参心得有了数据和模型结构训练就是下一个重头戏。我提供的代码基于PyTorch训练脚本通常叫train.py。4.1 环境搭建与依赖安装首先需要一个Python环境3.7或3.8比较稳定然后安装PyTorch。根据你的CUDA版本去 PyTorch官网 获取安装命令。例如对于CUDA 11.3pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113然后安装其他依赖pip install opencv-python matplotlib tqdm scipy pycocotools tensorboard注意PyTorch版本与CUDA、cuDNN的兼容性非常重要。如果遇到奇怪的错误首先检查版本匹配。对于这个老项目不建议使用太新的PyTorch如2.0可能会遇到接口变更的问题。4.2 训练启动与核心参数解析训练命令通常如下python train.py --data data/hardhat.data --cfg cfg/yolov3-spp.cfg --weights weights/yolov3-spp.weights --epochs 100 --batch-size 16 --img-size 640我们来拆解关键参数--data: 指定上一步创建的.data配置文件。--cfg: 指定模型结构配置文件。我提供了yolov3.cfg和yolov3-spp.cfg。SPPSpatial Pyramid Pooling模块能提升模型对不同尺寸目标的鲁棒性通常效果更好推荐使用。--weights:加载预训练权重。这是加速收敛、提升效果的关键一步。这里加载的是在ImageNet上预训练的Darknet-53权重.weights文件。从预训练模型开始相当于让模型已经有了强大的特征提取先验知识我们只需要微调fine-tune它适应安全帽检测任务即可。千万不要从零开始训练那会耗费大量时间且效果难以保证。--epochs: 训练轮数。100轮对于安全帽数据集通常是一个合理的起点可以通过观察验证集损失曲线决定是否早停。--batch-size: 批大小。取决于你的GPU显存。显存小如8G可以设为8或16显存大可以设32甚至64。更大的batch size通常训练更稳定但可能会轻微影响泛化能力。--img-size: 输入图片的尺寸。YOLOv3要求是32的倍数。640是一个常用的尺寸在精度和速度间取得平衡。你也可以尝试416或832。4.3 训练过程监控与调试启动训练后控制台会打印每个batch的损失。但更重要的监控工具是TensorBoard。训练脚本会自动生成日志通过以下命令启动TensorBoardtensorboard --logdir runs然后在浏览器打开localhost:6006。你需要重点关注以下几个图表损失曲线Losstrain/box_loss,train/obj_loss,train/cls_loss: 分别对应坐标损失、客观性损失、类别损失。理想情况下它们都应该随着训练稳步下降最后趋于平缓。val/box_loss等验证集损失。它应该随着训练集损失一起下降。如果训练集损失持续下降但验证集损失在某个点后开始上升这是典型的过拟合信号。意味着模型只记住了训练数据而没学会泛化。评估指标Metricsmetrics/mAP0.5: 这是最核心的指标表示在IoU阈值为0.5时的平均精度mean Average Precision。对于安全帽检测这个值达到0.85以上就算不错0.9以上就很优秀了。metrics/precision,metrics/recall: 精确率和召回率。高精确率意味着模型报的警很少误报把别的物体当成安全帽高召回率意味着很少漏报没检测到该戴的安全帽。在实际应用中通常需要在两者间权衡。工地安全可能更看重召回率宁可误报不可漏报。学习率Learning Rate如果使用了学习率调度器如余弦退火可以观察学习率的变化是否符合预期。我的调参心得学习率lr这是最重要的超参数。对于微调任务初始学习率不宜太大通常设置在1e-3到1e-4之间。我一般从3e-4开始。如果训练初期损失剧烈震荡或变成NaN说明学习率太大了需要调小。数据增强代码中默认会启用一些数据增强如随机翻转、色彩抖动、Mosaic等。Mosaic增强对于小目标检测如远处的安全帽特别有效它把四张图片拼成一张增加了单张图片中目标的密度和上下文信息强烈建议开启。但如果你的数据集本身质量很高、场景单一过强的增强有时反而有害可以适当调整增强参数或关闭一部分。早停Early Stopping如果验证集损失连续10-20个epoch不再下降甚至上升就可以考虑停止训练了继续训练只会导致过拟合。手动观察TensorBoard并决定停止时机比固定epoch数更科学。权重保存代码通常会保存最后一代的权重和效果最好mAP最高的权重。部署时应使用效果最好的权重best.pt。5. 模型评估、推理与部署实践训练完成后我们需要知道模型到底好不好用以及怎么用。5.1 模型评估与性能指标解读使用test.py或val.py脚本在测试集上评估模型python test.py --data data/hardhat.data --weights runs/exp/weights/best.pt --img 640脚本会输出一系列指标除了上面提到的mAP0.5还有mAP0.5:0.95在IoU阈值从0.5到0.95步长0.05区间内计算的平均mAP。这是一个更严格的指标要求预测框与真实框的重合度非常高。对于安全帽检测这个值通常会比mAP0.5低不少。推理速度FPS在指定硬件和图片尺寸下模型每秒能处理多少张图片。这对于实际部署尤其是视频流处理至关重要。在GPU上YOLOv3处理640x640图片达到几十FPS是很容易的。每类别的APAverage Precision因为我们只有一个类别所以就是安全帽的AP。在多类别任务中这个可以帮你分析模型对哪个类别检测得不好。评估还会生成一个results.png图像里面有精确率-召回率曲线PR Curve。曲线下的面积就是AP。一个好的模型其PR曲线应该尽可能靠近右上角。5.2 单张图片与视频流推理训练好的模型最终要用于预测。detect.py脚本通常用于推理。单张图片推理python detect.py --source data/sample.jpg --weights runs/exp/weights/best.pt --img-size 640 --conf-thres 0.5 --iou-thres 0.5--source: 可以是一张图片、一个包含图片的文件夹、一个视频文件、或者摄像头ID如0。--conf-thres:置信度阈值。只有预测框的置信度高于此值才会被显示。提高这个值如0.7可以让结果更“可靠”减少误报但可能增加漏报。需要根据实际场景调整。--iou-thres:NMS的IoU阈值。前面已经解释过。视频流或摄像头推理python detect.py --source 0 --weights best.pt --img-size 416 # 使用摄像头 python detect.py --source test_video.mp4 --weights best.pt # 处理视频文件处理视频时关注实时FPS。如果FPS过低如低于10可以考虑降低--img-size如降到416或者使用更轻量的模型但可能会牺牲精度。5.3 模型部署与优化思路将PyTorch模型直接用于生产环境有时不够高效。可以考虑以下部署方案TorchScript导出使用PyTorch的torch.jit.trace或torch.jit.script将模型导出为TorchScript格式。这是一个序列化的、与Python解耦的模型表示可以在C等环境中用LibTorch库加载性能更好。import torch model torch.load(best.pt, map_locationcpu)[model].float() model.eval() example torch.rand(1, 3, 640, 640) traced_script_module torch.jit.trace(model, example) traced_script_module.save(yolov3_hardhat.pt)ONNX导出ONNX是一种开放的模型交换格式。将PyTorch模型导出为ONNX后可以使用ONNX Runtime进行推理它在某些硬件上可能有优化。也可以进一步转换为其他框架的格式如TensorRT, OpenVINO。python models/export.py --weights best.pt --img-size 640 640 --batch-size 1这个命令可能会同时生成TorchScript和ONNX模型。TensorRT加速针对NVIDIA GPU如果你在NVIDIA Jetson边缘设备或服务器上部署TensorRT能提供极大的性能提升。流程是PyTorch - ONNX - TensorRT。这个过程涉及模型转换、层融合、精度校准FP16/INT8能显著降低延迟提高吞吐量。不过INT8量化可能需要一个校准数据集并且可能会带来轻微的精度损失。OpenVINO优化针对Intel CPU/GPU如果你在Intel平台上部署OpenVINO工具套件是首选。它也能对模型进行优化和压缩提升在CPU或集成显卡上的推理速度。部署时的注意事项预处理和后处理一致性部署环境的图片预处理归一化、BGR转RGB等必须和训练时完全一致。后处理NMS的参数IoU阈值、置信度阈值也需要保持一致或根据场景微调。内存与显存管理在嵌入式设备上内存和显存是宝贵资源。选择适当的输入尺寸和批处理大小至关重要。批处理大小为1通常是实时流处理的选择。多线程与流水线对于多路视频流可以考虑使用生产者-消费者模式将视频解码、预处理、推理、后处理、结果绘制/发送放在不同的线程中形成流水线充分利用多核CPU和GPU。6. 项目代码结构梳理与二次开发指南我提供的代码库通常遵循一个清晰的目录结构理解它有助于你进行定制和二次开发。yolov3-hardhat-detection/ ├── cfg/ # 模型配置文件目录 │ ├── yolov3.cfg │ └── yolov3-spp.cfg ├── data/ # 数据配置文件目录 │ ├── hardhat.data │ ├── hardhat.names │ ├── train.txt │ ├── val.txt │ └── samples/ # 示例图片 ├── weights/ # 预训练权重目录 │ └── yolov3-spp.weights ├── runs/ # 训练输出目录训练后生成 │ └── exp/ # 实验文件夹 │ ├── weights/ # 保存的模型权重best.pt, last.pt │ └── ... # TensorBoard日志等 ├── models/ # 模型定义文件 │ ├── common.py # 通用模块Conv, SPP, Bottleneck等 │ ├── yolo.py # YOLO层、检测头定义 │ └── experimental.py # 实验性模块 ├── utils/ # 工具函数 │ ├── datasets.py # 数据加载与增强 │ ├── general.py # 通用函数NMS, 画框, 指标计算等 │ ├── torch_utils.py # PyTorch相关工具 │ └── ... ├── train.py # 主训练脚本 ├── test.py # 评估脚本 ├── detect.py # 推理脚本 ├── requirements.txt # 依赖包列表 └── README.md # 项目说明如何进行二次开发修改检测类别如果你想检测“安全帽”和“反光衣”两个类别。修改data/hardhat.names增加一行vest。修改data/hardhat.data中的classes2。重新标注你的数据集在YOLO格式的txt文件中class_id0代表hardhat1代表vest。修改模型配置文件.cfg。找到每个[yolo]层之前的[convolutional]层其filters参数决定了输出通道数。计算公式为filters (classes 5) * 3。对于2个类别filters (25)*3 21。你需要将所有三个[yolo]层对应的前置卷积层的filters都改为21。这是最容易出错的一步尝试不同的数据增强在utils/datasets.py中可以找到数据增强的代码。你可以增加或删除某些增强比如增加随机裁剪RandomCrop、调整色调饱和度HueSaturation的强度等。对于安全帽颜色是一个重要特征所以色彩抖动不宜过强。修改损失函数在utils/loss.py中可以尝试将框回归损失从MSE改为CIoU Loss或DIoU Loss这通常能带来更好的收敛速度和定位精度。集成到你的应用最直接的方式是封装detect.py中的推理逻辑。你可以创建一个类在初始化时加载模型然后提供一个predict(image)方法输入numpy格式的图片返回检测框的列表。这样你就可以在Web后端Flask/Django、桌面应用或ROS节点中调用这个类了。7. 常见问题排查与实战避坑指南在实际运行这个项目时你几乎一定会遇到一些问题。这里我总结了一些最常见的“坑”和解决办法。7.1 环境配置与依赖问题问题ImportError: No module named torch或类似错误。解决仔细检查PyTorch安装命令是否与你的CUDA版本匹配。使用python -c import torch; print(torch.__version__); print(torch.cuda.is_available())验证安装和CUDA是否可用。问题训练时GPU显存溢出CUDA out of memory。解决减小--batch-size。如果已经减小到1还是溢出尝试减小--img-size如从640降到416。也可以检查代码中是否有不必要的张量被长期保存在内存中。7.2 数据与路径问题问题训练时提示No labels found或Could not load image。解决这是最高发的问题。99%的原因出在路径上。检查train.txt和val.txt文件里面的图片路径是绝对路径还是相对路径是否与当前工作目录匹配检查图片文件是否真实存在于该路径下并且文件没有损坏。检查每个图片对应的标注文件.txt是否存在并且格式正确每行class_id x_center y_center width height数值在0-1之间。在Linux/macOS下注意路径分隔符是/在Windows下是\但在代码中通常使用/或os.path.join能兼容。建议在代码开头打印出几条正在加载的图片和标签路径进行确认。7.3 训练过程问题问题训练损失loss一开始就是NaN或者训练几个iteration后变成NaN。解决学习率太大这是最常见原因。立即停止训练将学习率降低一个数量级如从1e-3降到1e-4再试。数据有问题检查标注数据。是否存在坐标超出0-1范围是否存在宽高为0的无效框在datasets.py的数据加载部分添加断言或过滤条件。梯度爆炸可以尝试在配置文件中添加梯度裁剪gradient clipping或者在训练命令中添加--clip-grad参数如果代码支持。问题训练集损失持续下降但验证集损失很早就开始上升mAP也不增长。解决这是典型的过拟合。增加数据增强启用或加强Mosaic、MixUp等增强。使用正则化在配置文件中可以尝试调大decay权重衰减参数。减少模型复杂度如果数据集很小几百张使用完整的YOLOv3可能太复杂了。可以尝试减少模型宽度或深度修改cfg文件中的filters和number参数或者使用更小的模型如YOLOv3-tiny。早停根据验证集损失提前停止训练。问题mAP一直很低徘徊在0.2-0.3。解决锚框不匹配YOLOv3使用的锚框anchors是针对COCO数据集聚类的可能不适合你的安全帽数据集。使用utils/kmeans.py脚本如果提供对你的数据集标注框重新进行聚类生成9个新的锚框尺寸并更新配置文件中的[yolo]层下的anchors参数。这一步对提升小目标检测精度尤其有效。数据质量差重新检查数据集。是不是有很多错误标注目标是否太小、太模糊是否需要补充更多困难样本类别不平衡如果“未佩戴”的样本远少于“佩戴”的样本模型可能对“未佩戴”不敏感。可以尝试在损失函数中为“未佩戴”类别增加权重或者使用过采样技术。7.4 推理与部署问题问题推理速度很慢FPS很低。解决确保在GPU上运行python detect.py --device 0。降低输入图片尺寸--img-size。使用半精度FP16推理。如果代码支持在推理时添加--half参数。如前面所述考虑使用TensorRT或OpenVINO进行模型转换和优化。问题检测框很多但置信度都很低或者同一个目标被重复检测多次。解决调整--conf-thres和--iou-thres。提高置信度阈值可以过滤掉不可信的框。调整NMS的IoU阈值可以控制框去重的严格程度。对于安全帽由于目标通常不会严重重叠IoU阈值可以设得稍低一些如0.4以避免误抑制。这个基于YOLOv3的安全帽检测项目虽然技术不是最新的但它像一本经典的教科书涵盖了从数据准备、模型理解、训练调优到评估部署的完整流程。通过亲手实践并解决其中遇到的各种问题你对目标检测的理解会远比只读论文或跑通一个现成的Demo要深刻得多。模型和代码只是工具真正有价值的是你在这个过程中积累的解决实际问题的思路和方法。本文还有配套的精品资源点击获取