|
@@ -1,30 +1,29 @@
|
|
|
|
|
+#include <gflags/gflags.h>
|
|
|
#include <string>
|
|
#include <string>
|
|
|
#include <vector>
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include "model_deploy/common/include/paddle_deploy.h"
|
|
#include "model_deploy/common/include/paddle_deploy.h"
|
|
|
|
|
|
|
|
-// Global model pointer
|
|
|
|
|
PaddleDeploy::Model* model;
|
|
PaddleDeploy::Model* model;
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
-* Model initialization / registration API
|
|
|
|
|
-*
|
|
|
|
|
-* model_type: det,seg,clas,paddlex
|
|
|
|
|
-*
|
|
|
|
|
-* model_filename: Model file path
|
|
|
|
|
-*
|
|
|
|
|
-* params_filename: Parameter file path
|
|
|
|
|
-*
|
|
|
|
|
-* cfg_file: Configuration file path
|
|
|
|
|
-*
|
|
|
|
|
-* use_gpu: Whether to use GPU
|
|
|
|
|
-*
|
|
|
|
|
-* gpu_id: Specify GPU x
|
|
|
|
|
-*
|
|
|
|
|
-* paddlex_model_type: When Model_Type is paddlx, the type of actual Paddlex model returned - det, seg, clas
|
|
|
|
|
-*
|
|
|
|
|
|
|
+* 模型初始化/注册接口
|
|
|
|
|
+*
|
|
|
|
|
+* model_type: 初始化模型类型: det,seg,clas,paddlex
|
|
|
|
|
+*
|
|
|
|
|
+* model_filename: 模型文件路径
|
|
|
|
|
+*
|
|
|
|
|
+* params_filename: 参数文件路径
|
|
|
|
|
+*
|
|
|
|
|
+* cfg_file: 配置文件路径
|
|
|
|
|
+*
|
|
|
|
|
+* use_gpu: 是否使用GPU
|
|
|
|
|
+*
|
|
|
|
|
+* gpu_id: 指定第x号GPU
|
|
|
|
|
+*
|
|
|
|
|
+* paddlex_model_type: model_type为paddlx时,返回的实际paddlex模型的类型: det, seg, clas
|
|
|
*/
|
|
*/
|
|
|
-extern "C" void InitModel(const char* model_type, const char* model_filename, const char* params_filename, const char* cfg_file, bool use_gpu, int gpu_id, char* paddlex_model_type)
|
|
|
|
|
|
|
+extern "C" __declspec(dllexport) void InitModel(const char* model_type, const char* model_filename, const char* params_filename, const char* cfg_file, bool use_gpu, int gpu_id, char* paddlex_model_type)
|
|
|
{
|
|
{
|
|
|
// create model
|
|
// create model
|
|
|
model = PaddleDeploy::CreateModel(model_type); //FLAGS_model_type
|
|
model = PaddleDeploy::CreateModel(model_type); //FLAGS_model_type
|
|
@@ -45,7 +44,7 @@ extern "C" void InitModel(const char* model_type, const char* model_filename, co
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// det, seg, clas, paddlex
|
|
// det, seg, clas, paddlex
|
|
|
- if (strcmp(model_type, "paddlex") == 0) // If it is a PADDLEX model, return the specifically supported model type: det, seg, clas
|
|
|
|
|
|
|
+ if (strcmp(model_type, "paddlex") == 0) // 是paddlex模型,则返回具体支持的模型类型: det, seg, clas
|
|
|
{
|
|
{
|
|
|
// detector
|
|
// detector
|
|
|
if (model->yaml_config_["model_type"].as<std::string>() == std::string("detector"))
|
|
if (model->yaml_config_["model_type"].as<std::string>() == std::string("detector"))
|
|
@@ -61,12 +60,12 @@ extern "C" void InitModel(const char* model_type, const char* model_filename, co
|
|
|
strcpy(paddlex_model_type, "clas");
|
|
strcpy(paddlex_model_type, "clas");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
-* Detection inference API
|
|
|
|
|
-*
|
|
|
|
|
|
|
+* 检测推理接口
|
|
|
|
|
+*
|
|
|
* img: input for predicting.
|
|
* img: input for predicting.
|
|
|
*
|
|
*
|
|
|
* nWidth: width of img.
|
|
* nWidth: width of img.
|
|
@@ -80,10 +79,8 @@ extern "C" void InitModel(const char* model_type, const char* model_filename, co
|
|
|
* nBoxesNum£º number of box
|
|
* nBoxesNum£º number of box
|
|
|
*
|
|
*
|
|
|
* LabelList: label list of result
|
|
* LabelList: label list of result
|
|
|
-*
|
|
|
|
|
-* extern "C"
|
|
|
|
|
*/
|
|
*/
|
|
|
-extern "C" void Det_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* output, int* nBoxesNum, char* LabelList)
|
|
|
|
|
|
|
+extern "C" __declspec(dllexport) void Det_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* output, int* nBoxesNum, char* LabelList)
|
|
|
{
|
|
{
|
|
|
// prepare data
|
|
// prepare data
|
|
|
std::vector<cv::Mat> imgs;
|
|
std::vector<cv::Mat> imgs;
|
|
@@ -101,26 +98,28 @@ extern "C" void Det_ModelPredict(const unsigned char* img, int nWidth, int nHeig
|
|
|
|
|
|
|
|
cv::Mat input = cv::Mat::zeros(cv::Size(nWidth, nHeight), nType);
|
|
cv::Mat input = cv::Mat::zeros(cv::Size(nWidth, nHeight), nType);
|
|
|
memcpy(input.data, img, nHeight * nWidth * nChannel * sizeof(uchar));
|
|
memcpy(input.data, img, nHeight * nWidth * nChannel * sizeof(uchar));
|
|
|
|
|
+ //cv::imwrite("./1.png", input);
|
|
|
imgs.push_back(std::move(input));
|
|
imgs.push_back(std::move(input));
|
|
|
|
|
|
|
|
// predict
|
|
// predict
|
|
|
std::vector<PaddleDeploy::Result> results;
|
|
std::vector<PaddleDeploy::Result> results;
|
|
|
model->Predict(imgs, &results, 1);
|
|
model->Predict(imgs, &results, 1);
|
|
|
|
|
|
|
|
- // nBoxesNum[0] = results.size(); // results.size() is returning batch_size
|
|
|
|
|
- nBoxesNum[0] = results[0].det_result->boxes.size(); // Get the predicted Bounding Box number of a single image
|
|
|
|
|
|
|
+ // nBoxesNum[0] = results.size(); // results.size()得到的是batch_size
|
|
|
|
|
+ nBoxesNum[0] = results[0].det_result->boxes.size(); // 得到单张图片预测的bounding box数
|
|
|
std::string label = "";
|
|
std::string label = "";
|
|
|
//std::cout << "res: " << results[num] << std::endl;
|
|
//std::cout << "res: " << results[num] << std::endl;
|
|
|
- for (int i = 0; i < results[0].det_result->boxes.size(); i++) // Get the data for all the boxes
|
|
|
|
|
|
|
+ for (int i = 0; i < results[0].det_result->boxes.size(); i++) // 得到所有框的数据
|
|
|
{
|
|
{
|
|
|
|
|
+ //std::cout << "category: " << results[num].det_result->boxes[i].category << std::endl;
|
|
|
label = label + results[0].det_result->boxes[i].category + " ";
|
|
label = label + results[0].det_result->boxes[i].category + " ";
|
|
|
// labelindex
|
|
// labelindex
|
|
|
- output[i * 6 + 0] = results[0].det_result->boxes[i].category_id; // Category ID
|
|
|
|
|
|
|
+ output[i * 6 + 0] = results[0].det_result->boxes[i].category_id; // 类别的id
|
|
|
// score
|
|
// score
|
|
|
- output[i * 6 + 1] = results[0].det_result->boxes[i].score; // Score
|
|
|
|
|
|
|
+ output[i * 6 + 1] = results[0].det_result->boxes[i].score; // 得分
|
|
|
//// box
|
|
//// box
|
|
|
- output[i * 6 + 2] = results[0].det_result->boxes[i].coordinate[0]; // x1, y1, w, h
|
|
|
|
|
- output[i * 6 + 3] = results[0].det_result->boxes[i].coordinate[1]; // Upper left and lower right vertices
|
|
|
|
|
|
|
+ output[i * 6 + 2] = results[0].det_result->boxes[i].coordinate[0]; // x1, y1, x2, y2
|
|
|
|
|
+ output[i * 6 + 3] = results[0].det_result->boxes[i].coordinate[1]; // 左上、右下的顶点
|
|
|
output[i * 6 + 4] = results[0].det_result->boxes[i].coordinate[2];
|
|
output[i * 6 + 4] = results[0].det_result->boxes[i].coordinate[2];
|
|
|
output[i * 6 + 5] = results[0].det_result->boxes[i].coordinate[3];
|
|
output[i * 6 + 5] = results[0].det_result->boxes[i].coordinate[3];
|
|
|
}
|
|
}
|
|
@@ -129,8 +128,8 @@ extern "C" void Det_ModelPredict(const unsigned char* img, int nWidth, int nHeig
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
-* Segmented inference
|
|
|
|
|
-*
|
|
|
|
|
|
|
+* 分割推理接口
|
|
|
|
|
+*
|
|
|
* img: input for predicting.
|
|
* img: input for predicting.
|
|
|
*
|
|
*
|
|
|
* nWidth: width of img.
|
|
* nWidth: width of img.
|
|
@@ -140,10 +139,8 @@ extern "C" void Det_ModelPredict(const unsigned char* img, int nWidth, int nHeig
|
|
|
* nChannel: channel of img.
|
|
* nChannel: channel of img.
|
|
|
*
|
|
*
|
|
|
* output: result of pridict ,include label_map
|
|
* output: result of pridict ,include label_map
|
|
|
-*
|
|
|
|
|
-* extern "C"
|
|
|
|
|
*/
|
|
*/
|
|
|
-extern "C" void Seg_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, unsigned char* output)
|
|
|
|
|
|
|
+extern "C" __declspec(dllexport) void Seg_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, unsigned char* output)
|
|
|
{
|
|
{
|
|
|
// prepare data
|
|
// prepare data
|
|
|
std::vector<cv::Mat> imgs;
|
|
std::vector<cv::Mat> imgs;
|
|
@@ -161,21 +158,22 @@ extern "C" void Seg_ModelPredict(const unsigned char* img, int nWidth, int nHeig
|
|
|
|
|
|
|
|
cv::Mat input = cv::Mat::zeros(cv::Size(nWidth, nHeight), nType);
|
|
cv::Mat input = cv::Mat::zeros(cv::Size(nWidth, nHeight), nType);
|
|
|
memcpy(input.data, img, nHeight * nWidth * nChannel * sizeof(uchar));
|
|
memcpy(input.data, img, nHeight * nWidth * nChannel * sizeof(uchar));
|
|
|
|
|
+ //cv::imwrite("./1.png", input);
|
|
|
imgs.push_back(std::move(input));
|
|
imgs.push_back(std::move(input));
|
|
|
|
|
|
|
|
// predict
|
|
// predict
|
|
|
std::vector<PaddleDeploy::Result> results;
|
|
std::vector<PaddleDeploy::Result> results;
|
|
|
model->Predict(imgs, &results, 1);
|
|
model->Predict(imgs, &results, 1);
|
|
|
|
|
|
|
|
- std::vector<uint8_t> result_map = results[0].seg_result->label_map.data; // vector<uint8_t> -- Result Map
|
|
|
|
|
- // Copy output result to the output back -- from vector<uint8_t> to unsigned char *
|
|
|
|
|
|
|
+ std::vector<uint8_t> result_map = results[0].seg_result->label_map.data; // vector<uint8_t> -- 结果map
|
|
|
|
|
+ // 拷贝输出结果到输出上返回 -- 将vector<uint8_t>转成unsigned char *
|
|
|
memcpy(output, &result_map[0], result_map.size() * sizeof(uchar));
|
|
memcpy(output, &result_map[0], result_map.size() * sizeof(uchar));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
-* Recognition inference API
|
|
|
|
|
-*
|
|
|
|
|
|
|
+* 识别推理接口
|
|
|
|
|
+*
|
|
|
* img: input for predicting.
|
|
* img: input for predicting.
|
|
|
*
|
|
*
|
|
|
* nWidth: width of img.
|
|
* nWidth: width of img.
|
|
@@ -185,14 +183,12 @@ extern "C" void Seg_ModelPredict(const unsigned char* img, int nWidth, int nHeig
|
|
|
* nChannel: channel of img.
|
|
* nChannel: channel of img.
|
|
|
*
|
|
*
|
|
|
* score: result of pridict ,include score
|
|
* score: result of pridict ,include score
|
|
|
-*
|
|
|
|
|
|
|
+*
|
|
|
* category: result of pridict ,include category_string
|
|
* category: result of pridict ,include category_string
|
|
|
-*
|
|
|
|
|
|
|
+*
|
|
|
* category_id: result of pridict ,include category_id
|
|
* category_id: result of pridict ,include category_id
|
|
|
-*
|
|
|
|
|
-* extern "C"
|
|
|
|
|
*/
|
|
*/
|
|
|
-extern "C" void Cls_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* score, char* category, int* category_id)
|
|
|
|
|
|
|
+extern "C" __declspec(dllexport) void Cls_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* score, char* category, int* category_id)
|
|
|
{
|
|
{
|
|
|
// prepare data
|
|
// prepare data
|
|
|
std::vector<cv::Mat> imgs;
|
|
std::vector<cv::Mat> imgs;
|
|
@@ -210,6 +206,7 @@ extern "C" void Cls_ModelPredict(const unsigned char* img, int nWidth, int nHeig
|
|
|
|
|
|
|
|
cv::Mat input = cv::Mat::zeros(cv::Size(nWidth, nHeight), nType);
|
|
cv::Mat input = cv::Mat::zeros(cv::Size(nWidth, nHeight), nType);
|
|
|
memcpy(input.data, img, nHeight * nWidth * nChannel * sizeof(uchar));
|
|
memcpy(input.data, img, nHeight * nWidth * nChannel * sizeof(uchar));
|
|
|
|
|
+ //cv::imwrite("./1.png", input);
|
|
|
imgs.push_back(std::move(input));
|
|
imgs.push_back(std::move(input));
|
|
|
|
|
|
|
|
// predict
|
|
// predict
|
|
@@ -217,16 +214,16 @@ extern "C" void Cls_ModelPredict(const unsigned char* img, int nWidth, int nHeig
|
|
|
model->Predict(imgs, &results, 1);
|
|
model->Predict(imgs, &results, 1);
|
|
|
|
|
|
|
|
*category_id = results[0].clas_result->category_id;
|
|
*category_id = results[0].clas_result->category_id;
|
|
|
- // Copy output category result to output -- string --> char*
|
|
|
|
|
|
|
+ // 拷贝输出类别结果到输出上返回 -- string --> char*
|
|
|
memcpy(category, results[0].clas_result->category.c_str(), strlen(results[0].clas_result->category.c_str()));
|
|
memcpy(category, results[0].clas_result->category.c_str(), strlen(results[0].clas_result->category.c_str()));
|
|
|
- // Copy output probability value
|
|
|
|
|
|
|
+ // 拷贝输出概率值返回
|
|
|
*score = results[0].clas_result->score;
|
|
*score = results[0].clas_result->score;
|
|
|
-}
|
|
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
-* MaskRCNN Reasoning
|
|
|
|
|
-*
|
|
|
|
|
|
|
+* MaskRCNN推理接口
|
|
|
|
|
+*
|
|
|
* img: input for predicting.
|
|
* img: input for predicting.
|
|
|
*
|
|
*
|
|
|
* nWidth: width of img.
|
|
* nWidth: width of img.
|
|
@@ -240,12 +237,10 @@ extern "C" void Cls_ModelPredict(const unsigned char* img, int nWidth, int nHeig
|
|
|
* mask_output: result of pridict ,include label_map
|
|
* mask_output: result of pridict ,include label_map
|
|
|
*
|
|
*
|
|
|
* nBoxesNum: result of pridict ,include BoxesNum
|
|
* nBoxesNum: result of pridict ,include BoxesNum
|
|
|
-*
|
|
|
|
|
|
|
+*
|
|
|
* LabelList: result of pridict ,include LabelList
|
|
* LabelList: result of pridict ,include LabelList
|
|
|
-*
|
|
|
|
|
-* extern "C"
|
|
|
|
|
*/
|
|
*/
|
|
|
-extern "C" void Mask_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* box_output, unsigned char* mask_output, int* nBoxesNum, char* LabelList)
|
|
|
|
|
|
|
+extern "C" __declspec(dllexport) void Mask_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* box_output, unsigned char* mask_output, int* nBoxesNum, char* LabelList)
|
|
|
{
|
|
{
|
|
|
// prepare data
|
|
// prepare data
|
|
|
std::vector<cv::Mat> imgs;
|
|
std::vector<cv::Mat> imgs;
|
|
@@ -265,28 +260,28 @@ extern "C" void Mask_ModelPredict(const unsigned char* img, int nWidth, int nHei
|
|
|
memcpy(input.data, img, nHeight * nWidth * nChannel * sizeof(uchar));
|
|
memcpy(input.data, img, nHeight * nWidth * nChannel * sizeof(uchar));
|
|
|
imgs.push_back(std::move(input));
|
|
imgs.push_back(std::move(input));
|
|
|
|
|
|
|
|
- // predict
|
|
|
|
|
|
|
+ // predict -- 多次点击单张推理时会出错
|
|
|
std::vector<PaddleDeploy::Result> results;
|
|
std::vector<PaddleDeploy::Result> results;
|
|
|
- model->Predict(imgs, &results, 1);
|
|
|
|
|
|
|
+ model->Predict(imgs, &results, 1); // 在Infer处发生错误
|
|
|
|
|
|
|
|
- nBoxesNum[0] = results[0].det_result->boxes.size(); // Get the predicted Bounding Box number of a single image
|
|
|
|
|
|
|
+ nBoxesNum[0] = results[0].det_result->boxes.size(); // 得到单张图片预测的bounding box数
|
|
|
std::string label = "";
|
|
std::string label = "";
|
|
|
|
|
|
|
|
- for (int i = 0; i < results[0].det_result->boxes.size(); i++) // Get the data for all the boxes
|
|
|
|
|
|
|
+ for (int i = 0; i < results[0].det_result->boxes.size(); i++) // 得到所有框的数据
|
|
|
{
|
|
{
|
|
|
- // prediction results
|
|
|
|
|
|
|
+ // 边界框预测结果
|
|
|
label = label + results[0].det_result->boxes[i].category + " ";
|
|
label = label + results[0].det_result->boxes[i].category + " ";
|
|
|
// labelindex
|
|
// labelindex
|
|
|
- box_output[i * 6 + 0] = results[0].det_result->boxes[i].category_id; // Category ID
|
|
|
|
|
|
|
+ box_output[i * 6 + 0] = results[0].det_result->boxes[i].category_id; // 类别的id
|
|
|
// score
|
|
// score
|
|
|
- box_output[i * 6 + 1] = results[0].det_result->boxes[i].score; // Score
|
|
|
|
|
|
|
+ box_output[i * 6 + 1] = results[0].det_result->boxes[i].score; // 得分
|
|
|
//// box
|
|
//// box
|
|
|
box_output[i * 6 + 2] = results[0].det_result->boxes[i].coordinate[0]; // x1, y1, x2, y2
|
|
box_output[i * 6 + 2] = results[0].det_result->boxes[i].coordinate[0]; // x1, y1, x2, y2
|
|
|
- box_output[i * 6 + 3] = results[0].det_result->boxes[i].coordinate[1]; // Upper left and lower right vertices
|
|
|
|
|
|
|
+ box_output[i * 6 + 3] = results[0].det_result->boxes[i].coordinate[1]; // 左上、右下的顶点
|
|
|
box_output[i * 6 + 4] = results[0].det_result->boxes[i].coordinate[2];
|
|
box_output[i * 6 + 4] = results[0].det_result->boxes[i].coordinate[2];
|
|
|
box_output[i * 6 + 5] = results[0].det_result->boxes[i].coordinate[3];
|
|
box_output[i * 6 + 5] = results[0].det_result->boxes[i].coordinate[3];
|
|
|
-
|
|
|
|
|
- // Mask prediction results
|
|
|
|
|
|
|
+
|
|
|
|
|
+ //Mask预测结果
|
|
|
for (int j = 0; j < results[0].det_result->boxes[i].mask.data.size(); j++)
|
|
for (int j = 0; j < results[0].det_result->boxes[i].mask.data.size(); j++)
|
|
|
{
|
|
{
|
|
|
if (mask_output[j] == 0)
|
|
if (mask_output[j] == 0)
|
|
@@ -301,12 +296,10 @@ extern "C" void Mask_ModelPredict(const unsigned char* img, int nWidth, int nHei
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
-* Model destruction API
|
|
|
|
|
-*
|
|
|
|
|
-* extern "C"
|
|
|
|
|
|
|
+* 模型销毁/注销接口
|
|
|
*/
|
|
*/
|
|
|
-extern "C" void DestructModel()
|
|
|
|
|
|
|
+extern "C" __declspec(dllexport) void DestructModel()
|
|
|
{
|
|
{
|
|
|
delete model;
|
|
delete model;
|
|
|
std::cout << "destruct model success" << std::endl;
|
|
std::cout << "destruct model success" << std::endl;
|
|
|
-}
|
|
|
|
|
|
|
+}
|