- RK提供了两个模型,mobilenet和YOLO5。
- mobilenet模型相对小,使用起来不是很明显
- yolo5模型大一些,可以对88种目标进行检测,提供检测的结果包括类别、包围框坐标、可信度等信息。基于rknn_yolov5_demo进行分析。
- rknn_yolov5_demo基本信息
- 代码位置:hardware/rockchip/rknpu2/examples/rknn_yolov5_demo
- 编译脚本
- build-android_RK3588.sh
- 使用cmake编译
- CMakeLists.txt
- 编译源文件
头文件在include目录,源代码有两.cc文件92 # rknn_yolov5_demo93 include_directories( ${CMAKE_SOURCE_DIR}/include)94 95 add_executable(rknn_yolov5_demo96 src/main.cc97 src/postprocess.cc98 )99 100 target_link_libraries(rknn_yolov5_demo 101 ${RKNN_RT_LIB} 102 ${RGA_LIB} 103 ${OpenCV_LIBS} 104 )
- 依赖库有rknn_rt、rga、opencv
26 # rknn api27 if(TARGET_SOC STREQUAL "rk356x")28 set(RKNN_API_PATH ${CMAKE_SOURCE_DIR}/../../runtime/RK356X/${CMAKE_SYSTEM_NAME}/librknn_api)29 elseif(TARGET_SOC STREQUAL "rk3588")30 set(RKNN_API_PATH ${CMAKE_SOURCE_DIR}/../../runtime/RK3588/${CMAKE_SYSTEM_NAME}/librknn_api)31 else()32 message(FATAL_ERROR "TARGET_SOC is not set, ref value: rk356x or rk3588 or rv110x")33 endif()34 35 if (CMAKE_SYSTEM_NAME STREQUAL "Android")36 set(RKNN_RT_LIB ${RKNN_API_PATH}/${CMAKE_ANDROID_ARCH_ABI}/librknnrt.so)37 else()38 set(RKNN_RT_LIB ${RKNN_API_PATH}/${LIB_ARCH}/librknnrt.so)39 endif()40 include_directories(${RKNN_API_PATH}/include)41 include_directories(${CMAKE_SOURCE_DIR}/../3rdparty)42 43 # opencv44 if (CMAKE_SYSTEM_NAME STREQUAL "Android")45 set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../3rdparty/opencv/OpenCV-android-sdk/sdk/native/jni/abi-${CMAKE_ANDROID_ARCH_ABI})46 else()47 if(LIB_ARCH STREQUAL "armhf")48 set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../3rdparty/opencv/opencv-linux-armhf/share/OpenCV)49 else()50 set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../3rdparty/opencv/opencv-linux-aarch64/share/OpenCV)51 endif()52 endif()53 find_package(OpenCV REQUIRED)54 55 #rga56 if(TARGET_SOC STREQUAL "rk356x")57 set(RGA_PATH ${CMAKE_SOURCE_DIR}/../3rdparty/rga/RK356X)58 elseif(TARGET_SOC STREQUAL "rk3588")59 set(RGA_PATH ${CMAKE_SOURCE_DIR}/../3rdparty/rga/RK3588)60 else()61 message(FATAL_ERROR "TARGET_SOC is not set, ref value: rk356x or rk3588")62 endif()63 if (CMAKE_SYSTEM_NAME STREQUAL "Android")64 set(RGA_LIB ${RGA_PATH}/lib/Android/${CMAKE_ANDROID_ARCH_ABI}/librga.so)65 else()66 set(RGA_LIB ${RGA_PATH}/lib/Linux//${LIB_ARCH}/librga.so)67 endif()68 include_directories( ${RGA_PATH}/include)
- rknn_rt:rknn的runtime环境,有这个库yolo5就能运行起来
- rga:图像缩放和颜色空间转换,例如YUV到RGB
- opencv:支持图像压缩算法,比如jpg、png等等,支持图像文件载入比如bmp等等
- rga和opencv提供的是对yolo5输入和输出图像的支持,并非必须
- 编译源文件
- build-android_RK3588.sh
- yolo5应用移植
-
目标
移植yolo5应用,从camera采集图像,用yolo5对图像进行检测,得到图像中"人"类别的信息 -
移植分析
前面分析过,只有两个.cc文件,头文件在include中寻找,根据需要添加- main.cc
需要规整为一个C++的类 - postprocess.cc
作为方法实现文件
- main.cc
-
移植代码
确定使用到的就是箭头指向的文件
-
创建class AiAlgoYolo5
class AiAlgoYolo5 : public webrtc::test::VideoFrameSubscriber { public:AiAlgoYolo5(int source_id);virtual ~AiAlgoYolo5();int start(int source_id);void stop();void dump_tensor_attr(rknn_tensor_attr *attr);uint8_t *load_data(FILE *fp, size_t ofst, size_t sz);uint8_t *load_model(const char *filename, int *model_size);int saveFloat(const char *file_name, float *output, int element_size);virtual void OnFrame(const webrtc::VideoFrame &) override;virtual void OnFrame(BOOAT::SharedBufferPtr &videoFrame) override;virtual void CleanFrame() override;int DealOneFrame();private:std::shared_ptr<std::thread> _th{nullptr};ThreadQueue<webrtc::VideoFrame> _qu;ThreadQueue<BOOAT::SharedBufferPtr> _bufferQ;bool _is_stop{ true };int _source_id;int _width;int _height;unsigned char *model_data;rknn_context ctx;rknn_input_output_num io_num;int yolo_input_channel;int yolo_input_width;int yolo_input_height;rknn_input inputs[YOLO5_INPUT_NUMBER];rknn_output outputs[YOLO5_OUTPUT_NUMBER];rknn_tensor_attr input_attrs[YOLO5_INPUT_NUMBER];rknn_tensor_attr output_attrs[YOLO5_OUTPUT_NUMBER];void *resize_buf;private:uint64_t _frame_num;};
- start()准备运行环境- DealOneFrame()采集一张camera图像,完成一帧检测工作,可以多次检测- stop()退出运行环境
- start()实现
int AiAlgoYolo5::start(int source_id){int ret = 0;LOGD("===>>>IN \t[%s] \r\n", __FUNCTION__);LOGD("AiAlgoYolo5::start(): _source_id = [ %d ].\r\n", _source_id);/* Create the neural network */LOGD("Loading mode...\n");char model_name[80] = "/vendor/bin/yolo5/yolov5s-640-640.rknn";int model_data_size = 0;model_data = load_model(model_name, &model_data_size);ret = rknn_init(&ctx, model_data, model_data_size, 0, NULL);if (ret < 0) {LOGE("AiAlgoYolo5 start rknn_init error ret=%d\n", ret);return -1;}rknn_sdk_version version;ret = rknn_query(ctx, RKNN_QUERY_SDK_VERSION, &version, sizeof(rknn_sdk_version));if (ret < 0) {LOGE("AiAlgoYolo5 start rknn_init error ret=%d\n", ret);return -1;}LOGD("AiAlgoYolo5 start sdk version: %s driver version: %s\n", version.api_version, version.drv_version);ret = rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));if (ret < 0) {LOGE("AiAlgoYolo5 start rknn_init error ret=%d\n", ret);return -1;}if ((io_num.n_input != YOLO5_INPUT_NUMBER) || (io_num.n_output != YOLO5_OUTPUT_NUMBER)) {LOGE("AiAlgoYolo5 start model error input num: %d, output num: %d\n", io_num.n_input, io_num.n_output);} else {LOGD("AiAlgoYolo5 start model input num: %d, output num: %d\n", io_num.n_input, io_num.n_output);}memset(input_attrs, 0, sizeof(input_attrs));for (int i = 0; i < io_num.n_input; i++) {input_attrs[i].index = i;ret = rknn_query(ctx, RKNN_QUERY_INPUT_ATTR, &(input_attrs[i]), sizeof(rknn_tensor_attr));if (ret < 0) {LOGE("AiAlgoYolo5 start rknn_init error ret=%d\n", ret);return -1;}dump_tensor_attr(&(input_attrs[i]));}memset(output_attrs, 0, sizeof(output_attrs));for (int i = 0; i < io_num.n_output; i++) {output_attrs[i].index = i;ret = rknn_query(ctx, RKNN_QUERY_OUTPUT_ATTR, &(output_attrs[i]), sizeof(rknn_tensor_attr));dump_tensor_attr(&(output_attrs[i]));}if (input_attrs[0].fmt == RKNN_TENSOR_NCHW) {LOGD("AiAlgoYolo5 start model is NCHW input fmt\n");yolo_input_channel = input_attrs[0].dims[1];yolo_input_height = input_attrs[0].dims[2];yolo_input_width = input_attrs[0].dims[3];} else {LOGD("AiAlgoYolo5 start model is NHWC input fmt\n");yolo_input_height = input_attrs[0].dims[1];yolo_input_width = input_attrs[0].dims[2];yolo_input_channel = input_attrs[0].dims[3];}LOGD("AiAlgoYolo5 start model input height=%d, width=%d, channel=%d\n", yolo_input_height, yolo_input_width, yolo_input_channel);memset(inputs, 0, sizeof(inputs));inputs[0].index = 0;inputs[0].type = RKNN_TENSOR_UINT8;inputs[0].size = yolo_input_width * yolo_input_height * yolo_input_channel;inputs[0].fmt = RKNN_TENSOR_NHWC;inputs[0].pass_through = 0;resize_buf = malloc(640 * 640 * 3);LOGD("===<<<OUT \t[%s] \r\n", __FUNCTION__);return ret;}```rknn_init,加载模型yolov5s-640-640.rknnrknn_query,获取模型中参数信息,进行相应的准备工作,比如input,output。 - stop()实现```void AiAlgoYolo5::stop(){LOGD("===>>>IN \t[%s] \r\n", __FUNCTION__);deinitPostProcess();// releaserknn_destroy(ctx);if (model_data) {free(model_data);model_data = nullptr;}if (resize_buf) {free(resize_buf);resize_buf = nullptr;}LOGD("===<<<OUT \t[%s] \r\n", __FUNCTION__);}```rknn_destroy,环境退出,资源释放 - DealOneFrame()实现
int AiAlgoYolo5::DealOneFrame()
{
uint64_t start_time, stop_time, scal_start_time, scal_stop_time;
char text[256];
bool flag = false;
int ret = 0;const float nms_threshold = NMS_THRESH;const float box_conf_threshold = BOX_THRESH;rga_buffer_t src;rga_buffer_t dst;im_rect src_rect;im_rect dst_rect;memset(&src_rect, 0, sizeof(src_rect));memset(&dst_rect, 0, sizeof(dst_rect));memset(&src, 0, sizeof(src));memset(&dst, 0, sizeof(dst));// 这一段是从camera获取nv12实时图像的代码,依赖图像获取class,开始_bufferQ.clear();BOOAT::SharedBufferPtr frame = _bufferQ.pop(flag, std::chrono::milliseconds(1000));//ms//LOGD("AiAlgoYolo5::DealOneFrame _source_id %d flag %d", _source_id, flag);if (flag) {MP::VideoBufferParam *pBufInfo = static_cast<MP::VideoBufferParam *>(frame->getParam());uint8_t *nv12Data = pBufInfo->yuvPtr;//LOGD("AiAlgoYolo5::DealOneFrame _source_id %d [%d %d] data %p", _source_id, pBufInfo->width, pBufInfo->height, nv12Data);_width = pBufInfo->width;_height = pBufInfo->height;// 这一段是从camera获取nv12实时图像的代码,依赖图像获取class,结束// 这一段是从camera获取到的nv12图像缩放到640x640的RGB图像,用到了rga,结束scal_start_time = AiGetTimeMs();//LOGD("AiAlgoYolo5::DealOneFrame scal_start_time %ld", scal_start_time);if (_width != yolo_input_width || _height != yolo_input_height) {//LOGD("AiAlgoYolo5::DealOneFrame resize with RGA!\n");if (resize_buf) {memset(resize_buf, 0x00, yolo_input_height * yolo_input_width * yolo_input_channel);} else {LOGE("AiAlgoYolo5::DealOneFrame %d, resize_buf check error!", __LINE__);return -1;}src = wrapbuffer_virtualaddr((void *)nv12Data, _width, _height, RK_FORMAT_YCbCr_420_SP);dst = wrapbuffer_virtualaddr((void *)resize_buf, yolo_input_width, yolo_input_height, RK_FORMAT_RGB_888);ret = imcheck(src, dst, src_rect, dst_rect);if (IM_STATUS_NOERROR != ret) {LOGE("AiAlgoYolo5::DealOneFrame %d, check error! %s", __LINE__, imStrError((IM_STATUS)ret));return -1;}IM_STATUS STATUS = imresize(src, dst);inputs[0].buf = resize_buf;} else {inputs[0].buf = (void *)nv12Data;}scal_stop_time = AiGetTimeMs();//LOGD("AiAlgoYolo5::DealOneFrame scal_stop_time %ld", scal_stop_time);LOGD("AiAlgoYolo5::DealOneFrame scal once run use %ld ms", (scal_stop_time - scal_start_time));// 这一段是从camera获取到的nv12图像缩放到640x640的RGB图像,用到了rga库,结束// 这一段是yolo运行检测,开始start_time = AiGetTimeMs();//LOGD("AiAlgoYolo5::DealOneFrame start_time %ld", start_time);rknn_inputs_set(ctx, io_num.n_input, inputs);memset(outputs, 0, sizeof(outputs));for (int i = 0; i < io_num.n_output; i++) {outputs[i].want_float = 0;}ret = rknn_run(ctx, NULL);ret = rknn_outputs_get(ctx, io_num.n_output, outputs, NULL);stop_time = AiGetTimeMs();//LOGD("AiAlgoYolo5::DealOneFrame stop_time %ld", stop_time);LOGD("AiAlgoYolo5::DealOneFrame once run use %ld ms", (stop_time - start_time));// 这一段是yolo运行检测,结束// 这一段对yolo检测结果分析,目前只关心person类别,开始// post processfloat scale_w = (float)yolo_input_width / _width;float scale_h = (float)yolo_input_height / _height;detect_result_group_t detect_result_group;std::vector<float> out_scales;std::vector<int32_t> out_zps;for (int i = 0; i < io_num.n_output; ++i) {out_scales.push_back(output_attrs[i].scale);out_zps.push_back(output_attrs[i].zp);}post_process((int8_t *)outputs[0].buf, (int8_t *)outputs[1].buf, (int8_t *)outputs[2].buf, yolo_input_height, yolo_input_width,box_conf_threshold, nms_threshold, scale_w, scale_h, out_zps, out_scales, &detect_result_group);for (int i = 0; i < detect_result_group.count; i++) {detect_result_t *det_result = &(detect_result_group.results[i]);if (strcmp(det_result->name, "person") == 0) {sprintf(text, "%.1f%%", det_result->prop * 100);LOGD("AiAlgoYolo5::DealOneFrame %s @ (%d %d %d %d) %f\n", det_result->name, det_result->box.left, det_result->box.top,det_result->box.right, det_result->box.bottom, det_result->prop);}}}// 这一段对yolo检测结果分析,目前只关心person类别,结束return 0;
}
-
Android.bp实现
cc_library_static {name: "libAiAlgo",local_include_dirs: ["api/","base/","base/media_base/","base/log/include/","modules/ai_algo/include/",],include_dirs: ["hardware/rockchip/librga/include/","hardware/rockchip/librga/im2d_api/",],srcs: ["modules/ai_algo/src/ai_algo_yolo5.cpp","modules/ai_algo/src/postprocess.cpp",],shared_libs: ["librga","libyuv","librknnrt",],cflags: ["-g","-fexceptions","-Wno-unused-variable","-Wno-unused-function","-Wno-unused-parameter","-Wno-format",], }
由于camera采集到的就是nv12图像,不需要图像的压缩算法,没有用到opencv库。图像的缩放,用了rga库,也可以用yuv库实现。
-
-
运行日志
同事配合,每次都能检测到他,只漏出身体一小部分也能行,效只漏出身体一小部分也能行,可以的:DealOneFrame person @ (996 3 2136 1329) 0.71133904-03 15:45:50.027 13755 13760 D RKCodecEngine: AiAlgoYolo5::OnFrame bufsid 1 sid 1, [3840 2160] 04-03 15:45:50.027 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame _source_id 1 [3840 2160] data 0x7367a42000 04-03 15:45:50.027 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal_start_time 1712130350027 04-03 15:45:50.035 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal_stop_time 1712130350035 04-03 15:45:50.035 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 8 ms 04-03 15:45:50.035 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame start_time 1712130350035 04-03 15:45:50.044 13755 13760 D RKCodecEngine: AiAlgoYolo5::OnFrame bufsid 1 sid 1, [3840 2160] 04-03 15:45:50.061 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame stop_time 1712130350061 04-03 15:45:50.061 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 26 ms 04-03 15:45:50.061 13755 13760 D RKCodecEngine: AiAlgoYolo5::OnFrame bufsid 1 sid 1, [3840 2160] 04-03 15:45:50.061 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame person @ (750 0 1650 1370) 0.356758 04-03 15:45:51.211 13755 13760 D RKCodecEngine: AiAlgoYolo5::OnFrame bufsid 1 sid 1, [3840 2160] 04-03 15:45:51.211 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame _source_id 1 [3840 2160] data 0x73708a4000 04-03 15:45:51.211 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal_start_time 1712130351211 04-03 15:45:51.219 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal_stop_time 1712130351219 04-03 15:45:51.219 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 8 ms 04-03 15:45:51.219 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame start_time 1712130351219 04-03 15:45:51.228 13755 13760 D RKCodecEngine: AiAlgoYolo5::OnFrame bufsid 1 sid 1, [3840 2160] 04-03 15:45:51.242 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame stop_time 1712130351242 04-03 15:45:51.242 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 23 ms 04-03 15:45:51.242 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame person @ (996 3 2136 1329) 0.711339 04-03 15:45:51.244 13755 13760 D RKCodecEngine: AiAlgoYolo5::OnFrame bufsid 1 sid 1, [3840 2160] 04-03 15:45:52.244 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame _source_id 1 [3840 2160] data 0x7372848000 04-03 15:45:52.244 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal_start_time 1712130352244 04-03 15:45:52.253 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal_stop_time 1712130352253 04-03 15:45:52.253 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 9 ms 04-03 15:45:52.253 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame start_time 1712130352253 04-03 15:45:52.261 13755 13760 D RKCodecEngine: AiAlgoYolo5::OnFrame bufsid 1 sid 1, [3840 2160] 04-03 15:45:52.277 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame stop_time 1712130352277 04-03 15:45:52.277 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 24 ms 04-03 15:45:52.277 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame person @ (2040 0 3012 1356) 0.641171 04-03 15:45:53.296 13755 13760 D RKCodecEngine: AiAlgoYolo5::OnFrame bufsid 1 sid 1, [3840 2160] 04-03 15:45:53.296 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame _source_id 1 [3840 2160] data 0x7363afa000 04-03 15:45:53.296 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal_start_time 1712130353296 04-03 15:45:53.306 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal_stop_time 1712130353306 04-03 15:45:53.306 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 10 ms 04-03 15:45:53.306 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame start_time 1712130353306 04-03 15:45:53.314 13755 13760 D RKCodecEngine: AiAlgoYolo5::OnFrame bufsid 1 sid 1, [3840 2160] 04-03 15:45:53.330 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame stop_time 1712130353330 04-03 15:45:53.330 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 24 ms 04-03 15:45:53.330 13755 13755 D RKCodecEngine: AiAlgoYolo5::DealOneFrame person @ (1524 13 2610 1373) 0.404886
- 性能
采集图像的缩放,从4k到640x640用rga实现,耗时11ms04-02 19:14:24.590 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 10 ms 04-02 19:14:24.613 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 23 ms 04-02 19:14:25.640 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 11 ms 04-02 19:14:25.661 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 21 ms 04-02 19:14:26.673 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 11 ms 04-02 19:14:26.697 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 24 ms 04-02 19:14:27.855 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 10 ms 04-02 19:14:27.876 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 21 ms 04-02 19:14:28.888 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 10 ms 04-02 19:14:28.909 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 21 ms 04-02 19:14:29.923 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 11 ms 04-02 19:14:29.944 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 21 ms 04-02 19:14:30.955 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 10 ms 04-02 19:14:30.985 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 30 ms 04-02 19:14:32.005 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 10 ms 04-02 19:14:32.028 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 23 ms 04-02 19:14:33.054 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 9 ms 04-02 19:14:33.076 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 22 ms 04-02 19:14:34.089 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 11 ms 04-02 19:14:34.111 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 22 ms 04-02 19:14:35.139 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 11 ms 04-02 19:14:35.163 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 24 ms 04-02 19:14:36.187 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 9 ms 04-02 19:14:36.210 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 22 ms 04-02 19:14:37.238 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 10 ms 04-02 19:14:37.262 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 23 ms 04-02 19:14:38.421 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 10 ms 04-02 19:14:38.443 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 22 ms 04-02 19:14:39.454 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 10 ms 04-02 19:14:39.476 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 22 ms 04-02 19:14:40.487 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 10 ms 04-02 19:14:40.511 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 24 ms 04-02 19:14:41.538 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 12 ms 04-02 19:14:41.562 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 24 ms 04-02 19:14:42.588 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 11 ms 04-02 19:14:42.610 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 22 ms 04-02 19:14:43.621 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 11 ms 04-02 19:14:43.643 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 22 ms 04-02 19:14:44.654 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame scal once run use 11 ms 04-02 19:14:44.676 24382 24382 D RKCodecEngine: AiAlgoYolo5::DealOneFrame once run use 22 ms
yolo5检测,22ms
能够做到30fps -