当前位置: 首页 > news >正文

深入探究 YOLOv5:从优势到模型导出全方位解析

一、引言

在计算机视觉领域,目标检测是一项至关重要的任务,它在自动驾驶、安防监控、工业检测等众多领域都有着广泛的应用。而 YOLO(You Only Look Once)系列作为目标检测算法中的佼佼者,一直备受关注。其中,YOLOv5 更是凭借其出色的性能和易用性,成为了许多开发者和研究者的首选。本文将深入探讨 YOLOv5,包括其优势、PyTorch 版本特点、模型导出格式支持以及模型类别与导出等方面,带领读者全面了解这一强大的目标检测模型。

二、Why  Choose  YOLOv5

YOLOv5 在目标检测领域具有显著的优势,以下通过与其他模型的对比来详细阐述。

(一)性能对比

在目标检测任务中,模型的性能通常通过平均精度(Average Precision,AP)和速度来衡量。如图所示,展示了 YOLOv5 不同版本(YOLOv5n6、YOLOv5s6、YOLOv5m6、YOLOv5l6、YOLOv5x6)与 EfficientDet 在 COCO 数据集上的 AP 值和 GPU 速度的对比。

从图中可以看出,在 GPU 速度方面,YOLOv5 系列模型表现出色,尤其是在速度较快的情况下,依然能够保持较高的 AP 值。例如,YOLOv5n6 在速度上具有明显优势,而 YOLOv5x6 则在 AP 值上达到了较高水平,超过了 EfficientDet。这意味着 YOLOv5 能够在保证检测精度的同时,实现快速的目标检测,满足实时性要求较高的应用场景。

二、模型结构与训练优势

YOLOv5 的模型结构设计精巧,采用了一系列先进的技术和策略,使其在训练过程中具有以下优势:

  1. 数据增强:YOLOv5 内置了丰富的数据增强方法,如随机缩放、裁剪、翻转、颜色变换等。这些数据增强操作可以有效地增加训练数据的多样性,提高模型的泛化能力,使其能够更好地应对各种复杂场景下的目标检测任务。
  2. 多尺度训练:支持多尺度训练,模型可以在不同分辨率的图像上进行训练,从而使模型能够适应不同大小的目标检测。这种训练方式有助于提高模型对不同尺度目标的检测精度,避免因目标大小变化而导致的漏检或误检问题。
  3. 高效的网络架构:YOLOv5 的网络架构经过精心设计,采用了深度可分离卷积等高效的卷积操作,减少了模型的参数量和计算量,同时保持了较高的检测性能。这使得模型可以在资源受限的设备上(如移动设备、嵌入式设备)高效运行,拓展了其应用范围。

YOLOv5-PyTorch 版本具有重要的地位和特点,以下是详细介绍。

(一)历史上第一个 PyTorch 版本

YOLOv5 是第一个基于 PyTorch 实现的版本,这具有重要意义。PyTorch 作为一款流行的深度学习框架,以其简洁易用、动态计算图、良好的调试体验等优点受到广大开发者的喜爱。YOLOv5-PyTorch 版本的出现,使得开发者能够利用 PyTorch 的强大功能和丰富生态,更加方便地进行模型的训练、调试和部署。

(二)不同规模模型介绍

YOLOv5 提供了多种规模的模型,包括 Small(YOLOv5s)、Medium(YOLOv5m)、Large(YOLOv5l)和 XLarge(YOLOv5x)。这些模型在模型大小、推理速度和检测精度上各有特点,以满足不同应用场景的需求。

  1. YOLOv5s

    • 模型大小:FP16 精度下仅为 14 MB,非常适合在资源有限的设备上部署,如移动设备或边缘设备。
    • 推理速度:在 V100 GPU 上,推理速度可达 2.2 ms,能够实现快速的目标检测,满足实时性要求较高的应用。
    • 检测精度:在 COCO 数据集上的 mAP(mean Average Precision)为 36.8,虽然相对其他大型模型精度较低,但在一些对精度要求不是特别苛刻的场景下,其快速的检测速度和较小的模型大小使其具有很大的优势。
  2. YOLOv5m

    • 模型大小:FP16 精度下为 41 MB,比 YOLOv5s 稍大,但仍然可以在一些中低端设备上运行。
    • 推理速度:在 V100 GPU 上,推理速度为 2.9 ms,速度依然较快。
    • 检测精度:mAP 达到 44.5,相比 YOLOv5s 有了显著提高,能够在保证一定速度的前提下,提供更高的检测精度,适用于对精度和速度都有一定要求的场景。
  3. YOLOv5l

    • 模型大小:FP16 精度下为 90 MB,模型规模进一步增大。
    • 推理速度:在 V100 GPU 上,推理速度为 3.8 ms,虽然速度有所下降,但仍然在可接受范围内。
    • 检测精度:mAP 达到 48.1,检测精度进一步提升,适用于对精度要求较高的场景,如工业检测等。
  4. YOLOv5x

    • 模型大小:FP16 精度下为 168 MB,是 YOLOv5 系列中最大的模型。
    • 推理速度:在 V100 GPU 上,推理速度为 6.0 ms,相对较慢,但在强大的计算设备上仍然可以实现实时检测。
    • 检测精度:mAP 达到 50.1,是 YOLOv5 系列中精度最高的模型,适用于对检测精度要求极高的场景,如医学图像分析等。

一般来说YOLOv5l模型的性价比更高,YOLOv5x比YOLOv5l模型大的很多,但是mAP来看,性能却没有多少提升。

以下是使用 PyTorch 加载 YOLOv5s 模型进行目标检测的示例代码:

import torch# 加载预训练的YOLOv5s模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)# 对图像进行目标检测
image_path = 'your_image_path.jpg'
results = model(image_path)# 显示检测结果
results.show()

在上述代码中,首先使用torch.hub.load函数加载预训练的 YOLOv5s 模型,然后将待检测的图像路径传入模型进行目标检测,最后使用results.show()函数显示检测结果。

三、模型导出格式支持

YOLOv5 最新版支持多种模型导出格式,这为其在不同平台和环境中的部署提供了极大的便利。

(一)支持的格式

  1. PyTorch:这是 YOLOv5 的原生格式,以.pt.pth文件形式存在。在 PyTorch 环境中,可以直接使用这些模型文件进行训练、测试和推理。例如,yolov5s.pt就是 YOLOv5s 模型的 PyTorch 格式文件。
  2. TorchScript:通过torchscript选项可以将模型导出为 TorchScript 格式,文件扩展名为.torchscript。TorchScript 是一种可以在 Python 环境之外运行的模型表示形式,它可以将 PyTorch 模型转换为一种中间表示,以便在 C++ 等其他语言中使用,提高了模型的可移植性和部署灵活性。
  3. ONNX:ONNX(Open Neural Network Exchange)是一种开放的神经网络模型交换格式,支持多种深度学习框架之间的模型互操作。通过onnx选项可以将 YOLOv5 模型导出为.onnx文件。例如,yolov5s.onnx就是导出的 ONNX 格式模型。导出 ONNX 格式的模型后,可以使用 ONNX Runtime 等推理引擎在不同的硬件和软件平台上进行高效的推理。以下是将 YOLOv5s 模型导出为 ONNX 格式的代码示例:
import torch# 加载预训练的YOLOv5s模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)# 导出为ONNX格式
torch.onnx.export(model, torch.randn(1, 3, 640, 640), 'yolov5s.onnx', verbose=True)

在上述代码中,首先加载预训练的 YOLOv5s 模型,然后使用torch.onnx.export函数将模型导出为 ONNX 格式,其中torch.randn(1, 3, 640, 640)是一个随机生成的输入张量,用于指定模型的输入形状,yolov5s.onnx是导出的 ONNX 模型文件名,verbose=True表示在导出过程中输出详细信息。

  1. OpenVINO:OpenVINO 是英特尔推出的用于优化和部署深度学习模型的工具套件。通过openvino选项可以将 YOLOv5 模型导出为 OpenVINO 支持的格式,导出后的模型可以在英特尔的硬件平台上实现高效的推理加速,充分利用英特尔硬件的性能优势,适用于对性能和功耗有较高要求的边缘计算场景。
  2. TensorRT:TensorRT 是 NVIDIA 推出的用于高性能深度学习推理的 SDK。通过engine选项可以将 YOLOv5 模型导出为 TensorRT 引擎文件(.engine)。TensorRT 可以对模型进行优化和加速,利用 NVIDIA GPU 的并行计算能力,实现实时的目标检测,特别适用于需要高性能计算的场景,如自动驾驶、视频监控等。
  3. CoreML:CoreML 是苹果公司推出的用于在 iOS 设备上部署机器学习模型的框架。通过coreml选项可以将 YOLOv5 模型导出为 CoreML 格式(.mlmodel),方便在 iOS 应用中集成目标检测功能,为移动应用开发者提供了便捷的模型部署方式。
  4. TensorFlow SavedModel:TensorFlow SavedModel 是 TensorFlow 的一种模型保存格式。通过saved_model选项可以将 YOLOv5 模型导出为 TensorFlow SavedModel 格式,文件保存在指定的目录中(如yolov5s_saved_model/)。这种格式可以方便地在 TensorFlow 生态中使用和部署模型,与其他 TensorFlow 工具和库进行集成。
  5. TensorFlow GraphDef:GraphDef 是 TensorFlow 模型的一种底层表示形式,通过pb选项可以将 YOLOv5 模型导出为.pb文件。这种格式可以用于在 TensorFlow 中进行更底层的操作和优化,例如在一些需要对模型图进行精细调整的场景中使用。
  6. TensorFlow Lite:TensorFlow Lite 是 TensorFlow 针对移动和嵌入式设备推出的轻量级深度学习框架。通过tflite选项可以将 YOLOv5 模型导出为 TensorFlow Lite 格式(.tflite),适用于在资源受限的移动设备和嵌入式设备上运行目标检测模型,提供高效的推理性能和低功耗。
  7. TensorFlow Edge TPU:TensorFlow Edge TPU 是谷歌推出的用于在边缘设备上加速 TensorFlow 模型推理的硬件和软件解决方案。通过edgetpu选项可以将 YOLOv5 模型导出为 TensorFlow Edge TPU 支持的格式(.tflite),利用 Edge TPU 的硬件加速能力,实现快速的目标检测,适用于物联网等边缘计算场景。
  8. TensorFlow.js:TensorFlow.js 是 TensorFlow 的 JavaScript 版本,通过tfjs选项可以将 YOLOv5 模型导出为 TensorFlow.js 格式(yolov5s_web_model/),方便在 Web 浏览器中直接运行目标检测模型,为 Web 开发者提供了在网页上实现目标检测功能的可能性,无需安装额外的软件或插件。

四、模型可视化

对于导出的 ONNX 格式模型,可以使用https://netron.app进行可视化。Netron 是一款强大的神经网络模型可视化工具,它可以直观地展示模型的结构、层信息、输入输出形状等,帮助开发者更好地理解模型的内部工作原理,便于进行模型的分析和调试。

五、YOLOv5 模型类别与导出

(一)YOLOv5 模型导出与支持

YOLOv5 模型的导出过程相对简单,但需要注意一些细节。除了上述提到的通过export.py脚本结合不同的选项进行导出外,还需要确保模型在导出前已经完成了训练并且处于正确的状态。例如,在导出前需要将模型设置为评估模式(model.eval()),以确保模型的行为与训练时一致,并且不会受到训练过程中一些操作(如 Dropout)的影响。

此外,在导出不同格式的模型时,可能需要根据目标平台和推理引擎的要求进行一些额外的配置和优化。例如,在导出 TensorRT 模型时,需要根据硬件平台的特性和模型的性能要求,选择合适的优化参数和精度设置,以达到最佳的推理性能。

(二)不同精度的模型支持

YOLOv5 不仅支持不同规模的模型,还支持不同精度的模型导出。除了常见的 FP32(单精度浮点数)和 FP16(半精度浮点数)精度外,一些推理引擎还支持 INT8(8 位整数)等低精度量化模型。

低精度量化可以进一步减小模型的大小,降低内存占用和计算量,提高模型在一些硬件平台上的推理速度。例如,在一些边缘计算设备上,INT8 量化后的模型可以实现更快的推理,同时功耗也更低。然而,量化过程可能会导致一定的精度损失,因此需要在模型大小、速度和精度之间进行权衡。

以下是一个简单的示例,展示如何在 PyTorch 中对 YOLOv5 模型进行量化:

import torch
import torch.nn as nn
from torch.quantization import quantize_dynamic# 加载预训练的YOLOv5s模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)# 对模型进行动态量化
quantized_model = quantize_dynamic(model, {nn.Conv2d, nn.Linear})# 保存量化后的模型
torch.save(quantized_model.state_dict(), 'quantized_yolov5s.pth')

在上述代码中,首先加载预训练的 YOLOv5s 模型,然后使用quantize_dynamic函数对模型进行动态量化,量化的模块包括卷积层(nn.Conv2d)和全连接层(nn.Linear)。最后,将量化后的模型参数保存为.pth文件。

(三)模型量化的目的

  1. 减小模型大小
    • 原始的深度学习模型,尤其是像 YOLOv5 这样具有一定复杂度的模型,其参数通常以较高精度(如 FP32)存储,这会导致模型文件较大。例如,一个未量化的 YOLOv5 模型可能占用几十兆甚至上百兆的存储空间。通过量化,将模型参数的数据类型转换为低精度(如 INT8),可以显著减小模型的大小。这对于在资源受限的设备上部署模型非常重要,如移动设备、嵌入式设备等,这些设备的存储容量有限,较小的模型大小可以更容易地安装和运行。
    • 以 INT8 量化为例,相比于 FP32,数据存储所需的字节数大大减少(FP32 通常占用 4 个字节,而 INT8 仅占用 1 个字节),从而可以将模型文件压缩到原来的几分之一甚至更小。
  2. 降低内存占用
    • 在模型推理过程中,模型参数需要加载到内存中。未量化的模型由于参数精度高,占用的内存空间较大。当同时运行多个模型实例或者在内存资源紧张的环境中,高内存占用可能会导致内存不足的问题,影响系统的稳定性和其他程序的运行。
    • 量化后的模型由于参数占用内存减少,在相同的硬件环境下,可以同时处理更多的输入数据或者运行更多的模型副本,提高系统的并发处理能力和资源利用率。
  3. 提高推理速度
    • 许多硬件平台,特别是一些专门针对低精度计算进行优化的处理器(如一些移动处理器、GPU 等),在处理低精度数据时具有更高的计算效率。量化后的模型在这些硬件上运行时,可以利用硬件的特性,实现更快的推理速度。

六、小结

YOLOv5 作为一款强大的目标检测模型,具有出色的性能、丰富的模型规模选择、广泛的模型导出格式支持以及对不同精度模型的支持等优点。无论是在学术研究还是工业应用中,YOLOv5 都展现出了巨大的潜力和价值。YOLOv5 具有其优势、PyTorch 版本特点、模型导出格式以及模型类别与导出等方面具有不同选择。在实际应用中,开发者可以根据具体的需求和场景,选择合适的 YOLOv5 模型和导出格式,充分发挥其强大的目标检测能力,为各种计算机视觉任务提供高效、准确的解决方案。

相关文章:

深入探究 YOLOv5:从优势到模型导出全方位解析

一、引言 在计算机视觉领域,目标检测是一项至关重要的任务,它在自动驾驶、安防监控、工业检测等众多领域都有着广泛的应用。而 YOLO(You Only Look Once)系列作为目标检测算法中的佼佼者,一直备受关注。其中&#xff…...

【PoCL】运行 LLVM 中 pass 优化过程详解

PoCL 项目中调用 LLVM 的 Pass 对编译过程的优化至关重要。本博文以PoCL 开源项目源码为例,详细说明【PoCL】运行 LLVM 中 pass 优化过程 目录 0. 个人简介 && 授权须知1. pocl_llvm_run_pocl_passes 函数作用2. 禁止 “小网格 small grid” 工作组(workGroup)特化的…...

如何将使用unsloth微调的模型部署到ollama?

目录 一、将模型保存为gguf格式 二、下载llama.cpp 三、生成 llama-quantize 可执行文件 四、使用llama-quantize 五、训练模型 六、将模型部署到ollama 一、将模型保存为gguf格式 在你的训练代码 trainer.train() 之后添加: model.save_pretrained_gguf(&q…...

【测试】UI自动化测试

长期更新,建议关注收藏点赞! 目录 概论WEB环境搭建Selenium APPAppium 概论 使用工具和代码执行用例。 什么样的项目需要自动化? 需要回归测试、自动化的功能模块需求变更不频繁、项目周期长(功能测试时长:UI自动化测…...

SSM开发(二) MyBatis两种SQL配置方式及其对比

目录 一、MyBatis两种SQL配置方式 二、使用XML映射文件配置SQL语句 三、使用注解配置SQL语句 四、两种方式对比 总结 1、注解 2、XML配置 五、MyBatis多数据源的两种配置方式 参考 一、MyBatis两种SQL配置方式 MyBatis 提供了两种方式来配置SQL语句:注解&a…...

【Redis】在ubuntu上安装Redis

文章目录 提权搜索软件包安装修改配置文件ip保护模式配置密码 重新启动服务器使用 redis 自带的客户端来连接服务器 提权 先切换到 root 用户,su 命令切换到 root. 搜索软件包 使用 apt 命令来搜索 redis 相关的软件包 apt search redis 安装 使用 apt 命令安装 redisapt …...

JS-Web API -day06

一、正则表达式 正则表达式测试工具: http://tool.oschina.net/regex 1.1 正则表达式介绍与语法 正则表达式: 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。通常用来查…...

JS-Web API -day03

一、事件流 1.1 事件流与两个阶段说明 事件流 指的是事件完整执行过程中的流动路径 假设页面有个div标签,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段 捕获阶段:Document - Element html - Elementbody - Element div…...

进程优先级

基本概念 cpu资源分配的先后顺序,就是指进程的优先权(priority)。 优先权⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤,可以改善系统性能;还可以把进程运⾏到指定的CPU上,这样⼀来&…...

c语言(转义字符)

前言: 内容: 然后记一下转义字符 \? 在书写连续多个问号时使用,防止他们被解析成三字母词 \ 用于表示字符常量 \\ 用于表示一个反斜杠,防止他被解析为一个转义序列符 \n 换行 \r …...

easyexcel读取写入excel easyexceldemo

1.新建springboot项目 2.添加pom依赖 <name>excel</name> <description>excelspringboot例子</description><parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…...

【人工智能数学基础篇】——深入详解矩阵分解:奇异值分解(SVD)与主成分分析(PCA)在数据降维与特征提取中的应用

目录 1. 引言 2. 矩阵分解概述 2.1 矩阵分解的意义 3. 奇异值分解&#xff08;SVD&#xff09; 3.1 定义与数学基础 3.2 SVD 的性质 3.3 SVD 在数据降维中的应用 3.4 示例代码&#xff1a;使用 SVD 进行图像压缩 3.5 结果分析 4. 主成分分析&#xff08;PCA&#xff0…...

ThreeJS示例教程200+【目录】

Three.js 是一个强大的 JavaScript 库,旨在简化在网页上创建和展示3D图形的过程。它基于 WebGL 技术,但提供了比直接使用 WebGL 更易于使用的API,使得开发者无需深入了解 WebGL 的复杂细节就能创建出高质量的3D内容。 由于目前内容还不多,下面的内容暂时做一个占位。 文章目…...

DC-DC稳压电源——实战(基于Ti5450芯片)基础知识篇(1)

一&#xff1a;基础知识-耦合 1&#xff09;去耦电容 &#xff08;1&#xff09;耦合与去耦 耦合&#xff1a;系统内部的各个部分之间存在相互依赖、相互影响、相互制约的情况。用人话说就是不同部分之间的相互影响。 去耦&#xff1a;自然就是消除不同部分之间的影响了。 &…...

pyrender 渲染mesh

目录 render_meshes函数 调用函数 render_meshes函数 def overlay_human_meshes(humans, K, model, img_pil, unique_colorFalse):# Color of humans seen in the image._color [color[0] for _ in range(len(humans))] if unique_color else color# Get focal and princpt …...

防火墙安全策略

目录 一.拓扑信息 二.需求分析 三.命令行详细配置信息 1.配置IP 2.交换机配置 3.修改安全区域 4.安全策略 四.web界面详细配置 1.配置IP和设置安全区域 2.交换机配置 3.安全策略 五.测试 一.拓扑信息 二.需求分析 1.VLAN 2属于办公区域&#xff1b;VLAN 3属于生…...

selenium clear()方法清除文本框内容

在使用Selenium进行Web自动化测试时&#xff0c;清除文本框内容是一个常见的需求。这可以通过多种方式实现&#xff0c;取决于你使用的是哪种编程语言&#xff08;如Python、Java等&#xff09;以及你的具体需求。以下是一些常见的方法&#xff1a; 1. 使用clear()方法 clear…...

(回溯分割)leetcode93 复原IP地址

#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; //卡尔的图不是按照程序执行过程而是直接画程序会执行的过程 // 实际执行是&#xff1a;n个字符&#xff0c;递推n1后&#xff08;叶子节点&#xff…...

高性能队列 Disruptor 在 IM 系统中的实战

高性能队列 Disruptor 在 IM 系统中的实战 前三期我们介绍了Disruptor的典型使用场景和相关高性能原理&#xff0c;本期我介绍一下Disruptor在IM系统用的应用实战&#xff0c;IM系统即社交聊天系统&#xff0c;对实时性的要求非常高&#xff0c;非常符合Disruptor的使用场景。 …...

原生HTML集合

一、表格 1、固定表格 <div class"tablebox"><div class"table-container"><table id"myTable" border"0" cellspacing"0" cellpadding"0"><thead><tr></tr></thead>…...

ES6 简单练习笔记--变量申明

一、ES5 变量定义 1.在全局作用域中 this 其实就是window对象 <script>console.log(window this) </script>输出结果: true 2.在全局作用域中用var定义一个变量其实就相当于在window上定义了一个属性 例如: var name "孙悟空" 其实就相当于执行了 win…...

2025.1.21——六、BUU XSS COURSE 1

题目来源&#xff1a;buuctf BUU XSS COURSE 1 一、打开靶机&#xff0c;整理信息 有吐槽和登陆两个尝试点&#xff0c;题目名称提示是XSS漏洞 XSS&#xff08;Cross-Site Scripting&#xff09;漏洞 1.定义&#xff1a;跨站脚本攻击&#xff0c;是一种常见的 Web 安全漏洞。攻…...

Linux - 五种常见I/O模型

I/O操作 (输入/输出操作, Input/Output) 是指计算机与外部设备就行数据交互的过程. 什么是外部设备: 如键盘, 鼠标, 硬盘, 网卡等. 五种常见的 I/O 模型: 阻塞 I/O非阻塞 I/O信号驱动 I/OI/O 多路复用异步 I/O 阻塞 I/O 阻塞 I/O 的特点: 当用户发起 I/O 请求后, 进程/线程就…...

【负载均衡式在线OJ】加载题目信息(文件版)

目录 如何读取文件 -- 常见流程 代码 如何读取文件 -- 常见流程 在C中使用 std::ifstream来打开文件流是一个常见的操作&#xff0c;用于创建一个输入文件流&#xff0c;并尝试打开名为 question_list的文件。if (!in.is_open())&#xff1a;检查文件是否成功打开。如果文件未…...

“上门按摩” 小程序开发项目:基于 SOP 的全流程管理

在竞争激烈的生活服务市场,“上门按摩” 服务需求日益增长。为满足这一需求,我们启动了 O2O 模式的 “上门按摩” 小程序开发项目,该项目涵盖客户端、系统管理端、技师端。以下将通过各类 SOP 对项目进行全面管理,确保项目顺利推进。 一、项目启动 SOP:5W2H 分析法 What(…...

WPF1-从最简单的xaml开始

1. 最简单的WPF应用 1.1. App.config1.2. App.xaml 和 App.xaml.cs1.3. MainWindow.xaml 和 MainWindow.xaml.cs 2. 正式开始分析 2.1. 声明即定义2.2. 命名空间 2.2.1. xaml的Property和Attribute2.2.2. xaml中命名空间2.2.3. partial关键字 学习WPF&#xff0c;肯定要先学…...

2025牛客寒假算法营2

A题 知识点&#xff1a;模拟 打卡。检查给定的七个整数是否仅包含 1,2,3,5,6 即可。为了便于书写&#xff0c;我们可以反过来&#xff0c;检查这七个整数是否不为 4 和 7。 时间 O(1)&#xff1b;空间 O(1)。 #include <bits/stdc.h> using namespace std;signed main()…...

编译Android平台使用的FFmpeg库

目录 前言 一、编译环境 二、搭建环境 1.安装MSYS2 2.更新系统包 2.1 打开MSYS2 MinGW 64-bit终端&#xff08;mingw64.exe&#xff09; 2.2 更新所有软件包到最新版本 2.3 安装必要的工具和库。 3. 克隆FFmpeg源码 4. 配置编译选项 5. 执行编译 总结 前言 记录学习…...

【C++高并发服务器WebServer】-2:exec函数簇、进程控制

本文目录 一、exec函数簇介绍二、exec函数簇 一、exec函数簇介绍 exec 函数族的作用是根据指定的文件名找到可执行文件&#xff0c;并用它来取代调用进程的内容&#xff0c;换句话说&#xff0c;就是在调用进程内部执行一个可执行文件。 exec函数族的函数执行成功后不会返回&…...

力扣707题(2)——设计链表

#题目 #3,5和6的代码 今天看剩下几个题的代码&#xff0c;1,2,4的代码已经在上篇博客写过了想看的小伙伴移步到&#xff1a; 力扣707题——设计链表-CSDN博客 //第3题头插法 void addAtHead(int val){ //记录头结点ListNode nhead; //新节点的创建,并让它指向原本头结点的后…...