RK3588 NPU 研究(二)

news2025/2/27 2:30:51
  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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决element-plus table组件 fixed=“right“(left)浮动后横向滚动文字穿透的问题

BUG 版本&#xff1a;element-plus 2.6.1 浏览器&#xff1a;360极速浏览器22.1 (Chromium内核) 组件&#xff1a;el-table组件 问题&#xff1a;在头部/尾部浮动加上斑马条纹后&#xff0c;横向滚动存在文字穿透的问题。具体如图&#xff1a; 白色背景行的文字&#xff0c…

Prometheus+grafana环境搭建Nginx(docker+二进制两种方式安装)(六)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前五篇链接如下 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环…

骨架屏:提升用户体验的巧妙技巧

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

20240321-1-AB测试面试题

AB测试面试题 1. 介绍一下ABTest的步骤 ABtest就是为了测试和验证模型/项目的效果&#xff0c;在app/pc端设计出多个版本&#xff0c;在同一时间维度下&#xff0c;分别用组成相同/相似的群组去随机访问这些版本&#xff0c;记录下群组的用户体验数据和业务数据&#xff0c;最…

ObjectiveC-10-OOP面向对象程序设计-分类/类别

类别(Category)是OjectiveC的一个特性&#xff0c;主要目的是让开发者可以以模块的形式向类添加方法&#xff08;扩展&#xff09;&#xff0c;创建标准化的方法列表供给其他人实现。 有些文档也会翻译成类别&#xff0c;其实是一个意思。 概述 语法说明 类别提供了一个简单的…

个人品牌打造IP孵化运营培训教程架构课件

【资料持续更新&#xff0c;以防走丢】 个人品牌打造IP孵化运营培训教程架构课件 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 个人品牌运营合集 &#xff08;完整资料包含以下内容&#xff09;目录 详细的个人IP运营方案&#xff1a; 1. 确定个人定位和…

0基础学习Mybatis系列数据库操作框架——自定义类型处理器

大纲 Java模型类定义类型处理器配置文件和类型绑定和字段绑定resultMap中绑定 Mapper代码测试类型对应关系表总结参考资料 我们有时候会在数据库中放入一个扩展字段&#xff0c;用于保存在表设计时尚未考虑到的、未来会加入的一些信息。这个字段我们一般使用字符串存储&#xf…

数学矩阵GCD和lCM(详解)

矩阵乘法 知阵乘法是《线性代数》中的基础内容&#xff0c;但在考察数学的算法题中也会出现。 本节我们学习基础的矩阵乘法规则。 每个矩阵会有一个行数和一个列数&#xff0c;只有当相乘的两个矩阵的左矩阵的列数等于右矩阵的行数 时&#xff0c;才能相乘&#xff0c;否则不允…

JavaSE-10笔记【多线程1(+2024新)】

文章目录 1.进程与线程2.并发与并行3.线程的调度模型4.实现线程4.1 第一种方式&#xff1a;继承Thread4.2 第二种方式&#xff1a;实现Runnable接口4.3 t.start()和t.run()的本质区别&#xff1f;4.4 线程常用的三个方法 5.线程的生命周期&#xff08;把生命周期图背会&#xf…

考研回忆录【二本->211】

备考时长差不多快一年半&#xff0c;从22年的11月底开始陆陆续续地准备考研&#xff0c;因为开始的早所以整个备考过程显得压力不是很大&#xff0c;中途还去一些地方旅游&#xff0c;我不喜欢把自己绷得太紧。虽然考的不是很好&#xff0c;考完我甚至都没准备复试&#xff0c;…

《QT实用小工具·十三》FlatUI辅助类之各种炫酷的控件集合

1、概述 源码放在文章末尾 FlatUI辅助类之各种炫酷的控件集合 按钮样式设置。文本框样式设置。进度条样式。滑块条样式。单选框样式。滚动条样式。可自由设置对象的高度宽度大小等。自带默认参数值。 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #ifnd…

《QT实用小工具·十四》面板容器控件和图形字体示例

1、概述 源码放在文章末尾 面板容器控件包含如下功能&#xff1a; 支持所有widget子类对象&#xff0c;自动产生滚动条。 支持自动拉伸自动填充。 提供接口获取容器内的所有对象的指针。 可设置是否自动拉伸宽度高度。 可设置设备面板之间的间距和边距。 超级图形字体类…

论文笔记:Large Language Models as Analogical Reasoners

iclr 2024 reviewer打分5558 1 intro 基于CoT prompt的大模型能够更好地解决复杂推理问题 然而传统CoT需要提供相关的例子作为指导&#xff0c;这就增加了人工标注的成本——>Zero-shot CoT避免了人工标注来引导推理 但是对于一些复杂的任务难以完成推理&#xff0c;例如c…

2024最全AI绘画Midjourney绘画提示词Prompt大全,AI换脸、垫图混图【宝藏级收藏】

一、AI绘画工具 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支…

Win10 下 git error unable to create file Invalid argument 踩坑实录

原始解决方案参看&#xff1a;https://stackoverflow.com/questions/26097568/git-pull-error-unable-to-create-file-invalid-argument 本问题解决于 2024-02-18&#xff0c;使用 git 版本 2.28.0.windows.1 解决方案 看 Git 抛出的出错的具体信息&#xff0c;比如如下都来自…

7(8)-2-CSS 盒子模型

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 CSS 盒子模型1 盒子模型&#xff08;Box Model&#xff09;组成2 边框&#x…

Git 如何去使用

目录 1. Git暂存区的使用 1.1. 暂存区的作用 1.2. 暂存区覆盖工作区&#xff08;注意&#xff1a;完全确认覆盖时使用&#xff09; 1.3. 暂存区移除文件 1.4. 练习 2. Git回退版本 2.1. 概念 2.2. 查看提交历史 2.3. 回退命令 2.4. 注意 3. Git删除文件 3.1. 需求 …

docker安装Nexus,maven私服

文章目录 前言安装创建文件夹设置文件夹权限docker创建指令制作docker-compose.yaml文件 查看网站访问网页查看密码 前言 nexus作为私服的maven仓库&#xff0c;在企业级应用中&#xff0c;提供了依赖来源的稳定性&#xff0c;为构建庞大的微服务体系&#xff0c;打下基础 安…

Day83:服务攻防-开发组件安全JacksonFastJson各版本XStreamCVE环境复现

目录 J2EE-组件Jackson-本地demo&CVE 代码执行 (CVE-2020-8840) 代码执行 (CVE-2020-35728&#xff09; J2EE-组件FastJson-本地demo&CVE FastJson < 1.2.24 FastJson < 1.2.47 FastJson < 1.2.80 (利用条件比较苛刻) J2EE-组件XStream-靶场&CVE …

Java_自定义实体类的列表List<T>调用remove()失败讲解

示例1 前提&#xff1a; 新建一个主类Demo1。 需求&#xff1a; 在一个列表中有三条String的数据&#xff0c;想要使用remove(Object o)删掉其中一条。 结果&#xff1a; remove(Object o)成功把数据删掉。 示例2 前提&#xff1a; 新建一个自定义实体类DataExample和一个主…