载物台在大小为 300×300 的低分辨率流图像上运行。运行以下命令,将 300×300 裁剪从 400×300 低分辨率图像的中心传递到检测器,以将此阶段文件与 rpicam-hello 一起使用: rpicam-hello --post-process-file object_detect_tf.json --lores-width 400 --lores-height 300
检测苹果和猫的物体。
segmentation_tf阶段下载: https://tfhub.dev/tensorflow/lite-model/deeplabv3/1/metadata/2?lite-format=tflite segmentation_tf 使用 Google MobileNet v1 模型。此阶段需要一个标签文件,可在 assets/segmentation_labels.txt 中找到。 此阶段在大小为 257×257 的图像上运行。由于 YUV420 图像必须具有均匀的尺寸,因此低分辨率图像的宽度和高度都应至少为 258 像素。该阶段将 257×257 个值的向量添加到图像元数据中,其中每个值表示像素所属的类别。您可以选择在图像的右下角绘制分割的表示形式。 您可以使用以下参数配置此阶段: refresh_rate | 模型运行之间必须经过的帧数 |
---|
model_file | TFLite 模型文件的文件路径 | labels_file | 包含标签列表的文件的文件路径 | threshold | 设置详细时,当带有任何标签的像素数超过此数字时打印 | draw | 将分割图绘制到图像的右下角 | verbose | 将额外信息输出到控制台 |
文件segmentation_tf.json示例: {
"segmentation_tf" : {
"number_of_threads" : 2,
"refresh_rate" : 10,
"model_file" : "/home//models/lite-model_deeplabv3_1_metadata_2.tflite",
"labels_file" : "/home//models/segmentation_labels.txt",
"draw" : 1,
"verbose" : 1
}
}
本示例采用相机图像,并将其大小减小到 258×258 像素。此阶段甚至可以在不裁剪的情况下压缩非方形图像时工作。本示例启用右下角的分段图。 运行以下命令以将此阶段文件与 rpicam-hello 一起使用: rpicam-hello --post-process-file segmentation_tf.json --lores-width 258 --lores-height 258 --viewfinder-width 1024 --viewfinder-height 1024
运行分段并在右下角的地图上显示结果。
编写自己的后期处理阶段借助 rpicam-apps 后处理框架,用户可以创建自己的自定义后处理阶段。您甚至可以包含来自 OpenCV 和 TensorFlow Lite 的算法和例程。 基本后处理阶段若要创建自己的后处理阶段,请从 PostProcessingStage 类派生一个新类。所有后处理阶段都必须实现以下成员函数: char const *Name() const 返回阶段的名称。与 JSON 后处理配置文件中列出的阶段匹配。 void Read(boost::property_tree::ptree const ¶ms) 从提供的 JSON 文件中读取阶段的配置参数。 void AdjustConfig(std::string const &use_case, StreamConfiguration *config) 为舞台提供影响摄像机配置的机会。对于不需要配置摄像机的舞台,经常是空的。 void Configure() 在配置摄像机以分配资源并检查舞台是否有权访问必要的流后立即调用。 void Start() 相机启动时调用。对于不需要配置摄像机的舞台,经常是空的。 bool Process(CompletedRequest &completed_request) 显示已完成的相机请求以进行后期处理。在这里,您将实现像素操作和图像分析。如果后处理框架不应将此请求传递到应用程序,则返回 true。 void Stop() 当相机停止时调用。用于关闭异步线程上的任何活动处理。 void Teardown() 在相机配置被破坏时调用。将其用作解构器,您可以在其中取消分配在 Configure 方法中设置的资源。 在任何阶段实现中,调用 RegisterStage 以向系统注册阶段。 别忘了将您的舞台也添加到后期处理文件夹的CMakeLists.txt中! 在编写自己的阶段时,请记住以下提示: Process 方法会阻止映像管道。如果花费的时间太长,管道将卡顿。始终将耗时的算法委托给异步线程。 将工作委派给另一个线程时,必须复制映像缓冲区。对于不需要全分辨率的图像分析等应用程序,请尝试使用低分辨率图像流。 后处理框架使用并行性来处理每一帧。这样可以提高吞吐量。但是,某些 OpenCV 和 TensorFlow Lite 函数在每个帧中引入了另一层并行性。考虑在每个帧内序列化调用,因为后处理已经利用了多个线程。 大多数流(包括低分辨率流)都使用 YUV420 格式。对于某些 OpenCV 或 TFLite 函数,您可能需要将其转换为另一种格式。 为获得最佳性能,请始终就地更改图像。
有关基本示例,请参阅negate_stage.cpp 。此阶段通过将浅色像素变暗和将深色像素变亮来否定图像。这个阶段主要是派生类样板,在不到六行代码中实现了否定逻辑。 有关另一个示例,请参阅 sobel_cv_stage.cpp ,它仅用几行 OpenCV 函数实现了 Sobel 过滤器。 TensorFlow Lite 阶段对于使用 TensorFlow Lite (TFLite) 的阶段,请从 TfStage 类派生一个新类。此类将模型执行委托给单独的线程,以防止相机卡顿。 TfStage 类实现后处理阶段通常必须实现的所有 PostProcessingStage 成员函数,但 Name 除外。所有 TfStage 派生的阶段都必须实现 Name 函数,并应实现以下部分或全部虚拟成员函数: void readExtras() 基类读取命名模型和某些其他参数,如refresh_rate。使用此函数可以读取派生阶段的额外参数,并检查加载的模型是否正确(例如,具有正确的输入和输出维度)。 void checkConfiguration() 基类获取 TFLite 操作的低分辨率流和全分辨率流,以防派生阶段需要它。使用此函数可以检查阶段所需的流。如果您的舞台无法访问所需的流之一,您可能会跳过处理或引发错误。 void interpretOutputs() 使用此函数可以读取和解释模型输出。模型完成时,在与模型相同的线程中运行。 void applyResults() 使用此函数将模型的结果(可能是几帧旧)应用于当前帧。通常涉及附加元数据或图形。在交付帧之前在主线程中运行。 有关示例实现,请参阅object_classify_tf_stage.cpp 和pose_estimation_tf_stage.cpp 。 高级 rpicam-apps构建 libcamera 和 rpicam-apps为自己构建 libcamera 和 rpicam-apps,以获得以下好处: 您可以了解最新的增强功能和功能。 rpicam-apps 可以通过额外的优化来编译运行 32 位操作系统的 Raspberry Pi 3 和 Raspberry Pi 4 设备。 您可以包括可选的 OpenCV 和/或 TFLite 后处理阶段,也可以添加您自己的后处理阶段。 您可以自定义或添加自己的应用程序,这些应用程序派生自 rpicam-apps
在不构建 libcamera 的情况下构建 rpicam-apps要在不先重建 libcamera 和 libepoxy 的情况下构建 rpicam-apps,请使用 apt 安装 libcamera、libepoxy 及其依赖项: sudo apt install -y libcamera-dev libepoxy-dev libjpeg-dev libtiff5-dev libpng-dev
提示:如果不需要对 GLES/EGL 预览窗口的支持,请省略 libepoxy-dev。 要使用 Qt 预览窗口,请安装以下附加依赖项: sudo apt install -y qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5
对于 rpicam-vid 中的 libav 支持,请安装以下附加依赖项: sudo apt install libavcodec-dev libavdevice-dev libavformat-dev libswresample-dev
如果您运行的是 Raspberry Pi OS Lite,请安装 git: sudo apt install -y git
接下来,构建 rpicam-apps。 构建 libcamera注意:仅当需要自定义行为或尚未到达 apt 存储库的最新功能时,才从头开始构建 libcamera。 注意:如果运行 Raspberry Pi OS Lite,请首先安装以下软件包: sudo apt install -y python3-pip git python3-jinja2
首先,安装以下 libcamera 依赖项: sudo apt install -y libboost-dev
sudo apt install -y libgnutls28-dev openssl libtiff5-dev pybind11-dev
sudo apt install -y qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5
sudo apt install -y meson cmake
sudo apt install -y python3-yaml python3-ply
sudo apt install -y libglib2.0-dev libgstreamer-plugins-base1.0-dev
现在我们已经准备好构建 libcamera 本身了。 从 GitHub 下载 Raspberry Pi 的 libcamera 分支的本地副本: git clone https://github.com/raspberrypi/libcamera.git
导航到存储库的根目录: cd libcamera
接下来,运行 meson 配置构建环境: meson setup build --buildtype=release -Dpipelines=rpi/vc4,rpi/pisp -Dipas=rpi/vc4,rpi/pisp -Dv4l2=true -Dgstreamer=enabled -Dtest=false -Dlc-compliance=disabled -Dcam=disabled -Dqcam=disabled -Ddocumentation=disabled -Dpycamera=enabled
注意:您可以通过在介子构建配置期间将 -Dgstreamer=enabled 替换为 -Dgstreamer=disabled 来禁用 gstreamer 插件。如果禁用 gstreamer,则无需安装 libglib2.0-dev 和 libgstreamer-plugins-base1.0-dev 依赖项。 现在,您可以使用 ninja 构建 libcamera: ninja -C build
最后,运行以下命令以安装新构建的 libcamera 二进制文件: sudo ninja -C build install
提示:在内存为 1GB 或更少的设备上,内部版本可能会超出可用内存。将 -j 1 标志附加到 ninja 命令,以将构建限制为单个进程。这应该可以防止构建超出 Raspberry Pi Zero 和 Raspberry Pi 3 等设备上的可用内存。 libcamera 还没有稳定的二进制接口。在构建 libcamera 后,始终构建 rpicam-apps。 构建 rpicam-apps首先获取 rpicam-apps 的必要依赖项。 sudo apt install -y cmake libboost-program-options-dev libdrm-dev libexif-dev
sudo apt install -y meson ninja-build
下载 Raspberry Pi 的 rpicam-apps GitHub 存储库的本地副本: git clone https://github.com/raspberrypi/rpicam-apps.git
导航到存储库的根目录: cd rpicam-apps
对于基于桌面的操作系统(如 Raspberry Pi OS),请使用以下 meson 命令配置 rpicam-apps 构建: meson setup build -Denable_libav=enabled -Denable_drm=enabled -Denable_egl=enabled -Denable_qt=enabled -Denable_opencv=disabled -Denable_tflite=disabled
对于像 Raspberry Pi OS Lite 这样的无头操作系统,请使用以下 meson 命令配置 rpicam-apps 构建: meson setup build -Denable_libav=disabled -Denable_drm=enabled -Denable_egl=disabled -Denable_qt=disabled -Denable_opencv=disabled -Denable_tflite=disabled
提示: 使用 -Dneon_flags=armv8-neon 对 Raspberry Pi 3 或 Raspberry Pi 4 上的 32 位操作系统进行优化。 如果您已安装 OpenCV 并希望使用基于 OpenCV 的后处理阶段,请使用 -Denable_opencv=enabled。 如果您已安装 TensorFlow Lite 并希望在后处理阶段使用它,请使用 -Denable_tflite=enabled。
您现在可以使用以下命令构建 rpicam-apps: meson compile -C build
提示:在内存为 1GB 或更少的设备上,内部版本可能会超出可用内存。将 -j 1 标志附加到 meson 命令,以将构建限制为单个进程。这应该可以防止构建超出 Raspberry Pi Zero 和 Raspberry Pi 3 等设备上的可用内存。 最后,运行以下命令以安装新构建的 rpicam-apps 二进制文件: sudo meson install -C build
安装后打开新的终端窗口,以确保使用新的二进制文件。 最后,按照“配置”部分中的dtoverlay 和显示驱动程序说明进行操作。 RPiCAM-Apps 介子标志参考rpicam-apps 的介子构建配置支持以下标志: -Dneon_flags=armv8-neon 加速运行 32 位操作系统的 Raspberry Pi 3 或 Raspberry Pi 4 设备上的某些后处理功能。 -Denable_libav=enabled 启用或禁用 libav 编码器集成。 -Denable_drm=enabled 启用或禁用 DRM/KMS 预览呈现,这是在没有桌面环境的情况下使用的预览窗口。 -Denable_egl=enabled 启用或禁用非 Qt 桌面环境预览。如果您的系统缺少桌面环境,请禁用。 -Denable_qt=enabled 启用或禁用对预览窗口的基于 Qt 的实现的支持。如果您没有安装桌面环境,或者您不打算使用基于 Qt 的预览窗口,请禁用。通常不推荐使用基于Qt的预览,因为它的计算成本非常高,但是它确实适用于X显示转发。 -Denable_opencv=enabled 强制基于 OpenCV 的后处理阶段链接或不链接。需要 OpenCV 才能启用。默认为disabled。 -Denable_tflite=enabled 启用或禁用 TensorFlow Lite 后处理阶段。默认情况下处于禁用状态。需要 Tensorflow Lite 才能启用。根据您构建和/或安装 TFLite 的方式,您可能需要调整 post_processing_stages 目录中的 meson.build 文件。 上述每个选项(neon_flags 除外)都支持以下值: 构建libepoxy通常不需要重建 libepoxy,因为该库很少更改。但是,如果您确实想从头开始构建它,请按照以下说明进行操作。 首先安装必要的依赖项。 sudo apt install -y libegl1-mesa-dev
接下来,从 GitHub 下载 libepoxy 存储库的本地副本: git clone https://github.com/anholt/libepoxy.git
导航到存储库的根目录: cd libepoxy
|