commit
78fe5fe47d
@ -0,0 +1 @@
|
|||||||
|
*.o
|
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Win32",
|
||||||
|
"includePath": [
|
||||||
|
"${workspaceFolder}/**",
|
||||||
|
"${workspaceFolder}/../include"
|
||||||
|
],
|
||||||
|
"defines": [
|
||||||
|
"_DEBUG",
|
||||||
|
"UNICODE",
|
||||||
|
"_UNICODE"
|
||||||
|
],
|
||||||
|
"compilerPath": "g++",
|
||||||
|
"cStandard": "c11",
|
||||||
|
"cppStandard": "c++17",
|
||||||
|
"intelliSenseMode": "gcc-x64"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": 4
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "(gdb) Launch",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/retinanetpost",
|
||||||
|
"args": ["input/input.jpg", "input/input.txt"],
|
||||||
|
"stopAtEntry": true,
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"environment": [],
|
||||||
|
"externalConsole": false,
|
||||||
|
"preLaunchTask": "Build IPA_projekt_2024",
|
||||||
|
"windows": {
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"miDebuggerPath": "gdb",
|
||||||
|
"setupCommands": [
|
||||||
|
{
|
||||||
|
"description": "Enable pretty-printing for gdb",
|
||||||
|
"text": "-enable-pretty-printing",
|
||||||
|
"ignoreFailures": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Reduce gdb verbosity",
|
||||||
|
"text": "set print thread-events on",
|
||||||
|
"ignoreFailures": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"logging": {
|
||||||
|
"trace": true,
|
||||||
|
"traceResponse": true,
|
||||||
|
"engineLogging": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"iostream": "cpp",
|
||||||
|
"array": "cpp",
|
||||||
|
"atomic": "cpp",
|
||||||
|
"bit": "cpp",
|
||||||
|
"*.tcc": "cpp",
|
||||||
|
"cctype": "cpp",
|
||||||
|
"chrono": "cpp",
|
||||||
|
"clocale": "cpp",
|
||||||
|
"cmath": "cpp",
|
||||||
|
"compare": "cpp",
|
||||||
|
"complex": "cpp",
|
||||||
|
"concepts": "cpp",
|
||||||
|
"condition_variable": "cpp",
|
||||||
|
"cstdarg": "cpp",
|
||||||
|
"cstddef": "cpp",
|
||||||
|
"cstdint": "cpp",
|
||||||
|
"cstdio": "cpp",
|
||||||
|
"cstdlib": "cpp",
|
||||||
|
"cstring": "cpp",
|
||||||
|
"ctime": "cpp",
|
||||||
|
"cwchar": "cpp",
|
||||||
|
"cwctype": "cpp",
|
||||||
|
"deque": "cpp",
|
||||||
|
"list": "cpp",
|
||||||
|
"map": "cpp",
|
||||||
|
"set": "cpp",
|
||||||
|
"string": "cpp",
|
||||||
|
"unordered_map": "cpp",
|
||||||
|
"unordered_set": "cpp",
|
||||||
|
"vector": "cpp",
|
||||||
|
"exception": "cpp",
|
||||||
|
"algorithm": "cpp",
|
||||||
|
"functional": "cpp",
|
||||||
|
"iterator": "cpp",
|
||||||
|
"memory": "cpp",
|
||||||
|
"memory_resource": "cpp",
|
||||||
|
"numeric": "cpp",
|
||||||
|
"random": "cpp",
|
||||||
|
"ratio": "cpp",
|
||||||
|
"string_view": "cpp",
|
||||||
|
"system_error": "cpp",
|
||||||
|
"tuple": "cpp",
|
||||||
|
"type_traits": "cpp",
|
||||||
|
"utility": "cpp",
|
||||||
|
"fstream": "cpp",
|
||||||
|
"initializer_list": "cpp",
|
||||||
|
"iomanip": "cpp",
|
||||||
|
"iosfwd": "cpp",
|
||||||
|
"istream": "cpp",
|
||||||
|
"limits": "cpp",
|
||||||
|
"mutex": "cpp",
|
||||||
|
"new": "cpp",
|
||||||
|
"numbers": "cpp",
|
||||||
|
"ostream": "cpp",
|
||||||
|
"semaphore": "cpp",
|
||||||
|
"sstream": "cpp",
|
||||||
|
"stdexcept": "cpp",
|
||||||
|
"stop_token": "cpp",
|
||||||
|
"streambuf": "cpp",
|
||||||
|
"thread": "cpp",
|
||||||
|
"cinttypes": "cpp",
|
||||||
|
"typeindex": "cpp",
|
||||||
|
"typeinfo": "cpp"
|
||||||
|
},
|
||||||
|
"debug.allowBreakpointsEverywhere": true
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"windows": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "Build IPA_projekt_2024",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "g++",
|
||||||
|
"args": [
|
||||||
|
"-g",
|
||||||
|
"-std=c++11",
|
||||||
|
"-fpic",
|
||||||
|
"-o",
|
||||||
|
"retinanetpost",
|
||||||
|
"-DDEBUG",
|
||||||
|
"retinanetpost_asm.o",
|
||||||
|
"retinanetpost.cpp",
|
||||||
|
"src/utils.cpp",
|
||||||
|
"src/prior_boxes.cpp",
|
||||||
|
"src/reader.cpp",
|
||||||
|
"-Iinclude/",
|
||||||
|
"`pkg-config", "--cflags", "opencv4`",
|
||||||
|
"`pkg-config", "--libs", "opencv4`",
|
||||||
|
"-ldl"
|
||||||
|
],
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [],
|
||||||
|
"dependsOn": [
|
||||||
|
"ASM part"
|
||||||
|
],
|
||||||
|
"isBackground": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "ASM part",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "gcc",
|
||||||
|
"args": [
|
||||||
|
"-masm=intel",
|
||||||
|
"-g",
|
||||||
|
"-c",
|
||||||
|
"retinanetpost_asm.s"
|
||||||
|
],
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [],
|
||||||
|
"dependsOn": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"isBackground": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Run",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "./retinanetpost",
|
||||||
|
"args": [
|
||||||
|
"input/input.jpg",
|
||||||
|
|
||||||
|
"input/input.txt"
|
||||||
|
],
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [],
|
||||||
|
"dependsOn": [
|
||||||
|
"Build IPA_projekt_2024"
|
||||||
|
],
|
||||||
|
"isBackground": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
# Makefile for IPA_projekt_2024
|
||||||
|
|
||||||
|
CXX = g++
|
||||||
|
CXXFLAGS = -g -std=c++11 -fpic `pkg-config --cflags opencv4`
|
||||||
|
LDFLAGS = -ldl
|
||||||
|
LIBS = `pkg-config --cflags --libs opencv4`
|
||||||
|
INCLUDES = -Iinclude/
|
||||||
|
|
||||||
|
SRCS = retinanetpost.cpp src/utils.cpp src/prior_boxes.cpp src/reader.cpp
|
||||||
|
ASMSRC = retinanetpost_asm.s
|
||||||
|
OBJS = $(SRCS:.cpp=.o) $(ASMSRC:.s=.o)
|
||||||
|
TARGET = retinanetpost
|
||||||
|
#DEBUG = -DDEBUG
|
||||||
|
|
||||||
|
.PHONY: all clean
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
$(TARGET): $(OBJS)
|
||||||
|
$(CXX) $(CXXFLAGS) $(DEBUG) -o $@ $^ $(LIBS) $(LDFLAGS)
|
||||||
|
|
||||||
|
%.o: %.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) $(DEBUG) $(INCLUDES) -c $< -o $@
|
||||||
|
|
||||||
|
%.o: %.s
|
||||||
|
gcc -masm=intel -g -c $< -o $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) $(OBJS) $(TARGET)
|
||||||
|
|
||||||
|
run: $(TARGET)
|
||||||
|
./$(TARGET) input/input.jpg input/input.txt
|
@ -0,0 +1,15 @@
|
|||||||
|
#Not used for project
|
||||||
|
|
||||||
|
[BITS 64]
|
||||||
|
|
||||||
|
global f1:function
|
||||||
|
|
||||||
|
|
||||||
|
section .data
|
||||||
|
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
|
f1:
|
||||||
|
mov rax, 0
|
||||||
|
ret
|
@ -0,0 +1,23 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
class PriorBox {
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<std::vector<int>> feature_maps;
|
||||||
|
std::vector<std::vector<float>> min_sizes;
|
||||||
|
std::vector<int> steps;
|
||||||
|
bool clip;
|
||||||
|
std::vector<int> image_size;
|
||||||
|
std::string name;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
PriorBox(std::vector<int> image_size = std::vector<int>(), std::string phase = "train");
|
||||||
|
std::vector<std::vector<float>> forward();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<std::vector<float>> decode(const std::vector<std::vector<float>>& loc, const std::vector<std::vector<float>>& priors, const std::vector<float>& variances);
|
@ -0,0 +1,12 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
vector<vector<float>> splitFloats(const vector<float>& floats, int index) ;
|
||||||
|
vector<float> readFloatsFromFile(const string& filename);
|
@ -0,0 +1,6 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
std::vector<std::vector<float>> nms(std::vector<std::vector<float>>& bboxes, float threshold);
|
After Width: | Height: | Size: 284 KiB |
File diff suppressed because one or more lines are too long
@ -0,0 +1,35 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <x86intrin.h>
|
||||||
|
|
||||||
|
|
||||||
|
class InstructionCounter
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
unsigned long long counter;
|
||||||
|
unsigned long long end_count;
|
||||||
|
unsigned long long total_count;
|
||||||
|
public:
|
||||||
|
|
||||||
|
void start()
|
||||||
|
{
|
||||||
|
counter= __rdtsc();
|
||||||
|
};
|
||||||
|
|
||||||
|
void end()
|
||||||
|
{
|
||||||
|
end_count = __rdtsc();
|
||||||
|
};
|
||||||
|
|
||||||
|
void print()
|
||||||
|
{
|
||||||
|
printf("%I64lld \n", getCyclesCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long long getCyclesCount()
|
||||||
|
{
|
||||||
|
end();
|
||||||
|
total_count = end_count - counter;
|
||||||
|
return total_count;
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,116 @@
|
|||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <dlfcn.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"
|
||||||
|
|
||||||
|
extern "C" { void f1(int a);}
|
||||||
|
|
||||||
|
|
||||||
|
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 the 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 = {640, 480};
|
||||||
|
std::vector<float> variances = {0.1f, 0.2f};
|
||||||
|
size_t total0_len = 12600*4;
|
||||||
|
size_t total1_len = 12600*2;
|
||||||
|
size_t num_anchors = total0_len / 4;
|
||||||
|
|
||||||
|
PriorBox priorBox(image_size, "projekt");
|
||||||
|
|
||||||
|
std::vector<std::vector<float>> priors = priorBox.forward();
|
||||||
|
|
||||||
|
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] > 0.999)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|
||||||
|
f1(10);
|
||||||
|
|
||||||
|
counter.print();
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
Scalar color(0, 255, 0); // Color of the rectangle (in BGR)
|
||||||
|
int thickness = 2; // Thickness of the rectangle border
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
.intel_syntax noprefix
|
||||||
|
|
||||||
|
.data
|
||||||
|
constants: .byte 50,50,50,50
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
.global f1
|
||||||
|
f1:
|
||||||
|
|
||||||
|
ret 0
|
||||||
|
|
||||||
|
|
@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* Prior boxes for RetinaNet
|
||||||
|
* Tomas Goldmann,2023
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
#include <map>
|
||||||
|
#include <algorithm>
|
||||||
|
#include "prior_boxes.hpp"
|
||||||
|
|
||||||
|
PriorBox::PriorBox(std::vector<int> image_size, std::string phase)
|
||||||
|
{
|
||||||
|
|
||||||
|
std::map<std::string, std::vector<std::vector<float>>> cfg;
|
||||||
|
this->min_sizes = {{16.0f, 32.0f}, {64.0f, 128.0f}, {256.0f, 512.0f}};
|
||||||
|
this->image_size = {image_size[1], image_size[0]};
|
||||||
|
this->steps = {8, 16, 32};
|
||||||
|
|
||||||
|
for (const float step : steps)
|
||||||
|
{
|
||||||
|
this->feature_maps.push_back({(int)std::ceil(image_size[0] / step), (int)std::ceil(image_size[1] / step)});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::vector<float>> PriorBox::forward()
|
||||||
|
{
|
||||||
|
|
||||||
|
std::vector<float> anchors;
|
||||||
|
for (size_t k = 0; k < this->feature_maps.size(); k++)
|
||||||
|
{
|
||||||
|
const auto &f = this->feature_maps[k];
|
||||||
|
const auto &min_sizes = this->min_sizes[k];
|
||||||
|
|
||||||
|
for (int i = 0; i < f[1]; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < f[0]; j++)
|
||||||
|
{
|
||||||
|
for (const auto &min_size : min_sizes)
|
||||||
|
{
|
||||||
|
float s_kx = min_size / this->image_size[1];
|
||||||
|
float s_ky = min_size / this->image_size[0];
|
||||||
|
std::vector<float> dense_cx = {static_cast<float>(j + 0.5) * this->steps[k] / this->image_size[1]};
|
||||||
|
std::vector<float> dense_cy = {static_cast<float>(i + 0.5) * this->steps[k] / this->image_size[0]};
|
||||||
|
|
||||||
|
for (const auto &cy : dense_cy)
|
||||||
|
{
|
||||||
|
for (const auto &cx : dense_cx)
|
||||||
|
{
|
||||||
|
|
||||||
|
anchors.push_back(cx);
|
||||||
|
anchors.push_back(cy);
|
||||||
|
anchors.push_back(s_kx);
|
||||||
|
anchors.push_back(s_ky);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::vector<float>> output;
|
||||||
|
|
||||||
|
size_t num_anchors = anchors.size() / 4;
|
||||||
|
for (size_t i = 0; i < num_anchors; i++)
|
||||||
|
{
|
||||||
|
for (size_t j = 0; j < 4; j++)
|
||||||
|
{
|
||||||
|
anchors[i * 4 + j] = std::min(std::max(anchors[i * 4 + j], 0.0f), 1.0f);
|
||||||
|
}
|
||||||
|
output.push_back({anchors[i * 4], anchors[i * 4 + 1], anchors[i * 4 + 2], anchors[i * 4 + 3]});
|
||||||
|
}
|
||||||
|
//std::cout << "len " << output.size() << std::endl;
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::vector<float>> decode(const std::vector<std::vector<float>> &loc, const std::vector<std::vector<float>> &priors, const std::vector<float> &variances)
|
||||||
|
{
|
||||||
|
std::vector<std::vector<float>> boxes;
|
||||||
|
for (size_t i = 0; i < loc.size(); i++)
|
||||||
|
{
|
||||||
|
const auto &prior = priors[i];
|
||||||
|
const auto &loc_pred = loc[i];
|
||||||
|
float prior_x = prior[0];
|
||||||
|
float prior_y = prior[1];
|
||||||
|
float prior_w = prior[2];
|
||||||
|
float prior_h = prior[3];
|
||||||
|
float var_x = variances[0];
|
||||||
|
float var_y = variances[1];
|
||||||
|
float var_w = variances[2];
|
||||||
|
float var_h = variances[3];
|
||||||
|
|
||||||
|
float decoded_x = prior_x + loc_pred[0] * var_x * prior_w;
|
||||||
|
float decoded_y = prior_y + loc_pred[1] * var_y * prior_h;
|
||||||
|
float decoded_w = prior_w * std::exp(loc_pred[2] * var_w);
|
||||||
|
float decoded_h = prior_h * std::exp(loc_pred[3] * var_h);
|
||||||
|
|
||||||
|
float decoded_xmin = decoded_x - decoded_w / 2;
|
||||||
|
float decoded_ymin = decoded_y - decoded_h / 2;
|
||||||
|
float decoded_xmax = decoded_x + decoded_w / 2;
|
||||||
|
float decoded_ymax = decoded_y + decoded_h / 2;
|
||||||
|
|
||||||
|
boxes.push_back({decoded_xmin, decoded_ymin, decoded_xmax, decoded_ymax});
|
||||||
|
}
|
||||||
|
|
||||||
|
return boxes;
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Function to read floats from txt
|
||||||
|
* Tomas Goldmann,2023
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "reader.hpp"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
vector<vector<float>> splitFloats(const vector<float>& floats, int index) {
|
||||||
|
|
||||||
|
vector<float> first_half;
|
||||||
|
vector<float> second_half;
|
||||||
|
|
||||||
|
// Ensure the original vector has enough elements for splitting
|
||||||
|
if (floats.size() < 6*12600) {
|
||||||
|
cerr << "Error: The input must containt 6*12600 floats" << endl;
|
||||||
|
return {first_half, second_half}; // Return empty vectors
|
||||||
|
}
|
||||||
|
|
||||||
|
// Split the original vector into two separate vectors
|
||||||
|
first_half.insert(first_half.end(), floats.begin(), floats.begin() + index);
|
||||||
|
second_half.insert(second_half.end(), floats.begin() + index, floats.end() );
|
||||||
|
|
||||||
|
// Return a vector containing the two split vectors
|
||||||
|
return {first_half, second_half};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
vector<float> readFloatsFromFile(const string& filename) {
|
||||||
|
vector<float> floats;
|
||||||
|
ifstream file(filename);
|
||||||
|
|
||||||
|
// Check if the file is opened successfully
|
||||||
|
if (!file.is_open()) {
|
||||||
|
cerr << "Error opening the file" << endl;
|
||||||
|
return floats; // Return an empty vector if the file cannot be opened
|
||||||
|
}
|
||||||
|
|
||||||
|
string line;
|
||||||
|
|
||||||
|
// Read each line from the file
|
||||||
|
while (getline(file, line)) {
|
||||||
|
// Create a string stream from the line
|
||||||
|
stringstream ss(line);
|
||||||
|
string token;
|
||||||
|
|
||||||
|
// Split the line by commas and read each float
|
||||||
|
while (getline(ss, token, ',')) {
|
||||||
|
// Convert the string to a float and store it in the vector
|
||||||
|
floats.push_back(stof(token));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the file
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
return floats;
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
#include "utils.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
bool CompareBBox(const std::vector<float> & a, const std::vector<float> & b)
|
||||||
|
{
|
||||||
|
return a[4] > b[4];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<std::vector<float>> nms(std::vector<std::vector<float>>& bboxes, float threshold)
|
||||||
|
{
|
||||||
|
std::vector<std::vector<float>> bboxes_nms;
|
||||||
|
std::sort(bboxes.begin(), bboxes.end(), CompareBBox);
|
||||||
|
|
||||||
|
int32_t select_idx = 0;
|
||||||
|
int32_t num_bbox = static_cast<int32_t>(bboxes.size());
|
||||||
|
std::vector<int32_t> mask_merged(num_bbox, 0);
|
||||||
|
bool all_merged = false;
|
||||||
|
|
||||||
|
while (!all_merged) {
|
||||||
|
while (select_idx < num_bbox && mask_merged[select_idx] == 1)
|
||||||
|
select_idx++;
|
||||||
|
if (select_idx == num_bbox) {
|
||||||
|
all_merged = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
bboxes_nms.push_back(bboxes[select_idx]);
|
||||||
|
mask_merged[select_idx] = 1;
|
||||||
|
|
||||||
|
std::vector<float> select_bbox = bboxes[select_idx];
|
||||||
|
float area1 = static_cast<float>((select_bbox[2] - select_bbox[0] + 1) * (select_bbox[3] - select_bbox[1] + 1));
|
||||||
|
float x1 = static_cast<float>(select_bbox[0]);
|
||||||
|
float y1 = static_cast<float>(select_bbox[1]);
|
||||||
|
float x2 = static_cast<float>(select_bbox[2]);
|
||||||
|
float y2 = static_cast<float>(select_bbox[3]);
|
||||||
|
|
||||||
|
select_idx++;
|
||||||
|
for (int32_t i = select_idx; i < num_bbox; i++) {
|
||||||
|
if (mask_merged[i] == 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
std::vector<float>& bbox_i = bboxes[i];
|
||||||
|
float x = std::max<float>(x1, static_cast<float>(bbox_i[0]));
|
||||||
|
float y = std::max<float>(y1, static_cast<float>(bbox_i[1]));
|
||||||
|
float w = std::min<float>(x2, static_cast<float>(bbox_i[2])) - x + 1;
|
||||||
|
float h = std::min<float>(y2, static_cast<float>(bbox_i[3])) - y + 1;
|
||||||
|
|
||||||
|
if (w <= 0 || h <= 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
float area2 = static_cast<float>((bbox_i[2] - bbox_i[0] + 1) * (bbox_i[3] - bbox_i[1] + 1));
|
||||||
|
float area_intersect = w * h;
|
||||||
|
|
||||||
|
|
||||||
|
if (static_cast<float>(area_intersect) / (area1 + area2 - area_intersect) > threshold) {
|
||||||
|
mask_merged[i] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bboxes_nms;
|
||||||
|
}
|
Loading…
Reference in new issue