Skip to content

OMG #5

@big-chan

Description

@big-chan

#include

#include "NvInfer.h"
#include <cuda_runtime_api.h>
#include "NvCaffeParser.h"
#include "NvOnnxConfig.h"
#include "NvInferPlugin.h"
#include "NvUtils.h"
#include "NvOnnxParser.h"
#include
#include
#include
#include
#undef slots
#include <torch/torch.h>
#include <torch/script.h>
#define slots Q_SLOTS

#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/hal/interface.h>
#include <string.h>
#include
#include <time.h>
#include
#include <memory.h>
#include
#include
#include
#include <cuda_runtime.h>
#include
#include <opencv2/dnn.hpp>

#define CHECK(status)
{
if (status != 0)
{
std::cout << "Cuda failure: " << status;
abort();
}
}

class Logger : public nvinfer1::ILogger
{
void log( Severity severity, const char* msg ) override
{
if( severity != Severity::kINFO /|| mEnableDebug/ )
printf( "%s\n", msg);
}
} gLogger;

// Check input size
static const int INPUT_H = 512;
static const int INPUT_W = 640;
static const int CHANNEL_NUM_R = 3;
static const int CHANNEL_NUM_T = 1;
// Check ONNX input && output name
const char* INPUT_BLOB_NAME = "RGB";
const char* OUTPUT_BLOB_NAME = "loc";
const char* INPUT_BLOB_NAME2 = "Thermal";
const char* OUTPUT_BLOB_NAME2 = "cls";
// For NMS
// Make Prio Box
torch::Tensor create_prior_boxes(){

    std::map<std::string,float> fmap_dims[2];

    fmap_dims[0]["conv4_3"]=80;

    fmap_dims[0]["conv6"]=40;
    fmap_dims[0]["conv7"]=20;
    fmap_dims[0]["conv8"]=10;
    fmap_dims[0]["conv9"]=10;
    fmap_dims[0]["conv10"]=10;

    fmap_dims[1]["conv4_3"]=64;

    fmap_dims[1]["conv6"]=32;
    fmap_dims[1]["conv7"]=16;
    fmap_dims[1]["conv8"]=8;
    fmap_dims[1]["conv9"]=8;
    fmap_dims[1]["conv10"]=8;

    std::map<std::string,float> scale_ratios[3];
    scale_ratios[0]["conv4_3"]=1.;
    scale_ratios[0]["conv6"]=1.;
    scale_ratios[0]["conv7"]=1.;
    scale_ratios[0]["conv8"]=1.;
    scale_ratios[0]["conv9"]=1.;
    scale_ratios[0]["conv10"]=1.;

    scale_ratios[1]["conv4_3"]=(float)pow(2,1/3.);
    scale_ratios[1]["conv6"]=(float)pow(2,1/3.);
    scale_ratios[1]["conv7"]=(float)pow(2,1/3.);
    scale_ratios[1]["conv8"]=(float)pow(2,1/3.);
    scale_ratios[1]["conv9"]=(float)pow(2,1/3.);
    scale_ratios[1]["conv10"]=(float)pow(2,1/3.);


    scale_ratios[2]["conv4_3"]=(float)pow(2,2/3.);
    scale_ratios[2]["conv6"]=(float)pow(2,2/3.);
    scale_ratios[2]["conv7"]=(float)pow(2,2/3.);
    scale_ratios[2]["conv8"]=(float)pow(2,2/3.);
    scale_ratios[2]["conv9"]=(float)pow(2,2/3.);
    scale_ratios[2]["conv10"]=(float)pow(2,2/3.);

    std::map<std::string, float> aspect_ratios[2];
    aspect_ratios[1]["conv4_3"]=1.;
    aspect_ratios[1]["conv6"]=1.;
    aspect_ratios[1]["conv7"]=1.;
    aspect_ratios[1]["conv8"]=1.;
    aspect_ratios[1]["conv9"]=1.;
    aspect_ratios[1]["conv10"]=1.;

    aspect_ratios[0]["conv4_3"]=(float)1/2;
    aspect_ratios[0]["conv6"]=(float)1/2;
    aspect_ratios[0]["conv7"]=(float)1/2;
    aspect_ratios[0]["conv8"]=(float)1/2;
    aspect_ratios[0]["conv9"]=(float)1/2;
    aspect_ratios[0]["conv10"]=(float)1/2;

    std::map<std::string, double> anchor_areas;

    anchor_areas["conv4_3"]=40*40.;
    anchor_areas["conv6"]=80*80.;
    anchor_areas["conv7"]=160*160.;
    anchor_areas["conv8"]=200*200.;
    anchor_areas["conv9"]=280*280.;
    anchor_areas["conv10"]=360*360.;
    std::string fmaps[6]={"conv4_3", "conv6", "conv7", "conv8", "conv9", "conv10"};
    double cx,cy;
    double h,w,anchor_h,anchor_w;
    std::string fmap_i;
    double prior_box[4];

    torch::Tensor prior_boxs = torch::rand({41760,4});

    int numbers=0;

    for(int fmap =0 ; fmap<6;fmap++){
        fmap_i=fmaps[fmap];

        for(int i=0;i<fmap_dims[1][fmap_i];i++){
            for(int j=0;j<fmap_dims[0][fmap_i];j++){
               cx=(j+0.5)/fmap_dims[0][fmap_i];
               cy=(i+0.5)/fmap_dims[1][fmap_i];
               for(int s=0;s<1;s++){
                   for(int ar =0;ar<2;ar++){

                       h=sqrt(anchor_areas[fmap_i]/aspect_ratios[ar][fmap_i]);
                       w=aspect_ratios[ar][fmap_i]*h;
                       for( int sr =0;sr<3;sr++){
                           anchor_h=h*scale_ratios[sr][fmap_i]/512.;
                           anchor_w=w*scale_ratios[sr][fmap_i]/640.;
                           prior_boxs[numbers][0]=cx;
                           prior_boxs[numbers][1]=cy;
                           prior_boxs[numbers][2]=anchor_w;
                           prior_boxs[numbers][3]=anchor_h;
                           numbers++;

                       }
                   }
               }
            }
        }
    }


    return prior_boxs;

}
torch::Tensor cxcy_to_xy(torch::Tensor cxcy){

return torch::cat({cxcy.slice(1,0,2) - (cxcy.slice(1,2) / 2),cxcy.slice(1,0,2) + (cxcy.slice(1,2) / 2)}, 1);

}
torch::Tensor gcxgcy_to_cxcy(torch::Tensor gcxgcy,torch::Tensor priors_cxcy){
torch::Tensor a,b,c;

a=torch::mul(gcxgcy.slice(1,0,2),priors_cxcy.slice(1,2))/10+priors_cxcy.slice(1,0,2);
b=torch::exp(gcxgcy.slice(1,2)/5)*priors_cxcy.slice(1,2);

return torch::cat({a,b},1);

}
torch::Tensor find_intersection(torch::Tensor set_1,torch::Tensor set_2){
torch::Tensor lower_bounds,upper_bounds,uml,intersection_dims;

lower_bounds=torch::max(set_1.slice(1,0,2).unsqueeze(1),set_2.slice(1,0,2).unsqueeze(0));
upper_bounds=torch::min(set_1.slice(1,2).unsqueeze(1),set_2.slice(1,2).unsqueeze(0));
uml= (upper_bounds-lower_bounds);
intersection_dims=uml.clamp(0);

 return intersection_dims.slice(2,0,1)*intersection_dims.slice(2,1,2);

}
// Calculate IOU BBOX
torch::Tensor find_overlap(torch::Tensor set_1,torch::Tensor set_2){
torch::Tensor intersection,areas_set_1,areas_set_2,union_;

intersection=find_intersection(set_1,set_2);
areas_set_1 = (set_1.slice(1,2,3) - set_1.slice(1,0,1)) * (set_1.slice(1,3,4)- set_1.slice(1,1,2)) ;

areas_set_2 = (set_2.slice(1,2,3) - set_2.slice(1,0,1)) * (set_2.slice(1,3,4)- set_2.slice(1,1,2)) ;
union_=areas_set_1.unsqueeze(1) + areas_set_2.unsqueeze(0) - intersection;

return   intersection / union_;

}
// NMS Main
torch::Tensor detect_objects(torch::Tensor predicted_locs,torch::Tensor predicted_scores,torch::Tensor priors_xy,double min_score,double max_overlap,int top_k){
torch::Tensor decode_loc,class_scores ,score_above_min_score;

predicted_scores=predicted_scores.softmax(2);

decode_loc=cxcy_to_xy(gcxgcy_to_cxcy(predicted_locs[0],priors_xy));

//std::cout<<decode_loc<<std::endl;
int n_above_min_score;
int classname=1;
class_scores=predicted_scores[0].slice(1,classname,classname+1);

score_above_min_score=class_scores>min_score;
n_above_min_score=score_above_min_score.sum().item<int>();
//std::cout<<n_above_min_score<<std::endl;
if(n_above_min_score==0){
    torch::Tensor out=torch::zeros({1,5});
    out[0][2]=1.;
    out[0][3]=1.;
    return out;
}

torch::Tensor suppress;
torch::Tensor out_boxes,out_scores,out_label;
int up=0;

//auto indexing_minscore=torch::nonzero(score_above_min_score);

auto order_t=std::get<1>(class_scores.sort(0,true));
auto class_sorted=class_scores.index_select(0,order_t.squeeze(-1));
torch::Tensor decode_loc_sorted=decode_loc.index_select(0,order_t.squeeze(-1));
int dets_num = decode_loc.size(0);

class_sorted=class_sorted.slice(0,0,n_above_min_score);
decode_loc_sorted=decode_loc_sorted.slice(0,0,n_above_min_score);

//std::cout<<"find_oveerlap"<<std::endl;

auto overlap=find_overlap(decode_loc_sorted,decode_loc_sorted);
//NMS
suppress=torch::zeros((n_above_min_score)).to(at::kCUDA);

//std::cout<<"start NMS"<<std::endl;
for(int box=0;box<decode_loc_sorted.size(0);box++){

    if(suppress[box].item<int>()==1){
        continue;
    }

    torch::Tensor what=overlap[box]>max_overlap;
    what=what.to(at::kFloat);

    auto maxes=torch::max(suppress,what.squeeze(1));

    suppress=maxes;


    suppress[box]=0;

}

suppress=1-suppress;

auto indexing=torch::nonzero(suppress);

out_boxes=decode_loc_sorted.index_select(0,indexing.squeeze(-1));

out_scores=class_sorted.index_select(0,indexing.squeeze(-1));

return torch::cat({out_boxes,out_scores},1);

}
std::vectorstd::string split(std::string str, char delimiter) {
std::vectorstd::string internal;
std::stringstream ss(str);
std::string temp;

while (std::getline(ss, temp, delimiter)) {
    internal.push_back(temp);
}

return internal;

}

std::string format(const char* format, ...)
{
va_list args;
va_start(args, format);
#ifndef _MSC_VER
size_t size = std::snprintf( nullptr, 0, format, args) + 1; // Extra space for '\0'
std::unique_ptr<char[]> buf( new char[ size ] );
std::vsnprintf( buf.get(), size, format, args);
return std::string(buf.get(), buf.get() + size - 1 ); // We don't want the '\0' inside
#else
int size = _vscprintf(format, args);
std::string result(++size, 0);
vsnprintf_s((char*)result.data(), size, _TRUNCATE, format, args);
return result;
#endif
va_end(args);
}

// Image Normalize on Torch
at::Tensor Normalize(at::Tensor img,int what){//
at::Tensor normimg,tensor_img_R_R,tensor_img_R_G,tensor_img_R_B;

if(what==1){

// normimg=img.div_(255.).sub_(0.4126);
normimg=img.div_(255.).mul_(2).sub_(1);
}
else{
tensor_img_R_R=img.slice(1,0,1);
tensor_img_R_G=img.slice(1,1,2);
tensor_img_R_B=img.slice(1,2,3);
// tensor_img_R_R=tensor_img_R_R.div_(255.).sub_(0.5873);
// tensor_img_R_G=tensor_img_R_G.div_(255.).sub_(0.5328);
// tensor_img_R_B=tensor_img_R_B.div_(255.).sub_(0.4877);
tensor_img_R_R=tensor_img_R_R.div_(255.).mul_(2).sub_(1);
tensor_img_R_G=tensor_img_R_G.div_(255.).mul_(2).sub_(1);
tensor_img_R_B=tensor_img_R_B.div_(255.).mul_(2).sub_(1);

    normimg=torch::cat({tensor_img_R_R,tensor_img_R_G,tensor_img_R_B},1);
}
return normimg;

}
at::Tensor Mat2Tensor(cv::Mat img){
int channel=img.channels();
at::Tensor tensor_img;
cv::resize(img,img,cv::Size(640,512));
if(channel==1){
std::vector<int64_t> dims{1,static_cast<int64_t>(img.channels()),
static_cast<int64_t>(img.rows),
static_cast<int64_t>(img.cols)};
tensor_img=torch::from_blob(img.data,dims,at::kByte);
tensor_img = tensor_img.to(at::kFloat);
}
else{
std::vector<int64_t> dims{1,
static_cast<int64_t>(img.rows),
static_cast<int64_t>(img.cols),static_cast<int64_t>(img.channels())};
tensor_img=torch::from_blob(img.data,dims,at::kByte);
tensor_img=tensor_img.permute({0,3,1,2});
}
tensor_img = tensor_img.to(at::kFloat);

tensor_img=Normalize(tensor_img,channel);
return tensor_img;

}
void setAllTensorScales(nvinfer1::INetworkDefinition* network, float inScales = 2.0f, float outScales = 4.0f)
{
// Ensure that all layer inputs have a scale.

for (int i = 0; i < network->getNbLayers(); i++)
{
    auto layer = network->getLayer(i);
    for (int j = 0; j < layer->getNbInputs(); j++)
    {
        nvinfer1::ITensor* input{layer->getInput(j)};
        // Optional inputs are nullptr here and are from RNN layers.
        if (input != nullptr && !input->dynamicRangeIsSet())
        {
            input->setDynamicRange(-inScales, inScales);
        }
    }
}

// Ensure that all layer outputs have a scale.
// Tensors that are also inputs to layers are ingored here
// since the previous loop nest assigned scales to them.
for (int i = 0; i < network->getNbLayers(); i++)
{
    auto layer = network->getLayer(i);
    for (int j = 0; j < layer->getNbOutputs(); j++)
    {
        nvinfer1::ITensor* output{layer->getOutput(j)};
        // Optional outputs are nullptr here and are from RNN layers.
        if (output != nullptr && !output->dynamicRangeIsSet())
        {
            // Pooling must have the same input and output scales.
              //std::cout<<layer->getType() <<std::endl;
            if (layer->getType() == nvinfer1::LayerType::kPOOLING)
            {
                output->setDynamicRange(-inScales, inScales);
            }
            else
            {
                output->setDynamicRange(-outScales, outScales);
            }
        }
    }
}

}

void enableDLA(nvinfer1::IBuilder* builder, nvinfer1::IBuilderConfig* config, int useDLACore, bool allowGPUFallback = true)
{
if (useDLACore >= 0)
{
if (builder->getNbDLACores() == 0)
{
std::cerr << "Trying to use DLA core " << useDLACore << " on a platform that doesn't have any DLA cores"
<< std::endl;
//assert("Error: use DLA core on a platfrom that doesn't have any DLA cores" && false);
}
if (allowGPUFallback)
{

        config->setFlag(nvinfer1::BuilderFlag::kGPU_FALLBACK);
    }

    if (!builder->getInt8Mode() && !config->getFlag(nvinfer1::BuilderFlag::kINT8))
    {
        // User has not requested INT8 Mode.
        // By default run in FP16 mode. FP32 mode is not permitted.
        builder->setFp16Mode(true);
        config->setFlag(nvinfer1::BuilderFlag::kFP16);
    }
    config->setDefaultDeviceType(nvinfer1::DeviceType::kDLA);
    config->setDLACore(useDLACore);
    config->setFlag(nvinfer1::BuilderFlag::kSTRICT_TYPES);
}

}

nvinfer1::ICudaEngine* loadEngine(const std::string& engine, int DLACore, std::ostream& err)
{
std::ifstream engineFile(engine, std::ios::binary);
if (!engineFile)
{
err << "Error opening engine file: " << engine << std::endl;
return nullptr;
}

engineFile.seekg(0, engineFile.end);
long int fsize = engineFile.tellg();
engineFile.seekg(0, engineFile.beg);

std::vector<char> engineData(fsize);
engineFile.read(engineData.data(), fsize);
if (!engineFile)
{
    err << "Error loading engine file: " << engine << std::endl;
    return nullptr;
}
nvinfer1::IRuntime* runtime=   nvinfer1::createInferRuntime(gLogger);

if (DLACore != -1)
    {
        runtime->setDLACore(DLACore);
    }


return runtime->deserializeCudaEngine(engineData.data(), fsize, nullptr);

}
bool saveEngine(const nvinfer1::ICudaEngine& engine, const std::string& fileName, std::ostream& err)
{
std::ofstream engineFile(fileName, std::ios::binary);
if (!engineFile)
{
err << "Cannot open engine file: " << fileName << std::endl;
return false;
}
nvinfer1::IHostMemory *serializedEngine=engine.serialize();

engineFile.write(static_cast<char*>(serializedEngine->data()), serializedEngine->size());
return !engineFile.fail();

}

// Make Engine from ONNX
bool constructNetwork(nvinfer1::IBuilder* builder,nvinfer1::INetworkDefinition* network, nvinfer1::IBuilderConfig* config,
nvonnxparser::IParser* parser)
{
int DLAcores=0;
// Check ONNX path
std::string onnx_filename ="/home/rcvsejong2/Xavier2/tensorrt/dc_workspace/halfway_v6.onnx";
auto parsed = parser->parseFromFile(onnx_filename.c_str(), 0);
if (!parsed)
{
return false;
}

builder->setMaxBatchSize(1);
config->setMaxWorkspaceSize(32000000);
if (false)
{
    config->setFlag(nvinfer1::BuilderFlag::kFP16);
}
if (false)
{
    config->setFlag(nvinfer1::BuilderFlag::kINT8);
    setAllTensorScales(network, 127.0f, 127.0f);
}

enableDLA(builder, config, DLAcores);

return true;

}

// image Mat to float pointer
void imageCalculation(cv::Mat img_input, const int INPUT_W_, const int INPUT_H_, const int CHANNEL_NUM, float* data)
{
cv::Mat Img;
Img = img_input;
cv::Mat channel[CHANNEL_NUM];
std::cout<<"Start split"<<std::endl;
if(Img.channels()>1){
cv::split(Img,channel);

    }
    else{
        channel[0]=Img;

    }

// std::cout<<"Done split"<<std::endl;
// unsigned int *fileData=new unsigned int[INPUT_W_INPUT_H_CHANNEL_NUM];
int num_time=0;
//std::vector<
for(int k=0;k<CHANNEL_NUM;k++)
{
for(int i=0;i<INPUT_H;i++)
{
for(int j=0;j<INPUT_W;j++)
{
//std::cout<<(int)channel[k].at(i, sj)<<std::endl;
data[num_time]=channel[k].at(i,j);
num_time++;
}
}
}
// std::cout<<"Mat to Pointer"<<std::endl;
// for (int i = 0; i < INPUT_W_INPUT_H_CHANNEL_NUM; i++)
// {
// data[i] = float(img_input.data[i]);
// }
}
// Forward
void doInference2(nvinfer1::IExecutionContext& context, float
input, float
input2, float32_t
output,float32_t
output2, int batchSize, int output_size_, int output_size_2)
{
const nvinfer1::ICudaEngine& engine = context.getEngine();

//assert(engine.getNbBindings() == 2);
void* buffers[4];
size_t input_size= batchSize * INPUT_H * INPUT_W * CHANNEL_NUM_R * sizeof(float32_t);
size_t input_size2= batchSize * INPUT_H * INPUT_W * CHANNEL_NUM_T * sizeof(float32_t);

int inputIndex = engine.getBindingIndex(INPUT_BLOB_NAME),outputIndex = engine.getBindingIndex(OUTPUT_BLOB_NAME);
int inputIndex2 = engine.getBindingIndex(INPUT_BLOB_NAME2),outputIndex2 = engine.getBindingIndex(OUTPUT_BLOB_NAME2);

CHECK(cudaMalloc(&buffers[inputIndex],input_size));
CHECK(cudaMalloc(&buffers[inputIndex2],input_size2));

CHECK(cudaMalloc(&buffers[outputIndex], batchSize * output_size_ * sizeof(float32_t)));
CHECK(cudaMalloc(&buffers[outputIndex2], batchSize * output_size_2 * sizeof(float32_t)));

cudaStream_t stream;
cudaStreamCreate(&stream);

// DMA the input to the GPU,  execute the batch asynchronously, and DMA it back:
CHECK(cudaMemcpyAsync(buffers[inputIndex], input, input_size, cudaMemcpyHostToDevice, stream));
CHECK(cudaMemcpyAsync(buffers[inputIndex2], input2, input_size2, cudaMemcpyHostToDevice, stream));
context.enqueue(batchSize, buffers, stream, nullptr);

CHECK(cudaMemcpyAsync(output, buffers[outputIndex], batchSize * output_size_*sizeof(float32_t), cudaMemcpyDeviceToHost, stream));
CHECK(cudaMemcpyAsync(output2, buffers[outputIndex2], batchSize * output_size_2*sizeof(float32_t), cudaMemcpyDeviceToHost, stream));

CHECK(cudaStreamSynchronize(stream));

// release the stream and the buffers
cudaStreamDestroy(stream);
CHECK(cudaFree(buffers[inputIndex]));

CHECK(cudaFree(buffers[inputIndex2]));

CHECK( cudaFree(buffers[outputIndex]));
CHECK( cudaFree(buffers[outputIndex2]));

}

void torch2float(at::Tensor img,float* data){

data=img.data<float>();

}
int main(int argc, char argv[])
{
bool mEnableDebug = false;
bool mOverride16 = false;
// if you have engine? can_load =TRUE : can_load =FALSE
bool can_load=false;
int DLACore=0;
QCoreApplication a(argc, argv);
//Builder
nvinfer1::ICudaEngine
mEngine;
if(!can_load)
{ // Make Engine from ONNX
nvinfer1::IBuilder* builder = nvinfer1::createInferBuilder(gLogger);
//Network
nvinfer1::INetworkDefinition* network = builder->createNetwork();
builder->setDebugSync(mEnableDebug);
builder->setMinFindIterations(3); // allow time for TX1 GPU to spin up
builder->setAverageFindIterations(2);
//Config
nvinfer1::IBuilderConfig* config=builder->createBuilderConfig();

	//Parser
    auto parser = nvonnxparser::createParser(*network,gLogger);
    std::cout<<"Load Start"<<std::endl;
    bool error;
    error=constructNetwork(builder,network,config,parser);
    if(!error){
        std::cout<<"ERROR:: Construct Network\n"<<std::endl;
    }

    mEngine= builder->buildCudaEngine(*network);
    std::cout<<network->getNbInputs()<<" input Dims"<<std::endl;
    std::cout<<network->getNbOutputs()<<" Output Dims"<<std::endl;

    builder->destroy();
    network->destroy();
    parser->destroy();
    config->destroy();

    if(!mEngine){
        std::cout<<"ERROR:: MAKE ENGINE"<<std::endl;
    }
    std::ofstream err;
    // Check Engine Path
    saveEngine(*mEngine,"/home/rcvsejong2/Xavier2/tensorrt/dc_workspace/Halfway_v5.engine",err);

}
else{
	// Check Engine Path
    std::ofstream err;;
    mEngine=loadEngine("/home/rcvsejong2/Xavier2/tensorrt/dc_workspace/Halfway_v5.engine",DLACore,err);
}
std::cout<<"Load Done"<<std::endl;
// ////////////////////////////////////////////////////////////////////////////////////////////
// Infer
// ////////////////////////////////////////////////////////////////////////////////////////////

int batchSize=1;
int size_of_single_input=640*512*4;
int size_of_single_output=41760*4;
int size_of_single_output2=41760*2;
nvinfer1::IExecutionContext *context=mEngine->createExecutionContext();
std::vector<void*>  buffers;
std::string str;
// img_R,img_T;

// std::ofstream myfile;
// myfile.open ("/home/rcvsejong2/tensorrt/dc_workspace/output_before_cls.txt");
// //Load Image
std::ifstream file2("/media/rcvsejong2/XavierSSD256/raid/datasets/kaist-rgbt/imageSets/test-all-20.txt");
torch::Tensor prior_xy=create_prior_boxes(),result;
std::string imgname_T,imgname_R;
std::string eval_path="/home/rcvsejong2/eval_4.txt";
torch::Tensor detect_loc,detect_score;
int i=0;
std::ofstream writefile(eval_path.data());
int64 e1,e2;
while (std::getline(file2, str))
{
e1 = cv::getTickCount();
std::vectorstd::string line_vector = split(str, '/');
imgname_T="/media/rcvsejong2/XavierSSD256/raid/datasets/kaist-rgbt/images/"+line_vector[0]+"/"+line_vector[1]+"/lwir/"+line_vector[2].substr(0,6)+".jpg";
imgname_R="/media/rcvsejong2/XavierSSD256/raid/datasets/kaist-rgbt/images/"+line_vector[0]+"/"+line_vector[1]+"/visible/"+line_vector[2].substr(0,6)+".jpg";

    cv::Mat img_R,img_T,img_R_ori;
    img_R_ori=cv::imread(imgname_R,cv::IMREAD_COLOR);
    img_T=cv::imread(imgname_T,cv::IMREAD_GRAYSCALE);

    std::vector<cv::Mat> bgr(3),rgb;
    std::cout<<"img_T"<<std::endl;
    cv::resize(img_R_ori,img_R_ori,{640,512});
    cv::resize(img_T,img_T,{640,512});

    cv::cvtColor(img_R_ori,img_R_ori,cv::COLOR_RGB2BGR);
    img_R.convertTo(img_R,CV_32FC3);
    at::Tensor img_R_tensor,img_T_tensor;
    //img_R_tensor=Mat2Tensor(img_R);
    //img_T_tensor=Mat2Tensor(img_T);
    //Noramlize;
    //        normimg=img.div_(255.).sub_(0.4126);

    //        tensor_img_R_R=tensor_img_R_R.div_(255.).sub_(0.5873);
    //        tensor_img_R_G=tensor_img_R_G.div_(255.).sub_(0.5328);
    //        tensor_img_R_B=tensor_img_R_B.div_(255.).sub_(0.4877);
    std::vector<cv::Mat> channel;
    cv::split(img_R_ori,channel);
    channel[0].convertTo(channel[0],CV_32FC1);
    channel[1].convertTo(channel[1],CV_32FC1);
    channel[2].convertTo(channel[2],CV_32FC1);

    img_T.convertTo(img_T,CV_32FC1);

// img_T=((1/255.)*img_T-(0.4126));
// channel[0]=((1/255.)*channel[0]-(0.5873));
// channel[1]=((1/255.)*channel[1]-(0.5328));
// channel[2]=((1/255.)*channel[2]-(0.4877));

    cv::merge(channel,img_R);
    //std::cout<<img_R<<std::endl;

    img_T=((2/255.)*img_T-(1));
    img_R=((2/255.)*img_R-(1));

    // ////////////////////////////////////////////////////////
    //
    // ////////////////////////////////////////////////////////
    std::cout<<"START"<<std::endl;


    float32_t *output=(float32_t*)malloc(size_of_single_output*sizeof(float32_t));
    float32_t *output2=(float32_t*)malloc(size_of_single_output2*sizeof(float32_t));

    float data_R[INPUT_H*INPUT_W*CHANNEL_NUM_R];
    imageCalculation(img_R, INPUT_W,INPUT_H, CHANNEL_NUM_R, data_R);
    //torch2float(img_R_tensor,data_R);
    float data_T[INPUT_H*INPUT_W*CHANNEL_NUM_T];
    //torch2float(img_T_tensor,data_T);
    imageCalculation(img_T, INPUT_W,INPUT_H, CHANNEL_NUM_T,  data_T);

    doInference2(*context, data_R,data_T, output,output2, 1, size_of_single_output, size_of_single_output2);

    std::cout<<"Done Inference"<<std::endl;

    torch::Tensor loc=torch::zeros({1,41760,4}).to(at::kFloat);
    torch::Tensor cls=torch::zeros({1,41760,2}).to(at::kCUDA).to(at::kFloat);
    loc=torch::from_blob((void *)output,{1,41760,4},at::kFloat).to(at::kCUDA);
    cls=torch::from_blob((void *)output2,{1,41760,2},at::kFloat).to(at::kCUDA);

//std::cout<<loc<<std::endl;
// return -1;
// for(int anchor=0,count=0;anchor<41760;anchor++){

// for(int box=0;box<4;box++,count++){
// loc[0][anchor][box]=output[count];

// }
// }
// for(int anchor=0,count=0;anchor<41760;anchor++){
// for(int box=0;box<2;box++,count++){
// cls[0][anchor][box]=output2[count];

// }
// }

    prior_xy=prior_xy.to(at::kCUDA);
    std::cout<<"Start"
               " NMS"<<std::endl;
    result=detect_objects(loc,cls,prior_xy,0.1,0.45,200);

    detect_score=result.slice(1,4,5);

    detect_loc=result.slice(1,0,4);
    std::cout<<detect_loc.sizes()<<std::endl;
    i++;
    for(int box_num=0;box_num<detect_loc.size(0);box_num++){
        //cout<<detect_loc[box_num]<<endl;
        cv::Rect point;
        float x1=detect_loc[box_num][0].item<float>();
        float y1=detect_loc[box_num][1].item<float>();
        float x2=detect_loc[box_num][2].item<float>();
        float y2=detect_loc[box_num][3].item<float>();
        //          cout<<x1<<endl;

        // Eval
        if(writefile.is_open()){
            writefile<<"score "<<detect_score[box_num].item<float>()<<" image_id "<<i<<" bbox "<<x1<<","<<y1<<","<<x2<<","<<y2<<"\n";

        }
       //cv::rectangle(original_img,point,(255,0,255));

    }
    e2 = cv::getTickCount();
    std::cout<<(e2-e1)/cv::getTickFrequency()<<std::endl;
    std::cout<<i<<"/2252"<<std::endl;
    //return -1;
}
writefile.close();
return a.exec();

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions