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

树莓派 AI 摄像头(Raspberry Pi AI Camera)教程

系列文章目录


前言

        人们使用 Raspberry Pi 产品构建人工智能项目的时间几乎与我们生产 Raspberry Pi 的时间一样长。随着我们发布功能越来越强大的设备,我们能够支持的原生应用范围也在不断扩大;但无论哪一代产品,总会有一些工作负载需要外部加速器,比如我们在 6 月份推出的 Raspberry Pi AI Kit。

        AI Kit 是一款功能强大的硬件,每秒可执行 13 万亿次运算。但它只与 Raspberry Pi 5 兼容,而且需要一个单独的摄像头模块来捕捉视觉数据。因此,我们非常高兴地宣布,我们的摄像头产品线又添新成员:Raspberry Pi AI 摄像头。

        AI 相机采用索尼 IMX500 图像传感器,并集成了 AI 加速器。它可以运行各种流行的神经网络模型,具有低功耗和低延迟的特点,让 Raspberry Pi 中的处理器可以执行其他任务。

Raspberry Pi AI 摄像头的主要功能包括

  • 12 MP 索尼 IMX500 智能视觉传感器
  • 传感器模式 4056×3040(10fps),2028×1520(30fps
  • 1.55 微米 × 1.55 微米单元尺寸
  • 78 度视场角,可手动调节焦距
  • 集成 RP2040,用于神经网络和固件管理

        AI 摄像头可使用我们的普通摄像头带状电缆连接到所有型号的 Raspberry Pi,包括 Raspberry Pi Zero。

 

        利用索尼的人工智能工具套件,可以将使用 TensorFlow 或 PyTorch 等框架的现有神经网络模型转换为可在人工智能相机上高效运行的模型。此外,还可以设计新的模型,以利用人工智能加速器的特定功能。

0.1 引擎盖下

        要使用集成的人工智能加速器,我们必须先上传一个模型。在较老的 Raspberry Pi 设备上,这一过程使用的是 I2C 协议,而在 Raspberry Pi 5 上,我们可以使用速度更快的定制双线协议。link 的摄像头端由板载 RP2040 微控制器管理;附加的 16MB 闪存设备会缓存最近使用过的模型,使我们在很多情况下可以跳过上传步骤。

        一旦传感器开始传输数据流,IMX500 就会像标准的拜耳图像传感器一样工作,就像 Raspberry Pi 摄像头模块 3 上的传感器一样。集成的图像信号处理器(ISP)对传感器帧执行基本的图像处理步骤(主要是贝叶到 RGB 的转换和裁剪/缩放),并将处理后的帧直接输入人工智能加速器。神经网络模型处理完帧后,其输出与拜耳帧一起通过 CSI-2 摄像头总线传输到主机 Raspberry Pi。 

0.2 与 Raspberry Pi libcamera 集成

        AI 摄像头的一个主要优势是与我们的 Raspberry Pi 摄像头软件栈无缝集成。在引擎盖下,libcamera 使用我们自己的 ISP 处理拜耳帧,就像处理任何传感器一样。

        我们还解析神经网络结果,生成输出张量,并将其与处理后的拜尔帧同步。这两个结果都会在 libcamera 的请求完成步骤中返回给应用程序。

        Raspberry Pi 相机框架(Picamera2 和 rpicam-apps)以及任何基于 libcamera 的应用程序都能检索输出张量,并与传感器帧正确同步。下面是一个在 rpicam-apps 下运行的物体检测神经网络模型(MobileNet SSD)的示例,该模型对 30fps 的 1080p 视频进行推理。

        该演示使用 rpicam-apps 中的后处理框架,从输出张量中生成对象边界框,并将其绘制到图像上。这一阶段的实现不超过 300 行代码。而使用 Python 和 Picamera2 构建的同等应用程序所需的代码行数要少得多。

        下面的另一个示例显示了姿势估计神经网络模型 (PoseNet) 以 30fps 的速度在 1080p 视频上执行推理。

        虽然这些示例是使用 Raspberry Pi 4 录制的,但它们在 Raspberry Pi Zero 上运行时也具有相同的推理性能!

        我们与索尼公司合作,在我们的模型动物园中发布了许多针对 AI 相机优化的流行视觉神经网络模型,以及使用 Picamera2 的可视化示例脚本。

0.3 我应该购买哪种产品?

        您应该购买 Raspberry Pi AI Kit 还是 Raspberry Pi AI Camera?AI 套件的理论性能比 AI 摄像头高,可支持更多型号,但只兼容 Raspberry Pi 5。AI 摄像头更小巧,如果您还没有摄像头,总成本更低,而且兼容所有型号的 Raspberry Pi。

        最终,这两款产品都能为普通型号提供出色的加速性能,而且都经过了优化,能与我们的相机软件堆栈顺利配合使用。

0.4 入门和更进一步

        查看我们的入门指南。在这里,您可以找到有关安装人工智能相机硬件、设置软件环境以及在我们的模型动物园中运行示例和神经网络的说明。

        索尼的 AITRIOS 开发者网站上有更多关于 IMX500 传感器的技术资源,特别是 IMX500 转换器和 IMX500 软件包文档,这对希望在 AI 相机上运行自定义训练网络的用户非常有用。

        您多年来使用 Raspberry Pi 构建的令人难以置信的人工智能项目给了我们很大的启发,您的辛勤工作和创造力鼓励我们投资工具,帮助您更进一步。先是 AI Kit,现在又是 AI Camera,它们的到来为高分辨率、高帧率、高质量的视觉 AI 开启了一个全新的世界:我们不知道你们会用它们构建出什么,但我们相信一定会很棒。


一、入门

        Raspberry Pi AI 摄像头使用索尼 IMX500 成像传感器,可为任何摄像头应用提供低延迟和高性能的 AI 功能。与 Raspberry Pi 的相机软件栈紧密集成后,用户只需花最少的精力就能部署自己的神经网络模型。

        本节演示了如何在相机上运行预装或自定义神经网络模型。此外,本节还包括在 rpicam-apps 和 Picamera2 中解释在 IMX500 上运行的神经网络生成的推理数据所需的步骤。

 1.1 前提条件

        这些说明假定您正在使用连接到 Raspberry Pi 4 Model B 或 Raspberry Pi 5 板上的 AI 摄像头。只要稍作改动,您就可以在其他带有摄像头连接器的 Raspberry Pi 型号上使用这些说明,包括 Raspberry Pi Zero 2 W 和 Raspberry Pi 3 Model B+。

        首先,确保你的 Raspberry Pi 运行最新的软件。运行以下命令更新:

sudo apt update && sudo apt full-upgrade

1.2 安装 IMX500 固件

        在启动过程中,AI 摄像机必须将运行时固件下载到 IMX500 传感器上。要将这些固件文件安装到 Raspberry Pi 上,请运行以下命令:

sudo apt install imx500-all

        该命令

  • 安装运行 IMX500 传感器所需的 /lib/firmware/imx500_loader.fpk 和 /lib/firmware/imx500_firmware.fpk 固件文件
  • 在 /usr/share/imx500-models/ 中放置大量神经网络模型固件文件
  • 在 rpicam-apps 中安装 IMX500 后期处理软件阶段
  • 安装索尼网络模型打包工具

注意事项
        IMX500 内核设备驱动程序会在相机启动时加载所有固件文件。如果神经网络模型固件之前没有缓存,这可能需要几分钟时间。下面的演示会在控制台上显示一个进度条,以显示固件加载进度。

1.3 重新启动

        现在您已经安装了先决条件,请重启您的 Raspberry Pi:

sudo reboot

二、运行示例应用程序

        一旦更新了所有系统软件包并安装了固件文件,我们就可以开始运行一些示例应用程序了。如前所述,Raspberry Pi AI 摄像头与 libcamera、rpicam-apps 和 Picamera2 完全集成。

2.1 rpicam-apps

        rpicam-apps 相机应用程序包括 IMX500 物体检测和姿态估计阶段,可在后处理管道中运行。有关后处理管道的更多信息,请参阅后处理文档。

        本页上的示例使用位于 /usr/share/rpicam-assets/ 的后处理 JSON 文件。

2.1.1 物体检测

        MobileNet SSD 神经网络执行基本的对象检测,为找到的每个对象提供边界框和置信度值。imx500_mobilenet_ssd.json 包含使用 MobileNet SSD 神经网络的 IMX500 对象检测后处理阶段的构型参数。

        imx500_mobilenet_ssd.json 声明了包含两个阶段的后处理管道:

        imx500_mobilenet_ssd,在输出张量中拾取神经网络生成的边界框和置信度值

        object_detect_draw_cv,在图像上绘制边框和标签

        MobileNet SSD 张量无需在 Raspberry Pi 上进行大量后处理即可生成边界框的最终输出。所有物体检测都直接在人工智能相机上运行。

        以下命令运行 rpicam-hello,并进行物体检测后处理:

rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30

        运行该命令后,你会看到一个取景器,在神经网络识别的对象上叠加了边界框:

        要录制带物体检测叠加的视频,请使用 rpicam-vid 代替。以下命令将运行带有物体检测后处理功能的 rpicam-hello:

rpicam-vid -t 10s -o output.264 --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --width 1920 --height 1080 --framerate 30

        您可以通过多种方式配置 imx500_object_detection 阶段。

        例如,max_detections 定义了管道在任何给定时间内检测到的对象的最大数量,threshold 定义了管道将任何输入视为对象所需的最小置信度值。

        该网络的原始推理输出数据可能会有相当大的噪声,因此该阶段也会执行一些时间过滤并应用滞后。要禁用这种过滤,请移除 temporal_filter 配置块。

2.1.2 姿势估计

        PoseNet 神经网络执行姿态估计,标记身体上与关节和四肢相关的关键点。imx500_posenet.json 包含使用 PoseNet 神经网络的 IMX500 姿态估计后处理阶段的构型参数。

        imx500_posenet.json 声明了包含两个阶段的后处理流水线:

        imx500_posenet,从 PoseNet 神经网络获取原始输出张量

        plot_pose_cv,用于在图像上绘制线条叠加图

        人工智能相机可执行基本的检测,但输出张量需要在 Raspberry Pi 主机上进行额外的后处理,以产生最终输出。

        以下命令运行 rpicam-hello,并进行姿态估计后处理:

rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_posenet.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30

        您可以通过多种方式配置 imx500_posenet 阶段。

        例如,max_detections 定义了管道在任何给定时间内检测到的体的最大数量。 threshold 定义了管道将输入视为体所需的最小置信度值。

2.2 Picamera2

        有关使用 Picamera2 进行图像分类、物体检测、物体分割和姿态估计的示例,请参阅 picamera2 GitHub 存储库。

        大多数示例都使用 OpenCV 进行了一些额外处理。要安装运行 OpenCV 所需的依赖项,请运行以下命令:

sudo apt install python3-opencv python3-munkres

        现在下载 picamera2 软件源到你的 Raspberry Pi 上运行示例。您会在根目录下找到示例文件,其他信息请参见 README.md 文件。

        运行软件源中的以下脚本来运行 YOLOv8 对象检测:

python imx500_object_detection_demo.py --model /usr/share/imx500-models/imx500_network_yolov8n_pp.rpk --ignore-dash-labels -r

        要尝试在 Picamera2 中进行姿势估计,请运行软件源中的以下脚本:

python imx500_pose_estimation_higherhrnet_demo.py

三、引擎盖下

3.1 概述

        如下图所示,Raspberry Pi AI 摄像头的工作原理与传统的基于人工智能的摄像头图像处理系统不同:

        左侧展示了传统人工智能摄像头系统的架构。在这种系统中,摄像头向树莓派(Raspberry Pi)发送图像。Raspberry Pi 处理图像,然后执行人工智能推理。传统系统可能使用外部人工智能加速器(如图所示),也可能完全依赖于 CPU。

        右侧展示了使用 IMX500 的系统架构。摄像头模块包含一个小型图像信号处理器(ISP),可将原始摄像头图像数据转化为输入张量。摄像头模块将该张量直接发送到摄像头内的人工智能加速器,人工智能加速器产生一个包含推理结果的输出张量。人工智能加速器将该张量发送到 Raspberry Pi。无需外部加速器,Raspberry Pi 也无需在 CPU 上运行神经网络软件。

        要充分理解这个系统,请先熟悉以下概念:

  • 输入张量

        传感器图像中传递给人工智能引擎进行推理的部分。由一个小型板载 ISP 生成,它还会将摄像头图像裁剪并缩放至已加载的神经网络所期望的尺寸。输入张量通常不向应用程序提供,但可以为调试目的进行访问。

  • 感兴趣区域 (ROI)

        精确指定传感器图像在重新缩放为神经网络所需的尺寸之前被裁剪掉的部分。可由应用程序进行查询和设置。使用的单位始终是全分辨率传感器输出中的像素。默认 ROI 设置使用从传感器接收到的完整图像,不裁剪任何数据。

  • 输出张量

        神经网络执行推理的结果。输出的精确数量和形状取决于神经网络。应用代码必须了解如何处理张量。

3.2 系统架构

        下图显示了在我们的成像/推理用例中使用的各种相机软件组件(绿色)和 Raspberry Pi AI 相机模块硬件(红色):

        启动时,IMX500 传感器模块加载固件以运行特定的神经网络模型。在流式传输过程中,IMX500 会生成图像流和推理流。推理流包含神经网络模型的输入和输出,也称为输入/输出张量。

3.3 设备驱动程序

        在最底层,IMX500 传感器内核驱动程序通过 I2C 总线构型相机模块。CSI2 驱动程序(在 Pi 5 上为 CFE,在所有其他 Pi 平台上为 Unicam)设置接收器,将图像数据流写入帧缓冲区,同时将嵌入式数据和推理数据流写入内存中的另一个缓冲区。

        固件文件也通过 I2C 总线传输。大多数设备使用标准的 I2C 协议,但 Raspberry Pi 5 使用定制的高速协议。内核中的 RP2040 SPI 驱动程序负责处理固件文件传输,因为传输使用的是 RP2040 微控制器。微控制器通过 SPI 总线连接内核与 IMX500 之间的 I2C 传输。此外,RP2040 还将固件文件缓存在板载存储器中。这就避免了通过 I2C 总线传输整个固件包的需要,大大加快了已使用固件的加载速度。

3.3.1 libcamera

        libcamera 从内核中脱队图像和推理数据缓冲区后,IMX500 特定的 cam-helper 库(libcamera 中 Raspberry Pi IPA 的一部分)会解析推理缓冲区,以访问输入/输出张量。libcamera 返回以下控件:

ControlDescription

CnnOutputTensor

存储输出张量的浮点数组。

CnnInputTensor

存储输入张量的浮点数组。

CnnOutputTensorInfo

描述输出张量结构的网络特定参数:

struct OutputTensorInfo {uint32_t tensorDataNum;uint32_t numDimensions;uint16_t size[MaxNumDimensions];
};struct CnnOutputTensorInfo {char networkName[NetworkNameLen];uint32_t numTensors;OutputTensorInfo info[MaxNumTensors];
};

CnnInputTensorInfo

描述输入张量结构的网络特定参数:

struct CnnInputTensorInfo {char networkName[NetworkNameLen];uint32_t width;uint32_t height;uint32_t numChannels;
};

3.3.2 rpicam-apps

        rpicam-apps 提供了一个 IMX500 后处理阶段基类,用于实现 IMX500 后处理阶段的帮助程序: IMX500PostProcessingStage。使用该基类可为在 IMX500 上运行的任何神经网络模型派生一个新的后处理阶段。有关示例,请参阅 imx500_mobilenet_ssd.cpp:

class ObjectInference : public IMX500PostProcessingStage
{
public:ObjectInference(RPiCamApp *app) : IMX500PostProcessingStage(app) {}char const *Name() const override;void Read(boost::property_tree::ptree const &params) override;void Configure() override;bool Process(CompletedRequestPtr &completed_request) override;
};

        对于应用程序接收到的每一帧,都会调用 Process() 函数(上述情况中为 ObjectInference::Process())。在该函数中,您可以提取输出张量,以便进一步处理或分析:

auto output = completed_request->metadata.get(controls::rpi::CnnOutputTensor);
if (!output)
{LOG_ERROR("No output tensor found in metadata!");return false;
}std::vector<float> output_tensor(output->data(), output->data() + output->size());

        一旦完成,最终结果可以可视化或保存在元数据中,由另一个下游阶段或顶层应用程序本身使用。在对象推理案例中

if (objects.size())completed_request->post_process_metadata.Set("object_detect.results", objects);

        下游运行的 object_detect_draw_cv 后处理阶段会从元数据中获取这些结果,并在 ObjectDetectDrawCvStage::Process() 函数中将边界框绘制到图像上:

std::vector<Detection> detections;
completed_request->post_process_metadata.Get("object_detect.results", detections);

        下表包含 IMX500PostProcessingStage 提供的全部辅助函数:

FunctionDescription

Read()

该函数通常从 <Derived Class>::Read() 中调用,用于读取输入张量解析和保存的配置参数。该函数还读取神经网络模型文件字符串(“network_file”)并设置固件,以便在相机打开时加载。

Process()

该函数通常从 <Derived Class>::Process() 中调用,如果 JSON 配置文件需要,它将处理输入张量并将其保存到文件中。

SetInferenceRoiAbs()

设置传感器图像上的绝对感兴趣区域 (ROI) 裁剪矩形,用于 IMX500 的推断。

SetInferenceRoiAuto()

自动计算传感器图像上的感兴趣区域(ROI)裁剪矩形,以保持给定神经网络的输入张量宽高比。

ShowFwProgressBar()

在控制台上显示一个进度条,显示神经网络固件上传到 IMX500 的进度。

ConvertInferenceCoordinates()

从输入张量坐标空间转换到最终的 ISP 输出图像空间。从原始传感器图像到完全处理后的 ISP 输出图像,会发生许多缩放/裁剪/平移操作。该函数将输出张量提供的坐标转换为执行这些操作后的等效坐标。

3.3.3 Picamera2

        Picamera2 中的 IMX500 集成与 rpicam-apps 中的集成非常相似。Picamera2 有一个 IMX500 辅助类,提供与 rpicam-apps IMX500PostProcessingStage 基类相同的功能。该类可通过以下方式导入任何 python 脚本:

from picamera2.devices.imx500 import IMX500# This must be called before instantiation of Picamera2
imx500 = IMX500(model_file)

        要检索输出张量,可从控件中获取。然后,您可以在 python 脚本中进行额外处理。

        例如,在 imx500_object_detection_demo.py 等对象推理用例中,会在 parse_detections() 中提取对象边框和置信度值,并在 draw_detections() 中在图像上绘制边框:

class Detection:def __init__(self, coords, category, conf, metadata):"""Create a Detection object, recording the bounding box, category and confidence."""self.category = categoryself.conf = confobj_scaled = imx500.convert_inference_coords(coords, metadata, picam2)self.box = (obj_scaled.x, obj_scaled.y, obj_scaled.width, obj_scaled.height)def draw_detections(request, detections, stream="main"):"""Draw the detections for this request onto the ISP output."""labels = get_labels()with MappedArray(request, stream) as m:for detection in detections:x, y, w, h = detection.boxlabel = f"{labels[int(detection.category)]} ({detection.conf:.2f})"cv2.putText(m.array, label, (x + 5, y + 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)cv2.rectangle(m.array, (x, y), (x + w, y + h), (0, 0, 255, 0))if args.preserve_aspect_ratio:b = imx500.get_roi_scaled(request)cv2.putText(m.array, "ROI", (b.x + 5, b.y + 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1)cv2.rectangle(m.array, (b.x, b.y), (b.x + b.width, b.y + b.height), (255, 0, 0, 0))def parse_detections(request, stream='main'):"""Parse the output tensor into a number of detected objects, scaled to the ISP out."""outputs = imx500.get_outputs(request.get_metadata())boxes, scores, classes = outputs[0][0], outputs[1][0], outputs[2][0]detections = [ Detection(box, category, score, metadata)for box, score, category in zip(boxes, scores, classes) if score > threshold]draw_detections(request, detections, stream)

        与 rpicam-apps 示例不同的是,本示例没有应用额外的滞后或时间滤波。

        Picamera2 中的 IMX500 类提供了以下辅助功能:

FunctionDescription

IMX500.get_full_sensor_resolution()

返回 IMX500 传感器的全分辨率。

IMX500.config

返回神经网络构型的字典。

IMX500.convert_inference_coords(coords, metadata, picamera2)

将坐标从输入张量坐标空间转换到最终的 ISP 输出图像空间。必须传递 Picamera2 的图像元数据和 Picamera2 对象。从原始传感器图像到完全处理后的 ISP 输出图像之间会发生许多缩放/剪切/平移操作。该函数将输出张量提供的坐标转换为执行这些操作后的等效坐标。

IMX500.show_network_fw_progress_bar()

在控制台上显示一个进度条,显示神经网络固件上传到 IMX500 的进度。

IMX500.get_roi_scaled(request)

返回 ISP 输出图像坐标空间中的感兴趣区域 (ROI)。

IMX500.get_isp_output_size(picamera2)

返回 ISP 输出图像大小。

IMX5000.get_input_size()

根据使用的神经网络模型返回输入张量大小。

IMX500.get_outputs(metadata)

从 Picamera2 图像元数据元数据返回输出张量。

IMX500.get_output_shapes(metadata)

根据所使用的神经网络模型,从 Picamera2 图像元数据中返回输出张量的形状。

IMX500.set_inference_roi_abs(rectangle)

设置感兴趣区域 (ROI) 裁剪矩形,该矩形决定传感器图像的哪一部分被转换为输入张量,用于 IMX500 的推理。兴趣区域应以传感器全分辨率下的像素为单位,指定为一个(x_offset、y_offset、width、height)元组。

IMX500.set_inference_aspect_ratio(aspect_ratio)

自动计算传感器图像上的感兴趣区域(ROI)裁剪矩形,以保持给定的长宽比。要使 ROI 长宽比与该网络的输入张量完全匹配,请使用 imx500.set_inference_aspect_ratio(imx500.get_input_size())。

IMX500.get_kpi_info(metadata)

返回 IMX500 针对给定图像元数据记录的帧级性能指标。

四、模型部署

        要在 Raspberry Pi AI 摄像头上部署新的神经网络模型,请完成以下步骤:

  1. 提供一个神经网络模型。
  2. 量化并压缩模型,使其能够使用 IMX500 摄像头模块上的可用资源运行。
  3. 将压缩后的模型转换为 IMX500 格式。
  4. 将模型打包成固件文件,以便在运行时加载到相机上。

        前三个步骤通常在台式机或服务器等功能更强大的计算机上执行。您必须在 Raspberry Pi 上运行最后的打包步骤。

4.1 创建模型

        神经网络模型的创建超出了本指南的范围。现有模型可以重复使用,也可以使用 TensorFlow 或 PyTorch 等流行框架创建新模型。

        更多信息,请参阅 AITRIOS 开发者官方网站。

4.2 量化和压缩

        使用索尼模型压缩工具包对模型进行量化和压缩。要安装该工具包,请运行以下命令:

pip install model_compression_toolkit

        更多信息,请参阅索尼模型优化 GitHub 代码库。

        模型压缩工具包以下列格式生成量化模型:

  • Keras (TensorFlow)
  • ONNX(PyTorch)

4.3 转换

        要转换模型,首先要安装转换工具:

pip install imx500-converter[tf]

提示
        始终使用与压缩模型时相同版本的 TensorFlow。

pip install imx500-converter[pt]

        如果需要安装这两个软件包,请使用两个独立的 Python 虚拟环境。这样可以防止 TensorFlow 和 PyTorch 相互冲突。

        接下来,转换模型:

imxconv-tf -i <compressed Keras model> -o <output folder>
imxconv-pt -i <compressed ONNX model> -o <output folder>

        这两个命令都会创建一个输出文件夹,其中包含一份内存使用报告和一个 packerOut.zip 文件。

        有关模型转换过程的更多信息,请参阅索尼 IMX500 转换器官方文档。

4.4 包装

重要事项
        必须在 Raspberry Pi 上运行此步骤。

        最后一步是将模型打包成 RPK 文件。运行神经网络模型时,我们将把该文件上传到 AI 相机。在继续之前,请运行以下命令安装必要的工具:

sudo apt install imx500-tools

        要将模型打包成 RPK 文件,请运行以下命令:

imx500-package.sh -i <path to packerOut.zip> -o <output folder>

        该命令将在输出文件夹中创建一个名为 network.rpk 的文件。你将把这个文件的名称传递给你的 IMX500 相机应用程序。

        有关更全面的说明和所用工具的更多细节,请参阅索尼 IMX500 Packager 文档。

相关文章:

树莓派 AI 摄像头(Raspberry Pi AI Camera)教程

系列文章目录 前言 人们使用 Raspberry Pi 产品构建人工智能项目的时间几乎与我们生产 Raspberry Pi 的时间一样长。随着我们发布功能越来越强大的设备&#xff0c;我们能够支持的原生应用范围也在不断扩大&#xff1b;但无论哪一代产品&#xff0c;总会有一些工作负载需要外部…...

SpringBoot实现的师生健康信息管理平台

第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对医院管理方面的要求也在不断提高&#xff0c;由于老龄化人数更是不断增加&#xff0c;使得师生健康信息管理系统的开发成为必需而且紧…...

启用vnc访问Dell 服务器IDRAC 7虚拟控制台

Dell IDRAC 7 版本太老&#xff0c;SSL证书过期&#xff0c;IDRAC的Java和本地远程虚拟机控制台访问不了&#xff0c;怎么办&#xff1f; 可以启用vnc访问IDRAC 虚拟控制台...

分布式数据库知识详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

无人化焦炉四大车系统 武汉正向科技 工业机车无人远程控制系统

焦炉四大车无人化系统介绍 采用格雷母线光编码尺双冗余定位技术&#xff0c;炉门视觉定位自学习技术&#xff0c;wifi5G无线通讯技术&#xff0c;激光雷达安全识别技术&#xff0c;焦化智慧调度&#xff0c;手机APP监控功能。 焦炉四大车无人化系统功能 该系统能自动生成生产…...

【Linux】几种常见配置文件介绍

配置文件目录 linux 系统中有很多配置文件目录 /etc/systemd/system /lib/systemd/system /usr/lib/systemd/system 【结果就是这个目录配置文件是源头】 这三者有什么样的关系呢&#xff1f; 以下是网络上找的资料汇总&#xff0c;并加了一些操作验证。方便后期使用 介…...

【2024最新】华为HCIE认证考试流程

HCIE是华为认证体系中最高级别的ICT技术认证&#xff0c;表示通过认证的人具有ICT领域专业知识和丰富实践经验。 HCIE认证方向&#xff1a;最高认证级别HCIE的技术方向有13个 下面以HCIE-Datacom为例给大家介绍一下&#xff1a; HCIE-Datacom认证考试流程&#xff1a; 1.笔试…...

Golang | Leetcode Golang题解之第453题最小操作次数使数组元素相等

题目&#xff1a; 题解&#xff1a; func minMoves(nums []int) (ans int) {min : nums[0]for _, num : range nums[1:] {if num < min {min num}}for _, num : range nums {ans num - min}return }...

想知道为什么有DICOM格式,YAML格式,XML格式,JSON格式吗?

1 因为是为了代码和数据的可移植性 我们都知道&#xff0c;现在的操作系统有很大概两种&#xff0c;Win派&#xff0c;UNIX派&#xff08;Mac&#xff0c;Linux和Arm&#xff09;&#xff0c;如果您在不同的机器之间交换二进制文件&#xff0c;二进制数据会被当作垃圾读取&…...

Kubernetes环境搭建

华子目录 Kubernetes部署说明环境准备工作主机准备harbor搭建k8s集群中的主机名和ip设定k8s集群中设置hosts解析k8s中的所有节点关闭防火墙和selinuxk8s集群中禁用swap分区k8s集群中安装docker-cek8s集群中下载harbor证书k8s集群中配置harbor镜像加速器 k8s节点登录harbor测试 …...

draw.io创建自定义形状

Create custom shapes in draw.io using the text editor Reference draw怎么创建和编辑复杂的自定义形状 https://blog.csdn.net/u012028275/article/details/113828875 Create custom shapes in draw.io using the text editor...

【CSS3】css开篇基础(1)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…...

华为杯”第十二届中国研究生数学建模竞赛-D题:单/多列车优化决策问题的研究

目录 摘 要: 一、问题叙述 1.1 研究背景 1.2 要解决的问题 二、基本假设、名词约定及符号说明 2.1 模型假设 2.2 名词约定 2.3 符号说明 三、问题分析与模型准备 3.1 问题分析 3.2 数据处理 3.3 模型准备 3.3.1 列车运行动力学模型 3.3.2 列车运行耗能模型 四、问题一模型建立…...

【Docker】docker的存储

介绍 docker存储主要是涉及到3个方面&#xff1a; 第一个是容器启动时需要的镜像 镜像文件都是基于图层存储驱动来实现的&#xff0c;镜像图层都是只读层&#xff0c; 第二个是&#xff1a; 容器读写层&#xff0c; 容器启动后&#xff0c;docker会基于容器镜像的读层&…...

C++游戏开发深度解析

C游戏开发深度解析 C作为一种高效、灵活且功能强大的编程语言&#xff0c;在游戏开发领域扮演着举足轻重的角色。从独立小游戏到大型3A级游戏&#xff0c;C都以其卓越的性能和广泛的适用性成为游戏开发者们的首选。本文将从C游戏开发的基础、优势、引擎、挑战以及未来趋势等多…...

计算机毕业设计 基于Python的无人超市管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

dockercommit 后的镜像没有数据

docker commit 后的镜像没有数据 docker commit load save mysql背景 工位机环境迁移MySQL时&#xff0c;使用commit》save》MySQL转移》load》run -p&#xff0c;使用数据库连接工具连接成功后&#xff0c;发现没有MySQL中没有库表等数据。 原因分析 直接搜&#xff0c;找…...

基于SD卡的基因(DNA)炫酷LED桌面灯

基于SD卡的基因&#xff08;DNA&#xff09;炫酷LED桌面灯 一、介绍一个已知的问题解决办法 二、支持目录材料准备LED灯光文件&#xff08;我使用的PLA颜色&#xff09; 三、 打印部件和焊接四、拼装打印的DNA散件五、组合DNA螺旋结构六、执行DNA文件七、程序烧录八、总结及成品…...

【算法系列-链表】设计链表

【算法系列-链表】设计链表 文章目录 【算法系列-链表】设计链表1. 算法分析&#x1f6f8;2. 解题过程&#x1f3ac;2.1 初始化2.1.1 思路分析&#x1f3af;2.1.2 代码示例&#x1f330; 2.2 get(获取第n个节点的值)2.2.1 思路分析&#x1f3af;2.2.2 代码示例&#x1f330; 2.…...

螺狮壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)

3 网络及IP规划 3.1 容器连接网络初步规划 规划所有容器与虚拟机的三张网卡以macvlan的方式进行连接&#xff08;以后根据应用可以更改&#xff09;&#xff0c;在docker下创建nat、wifi、nei、wai四张网卡&#xff0c;他们和虚拟机及宿主机上NIC的相关连接参数如下表所示&am…...

Zookeeper下载、安装配置

一、基础配置 使用zookeeper 需要提前配置安装好zookeeper的环境 端口 默认的2888端 默认的 2888端口‌主要用于Leader和Follower之间的通信。在ZooKeeper集群中&#xff0c;这个端口用于数据同步、服务器初始化以及会话管理等方面的通信。默认的3888 3888端口‌则是在选举L…...

【代码记录】多线程示例代码

用多线程处理多gpu模型输入的时候写的&#xff0c;感觉复用性会很不错&#xff0c;用以记录和分享 import threading def multithreadhelper(workfn,alldata:list,number:int):# workfn takes only one argument: a example of alldata# data preparationdef chunk_data(data,…...

【数据结构】什么是平衡二叉搜索树(AVL Tree)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;AVL树的概念 &#x1f4cc;AVL树的操作 &#x1f38f;AVL树的插入操作 ↩️右单旋 ↩️↪️右左双旋 ↪️↩️左右双旋 ↪️左单旋 &#x1f38f;AVL树的删…...

ip的类型有多少种?我想做大数据需要使用哪一种

IP地址主要分为两种类型&#xff1a; IPv4&#xff08;Internet Protocol version 4&#xff09;&#xff1a; 由32位二进制数组成&#xff0c;通常以四个十进制数表示&#xff08;例如&#xff1a;192.168.1.1&#xff09;。每个十进制数的范围是0到255。IPv4地址的总数量约为…...

位运算(6)_只出现一次的数字 II

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 位运算(6)_只出现一次的数字 II 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …...

C#的Socket编程细节

目录 Socket中的Accept 步骤1&#xff1a;创建并绑定服务端套接字 步骤2&#xff1a;接受连接请求 步骤3&#xff1a;与客户端通信 步骤4&#xff1a;关闭套接字 注意事项 Socket中的Connected 使用Connected属性 客户端检查连接状态 服务端检查连接状态 注意事项 S…...

python三局两胜游戏

分为以下步骤实现这个功能 1、猜拳 2、机器产生数值 3、人去猜数字&#xff0c;定义剪刀石头布 4、控制机器产生&#xff0c;123程序运行的时候可能会出现一点玄学问题&#xff0c;就是&#xff0c;提示n1这一行不符合pep8然后报错&#xff0c;不用管&#xff0c;运行就可以&am…...

java:brew安装rabbitmq以及简单示例

什么是消息队列mq 可以看我之前写的这篇 消息队列MQ rabbitmq简介 RabbitMQ是由erlang语言开发&#xff0c;基于AMQP&#xff08;Advanced Message Queue 高级消息队列协议&#xff09;协议实现的消息队列&#xff0c;它是一种应用程序之间的通信方法&#xff0c;消息队列在…...

基于单片机跑步机控制系统设计

** 文章目录 前言概要功能设计设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…...

【架构】efk日志监控

文章目录 一、EFK组件及其功能二、EFK日志监控的工作流程三、EFK日志监控的优势四、EFK日志监控的应用场景 推荐阅读 EFK日志监控是一种高效的日志管理解决方案&#xff0c;由Elasticsearch、Fluentd&#xff08;或Logstash&#xff09;和Kibana三个开源工具组成。以下是对EFK日…...

个人做的网站/如何利用网络进行推广和宣传

http://zhidao.baidu.com/question/165013255.html 满江红2里面的&#xff1a;   彼岸花   开一千年   落一千年   花叶永不相见   情不为因果   缘注定生死   佛经   凤凰山 完颜端华之死   叹少年   轻狂不知愁滋味   苦思盼   依稀归途人断肠   望…...

创建一个自己的公司英语/seo快排技术教程

gitlab 12.0.3GitLab已发布其devops平台的13.0版&#xff0c;该平台集成了用于软件开发&#xff0c;部署和项目管理的工具。 GitLab 13.0添加了许多新的安全性和协作功能。 GitLab结合了Git开源分布式版本控制系统 &#xff0c; 持续集成和持续交付 &#xff08; CI / CD &…...

塘厦做网站/搭建网站需要什么技术

蓝桥杯 算法训练 景点游览 ALGO-217 资源限制 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB 问题描述 小明来到一个景区游玩&#xff0c;但是他的时间有限&#xff0c;没办法逛遍所有的景点&#xff0c;所以他从网上下载了每个景点的评分&#xff0c;他希望能够使…...

wordpress完全删除插件/磁力猫搜索引擎入口官网

1、开店前自己做好资金预算 做水果店生意这行&#xff0c;能干的多去批发市场&#xff0c;所以一开始一定要清楚&#xff0c;这不是暴利&#xff0c;需要的就是日常持续经营&#xff0c;薄利多销。开水果店主入门学习交流圈子&#xff0c;朋友圈下搜一搜功能&#xff0c;搜水果…...

wordpress插件 flyzoo/搜索关键词优化服务

Session state模式的健壮性 InProc&#xff1a;如果工作者进程&#xff08;aspnet_wp.exe&#xff09;进行资源回收或者应用程序域(appdomain)重启动&#xff0c;session state就会丢失。这是因为session state是保存在一个应用程序域的内存空间中的。对配置文件&#xff08;如…...

卡片式设计网站/百度推广费用可以退吗

目录 HTTPS 是什么 HTTPS 怎么对数据进行加密 HTTPS 怎么验证网站服务器身份 数据被篡改怎么办 服务器公钥被篡改怎么办 客户端怎么校验数字证书 HTTPS 原理一览图如下&#xff1a; 我相信大家面试的时候对于 HTTPS 这个问题一定不会陌生&#xff0c;可能你只能简单的说…...