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

用合成数据训练车辆姿态估计神经网络

我们的客户希望开发一款应用程序,引导用户通过 AR 指南和自动照片拍摄来拍摄更高质量的汽车照片。 本文重点介绍构建汽车姿态估计组件的技术。 在应用程序中,用户被引导站在与汽车一定的角度和距离,以标准化的方式捕捉最好的照片。 当用户处于正确位置时,会自动拍摄高分辨率照片。

在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

我们需要一种方法来大致了解用户在 3D 空间中相对于他们正在拍摄的汽车的站立位置。 由于这是一个原型应用程序,我们只有几周的时间来提出可行的解决方案。 我们还限制了对特定车型的识别,以缩短开发时间。

项目的目标和限制如下:

  • 构建可行解决方案的时间很短
  • 大致实时的汽车姿态估计(< 150 ms)
  • 将范围限制为具有不同颜色/选项的特定车型
  • 应用程序应拍摄高质量的照片

1、在构建之前的尝试

希望为 3D 物体姿态估计找到一个快速的现成解决方案,我们测试了几种方法。

1.1 Apple ARKit 3d 物体识别

在这里插入图片描述

ARKit 物体识别 — 物体扫描应用

ARKit 包含用于扫描和识别 ARKit 中的刚性 3D 对象的 API。 这对我们来说似乎很理想; 实时且内置于 ARKit 中,这将使该功能的开发时间缩短为零。 我们这里主要关心的是识别不同的汽车颜色。 为了测试 ARKit 对此的处理效果,我们购买了一辆具有几种不同颜色的小型模型车。
在这里插入图片描述

测试用模型车

我们扫描一种颜色,然后在类似的颜色上进行测试(即扫描白色,在浅蓝色上进行测试。)在某些情况下,识别确实有效。 它并不完美,但也许如果我们扫描一些基色,这将提供足够的不变性来识别我们可能期望看到的汽车的任何颜色。

下一步是在真车上进行尝试。 事实证明,真正的汽车的行为有点不同。 即使在同一辆车上进行扫描和测试也是不可靠的。 有时,识别出的汽车会以某种方式稍微旋转/平移。 我们的猜测是,汽车上的高反光油漆工作使得基于特征的扫描和识别很难发挥作用(Apple 在其文档中特别提到反光物体不适合 3D 识别。)

1.2 第三方 SDK

我们测试了其他一些 SDK,并得到了与 ARKit 类似的结果。 一些库需要特定的“初始化模板”或用户需要匹配的位置才能启动 3D 对象跟踪。 这并不理想,因为我们想要引导用户到某些位置,因此识别需要从各种角度/位置进行。

1.3 照片质量

ARKit 和我们尝试的 SDK 的另一个缺点是使用它们时拍摄的照片的质量和分辨率。 使用 ARKit 时可捕获的最高分辨率为 1920x1440。 使用 ARKit 时,对焦点和曝光的控制也非常有限。 由于该应用程序主要用于拍摄高质量的汽车照片,因此除了大图像分辨率之外,我们还希望对焦点和曝光进行精细控制。

2、构建基于神经网络的姿态估计器

在这里插入图片描述

人体姿态估计

鉴于我们使用第三方解决方案不成功,再加上照片质量限制,我们决定考虑构建自己的解决方案,与 Apple 的 AVFoundation 相机 API 一起使用。 我们选择神经网络解决方案,因为它们是姿势估计的最先进技术,并且有很多开源项目和研究可供利用。

2.1 姿态估计方法

给定图像,我们如何预测图像中物体的 3D 姿态? 一种常见的方法涉及预测对象规范模型上一组已知点的图像位置。 例如,给定一张汽车照片,图像中的左侧前灯在哪里? 有了足够的这些预测,我们就可以估计原始汽车模型相对于拍照相机的 3D 姿态。

2.2 网络架构

如今,神经网络在各种任务上都表现出了令人印象深刻的准确性,而且由于网络架构的改进和更快的设备,神经网络也能够在移动设备上实时运行。

最近我们研究了一些基于 CPM 和堆叠沙漏架构的实时移动身体姿势估计项目。

  • PoseEstimationForMobile:github
  • PoseEstimation-CoreML:github

这些项目包含许多有用的信息,可用于在移动平台上训练和运行你自己的姿势估计器。

他们使用的 CPM 网络有一个 MobileNetV2 基础,并为 14 个身体部位(左肘、右膝等)输出一个 2d 热图:
在这里插入图片描述

不同身体部位的热图

从这里,我们基本上可以获取每个关键点层的最大激活位置,然后使用 OpenCV 的 SolvePnP 方法估计 3d 汽车姿势。 这是我们在真实汽车照片上运行的最终神经网络的可视化,以及估计的 3D 姿势。 由于输出热图的分辨率有限,这并不是一个完美的选择。 我们的模型输出分辨率为 192x192 的热图,因此单次传递的准确度是有限的。

在这里插入图片描述

模型的最终输出

3、其他方法和资源

我们采用 CPM 来快速启动和运行,但还有其他方法可以解决这个问题。 另一种基于关键点的方法是直接将 2d 关键点输出为 x,y 坐标列表。 这确实限制了我们对单一汽车的估计,但对于我们的用例来说这是可以的。

灵感来自Hart Woolery 的关于手部姿势估计的帖子中,我们测试了简单地在 MobileNet 之上添加一些密集层,最终输出一组 1x28 的 x,y 关键点位置。 令人惊讶的是,这个开箱即用的效果非常好。 如果有更多时间,我们可能会进一步探索该网络,因为它比我们选择的 CPM 模型稍快。

如果您只是在寻找人体姿势估计,请查看Jameson Toole最近的关于 fritz.ai 人体姿势估计器的文章 。

另一种方法是网络直接输出汽车的位姿参数,而不是通过中间的 2d 关键点(参见 BoxCars 、 MultiBin )。 由于时间紧迫,我们没有严格评估我们可以采取的每一个方向——但这些其他方法似乎完全有效。

4、查找汽车数据集

选择网络架构后,下一步是找到可用于训练它的数据集。

用于身体姿势估计的数据集并不缺乏(COCO、DensePose、MPII、身体姿势数据集概述),但带注释的汽车数据不太常见。 存在一些数据集(Apollo、PASCAL 3d+),但每个数据集似乎都有其自己的局限性。 大多数数据集都是针对自动驾驶汽车的,因此来自街道上行驶的汽车视角的图像存在很大的偏差——这与我们期望网络处理的图像有很大不同。

PASCAL 3D 具有 3D 汽车模型标注,但这些汽车通常是从互联网照片中收集的更旧的模型。 由于我们提前知道了汽车模型,因此没有必要对数千个其他模型进行训练(尽管我们希望有更多时间扩展我们的网络以识别更多汽车模型。)最后,一些数据集具有非商业许可限制 。 鉴于这些缺点,我们探索了合成数据,将其作为直接根据我们预期的测试环境定制数据的方法。

5、创建合成汽车数据集

在这里插入图片描述

Unity 编辑器截图

当生成许多机器学习方法所需的大量训练数据不可能或不切实际时,合成数据就会派上用场。 感谢视频游戏行业,我们可以利用 Unity 或 Unreal 等图形引擎进行渲染,并使用最初为游戏开发的 3D 资源。 虽然我们还无法获得光线追踪方法的渲染质量,但示例代码的速度和数量以及免费/廉价的资源使其非常有吸引力。 Unity 是我们的选择,因为我们有更多的经验,而且时间也是一个因素。

在这里插入图片描述

使用 Unity 合成数据的示例

Unity 甚至发布了一个方便的演示项目,其中包含一些有关合成数据的常见需求。 我们最近还就使用 SceneKit 为 AR 足球比赛训练脚部分割网络进行了简短的演讲。

6、查找车辆模型

幸运的是,有很多高质量的 3D 汽车模型。 对于非常高质量的模型,您可能需要支付几百美元(请参阅 squir ),但是可以直接从 Unity 资产商店获得许多便宜或免费的模型:

在这里插入图片描述

https://assetstore.unity.com/categories/3d/vehicles/land

我们收集了大约 10 个形状与我们的目标模型相似的汽车模型,以及我们正在测试的确切汽车的两个变体。

如果你手头有目标对象的3D模型,但是需要转换成3D游戏引擎需要的格式,那么可以直接使用 NSDT 3DConvert 这个强大的在线3D格式转换工具,无需本地安装任何软件:

在这里插入图片描述

https://3dconvert.nsdt.cloud

7、数据标注

模型准备好后,下一步就是标注我们正在训练网络识别的关键点。 由于身体姿势网络有 14 个关键点,这似乎是一个合理的起点,因为它将减少对现有训练流程的任何修改。 此步骤需要创建 14 个空游戏对象并为每个车辆模型定位它们:

在这里插入图片描述

车辆的14个关键点

通过命名每个关键点游戏对象(例如 left_back_wheel ),在渲染过程中,我们可以在保存标注数据时简单地在汽车游戏对象中搜索每个关键点。 我们还选择使用深度测试来存储该视点的关键点是否被遮挡,但这最终并没有在训练中使用。

8、在数据集中创建变体

对合成数据进行训练时的一个大问题是模型是否能够推广到现实世界的图像。 这是一个活跃且不断发展的研究领域,有许多有趣的方法。 Apple 的机器学习团队发布了一篇有趣的文章,介绍如何使用 GAN 提高合成眼睛图像的真实感。 我们选择的方法称为域随机化。 通过在训练数据分布中创建大量变化,模型应该概括为目标(现实世界)分布,而无需任何微调。

为了实现这一目标,我们尝试在渲染图像之前尽可能多地随机化场景的各个方面。 前面的一个主要问题是网络将学会拾取 3D 汽车模型上的一些小细节,而这些细节不能推广到真实汽车的照片。 有一个经常被提及(可能不真实)的轶事是关于研究人员训练坦克探测器,该探测器只是了解训练集中的坦克在一天中的什么时间被拍照。 无论这个例子是否正确,当你的训练和测试集来自不同的分布时,需要注意确保转移到新数据。

8.1 车辆变体

对于每种汽车模型,我们花了一些时间在车身上创建可编写脚本的小细节变化。 例如油漆反射率、车牌位置和编号、车窗色调、汽车轮辋样式和位置以及其他一些内容。 我们还沿着汽车的局部轴稍微缩放了汽车本身。

在这里插入图片描述

仅车身变体的渲染图
在这里插入图片描述

不同的轮胎选择

8.2 环境/背景变化

最初,我们开始构建和购买一些包含建筑物和真实 3D 结构的场景。 事实证明,寻找高质量的逼真场景非常困难,而且成本高昂且耗时。 幸运的是,我们发现了一个很棒的网站,hdrihaven.com,它提供了非常高分辨率的免费环境地图。 这些本质上是 360 HDR 全景图,在几何体后面进行渲染,并可以为场景中的对象提供照明和反射。 我们还通过渲染脚本以参数方式改变反射和曝光强度。

在这里插入图片描述

来自 HDRI Haven 的环境贴图

除了天空盒之外,我们还创建了一个简单的平面作为汽车下方的地板。 在地板上应用不同的材料并偶尔将它们隐藏在一起可以提供很多视觉多样性:

在这里插入图片描述

场景和灯光变化

8.3 后期处理效果

Unity 有一个名为“后期处理栈”的功能,它基本上是 3D 场景的 Instagram 滤镜。 这些效果可能包括模糊、颜色分级等。你可以通过包管理器或资源商店将其添加到场景中,具体取决于Unity 版本。

除了内置的后期处理栈之外,我们还从资产商店下载了另一组名为 SC Post Effects Pack 的滤镜,价格为 25 美元。 以下是一些仅改变后处理滤镜组合的渲染:
在这里插入图片描述

后期处理滤波器的变化

影响是微妙的,可能很难发现。 这里看到的一些是景深、噪点、云阴影、环境光遮挡、边缘高光、色调偏移和黑条。 对于每一个,我们还随机调整参数以获得更多变化。

8.4 把它们整合在一起

应用所有的变化,我们最终得到像这样的图像:

在这里插入图片描述

启用所有变体的渲染

尽管这些看起来不像真实的街道场景,但背景和照明的多种变化应该迫使网络捕捉到所有照片中保持不变的汽车特征。 如果我们只使用街道场景,我们的检测器可能会将街道场景的各个方面纳入其特征中; 期望某些阴影和照明特征始终伴随着汽车本身。

9、创建小型验证数据集

在这里插入图片描述

用Python编写的标注工具

我们对数据集偏差的担忧导致我们使用 3D 关键点手动标注一些汽车的实际图像。 手动逐一标注 14 个关键点相当耗时 - 特别是对于被遮挡的关键点。

为了加快速度,我们构建了一个非常基本的 wxPython 应用程序,只需要为每个图像标记几个关键点。 为此,我们使用 OpenCV 的 SolvePnP 来拟合给定这些初始关键点的 3D 汽车模型,然后将其他关键点投影到图像中。

标注完成后,我们使用 imgaug 库应用随机图像增强。 值得庆幸的是,imgaug 支持将 2d 关键点与图像一起变换,因此你不必手动变换点位置。 增强后,我们有大约 1500 张图像来验证我们的网络。

10、合成数据有效吗?

对于我们的一小部分已知汽车模型的用例,我们对第一轮的结果非常满意。 我们的假设是我们需要将更多真实图像纳入训练中,或者更多地依赖迁移学习,但我们最终不需要这样做。 即使在相当广泛的汽车上进行测试,仍然可以得到合理的结果

正如你在这个视频中看到的那样。 3D 模型拟合不适用于其他汽车形状,因为我们将刚性 3D 对象拟合到另一辆不同尺寸的汽车上。 有关于在给定关键点上拟合灵活的参数化汽车模型的文献,因此我们可能会研究更通用的汽车检测器。

11、实现代码

我们的计划是,如果我们有时间清理管线并在更多车型上进行徐连,则将发布管线的某些方面。

现在,我们已经提供了一个演示 iOS 应用程序的代码,该应用程序使用 ARKit 显示估计的汽车姿势。请记住,该模型是在固定视点范围和汽车模型上进行训练的。


原文链接:合成数据训练车辆姿态估计 — BimAnt

相关文章:

用合成数据训练车辆姿态估计神经网络

我们的客户希望开发一款应用程序&#xff0c;引导用户通过 AR 指南和自动照片拍摄来拍摄更高质量的汽车照片。 本文重点介绍构建汽车姿态估计组件的技术。 在应用程序中&#xff0c;用户被引导站在与汽车一定的角度和距离&#xff0c;以标准化的方式捕捉最好的照片。 当用户处于…...

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件

本章要实现的整体效果如下&#xff1a; QEvent::KeyPress ​ 键盘按下时&#xff0c;触发该事件&#xff0c;它对应的子类是 QKeyEvent QEvent::KeyRelease ​ 键盘抬起时&#xff0c;触发该事件&#xff0c;它对应的子类是 QKeyEvent 本节通过两个案例来讲解这 2 个事件&…...

爬取微博热榜并将其存储为csv文件

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言1.…...

国庆中秋特辑(八)Spring Boot项目如何使用JPA

国庆中秋特辑系列文章&#xff1a; 国庆中秋特辑&#xff08;八&#xff09;Spring Boot项目如何使用JPA 国庆中秋特辑&#xff08;七&#xff09;Java软件工程师常见20道编程面试题 国庆中秋特辑&#xff08;六&#xff09;大学生常见30道宝藏编程面试题 国庆中秋特辑&…...

用jad反编译工具查看java接口相关的默认修饰符

接口抽象类复习 -> 默认修饰符是啥 -> jad反编译证明 https://www.cnblogs.com/changrunwei/p/6618117.html 文章目录 背景操作过程反编译前后对比操作截图结论 背景 今天刷到这篇文章&#xff0c;想起之前笔试题总是记不清&#xff0c;所以想证明下。 之前一直不清楚要…...

axios的get请求时数组参数没有下标

开发新项目过程中 发现get请求时 数组参数没有下标 这样肯定是不行的 后端接口需要数组[0]: 7 数组[1]:4这样的数据 原因是因为在请求拦截器没有处理需要的参数 解决方法 在请求拦截器 处理一下参数 import axios, { AxiosError, AxiosInstance, AxiosRequestHeaders } fro…...

bochs 对 Linux0.11 进行调试 (TODO: 后面可以考虑集成 vscode+gdb+qemu)

我在阅读 Linux0.11 源码时&#xff0c;对一个指令 LDS 感到困惑。 看了下 intel 指令集手册&#xff0c;能猜到 LDS 的功能&#xff0c;但不确定。 于是决定搭建调试环境&#xff0c;看看 LDS 的功能是否真如自己猜测。 首先 make debug 运行 qemu-Linux0.11&#xff0c;命…...

一文告知HTTP GET是否可以有请求体

HTTP GET是否可以有请求体 先说结论&#xff1a; HTTP协议没有规定GET请求不能携带请求体&#xff0c;但是部分浏览器会不支持&#xff0c;因此不建议GET请求携带请求体。 HTTP 协议没有为 GET 请求的 body 赋予语义&#xff0c;也就是即不要求也不禁止 GET 请求带 body。大多数…...

防止SQL注入攻击的综合解决方案

文章目录 摘要背景和危害性防御措施示例代码&#xff08;Java&#xff09;示例代码&#xff08;PHP&#xff09;示例MySQL命令示例代码&#xff08;Python&#xff09;示例代码&#xff08;C#&#xff0c;使用Entity Framework&#xff09; 进一步防御SQL注入攻击的措施使用ORM…...

MapReduce(林子雨慕课课程)

文章目录 7. MapReduce7.1 MapReduce简介7.1.1 分布式并行编程7.1.2 MapReduce模型简介 7.2 MapReduce体系结构7.3 MapReduce工作流程概述7.4 Shuffle过程原理7.5 MapReduce应用程序的执行过程7.6 WordCount实例分析7.7 MapReduce的具体应用7.8 MaReduce编程实践 7. MapReduce …...

PHP聊天系统源码 在线聊天系统网站源码 后台自适应PC与移动端

程序前台与后台自适应PC与移动端&#xff0c;支持一对多交流&#xff0c;可以自由创建新的房间与解散创建的房间&#xff0c;集成签到功能&#xff0c;等级功能&#xff0c;房间创建者可以对用户进行禁言、拉黑处理&#xff0c;房间可以由房间创建者自由设置进入密码&#xff0…...

算法题:买卖股票的最佳时机 II (贪心算法解决股票问题)

这道题是贪心算法的中级难度练习题&#xff0c;由于题目设定&#xff0c;整个价格都是透明的&#xff0c;这里并不涉及需要预测股票涨势的问题。解决思路不难&#xff0c;就是一旦股票价格开始下降了就买入&#xff0c;一旦上升了&#xff0c;就赶紧卖出。&#xff08;完整题目…...

Redis-持久化机制

持久化机制介绍 RDBAOFRDB和AOF对比 RDB rdb的话是利用了写时复制技术&#xff0c;他是看时间间隔内key值的变化量&#xff0c;就比如20秒内如果有5个key改变过的话他就会创建一个fork子进程&#xff08;bgsave&#xff09;&#xff0c;通过这个子进程&#xff0c;将数据快照进…...

【LeetCode热题100】--155.最小栈

155.最小栈 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元…...

Allegro 17.2如何直接更新元件封装?

想必很多从事电子设计的小伙伴&#xff0c;都有这样的经历&#xff1a;有些时候原理图和PCB设计是由不同的工程师负责&#xff0c;然后偶尔需要在没有原理图的情况下直接对PCB作品进行操作&#xff0c;如更新元件封装等操作&#xff0c;这种环节不仅费时费力&#xff0c;效率贼…...

高效数据管理:Java助力实现Excel数据验证

摘要&#xff1a;本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在Java中&#xff0c;开发者可以使用一些开源的库&#xff08;如Apache POI&#xff09…...

Easysearch Chart 0.2.0都有哪些变化

Easysearch Chart 包更新了&#xff0c;让我们来看看都有哪些变化&#xff1a; Docker 镜像升级 Service 名称调整&#xff0c;支持 NodePort 模式部署 现在让我们用 NodePort 模式部署一下&#xff1a; # helm search repo infinilabs NAME CHART VERSION …...

RV1126-RV1109-进入uboot的按键和名字显示-HOSTNAME

今天添加一个小功能,就是uboot是按CTRLC进入的 今日我做了一个定制,让按L或者l让也进入uboot指令模式,并且修改主板名字显示 默认是CTRLC:键码值是0x03(ASCII对照表) 于是代码中跟踪: //rv1126_rv1109/u-boot/common/console.c int ctrlc(void) { #ifndef CONFIG_SANDBOXif (…...

学习vue-router

可参见: vue-router 详解_vue router_七月J的博客-CSDN博客 https://www.cnblogs.com/chen-ao666/p/17144552.html vue-router的使用 使用vue-router的步骤: 创建路由组件 配置路由映射: 组件和路径映射关系 使用路由: 通过和 <router-link>: 该标签是一个vue-router中…...

Python爬虫提高排名

在如今竞争激烈的互联网时代&#xff0c;网站的SEO优化变得尤为重要。而Python爬虫作为一种强大的工具&#xff0c;可以帮助网站主们提升搜索排名&#xff0c;吸引更多的流量和用户。本文将为您揭秘如何利用Python爬虫来改善您的SEO优化&#xff0c;并帮助您提升搜索排名。无论…...

SQL获取正数第N个或倒数第N个数据

这里我们使用Order By与Limit的组合&#xff1a; Order By&#xff1a;可以将某个序列值按照从大到小或从小到大排序Limit&#xff1a;如果类似Limit 5表示前5个&#xff0c;Limit 3,5表示从第4个位置&#xff08;以0为开始&#xff09;开始往后取5个 通过这样的组合就可以实…...

链表(2)——带头双向循环链表

&#x1f341;一、链表的分类 &#x1f315;1.单向或者双向 &#x1f315;2.带头或者不带头&#xff08;有无哨兵&#xff09; &#x1f315;3.循环或者不循环 &#x1f315;4.无头单向非循环链表&#xff08;常用&#xff09; &#x1f315;5.带头双向循环链表&#xff08;常用…...

C语言 函数指针

函数指针是C语言中的一种特殊类型&#xff0c;它允许你像操作变量一样操作函数。函数指针的主要用途是存储并后续调用一组函数。 在C语言中&#xff0c;函数指针的定义通常如下所示&#xff1a; 返回类型 (*指针变量名)(参数类型) 例如&#xff0c;如果你有一个返回整数并接受…...

F. Vasilije Loves Number Theory

Problem - F - Codeforces 思路&#xff1a;分析一下题意&#xff0c;对于第一种操作来说&#xff0c;每次乘以x&#xff0c;那么nn*x&#xff0c;然后问是否存在一个a使得gcd(n,a)1并且n*a的约数个数等于n&#xff0c;有最大公约数等于1我们能够知道其实这两个数是互质的&…...

electron打包后主进程下载文件崩溃

electronvue3写了一个小项目&#xff0c;实现了一个文件下载功能 存在的问题 打包后&#xff0c;应用下载文件崩溃代码 // 渲染进程window.electron.ipcRenderer.invoke(save-file, {path: r.filePath,fileurl: previewUrl,}).then(response > {console.log(response ----…...

Spring实例化源码解析之Custom Events下集(九)

上集从官网的角度讲解了基本的使用和源码的内容&#xff0c;没有深入的进行分析&#xff0c;本章将从源码的角度分析ApplicationEvent、ApplicationListener、ApplicationEventMulticaster这三者之间的关系。 initApplicationEventMulticaster 上一章后续部分给出了源码的含义…...

python numpy库关键函数说明

python numpy库函数说明 np.argwhere()np.dtype()np.shape()np.zeros() np.argwhere() 输入参数是一个基本的逻辑表达式&#xff0c;输出检索结果的索引值。 >>> x np.arange(6).reshape(2,3) >>> x array([[0, 1, 2],[3, 4, 5]]) >>> np.argwhe…...

【Linux C】Linux如何执行一个程序(程序存储空间、系统调用、内核调用)

文章目录 一、程序存储空间1.1 C语言程序存储空间1.2 用户空间和内核空间1.3 用户模式和内核模式 二、内核调用-系统调用-C语言库函数2.1 系统调用和内核调用2.2 C语言库函数 三、Linux如何执行一个程序 一、程序存储空间 本节说的空间主要是指内存空间&#xff0c;即程序如何分…...

IP协议总结

一、定义。 IP全称为Internet Protocol&#xff0c;是TCP/IP协议族中的一员&#xff0c;负责实现数据在网络上的传输。它是一种无连接、不可靠的数据报协议。 IP协议常用于Internet网络和局域网中&#xff0c;它通过将数据包进行分组并进行逐跳转发来实现数据在网络中的传输。…...

微信支付v2

文档&#xff1a; https://pay.weixin.qq.com/wiki/doc/api/index.html 微信小程序&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter11_1 需要一个微信认证后的小程序&#xff0c;&#xff0c;还需要一个&#xff0c;在微信商户平台&#xff0c;&…...