Commit 2475c919 authored by liucong's avatar liucong
Browse files

重新Cpp代码格式化

parent 466992ff
This diff is collapsed.
......@@ -20,20 +20,20 @@ typedef struct _DBParameter
int LimitSideLen;
std::string ScoreMode;
}DBParameter;
} DBParameter;
class DB
{
public:
public:
DB();
~DB();
ErrorCode Initialize(InitializationParameterOfDB InitializationParameterOfDB);
ErrorCode Infer(const cv::Mat &img, std::vector<cv::Mat> &imgList);
ErrorCode Infer(const cv::Mat& img, std::vector<cv::Mat>& imgList);
private:
private:
cv::FileStorage configurationFile;
migraphx::program net;
......@@ -41,65 +41,69 @@ private:
std::string inputName;
migraphx::shape inputShape;
DBParameter dbParameter;
};
class DBPostProcessor {
public:
void GetContourArea(const std::vector<std::vector<float>> &box,
float unclip_ratio, float &distance);
class DBPostProcessor
{
public:
void
GetContourArea(const std::vector<std::vector<float>>& box, float unclip_ratio, float& distance);
cv::RotatedRect UnClip(std::vector<std::vector<float>> box,
const float &unclip_ratio);
cv::RotatedRect UnClip(std::vector<std::vector<float>> box, const float& unclip_ratio);
float **Mat2Vec(cv::Mat mat);
float** Mat2Vec(cv::Mat mat);
std::vector<std::vector<int>>
OrderPointsClockwise(std::vector<std::vector<int>> pts);
std::vector<std::vector<int>> OrderPointsClockwise(std::vector<std::vector<int>> pts);
std::vector<std::vector<float>> GetMiniBoxes(cv::RotatedRect box,
float &ssid);
std::vector<std::vector<float>> GetMiniBoxes(cv::RotatedRect box, float& ssid);
float BoxScoreFast(std::vector<std::vector<float>> box_array, cv::Mat pred);
float PolygonScoreAcc(std::vector<cv::Point> contour, cv::Mat pred);
float BoxScoreFast(std::vector<std::vector<float>> box_array, cv::Mat pred);
float PolygonScoreAcc(std::vector<cv::Point> contour, cv::Mat pred);
std::vector<std::vector<std::vector<int>>>
BoxesFromBitmap(const cv::Mat pred, const cv::Mat bitmap,
const float &box_thresh, const float &det_db_unclip_ratio,
const std::string &det_db_score_mode);
std::vector<std::vector<std::vector<int>>>
BoxesFromBitmap(const cv::Mat pred,
const cv::Mat bitmap,
const float& box_thresh,
const float& det_db_unclip_ratio,
const std::string& det_db_score_mode);
std::vector<std::vector<std::vector<int>>>
FilterTagDetRes(std::vector<std::vector<std::vector<int>>> boxes,
float ratio_h, float ratio_w, cv::Mat srcimg);
std::vector<std::vector<std::vector<int>>>
FilterTagDetRes(std::vector<std::vector<std::vector<int>>> boxes,
float ratio_h,
float ratio_w,
cv::Mat srcimg);
private:
static bool XsortInt(std::vector<int> a, std::vector<int> b);
private:
static bool XsortInt(std::vector<int> a, std::vector<int> b);
static bool XsortFp32(std::vector<float> a, std::vector<float> b);
static bool XsortFp32(std::vector<float> a, std::vector<float> b);
std::vector<std::vector<float>> Mat2Vector(cv::Mat mat);
std::vector<std::vector<float>> Mat2Vector(cv::Mat mat);
inline int _max(int a, int b) { return a >= b ? a : b; }
inline int _max(int a, int b) { return a >= b ? a : b; }
inline int _min(int a, int b) { return a >= b ? b : a; }
inline int _min(int a, int b) { return a >= b ? b : a; }
template <class T> inline T clamp(T x, T min, T max) {
if (x > max)
return max;
if (x < min)
return min;
return x;
}
template <class T>
inline T clamp(T x, T min, T max)
{
if(x > max)
return max;
if(x < min)
return min;
return x;
}
inline float clampf(float x, float min, float max) {
if (x > max)
return max;
if (x < min)
return min;
return x;
}
inline float clampf(float x, float min, float max)
{
if(x > max)
return max;
if(x < min)
return min;
return x;
}
};
}
} // namespace migraphxSamples
#endif
\ No newline at end of file
......@@ -6,20 +6,14 @@
namespace migraphxSamples
{
SVTR::SVTR()
{
}
SVTR::SVTR() {}
SVTR::~SVTR()
{
configurationFile.release();
}
SVTR::~SVTR() { configurationFile.release(); }
ErrorCode SVTR::Initialize(InitializationParameterOfSVTR InitializationParameterOfSVTR)
{
// 读取配置文件
std::string configFilePath=InitializationParameterOfSVTR.configFilePath;
std::string configFilePath = InitializationParameterOfSVTR.configFilePath;
if(!Exists(configFilePath))
{
LOG_ERROR(stdout, "no configuration file!\n");
......@@ -27,58 +21,58 @@ ErrorCode SVTR::Initialize(InitializationParameterOfSVTR InitializationParameter
}
if(!configurationFile.open(configFilePath, cv::FileStorage::READ))
{
LOG_ERROR(stdout, "fail to open configuration file\n");
return FAIL_TO_OPEN_CONFIG_FILE;
LOG_ERROR(stdout, "fail to open configuration file\n");
return FAIL_TO_OPEN_CONFIG_FILE;
}
LOG_INFO(stdout, "succeed to open configuration file\n");
// 获取配置文件参数
cv::FileNode netNode = configurationFile["OcrSVTR"];
cv::FileNode netNode = configurationFile["OcrSVTR"];
std::string modelPath = (std::string)netNode["ModelPath"];
std::string dictPath = (std::string)netNode["DictPath"];
std::string dictPath = (std::string)netNode["DictPath"];
// 加载模型
// 加载模型
if(!Exists(modelPath))
{
LOG_ERROR(stdout,"%s not exist!\n",modelPath.c_str());
LOG_ERROR(stdout, "%s not exist!\n", modelPath.c_str());
return MODEL_NOT_EXIST;
}
migraphx::onnx_options onnx_options;
onnx_options.map_input_dims["x"]={1,3,48,320}; // 设置最大shape
net = migraphx::parse_onnx(modelPath, onnx_options);
LOG_INFO(stdout,"succeed to load model: %s\n",GetFileName(modelPath).c_str());
onnx_options.map_input_dims["x"] = {1, 3, 48, 320}; // 设置最大shape
net = migraphx::parse_onnx(modelPath, onnx_options);
LOG_INFO(stdout, "succeed to load model: %s\n", GetFileName(modelPath).c_str());
// 获取模型输入/输出节点信息
std::unordered_map<std::string, migraphx::shape> inputs=net.get_inputs();
std::unordered_map<std::string, migraphx::shape> outputs=net.get_outputs();
inputName=inputs.begin()->first;
inputShape=inputs.begin()->second;
int N=inputShape.lens()[0];
int C=inputShape.lens()[1];
int H=inputShape.lens()[2];
int W=inputShape.lens()[3];
inputSize=cv::Size(W,H);
std::unordered_map<std::string, migraphx::shape> inputs = net.get_inputs();
std::unordered_map<std::string, migraphx::shape> outputs = net.get_outputs();
inputName = inputs.begin()->first;
inputShape = inputs.begin()->second;
int N = inputShape.lens()[0];
int C = inputShape.lens()[1];
int H = inputShape.lens()[2];
int W = inputShape.lens()[3];
inputSize = cv::Size(W, H);
// 设置模型为GPU模式
migraphx::target gpuTarget = migraphx::gpu::target{};
// 编译模型
migraphx::compile_options options;
options.device_id=0; // 设置GPU设备,默认为0号设备
options.offload_copy=true;
net.compile(gpuTarget,options);
LOG_INFO(stdout,"succeed to compile model: %s\n",GetFileName(modelPath).c_str());
options.device_id = 0; // 设置GPU设备,默认为0号设备
options.offload_copy = true;
net.compile(gpuTarget, options);
LOG_INFO(stdout, "succeed to compile model: %s\n", GetFileName(modelPath).c_str());
// warm up
std::unordered_map<std::string, migraphx::argument> inputData;
inputData[inputName]=migraphx::argument{inputShape};
inputData[inputName] = migraphx::argument{inputShape};
net.eval(inputData);
std::ifstream in(dictPath);
std::string line;
if (in)
if(in)
{
while (getline(in, line))
while(getline(in, line))
{
charactorDict.push_back(line);
}
......@@ -92,15 +86,16 @@ ErrorCode SVTR::Initialize(InitializationParameterOfSVTR InitializationParameter
}
// log
LOG_INFO(stdout,"InputMaxSize:%dx%d\n",inputSize.width,inputSize.height);
LOG_INFO(stdout,"InputName:%s\n",inputName.c_str());
LOG_INFO(stdout, "InputMaxSize:%dx%d\n", inputSize.width, inputSize.height);
LOG_INFO(stdout, "InputName:%s\n", inputName.c_str());
return SUCCESS;
}
ErrorCode SVTR::Infer(cv::Mat &img, std::string &resultsChar, float &resultsdScore, float &maxWHRatio)
ErrorCode
SVTR::Infer(cv::Mat& img, std::string& resultsChar, float& resultsdScore, float& maxWHRatio)
{
if(img.empty()||img.type()!=CV_8UC3)
if(img.empty() || img.type() != CV_8UC3)
{
LOG_ERROR(stdout, "image error!\n");
return IMAGE_ERROR;
......@@ -114,8 +109,8 @@ ErrorCode SVTR::Infer(cv::Mat &img, std::string &resultsChar, float &resultsdSco
int imgC = 3, imgH = 48;
int resizeW;
int imgW = int((48 * maxWHRatio));
ratio = float(srcImage.cols) / float(srcImage.rows);
if (ceil(imgH * ratio) > imgW)
ratio = float(srcImage.cols) / float(srcImage.rows);
if(ceil(imgH * ratio) > imgW)
{
resizeW = imgW;
}
......@@ -124,59 +119,64 @@ ErrorCode SVTR::Infer(cv::Mat &img, std::string &resultsChar, float &resultsdSco
resizeW = int(ceil(imgH * ratio));
}
cv::resize(srcImage, resizeImg, cv::Size(resizeW, imgH));
cv::copyMakeBorder(resizeImg, resizeImg, 0, 0, 0,
int(imgW - resizeImg.cols), cv::BORDER_CONSTANT,
{127, 127, 127});
resizeImg.convertTo(resizeImg, CV_32FC3, 1.0/255.0);
cv::copyMakeBorder(resizeImg,
resizeImg,
0,
0,
0,
int(imgW - resizeImg.cols),
cv::BORDER_CONSTANT,
{127, 127, 127});
resizeImg.convertTo(resizeImg, CV_32FC3, 1.0 / 255.0);
std::vector<cv::Mat> bgrChannels(3);
cv::split(resizeImg, bgrChannels);
std::vector<float> mean = {0.485f, 0.456f, 0.406f};
std::vector<float> mean = {0.485f, 0.456f, 0.406f};
std::vector<float> scale = {1 / 0.229f, 1 / 0.224f, 1 / 0.225f};
for (auto i = 0; i < bgrChannels.size(); i++)
for(auto i = 0; i < bgrChannels.size(); i++)
{
bgrChannels[i].convertTo(bgrChannels[i], CV_32FC1, 1.0 * scale[i],
(0.0 - mean[i]) * scale[i]);
bgrChannels[i].convertTo(
bgrChannels[i], CV_32FC1, 1.0 * scale[i], (0.0 - mean[i]) * scale[i]);
}
cv::merge(bgrChannels, resizeImg);
cv::Mat inputBlob = cv::dnn::blobFromImage(resizeImg);
std::vector<std::size_t> inputShapeOfInfer={1,3,48,resizeW};
cv::Mat inputBlob = cv::dnn::blobFromImage(resizeImg);
std::vector<std::size_t> inputShapeOfInfer = {1, 3, 48, resizeW};
// 创建输入数据
std::unordered_map<std::string, migraphx::argument> inputData;
inputData[inputName]= migraphx::argument{migraphx::shape(inputShape.type(),inputShapeOfInfer), (float*)inputBlob.data};
inputData[inputName] = migraphx::argument{migraphx::shape(inputShape.type(), inputShapeOfInfer),
(float*)inputBlob.data};
// 推理
std::vector<migraphx::argument> inferenceResults = net.eval(inputData);
// 获取推理结果
migraphx::argument result = inferenceResults[0];
migraphx::argument result = inferenceResults[0];
migraphx::shape outputShape = result.get_shape();
int n2 = outputShape.lens()[1];
int n3 = outputShape.lens()[2];
int n = n2 * n3;
int n2 = outputShape.lens()[1];
int n3 = outputShape.lens()[2];
int n = n2 * n3;
std::vector<float> out(n);
memcpy(out.data(),result.data(),sizeof(float)*outputShape.elements());
memcpy(out.data(), result.data(), sizeof(float) * outputShape.elements());
out.resize(n);
int argmaxIdx;
int lastIndex = 0;
float score = 0.f;
int count = 0;
int lastIndex = 0;
float score = 0.f;
int count = 0;
float maxValue = 0.0f;
for (int j = 0; j < n2; j++)
for(int j = 0; j < n2; j++)
{
argmaxIdx = int(std::distance(&out[(j) * n3],
std::max_element(&out[(j) * n3], &out[(j + 1) * n3])));
maxValue = float(*std::max_element(&out[(j) * n3],
&out[(j + 1) * n3]));
if (argmaxIdx > 0 && (!(n > 0 && argmaxIdx == lastIndex)))
{
score += maxValue;
count += 1;
resultsChar += charactorDict[argmaxIdx];
}
argmaxIdx =
int(std::distance(&out[(j)*n3], std::max_element(&out[(j)*n3], &out[(j + 1) * n3])));
maxValue = float(*std::max_element(&out[(j)*n3], &out[(j + 1) * n3]));
if(argmaxIdx > 0 && (!(n > 0 && argmaxIdx == lastIndex)))
{
score += maxValue;
count += 1;
resultsChar += charactorDict[argmaxIdx];
}
lastIndex = argmaxIdx;
}
resultsdScore = score / count;
......@@ -184,4 +184,4 @@ ErrorCode SVTR::Infer(cv::Mat &img, std::string &resultsChar, float &resultsdSco
return SUCCESS;
}
}
} // namespace migraphxSamples
......@@ -11,16 +11,17 @@ namespace migraphxSamples
class SVTR
{
public:
public:
SVTR();
~SVTR();
ErrorCode Initialize(InitializationParameterOfSVTR InitializationParameterOfSVTR);
ErrorCode Infer(cv::Mat &img, std::string &resultsChar, float &resultsdScore, float &maxWHRatio);
ErrorCode
Infer(cv::Mat& img, std::string& resultsChar, float& resultsdScore, float& maxWHRatio);
private:
private:
cv::FileStorage configurationFile;
migraphx::program net;
......@@ -29,8 +30,7 @@ private:
migraphx::shape inputShape;
std::string dictPath;
std::vector<std::string> charactorDict;
};
}
} // namespace migraphxSamples
#endif
\ No newline at end of file
......@@ -3,22 +3,17 @@
namespace migraphxSamples
{
VLPR::VLPR()
{
VLPR::VLPR() {}
}
VLPR::~VLPR() { configurationFile.release(); }
VLPR::~VLPR()
{
configurationFile.release();
}
ErrorCode VLPR::Initialize(InitializationParameterOfDB initParamOfDB, InitializationParameterOfSVTR initParamOfSVTR)
ErrorCode VLPR::Initialize(InitializationParameterOfDB initParamOfDB,
InitializationParameterOfSVTR initParamOfSVTR)
{
// 初始化DB
initParamOfDB.configFilePath = CONFIG_FILE;
ErrorCode errorCode=db.Initialize(initParamOfDB);
if(errorCode!=SUCCESS)
ErrorCode errorCode = db.Initialize(initParamOfDB);
if(errorCode != SUCCESS)
{
LOG_ERROR(stdout, "fail to initialize db!\n");
exit(-1);
......@@ -27,8 +22,8 @@ ErrorCode VLPR::Initialize(InitializationParameterOfDB initParamOfDB, Initializa
// 初始化SVTR
initParamOfSVTR.configFilePath = CONFIG_FILE;
errorCode=svtr.Initialize(initParamOfSVTR);
if(errorCode!=SUCCESS)
errorCode = svtr.Initialize(initParamOfSVTR);
if(errorCode != SUCCESS)
{
LOG_ERROR(stdout, "fail to initialize svtr!\n");
exit(-1);
......@@ -36,15 +31,16 @@ ErrorCode VLPR::Initialize(InitializationParameterOfDB initParamOfDB, Initializa
LOG_INFO(stdout, "succeed to initialize svtr\n");
}
ErrorCode VLPR::Infer(cv::Mat &img, std::vector<std::string> &recTexts, std::vector<float> &recTextScores)
ErrorCode
VLPR::Infer(cv::Mat& img, std::vector<std::string>& recTexts, std::vector<float>& recTextScores)
{
// DB推理
db.Infer(img,imgLists);
db.Infer(img, imgLists);
for (int i = 0; i < imgLists.size(); i++)
for(int i = 0; i < imgLists.size(); i++)
{
float maxWHRatio = float(imgLists[i].cols) / float(imgLists[i].rows);
// SVTR推理
svtr.Infer(imgLists[i], recText, recTextScore, maxWHRatio);
recTexts.push_back(recText);
......@@ -52,7 +48,6 @@ ErrorCode VLPR::Infer(cv::Mat &img, std::vector<std::string> &recTexts, std::vec
}
return SUCCESS;
}
}
\ No newline at end of file
} // namespace migraphxSamples
\ No newline at end of file
......@@ -12,24 +12,25 @@ namespace migraphxSamples
class VLPR
{
public:
public:
VLPR();
~VLPR();
ErrorCode Initialize(InitializationParameterOfDB initParamOfDB, InitializationParameterOfSVTR initParamOfSVTR);
ErrorCode Initialize(InitializationParameterOfDB initParamOfDB,
InitializationParameterOfSVTR initParamOfSVTR);
ErrorCode Infer(cv::Mat &img, std::vector<std::string> &recTexts, std::vector<float> &recTextScores);
ErrorCode
Infer(cv::Mat& img, std::vector<std::string>& recTexts, std::vector<float>& recTextScores);
private:
private:
DB db;
SVTR svtr;
cv::FileStorage configurationFile;
std::vector<cv::Mat> imgLists;
std::vector<cv::Mat> imgLists;
std::string recText;
float recTextScore;
};
}
} // namespace migraphxSamples
#endif
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -30,84 +30,91 @@
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
namespace migraphxSamples {
struct OCRPredictResult {
std::vector<std::vector<int>> box;
std::string text;
float score = -1.0;
float cls_score;
int cls_label = -1;
namespace migraphxSamples
{
struct OCRPredictResult
{
std::vector<std::vector<int>> box;
std::string text;
float score = -1.0;
float cls_score;
int cls_label = -1;
};
struct StructurePredictResult {
std::vector<float> box;
std::vector<std::vector<int>> cell_box;
std::string type;
std::vector<OCRPredictResult> text_res;
std::string html;
float html_score = -1;
float confidence;
struct StructurePredictResult
{
std::vector<float> box;
std::vector<std::vector<int>> cell_box;
std::string type;
std::vector<OCRPredictResult> text_res;
std::string html;
float html_score = -1;
float confidence;
};
class Utility {
public:
static std::vector<std::string> ReadDict(const std::string &path);
class Utility
{
public:
static std::vector<std::string> ReadDict(const std::string& path);
static void VisualizeBboxes(const cv::Mat &srcimg,
const std::vector<OCRPredictResult> &ocr_result,
const std::string &save_path);
static void VisualizeBboxes(const cv::Mat& srcimg,
const std::vector<OCRPredictResult>& ocr_result,
const std::string& save_path);
static void VisualizeBboxes(const cv::Mat &srcimg,
const StructurePredictResult &structure_result,
const std::string &save_path);
static void VisualizeBboxes(const cv::Mat& srcimg,
const StructurePredictResult& structure_result,
const std::string& save_path);
template <class ForwardIterator>
inline static size_t argmax(ForwardIterator first, ForwardIterator last) {
return std::distance(first, std::max_element(first, last));
}
template <class ForwardIterator>
inline static size_t argmax(ForwardIterator first, ForwardIterator last)
{
return std::distance(first, std::max_element(first, last));
}
static void GetAllFiles(const char *dir_name,
std::vector<std::string> &all_inputs);
static void GetAllFiles(const char* dir_name, std::vector<std::string>& all_inputs);
static cv::Mat GetRotateCropImage(const cv::Mat &srcimage,
std::vector<std::vector<int>> box);
static cv::Mat GetRotateCropImage(const cv::Mat& srcimage, std::vector<std::vector<int>> box);
static std::vector<int> argsort(const std::vector<float> &array);
static std::vector<int> argsort(const std::vector<float>& array);
static std::string basename(const std::string &filename);
static std::string basename(const std::string& filename);
static bool PathExists(const std::string &path);
static bool PathExists(const std::string& path);
static void CreateDir(const std::string &path);
static void CreateDir(const std::string& path);
static void print_result(const std::vector<OCRPredictResult> &ocr_result);
static void print_result(const std::vector<OCRPredictResult>& ocr_result);
static cv::Mat crop_image(cv::Mat &img, const std::vector<int> &area);
static cv::Mat crop_image(cv::Mat &img, const std::vector<float> &area);
static cv::Mat crop_image(cv::Mat& img, const std::vector<int>& area);
static cv::Mat crop_image(cv::Mat& img, const std::vector<float>& area);
static void sorted_boxes(std::vector<OCRPredictResult> &ocr_result);
static void sorted_boxes(std::vector<OCRPredictResult>& ocr_result);
static std::vector<int> xyxyxyxy2xyxy(std::vector<std::vector<int>> &box);
static std::vector<int> xyxyxyxy2xyxy(std::vector<int> &box);
static std::vector<int> xyxyxyxy2xyxy(std::vector<std::vector<int>>& box);
static std::vector<int> xyxyxyxy2xyxy(std::vector<int>& box);
static float fast_exp(float x);
static std::vector<float>
activation_function_softmax(std::vector<float> &src);
static float iou(std::vector<int> &box1, std::vector<int> &box2);
static float iou(std::vector<float> &box1, std::vector<float> &box2);
static float fast_exp(float x);
static std::vector<float> activation_function_softmax(std::vector<float>& src);
static float iou(std::vector<int>& box1, std::vector<int>& box2);
static float iou(std::vector<float>& box1, std::vector<float>& box2);
private:
static bool comparison_box(const OCRPredictResult &result1,
const OCRPredictResult &result2) {
if (result1.box[0][1] < result2.box[0][1]) {
return true;
} else if (result1.box[0][1] == result2.box[0][1]) {
return result1.box[0][0] < result2.box[0][0];
} else {
return false;
private:
static bool comparison_box(const OCRPredictResult& result1, const OCRPredictResult& result2)
{
if(result1.box[0][1] < result2.box[0][1])
{
return true;
}
else if(result1.box[0][1] == result2.box[0][1])
{
return result1.box[0][0] < result2.box[0][0];
}
else
{
return false;
}
}
}
};
} // namespace migraphxSamples
\ No newline at end of file
......@@ -7,33 +7,33 @@
namespace migraphxSamples
{
// 路径分隔符(Linux:‘/’,Windows:’\\’)
#ifdef _WIN32
#define PATH_SEPARATOR '\\'
#define PATH_SEPARATOR '\\'
#else
#define PATH_SEPARATOR '/'
#define PATH_SEPARATOR '/'
#endif
#define CONFIG_FILE "../Resource/Configuration.xml"
#define CONFIG_FILE "../Resource/Configuration.xml"
typedef enum _ErrorCode
{
SUCCESS=0, // 0
MODEL_NOT_EXIST, // 模型不存在
CONFIG_FILE_NOT_EXIST, // 配置文件不存在
FAIL_TO_LOAD_MODEL, // 加载模型失败
SUCCESS = 0, // 0
MODEL_NOT_EXIST, // 模型不存在
CONFIG_FILE_NOT_EXIST, // 配置文件不存在
FAIL_TO_LOAD_MODEL, // 加载模型失败
FAIL_TO_OPEN_CONFIG_FILE, // 加载配置文件失败
IMAGE_ERROR, // 图像错误
}ErrorCode;
IMAGE_ERROR, // 图像错误
} ErrorCode;
typedef struct _ResultOfPrediction
{
float confidence;
int label;
_ResultOfPrediction():confidence(0.0f),label(0){}
_ResultOfPrediction() : confidence(0.0f), label(0) {}
}ResultOfPrediction;
} ResultOfPrediction;
typedef struct _ResultOfDetection
{
......@@ -43,15 +43,15 @@ typedef struct _ResultOfDetection
std::string className;
bool exist;
_ResultOfDetection():confidence(0.0f),classID(0),exist(true){}
_ResultOfDetection() : confidence(0.0f), classID(0), exist(true) {}
}ResultOfDetection;
} ResultOfDetection;
typedef struct _InitializationParameterOfDetector
{
std::string parentPath;
std::string configFilePath;
}InitializationParameterOfDetector;
} InitializationParameterOfDetector;
typedef struct _InitializationParameterOfDetector InitializationParameterOfClassifier;
typedef struct _InitializationParameterOfDetector InitializationParameterOfSuperresolution;
......@@ -61,7 +61,6 @@ typedef struct _InitializationParameterOfDetector InitializationParameterOfOcr;
typedef struct _InitializationParameterOfDetector InitializationParameterOfDB;
typedef struct _InitializationParameterOfDetector InitializationParameterOfSVTR;
}
} // namespace migraphxSamples
#endif
......@@ -3,34 +3,37 @@
namespace migraphxSamples
{
bool CompareConfidence(const ResultOfDetection &L,const ResultOfDetection &R)
bool CompareConfidence(const ResultOfDetection& L, const ResultOfDetection& R)
{
return L.confidence > R.confidence;
}
bool CompareArea(const ResultOfDetection &L,const ResultOfDetection &R)
bool CompareArea(const ResultOfDetection& L, const ResultOfDetection& R)
{
return L.boundingBox.area() > R.boundingBox.area();
}
void NMS(std::vector<ResultOfDetection> &detections, float IOUThreshold)
void NMS(std::vector<ResultOfDetection>& detections, float IOUThreshold)
{
// sort
std::sort(detections.begin(), detections.end(), CompareConfidence);
for (int i = 0; i<detections.size(); ++i)
for(int i = 0; i < detections.size(); ++i)
{
if (detections[i].exist)
if(detections[i].exist)
{
for (int j = i + 1; j<detections.size(); ++j)
for(int j = i + 1; j < detections.size(); ++j)
{
if (detections[j].exist)
if(detections[j].exist)
{
// compute IOU
float intersectionArea = (detections[i].boundingBox & detections[j].boundingBox).area();
float intersectionRate = intersectionArea / (detections[i].boundingBox.area() + detections[j].boundingBox.area() - intersectionArea);
float intersectionArea =
(detections[i].boundingBox & detections[j].boundingBox).area();
float intersectionRate =
intersectionArea / (detections[i].boundingBox.area() +
detections[j].boundingBox.area() - intersectionArea);
if (intersectionRate>IOUThreshold)
if(intersectionRate > IOUThreshold)
{
detections[j].exist = false;
}
......@@ -38,7 +41,6 @@ void NMS(std::vector<ResultOfDetection> &detections, float IOUThreshold)
}
}
}
}
}
} // namespace migraphxSamples
......@@ -9,12 +9,12 @@ namespace migraphxSamples
{
// 排序规则: 按照置信度或者按照面积排序
bool CompareConfidence(const ResultOfDetection &L,const ResultOfDetection &R);
bool CompareArea(const ResultOfDetection &L,const ResultOfDetection &R);
bool CompareConfidence(const ResultOfDetection& L, const ResultOfDetection& R);
bool CompareArea(const ResultOfDetection& L, const ResultOfDetection& R);
// 非极大抑制
void NMS(std::vector<ResultOfDetection> &detections, float IOUThreshold);
void NMS(std::vector<ResultOfDetection>& detections, float IOUThreshold);
}
} // namespace migraphxSamples
#endif
This diff is collapsed.
......@@ -5,27 +5,27 @@
#include <string>
#include <vector>
namespace migraphxSamples
{
// 路径是否存在
bool Exists(const std::string &path);
bool Exists(const std::string& path);
// 路径是否为目录
bool IsDirectory(const std::string &path);
bool IsDirectory(const std::string& path);
// 是否是路径分隔符(Linux:‘/’,Windows:’\\’)
bool IsPathSeparator(char c);
// 路径拼接
std::string JoinPath(const std::string &base, const std::string &path);
std::string JoinPath(const std::string& base, const std::string& path);
// 创建多级目录,注意:创建多级目录的时候,目标目录是不能有文件存在的
bool CreateDirectories(const std::string &directoryPath);
bool CreateDirectories(const std::string& directoryPath);
/** 生成符合指定模式的文件名列表(支持递归遍历)
*
*
* pattern: 模式,比如"*.jpg","*.png","*.jpg,*.png"
* addPath:是否包含父路径
* 注意:
......@@ -36,35 +36,43 @@ bool CreateDirectories(const std::string &directoryPath);
5. 不能返回子目录名
*
*/
void GetFileNameList(const std::string &directory, const std::string &pattern, std::vector<std::string> &result, bool recursive, bool addPath);
void GetFileNameList(const std::string& directory,
const std::string& pattern,
std::vector<std::string>& result,
bool recursive,
bool addPath);
// 与GetFileNameList的区别在于如果有子目录,在addPath为true的时候会返回子目录路径(目录名最后有"/")
void GetFileNameList2(const std::string &directory, const std::string &pattern, std::vector<std::string> &result, bool recursive, bool addPath);
void GetFileNameList2(const std::string& directory,
const std::string& pattern,
std::vector<std::string>& result,
bool recursive,
bool addPath);
// 删除文件或者目录,支持递归删除
void Remove(const std::string &directory, const std::string &extension="");
void Remove(const std::string& directory, const std::string& extension = "");
/** 获取路径的文件名和扩展名
*
*
* 示例:path为D:/1/1.txt,则GetFileName()为1.txt,GetFileName_NoExtension()为1,GetExtension()为.txt,GetParentPath()为D:/1/
*/
std::string GetFileName(const std::string &path);
std::string GetFileName_NoExtension(const std::string &path);
std::string GetExtension(const std::string &path);
std::string GetParentPath(const std::string &path);
*/
std::string GetFileName(const std::string& path);
std::string GetFileName_NoExtension(const std::string& path);
std::string GetExtension(const std::string& path);
std::string GetParentPath(const std::string& path);
// 拷贝文件
bool CopyFile(const std::string srcPath,const std::string dstPath);
bool CopyFile(const std::string srcPath, const std::string dstPath);
/** 拷贝目录
*
*
* 示例:CopyDirectories("D:/0/1/2/","E:/3/");实现把D:/0/1/2/目录拷贝到E:/3/目录中(即拷贝完成后的目录结构为E:/3/2/)
* 注意:
1.第一个参数的最后不能加”/”
2.不能拷贝隐藏文件
*/
bool CopyDirectories(std::string srcPath,const std::string dstPath);
bool CopyDirectories(std::string srcPath, const std::string dstPath);
}
} // namespace migraphxSamples
#endif
......@@ -8,7 +8,7 @@
#include <map>
#include <thread>
#include <mutex>
#if (defined WIN32 || defined _WIN32)
#if(defined WIN32 || defined _WIN32)
#include <Windows.h>
#else
#include <sys/time.h>
......@@ -16,13 +16,13 @@
using namespace std;
/** 简易日志
*
*
* 不依赖于其他第三方库,只需要包含一个头文件就可以使用。提供了4种日志级别,包括INFO,DEBUG,WARN和ERROR。
*
*
* 示例1:
// 初始化日志,在./Log/目录下创建两个日志文件log1.log和log2.log(注意:目录./Log/需要存在,否则日志创建失败)
//
初始化日志,在./Log/目录下创建两个日志文件log1.log和log2.log(注意:目录./Log/需要存在,否则日志创建失败)
LogManager::GetInstance()->Initialize("./Log/","log1");
LogManager::GetInstance()->Initialize("./Log/","log2");
......@@ -34,11 +34,11 @@ using namespace std;
// 关闭日志
LogManager::GetInstance()->Close("log1");
LogManager::GetInstance()->Close("log2");
* 示例2:
// 将日志输出到控制台
string log = "Hello World";
LOG_INFO(stdout, "%s\n", log.c_str());
LOG_INFO(stdout, "%s\n", log.c_str());
* 注意:
1. 需要C++11
......@@ -50,44 +50,43 @@ using namespace std;
class LogManager
{
private:
LogManager(){}
private:
LogManager() {}
public:
~LogManager(){}
inline void Initialize(const string &parentPath,const string &logName)
public:
~LogManager() {}
inline void Initialize(const string& parentPath, const string& logName)
{
// 日志名为空表示输出到控制台
if(logName.size()==0)
if(logName.size() == 0)
return;
// 查找该日志文件,如果没有则创建
std::map<string, FILE*>::const_iterator iter = logMap.find(logName);
if (iter == logMap.end())
if(iter == logMap.end())
{
string pathOfLog = parentPath+ logName + ".log";
FILE *logFile = fopen(pathOfLog.c_str(), "a"); // w:覆盖原有文件,a:追加
if(logFile!=NULL)
string pathOfLog = parentPath + logName + ".log";
FILE* logFile = fopen(pathOfLog.c_str(), "a"); // w:覆盖原有文件,a:追加
if(logFile != NULL)
{
logMap.insert(std::make_pair(logName, logFile));
}
}
}
inline FILE* GetLogFile(const string &logName)
inline FILE* GetLogFile(const string& logName)
{
std::map<string, FILE*>::const_iterator iter=logMap.find(logName);
if(iter==logMap.end())
std::map<string, FILE*>::const_iterator iter = logMap.find(logName);
if(iter == logMap.end())
{
return NULL;
}
return (*iter).second;
}
inline void Close(const string &logName)
inline void Close(const string& logName)
{
std::map<string, FILE*>::const_iterator iter=logMap.find(logName);
if(iter==logMap.end())
std::map<string, FILE*>::const_iterator iter = logMap.find(logName);
if(iter == logMap.end())
{
return;
}
......@@ -95,10 +94,7 @@ public:
fclose((*iter).second);
logMap.erase(iter);
}
inline std::mutex &GetLogMutex()
{
return logMutex;
}
inline std::mutex& GetLogMutex() { return logMutex; }
// Singleton
static LogManager* GetInstance()
......@@ -106,21 +102,22 @@ public:
static LogManager logManager;
return &logManager;
}
private:
private:
std::map<string, FILE*> logMap;
std::mutex logMutex;
};
#ifdef LOG_MUTEX
#define LOCK LogManager::GetInstance()->GetLogMutex().lock()
#define UNLOCK LogManager::GetInstance()->GetLogMutex().unlock()
#define LOCK LogManager::GetInstance()->GetLogMutex().lock()
#define UNLOCK LogManager::GetInstance()->GetLogMutex().unlock()
#else
#define LOCK
#define UNLOCK
#define LOCK
#define UNLOCK
#endif
// log time
typedef struct _LogTime
typedef struct _LogTime
{
string year;
string month;
......@@ -131,53 +128,53 @@ typedef struct _LogTime
string millisecond; // ms
string microsecond; // us
string weekDay;
}LogTime;
} LogTime;
inline LogTime GetTime()
{
LogTime currentTime;
#if (defined WIN32 || defined _WIN32)
#if(defined WIN32 || defined _WIN32)
SYSTEMTIME systemTime;
GetLocalTime(&systemTime);
char temp[8] = { 0 };
char temp[8] = {0};
sprintf(temp, "%04d", systemTime.wYear);
currentTime.year=string(temp);
currentTime.year = string(temp);
sprintf(temp, "%02d", systemTime.wMonth);
currentTime.month=string(temp);
currentTime.month = string(temp);
sprintf(temp, "%02d", systemTime.wDay);
currentTime.day=string(temp);
currentTime.day = string(temp);
sprintf(temp, "%02d", systemTime.wHour);
currentTime.hour=string(temp);
currentTime.hour = string(temp);
sprintf(temp, "%02d", systemTime.wMinute);
currentTime.minute=string(temp);
currentTime.minute = string(temp);
sprintf(temp, "%02d", systemTime.wSecond);
currentTime.second=string(temp);
currentTime.second = string(temp);
sprintf(temp, "%03d", systemTime.wMilliseconds);
currentTime.millisecond=string(temp);
currentTime.millisecond = string(temp);
sprintf(temp, "%d", systemTime.wDayOfWeek);
currentTime.weekDay=string(temp);
currentTime.weekDay = string(temp);
#else
struct timeval tv;
struct tm *p;
struct timeval tv;
struct tm* p;
gettimeofday(&tv, NULL);
p = localtime(&tv.tv_sec);
char temp[8]={0};
sprintf(temp,"%04d",1900+p->tm_year);
currentTime.year=string(temp);
sprintf(temp,"%02d",1+p->tm_mon);
currentTime.month=string(temp);
sprintf(temp,"%02d",p->tm_mday);
currentTime.day=string(temp);
sprintf(temp,"%02d",p->tm_hour);
currentTime.hour=string(temp);
sprintf(temp,"%02d",p->tm_min);
currentTime.minute=string(temp);
sprintf(temp,"%02d",p->tm_sec);
currentTime.second=string(temp);
sprintf(temp,"%03d",(int)(tv.tv_usec/1000));
char temp[8] = {0};
sprintf(temp, "%04d", 1900 + p->tm_year);
currentTime.year = string(temp);
sprintf(temp, "%02d", 1 + p->tm_mon);
currentTime.month = string(temp);
sprintf(temp, "%02d", p->tm_mday);
currentTime.day = string(temp);
sprintf(temp, "%02d", p->tm_hour);
currentTime.hour = string(temp);
sprintf(temp, "%02d", p->tm_min);
currentTime.minute = string(temp);
sprintf(temp, "%02d", p->tm_sec);
currentTime.second = string(temp);
sprintf(temp, "%03d", (int)(tv.tv_usec / 1000));
currentTime.millisecond = string(temp);
sprintf(temp, "%03d", (int)(tv.tv_usec % 1000));
currentTime.microsecond = string(temp);
......@@ -187,61 +184,83 @@ inline LogTime GetTime()
return currentTime;
}
#define LOG_TIME(logFile) \
do\
{\
LogTime currentTime=GetTime(); \
fprintf(((logFile == NULL) ? stdout : logFile), "%s-%s-%s %s:%s:%s.%s\t",currentTime.year.c_str(),currentTime.month.c_str(),currentTime.day.c_str(),currentTime.hour.c_str(),currentTime.minute.c_str(),currentTime.second.c_str(),currentTime.millisecond.c_str()); \
}while (0)
#define LOG_INFO(logFile,logInfo, ...) \
do\
{\
LOCK; \
LOG_TIME(logFile); \
fprintf(((logFile == NULL) ? stdout : logFile), "INFO\t"); \
fprintf(((logFile == NULL) ? stdout : logFile), "[%s:%d (%s) ]: ", __FILE__, __LINE__, __FUNCTION__); \
fprintf(((logFile == NULL) ? stdout : logFile), logInfo, ## __VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while (0)
#define LOG_DEBUG(logFile,logInfo, ...) \
do\
{\
LOCK; \
LOG_TIME(logFile);\
fprintf(((logFile==NULL)?stdout:logFile), "DEBUG\t"); \
fprintf(((logFile==NULL)?stdout:logFile), "[%s:%d (%s) ]: ", __FILE__, __LINE__, __FUNCTION__); \
fprintf(((logFile==NULL)?stdout:logFile),logInfo, ## __VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while (0)
#define LOG_ERROR(logFile,logInfo, ...) \
do\
{\
LOCK; \
LOG_TIME(logFile);\
fprintf(((logFile==NULL)?stdout:logFile), "ERROR\t"); \
fprintf(((logFile==NULL)?stdout:logFile), "[%s:%d (%s) ]: ", __FILE__, __LINE__, __FUNCTION__); \
fprintf(((logFile==NULL)?stdout:logFile),logInfo, ## __VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while (0)
#define LOG_WARN(logFile,logInfo, ...) \
do\
{\
LOCK; \
LOG_TIME(logFile);\
fprintf(((logFile==NULL)?stdout:logFile), "WARN\t"); \
fprintf(((logFile==NULL)?stdout:logFile), "[%s:%d (%s) ]: ", __FILE__, __LINE__, __FUNCTION__); \
fprintf(((logFile==NULL)?stdout:logFile),logInfo, ## __VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while (0)
#define LOG_TIME(logFile) \
do \
{ \
LogTime currentTime = GetTime(); \
fprintf(((logFile == NULL) ? stdout : logFile), \
"%s-%s-%s %s:%s:%s.%s\t", \
currentTime.year.c_str(), \
currentTime.month.c_str(), \
currentTime.day.c_str(), \
currentTime.hour.c_str(), \
currentTime.minute.c_str(), \
currentTime.second.c_str(), \
currentTime.millisecond.c_str()); \
} while(0)
#endif // __SIMPLE_LOG_H__
#define LOG_INFO(logFile, logInfo, ...) \
do \
{ \
LOCK; \
LOG_TIME(logFile); \
fprintf(((logFile == NULL) ? stdout : logFile), "INFO\t"); \
fprintf(((logFile == NULL) ? stdout : logFile), \
"[%s:%d (%s) ]: ", \
__FILE__, \
__LINE__, \
__FUNCTION__); \
fprintf(((logFile == NULL) ? stdout : logFile), logInfo, ##__VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while(0)
#define LOG_DEBUG(logFile, logInfo, ...) \
do \
{ \
LOCK; \
LOG_TIME(logFile); \
fprintf(((logFile == NULL) ? stdout : logFile), "DEBUG\t"); \
fprintf(((logFile == NULL) ? stdout : logFile), \
"[%s:%d (%s) ]: ", \
__FILE__, \
__LINE__, \
__FUNCTION__); \
fprintf(((logFile == NULL) ? stdout : logFile), logInfo, ##__VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while(0)
#define LOG_ERROR(logFile, logInfo, ...) \
do \
{ \
LOCK; \
LOG_TIME(logFile); \
fprintf(((logFile == NULL) ? stdout : logFile), "ERROR\t"); \
fprintf(((logFile == NULL) ? stdout : logFile), \
"[%s:%d (%s) ]: ", \
__FILE__, \
__LINE__, \
__FUNCTION__); \
fprintf(((logFile == NULL) ? stdout : logFile), logInfo, ##__VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while(0)
#define LOG_WARN(logFile, logInfo, ...) \
do \
{ \
LOCK; \
LOG_TIME(logFile); \
fprintf(((logFile == NULL) ? stdout : logFile), "WARN\t"); \
fprintf(((logFile == NULL) ? stdout : logFile), \
"[%s:%d (%s) ]: ", \
__FILE__, \
__LINE__, \
__FUNCTION__); \
fprintf(((logFile == NULL) ? stdout : logFile), logInfo, ##__VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while(0)
#endif // __SIMPLE_LOG_H__
......@@ -10,20 +10,20 @@ int main()
{
// 创建PaddleOCR车牌识别
migraphxSamples::VLPR vlpr;
migraphxSamples::InitializationParameterOfDB initParamOfDB;
migraphxSamples::InitializationParameterOfDB initParamOfDB;
migraphxSamples::InitializationParameterOfSVTR initParamOfSVTR;
vlpr.Initialize(initParamOfDB, initParamOfSVTR);
// 读取测试图片
cv:: Mat Image=cv::imread("../Resource/Images/vlpr.jpg", 1);
cv::Mat Image = cv::imread("../Resource/Images/vlpr.jpg", 1);
// 推理
std::vector<std::string> recTexts;
std::vector<float> recTextScores;
vlpr.Infer(Image, recTexts, recTextScores);
vlpr.Infer(Image, recTexts, recTextScores);
// 打印结果
for (int i = 0; i < recTexts.size(); i++)
for(int i = 0; i < recTexts.size(); i++)
{
printf("VLPR Result:%s\n", recTexts[i].c_str());
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment