Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ fastdeploy.egg-info
.setuptools-cmake-build
fastdeploy/version.py
fastdeploy/LICENSE*
fastdeploy/ThirdPartyNotices*
fastdeploy/ThirdPartyNotices*
52 changes: 52 additions & 0 deletions examples/vision/wongkinyiu_yolor.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "fastdeploy/vision.h"

int main() {
namespace vis = fastdeploy::vision;

std::string model_file = "../resources/models/yolor.onnx";
std::string img_path = "../resources/images/horses.jpg";
std::string vis_path = "../resources/outputs/wongkinyiu_yolor_vis_result.jpg";

auto model = vis::wongkinyiu::YOLOR(model_file);
if (!model.Initialized()) {
std::cerr << "Init Failed! Model: " << model_file << std::endl;
return -1;
} else {
std::cout << "Init Done! Model:" << model_file << std::endl;
}
model.EnableDebug();

cv::Mat im = cv::imread(img_path);
cv::Mat vis_im = im.clone();

vis::DetectionResult res;
if (!model.Predict(&im, &res)) {
std::cerr << "Prediction Failed." << std::endl;
return -1;
} else {
std::cout << "Prediction Done!" << std::endl;
}

// 输出预测框结果
std::cout << res.Str() << std::endl;

// 可视化预测结果
vis::Visualize::VisDetection(&vis_im, res);
cv::imwrite(vis_path, vis_im);
std::cout << "Detect Done! Saved: " << vis_path << std::endl;
return 0;
}
21 changes: 13 additions & 8 deletions fastdeploy/utils/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@
#define FASTDEPLOY_DECL __declspec(dllexport)
#else
#define FASTDEPLOY_DECL __declspec(dllimport)
#endif // FASTDEPLOY_LIB
#endif // FASTDEPLOY_LIB
#else
#define FASTDEPLOY_DECL __attribute__((visibility("default")))
#endif // _WIN32
#endif // _WIN32

namespace fastdeploy {

Expand All @@ -42,7 +42,8 @@ class FASTDEPLOY_DECL FDLogger {
}
explicit FDLogger(bool verbose, const std::string& prefix = "[FastDeploy]");

template <typename T> FDLogger& operator<<(const T& val) {
template <typename T>
FDLogger& operator<<(const T& val) {
if (!verbose_) {
return *this;
}
Expand Down Expand Up @@ -72,10 +73,14 @@ class FASTDEPLOY_DECL FDLogger {
FDLogger(true, "[ERROR]") \
<< __REL_FILE__ << "(" << __LINE__ << ")::" << __FUNCTION__ << "\t"

#define FDASSERT(condition, message) \
if (!(condition)) { \
FDERROR << message << std::endl; \
std::abort(); \
#define FDERROR \
FDLogger(true, "[ERROR]") << __REL_FILE__ << "(" << __LINE__ \
<< ")::" << __FUNCTION__ << "\t"

#define FDASSERT(condition, message) \
if (!(condition)) { \
FDERROR << message << std::endl; \
std::abort(); \
}

} // namespace fastdeploy
} // namespace fastdeploy
5 changes: 3 additions & 2 deletions fastdeploy/vision.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,13 @@

#include "fastdeploy/core/config.h"
#ifdef ENABLE_VISION
#include "fastdeploy/vision/megvii/yolox.h"
#include "fastdeploy/vision/meituan/yolov6.h"
#include "fastdeploy/vision/ppcls/model.h"
#include "fastdeploy/vision/ppdet/ppyoloe.h"
#include "fastdeploy/vision/ultralytics/yolov5.h"
#include "fastdeploy/vision/wongkinyiu/yolor.h"
#include "fastdeploy/vision/wongkinyiu/yolov7.h"
#include "fastdeploy/vision/meituan/yolov6.h"
#include "fastdeploy/vision/megvii/yolox.h"
#endif

#include "fastdeploy/vision/visualize/visualize.h"
6 changes: 3 additions & 3 deletions fastdeploy/vision/ppcls/model.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,6 @@ class FASTDEPLOY_DECL Model : public FastDeployModel {
std::vector<std::shared_ptr<Processor>> processors_;
std::string config_file_;
};
} // namespace ppcls
} // namespace vision
} // namespace fastdeploy
} // namespace ppcls
} // namespace vision
} // namespace fastdeploy
2 changes: 1 addition & 1 deletion fastdeploy/vision/ppcls/ppcls_pybind.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,4 @@ void BindPPCls(pybind11::module& m) {
return res;
});
}
} // namespace fastdeploy
} // namespace fastdeploy
5 changes: 5 additions & 0 deletions fastdeploy/vision/ultralytics/yolov5.cc
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,11 @@ bool YOLOv5::Postprocess(
result->scores.push_back(confidence);
}
}

if (result->boxes.size() == 0) {
return true;
}

utils::NMS(result, nms_iou_threshold);

// scale the boxes to the origin image shape
Expand Down
6 changes: 5 additions & 1 deletion fastdeploy/vision/utils/sort_det_res.cc
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,11 @@ void MergeSort(DetectionResult* result, size_t low, size_t high) {

void SortDetectionResult(DetectionResult* result) {
size_t low = 0;
size_t high = result->scores.size() - 1;
size_t high = result->scores.size();
if (high == 0) {
return;
}
high = high - 1;
MergeSort(result, low, high);
}

Expand Down
4 changes: 2 additions & 2 deletions fastdeploy/vision/visualize/detection.cc
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,6 @@ void Visualize::VisDetection(cv::Mat* im, const DetectionResult& result,
}
}

} // namespace vision
} // namespace fastdeploy
} // namespace vision
} // namespace fastdeploy
#endif
98 changes: 98 additions & 0 deletions fastdeploy/vision/wongkinyiu/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,101 @@ def max_wh(self, value):
assert isinstance(
value, float), "The value to set `max_wh` must be type of float."
self._model.max_wh = value


class YOLOR(FastDeployModel):
def __init__(self,
model_file,
params_file="",
runtime_option=None,
model_format=Frontend.ONNX):
# 调用基函数进行backend_option的初始化
# 初始化后的option保存在self._runtime_option
super(YOLOR, self).__init__(runtime_option)

self._model = C.vision.wongkinyiu.YOLOR(
model_file, params_file, self._runtime_option, model_format)
# 通过self.initialized判断整个模型的初始化是否成功
assert self.initialized, "YOLOR initialize failed."

def predict(self, input_image, conf_threshold=0.25, nms_iou_threshold=0.5):
return self._model.predict(input_image, conf_threshold,
nms_iou_threshold)

# 一些跟YOLOR模型有关的属性封装
# 多数是预处理相关,可通过修改如model.size = [1280, 1280]改变预处理时resize的大小(前提是模型支持)
@property
def size(self):
return self._model.size

@property
def padding_value(self):
return self._model.padding_value

@property
def is_no_pad(self):
return self._model.is_no_pad

@property
def is_mini_pad(self):
return self._model.is_mini_pad

@property
def is_scale_up(self):
return self._model.is_scale_up

@property
def stride(self):
return self._model.stride

@property
def max_wh(self):
return self._model.max_wh

@size.setter
def size(self, wh):
assert isinstance(wh, [list, tuple]),\
"The value to set `size` must be type of tuple or list."
assert len(wh) == 2,\
"The value to set `size` must contatins 2 elements means [width, height], but now it contains {} elements.".format(
len(wh))
self._model.size = wh

@padding_value.setter
def padding_value(self, value):
assert isinstance(
value,
list), "The value to set `padding_value` must be type of list."
self._model.padding_value = value

@is_no_pad.setter
def is_no_pad(self, value):
assert isinstance(
value, bool), "The value to set `is_no_pad` must be type of bool."
self._model.is_no_pad = value

@is_mini_pad.setter
def is_mini_pad(self, value):
assert isinstance(
value,
bool), "The value to set `is_mini_pad` must be type of bool."
self._model.is_mini_pad = value

@is_scale_up.setter
def is_scale_up(self, value):
assert isinstance(
value,
bool), "The value to set `is_scale_up` must be type of bool."
self._model.is_scale_up = value

@stride.setter
def stride(self, value):
assert isinstance(
value, int), "The value to set `stride` must be type of int."
self._model.stride = value

@max_wh.setter
def max_wh(self, value):
assert isinstance(
value, float), "The value to set `max_wh` must be type of float."
self._model.max_wh = value
21 changes: 20 additions & 1 deletion fastdeploy/vision/wongkinyiu/wongkinyiu_pybind.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
namespace fastdeploy {
void BindWongkinyiu(pybind11::module& m) {
auto wongkinyiu_module =
m.def_submodule("wongkinyiu", "https://github.com/WongKinYiu/yolov7");
m.def_submodule("wongkinyiu", "https://github.com/WongKinYiu");
pybind11::class_<vision::wongkinyiu::YOLOv7, FastDeployModel>(
wongkinyiu_module, "YOLOv7")
.def(pybind11::init<std::string, std::string, RuntimeOption, Frontend>())
Expand All @@ -37,5 +37,24 @@ void BindWongkinyiu(pybind11::module& m) {
.def_readwrite("is_scale_up", &vision::wongkinyiu::YOLOv7::is_scale_up)
.def_readwrite("stride", &vision::wongkinyiu::YOLOv7::stride)
.def_readwrite("max_wh", &vision::wongkinyiu::YOLOv7::max_wh);

pybind11::class_<vision::wongkinyiu::YOLOR, FastDeployModel>(
wongkinyiu_module, "YOLOR")
.def(pybind11::init<std::string, std::string, RuntimeOption, Frontend>())
.def("predict",
[](vision::wongkinyiu::YOLOR& self, pybind11::array& data,
float conf_threshold, float nms_iou_threshold) {
auto mat = PyArrayToCvMat(data);
vision::DetectionResult res;
self.Predict(&mat, &res, conf_threshold, nms_iou_threshold);
return res;
})
.def_readwrite("size", &vision::wongkinyiu::YOLOR::size)
.def_readwrite("padding_value", &vision::wongkinyiu::YOLOR::padding_value)
.def_readwrite("is_mini_pad", &vision::wongkinyiu::YOLOR::is_mini_pad)
.def_readwrite("is_no_pad", &vision::wongkinyiu::YOLOR::is_no_pad)
.def_readwrite("is_scale_up", &vision::wongkinyiu::YOLOR::is_scale_up)
.def_readwrite("stride", &vision::wongkinyiu::YOLOR::stride)
.def_readwrite("max_wh", &vision::wongkinyiu::YOLOR::max_wh);
}
} // namespace fastdeploy
Loading