当前位置:   article > 正文

瑞芯微关于RKMEDIA框架的RKNN例子解析(二)_rknn_tensor_attr

rknn_tensor_attr

接上回,接下来就到了大家关心的RKNN部分的操作啦,接下来看代码。

  1. create_rknn_list(&rknn_list_);
  2. // Get the sub-stream buffer for humanoid recognition
  3. pthread_t read_thread;
  4. pthread_create(&read_thread, NULL, GetMediaBuffer, NULL); //RKNN主线程
  1. static void *GetMediaBuffer(void *arg) {
  2. printf("#Start %s thread, arg:%p\n", __func__, arg);
  3. rknn_context ctx;
  4. int ret;
  5. int model_len = 0;
  6. unsigned char *model;
  7. printf("Loading model ...\n");
  8. model = load_model(g_ssd_path, &model_len);
  9. ret = rknn_init(&ctx, model, model_len, 0);
  10. if (ret < 0) {
  11. printf("rknn_init fail! ret=%d\n", ret);
  12. return NULL;
  13. }
  14. // Get Model Input Output Info
  15. rknn_input_output_num io_num;
  16. ret = rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));
  17. if (ret != RKNN_SUCC) {
  18. printf("rknn_query fail! ret=%d\n", ret);
  19. return NULL;
  20. }
  21. printf("model input num: %d, output num: %d\n", io_num.n_input,
  22. io_num.n_output);
  23. printf("input tensors:\n");
  24. rknn_tensor_attr input_attrs[io_num.n_input];
  25. memset(input_attrs, 0, sizeof(input_attrs));
  26. for (unsigned int i = 0; i < io_num.n_input; i++) {
  27. input_attrs[i].index = i;
  28. ret = rknn_query(ctx, RKNN_QUERY_INPUT_ATTR, &(input_attrs[i]),
  29. sizeof(rknn_tensor_attr));
  30. if (ret != RKNN_SUCC) {
  31. printf("rknn_query fail! ret=%d\n", ret);
  32. return NULL;
  33. }
  34. printRKNNTensor(&(input_attrs[i]));
  35. }
  36. printf("output tensors:\n");
  37. rknn_tensor_attr output_attrs[io_num.n_output];
  38. memset(output_attrs, 0, sizeof(output_attrs));
  39. for (unsigned int i = 0; i < io_num.n_output; i++) {
  40. output_attrs[i].index = i;
  41. ret = rknn_query(ctx, RKNN_QUERY_OUTPUT_ATTR, &(output_attrs[i]),
  42. sizeof(rknn_tensor_attr));
  43. if (ret != RKNN_SUCC) {
  44. printf("rknn_query fail! ret=%d\n", ret);
  45. return NULL;
  46. }
  47. printRKNNTensor(&(output_attrs[i]));
  48. }
  49. MEDIA_BUFFER buffer = NULL;
  50. while (g_flag_run) {
  51. buffer = RK_MPI_SYS_GetMediaBuffer(RK_ID_VI, RK_NN_INDEX, -1);
  52. if (!buffer) {
  53. continue;
  54. }
  55. // printf("Get Frame:ptr:%p, fd:%d, size:%zu, mode:%d, channel:%d, "
  56. // "timestamp:%lld\n",
  57. // RK_MPI_MB_GetPtr(buffer), RK_MPI_MB_GetFD(buffer),
  58. // RK_MPI_MB_GetSize(buffer),
  59. // RK_MPI_MB_GetModeID(buffer), RK_MPI_MB_GetChannelID(buffer),
  60. // RK_MPI_MB_GetTimestamp(buffer));
  61. // nv12 to rgb24 and resize
  62. int rga_buffer_size = cfg.session_cfg[RK_NN_INDEX].u32Width *
  63. cfg.session_cfg[RK_NN_INDEX].u32Height *
  64. 3; // nv12 3/2, rgb 3
  65. int rga_buffer_model_input_size = MODEL_INPUT_SIZE * MODEL_INPUT_SIZE * 3;
  66. unsigned char *rga_buffer = malloc(rga_buffer_size);
  67. unsigned char *rga_buffer_model_input = malloc(rga_buffer_model_input_size);
  68. nv12_to_rgb24(RK_MPI_MB_GetPtr(buffer), rga_buffer,
  69. cfg.session_cfg[RK_NN_INDEX].u32Width,
  70. cfg.session_cfg[RK_NN_INDEX].u32Height);
  71. rgb24_resize(rga_buffer, rga_buffer_model_input,
  72. cfg.session_cfg[RK_NN_INDEX].u32Width,
  73. cfg.session_cfg[RK_NN_INDEX].u32Height, MODEL_INPUT_SIZE,
  74. MODEL_INPUT_SIZE);
  75. // Set Input Data
  76. rknn_input inputs[1];
  77. memset(inputs, 0, sizeof(inputs));
  78. inputs[0].index = 0;
  79. inputs[0].type = RKNN_TENSOR_UINT8;
  80. inputs[0].size = rga_buffer_model_input_size;
  81. inputs[0].fmt = RKNN_TENSOR_NHWC;
  82. inputs[0].buf = rga_buffer_model_input;
  83. ret = rknn_inputs_set(ctx, io_num.n_input, inputs);
  84. if (ret < 0) {
  85. printf("rknn_input_set fail! ret=%d\n", ret);
  86. return NULL;
  87. }
  88. // Run
  89. printf("rknn_run\n");
  90. ret = rknn_run(ctx, NULL);
  91. if (ret < 0) {
  92. printf("rknn_run fail! ret=%d\n", ret);
  93. return NULL;
  94. }
  95. // Get Output
  96. rknn_output outputs[2];
  97. memset(outputs, 0, sizeof(outputs));
  98. outputs[0].want_float = 1;
  99. outputs[1].want_float = 1;
  100. ret = rknn_outputs_get(ctx, io_num.n_output, outputs, NULL);
  101. if (ret < 0) {
  102. printf("rknn_outputs_get fail! ret=%d\n", ret);
  103. return NULL;
  104. }
  105. // Post Process
  106. detect_result_group_t detect_result_group;
  107. postProcessSSD((float *)(outputs[0].buf), (float *)(outputs[1].buf),
  108. MODEL_INPUT_SIZE, MODEL_INPUT_SIZE, &detect_result_group);
  109. // Release rknn_outputs
  110. rknn_outputs_release(ctx, 2, outputs);
  111. // Dump Objects
  112. // for (int i = 0; i < detect_result_group.count; i++) {
  113. // detect_result_t *det_result = &(detect_result_group.results[i]);
  114. // printf("%s @ (%d %d %d %d) %f\n", det_result->name,
  115. // det_result->box.left,
  116. // det_result->box.top, det_result->box.right,
  117. // det_result->box.bottom,
  118. // det_result->prop);
  119. // }
  120. if (detect_result_group.count > 0) {
  121. rknn_list_push(rknn_list_, getCurrentTimeMsec(), detect_result_group);
  122. int size = rknn_list_size(rknn_list_);
  123. if (size >= MAX_RKNN_LIST_NUM)
  124. rknn_list_drop(rknn_list_);
  125. // printf("size is %d\n", size);
  126. }
  127. RK_MPI_MB_ReleaseBuffer(buffer);
  128. if (rga_buffer)
  129. free(rga_buffer);
  130. if (rga_buffer_model_input)
  131. free(rga_buffer_model_input);
  132. }
  133. // release
  134. if (ctx)
  135. rknn_destroy(ctx);
  136. if (model)
  137. free(model);
  138. return NULL;
  139. }

这部分代码我就不写注释了,大家先看英文注释吧,我在这理一下这部分做了什么。

总的来说,就是模型加载后一直循环,取VI的帧数据,这边有点不解,为啥在RGA有能力处理颜色转换的情况下要用软件处理?我想过内存拷贝速度的问题,但是应该软件和硬件处理没啥速度上的区别,有大佬清楚原因不? 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号