#include #include #include #include #include "tkDNN/NetworkViz.h" namespace tk { namespace dnn { cv::Mat mapillary_15_map(cv::Mat adjMap){ // cv::imshow("test", adjMap); // cv::waitKey(0); cv::Mat M1(1, 256, CV_8UC1), M2(1, 256, CV_8UC1), M3(1, 256, CV_8UC1); //animal M3.at(0)=165; M2.at(0)=42; M1.at(0)=45; //curb M3.at(1)=196; M2.at(1)=196; M1.at(1)=196; //barrier M3.at(2)=90; M2.at(2)=120; M1.at(2)=150; //road M3.at(3)=128; M2.at(3)=64; M1.at(3)=128; //building M3.at(4)=70; M2.at(4)=70; M1.at(4)=70; //person M3.at(5)=220; M2.at(5)=20; M1.at(5)=60; //roadmark M3.at(6)=255; M2.at(6)=255; M1.at(6)=255; //nature M3.at(7)=107; M2.at(7)=142; M1.at(7)=35; //sky M3.at(8)=70; M2.at(8)=130; M1.at(8)=180; //billboard M3.at(9)=220; M2.at(9)=220; M1.at(9)=220; //pole M3.at(10)=153; M2.at(10)=153; M1.at(10)=153; //traffic sign M3.at(11)=128; M2.at(11)=128; M1.at(11)=128; //bike M3.at(12)=119; M2.at(12)=11; M1.at(12)=32; //vehicle M3.at(13)=0; M2.at(13)=0; M1.at(13)=142; //void for(int i=14;i<256;i++) { M1.at(i)=0; M2.at(i)=0; M3.at(i)=0; } cv::Mat r1,r2,r3; cv::LUT(adjMap,M1,r1); cv::LUT(adjMap,M2,r2); cv::LUT(adjMap,M3,r3); std::vector planes; planes.push_back(r1); planes.push_back(r2); planes.push_back(r3); cv::Mat dst; cv::merge(planes,dst); return dst; } cv::Mat berkeley_20_map(cv::Mat adjMap){ cv::Mat M1(1, 256, CV_8UC1), M2(1, 256, CV_8UC1), M3(1, 256, CV_8UC1); //road M3.at(0)=128; M2.at(0)=64; M1.at(0)=128; //sidewalk M3.at(1)=244; M2.at(1)=35; M1.at(1)=232; //building M3.at(2)=70; M2.at(2)=70; M1.at(2)=70; //wall M3.at(3)=102; M2.at(3)=102; M1.at(3)=156; //fence M3.at(4)=90; M2.at(4)=120; M1.at(4)=150; //pole M3.at(5)=153; M2.at(5)=153; M1.at(5)=153; //traffic light M3.at(6)=250; M2.at(6)=170; M1.at(6)=30; //traffic sign M3.at(7)=128; M2.at(7)=128; M1.at(7)=128; //nature M3.at(8)=107; M2.at(8)=142; M1.at(8)=35; //ground M3.at(9)=0; M2.at(9)=192; M1.at(9)=0; //sky M3.at(10)=70; M2.at(10)=130; M1.at(10)=180; //person M3.at(11)=220; M2.at(11)=20; M1.at(11)=60; //rider M3.at(12)=255; M2.at(12)=0; M1.at(12)=100; //car M3.at(13)=0; M2.at(13)=0; M1.at(13)=142; //truck M3.at(14)=0; M2.at(14)=0; M1.at(14)=70; //bus M3.at(15)=0; M2.at(15)=60; M1.at(15)=100; //train M3.at(16)=0; M2.at(16)=0; M1.at(16)=192; //motorbike M3.at(17)=0; M2.at(17)=0; M1.at(17)=230; //bike M3.at(18)=119; M2.at(18)=11; M1.at(18)=32; //void for(int i=19;i<256;i++) { M1.at(i)=0; M2.at(i)=0; M3.at(i)=0; } cv::Mat r1,r2,r3; cv::LUT(adjMap,M1,r1); cv::LUT(adjMap,M2,r2); cv::LUT(adjMap,M3,r3); std::vector planes; planes.push_back(r1); planes.push_back(r2); planes.push_back(r3); cv::Mat dst; cv::merge(planes,dst); return dst; } cv::Mat cityscapes_19_map(cv::Mat adjMap){ cv::Mat M1(1, 256, CV_8UC1), M2(1, 256, CV_8UC1), M3(1, 256, CV_8UC1); //road M3.at(0)=128; M2.at(0)=64; M1.at(0)=128; //sidewalk M3.at(1)=244; M2.at(1)=35; M1.at(1)=232; //building M3.at(2)=70; M2.at(2)=70; M1.at(2)=70; //wall M3.at(3)=102; M2.at(3)=102; M1.at(3)=156; //fence M3.at(4)=190; M2.at(4)=153; M1.at(4)=153; //pole M3.at(5)=153; M2.at(5)=153; M1.at(5)=153; //traffic light M3.at(6)=250; M2.at(6)=170; M1.at(6)=30; //traffic sign M3.at(7)=220; M2.at(7)=220; M1.at(7)=0; //vegetation M3.at(8)=107; M2.at(8)=142; M1.at(8)=35; //terrain M3.at(9)=152; M2.at(9)=251; M1.at(9)=152; //sky M3.at(10)=70; M2.at(10)=130; M1.at(10)=180; //person M3.at(11)=220; M2.at(11)=20; M1.at(11)=60; //rider M3.at(12)=255; M2.at(12)=0; M1.at(12)=0; //car M3.at(13)=0; M2.at(13)=0; M1.at(13)=142; //truck M3.at(14)=0; M2.at(14)=0; M1.at(14)=70; //bus M3.at(15)=0; M2.at(15)=60; M1.at(15)=100; //train M3.at(16)=0; M2.at(16)=80; M1.at(16)=100; //motorcycle M3.at(17)=0; M2.at(17)=0; M1.at(17)=230; //bicycle M3.at(18)=119; M2.at(18)=11; M1.at(18)=32; //void for(int i=19;i<256;i++) { M1.at(i)=0; M2.at(i)=0; M3.at(i)=0; } cv::Mat r1,r2,r3; cv::LUT(adjMap,M1,r1); cv::LUT(adjMap,M2,r2); cv::LUT(adjMap,M3,r3); std::vector planes; planes.push_back(r1); planes.push_back(r2); planes.push_back(r3); cv::Mat dst; cv::merge(planes,dst); return dst; } cv::Mat vizFloat2colorMap(cv::Mat map,double min, double max, int classes) { if(min == 0 && max == 0) cv::minMaxIdx(map, &min, &max); cv::Mat adjMap; cv::Mat falseColorsMap; switch (classes) { case 15: map.convertTo(adjMap,CV_8UC1); falseColorsMap = mapillary_15_map(adjMap); break; case 20: map.convertTo(adjMap,CV_8UC1); falseColorsMap = berkeley_20_map(adjMap); break; case 19: map.convertTo(adjMap,CV_8UC1); falseColorsMap = cityscapes_19_map(adjMap); break; default: // expand your range to 0..255. Similar to histEq(); map.convertTo(adjMap,CV_8UC1, 255 / (max-min), -min); applyColorMap(adjMap, falseColorsMap, cv::COLORMAP_PARULA); } return falseColorsMap; } cv::Mat vizData2Mat(dnnType *dataInput, tk::dnn::dataDim_t dim, int img_h, int img_w, double min, double max, int classes) { dnnType *data = nullptr; // copy to CPU if(isCudaPointer(dataInput)) { data = new dnnType[dim.tot()]; checkCuda( cudaMemcpy(data, dataInput, dim.tot()*sizeof(dnnType), cudaMemcpyDeviceToHost) ); } else { data = dataInput; } int gridDim = ceil(sqrt(dim.c)); cv::Size gridSize(dim.w*gridDim, dim.h*gridDim); cv::Mat grid = cv::Mat(gridSize, CV_8UC3, cv::Scalar(0)); for(int i=0; i= net->num_layers) FatalError("Could not viz layer\n"); return vizData2Mat(net->layers[layer]->dstData, net->layers[layer]->output_dim, imgdim, imgdim); //cv::imwrite("viz/layer" + std::to_string(layer) + ".png", viz); //cv::imshow("layer", viz); //cv::waitKey(0); } }}