You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.1 KiB
121 lines
3.1 KiB
8 months ago
|
|
||
|
#include <cstring>
|
||
|
#include <string>
|
||
|
#include <iostream>
|
||
|
#include <inttypes.h>
|
||
|
#include "ipa_tool.h"
|
||
|
|
||
|
#include <opencv2/highgui.hpp>
|
||
|
#include <opencv2/core.hpp>
|
||
|
#include <opencv2/imgproc.hpp>
|
||
|
|
||
|
using namespace std;
|
||
|
using namespace cv;
|
||
|
|
||
|
#include "prior_boxes.hpp"
|
||
|
#include "utils.hpp"
|
||
|
#include "reader.hpp"
|
||
|
|
||
|
//example: call extern function
|
||
|
extern "C" { void f1(int a);}
|
||
|
|
||
|
#define CONFIDENCE_THRESHOLD 0.999
|
||
|
#define INPUT_WIDTH 640
|
||
|
#define INPUT_HEIGHT 480
|
||
|
#define ANCHORS_COUNT 12600
|
||
|
|
||
|
int main(int argc, char** argv)
|
||
|
{
|
||
|
if (argc != 3)
|
||
|
{
|
||
|
std::cout << "Run program by: ./retinapost input/vector.txt input/image.png";
|
||
|
}
|
||
|
|
||
|
Mat image = imread(argv[1]);
|
||
|
|
||
|
if (image.empty())
|
||
|
{
|
||
|
cout << "Could not open or find a image" << endl;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
//All constants refer to the configuration used in prior_boxes.cpp and to the 640x480 resolution.
|
||
|
std::vector<int> image_size = {INPUT_WIDTH, INPUT_HEIGHT};
|
||
|
std::vector<float> variances = {0.1f, 0.2f};
|
||
|
size_t total0_len = ANCHORS_COUNT*4;
|
||
|
size_t total1_len = ANCHORS_COUNT*2;
|
||
|
size_t num_anchors = total0_len / 4;
|
||
|
|
||
|
PriorBox priorBox(image_size, "projekt");
|
||
|
|
||
|
std::vector<std::vector<float>> priors = priorBox.forward();
|
||
|
|
||
|
|
||
|
Scalar color(0, 255, 0); // Color of the rectangle (in BGR)
|
||
|
int thickness = 2; // Thickness of the rectangle border
|
||
|
|
||
|
InstructionCounter counter;
|
||
|
counter.start();
|
||
|
/*******************Part to optmize*********************/
|
||
|
|
||
|
vector<float> floats = readFloatsFromFile(argv[2]);
|
||
|
vector<vector<float>> split_vectors = splitFloats(floats, 12600*4);
|
||
|
|
||
|
vector<float> floatarr = split_vectors[0];
|
||
|
vector<float> floatarrscr = split_vectors[1];
|
||
|
|
||
|
|
||
|
std::vector<std::vector<float>> loc;
|
||
|
for (size_t i = 0; i < num_anchors; i++) {
|
||
|
loc.push_back({floatarr[i * 4], floatarr[i * 4 + 1], floatarr[i * 4 + 2], floatarr[i * 4 + 3]});
|
||
|
}
|
||
|
|
||
|
std::vector<std::vector<float>> decoded_boxes = decode(loc, priors, variances);
|
||
|
|
||
|
std::vector<float> scores;
|
||
|
std::vector<int> inds;
|
||
|
std::vector<float> det_scores;
|
||
|
|
||
|
std::vector<std::vector<float>> det_boxes;
|
||
|
|
||
|
for (size_t i = 0; i < total1_len/2; i++) {
|
||
|
scores.push_back(floatarrscr[i*2+1]);
|
||
|
if(floatarrscr[i*2+1] > CONFIDENCE_THRESHOLD)
|
||
|
{
|
||
|
inds.push_back(i);
|
||
|
decoded_boxes[i].push_back(floatarrscr[i*2+1]);
|
||
|
decoded_boxes[i][0]= decoded_boxes[i][0]* 640;
|
||
|
decoded_boxes[i][1]= decoded_boxes[i][1]* 480;
|
||
|
decoded_boxes[i][2]= decoded_boxes[i][2]* 640;
|
||
|
decoded_boxes[i][3]= decoded_boxes[i][3]* 480;
|
||
|
det_boxes.push_back(decoded_boxes[i]);
|
||
|
det_scores.push_back(scores[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
auto out = nms(det_boxes, 0.4);
|
||
|
|
||
|
//Test
|
||
|
//f1(10);
|
||
|
|
||
|
counter.print();
|
||
|
|
||
|
/************************************************/
|
||
|
|
||
|
|
||
|
for (int i = 0; i < out.size(); i++)
|
||
|
{
|
||
|
#ifdef DEBUG
|
||
|
printf("Box %f %f %f %f %f\n", out[i][0], out[i][1], out[i][2], out[i][3], out[i][4]);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
cv::Rect roi((int)out[i][0], (int)out[i][1], (int)out[i][2]- (int)out[i][0], (int)out[i][3] - (int)out[i][1]);
|
||
|
rectangle(image, roi, color, thickness);
|
||
|
}
|
||
|
|
||
|
imshow("Output", image);
|
||
|
waitKey(0);
|
||
|
|
||
|
return 0;
|
||
|
}
|