RK3588 NPU 研究(二)

  1. RK提供了两个模型,mobilenet和YOLO5。
    • mobilenet模型相对小,使用起来不是很明显
    • yolo5模型大一些,可以对88种目标进行检测,提供检测的结果包括类别、包围框坐标、可信度等信息。基于rknn_yolov5_demo进行分析。
  2. rknn_yolov5_demo基本信息
    • 代码位置:hardware/rockchip/rknpu2/examples/rknn_yolov5_demo
    • 编译脚本
      • build-android_RK3588.sh
        • 使用cmake编译
      • CMakeLists.txt
        • 编译源文件
           92 # rknn_yolov5_demo
           93 include_directories( ${CMAKE_SOURCE_DIR}/include)
           94 
           95 add_executable(rknn_yolov5_demo
           96         src/main.cc
           97         src/postprocess.cc
           98 )
           99 
          100 target_link_libraries(rknn_yolov5_demo
          101   ${RKNN_RT_LIB}
          102   ${RGA_LIB}
          103   ${OpenCV_LIBS}
          104 )
          
          头文件在include目录,源代码有两.cc文件
        • 依赖库有rknn_rt、rga、opencv
           26 # rknn api
           27 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 # opencv
           44 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 #rga
           56 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输入和输出图像的支持,并非必须
  3. yolo5应用移植
    • 目标
      移植yolo5应用,从camera采集图像,用yolo5对图像进行检测,得到图像中"人"类别的信息

    • 移植分析
      前面分析过,只有两个.cc文件,头文件在include中寻找,根据需要添加

      • main.cc
        需要规整为一个C++的类
      • postprocess.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.rknn
        	rknn_query,获取模型中参数信息,进行相应的准备工作,比如input,output。
        - stop()实现
        	```
        	void AiAlgoYolo5::stop()
        	{
        		LOGD("===>>>IN \t[%s] \r\n", __FUNCTION__);
        
        		deinitPostProcess();
        
        		// release
        		rknn_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 process
          	float 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库实现。

    • 运行日志

    04-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
    
    同事配合,每次都能检测到他,只漏出身体一小部分也能行,效只漏出身体一小部分也能行,可以的:DealOneFrame person @ (996 3 2136 1329) 0.711339
    • 性能
    04-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
    
    采集图像的缩放,从4k到640x640用rga实现,耗时11ms
    yolo5检测,22ms
    能够做到30fps

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3全家桶和小兔鲜儿案例

查看node.js版本&#xff0c;需要是16.0以上版本 node -v创建一个vue应用 npm init vuelatest在windows窗口中进入vs code命令 code ./创建项目后vs code打开安装依赖 npm install安装好以后运行程序 打开页面 deep有性能损耗&#xff0c;尽量不开启deep 生命周期函数指…

记录Linux系统中vim同时开多个窗口编辑文件

在使用Linux进行文本编辑的时候&#xff0c;通常使用vim编辑器编辑文件&#xff0c;当然啦&#xff0c;vim也可以创建文件&#xff0c;如果只是一个一个创建&#xff0c;只需要vim创建即可&#xff0c;但是如何一次性打开多个窗口编辑呢&#xff1f; 目录 1、目标&#xff1a;…

Unity和Android的交互

Unity和Android的交互 一、前言二、Android导出jar/aar包到Unity2.1 版本说明2.2 拷贝Unity的classes.jar给Android工程2.2.1 classes.jar的位置2.2.2 Android Studio创建module2.2.3 拷贝classes.jar 到 Android工程并启用 2.3 编写Android工程代码2.3.1 创建 MainActivity2.…

springboot之mybatisPlus多表查询及分页查询

文章目录 一、多表查询二、mybatis-plus条件查询三、分页查询 一、多表查询 可能会用到的注解 这里的场景是&#xff0c;查询每个用户及其所有的订单。就是查询你的id号的同时&#xff0c;把你所有的历史订单信息都拉出来。 表结构这样 CREATE TABLE User ( id INT PRIMARY…

docker笔记(一):安装、常用命令

一、docker概述 1.1docker为什么会出现 各种环境配置十分繁琐&#xff0c;每一个机器都需要配置环境&#xff0c;难免出现各种问题。 发布一个项目jar需要配置&#xff08;MySQL、redis、jdk、…&#xff09;&#xff0c;项目不能都带上环境安装打包&#xff1a; 传统&…

PostgrerSQL基本使用与数据备份

前言 上篇了解了 PostgrerSQL 数据库的部署PostgreSQL关系型数据库介绍与部署-CSDN博客&#xff0c;本篇将继续就其基本操作、备份与还原内容做相关介绍。 目录 一、数据库的操作 1. 本机登录 2. 开启远程登录 2.1 开放远程端口 2.2 编辑配置文件 2.3 修改配置密码 2.…

前端三剑客 —— JavaScript (第一天)

目录 回顾内容 1.弹性布局 2.网格布局 JavaScript 概述 发展 浏览器 什么是Javascript JavaScript 能干什么 JavaScript需要的环境 JavaScript初体验 基本数据 JS书写方式 行内JS 页面JS 外部JS 1&#xff09;创建外部JS文件 2&#xff09;编写页面 对话框 警…

【踩坑日记】因不同系统换行符不同导致的文本读取结果不同的问题

文章目录 1 问题现象描述2 解决过程&#xff08;点击直接跳到解决方法&#xff09;3 原因解释4 如何避免踩坑4.1 格式转换4.2 格式查看 1 问题现象描述 起因是群友问了这么一个问题 确实很奇怪&#xff0c;按理说第二个printf不会完全不输出&#xff0c;于是想到&#xff0c;…

C++数据结构与算法——回溯算法组合问题

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

SD-WAN如何解决更有性价比地跨境网络问题

云桥通SD-WAN利用智能路由和负载均衡技术&#xff0c;优化数据传输路径&#xff0c;提高网络性能和可靠性。这意味着数据在跨国传输时可以更快到达目的地&#xff0c;减少延迟和丢包率。跨境SD-WAN提高了网络连接速度和质量&#xff0c;使用户能够更快地访问跨国业务所需的资源…

索引的概念

索引的概念    1.索引是一种可选的与表相关的数据库对象&#xff0c;用于提高数据的查询效率。    2.索引是一种有序的数据结构。    3.如果一个表没有创建索引&#xff0c;则对该表进行查询时需要进行全表扫描&#xff1b;如果创建了索引&#xff0c;则在有条件查询时…

应用性能分析工具CPU Profiler

简介 本文档介绍应用性能分析工具CPU Profiler的使用方法&#xff0c;该工具为开发者提供性能采样分析手段&#xff0c;可在不插桩情况下获取调用栈上各层函数的执行时间&#xff0c;并展示在时间轴上。 开发者可通过该工具查看TS/JS代码及NAPI代码执行过程中的时序及耗时情况…

福州装修答疑 | 飘窗能不能砸掉?福州中宅装饰,福州装修

装修中的飘窗是一种常见的装饰元素&#xff0c;它不仅可以增加室内的采光和通风效果&#xff0c;还能为居室增添一份雅致和温馨。然而&#xff0c;很多业主在装修中都会遇到一个共同的问题&#xff1a;装修中的飘窗到底能不能砸&#xff1f;什么情况下可以砸&#xff1f;什么情…

IO流【带有缓冲区的字节输入、输出流;字符输入、输出流 转换流】

day35 学习注意事项 按照流的发展历史去学习注意流与流之间的继承关系举一反三 IO流 继day36 字节流继承图 字节流 应用场景&#xff1a;操作二进制数据&#xff08;音频、视频、图片&#xff09; abstract class InputStream – 字节输入流的基类&#xff08;抽象类&#xff0…

基于R、Python的Copula变量相关性分析及AI大模型应用

在工程、水文和金融等各学科的研究中&#xff0c;总是会遇到很多变量&#xff0c;研究这些相互纠缠的变量间的相关关系是各学科的研究的重点。虽然皮尔逊相关、秩相关等相关系数提供了变量间相关关系的粗略结果&#xff0c;但这些系数都存在着无法克服的困难。例如&#xff0c;…

Anaconda环境命令样例

启动命令行Anaconda Powershell Prompt 查看环境列表 (base) PS C:\Users\Administrator> conda env list # conda environments: # base * G:\ProgramData\anaconda3 MoneyprinterTurbo G:\ProgramData\anaconda3\envs\MoneyprinterTurbo pytorc…

C++ 标准库类型stackqueue

C/C总述&#xff1a;Study C/C-CSDN博客 栈与队列详解&#xff08;数据结构&#xff09;&#xff1a;栈与队列_禊月初三-CSDN博客 stack&#xff08;栈&#xff09; stack的常用函数 函数说明功能说明stack()构造空栈push(T& val)将元素val压入栈中size()返回栈中元素个…

数据结构之二叉树由浅入深最终章!

题外话 我说清明节想放松一下没更新大家信吗? 博客毕竟是文字不是视频,大家如果有不明白的地方,可以使用数形结合的方式,画图一边通过图片,一边通过对照代码进行推导一下,有什么问题都可以私信我或者写在评论区 正题 第一题 寻找二叉树中p,q最近公共祖先 第一题思路 先…

【C++】红黑树讲解及实现

前言&#xff1a; AVL树与红黑树相似&#xff0c;都是一种平衡二叉搜索树&#xff0c;但是AVL树的平衡要求太严格&#xff0c;如果要对AVL树做一些结构修改的操作性能会非常低下&#xff0c;比如&#xff1a;插入时要维护其绝对平衡&#xff0c;旋转的次数比较多&#xff0c;更…

【Claude 3】This organization has been disabled.此组织已被禁用。(Claude无法对话的原因和解决办法)

Claude对话提示 This organization has been disabled.此组织已被禁用。 This organization has been disabled.此组织已被禁用。 This organization has been disabled.此组织已被禁用。 问题截图 问题原因 出现该页面&#xff0c;表示您的账户已经无法使用&#xff0c;可能…