我尝试从opencv重新实现dasiamrpn tracker,但是使用openvino推理。在init方法中,我假设一些层参数已经被r1和cls1头产生的Tensor改变了
siamRPN.setInput(blob);
cv::Mat out1;
siamRPN.forward(out1, "63");
siamKernelCL1.setInput(out1);
siamKernelR1.setInput(out1);
cv::Mat cls1 = siamKernelCL1.forward();
cv::Mat r1 = siamKernelR1.forward();
std::vector<int> r1_shape = { 20, 256, 4, 4 }, cls1_shape = { 10, 256, 4, 4 }; //same shape as conv layers 65 and 68
siamRPN.setParam(siamRPN.getLayerId("65"), 0, r1.reshape(0, r1_shape));
siamRPN.setParam(siamRPN.getLayerId("68"), 0, cls1.reshape(0, cls1_shape));
但是我在openvino中找不到一个API或者某种方法来实现这个。有人遇到过这样的问题吗?
what I'm trying to do
我假设权重存储在这两个节点中:
<layer id="31" name="new_layer_2.weight" type="Const" version="opset1">
<data element_type="f32" shape="10, 256, 4, 4" offset="17349120" size="163840"/>
<rt_info>
<attribute name="fused_names" version="0" value="new_layer_2.weight"/>
</rt_info>
<output>
<port id="0" precision="FP32" names="new_layer_2.weight">
<dim>10</dim>
<dim>256</dim>
<dim>4</dim>
<dim>4</dim>
</port>
</output>
</layer>
<layer id="38" name="new_layer_1.weight" type="Const" version="opset1">
<data element_type="f32" shape="20, 256, 4, 4" offset="19873280" size="327680"/>
<rt_info>
<attribute name="fused_names" version="0" value="new_layer_1.weight"/>
</rt_info>
<output>
<port id="0" precision="FP32" names="new_layer_1.weight">
<dim>20</dim>
<dim>256</dim>
<dim>4</dim>
<dim>4</dim>
</port>
</output>
</layer>
我可以在模型操作中查看此节点
auto ops = model->get_ops();
但是我不知道如何改变它的重量数据。有没有办法在运行时改变它?
2条答案
按热度按时间k3fezbri1#
您可以使用OpenVINO Runtime参考推理管道来推断模型,它显示了您需要在应用程序代码中执行的步骤。
要在一个应用程序中读取多个网络,可以参考Pedestrian Tracker C++ Demo
dxpyg8gm2#
我找到了解决办法
但我认为这不是最好的解决办法。有没有更清晰、更快速的方法?