.. _lynsdk_sample_usage_guide: LynSDK样例使用指导 ============================================================ .. _directory_structure: 目录结构 ------------------------------------------------------------ :: ├── data ├── common ├── cplusplus │ ├── level1 │ │ ├── event_sample │ │ ├── infer_classify │ │ ├── ipe_mergeimage │ │ ├── ipe_sample │ │ ├── jpeg_decode │ │ ├── jpeg_encode │ │ ├── mem_rdma │ │ ├── mem_server2server_multidevice │ │ ├── mem_server2server_multiprocess │ │ └── plugin_sample │ ├── level2 │ │ ├── infer_classifywithimage │ │ ├── infer_resnet50withimage │ │ ├── video_decode │ │ ├── video_encode │ │ ├── jpge_send_decode │ │ ├── jpge_send_encode │ │ └── video_encode │ └── level3 │ ├── infer_classifywithvideo │ ├── infer_model_plugin │ └── plate_recognition ├── models ├── CMakeLists.txt ├── README.md ├── build.sh .. _sample_code_directory_description: 表 样例代码目录说明 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +----------------+-----------------------------------------+ | 一级目录/文件 | 说明 | +================+=========================================+ | data | 存放用于测试示例的图片和视频文件。 | +----------------+-----------------------------------------+ | common | 存放通用源文件和头文件。 | +----------------+-----------------------------------------+ | cplusplus | 包含所有的C++语言示例。 | | | | | | - level1/event_sample | | | - level1/infer_classify | | | - level1/ipe_mergeimage | | | - level1/ipe_sample | | | - level1/jpeg_decode | | | - level1/jpeg_encode | | | - level1/mem_rdma | | | - level1/mem_server2server_multidevice | | | - level1/mem_server2server_multiprocess | | | - level1/plugin_sample | | | - level2/infer_classifywithimage | | | - level2/infer_resnet50withimage | | | - level2/video_decode | | | - level2/video_encode | | | - level2/jpeg_send_decode | | | - level2/jpeg_send_encode | | | - level3/infer_classifywithvideo | | | - level3/infer_model_plugin | | | - level3/plate_recognition | +----------------+-----------------------------------------+ | models | 存放示例运行可用编译模型。 | +----------------+-----------------------------------------+ | CMakeLists.txt | 编译配置。 | +----------------+-----------------------------------------+ | README.md | 整个软件的说明文档。 | +----------------+-----------------------------------------+ | build.sh | 编译脚本。 | +----------------+-----------------------------------------+ .. _sample_overview: 样例概述 ------------------------------------------------------------ 本章节着重体现样例开发的注意事项,其他描述内容,包括但不限于实现说明、运行说明等,参见示例的README.md。 event_sample ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示使用Event模块实现Stream和Stream之间的同步,以及流和用户线程之间的同步。 infer_classify ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示如何使用推理接口调用lenet模型完成手写数字数据的分类识别。 ipe_mergeimage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示使用IPE模块根据指定位置完成图像拼接。 ipe_sample ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示使用IPE模块完成基础的图像处理,包括图像裁剪、翻转、缩放、颜色空间转换、填充、镜像和旋转等操作。 ipe_batch_sample ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示如何使用IPE模块完成对单张输入图像多种处理操作,获取多张输出图像。 jpeg_decode ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示使用JPEG格式图像硬件解码。实现逐帧解码的接口调用流程参考 :ref:`image_decoding_1` 。 jpeg_encode ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示把YUV的图像数据完成图像硬件编码。该示例中,一次调用异步编码接口发送待编码源数据和接收编码完成后的输出码流。 mem_rdma ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示使用RDMA网卡实现服务器到服务器之间的数据传输。 mem_server2server_multidevice ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示跨芯片的数据传输。 mem_server2server_multiprocess ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示跨进程间使用数据传输。 plugin_sample ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示如何使用一个插件实现图像数据处理,实现图像数据上的文本叠加和矩形框的叠加。 plugin_ipe_sample ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例展示如何使用插件在板卡端直接调用IPE的资源,实现IPE处理操作。 infer_classifywithimage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例用于展示使用硬件解码器对JPEG图像进行硬件解码,然后对解码数据进行IPE图像处理后使用lenet模型进行推理,并用arm-plugin进行推理结果分类。实现模型推理分类接口调用流程介绍参见 :ref:`model_inference` 。 infer_resnet50withimage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例用于展示使用硬件解码器对JPEG图像进行硬件解码,然后对解码数据进行IPE图像处理后使用resnet50模型进行推理,并进行推理结果分类。实现模型推理接口调用流程介绍参见 :ref:`model_inference` 。 video_decode ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例用于展示将输入视频解码为YUV格式图像数据。 jpeg_send_decode ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例用于展示将输入JPEG图像解码为YUV格式图像数据。该示例中,调用发送异步接口发送JPEG图像数据到解码器,调用接收异步接口接收解码后的图像数据。 video_encode ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例用于展示对YUV图像数据进行视频编码。实现视频编码的接口调用流程介绍参见 :ref:`video_encoding_2` 。 jpeg_send_encode ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例用于展示对YUV原始图像数据进行JPEG等格式图像编码。该示例中,调用发送异步接口发送待编码原始YUV图像数据到编码器,调用接收异步接口接收编码后的图像码流数据。实现图像编码的接口调用流程介绍参见 :ref:`jpeg_image_encoding_1` 。 infer_classifywithvideo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例用于展示使用指定模型lenet对解码/处理后的输入视频实施分类识别,并基于输入标识进行plugin结果叠加的方法。实现视频分类接口调用流程介绍参见 :ref:`model_inference` 。 infer_model_plugin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例用于展示使用硬件解码器对输入视频进行硬件解码,然后对解码数据进行IPE图像处理,通过指定不同的参数,可以完成使用yolov5模型或者resnet50模型进行推理视频数据,在ARM设备上以插件形式进行后处理从而将推理结果叠加到视频上。 plate_recognition ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本示例用于展示使用车牌检测和车牌号识别模型执行串行推理。首先,使用接口加载模型,读取视频进行解码,并将解码数据拷贝到device侧,然后使用SDK接口完成IPE处理,使用platedet模型检测到车牌位置和大小。依据车牌位置和大小,使用IPE提取车牌图像,使用提取到的车牌图像和carplat_cls模型,识别车牌号。最终,通过osdPlugin将最后的车牌检测和识别结果叠加到视频上。 注意事项 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 解码和编码时frame buffer的地址需要循环使用,不能一直malloc和free,每路解码器的循环使用地址不超过25个。 - 异步回调函数与同一个Stream里的其他SDK异步接口不属于同一个线程,使用同一资源时需要注意加锁。 - 同一个Stream的回调函数并不像SDK的异步接口一样用lynSynchronizeStream保证任务执行完毕,而是在lynDestroyStream后保证全部执行完成。 .. _p2p_scenario_explain: P2P场景说明 ------------------------------------------------------------ 在上述示例中,3个涉及P2P场景: - mem_rdma - mem_server2server_multidevice - mem_server2server_multiprocess 为了更好地说明P2P场景的实现原理,以及示例的使用和常见问题,具体内容参见《LynSDK Sample(P2P场景)操作说明》。