-
-
Save kyrs/9adf86366e9e4f04addb to your computer and use it in GitHub Desktop.
| /* | |
| Following file take opencv mat file as an input and run inception model on it | |
| Created by : Kumar Shubham | |
| Date : 27-03-2016 | |
| */ | |
| //Loading Opencv fIles for processing | |
| #include <opencv2/opencv.hpp> | |
| #include <opencv2/imgproc/imgproc.hpp> | |
| #include <string> | |
| #include <iostream> | |
| #include "tensorflow/core/public/session.h" | |
| #include "tensorflow/core/platform/env.h" | |
| #include "tensorflow/core/framework/tensor.h" | |
| #include <fstream> | |
| int main(int argc, char** argv) | |
| { | |
| // Loading the file path provided in the arg into a mat objects | |
| std::string path = argv[1]; | |
| cv::Mat readImage = cv::imread(path); | |
| std::cerr << "read image=" << path << std::endl; | |
| // converting the image to the necessary dim and for normalization | |
| int height = 299; | |
| int width = 299; | |
| int mean = 128; | |
| int std = 128; | |
| cv::Size s(height,width); | |
| cv::Mat Image; | |
| std::cerr << "resizing\n"; | |
| cv::resize(readImage,Image,s,0,0,cv::INTER_CUBIC); | |
| std::cerr << "success resizing\n"; | |
| int depth = Image.channels(); | |
| //std::cerr << "height=" << height << " / width=" << width << " / depth=" << depth << std::endl; | |
| // creating a Tensor for storing the data | |
| tensorflow::Tensor input_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1,height,width,depth})); | |
| auto input_tensor_mapped = input_tensor.tensor<float, 4>(); | |
| cv::Mat Image2; | |
| Image.convertTo(Image2, CV_32FC1); | |
| Image = Image2; | |
| Image = Image-mean; | |
| Image = Image/std; | |
| const float * source_data = (float*) Image.data; | |
| // copying the data into the corresponding tensor | |
| for (int y = 0; y < height; ++y) { | |
| const float* source_row = source_data + (y * width * depth); | |
| for (int x = 0; x < width; ++x) { | |
| const float* source_pixel = source_row + (x * depth); | |
| for (int c = 0; c < depth; ++c) { | |
| const float* source_value = source_pixel + c; | |
| input_tensor_mapped(0, y, x, c) = *source_value; | |
| } | |
| } | |
| } | |
| // initializing the graph | |
| tensorflow::GraphDef graph_def; | |
| // Name of the folder in which inception graph is present | |
| std::string graphFile = "../../model/tensorflow_inception_graph.pb"; | |
| // Loading the graph to the given variable | |
| tensorflow::Status graphLoadedStatus = ReadBinaryProto(tensorflow::Env::Default(),graphFile,&graph_def); | |
| if (!graphLoadedStatus.ok()){ | |
| std::cout << graphLoadedStatus.ToString()<<std::endl; | |
| return 1; | |
| } | |
| // creating a session with the grap | |
| std::unique_ptr<tensorflow::Session> session_inception(tensorflow::NewSession(tensorflow::SessionOptions())); | |
| //session->reset(tensorflow::NewSession(tensorflow::SessionOptions())); | |
| tensorflow::Status session_create_status = session_inception->Create(graph_def); | |
| if (!session_create_status.ok()){ | |
| return 1; | |
| } | |
| // running the loaded graph | |
| std::vector<tensorflow::Tensor> finalOutput; | |
| std::string InputName = "Mul"; | |
| std::string OutputName = "softmax"; | |
| tensorflow::Status run_status = session_inception->Run({{InputName,input_tensor}},{OutputName},{},&finalOutput); | |
| // finding the labels for prediction | |
| std::cerr << "final output size=" << finalOutput.size() << std::endl; | |
| tensorflow::Tensor output = std::move(finalOutput.at(0)); | |
| auto scores = output.flat<float>(); | |
| std::cerr << "scores size=" << scores.size() << std::endl; | |
| // Label File Name | |
| std::string labelfile = "../../model/imagenet_comp_graph_label_strings.txt"; | |
| std::ifstream label(labelfile); | |
| std::string line; | |
| // sorting the file to find the top labels | |
| std::vector<std::pair<float,std::string>> sorted; | |
| for (unsigned int i =0; i<=1000 ;++i){ | |
| std::getline(label,line); | |
| sorted.emplace_back(scores(i),line); | |
| //std::cout << scores(i) << " / line=" << line << std::endl; | |
| } | |
| std::sort(sorted.begin(),sorted.end()); | |
| std::reverse(sorted.begin(),sorted.end()); | |
| std::cout << "size of the sorted file is "<<sorted.size()<< std::endl; | |
| for(unsigned int i =0 ; i< 5;++i){ | |
| std::cout << "The output of the current graph has category " << sorted[i].second << " with probability "<< sorted[i].first << std::endl; | |
| } | |
| /*cv::namedWindow("imageOpencv",CV_WINDOW_KEEPRATIO); | |
| cv::imshow("imgOpencv",Image); | |
| */ | |
| } |
@ilaripih What did you do to #63? I'm getting segfaults...
thank you for this sample. Could you please provide the BUILD file?
I want to ask a question. when I use opencv2 to read an image and bazel build my cc file, it turned out that "undefied reference to 'cv::....'. It seems all cv-related function cannot be used. How can I compile opencv2 with my tensorflow? can some one help me ?
@XiZiler and @e1s9 , Check this link (http://126kr.com/article/9ckv0k9msfa) for knowing how to integrate OpenCV.
Thank you for sharing this sample. ^^
As @ilaripih mentioned,
copying the data should be re-ordered from BGR to RGB.
// copying the data into the corresponding tensor
for (int y = 0; y < height; ++y) {
const float* source_row = source_data + (y * width * depth);
for (int x = 0; x < width; ++x) {
const float* source_pixel = source_row + (x * depth);
const float* source_B = source_pixel + 0;
const float* source_G = source_pixel + 1;
const float* source_R = source_pixel + 2;
input_tensor_mapped(0, y, x, 0) = *source_R;
input_tensor_mapped(0, y, x, 1) = *source_G;
input_tensor_mapped(0, y, x, 2) = *source_B;
}
}@XiZiler: This is a good writeup: https://jacobgil.github.io/deeplearning/tensorflow-cpp
at line 50: Image.convertTo(Image2, CV_32FC1);
why convert to 1 channel?
I got this working in a different use case after changing line #63 to convert OpenCV's BGR channel order to TensorFlow's RGB.
BTW, did you find any solution to the issue with JPEG files: tensorflow/tensorflow#1924