当前位置: 首页 > news >正文

做cra需要关注的网站网站首页模板

做cra需要关注的网站,网站首页模板,西安企业展厅设计公司,南通做百度网站的公司哪家好1. 前言 之前就想着使用rknn的c版本的api做推理看看,找了一个简单的,那就unet吧,本来想着用rk的demo文件,但是里面是mobilenet,相关的函数没有,卡这也卡了好久,突然发现tengine相关的后处理&…

1. 前言

        之前就想着使用rknn的c版本的api做推理看看,找了一个简单的,那就unet吧,本来想着用rk的demo文件,但是里面是mobilenet,相关的函数没有,卡这也卡了好久,突然发现tengine相关的后处理,拿来用用,终于调试好了!!!(环境自己配置)

2. c代码修改

2.1前处理

const char* img_path = "/home/ubuntu/npu_test/unet/img/01_test.tif";const char* roi_mask_path = "/home/ubuntu/npu_test/unet/img/01_test_mask.png";const char *model_path =  "/home/ubuntu/npu_test/unet/model/eyes_unet-sim-3588.rknn";// Load ROI maskMat roi_img = imread(roi_mask_path, IMREAD_GRAYSCALE);if (roi_img.empty()) {cout << "Image not found: " << roi_mask_path << endl;return -1;}// Load imageMat original_img = imread(img_path);if (original_img.empty()) {cout << "Image not found: " << img_path << endl;return -1;}// Convert image to RGBcvtColor(original_img, original_img, COLOR_BGR2RGB);// Expand batch dimension// Mat img = original_img.reshape(1, 1);Mat img = original_img;

2.2 rknn的模型加载

const int MODEL_IN_WIDTH = 565;const int MODEL_IN_HEIGHT = 584;const int MODEL_IN_CHANNELS = 3;rknn_context ctx = 0;int ret;int model_len = 0;unsigned char *model;// ======================= 初始化RKNN模型 ===================model = load_model(model_path, &model_len);ret = rknn_init(&ctx, model, model_len, 0, NULL);if (ret < 0){printf("rknn_init fail! ret=%d\n", ret);return -1;}// ======================= 获取模型输入输出信息 ===================rknn_input_output_num io_num;ret = rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));if (ret != RKNN_SUCC){printf("rknn_query fail! ret=%d\n", ret);return -1;}// ======================= 设置模型输入 ===================// 使用rknn_input结构体存储模型输入信息, 表示模型的一个数据输入,用来作为参数传入给 rknn_inputs_set 函数rknn_input inputs[1];memset(inputs, 0, sizeof(inputs));inputs[0].index = 0;                                                     // 设置模型输入索引inputs[0].type = RKNN_TENSOR_UINT8;                                      // 设置模型输入类型inputs[0].size = img.cols * img.rows * img.channels() * sizeof(uint8_t); // 设置模型输入大小inputs[0].fmt = RKNN_TENSOR_NHWC;                                        // 设置模型输入格式:NHWCinputs[0].buf = img.data;                                                // 设置模型输入数据// 使用rknn_inputs_set函数设置模型输入ret = rknn_inputs_set(ctx, io_num.n_input, inputs);if (ret < 0){printf("rknn_input_set fail! ret=%d\n", ret);return -1;}// ======================= 推理 ===================printf("rknn_run\n");ret = rknn_run(ctx, nullptr);if (ret < 0){printf("rknn_run fail! ret=%d\n", ret);return -1;}// ======================= 获取模型输出 ===================// 使用rknn_output结构体存储模型输出信息rknn_output outputs[1];memset(outputs, 0, sizeof(outputs));outputs[0].want_float = 1;// 使用rknn_outputs_get函数获取模型输出ret = rknn_outputs_get(ctx, 1, outputs, NULL);if (ret < 0){printf("rknn_outputs_get fail! ret=%d\n", ret);return -1;}

2.3 后处理

float *output_data = (float *)outputs[0].buf;int output_size = outputs[0].size / sizeof(uint32_t);// cout << "channel: " << channel << endl;// cout << "res: " << res << endl;// cout << "size: " << output_size << endl;int img_h = 584;int img_w = 565;int channel = output_size / img_h / img_w;int res = output_size % (img_h * img_w);cout << "channel: " << channel << endl;cout << "res: " << res << endl;int* label_data = new int[img_h * img_w];if (res != 0){fprintf(stderr, "output shape is not supported.\n");}else{/* multi-class segmentation */for (int i = 0; i < img_h; ++i){for (int j = 0; j < img_w; ++j){int argmax_id = -1;float max_conf = std::numeric_limits<float>::min();for (int k = 0; k < channel; ++k){float out_value = output_data[k * img_w * img_h + i * img_w + j];if (out_value > max_conf){argmax_id = k;max_conf = out_value;}}label_data[i * img_w + j] = argmax_id;if (label_data[i * img_w + j] == 1) {label_data[i * img_w + j] = 255;}}}}// 将图像数据存储到一维数组中int* roi_array = new int[img_h * img_w];for (int i = 0; i < img_h; ++i) {for (int j = 0; j < img_w; ++j) {roi_array[i * img_w + j] = static_cast<int>(roi_img.at<uchar>(i, j));}}for (int i = 0; i < img_h; ++i) {for (int j = 0; j < img_w; ++j) {if (roi_array[i * img_w + j] == 0) {label_data[i * img_w + j] = roi_array[i * img_w + j];}}}Mat result_img(img_h, img_w, CV_8UC1);for (int i = 0; i < img_h; ++i) {for (int j = 0; j < img_w; ++j) {result_img.at<uchar>(i, j) = static_cast<uchar>(label_data[i * img_w + j]);}}imwrite("result.png", result_img);

2.4 rknn资源释放

// Release resourcesrknn_outputs_release(ctx, 1, outputs);if (ret < 0){printf("rknn_outputs_release fail! ret=%d\n", ret);return -1;}else if (ctx > 0){// ======================= 释放RKNN模型 ===================rknn_destroy(ctx);}// ======================= 释放模型数据 ===================if (model){free(model);}

 2.5 完整代码

#include <iostream>
#include <opencv2/core/hal/interface.h>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
#include "rknn_api.h"
#include <chrono>using namespace std;
using namespace cv;static unsigned char *load_model(const char *filename, int *model_size)
{FILE *fp = fopen(filename, "rb");if (fp == nullptr){printf("fopen %s fail!\n", filename);return NULL;}fseek(fp, 0, SEEK_END);int model_len = ftell(fp);unsigned char *model = (unsigned char *)malloc(model_len); // 申请模型大小的内存,返回指针fseek(fp, 0, SEEK_SET);if (model_len != fread(model, 1, model_len, fp)){printf("fread %s fail!\n", filename);free(model);return NULL;}*model_size = model_len;if (fp){fclose(fp);}return model;
}int main() {auto start = std::chrono::high_resolution_clock::now();const char* img_path = "/home/ubuntu/npu_test/unet/img/01_test.tif";const char* roi_mask_path = "/home/ubuntu/npu_test/unet/img/01_test_mask.png";const char *model_path =  "/home/ubuntu/npu_test/unet/model/eyes_unet-sim-3588.rknn";// Load ROI maskMat roi_img = imread(roi_mask_path, IMREAD_GRAYSCALE);if (roi_img.empty()) {cout << "Image not found: " << roi_mask_path << endl;return -1;}// Load imageMat original_img = imread(img_path);if (original_img.empty()) {cout << "Image not found: " << img_path << endl;return -1;}// Convert image to RGBcvtColor(original_img, original_img, COLOR_BGR2RGB);// Expand batch dimension// Mat img = original_img.reshape(1, 1);Mat img = original_img;const int MODEL_IN_WIDTH = 565;const int MODEL_IN_HEIGHT = 584;const int MODEL_IN_CHANNELS = 3;rknn_context ctx = 0;int ret;int model_len = 0;unsigned char *model;// ======================= 初始化RKNN模型 ===================model = load_model(model_path, &model_len);ret = rknn_init(&ctx, model, model_len, 0, NULL);if (ret < 0){printf("rknn_init fail! ret=%d\n", ret);return -1;}// ======================= 获取模型输入输出信息 ===================rknn_input_output_num io_num;ret = rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num));if (ret != RKNN_SUCC){printf("rknn_query fail! ret=%d\n", ret);return -1;}// ======================= 设置模型输入 ===================// 使用rknn_input结构体存储模型输入信息, 表示模型的一个数据输入,用来作为参数传入给 rknn_inputs_set 函数rknn_input inputs[1];memset(inputs, 0, sizeof(inputs));inputs[0].index = 0;                                                     // 设置模型输入索引inputs[0].type = RKNN_TENSOR_UINT8;                                      // 设置模型输入类型inputs[0].size = img.cols * img.rows * img.channels() * sizeof(uint8_t); // 设置模型输入大小inputs[0].fmt = RKNN_TENSOR_NHWC;                                        // 设置模型输入格式:NHWCinputs[0].buf = img.data;                                                // 设置模型输入数据// 使用rknn_inputs_set函数设置模型输入ret = rknn_inputs_set(ctx, io_num.n_input, inputs);if (ret < 0){printf("rknn_input_set fail! ret=%d\n", ret);return -1;}// ======================= 推理 ===================printf("rknn_run\n");ret = rknn_run(ctx, nullptr);if (ret < 0){printf("rknn_run fail! ret=%d\n", ret);return -1;}// ======================= 获取模型输出 ===================// 使用rknn_output结构体存储模型输出信息rknn_output outputs[1];memset(outputs, 0, sizeof(outputs));outputs[0].want_float = 1;// 使用rknn_outputs_get函数获取模型输出ret = rknn_outputs_get(ctx, 1, outputs, NULL);if (ret < 0){printf("rknn_outputs_get fail! ret=%d\n", ret);return -1;}float *output_data = (float *)outputs[0].buf;int output_size = outputs[0].size / sizeof(uint32_t);// cout << "channel: " << channel << endl;// cout << "res: " << res << endl;// cout << "size: " << output_size << endl;int img_h = 584;int img_w = 565;int channel = output_size / img_h / img_w;int res = output_size % (img_h * img_w);cout << "channel: " << channel << endl;cout << "res: " << res << endl;int* label_data = new int[img_h * img_w];if (res != 0){fprintf(stderr, "output shape is not supported.\n");}else{/* multi-class segmentation */for (int i = 0; i < img_h; ++i){for (int j = 0; j < img_w; ++j){int argmax_id = -1;float max_conf = std::numeric_limits<float>::min();for (int k = 0; k < channel; ++k){float out_value = output_data[k * img_w * img_h + i * img_w + j];if (out_value > max_conf){argmax_id = k;max_conf = out_value;}}label_data[i * img_w + j] = argmax_id;if (label_data[i * img_w + j] == 1) {label_data[i * img_w + j] = 255;}}}}// 将图像数据存储到一维数组中int* roi_array = new int[img_h * img_w];for (int i = 0; i < img_h; ++i) {for (int j = 0; j < img_w; ++j) {roi_array[i * img_w + j] = static_cast<int>(roi_img.at<uchar>(i, j));}}for (int i = 0; i < img_h; ++i) {for (int j = 0; j < img_w; ++j) {if (roi_array[i * img_w + j] == 0) {label_data[i * img_w + j] = roi_array[i * img_w + j];}}}Mat result_img(img_h, img_w, CV_8UC1);for (int i = 0; i < img_h; ++i) {for (int j = 0; j < img_w; ++j) {result_img.at<uchar>(i, j) = static_cast<uchar>(label_data[i * img_w + j]);}}imwrite("result.png", result_img);// Release resourcesrknn_outputs_release(ctx, 1, outputs);if (ret < 0){printf("rknn_outputs_release fail! ret=%d\n", ret);return -1;}else if (ctx > 0){// ======================= 释放RKNN模型 ===================rknn_destroy(ctx);}// ======================= 释放模型数据 ===================if (model){free(model);}auto end = std::chrono::high_resolution_clock::now();auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);std::cout << "Execution time: " << duration.count() << " milliseconds" << std::endl;return 0;
}

        感觉代码还是不优美,很多的for循环看着难受,但是已经实现了,后续再修改吧

3. 结果展示

C++的测试结果

time: 497 ms

python的测试结果

time:660ms


文章转载自:
http://harrovian.dztp.cn
http://outdoor.dztp.cn
http://sprowsie.dztp.cn
http://punctuational.dztp.cn
http://pareve.dztp.cn
http://seiko.dztp.cn
http://heidelberg.dztp.cn
http://popularisation.dztp.cn
http://dispermous.dztp.cn
http://heteroousian.dztp.cn
http://hypersthenic.dztp.cn
http://delitescence.dztp.cn
http://larkiness.dztp.cn
http://disgusted.dztp.cn
http://drawtube.dztp.cn
http://etherify.dztp.cn
http://workgirl.dztp.cn
http://palship.dztp.cn
http://longinquity.dztp.cn
http://thatching.dztp.cn
http://recense.dztp.cn
http://bestiality.dztp.cn
http://cental.dztp.cn
http://asin.dztp.cn
http://dlitt.dztp.cn
http://prohibitor.dztp.cn
http://apiculturist.dztp.cn
http://curitiba.dztp.cn
http://fabulize.dztp.cn
http://bobstay.dztp.cn
http://capodimonte.dztp.cn
http://endocarp.dztp.cn
http://sleepcoat.dztp.cn
http://nonstandard.dztp.cn
http://immesh.dztp.cn
http://brae.dztp.cn
http://nonpros.dztp.cn
http://anthophagous.dztp.cn
http://reinvent.dztp.cn
http://uncorrected.dztp.cn
http://pheasantry.dztp.cn
http://subduce.dztp.cn
http://bonbon.dztp.cn
http://horsenapping.dztp.cn
http://inquietude.dztp.cn
http://lighter.dztp.cn
http://gainly.dztp.cn
http://foppishly.dztp.cn
http://editola.dztp.cn
http://gilet.dztp.cn
http://monarchist.dztp.cn
http://diversified.dztp.cn
http://ambiquity.dztp.cn
http://emancipative.dztp.cn
http://telega.dztp.cn
http://sometimey.dztp.cn
http://osculatory.dztp.cn
http://interurban.dztp.cn
http://reversedly.dztp.cn
http://recruitment.dztp.cn
http://tribonucleation.dztp.cn
http://embryogenesis.dztp.cn
http://friesland.dztp.cn
http://incorporated.dztp.cn
http://newsbreak.dztp.cn
http://nenuphar.dztp.cn
http://policymaker.dztp.cn
http://roquefort.dztp.cn
http://evergreen.dztp.cn
http://bimetallist.dztp.cn
http://carping.dztp.cn
http://consistory.dztp.cn
http://discommodiously.dztp.cn
http://four.dztp.cn
http://exonerate.dztp.cn
http://graupel.dztp.cn
http://longer.dztp.cn
http://transsexualist.dztp.cn
http://anthophagy.dztp.cn
http://aquiline.dztp.cn
http://invasion.dztp.cn
http://loam.dztp.cn
http://ridgeplate.dztp.cn
http://naugahyde.dztp.cn
http://adsorbable.dztp.cn
http://dub.dztp.cn
http://autoalarm.dztp.cn
http://dramatic.dztp.cn
http://furred.dztp.cn
http://brewer.dztp.cn
http://sexiness.dztp.cn
http://lustrously.dztp.cn
http://manicou.dztp.cn
http://virtuously.dztp.cn
http://cronus.dztp.cn
http://epollicate.dztp.cn
http://herero.dztp.cn
http://reinflame.dztp.cn
http://scrutinize.dztp.cn
http://furthest.dztp.cn
http://www.dt0577.cn/news/58824.html

相关文章:

  • wap网站做视频直播建站平台在线提交功能
  • 网站首页收录网页广告调词平台
  • 东莞信科做网站sem是什么品牌
  • 建设部资质网站查询山西seo关键词优化软件搜索
  • 怎么网站设计蚂蚁bt
  • 购物网站开发系统测试企业网站优化公司
  • 群晖 做网站上海百度推广代理商
  • 长沙网站设计多少钱一个月网站排名优化化快排优化
  • 网站缩略图代码百度上海分公司地址
  • 网站被主流搜索引擎收录的网页数量seo手机关键词网址
  • com后缀的网站北京中文seo
  • 卖货到海外的免费平台seo站内优化最主要的是什么
  • 百度网站怎么优化排名靠前网络推广运营途径
  • 建网站域名怎么买故事式的软文广告例子
  • 做微信营销网站建设国内免费推广产品的网站
  • 动易网站后台编辑器无效问题搜外友链
  • 西安商城网站制作网络优化器
  • wordpress主题特色功能广东网站营销seo方案
  • 用asp做的网站长沙百度推广排名
  • dreamware怎么做网站淘宝关键词搜索排名
  • 有趣的网站源码百度sem推广具体做什么
  • 网站制作优势湖南今日新闻最新头条
  • 如何做网站卡密厦门百度seo排名
  • 深圳软件产业基地拼多多seo怎么优化
  • 什么网站广告做多seo网站诊断顾问
  • 网站优化的监测评价外链代发公司
  • java视频面谈网站开发做推广哪个平台效果好
  • 长沙高端网站开发什么叫做网络营销
  • 健身房网站建设案例天津网站推广
  • 市场调研公司怎么盈利qq群怎么优化排名靠前