/*
* linkuang.cpp
*
* Created on: 2020年4月20日
* Author: root
*/
#include "linkuang.h"
using namespace std;
using namespace cv;
/*initialize CNN model in front of the system begin
* input arg:imgsize-----------size of standard input image in tensorflow model
* wastethresh_prob--the second time judge the waste.
* If the CNN inference prob for waste < wastethresh_prob,
* we consider it as ore,not waste;
* */
/*CNN的初始化部分:在系统初始化时调用一次即可。
* 输入:imgsize-----------CNN模型要求的图像大小,不能太大(<=100)。建议:32、48、64
* lesswaste_prob----对废石的二次判断阈值(0.0,0.5~1)。如果CNN结果判为废石,且概率<=lesswaste_prob,
* 那么我们认为这不是真正的废石,其实是矿石。
* lesswaste_prob==0.0,即表示不做阈值判断,完全相信CNN废石的结果;
* lesswaste_prob越大,则抛废率越小;
* morewaste_prob----对矿石的二次判断阈值(0.0,0.5~1)。如果CNN结果为矿石,且概率<=morewaste_prob,
* 那么我们认为这不是真正的矿石,其实是废石。
* morewaste_prob=0.0,即表示不做阈值判断,完全相信CNN矿石的结果;
* morewaste_prob越大,则抛废率越大;
* */
linkuang::linkuang(int imgsize,float lesswaste_prob,float morewaste_prob) {
// TODO Auto-generated constructor stub
standard_rows=imgsize;//48;
standard_cols=imgsize;//64
lesswastethresh=lesswaste_prob;
morewastethresh=morewaste_prob;
getimgsindex=0;
showtestindex=0;
std::string graphpath="/home/jumper/xrt/reference/cnnmodel/my_unet_shitou_youhua5.pb";
// std::string modelpath="/home/jumper/xrt/reference/model/model_jinhuo0.7/model";
///////CNN initiation--
tensorflow::Status status = NewSession(tensorflow::SessionOptions(), &session);
if (!status.ok())
{
throw std::runtime_error("ERROR: linkuang CNN NewSession() init failed...");
}
tensorflow::GraphDef graphdef;
tensorflow::Status status_load = ReadBinaryProto(tensorflow::Env::Default(), graphpath, &graphdef);
if (!status_load.ok())
{
std::cout << status_load.ToString() <<std::endl;
throw std::runtime_error("ERROR: Loading model failed...");
}
tensorflow::Status status_create = session->Create(graphdef);
if (!status_create.ok())
{
std::cerr <<status_create.ToString() << std::endl;
throw std::runtime_error("ERROR: Creating graph in session failed...");
}
}
/*单个石头CNN预测
*输入:highlittleimg------单独石头的高能小图,CV_16UC1,背景是原图
* lowlittleimg-------单独石头的低能小图,CV_16UC1,必须是已经与高能对齐的小图,背景是0
*输出:label---表示此石头的类别
* 0:废石;
* 1:矿石;
*return :-1:模型预测失败
* -2:预测成功,但比较概率得到类别失败
* 0 :成功
* */
int linkuang::linkuangSingleInference(cv::Mat &cnncolorimg,cv::Mat &outputimg)
{
Mat standardinput(standard_rows, standard_cols, CV_8UC1);
resize(cnncolorimg,standardinput,Size(standard_cols,standard_rows),0,0,1);
//CNN start...和训练做相同的预处理
tensorflow::Tensor resized_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1,standard_rows,standard_cols,1}));
// float *imgdata = resized_tensor.flat<float>().data();
// Mat cnninputImg(standard_rows, standard_cols, CV_32FC1, imgdata);
// standardinput.convertTo(cnninputImg,CV_32FC1);
// cnninputImg=cnninputImg/255;
auto outputMap =resized_tensor.tensor<float,4>();//获取tensor指针,注意这里outputMap是Eigen::tensor类型
for(int r=0;r<standard_rows;r++)//遍历行数
{
for(int c=0;c<standard_cols;c++)//遍历列数
{
outputMap(0,r,c,0)=float(standardinput.ptr<uchar>(r)[c])/255;
}
}
//CNN input
std::vector<std::pair<std::string, tensorflow::Tensor> > inputs;
std::string Input1Name = "input_1_1";//"input_1_1:0";
inputs.push_back(std::make_pair(Input1Name, resized_tensor));
//CNN predict
std::vector<tensorflow::Tensor> outputs;
std::string output="output_1";//"output_1:0";
tensorflow::Status status_run = session->Run({{Input1Name,resized_tensor}}, {output}, {}, &outputs);
if (!status_run.ok()) {
std::cout <<"ERROR: RUN failed in real inference()..."<< status_run.ToString() << "\n";
return -1;
}
int flag=getOutputImg(outputs[0],outputimg);
if(flag!=0)
{
std::cout <<"ERROR: RUN failed in getCnnRealLabel()..."<<std::endl;
return -2;
}
showtestindex++;
return 0;
}
int linkuang::getOutputImg(tensorflow::Tensor &output,cv::Mat &outputimg)
{
memcpy(outputimg.data, output.tensor_data().data(), output.tensor_data().size());
// for(int r=0;r!=standard_rows;r++)
// {
// for(int c=0;c!=standard_cols;c++)
// {
// cout<<outputimg.ptr<float>(r)[c]<<"\t";
// }
// cout<<endl;
// }
// cout<<endl<<endl;
return 0;
}
/*
int linkuang::getOutputImg(tensorflow::Tensor &output,cv::Mat &outputimg)
{
int ndim2 = output.shape().dims();
auto tmap = output.tensor<float, 3>(); //<float,ndim2>
cout<<tmap(2000,2000,2000)<<endl;//why not limited in [standard_rows,standard_cols,1] as python ??
for(int r=0;r!=standard_rows;r++)
{
for(int c=0;c!=standard_cols;c++)
{
float value=tmap(r,c,0);
cout<<value<<"\t";
outputimg.ptr<uchar>(r)[c]=255*value;
}
cout<<endl;
}
cout<<endl<<endl;
return 0;
}
*/
//得到真正的标签
int linkuang::getCnnRealLabel(tensorflow::Tensor &probabilities,int &output_class_id,float &output_prob)
{
int ndim2 = probabilities.shape().dims(); // Get the dimension of the tensor
auto tmap = probabilities.tensor<float, 2>(); // Tensor Shape: [batch_size, target_class_num]
int output_dim = probabilities.shape().dim_size(1); // Get the target_class_num from 1st dimension
output_class_id=0;
float primerprob=tmap(0, 0);
if(tmap(0, 1)>primerprob)
{
primerprob=tmap(0, 1);
output_class_id=1;
}
output_prob=primerprob;
return 0;
}
linkuang::~linkuang() {
// TODO Auto-generated destructor stub
tensorflow::Status freestatus=session->Close();
if (!freestatus.ok())
{
throw std::runtime_error("ERROR: close session...");
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
tensorflow2.5.0-GPU测试工程
共30个文件
tiff:14个
mk:3个
cpp:2个
需积分: 50 2 下载量 30 浏览量
2022-07-27
17:43:34
上传
评论
收藏 51.55MB ZIP 举报
温馨提示
在ubuntu16.04上编译好tensorflow2.5.0-GPU;使用的是RTX 2060 Super测试多张图片;比TF-CPU加速很多。
资源详情
资源评论
资源推荐
收起资源包目录
testTF-GPU.zip (30个子文件)
testTF-GPU
cnnmodel
my_unet_shitou_youhua5.pb 29.38MB
testTF-gpu
Release
sources.mk 528B
objects.mk 301B
src
testcellpose.o 117KB
subdir.mk 1KB
testcellpose.d 167KB
linkuang.o 111KB
linkuang.d 143KB
makefile 1KB
testTF-gpu 83KB
.settings
language.settings.xml 2KB
src
testcellpose.cpp 3KB
linkuang.cpp 6KB
linkuang.h 4KB
.project 811B
.cproject 15KB
manyobjs-xiangan1664
43_low.tiff 1.91MB
38_low.tiff 1.87MB
40_low.tiff 1.87MB
35_low.tiff 1.85MB
37_low.tiff 1.88MB
34_low.tiff 1.85MB
33_low.tiff 1.84MB
32_low.tiff 1.83MB
30_low.tiff 1.82MB
42_low.tiff 1.86MB
36_low.tiff 1.85MB
31_low.tiff 1.82MB
41_low.tiff 1.89MB
39_low.tiff 1.87MB
共 30 条
- 1
元气少女缘结神
- 粉丝: 6065
- 资源: 65
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0