用户您好,请详细描述您所遇到的问题:
- 系统软件版本: x3_ubuntu_v1.1.4
- 问题描述:根据parking_perception案例修改二阶段ocr模型(多branch输出,例如ocr模型输出3个分支对应颜色,车牌号,是否是车牌)出现问题
- 具体情况如:
修改代码如下:
1、
具体报错如下:
用户您好,请详细描述您所遇到的问题:
修改代码如下:
1、
具体报错如下:
运行报错的ctrl param提示信息不用关注,dnn node内部会自适应。
你的场景是不是这样:
模型一输入是图片,输出是检测出来车牌(检测框、颜色等);
对于模型二,有两种方法进行推理,可以传入图片+roi进行推理(roi infer type,效率更高),也可以自己抠出来车牌图片后使用这个抠图进行推理(model infer type),不过需要和模型转换时的模型类型对应起来。
以roi infer进行说明。
参数配置:指定task type为roi infer type。
推理前处理:直接将图片和所有roi送给推理接口,同时将车牌的信息添加到dnn output中(dnn sample中只添加了时间戳),用于表示推理结果(识别出来的车牌号)对应的车牌。-
推理后处理(解析模型输出):参考sample,解析DnnNodeOutput中的std::vector<std::shared_ptr> output_tensors成员,如果模型输出branch为1,则只要解析output_tensors[0],所有的roi对应的推理结果都在这里面,通过地址偏移解析多个roi对应结果。
DNNInferCtrlParam param; //初始化默认构造都是0
// 中间是不是改过下面的参数,将之设置为2了?
param.bpuCoreId = 0;
双核模型,给到core id应该为0
InferType只是模型输入数据类型有区别,branch表示的是输出,二者没有关联。
你这边报错时没有设置SetOutputParser,每个输出都要设置。
我查看给的教材案例,ModelTaskType 都是ModelTaskType::ModelInferTypre, 现在我的ocr模型是属于ModelTaskType::ModelRoiInferType,是不是多branch的不支持ModelRoiInferType?
这样么
结果还是一样啊,报错
什么意思
没有啊,我都没设置这个参数
用hobot dnn sample中的方法能不能解决呢,我现在是不知道下游模型的多个roi怎么通过直接获取模型输入来解析,在代码中打印node_output->output_tensors的维度是模型的branch数,不是对应的roi数量,这个有解决办法么
之前提过多branch模型部署代码出现的问题,直接使用dnn_node_example中parse的方法进行了规避处理,在单路的情况下没有问题,但是在多路的时候性能上会出现问题,fps浮动过大,对比同一模型使用SingleBranchOutputParser和直接使用parse,在单node多路推理中,SingleBranchOutputParser不会出现问题,所以重新使用MultiBranchOutputParser处理下游多branch模型,遇到如下问题,请问有什么办法能处理么
不是,是你注释掉的1. helper部分,single branch是指定每个输出通道的解析方法,每个通道必须要指定。multi branch指定某个通道以及其依赖的通道输出。
branch的用法非常灵活,例如可以每个通道指定空解析方法,multi brach指定依赖所有通道,这样就能在multi branch的解析方法中拿到所有通道的输出进行解析了。
这个意思是我需要用的是single branch?不是multi branch?但是single branch parse方法中输入的不是std::vector<std::<shared_ptr>>,具体是怎么写这块,能请教一下么:
// 2. set multi branch paser-
auto seg_output_desc = std::make_shared<OutputDescription>(-
model_manage, model_output_count_, “ocr_branch”);-
for (int i = 0; i < model_output_count_; ++i) {-
seg_output_desc->GetDependencies().push_back(i);-
}-
seg_output_desc->SetType(“ocr”);-
model_manage->SetOutputDescription(seg_output_desc);-
// auto OcrParser = std::make_shared();-
// std::shared_ptr ocr_out_parser =-
// std::dynamic_pointer_cast(OcrParser);-
// model_manage->SetOutputParser(output_index_, ocr_out_parser);-
for (int i = 0; i < model_output_count_; ++i) {-
std::shared_ptr kps_out_parser =-
std::make_shared<PlateOcrOutputParser>();-
model_manage->SetOutputParser(i, kps_out_parser);-
}
尝试了还是之前的[EasyDNN]parser is null pointer的报错,能否请教一下是哪里的问题:
你好,我尝试了你说的hobot dnn sample,在单图片输入的时候没有问题,但是我现在的场景是二阶段oc模型,就是上游检测模型会检测出很多的车牌框roi输入二阶段ocr,但是我看到postprocess parser中解析的时候好像是单图片解析的,怎么样才能做到循环的解析输入的多个车牌框的信息呢?
可以关注一下用户层的这块代码,看看里面是不是设置了
task->SetCtrlParam(DNNInferCtrlParam &ctrl_param);
这块代码我这里没有设置,我设置的如下:
这个接口获取的是一维vector,大小是branch数量,因为bpu是多个roi batch推理,所以,每一个branch的输出tensor大小都*roi_num-
/**-
* Get all output tensors, batch layout-
* @param[out] output_tensors, the size equal to model output count-
* @return 0 if success, return defined error code otherwise-
*/-
virtual int32_t GetOutputTensors(-
std::vector<std::shared_ptr<DNNTensor>> &output_tensors) = 0;