-
Notifications
You must be signed in to change notification settings - Fork 465
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add YOLOv5Face model support #38
Merged
Merged
Changes from all commits
Commits
Show all changes
31 commits
Select commit
Hold shift + click to select a range
02d29aa
update .gitignore
DefTruth f9caef2
Merge branch 'develop' of https://github.com/DefTruth/FastDeploy into…
DefTruth afa8114
Added checking for cmake include dir
DefTruth 659c14c
fixed missing trt_backend option bug when init from trt
DefTruth 17a43ce
remove un-need data layout and add pre-check for dtype
DefTruth 75948f8
changed RGB2BRG to BGR2RGB in ppcls model
DefTruth b57244d
add yolov6 c++ and yolov6 pybind
DefTruth 71cd83c
Merge branch 'develop' of https://github.com/DefTruth/FastDeploy into…
DefTruth f847490
add model_zoo yolov6 c++/python demo
DefTruth c56fdc3
fixed CMakeLists.txt typos
DefTruth 2300f57
update yolov6 cpp/README.md
DefTruth 5670280
Merge branch 'PaddlePaddle:develop' into develop
DefTruth cb91b3c
add yolox c++/pybind and model_zoo demo
DefTruth 9d7e9d9
move some helpers to private
DefTruth d2e51a2
fixed CMakeLists.txt typos
DefTruth eb63a0e
Merge branch 'develop' of https://github.com/DefTruth/FastDeploy into…
DefTruth df8b6a6
add normalize with alpha and beta
DefTruth 8786384
add version notes for yolov5/yolov6/yolox
DefTruth fed2953
add copyright to yolov5.cc
DefTruth 6ec3bd5
revert normalize
DefTruth 367dad0
fixed some bugs in yolox
DefTruth 95f8d01
update examples/CMakeLists.txt
DefTruth 8de98d5
Merge branch 'PaddlePaddle-develop' into develop
DefTruth e339707
Merge branch 'PaddlePaddle:develop' into develop
DefTruth 66fc4ae
Merge branch 'PaddlePaddle:develop' into develop
DefTruth e296a38
Merge branch 'PaddlePaddle:develop' into develop
DefTruth eab499e
Add YOLOv5Face Model support
DefTruth b33df85
Merge pull request #8 from PaddlePaddle/develop
DefTruth 67a7004
Merge branch 'yolov5face' of https://github.com/DefTruth/FastDeploy i…
DefTruth 0d3e929
fixed examples/vision typos
DefTruth 2c0b4cf
fixed runtime_option print func bugs
DefTruth File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
// 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/yolov5s-face.onnx"; | ||
std::string img_path = "../resources/images/test_face_det.jpg"; | ||
std::string vis_path = | ||
"../resources/outputs/deepcam_yolov5face_vis_result.jpg"; | ||
|
||
auto model = vis::deepcam::YOLOv5Face(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::FaceDetectionResult res; | ||
if (!model.Predict(&im, &res, 0.1f, 0.3f)) { | ||
std::cerr << "Prediction Failed." << std::endl; | ||
return -1; | ||
} else { | ||
std::cout << "Prediction Done!" << std::endl; | ||
} | ||
|
||
// 输出预测框结果 | ||
std::cout << res.Str() << std::endl; | ||
|
||
// 可视化预测结果 | ||
vis::Visualize::VisFaceDetection(&vis_im, res, 2, 0.3f); | ||
cv::imwrite(vis_path, vis_im); | ||
std::cout << "Detect Done! Saved: " << vis_path << std::endl; | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
# 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. | ||
|
||
from __future__ import absolute_import | ||
import logging | ||
from ... import FastDeployModel, Frontend | ||
from ... import fastdeploy_main as C | ||
|
||
|
||
class YOLOv5Face(FastDeployModel): | ||
def __init__(self, | ||
model_file, | ||
params_file="", | ||
runtime_option=None, | ||
model_format=Frontend.ONNX): | ||
# 调用基函数进行backend_option的初始化 | ||
# 初始化后的option保存在self._runtime_option | ||
super(YOLOv5Face, self).__init__(runtime_option) | ||
|
||
self._model = C.vision.deepcam.YOLOv5Face( | ||
model_file, params_file, self._runtime_option, model_format) | ||
# 通过self.initialized判断整个模型的初始化是否成功 | ||
assert self.initialized, "YOLOv5Face 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) | ||
|
||
# 一些跟YOLOv5Face模型有关的属性封装 | ||
# 多数是预处理相关,可通过修改如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 landmarks_per_face(self): | ||
return self._model.landmarks_per_face | ||
|
||
@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 | ||
|
||
@landmarks_per_face.setter | ||
def landmarks_per_face(self, value): | ||
assert isinstance( | ||
value, | ||
int), "The value to set `landmarks_per_face` must be type of int." | ||
self._model.landmarks_per_face = value |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
// 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/pybind/main.h" | ||
|
||
namespace fastdeploy { | ||
void BindDeepCam(pybind11::module& m) { | ||
auto deepcam_module = | ||
m.def_submodule("deepcam", "https://github.com/deepcam-cn/yolov5-face"); | ||
pybind11::class_<vision::deepcam::YOLOv5Face, FastDeployModel>(deepcam_module, | ||
"YOLOv5Face") | ||
.def(pybind11::init<std::string, std::string, RuntimeOption, Frontend>()) | ||
.def("predict", | ||
[](vision::deepcam::YOLOv5Face& self, pybind11::array& data, | ||
float conf_threshold, float nms_iou_threshold) { | ||
auto mat = PyArrayToCvMat(data); | ||
vision::FaceDetectionResult res; | ||
self.Predict(&mat, &res, conf_threshold, nms_iou_threshold); | ||
return res; | ||
}) | ||
.def_readwrite("size", &vision::deepcam::YOLOv5Face::size) | ||
.def_readwrite("padding_value", | ||
&vision::deepcam::YOLOv5Face::padding_value) | ||
.def_readwrite("is_mini_pad", &vision::deepcam::YOLOv5Face::is_mini_pad) | ||
.def_readwrite("is_no_pad", &vision::deepcam::YOLOv5Face::is_no_pad) | ||
.def_readwrite("is_scale_up", &vision::deepcam::YOLOv5Face::is_scale_up) | ||
.def_readwrite("stride", &vision::deepcam::YOLOv5Face::stride) | ||
.def_readwrite("landmarks_per_face", | ||
&vision::deepcam::YOLOv5Face::landmarks_per_face); | ||
} | ||
|
||
} // namespace fastdeploy |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
什么类型的模型会没有landmark; 当没有landmark时,模型的开发应该是用DetectionResullt,还是用FaceDetectionResult呢
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
在人脸检测中,带landmark和不带landmark的模型都是非常常见的。landmark通常作为一个辅助任务出现在人脸检测的算法中。所以定义一个FaceDetectionResult确实是需要考虑这两种情况。以下是一些例子:
个人观点:不建议。理由有以下3个: