ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OpenCV samples/dnn 深度学习推理示例指南:模型动物园、models.yml 预处理参数与模型权重下载实战

OpenCV samples/dnn 深度学习推理示例指南:模型动物园、models.yml 预处理参数与模型权重下载实战 OpenCV samples/dnn 深度学习推理示例指南模型动物园、models.yml 预处理参数与模型权重下载实战【免费下载链接】opencvOpen Source Computer Vision Library项目地址: https://gitcode.com/GitHub_Trending/opencv31/opencvOpenCV 自 3.x 起内置了高性能的深度学习推理模块modules/dnn并在 samples/dnn 目录下提供了一批开箱即用的推理示例覆盖目标检测、图像分类、语义分割、人脸检测、OCR、姿态估计、目标跟踪、图像生成等多个方向。本文以仓库中的 samples/dnn/README.md 为主体脉络系统讲解「模型动物园Model Zoo」的组成、models.yml 中不同模型的预处理参数约定、download_models.py 的下载与哈希校验机制并结合源码深入剖析 OpenCV Face Detector 示例模型的量化细节与 FDDB 精度评估。读完本文你将能够正确地下载模型、解读预处理参数、并独立运行各个 DNN 示例脚本。samples/dnnOpenCV 深度学习推理示例全景samples/dnn是 OpenCV 官方维护的 DNN 推理示例集合。绝大多数示例都提供了Python 与 C 双版本如object_detection.py/object_detection.cpp、classification.py/classification.cpp、segmentation.py/segmentation.cppC 版本通过目录下的 CMakeLists.txt 以ocv_define_sample方式逐一注册为可执行示例。从文件名即可看出示例覆盖的任务范围目标检测object_detection.py、face_detect.py、mask_rcnn.py图像分类classification.py语义分割 / 人体解析segmentation.py、human_parsing.py姿态估计openpose.py、person_reid.py、object_tracker.py、siamrpnpp.pyOCR 文字检测与识别text_detection.py、text_recognition.py同名脚本为动作识别图像生成与修复fast_neural_style.py、inpainting.py、ldm_inpainting.py其他super_resolution.py、deblurring.py、alpha_matting.py、auto_white_balance.py 等。除推理脚本外目录中还包含用于把TensorFlow Object Detection API训练产出的检测模型转换为 OpenCV 文本图text graph的系列工具例如 tf_text_graph_common.py、tf_text_graph_ssd.py、tf_text_graph_faster_rcnn.py、tf_text_graph_mask_rcnn.py以及权重瘦身脚本 shrink_tf_graph_weights.py。这些示例共同依赖的核心下载与参数解析设施正是本文接下来要讲解的重点。Model ZooOpenCV DNN 能跑的模型来自哪里由于模型训练成本高且文件体积大仓库并不内置模型权重而是通过「模型清单 下载脚本」的方式按需获取。OpenCV 官方维护了一份已测试模型清单见官方 Wiki 的 “Deep Learning in OpenCV”凡是清单内的模型OpenCV DNN 均验证过可正确加载与推理。此外若构建 OpenCV 时启用了 Intel 的 Inference EngineOpenVINO后端支持那么也可以直接使用 Intel 提供的预训练模型open_model_zoo。这一点与示例脚本中的--backend参数直接对应——在 object_detection.py 中可以看到可选的 backend/target 枚举backenddefault自动、openvinoIntel DL Inference Engine、opencvOpenCV 自身实现、vkcom、cudatargetcpu、opencl、opencl_fp16、ncs2_vpu、hddl_vpu、vulkan、cuda、cuda_fp16。脚本通过 common.py 中的get_backend_id()/get_target_id()把字符串映射为cv.dnn.DNN_BACKEND_*与cv.dnn.DNN_TARGET_*枚举后交给net.setPreferableBackend()/net.setPreferableTarget()。关键点在于不同模型对输入图像的预处理要求差异极大均值减法、缩放因子、输入尺寸、通道顺序各不相同因此 OpenCV 把这些差异集中维护在一个 YAML 配置文件中这就是下一节的主角models.yml。models.yml不同模型的预处理参数与模型别名配置中心仓库内已收录的模型及其预处理参数全部记录在 samples/dnn/models.yml 中531 行按任务分节组织目标检测、分类、分割、文字检测、边缘检测、ReID、跟踪、修复、Macbeth 色卡检测、去模糊、抠图、超分、自动白平衡等。其作用正如 README 所言提供不同模型的预处理参数并用于为示例脚本的参数提供别名alias默认值。一个条目的完整字段解析以目标检测中的ssd_caffe条目为例models.ymlssd_caffe: load_info: url: https://github.com/PINTO0309/MobileNet-SSD-RealSense/raw/refs/heads/master/caffemodel/MobileNetSSD/MobileNetSSD_deploy.caffemodel sha1: 994d30a8afaa9e754d17d2373b2d62a7dfbaaf7a model: MobileNetSSD_deploy.caffemodel config_load_info: url: https://github.com/PINTO0309/MobileNet-SSD-RealSense/raw/refs/heads/master/caffemodel/MobileNetSSD/MobileNetSSD_deploy.prototxt sha1: 25c8404cecdef638c2bd9ac7f3b46a8b96897deb config: MobileNetSSD_deploy.prototxt mean: [127.5, 127.5, 127.5] scale: 0.007843 width: 300 height: 300 rgb: false labels: object_detection_classes_pascal_voc.txt postprocessing: ssd sample: object_detection各字段含义如下表字段含义典型值/说明load_info.url权重文件的下载地址支持普通 HTTP(S)Google Drive 地址会被自动识别走专用下载逻辑load_info.sha1权重文件的 SHA-1 校验值下载/复用前先比对防篡改并支持缓存去重load_info.download_sha/download_name/member当下载源是一个 tar 归档时归档自身的 SHA-1、文件名及需要解压出的成员路径见ssd_tf、faster_rcnn_tf、East等条目model权重文件在本地的文件名.caffemodelCaffe、.pbTensorFlow、.onnx、.binOpenVINO等config/config_load_info网络结构文本文件及其下载信息.prototxtCaffe、.pbtxt/.configTensorFlow、.xmlOpenVINOmean均值减法向量按 BGR 顺序如 SSD-MobileNet 用[127.5,127.5,127.5]GoogLeNet 用[103.939, 116.779, 123.675]std标准差归一化向量分类模型常用如 ResNet 的[58.395, 57.12, 57.375][0,0,0]表示不做scale缩放因子像素乘数常为0.00392≈1/255、0.007843≈1/127.5或1.0width/height网络要求的输入分辨率YOLOv8 为 640×640SSD-MobileNet 为 300×300rgb网络是否期望 RGB 输入OpenCV 读入为 BGRrgb: true时需swapRB交换通道labels类别名文本文件文件名对应 samples/data/dnn 目录下的object_detection_classes_coco.txt、object_detection_classes_pascal_voc.txt、object_detection_classes_yolo.txt、classification_classes_ILSVRC2012.txt等postprocessing后处理类型ssd、yolov4、yolov8、yolov5等决定解码输出 blob 的方式sample该模型归属于哪个示例object_detection、classification、segmentation、text_detection等预处理参数为何因模型而异不同训练框架产出的模型对输入约定不同这在models.yml中体现得非常直观YOLO 系列yolov8x、yolov4、yolov5l等像素值缩放到[0,1]scale: 0.00392输入 RGBrgb: true输入 640×640 或 416×416SSD-Caffe输入 BGRrgb: falsemean: [127.5,127.5,127.5]、scale: 0.007843把像素先乘以 1/127.5 再减 127.5得到[-1,1]区间ImageNet 分类模型squeezenet、resnet按 PyTorch 的标准化惯例同时提供mean与stdImageNet 均值/标准差输入 RGBGoogLeNet/Caffe 系googlenet 只做 BGR 通道均值减法[103.939, 116.779, 123.675]std: [1,1,1]。这些参数在运行时通过cv.dnn.blobFromImage生效。以 object_detection.py 为例blob cv.dnn.blobFromImage(frame, scalefactorargs.scale, meanargs.mean, size(inpWidth, inpHeight), swapRBargs.rgb, ddepthcv.CV_32F)其中swapRBargs.rgb的作用正是处理「模型要 RGB 但 OpenCV 读到 BGR」的通道顺序问题。值得留意的是有些 YOLO 模型在 ONNX 导出时已经内置了归一化缩放已编码进网络因此models.yml中仍保留scale: 0.00392属于该 YAML 约定下的取值一切以对应条目为准。通过别名alias使用模型参数models.yml的第二大用途是为示例脚本提供「别名默认值」。以目标检测示例为例python object_detection.py opencv_fd --model /path/to/model.onnx模型别名如opencv_fd作为第一个位置参数传入后脚本会在models.yml中查找同名条目并用其中的model/config/mean/scale/width/height/rgb/labels/postprocessing/sha1填充命令行参数默认值。运行-h即可查看当前生效的默认值以及该示例支持的全部别名python object_detection.py opencv_fd -h这一机制由 common.py 的add_preproc_args()实现它先用cv.FileStorage打开 YAMLOpenCV 原生支持读取 YAML 文件遍历根节点把sample字段等于当前示例名的条目收集为候选别名choices随后为每个预处理参数--model、--config、--mean、--std、--scale、--width、--height、--rgb、--labels、--postprocessing、--sha1等从所选别名节点读取默认值。说明别名列表是运行时从本地models.yml动态解析的因而不同 checkout 版本支持的别名集合可能不同。例如本文档示例中的opencv_fd别名在当前仓库的 models.yml 中并未收录OpenCV Face Detector 的下载信息实际记录在 face_detector/weights.meta4 中。若运行时报 “invalid choice” 或提示缺少模型请先用-h查看当前文件实际暴露的别名如yolov8、ssd_caffe或直接通过--model、--config传入本地路径。下载示例模型download_models.py 命令行用法模型权重通过 samples/dnn/download_models.py 下载。README 给出的示例是python download_models.py --save_dir FaceDetector opencv_fd该命令会下载 OpenCV Face Detector 的网络权重并存储到FaceDetector目录中。脚本的 CLI 定义见 download_models.py--save_dir存储目录默认是当前工作目录defaultos.getcwd()model_name可选位置参数指定要下载的模型名模型清单来源有两个face_detector/weights.meta4Metalink XML 格式通过parseMetalinkFile()解析models.ymlYAML 格式通过parseYAMLFile()解析。从主流程源码结构看若不带任何模型名直接运行python download_models.py则会遍历并下载 meta4 与 YAML 中列出的全部模型——数据集较大请谨慎操作建议总是显式指定模型名如不熟悉有哪些可选名称可先运行一次不带参数的脚本查看它打印出的完整模型清单produceDownloadInstance生成的实例列表。下载过程内建了较强的健壮性机制SHA-1 完整性校验checkHashsum()download_models.py先比对期望 SHA-1 与本地文件实际 SHA-1不匹配且非静默时会抛出HashMismatchException缓存去重文件按save_dir/sha1/filename布局存放download_models.py。已存在且哈希匹配时直接跳过下载打印hash match - file already exists, skipping归档自动解压当下载源是 tar.gz 时Loader.extract()从归档中解出member指定的网络文件避免整包落地见ssd_tf、faster_rcnn_tf条目的download_name/download_sha/member设计Google Drive 适配produceDownloadInstance()download_models.py检测到drive.google.com地址时自动改用GDriveLoader处理大文件下载确认 token。在自有代码中集成模型下载downloadFile 编程接口download_models.py同时提供了可供第三方代码复用的函数式 API——downloadFile模块导出__all__ [downloadFile]。README 中的完整示例为from download_models import downloadFile filepath1 downloadFile(https://huggingface.co/onnxmodelzoo/ssd_mobilenet_v1_12/resolve/main/ssd_mobilenet_v1_12.onnx, None, filenamessd_mobilenet_v1_12.onnx, save_dirsave_dir_1) filepath2 downloadFile(https://huggingface.co/onnxmodelzoo/ssd_mobilenet_v1_12/resolve/main/ssd_mobilenet_v1_12.onnx, 83536889adce1eda154175f8e3b156dd20443631, filenamessd_mobilenet_v1_12.onnx) print(filepath1) print(filepath2) # Your code随后运行OPENCV_DOWNLOAD_DATA_PATH指向下载缓存目录两次调用都会得到ssd_mobilenet_v1_12.onnx文件export OPENCV_DOWNLOAD_DATA_PATHdownload_folder python your_script.pydownloadFile(url, shaNone, save_dirNone, filenameNone)定义见 download_models.py的参数语义如下参数说明url必填文件下载地址sha可选期望的 SHA-1。提供后文件会存入save_dir/sha/filename并在下载完成后强制校验失败抛HashMismatchException再次调用时若哈希匹配则直接复用本地文件、不再联网filename可选保存文件名缺省时会自动生成download_时间戳名称因此实际使用中强烈建议显式指定save_dir可选保存目录。README 注释说明可用save_dir或OPENCV_SAVE_DIR环境变量指定而就当前仓库实现而言未传save_dir时由getSaveDir()download_models.py决定默认目录它读取的环境变量是OPENCV_DOWNLOAD_DATA_PATH其次依平台回退到系统缓存目录macOS 的TMPDIR、Linux 的XDG_CACHE_HOME/~/.cache、Windows 的临时目录等。若想精确控制直接在调用时传save_dir最可靠当sha为None时DownloadInstance.get()会在下载完成后计算实际 SHA-1并把文件移动到新建的save_dir/实际sha/子目录后返回其路径download_models.py。函数返回值即为最终文件路径可直接交给cv.dnn.readNet使用。下载到的缓存目录布局缓存根/sha1/文件名与示例脚本的模型查找逻辑是一一对应的findModel()common.py会依次在「当前路径 → OpenCV samples 数据目录 →OPENCV_DOWNLOAD_CACHE_DIR/sha1/文件 →OPENCV_DOWNLOAD_CACHE_DIR/文件」中定位权重找不到时抛出FileNotFoundError并给出环境变量配置提示。Face Detection 示例模型量化细节与 FDDB 精度README 以「Face detection」为专题详解了随仓库分发的示例人脸检测模型其所有配套文件集中在 samples/dnn/face_detector 目录deploy.prototxt/deploy_lowres.prototxtCaffe 部署网络结构deploy_lowres为低分辨率版本opencv_face_detector.pbtxtTensorFlow 文本图图中首节点为dataPlaceholder输入DT_FLOATtrain.prototxt/test.prototxt/solver.prototxt训练与测试网络及求解器配置how_to_train_face_detector.txt训练说明——模型基于SSD 框架 ResNet-10 骨干卷积通道数大幅缩减 2~4 倍使用 Caffe 的ssd分支训练数据按 PASCAL VOC 格式整理并转成 LMDBweights.meta4权重元数据内含两个可下载身份opencv_face_detector_fp16res10_300x300_ssd_iter_140000_fp16.caffemodelSHA-131fc22bf…opencv_face_detector_uint8opencv_face_detector_uint8.pbTensorFlow 图SHA-14f2fdf6f…。README 指出原始 FP32/FP16 单精度权重模型使用 TensorFlow 框架量化成了 UINT8仓库modules/dnn/misc下保留了对应量化脚本 quantize_face_detector.py。若要获得最佳精度需要对BGR 图像 resize 到 300×300并对蓝、绿、红三个通道分别做 (104, 177, 123) 的均值减法。FDDB 上的精度评估结果以下精度指标由 COCO 目标检测评估工具在 FDDB 数据集上测得评估脚本位于 modules/dnn/misc/face_detector_accuracy.py支持通过--proto/--model指定网络、--fddb/--wider选择数据集分别对比了「resize 到 300×300」与「保持原图尺寸」两种模式下 FP32/FP16 与 UINT8 的差异AP - Average Precision | FP32/FP16 | UINT8 | FP32/FP16 | UINT8 | AR - Average Recall | 300x300 | 300x300 | any size | any size | --------------------------------------------------|-----------|----------------|-----------|----------------| AP [ IoU0.50:0.95 | area all | maxDets100 ] | 0.408 | 0.408 | 0.378 | 0.328 (-0.050) | AP [ IoU0.50 | area all | maxDets100 ] | 0.849 | 0.849 | 0.797 | 0.790 (-0.007) | AP [ IoU0.75 | area all | maxDets100 ] | 0.251 | 0.251 | 0.208 | 0.140 (-0.068) | AP [ IoU0.50:0.95 | area small | maxDets100 ] | 0.050 | 0.051 (0.001) | 0.107 | 0.070 (-0.037) | AP [ IoU0.50:0.95 | areamedium | maxDets100 ] | 0.381 | 0.379 (-0.002) | 0.380 | 0.368 (-0.012) | AP [ IoU0.50:0.95 | area large | maxDets100 ] | 0.455 | 0.455 | 0.412 | 0.337 (-0.075) | AR [ IoU0.50:0.95 | area all | maxDets 1 ] | 0.299 | 0.299 | 0.279 | 0.246 (-0.033) | AR [ IoU0.50:0.95 | area all | maxDets 10 ] | 0.482 | 0.482 | 0.476 | 0.436 (-0.040) | AR [ IoU0.50:0.95 | area all | maxDets100 ] | 0.496 | 0.496 | 0.491 | 0.451 (-0.040) | AR [ IoU0.50:0.95 | area small | maxDets100 ] | 0.189 | 0.193 (0.004) | 0.284 | 0.232 (-0.052) | AR [ IoU0.50:0.95 | areamedium | maxDets100 ] | 0.481 | 0.480 (-0.001) | 0.470 | 0.458 (-0.012) | AR [ IoU0.50:0.95 | area large | maxDets100 ] | 0.528 | 0.528 | 0.520 | 0.462 (-0.058) |从表中可以得到几个工程层面的结论括号内为与 FP32/FP16 相比的差值固定 300×300 输入时UINT8 与 FP32/FP16 精度几乎无损多数指标差值在 ±0.002 以内说明该模型在目标输入尺寸下量化非常成功任意尺寸输入时量化损失更明显APIoU0.75下降 0.068APlarge下降 0.075说明 UINT8 模型对输入尺寸更敏感尤其影响大目标的高 IoU 定位精度输入尺寸本身影响显著对小目标small area而言任意尺寸输入的 AP/AR 反而明显高于强制 300×300如ARsmall由 0.189 提升至 0.284这是因为原图中未被过度缩小的目标保留了更多细节。这提示实践者量化为 UINT8 可换取更低内存占用与更快推理但应尽量让推理输入贴近训练时的 300×300 约定。此外当前仓库还提供了更现代的纯 OpenCV 人脸管线示例 face_detect.py基于cv.FaceDetectorYNYuNet 检测输入尺寸可动态设置与cv.FaceRecognizerSFSFace 识别支持 COSINE 与 NormL2 两种比对度量的组合实现双图人脸比对detect → alignCrop → feature → match阈值参数score_threshold0.85、nms_threshold0.3、余弦相似度 0.363 等均在脚本头部可调。继续深入仓库内相关资源清单围绕本文内容可进一步查阅以下仓库文件模型参数总表samples/dnn/models.yml下载脚本及其编程 APIsamples/dnn/download_models.py示例参数/预处理解析与模型查找samples/dnn/common.pyFace Detector 全部配套文件网络结构、meta4 下载清单、训练说明samples/dnn/face_detectorFDDB/WIDER 精度评估脚本modules/dnn/misc/face_detector_accuracy.py量化脚本modules/dnn/misc/quantize_face_detector.py类别名文本COCO/YOLO/Pascal VOC/ILSVRC2012 等samples/data/dnnTensorFlow 检测模型转 OpenCV 文本图工具tf_text_graph_ssd.py、tf_text_graph_faster_rcnn.py、tf_text_graph_mask_rcnn.py各推理示例的 Python 与 C 双版本脚本见 samples/dnn 目录整体。实战建议先在models.yml中选定与你任务匹配的sample模型别名用python download_models.py --save_dir 目录 别名拉取权重推荐固定save_dir并复用缓存再用python sample脚本 别名 -h确认该模型实际生效的预处理默认值必要时以--mean、--scale、--rgb等参数覆盖即可完成一次规范的 OpenCV DNN 推理部署。【免费下载链接】opencvOpen Source Computer Vision Library项目地址: https://gitcode.com/GitHub_Trending/opencv31/opencv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进