#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <string>
#include <math.h>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
//#include <cuda_provider_factory.h>
#include <onnxruntime_cxx_api.h>
using namespace cv;
using namespace std;
using namespace Ort;
class LYTNet
{
public:
LYTNet(string model_path);
Mat detect(Mat srcimg);
private:
vector<float> input_image_;
int inpWidth;
int inpHeight;
int outWidth;
int outHeight;
const float score_th = 0;
Env env = Env(ORT_LOGGING_LEVEL_ERROR, "Low-Light Image Enhancement");
Ort::Session *ort_session = nullptr;
SessionOptions sessionOptions = SessionOptions();
vector<char*> input_names;
vector<char*> output_names;
vector<vector<int64_t>> input_node_dims; // >=1 outputs
vector<vector<int64_t>> output_node_dims; // >=1 outputs
};
LYTNet::LYTNet(string model_path)
{
/// OrtStatus* status = OrtSessionOptionsAppendExecutionProvider_CUDA(sessionOptions, 0); ///cuda
sessionOptions.SetGraphOptimizationLevel(ORT_ENABLE_BASIC);
/*std::wstring widestr = std::wstring(model_path.begin(), model_path.end()); ////windows
ort_session = new Session(env, widestr.c_str(), sessionOptions); ////windows*/
ort_session = new Session(env, model_path.c_str(), sessionOptions); ////linux
size_t numInputNodes = ort_session->GetInputCount();
size_t numOutputNodes = ort_session->GetOutputCount();
AllocatorWithDefaultOptions allocator;
for (int i = 0; i < numInputNodes; i++)
{
input_names.push_back(ort_session->GetInputName(i, allocator));
Ort::TypeInfo input_type_info = ort_session->GetInputTypeInfo(i);
auto input_tensor_info = input_type_info.GetTensorTypeAndShapeInfo();
auto input_dims = input_tensor_info.GetShape();
input_node_dims.push_back(input_dims);
}
for (int i = 0; i < numOutputNodes; i++)
{
output_names.push_back(ort_session->GetOutputName(i, allocator));
Ort::TypeInfo output_type_info = ort_session->GetOutputTypeInfo(i);
auto output_tensor_info = output_type_info.GetTensorTypeAndShapeInfo();
auto output_dims = output_tensor_info.GetShape();
output_node_dims.push_back(output_dims);
}
this->inpHeight = input_node_dims[0][1];
this->inpWidth = input_node_dims[0][2];
this->outHeight = output_node_dims[0][1];
this->outWidth = output_node_dims[0][2];
}
/***************** Mat转vector **********************/
template<typename _Tp>
vector<_Tp> convertMat2Vector(const Mat &mat)
{
return (vector<_Tp>)(mat.reshape(1, 1));//通道数不变,按行转为一行
}
/****************** vector转Mat *********************/
template<typename _Tp>
cv::Mat convertVector2Mat(vector<_Tp> v, int channels, int rows)
{
cv::Mat mat = cv::Mat(v).clone();//将vector变成单列的mat,这里需要clone(),因为这里的赋值操作是浅拷贝
cv::Mat dest = mat.reshape(channels, rows);
return dest;
}
Mat LYTNet::detect(Mat srcimg)
{
Mat dstimg;
resize(srcimg, dstimg, Size(this->inpWidth, this->inpHeight));
dstimg.convertTo(dstimg, CV_32FC3, 1 / 127.5, -1.0);
this->input_image_ = (vector<float>)(dstimg.reshape(1,1));
// const size_t area = this->inpWidth * this->inpHeight * 3;
// this->input_image_.resize(area);
// memcpy(this->input_image_.data(), (float*)dstimg.data, area*sizeof(float));
array<int64_t, 4> input_shape_{ 1, this->inpHeight, this->inpWidth, 3 };
auto allocator_info = MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU);
Value input_tensor_ = Value::CreateTensor<float>(allocator_info, input_image_.data(), input_image_.size(), input_shape_.data(), input_shape_.size());
vector<Value> ort_outputs = ort_session->Run(RunOptions{ nullptr }, &input_names[0], &input_tensor_, 1, output_names.data(), output_names.size()); // ��ʼ����
float* pred = ort_outputs[0].GetTensorMutableData<float>();
Mat output_image(outHeight, outWidth, CV_32FC3, pred);
output_image = (output_image + 1.0 ) * 127.5;
output_image.convertTo(output_image, CV_8UC3);
resize(output_image, output_image, Size(srcimg.cols, srcimg.rows));
return output_image;
}
int main()
{
LYTNet mynet("weights/lyt_net_lolv2_real_320x240.onnx");
string imgpath = "testimgs/1_1.JPG";
Mat srcimg = imread(imgpath);
Mat dstimg = mynet.detect(srcimg);
namedWindow("srcimg", WINDOW_NORMAL);
imshow("srcimg", srcimg);
namedWindow("dstimg", WINDOW_NORMAL);
imshow("dstimg", dstimg);
waitKey(0);
destroyAllWindows();
}
没有合适的资源?快使用搜索试试~ 我知道了~
onnx轻量级低光图像增强模型部署-基于transformer的低亮度图像增强LYT-Net算法python和C++源码+模型....
共21个文件
onnx:9个
png:6个
jpg:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 53 浏览量
2024-12-06
14:06:51
上传
评论
收藏 3.09MB ZIP 举报
温馨提示
【项目说明】 1.多数小白下载后,在使用过程,可能会遇到些小问题,若自己解决不了,请及时私信描述你的问题,我会第一时间提供帮助,也可以远程指导 2.项目代码完整可靠,但难度适中,满足一些毕设、课设要求,且属于易上手的优质项目,项目内基本都有说明文档,按照操作即可,遇到困难也可私信交流 3.适用人群:各大计算机相关专业行业的在校学生、高校老师、公司程序员等下载使用 4.特别是那种爱钻研学习的学霸,强烈推荐此项目,可以二次开发提升自己。如果确定自己是学渣,拿来作毕设、课设直接用也无妨,但建议自己还是尽可能弄懂项目最好! 【特别强调】 项目下载解压后,项目名字和项目路径不要用中文,建议解压重命名为英文名字后再运行!项目易上手运行 使用过程遇到问题先搜索下,一般都是环境问题,当然也可以私信沟通,欢迎交流学习,祝顺利!
资源推荐
资源详情
资源评论
收起资源包目录
onnx轻量级低光图像增强模型部署-基于transformer的低亮度图像增强LYT-Net算法python和C++源码+模型.zip (21个子文件)
weights
lyt_net_lolv1_800x400.onnx 297KB
lyt_net_lolv2_synthetic_320x240.onnx 298KB
lyt_net_lolv2_real_640x360.onnx 298KB
lyt_net_lolv2_synthetic_800x400.onnx 298KB
lyt_net_lolv2_synthetic_640x360.onnx 299KB
lyt_net_lolv1_320x240.onnx 292KB
lyt_net_lolv2_real_800x400.onnx 298KB
lyt_net_lolv2_real_320x240.onnx 297KB
lyt_net_lolv1_640x360.onnx 296KB
main.py 2KB
main.cpp 4KB
testimgs
Cave.png 175KB
4_1.JPG 12KB
3_1.JPG 18KB
1.png 338KB
23.png 289KB
1_1.JPG 17KB
Madison.png 243KB
Farmhouse.png 163KB
22.png 309KB
说明.tar 2KB
共 21 条
- 1
资源评论
.whl
- 粉丝: 3888
- 资源: 4851
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python编程题目60个
- ZABAPGIT-STANDALONE
- 塑料瓶水瓶子瓶罐子检测17-YOLO(v5至v9)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 抖音运营:抖音橱窗引流:新营销模式解析.pptx
- 《C语言指针经验总结》.zip
- 汉印HM-A300L CPCL编码说明
- 整理收纳-卧室空间改造
- 塑料检测56-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar
- 人工智能课程设计,用python库openCV识别图片中的圆并且求出黑白两部分面积比例.zip
- 爱心代码合集(各种形式的都有,含展示效果).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功