Linux 36.3 + JetPack v6.0@jetson-inference之语义分割

Linux 36.3 + JetPack v6.0@jetson-inference之语义分割

  • 1. 源由
  • 2. segNet
    • 2.1 命令选项
    • 2.2 下载模型
      • 2.2.1 Cityscapes
      • 2.2.2 DeepScene
      • 2.2.3 MHP
      • 2.2.4 VOC
      • 2.2.5 SUN
    • 2.3 操作示例
      • 2.3.1 单张照片
      • 2.3.2 多张照片
      • 2.3.3 视频
  • 3. 代码
    • 3.1 Python
    • 3.2 C++
  • 4. 参考资料

1. 源由

分类和目标识别基本上都是像素级别的卷积应用,并非整个图像范围。语义分割基于图像识别,对于环境感知尤其有用,它可以对场景中的许多不同潜在对象进行密集的逐像素分类,包括场景的前景和背景。

2. segNet

segNet 接受二维图像作为输入,并输出带有逐像素分类掩码叠加的第二张图像。掩码的每个像素对应于被分类的对象类别。

以下是可用的各种预训练分割模型,它们使用具有 Jetson 实时性能的 FCN-ResNet18 网络。这些模型适用于各种环境和主题,包括城市、越野小径以及室内办公空间和家庭。

下表列出了可用的预训练语义分割模型以及用于加载它们的 segnet 的相关 --network 参数。它们基于 21 类 FCN-ResNet18 网络,并使用 PyTorch 在各种数据集和分辨率上进行了训练,并将其导出为 ONNX 格式以便与 TensorRT 加载。

DatasetResolutionCLI ArgumentAccuracyJetson NanoJetson Xavier
Cityscapes512x256fcn-resnet18-cityscapes-512x25683.3%48 FPS480 FPS
Cityscapes1024x512fcn-resnet18-cityscapes-1024x51287.3%12 FPS175 FPS
Cityscapes2048x1024fcn-resnet18-cityscapes-2048x102489.6%3 FPS47 FPS
DeepScene576x320fcn-resnet18-deepscene-576x32096.4%26 FPS360 FPS
DeepScene864x480fcn-resnet18-deepscene-864x48096.9%14 FPS190 FPS
Multi-Human512x320fcn-resnet18-mhp-512x32086.5%34 FPS370 FPS
Multi-Human640x360fcn-resnet18-mhp-640x36087.1%23 FPS325 FPS
Pascal VOC320x320fcn-resnet18-voc-320x32085.9%45 FPS508 FPS
Pascal VOC512x320fcn-resnet18-voc-512x32088.5%34 FPS375 FPS
SUN RGB-D512x400fcn-resnet18-sun-512x40064.3%28 FPS340 FPS
SUN RGB-D640x512fcn-resnet18-sun-640x51265.1%17 FPS224 FPS

2.1 命令选项

$ segnet --help
usage: segnet [--help] [--network NETWORK] ...input_URI [output_URI]Segment and classify a video/image stream using a semantic segmentation DNN.
See below for additional arguments that may not be shown above.positional arguments:input_URI       resource URI of input stream  (see videoSource below)output_URI      resource URI of output stream (see videoOutput below)segNet arguments:--network=NETWORK    pre-trained model to load, one of the following:* fcn-resnet18-cityscapes-512x256* fcn-resnet18-cityscapes-1024x512* fcn-resnet18-cityscapes-2048x1024* fcn-resnet18-deepscene-576x320* fcn-resnet18-deepscene-864x480* fcn-resnet18-mhp-512x320* fcn-resnet18-mhp-640x360* fcn-resnet18-voc-320x320 (default)* fcn-resnet18-voc-512x320* fcn-resnet18-sun-512x400* fcn-resnet18-sun-640x512--model=MODEL        path to custom model to load (caffemodel, uff, or onnx)--prototxt=PROTOTXT  path to custom prototxt to load (for .caffemodel only)--labels=LABELS      path to text file containing the labels for each class--colors=COLORS      path to text file containing the colors for each class--input-blob=INPUT   name of the input layer (default: 'input_0')--output-blob=OUTPUT name of the output layer (default: 'output_0')--alpha=ALPHA        overlay alpha blending value, range 0-255 (default: 150)--visualize=VISUAL   visualization flags (e.g. --visualize=overlay,mask)valid combinations are:  'overlay', 'mask'--profile            enable layer profiling in TensorRTvideoSource arguments:input                resource URI of the input stream, for example:* /dev/video0               (V4L2 camera #0)* csi://0                   (MIPI CSI camera #0)* rtp://@:1234              (RTP stream)* rtsp://user:pass@ip:1234  (RTSP stream)* webrtc://@:1234/my_stream (WebRTC stream)* file://my_image.jpg       (image file)* file://my_video.mp4       (video file)* file://my_directory/      (directory of images)--input-width=WIDTH    explicitly request a width of the stream (optional)--input-height=HEIGHT  explicitly request a height of the stream (optional)--input-rate=RATE      explicitly request a framerate of the stream (optional)--input-save=FILE      path to video file for saving the input stream to disk--input-codec=CODEC    RTP requires the codec to be set, one of these:* h264, h265* vp8, vp9* mpeg2, mpeg4* mjpeg--input-decoder=TYPE   the decoder engine to use, one of these:* cpu* omx  (aarch64/JetPack4 only)* v4l2 (aarch64/JetPack5 only)--input-flip=FLIP      flip method to apply to input:* none (default)* counterclockwise* rotate-180* clockwise* horizontal* vertical* upper-right-diagonal* upper-left-diagonal--input-loop=LOOP      for file-based inputs, the number of loops to run:* -1 = loop forever*  0 = don't loop (default)* >0 = set number of loopsvideoOutput arguments:output               resource URI of the output stream, for example:* file://my_image.jpg       (image file)* file://my_video.mp4       (video file)* file://my_directory/      (directory of images)* rtp://<remote-ip>:1234    (RTP stream)* rtsp://@:8554/my_stream   (RTSP stream)* webrtc://@:1234/my_stream (WebRTC stream)* display://0               (OpenGL window)--output-codec=CODEC   desired codec for compressed output streams:* h264 (default), h265* vp8, vp9* mpeg2, mpeg4* mjpeg--output-encoder=TYPE  the encoder engine to use, one of these:* cpu* omx  (aarch64/JetPack4 only)* v4l2 (aarch64/JetPack5 only)--output-save=FILE     path to a video file for saving the compressed streamto disk, in addition to the primary output above--bitrate=BITRATE      desired target VBR bitrate for compressed streams,in bits per second. The default is 4000000 (4 Mbps)--headless             don't create a default OpenGL GUI windowlogging arguments:--log-file=FILE        output destination file (default is stdout)--log-level=LEVEL      message output threshold, one of the following:* silent* error* warning* success* info* verbose (default)* debug--verbose              enable verbose logging (same as --log-level=verbose)--debug                enable debug logging   (same as --log-level=debug)

注:关于照片、视频等基本操作,详见: 《Linux 36.3 + JetPack v6.0@jetson-inference之视频操作》

2.2 下载模型

两种方式:

  1. 创建 对象时,初始化会自动下载
  2. 通过手动将模型文件放置到data/networks/目录下

国内,由于“墙”的存在,对于我们这种处于起飞阶段的菜鸟来说就是“障碍”。有条件的朋友可以参考《apt-get通过代理更新系统》进行设置网络。

不过,NVIDIA还是很热心的帮助我们做了“Work around”,所有的模型都已经预先存放在中国大陆能访问的位置:Github - model-mirror-190618

  --network=NETWORK    pre-trained model to load, one of the following:* fcn-resnet18-cityscapes-512x256* fcn-resnet18-cityscapes-1024x512* fcn-resnet18-cityscapes-2048x1024* fcn-resnet18-deepscene-576x320* fcn-resnet18-deepscene-864x480* fcn-resnet18-mhp-512x320* fcn-resnet18-mhp-640x360* fcn-resnet18-voc-320x320 (default)* fcn-resnet18-voc-512x320* fcn-resnet18-sun-512x400* fcn-resnet18-sun-640x512--model=MODEL        path to custom model to load (caffemodel, uff, or onnx)

根据以上Model方面信息,该命令支持:

  • fcn-resnet18-cityscapes-512x256
  • fcn-resnet18-cityscapes-1024x512
  • fcn-resnet18-cityscapes-2048x1024
  • fcn-resnet18-deepscene-576x320
  • fcn-resnet18-deepscene-864x480
  • fcn-resnet18-mhp-512x320
  • fcn-resnet18-mhp-640x360
  • fcn-resnet18-voc-320x320 (default)
  • fcn-resnet18-voc-512x320
  • fcn-resnet18-sun-512x400
  • fcn-resnet18-sun-640x512
  • 支持定制模型(需要用到通用的模型文件caffemodel, uff, or onnx)

作为示例,就下载一个fcn-resnet18-voc-320x320 (default)模型

$ mkdir model-mirror-190618
$ cd model-mirror-190618
$ wget https://github.com/dusty-nv/jetson-inference/releases/download/model-mirror-190618/FCN-ResNet18-Pascal-VOC-320x320.tar.gz
$ tar -zxvf FCN-ResNet18-Pascal-VOC-320x320.tar.gz -C ../data/networks
$ cd ..

注:这个模型文件下载要注意,将解压缩文件放置到FCN-ResNet18-Pascal-VOC-320x320目录下。

2.2.1 Cityscapes

Cityscapes数据集专注于对城市街景的语义理解。

在这里插入图片描述

2.2.2 DeepScene

DeepScene包含了在各种数据集上训练的单模态AdapNet++和多模态SSMA模型。
在这里插入图片描述

2.2.3 MHP

Multi-Human Parsing,新加坡国立大学 (NUS) 学习与视觉 (LV) 小组的多人体解析项目旨在推进人群场景中对人类的细粒度视觉理解。多人体解析与传统的定义明确的对象识别任务(如仅提供对象位置粗略预测的目标检测、仅预测实例级掩码而不提供身体部位和时尚类别详细信息的实例分割、以及不区分不同身份的类别级像素预测的人体解析)有显著不同。在现实世界中,多人互动的场景更为现实和普遍。

在这里插入图片描述

2.2.4 VOC

PASCAL VOC项目:

  • 提供用于对象类别识别的标准化图像数据集
  • 提供一套通用工具来访问数据集和注释
  • 使不同方法的评估和比较成为可能
  • 举办了对象类别识别性能评估的挑战赛(2005-2012年,现已结束)
    在这里插入图片描述

2.2.5 SUN

SUNRGB-D四种不同的传感器捕捉,包含10,000张RGB-D图像,规模类似于PASCAL VOC。整个数据集密集注释,包括146,617个2D多边形和58,657个带有准确物体方向的3D边界框,以及场景的3D房间布局和类别。这个数据集使我们能够为场景理解任务训练需要大量数据的算法,使用直接且有意义的3D指标进行评估,避免在小型测试集上过拟合,并研究跨传感器偏差。

在这里插入图片描述

2.3 操作示例

$ cd build/aarch64/bin/

2.3.1 单张照片

# C++
$ ./segnet --network=<model> input.jpg output.jpg                  # overlay segmentation on original
$ ./segnet --network=<model> --alpha=200 input.jpg output.jpg      # make the overlay less opaque
$ ./segnet --network=<model> --visualize=mask input.jpg output.jpg # output the solid segmentation mask
# Python
$ ./segnet.py --network=<model> input.jpg output.jpg                  # overlay segmentation on original
$ ./segnet.py --network=<model> --alpha=200 input.jpg output.jpg      # make the overlay less opaque
$ ./segnet.py --network=<model> --visualize=mask input.jpg output.jpg # output the segmentation mask

举例:

# C++
$ ./segnet --network=fcn-resnet18-cityscapes images/city_0.jpg images/test/output.jpg# Python
$ ./segnet.py --network=fcn-resnet18-cityscapes images/city_0.jpg images/test/output.jpg

在这里插入图片描述

2.3.2 多张照片

# C++
$ ./segnet --network=fcn-resnet18-sun "images/room_*.jpg" images/test/room_output_%i.jpg
# Python
$ ./segnet.py --network=fcn-resnet18-sun "images/room_*.jpg" images/test/room_output_%i.jpg

2.3.3 视频

# Download test video
wget https://nvidia.box.com/shared/static/veuuimq6pwvd62p9fresqhrrmfqz0e2f.mp4 -O pedestrians.mp4
# C++
$ ./segnet --network=fcn-resnet18-cityscapes ../../../pedestrians.mp4 images/test/pedestrians_ssd_segnet_cpp.mp4
# Python
$ ./segnet.py --network=fcn-resnet18-cityscapes ../../../pedestrians.mp4 images/test/pedestrians_ssd_segnet_python.mp4

pedestrians

注:从远距离视频的分析结果看,并不是非常理想,因此,实际还是取决于应用场景。

3. 代码

3.1 Python

- Import Statements:├── import sys├── import argparse├── from jetson_inference import segNet├── from jetson_utils import videoSource, videoOutput, cudaOverlay, cudaDeviceSynchronize, Log└── from segnet_utils import *- Parse Command Line:├── parser = argparse.ArgumentParser(...)├── parser.add_argument("input", ...)├── parser.add_argument("output", ...)├── parser.add_argument("--network", ...)├── parser.add_argument("--filter-mode", ...)├── parser.add_argument("--visualize", ...)├── parser.add_argument("--ignore-class", ...)├── parser.add_argument("--alpha", ...)├── parser.add_argument("--stats", ...)└── args = parser.parse_known_args()[0]- Load Segmentation Network:├── net = segNet(args.network, sys.argv)- Set Alpha Blending Value:└── net.SetOverlayAlpha(args.alpha)- Create Video Output:└── output = videoOutput(args.output, argv=sys.argv)- Create Buffer Manager:└── buffers = segmentationBuffers(net, args)- Create Video Source:└── input = videoSource(args.input, argv=sys.argv)- Process Frames Loop:└── while True:├── img_input = input.Capture()├── if img_input is None:│   └── continue├── buffers.Alloc(img_input.shape, img_input.format)├── net.Process(img_input, ignore_class=args.ignore_class)├── if buffers.overlay:│   └── net.Overlay(buffers.overlay, filter_mode=args.filter_mode)├── if buffers.mask:│   └── net.Mask(buffers.mask, filter_mode=args.filter_mode)├── if buffers.composite:│   └── cudaOverlay(buffers.overlay, buffers.composite, 0, 0)│       └── cudaOverlay(buffers.mask, buffers.composite, buffers.overlay.width, 0)├── output.Render(buffers.output)├── output.SetStatus("{:s} | Network {:.0f} FPS".format(args.network, net.GetNetworkFPS()))├── cudaDeviceSynchronize()├── net.PrintProfilerTimes()├── if args.stats:│   └── buffers.ComputeStats()└── if not input.IsStreaming() or not output.IsStreaming():└── break

3.2 C++

#include statements
├── "videoSource.h"
├── "videoOutput.h"
├── "cudaOverlay.h"
├── "cudaMappedMemory.h"
├── "segNet.h"
└── <signal.h>Global variables
└── bool signal_recieved = false;Function definitions
├── void sig_handler(int signo)
│   └── if (signo == SIGINT)
│       └── LogVerbose("received SIGINT\n");
│           └── signal_recieved = true;
└── int usage()├── printf("usage: segnet [--help] [--network NETWORK] ...\n");├── printf("              input_URI [output_URI]\n\n");├── printf("Segment and classify a video/image stream using a semantic segmentation DNN.\n");├── printf("See below for additional arguments that may not be shown above.\n\n");├── printf("positional arguments:\n");├── printf("    input_URI       resource URI of input stream  (see videoSource below)\n");├── printf("    output_URI      resource URI of output stream (see videoOutput below)\n\n");├── printf("%s\n", segNet::Usage());├── printf("%s\n", videoSource::Usage());├── printf("%s\n", videoOutput::Usage());└── printf("%s\n", Log::Usage());segmentation buffers
├── pixelType* imgMask = NULL;
├── pixelType* imgOverlay = NULL;
├── pixelType* imgComposite = NULL;
├── pixelType* imgOutput = NULL;
├── int2 maskSize;
├── int2 overlaySize;
├── int2 compositeSize;
└── int2 outputSize;allocate buffers
└── bool allocBuffers(int width, int height, uint32_t flags)├── if (imgOverlay != NULL && width == overlaySize.x && height == overlaySize.y)├── CUDA_FREE_HOST(imgMask);├── CUDA_FREE_HOST(imgOverlay);├── CUDA_FREE_HOST(imgComposite);├── overlaySize = make_int2(width, height);├── if (!cudaAllocMapped(&imgOverlay, overlaySize))├── imgOutput = imgOverlay;├── outputSize = overlaySize;├── maskSize = (flags & segNet::VISUALIZE_OVERLAY) ? make_int2(width/2, height/2) : overlaySize;├── if (!cudaAllocMapped(&imgMask, maskSize))├── imgOutput = imgMask;├── outputSize = maskSize;├── compositeSize = make_int2(overlaySize.x + maskSize.x, overlaySize.y);├── if (!cudaAllocMapped(&imgComposite, compositeSize))└── imgOutput = imgComposite;└── outputSize = compositeSize;main function
├── parse command line
├── attach signal handler
├── create input stream
├── create output stream
├── create segmentation network
├── set alpha blending value
├── get overlay/mask filtering mode
├── get visualization flags
├── get object class to ignore
└── processing loop├── capture next image│   └── if (!input->Capture(&imgInput, &status))├── allocate buffers for this size frame│   └── if (!allocBuffers(input->GetWidth(), input->GetHeight(), visualizationFlags))├── process the segmentation network│   └── if (!net->Process(imgInput, input->GetWidth(), input->GetHeight(), ignoreClass))├── generate overlay│   └── if (visualizationFlags & segNet::VISUALIZE_OVERLAY)├── generate mask│   └── if (visualizationFlags & segNet::VISUALIZE_MASK)├── generate composite│   └── if ((visualizationFlags & segNet::VISUALIZE_OVERLAY) && (visualizationFlags & segNet::VISUALIZE_MASK))├── render outputs│   └── if (output != NULL)└── wait for the GPU to finish

4. 参考资料

【1】jetson-inference - Semantic Segmentation with SegNet

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

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

相关文章

Docker面试整理-Docker的核心组件是什么?

Docker 的核心组件构成了它的基本架构,使其能够高效地进行容器化部署和管理。这些组件协同工作,为开发者和系统管理员提供了一个强大的工具集,用于构建、分发和运行容器。主要的核心组件包括: Docker 客户端和服务器(Docker Engine):Docker 客户端(Client)允许用户通过…

【Unity】使用Jenkins实现远程Unity打包

前言 很多时候&#xff0c;我们需要自动打包&#xff0c;比如下班了&#xff0c;我要出一个包明天早上用。比如每天夜里12点&#xff0c;我需要定时出一个稳定包。 这个时候就需要Jenkins了。 1.安装环境 安装 jenkins 之前&#xff0c;需要安装Java 。Java下载网站 ①下载…

揭秘大数据时代的数据库存储引擎:关系型、NoSQL与NewSQL如何选择?

文章目录 01 关系型数据库&NoSQL数据库&NewSQL数据库1. 关系型数据库2. NoSQL数据库3. NewSQL数据库 02 OLTP&OLAP&HTAP对比1. OLTP数据库2. OLAP数据库3. HTAP数据库 03 总结 在大数据和AI时代&#xff0c;数据库成为各类应用不可或缺的重要组成部分。而数据库…

数据湖构建基础:高效数据提取与存储策略

随着大数据技术的快速发展&#xff0c;企业对于数据处理和分析的需求日益增加。数据湖作为一种集中式存储和处理大规模数据的架构&#xff0c;已经成为企业处理非结构化和半结构化数据的重要工具。然而&#xff0c;构建一个高效、稳定的数据湖并非易事&#xff0c;其中高效的数…

JDK参数设置中文版

java最新JDK参数设置 行为选项Garbage First&#xff08;G1&#xff09;垃圾收集选项性能选项调试选项 行为选项 选项默认值描述-XX:-AllowUserSignalHandlers未设置如果应用程序安装了信号处理程序&#xff0c;不要抱怨。&#xff08;仅适用于 Solaris 和 Linux。&#xff09…

2024年生物、农业与工程技术国际会议(BAET 2024)

2024年生物、农业与工程技术国际会议&#xff08;BAET 2024&#xff09; 2024 International Conference on Biology, Agriculture, and Engineering Technology 目录 【会议简介】2024年生物、农业与工程技术国际会议将于昆明盛大召开。此次会议汇聚了全球生物、农业与工程技…

网络编程(一)

网络编程&#xff08;一&#xff09; 网络基础网络体系结构**OSI的7层模型**&#xff1a;&#xff08;理想化&#xff09;**每层的功能** **TCP/IP的4层模型**&#xff1a;&#xff08;在使用&#xff09;常见的协议IP地址IPV4分类A类&#xff08;第1位固定为0&#xff09;B类&…

「前端+鸿蒙」核心技术HTML5+CSS3(十二)

1、CSS3 伸缩盒模型简介 CSS3 的 Flexbox(伸缩盒)模型是一种布局模式,用于在容器内对齐和分配空间,即使它们的大小未知或动态变化。Flexbox 使得布局能够适应不同屏幕尺寸和设备。 示例代码: <div class="flex-container"><div>项目1</div>…

大文件续传,文件分享

1. 最近各种文件分享平台&#xff0c;很多都要注册&#xff0c; 对于很多需要临时分享文件下的场景&#xff0c;不想被这种东西烦恼&#xff0c;于是借鉴网上代码&#xff0c;进行了一些修改&#xff0c; 写了一个文件分享项目&#xff0c; 该项目只是自用&#xff0c;数据库都…

为何使用代理池:

匿名性&#xff1a; 代理池允许爬虫在请求目标网站时使用不同的IP地址&#xff0c;从而保护真实身份。 防封锁&#xff1a; 通过动态切换IP&#xff0c;可以规避网站对特定IP的封锁&#xff0c;提高爬虫的稳定性。 分布式请求&#xff1a; 代理池使爬虫能够通过多个IP地址发起…

go语言接口之接口类型

接口类型具体描述了一系列方法的集合&#xff0c;一个实现了这些方法的具体类型是这个接口类型的 实例。 io.Writer类型是用的最广泛的接口之一&#xff0c;因为它提供了所有的类型写入bytes的抽象&#xff0c;包括文 件类型&#xff0c;内存缓冲区&#xff0c;网络链接&#x…

Science Robotics 可实现中心聚焦与多光谱成像的鸟类视觉启发钙钛矿人工视觉系统

一、前沿速览 来自韩国基础科学研究所&#xff08;IBS&#xff09;纳米粒子研究中心的研究人员及其合作者提出了一个利用鸟类视觉注视点和多光谱成像的人工视觉系统。近日在Science Robotics 上发表的文章引入了人工中央凹和垂直堆叠的钙钛矿光电探测器阵列&#xff0c;其设计…

webserver timer

定时器用来处理非活动链接。 webserver项目中&#xff0c;通过信号函数来实现定时。 调用alarm()系统调用&#xff0c;设置好时间&#xff0c;这段时间结束后&#xff0c;alarm会发出sig_alarm信号。而信号处理函数做的事情仅仅只是将代表该信号的值写入管道(pipefd)。 在event…

NLP基础——序列模型(动手学深度学习)

序列模型 定义 序列模型是自然语言处理&#xff08;NLP&#xff09;和机器学习领域中一类重要的模型&#xff0c;它们特别适合处理具有时间顺序或序列结构的数据&#xff0c;例如文本、语音信号或时间序列数据。 举个例子&#xff1a;一部电影的评分在不同时间段的评分可能是…

#!/usr/bin/env bash

#!/usr/bin/env bash 是一个在 Unix 和 Unix-like 系统&#xff08;如 Linux 和 macOS&#xff09;中常见的 shebang&#xff08;或称为 shebang 行、hashbang、pound bang 或 hash-bang&#xff09;指令。 这个指令有以下几个部分&#xff1a; #!&#xff1a;这是一个特殊的…

智慧校园的发展趋势

在21世纪的数字化浪潮中&#xff0c;教育领域正经历着前所未有的变革。智慧校园&#xff0c;作为这场变革的前沿阵地&#xff0c;其发展趋势正引领着未来教育的新模式。我们将探讨智慧校园在融合技术、全场景应用、生态建设、数据安全以及可持续发展等方面的崭新动向&#xff0…

In eMule and the Kad network, “distance“ meaning

In eMule and the Kad network, “distance” is not defined as the literal number of hops or jumps from one node to another. Instead, it is a mathematical metric used to measure how “close” two identifiers are to each other in the key space. This distance …

特征交叉系列:FFM场感知因子分解机原理与实践

从FM到FFM知识准备 在上一节中[特征交叉系列&#xff1a;完全理解FM因子分解机原理和代码实战]介绍了FM算法&#xff0c;FM因子分解机通过在逻辑回归基础上增加所有特征的二阶交互项实现特征的交叉&#xff0c;但是随着特征数的增多二阶交互的数量呈平方级别增长&#xff0c;F…

ArcGIS模型构建器实例:一键拓扑(附模型下载)

ArcGIS模型构建器特别适用于流程固定的工作流。 要素的拓扑处理就非常符合这一特点&#xff0c;一个要素的拓扑过程基本固定&#xff0c;但是每次拓扑都要来一轮操作就很烦&#xff0c;这正是模型构建器的用武之地。 下面以ArcGIS Pro为例介绍在模型构建器中的整个拓扑流程&a…

CPU 使用率过高问题排查

文章目录 CPU 使用率过高问题排查1. CPU使用率过高常见问题2. 压力测试2.1 stress安装参数说明测试示例 2.2 stress-ng安装参数说明测试示例 3. 问题排查3.1 使用 top 命令3.2 使用 ps 命令3.3 使用 perf top3.4 vmstat 命令常用信息内存信息磁盘信息 CPU 使用率过高问题排查 …