-
Notifications
You must be signed in to change notification settings - Fork 705
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
yolox_nano速度问题 #9
Comments
按理说,用depth-wise在计算量和参数量上都是会减少的(按照MobileNetV1论文中的公式来看),但是实际在推理引擎跑的耗时,受影响的因素可能会有很多,你可以尝试下官网的ncnn版本。或者调整下我这里onnxruntime c++版本的线程数,看看是否有改善。我这默认的线程数是1,你可以尝试别的线程数。 class LITE_EXPORTS YoloX : public BasicOrtHandler
{
public:
explicit YoloX(const std::string &_onnx_path, unsigned int _num_threads = 1) : // 线程数默认为1
BasicOrtHandler(_onnx_path, _num_threads)
{};
} 可以修改为别的线程数: auto *yolox = new lite::cv::detection::YoloX(onnx_path, 8); // 8 threads. |
感谢回复。通过一系列的测试,我感觉应该是网络并行加速能力的问题而非代码问题。 P.S. 用CPU推理时,将ort_handler.cpp中session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);修改成session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);可以显著提升推理速度 |
除此之外我还发现一个新问题,就是当网络输入尺寸的长宽不一样时(也就是说是个长方形),推理的结果会发生错误,我不知道这是为什么 |
应该不会的,我测试了YOLOX上的onnx模型文件,无论图像是否为方形都是正常的。不过nano的精确度确实比其他的差些。你方便把你训练的后处理和nano模型文件发出来吗? |
const float scale_height = img_height / input_height;
const float scale_width = img_width / input_width;
// .....
types::Boxf box;
box.x1 = (cx - w / 2.f) * scale_width;
box.y1 = (cy - h / 2.f) * scale_height;
box.x2 = (cx + w / 2.f) * scale_width;
box.y2 = (cy + h / 2.f) * scale_height;
box.score = conf;
box.label = label;
box.label_text = class_names[label];
box.flag = true;
bbox_collection.push_back(box); |
赞👍🏻~ 学到了新知识 ~ |
但如果你说的是模型输入是类似640x480的tensor,那么你说的情况是有可能,按照YOLOX官方放出的C++代码,它在生成Anchor(GridAndStride)时,假设了target_size是一个const int,你看: static void generate_grids_and_stride(const int target_size, std::vector<int>& strides, std::vector<GridAndStride>& grid_strides)
{
for (auto stride : strides)
{
int num_grid = target_size / stride;
for (int g1 = 0; g1 < num_grid; g1++)
{
for (int g0 = 0; g0 < num_grid; g0++)
{
grid_strides.push_back((GridAndStride){g0, g1, stride});
}
}
}
} 也就是他认为输入张量是个方形。我这边的实现也是这样,使用了height作为target_size. 在 yolox.cpp中: this->generate_anchors(input_height, strides, anchors); 所以你应该只要修改这段,让他能适应一般矩形的输入,应该就能解决问题 void YoloX::generate_anchors(const int target_height, const int target_width,
std::vector<int> &strides, std::vector<Anchor> &anchors)
{
for (auto stride : strides)
{
int num_grid_w = target_width / stride;
int num_grid_h = target_height / stride;
for (int g1 = 0; g1 < num_grid_h; g1++)
{
for (int g0 = 0; g0 < num_grid_w; g0++)
{
anchors.push_back((Anchor) {g0, g1, stride});
}
}
}
} 然后将生成anchor的调用修改成 this->generate_anchors(input_height, input_width, strides, anchors); |
非常感谢,确实是这个问题 |
使用gpu,需要设置什么,怎么设置?我这边换了gpu的库,没效果,设置还不如cpu的速度? |
我使用您的代码框架测试了一下yolox系列的推理速度,yolox_nano以外的模型推理速度都很正常,但是使用nano模型时,推理速度甚至低于yolox_s。所用的onnx文件均为利用官方coco数据集训练出来的pth文件转化得到。
我注意到yolox在定义nano模型时,有一段额外代码(./exps/default/nano.py中),如下图所示
这是否会有影响?
The text was updated successfully, but these errors were encountered: