突破微小目标检测瓶颈:智能无人机在蓝莓产量估算中的解决方案

【导读】

本文提出了一种使用搭载计算机视觉的智能无人机估算蓝莓产量的方法。系统利用两个YOLO模型:一个检测灌木丛,另一个检测浆果。它们协同工作,智能控制无人机位置和角度,安全获取灌木近景图,实现精准的浆果计数和产量估算。实验展示了模型在裁剪图像上的良好效果,并讨论了部署时的采样策略、小目标(蓝莓)标注及模型评估的挑战。

目录

一、相关工作

二、处理流程

分层采样

单株灌木检测

灌木侧视图像采集

三、数据集

数据采集

浆果数据集

数据标注

四、YOLO目标检测

训练

验证

DeepSORT追踪

实验结果

浆果模型

灌木模型

灌木裁剪浆果模型

五、讨论

六、结论


人工智能与自主无人机相结合的精准农业技术,已被证明不仅能有效估算多种作物的产量,还能用于杂草和病害检测管理。蓝莓作为重要的经济作物,其生长季早期的产量预测对农户制定定价策略、安排充足采摘人员以及提前向分销商通报供应量具有关键意义。

图片1.png

论文标题:

Accurate Crop Yield Estimation of Blueberries using Deep Learning and Smart Drones

论文链接:

https://arxiv.org/pdf/2501.02344

本研究提出基于YOLO(You Only Look Once)深度学习架构的目标检测模型流程,通过编程控制智能无人机精准捕获蓝莓灌木图像并检测每株灌木的可采收浆果数量(图1展示典型蓝莓灌木示例),进而实现田间产量估算。创新点在于:不仅能检测整株灌木上所有可见浆果,还通过灌木检测确保无人机精准定位和图像采集。这种智能任务模式与传统自主任务的区别在于:后者需在任务前预设无人机飞行路径(如沿灌木行保持固定距离飞行),且摄像头以固定视角拍摄。但若因风力或GPS信号丢失导致位置偏移,无人机无法实时调整与灌木的距离或摄像头视角进行补偿。

图片2.png

而搭载灌木检测模型的无人机能执行更智能的任务:在保持安全距离前提下,实时调整飞行位置紧贴灌木丛飞行,获取浆果显示尺寸最大化的最优灌木视角。这使系统无需预先获取每株灌木的精确GPS坐标即可实施分层随机采样等策略——而这正是自主任务必需的前提条件。结合实时动态定位技术(RTK),流程还能实现蓝莓田的精准测绘:先通过灌木模型对每株灌木进行地理标记,飞行后再用浆果模型统计单株浆果数量。配合第三节描述的田间数据,该方案能获得比现有方法更精确的产量估算结果。


一、相关工作

涉及蓝莓的具体研究有:采用YOLOv3-v4模型检测手持设备拍摄蓝莓的成熟度(后者针对野生蓝莓);应用Mask R-CNN模型分割单颗蓝莓以评估成熟阶段;基于U-Net架构开发无人机图像的行间分割模型;提出仅标注蓝莓灌木主干的检测模型。与之对比,灌木检测模型要求识别完整灌木丛,这对产量精确估算至关重要。

现有研究中极少有通过人工采摘验证单株果实数量的工作。为构建验证数据集,人工采摘了15株蓝莓灌木的全部果实获取实际数量(称为"采摘真值")。这类研究稀缺的主要原因是农业产量通常按重量而非果实数量记录。相关验证工作主要针对苹果、芒果等大型果实,以及杏仁和葡萄,但均未如本文那样详细讨论单株可见果实与实际果实的比例关系——这对理解遮挡程度具有重要意义。


二、处理流程

设F为二维矩形蓝莓田,面积A(英亩),包含C株灌木。假设已知田块角点GPS坐标及行向D(所有行方向一致,见图2),Y表示单位面积产量(果实数/英亩)。产量估算流程可概括为:先通过分层采样控制智能无人机飞越随机点,利用灌木检测模型捕获图像;再应用浆果检测模型统计单株浆果数,最终通过公式1估算Y。具体步骤如下(根据采样方法调整):

  • 分层采样

将F划分为M×N非重叠方形网格{Cmn},提出两种网格内灌木采样策略:

  • 点采样:每个网格Cmn内选择距离随机点pmn最近的单株灌木

  • 行采样:在Cmn内沿垂直于D方向的边缘选取随机点pmn,采样整行灌木(见图3)

(a) 控制无人机飞抵各pmn点(预设高度h)

  • 单株灌木检测

(a)在pmn点俯拍视角内,使用灌木模型识别最近灌木bmn(即检测框中心点,见图3),并启动DeepSort目标追踪

3.png

(b) 控制无人机水平飞至bmn正上方(保持高度h)

  • 灌木侧视图像采集

(a)沿垂直于D方向随机选择一侧(考虑太阳角度等因素),水平飞离bmn点至距离d,同步调整摄像头角度维持追踪。可进一步协调无人机位置与摄像头角度确保完整灌木入镜(见图5)

4.png

(b) 点采样:拍摄bmn点灌木图像,记录灌木模型预测的检测框坐标cmn

(c) 行采样:沿D方向飞行,对视野中央灌木连续拍摄并记录各株检测框坐标cmn,直至穿越网格边界。通过目标追踪区分不同灌木并调整位置确保完整拍摄

浆果计数(任务后处理)

(a) 基于检测框坐标cmn统计单侧可见浆果数,提供两种方案(第四节讨论优劣):

i. 图像裁剪:截取检测框cmn区域图像,应用浆果模型统计单株可见浆果

ii. 检测框过滤:在全图上运行浆果模型,仅统计落入cmn框内的检测结果

(b) 计算所有采样灌木的平均浆果数B,乘以2获得整株平均浆果数


三、数据集

  • 数据采集

数据包含两种高丛蓝莓(Vaccinium corymbosum)品种"Duke"和"Draper"的灌木图像(静态照片与视频帧),采集自新泽西州南部多个露天蓝莓农场。为增强数据多样性,同时使用了手持设备(含手机)和无人机摄像头进行拍摄。尽管原始采集图像总数超过千幅,但由于标注工作耗时且资源有限(具体挑战将在下文讨论),实际用于模型训练的仅为其中部分样本。

  • 浆果数据集

浆果数据集共包含95张标注图像,来源分为两类:

航拍图像(无人机):35张

地面图像(手持设备):60张

这95张图像是当前已完成完整标注的全部样本,虽然数量有限,但包含超过10万枚浆果的标注。当前数据集规模已能支撑构建精度合理的模型,后续实验结果将验证这一点。

采用84/16的比例划分训练集与验证集:训练集含80张图像,验证集分为A/B/C三组各5张(见表1)。训练集进一步细分为两个子集(见表2):

5.png

6.png

  • 无人机子集:20张图像,由DJI Phantom 3和Autel Evo II Pro无人机拍摄

  • 手持设备子集:60张图像,来源包括iPhone、Android手机和佳能EOS Rebel单反

所有训练集图像均摄于2021与2022年夏季(示例见图6a、6b、7a、7b)。

7.png

8.png

验证集的构成差异如下:

验证集A:5张DJI Phantom 3无人机2022年夏季航拍图

验证集B:与A集相同灌木群的另一侧视角图像

验证集C:5张DJI Mini 3无人机2023年夏季航拍图

  • 灌木数据集

灌木数据集包含256张无人机拍摄的多角度图像(不同高度与视角,示例见图12、13),按90/10比例划分为训练集与验证集(见表3)。

9.png

10.png

11.png

  • 数据标注

浆果模型标注规范:

为每颗可见浆果绘制紧密包围的矩形检测框,按颜色分为两类:青果(Green)与成熟果(Blue)(示例见图8)

12.png

分类标准通过标注团队共识确定(参考图9、10),未采用客观量化指标

13.png

14.png

考虑过增加颜色分类,但为提升标注效率(总标注量超12万枚,目前该类型最大规模数据集)最终保留两类

各数据集标注数量(青果、成熟果、总量)见表1。青果标注量显著高于成熟果,验证集A的青蓝比最高(10.7),验证集C最低(1.85),这与集C拍摄时间更接近首轮采收日有关

浆果计数模型:

  • 将原图分割为640×640像素的图块(因YOLO模型更适应小尺寸方形输入)

  • 从左上角开始切割,无法完整分割的残余区域弃用(流程示意见图14)

  • 跨图块检测框按中心点归属原则分配

15.png


四、YOLO目标检测

基于以下原因,浆果与灌木模型均采用YOLOv5s(小型架构):

  • 使用更大模型(如YOLOv5m中型或YOLOv5l大型)对训练指标改善有限

  • 灌木模型需依赖无人机机载计算机实时推理,小型模型方能满足性能要求

  • 在Jetson Nano平台搭配Deepstream运行YOLOv5s时,灌木模型可实现6-9帧/秒的检测速度

  • 训练

灌木和浆果模型分别基于灌木和浆果数据集,使用YOLOv5s的超参数配置文件"hyp.scratch-low.yaml"中的默认设置进行训练。我们使用批量大小为32,灌木模型训练最多400个epoch,浆果模型训练最多300个epoch;当交叉验证损失与训练损失出现偏离时,使用默认的早停标准停止训练。训练指标通过Ultralytics YOLOv5的Python工具库中的'metric.py'脚本计算。我们发现改变其他默认参数对准确度影响很小,认为优化这些参数不会改变本文的结论;我们相信更重要的是增加数据集规模并添加更多高分辨率图像来显著改进我们的模型。

  • 验证

使用五折交叉验证中每折最佳模型(基于最高mAP:0.5)对表1和表3中的数据集进行验证。对于浆果模型,每张图像首先被分割为700×700的重叠图块,或尽可能接近这些尺寸,使它们在每个维度上重叠60像素;这样可以避免如果使用不重叠的图块可能导致浆果被重复计数的情况。然后将每个图块通过浆果模型,并使用后处理去除出现在两个重叠图块中的重复检测框。为了计算每个类别的精确率和召回率,应用0.1的置信度阈值生成检测结果,应用0.3的IOU阈值在与真实标注比较时计算真正例;如果有多个检测结果在IOU阈值和类别上都匹配一个真实标注,则选择置信度最高的检测结果。使用较低的IOU阈值(相比YOLOv5默认的0.6阈值)是为了避免消除与真实标注重叠不足的正确预测。这是因为蓝莓的检测框尺寸较小;因此,这些框的位置检测误差即使只有几个像素,也会显著影响它们的IOU。

  • DeepSORT追踪

为了测试我们的灌木模型在第3节流程中讨论的追踪灌木的准确性,我们使用DeepSORT计算多目标追踪准确率(MOTA)。DeepSORT是一种计算机视觉追踪算法,通过为每个检测到的对象分配ID来追踪视频流中的对象[23]。它是简单在线实时追踪(SORT)的扩展,因为它整合了基于深度外观描述符的外观信息。我们将DeepSORT应用于两个短视频片段:一个是无人机执行点采样的视频,另一个是执行行采样的视频。

  • 实验结果

在本节中,我们展示浆果模型和灌木模型的训练和验证结果,包括单独使用和组合使用进行灌木裁剪以获得仅前景中心灌木的总浆果计数的情况。我们还展示了使用DeepSORT算法的灌木模型的追踪结果(MOTA)。

  • 浆果模型

使用五折交叉验证训练了三种不同的浆果模型:无人机模型、手持模型和融合模型。无人机和手持浆果模型分别在20张无人机图像和60张手持图像上训练(见表2)。融合浆果模型(或简称浆果模型)在80张图像(无人机和手持)的合并数据集上训练;我们将这个合并数据集称为浆果训练集。

训练结果:三种浆果模型(无人机、手持、融合)的训练指标分别在表4-6中给出。手持模型在所有指标(精确率、召回率、mAP和F1)上都表现最佳,这在意料之中,因为手持图像中的灌木拍摄距离更近,浆果比无人机图像中的更大,因此检测更容易。无人机模型在精确率方面几乎与手持模型一样好,但召回率明显更差。当然,这两个模型的好坏取决于它们训练所用的数据,因此在下面展示验证结果时,我们会看到它们的性能反转,这支持了需要一个能适应多种不同类型图像的融合模型。

16.png

17.png

18.png

验证结果:表7、8和9分别展示了三种浆果模型(无人机、手持、融合)在验证集A、B和C上的精确率和召回率。对于集A和B(表7、8),无人机浆果模型在所有模型中具有最高的总体精确率;然而,融合模型具有显著更高的总体召回率和略好的蓝色浆果精确率。另一方面,手持浆果模型在所有类别中表现最差。特别是绿色浆果的召回率极低,表明该模型未能检测到许多绿色浆果,特别是在背景灌木上显得更小的那些,这使得模型更难检测它们。此外,蓝色浆果类别的精确率也相当低,这表明手持浆果模型在正确检测蓝色浆果方面表现不佳。至于验证集C(表9),性能发生反转,融合模型现在具有最高的总体精确率,而总体召回率仅比无人机和手持模型略差。观察到手持模型的总体召回率相比表7、8中的结果显著提高。然而,所有三个模型在总体召回率上都表现不佳。对假阴性的检查发现,它们是背景灌木上的浆果,虽然被标注但因尺寸太小或阴影太重而无法被任何模型检测或识别为浆果。总体精确率的结果证明,与单独使用无人机和手持图像训练相比,使用合并的无人机和手持图像训练有助于改进(融合)浆果模型,总体召回率仅略有下降(但绿色浆果召回率最佳)。

19.png

20.png

21.png

表10单独展示了融合浆果模型在三个验证集(A、B和C)上的精确率和召回率,以便更好地比较结果。集C的结果获得了最高的总体精确率,但不幸的是也获得了最低的总体召回率,我们之前将其归因于背景灌木上的浆果像素分辨率太低,模型无法检测。这一点在我们后续仅考虑检测前景中心灌木上的浆果时得到的结果中得到了支持。相反,集B的结果具有最低的总体精确率,但最高的总体召回率。

22.png

图15、16和17展示了集B中的样本图像(B2),但绘制了不同类型的检测框:真实标注(图15)、预测结果(图16)以及假阳性和假阴性(图17)。仔细检查假阳性可以发现,其中一些可能是浆果,但难以清晰辨别,这解释了为什么它们没有被标注。

23.png

24.png

25.png

  • 灌木模型

训练/验证结果:表11给出了在灌木训练集上训练的灌木模型的训练指标。表12给出了在灌木验证集上验证的灌木模型的验证指标。两个表都显示了约90%的高精确率,以及从训练的高70%到验证的低80%的良好召回率。对真阴性(未检测到的灌木)的检查表明,灌木模型难以检测图像边缘的那些灌木。幸运的是,这不是问题,因为灌木模型的目标是检测和追踪前景灌木。

26.png

27.png

图18和19分别展示了灌木模型在斜侧视角和鸟瞰视角下的样本预测结果,后者还包括一个假阳性和假阴性。灌木追踪:我们计算了两段视频的多目标追踪准确率(MOTA):灌木视频1和灌木视频2。灌木视频1(24秒)是由DJI无人机从上方飞向灌木并同时调整其位置和摄像头角度从鸟瞰到斜侧视角拍摄的。灌木视频2(5秒)是由DJI无人机沿蓝莓灌木行横向飞行拍摄的。表13给出了两段视频的MOTA结果。尽管MOTA低于我们的期望,但对检测结果的检查表明,灌木模型在追踪前景中心灌木方面做得非常好,这是模型的主要目标,而在图像边缘的灌木上表现较差,这一点我们之前提到过。

28.png

29.png

  • 灌木裁剪浆果模型

浆果和灌木模型可以组合成一个流程,仅检测出现在单个灌木上的浆果。我们称这个流程为灌木裁剪浆果模型。具体来说,我们首先将全尺寸图像通过灌木模型,获得检测到的灌木及其对应检测框的数组。从这些检测框中,我们选择一个称为中心检测框(对应前景中心灌木;见图21a和21b),其中心在径向距离上最接近图像中心,然后使用OpenCV2围绕中心检测框裁剪图像。裁剪后的图像随后通过浆果模型检测浆果。检测结果与中心检测框内的真实标注进行比较。

30.png

表14、15和16分别展示了使用灌木裁剪浆果模型(无人机、手持和融合)在验证集A、B和C上的验证结果。这次我们看到融合模型在所有验证集上的总体召回率都优于无人机和手持模型。手持浆果模型在集A和B(表14和15)的总体精确率和召回率上都表现最差,正如在全图像验证时观察到的那样(见表10),但在集B(表15)的绿色浆果精确率上出人意料地表现良好。对于集C,融合模型获得了最佳的总体精确率和召回率,手持模型的结果仅略差。这表明集C中的无人机图像几乎具有与手持图像相同的空间分辨率。我们相信,融合模型在未来无人机拍摄的图像上会表现最佳,这些无人机的摄像头分辨率只会继续提高。为了比较,表17单独展示了使用相同的灌木裁剪融合浆果模型验证集A、B和C的结果。这里的结果与在全图像上验证时的结果类似(见表10),但观察到集C的召回率显著提高,因为模型不再需要检测背景灌木上的微小浆果,这在全图像验证时是困难的。

31.png

32.png

33.png


五、讨论

我们的浆果模型结果突显了标注浆果和训练模型时的挑战。由于尺寸小而难以辨别的浆果,特别是背景灌木上的那些,可能导致主观标注,从而产生模糊的真实标注。许多假阳性检测可以被认为是浆果的真实检测,这取决于人的视力,但由于分辨率低而难以确定。此外,部分隐藏浆果的遮挡、绿叶对绿色浆果的伪装以及阴影浆果,使得训练一个准确的浆果模型相当具有挑战性。

灌木模型的结果清楚地表明,检测灌木不一定比检测浆果更容易。显然,灌木比浆果大得多;然而,灌木的复杂枝条结构,加上其枝条可能与邻近灌木重叠,给训练一个准确的灌木模型带来了挑战。

灌木裁剪浆果模型的结果表明,围绕前景中心灌木裁剪以消除背景浆果的有效性,从而提高了模型的精确率和召回率,进而提供了更准确的作物产量估计。基于灌木裁剪浆果模型的采摘-视觉比α估计表明,它可以显著变化,并取决于许多因素,如拍摄的灌木特定侧面和蓝莓品种,以及我们未考虑的其他因素:灌木大小、灌木叶密度、环境和土壤条件。


六、结论

在本文中,我们提出了一种基于深度学习的对象检测模型流程,用于检测蓝莓灌木及其上的单个浆果。这些模型使搭载它们的智能无人机能够执行智能任务,即精确定位灌木并捕捉其侧视图,从而获得更准确的作物产量估计。我们已经开始使用定制构建的可编程无人机来捕获数据以测试我们的流程,并希望在不久的将来报告我们的实验结果。我们希望我们的工作能激发其他人解决本文提出的挑战,并在我们的基准结果上改进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85165.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

API 管理系统实践指南:监控、安全、性能全覆盖

在数字化转型和云原生架构全面普及的当下,API(应用编程接口) 已成为现代技术和业务架构的核心基石。从移动应用到智能硬件,从企业后端系统到 AI 模型调用,几乎所有系统都在通过 API 实现互联互通。API 这个词听起来有点…

Leetcode-​930. 和相同的二元子数组​

Problem: 930. 和相同的二元子数组 思路 滑动窗口 解题过程 我们可以通过计算 和大于等于 goal 的子数组数目 与 和大于等于 goal1 的子数组数目 的差值&#xff0c;来得到 和恰好等于 goal 的子数组数目。 Code c class Solution { public:int at_most(vector<int>&…

『大模型笔记』第1篇:高效请求排队:优化大语言模型(LLM)性能

『大模型笔记』高效请求排队:优化大语言模型(LLM)性能 文章目录 一. 起点:基础的推理引擎二. 问题:“重度用户”会阻塞其他用户三. 解决方案:公平调度3.1. 扩展思路四. 问题:后端队列没有“反压”机制五. 解决方案:获取后端指标5.1 扩展思路六. 替代方案:后端优先级调…

Docker Docker Compose 一键安装

目录 获取安装脚本文件执行安装脚本文件文章结束⚠️ 注意事项&#xff1a;Docker V1 与 V2 的区别 一行命令装 docker 和 docker compose。 你是否厌倦了在不同的 Linux 系统上一遍又一遍地手动安装 Docker 和 Docker Compose&#xff1f;&#x1f914; 不论你是 Ubuntu 、Deb…

Java 单例模式实现方式

Java 单例模式实现方式 单例模式是确保一个类只有一个实例&#xff0c;并提供一个全局访问点的设计模式。以下是 Java 中实现单例模式的几种常见方式&#xff1a; 1. 饿汉式&#xff08;Eager Initialization&#xff09; public class EagerSingleton {// 类加载时就初始化p…

数字化零售如何全面优化顾客体验

一、引言 数字化零售是互联网、大数据、人工智能等技术在零售业中的应用&#xff0c;是现代零售业发展的必然趋势。随着线上购物、移动支付和全渠道销售的普及&#xff0c;零售行业发生了颠覆性的变化。数字化零售不仅提高了企业运营效率&#xff0c;更为顾客提供了便捷、个性化…

rabbitmq 交换机、队列和消息概念

RabbitMQ 是一个功能强大的消息中间件&#xff0c;它采用发布-订阅模式进行消息传递。下面为你详细介绍 RabbitMQ 中交换机、队列和消息的核心概念。 交换机&#xff08;Exchange&#xff09; 交换机在 RabbitMQ 中扮演着接收生产者发送消息的角色&#xff0c;它会根据特定的…

记录一次jenkins slave因为本地安装多个java版本导致的问题

今天&#xff0c;使用jenkins打包&#xff0c;发现slave掉线&#xff0c;上对应机器一看&#xff0c;好家伙&#xff0c;slave运行不起来了。命令行&#xff0c;java -vesion. 没反应&#xff0c;不会是哪个天杀的把java 给卸载了吧&#xff01; 赶紧 where java看下。 还好 ja…

Java中Redis常用的API及其对应的原始API

相信大家写redis的时候经常忘记一些指令吧[狗头][狗头]&#xff0c;这里整理了一下 一、 String&#xff08;字符串类型&#xff09; 1.代码块 // 设置字符串值 stringRedisTemplate.opsForValue().set("key", "value"); // Redis: SET key value// 设置…

C#使用ExcelDataReader高效读取excel文件写入数据库

分享一个库ExcelDataReader &#xff0c;它专注读取、支持 .xls/.xlsx、内存优化。 首先安装NuGet 包 dotnet add package ExcelDataReader dotnet add package System.Text.Encoding.CodePages 编码 内存优化​​&#xff1a;每次仅读取一行&#xff0c;适合处理百万级数据…

雪豹速清APP:高效清理,畅享流畅手机体验

在智能手机的日常使用中&#xff0c;随着时间的推移&#xff0c;手机中会积累大量的垃圾文件&#xff0c;如临时文件、缓存数据、无用的安装包等。这些垃圾文件不仅会占用宝贵的存储空间&#xff0c;还会导致手机运行缓慢&#xff0c;甚至出现卡顿现象。为了解决这一问题&#…

关于使用v-bind绑定多个属性值的问题

背景。自定义表单开发。属性值过多&#xff0c;都写死很臃肿而且不方便维护。通过v-bind绑定非常方便。但是问题又来了。改以怎样的方式处理呢。返回值的格式需要注意 下面是两张动态处理v-bind属性的方法。第一张是写在了方法里面&#xff0c;第二张使用了虚拟属性。使用虚拟…

基于CNN的FashionMNIST数据集识别6——DenseNet模型

源码 import torch from torch import nn from torchsummary import summary""" DenseNet的核心组件&#xff1a;稠密层(DenseLayer) 实现特征复用机制&#xff0c;每个层的输出会与所有前序层的输出在通道维度拼接 """class DenseLayer(nn.Mod…

MySQL 中 INSERT ... ON DUPLICATE KEY UPDATE 为什么会导致主键自增失效?

最近开发的过程中&#xff0c;使用ai生成代码&#xff0c;写了一条这样的SQL&#xff1a;INSERT … ON DUPLICATE KEY UPDATE&#xff0c;然后发现一个奇怪的现象&#xff1a; 为什么使用这个语法后&#xff0c;自增主键&#xff08;AUTO_INCREMENT&#xff09;的值会跳跃甚至…

jenkins流水线打包vue无权限

jenkins在使用npm命令进行拉取依赖时,创建目录会报错无权限&#xff0c;如下如所示 这是因为npm 出于安全考虑不支持以 root 用户运行&#xff0c;即使你用 root 用户身份运行了&#xff0c;npm 会自动转成一个叫 nobody 的用户来运行&#xff0c;而这个用户权限非常低 若需要…

快速实现golang的grpc服务

文章目录 1、安装服务2、检查安装版本情况3、编写proto文件4、生成代码5、实现业务逻辑6、创建provider7、测试调用 1、安装服务 1、protoc安装 需去官网下载 protobuf 2、命令行安装protoc-gen-go和protoc-gen-go-grpc $ go install google.golang.org/protobuf/cmd/protoc-…

C++ 学习 多线程 2025年6月17日18:41:30

多线程(标准线程库 <thread>) 创建线程 #include <iostream> #include <thread>void hello() {std::cout << "Hello from thread!\n"; }int main() {// 创建线程并执行 hello() std::thread t(hello); //线程对象&#xff0c;传入可调用对…

常见的测试工具及分类

Web测试工具是保障Web应用质量的核心支撑&#xff0c;根据测试类型&#xff08;功能、性能、安全、自动化等&#xff09;和场景需求&#xff0c;可分为多个类别。以下从​​八大核心测试类型​​出发&#xff0c;梳理常见工具及其特点、适用场景&#xff1a; ​​一、功能测试工…

七牛存储sdk在springboot完美集成和应用 七牛依赖 自动化配置

文章目录 概要依赖配置属性配置类配置文件业务层控制层运行结果亮点 概要 七牛存储很便宜的&#xff0c;在使用项目的用好官方封装好的sdk&#xff0c;结合springboot去使用很方便&#xff0c;我本地用的是springoot3spring-boot-autoconfigure 依赖 <dependency><…

Java相关-链表-设计链表-力扣707

你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要属性 prev 以指示链表中的上一个节点…