Fixed visitor for Interpolate-1 and Interpolate-4 (#2051)
* Fixed visitor for Interpolate-1 and Interpolate-4 * Code style fix * Remove unnecessary changes * Fixed compilation on Linux for Atttribute visitor of vector<size_t> * Added unit test for IE IR Reader for Interpolate-4 * Updated unit test for IR Reader for Interpolate-4 * Updated unit test
This commit is contained in:
parent
d9e9abcf50
commit
f60b46f3d4
@ -429,7 +429,6 @@ std::shared_ptr<ngraph::Node> V10Parser::createNode(const std::vector<ngraph::Ou
|
||||
std::make_shared<LayerCreator<ngraph::op::v1::BinaryConvolution>>("BinaryConvolution"),
|
||||
std::make_shared<LayerCreator<ngraph::op::GRN>>("GRN"),
|
||||
std::make_shared<LayerCreator<ngraph::op::HardSigmoid>>("HardSigmoid"),
|
||||
std::make_shared<LayerCreator<ngraph::op::v0::Interpolate>>("Interpolate"),
|
||||
std::make_shared<LayerCreator<ngraph::op::Log>>("Log"),
|
||||
std::make_shared<LayerCreator<ngraph::op::SquaredDifference>>("SquaredDifference"),
|
||||
std::make_shared<LayerCreator<ngraph::op::v1::Less>>("Less"),
|
||||
@ -1384,40 +1383,6 @@ std::shared_ptr<ngraph::Node> V10Parser::LayerCreator<ngraph::op::Unsqueeze>::cr
|
||||
return std::make_shared<ngraph::op::Unsqueeze>(inputs[0], inputs[1]);
|
||||
}
|
||||
|
||||
// Interpolate layer
|
||||
template <>
|
||||
std::shared_ptr<ngraph::Node> V10Parser::LayerCreator<ngraph::op::v0::Interpolate>::createLayer(
|
||||
const ngraph::OutputVector& inputs, const pugi::xml_node& node, std::istream& binStream,
|
||||
const GenericLayerParams& layerParsePrms) {
|
||||
checkParameters(inputs, layerParsePrms, 2);
|
||||
|
||||
pugi::xml_node dn = node.child("data");
|
||||
|
||||
if (dn.empty())
|
||||
THROW_IE_EXCEPTION << "Cannot read parameter for " << getType() << " layer with name: " << layerParsePrms.name;
|
||||
|
||||
ngraph::op::v0::InterpolateAttrs attrs;
|
||||
for (auto& axis : getParameters<int64_t>(dn, "axes")) {
|
||||
attrs.axes.insert(axis);
|
||||
}
|
||||
|
||||
std::set<std::string> available_modes {"linear", "nearest", "cubic", "area"};
|
||||
attrs.mode = GetStrAttr(dn, "mode");
|
||||
if (!available_modes.count(attrs.mode)) {
|
||||
THROW_IE_EXCEPTION << "Interpolate mode: " << attrs.mode << " is unsupported!";
|
||||
}
|
||||
attrs.align_corners = GetIntAttr(dn, "align_corners", 1);
|
||||
attrs.antialias = GetIntAttr(dn, "antialias", 0);
|
||||
for (auto& pad : getParameters<int64_t>(dn, "pads_begin")) {
|
||||
attrs.pads_begin.push_back(pad);
|
||||
}
|
||||
for (auto& pad : getParameters<int64_t>(dn, "pads_end")) {
|
||||
attrs.pads_end.push_back(pad);
|
||||
}
|
||||
|
||||
return std::make_shared<ngraph::op::v0::Interpolate>(inputs[0], inputs[1], attrs);
|
||||
}
|
||||
|
||||
// Abs layer
|
||||
template <>
|
||||
std::shared_ptr<ngraph::Node> V10Parser::LayerCreator<ngraph::op::Abs>::createLayer(
|
||||
|
@ -217,6 +217,21 @@ private:
|
||||
std::vector<size_t> shape;
|
||||
if (!getParameters<size_t>(node.child("data"), name, shape)) return;
|
||||
static_cast<ngraph::Strides&>(*a) = ngraph::Strides(shape);
|
||||
#ifdef __APPLE__
|
||||
} else if (auto a = ngraph::as_type<ngraph::AttributeAdapter<std::vector<size_t>>>(&adapter)) {
|
||||
std::vector<size_t> result;
|
||||
if (!getParameters<size_t>(node.child("data"), name, result)) return;
|
||||
static_cast<std::vector<size_t>&>(*a) = result;
|
||||
#else
|
||||
} else if (auto a = ngraph::as_type<ngraph::AttributeAdapter<std::vector<size_t>>>(&adapter)) {
|
||||
std::vector<size_t> result;
|
||||
if (!getParameters<size_t>(node.child("data"), name, result)) return;
|
||||
a->set(result);
|
||||
#endif
|
||||
} else if (auto a = ngraph::as_type<ngraph::AttributeAdapter<ngraph::AxisSet>>(&adapter)) {
|
||||
std::vector<size_t> axes;
|
||||
if (!getParameters<size_t>(node.child("data"), name, axes)) return;
|
||||
static_cast<ngraph::AxisSet&>(*a) = ngraph::AxisSet(axes);
|
||||
} else if (auto a = ngraph::as_type<ngraph::AttributeAdapter<ngraph::op::TopKSortType>>(&adapter)) {
|
||||
if (!getStrAttribute(node.child("data"), name, val)) return;
|
||||
static_cast<ngraph::op::TopKSortType&>(*a) = ngraph::as_enum<ngraph::op::TopKSortType>(val);
|
||||
|
@ -220,3 +220,183 @@ TEST_F(NGraphReaderTests, ReadInterpolate2Network) {
|
||||
data[3] = 60;
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(NGraphReaderTests, ReadInterpolate4Network) {
|
||||
std::string model = R"V0G0N(
|
||||
<net name="Network" version="10">
|
||||
<layers>
|
||||
<layer id="0" name="data" type="Parameter" precision="FP32" version="opset1">
|
||||
<data element_type="f32" shape="1,2,300,300"/>
|
||||
<output>
|
||||
<port id="0" precision="FP32">
|
||||
<dim>1</dim>
|
||||
<dim>2</dim>
|
||||
<dim>300</dim>
|
||||
<dim>300</dim>
|
||||
</port>
|
||||
</output>
|
||||
</layer>
|
||||
<layer id="1" name="output_shape" type="Const" precision="I32" version="opset1">
|
||||
<data offset="0" size="8"/>
|
||||
<output>
|
||||
<port id="1" precision="I32">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
</output>
|
||||
</layer>
|
||||
<layer id="2" name="scales" type="Const" precision="FP32" version="opset1">
|
||||
<data offset="8" size="8"/>
|
||||
<output>
|
||||
<port id="1" precision="FP32">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
</output>
|
||||
</layer>
|
||||
<layer id="3" name="axes" type="Const" precision="I32" version="opset1">
|
||||
<data offset="16" size="8"/>
|
||||
<output>
|
||||
<port id="1" precision="I32">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
</output>
|
||||
</layer>
|
||||
<layer id="4" name="interpolate" type="Interpolate" precision="FP32" version="opset4">
|
||||
<data antialias="0" coordinate_transformation_mode="asymmetric" cube_coeff="123" mode="nearest" nearest_mode="floor" pads_begin="2,3,4,5" pads_end="6,7,8,9" shape_calculation_mode="sizes"/>
|
||||
<input>
|
||||
<port id="0">
|
||||
<dim>1</dim>
|
||||
<dim>2</dim>
|
||||
<dim>300</dim>
|
||||
<dim>300</dim>
|
||||
</port>
|
||||
<port id="1">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
<port id="2">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
<port id="3">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
</input>
|
||||
<output>
|
||||
<port id="4" precision="FP32">
|
||||
<dim>9</dim>
|
||||
<dim>12</dim>
|
||||
<dim>600</dim>
|
||||
<dim>900</dim>
|
||||
</port>
|
||||
</output>
|
||||
</layer>
|
||||
<layer name="output" type="Result" id="5" precision="FP32" version="opset1">
|
||||
<input>
|
||||
<port id="0">
|
||||
<dim>9</dim>
|
||||
<dim>12</dim>
|
||||
<dim>600</dim>
|
||||
<dim>900</dim>
|
||||
</port>
|
||||
</input>
|
||||
</layer>
|
||||
</layers>
|
||||
<edges>
|
||||
<edge from-layer="0" from-port="0" to-layer="4" to-port="0"/>
|
||||
<edge from-layer="1" from-port="1" to-layer="4" to-port="1"/>
|
||||
<edge from-layer="2" from-port="1" to-layer="4" to-port="2"/>
|
||||
<edge from-layer="3" from-port="1" to-layer="4" to-port="3"/>
|
||||
<edge from-layer="4" from-port="4" to-layer="5" to-port="0"/>
|
||||
</edges>
|
||||
</net>
|
||||
)V0G0N";
|
||||
std::string modelV5 = R"V0G0N(
|
||||
<net name="Network" version="5" precision="FP32" batch="1">
|
||||
<layers>
|
||||
<layer id="0" name="data" precision="FP32" type="Input">
|
||||
<output>
|
||||
<port id="0">
|
||||
<dim>1</dim>
|
||||
<dim>2</dim>
|
||||
<dim>300</dim>
|
||||
<dim>300</dim>
|
||||
</port>
|
||||
</output>
|
||||
</layer>
|
||||
<layer id="1" name="output_shape" precision="I32" type="Const">
|
||||
<output>
|
||||
<port id="0">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
</output>
|
||||
<blobs>
|
||||
<custom offset="0" size="8"/>
|
||||
</blobs>
|
||||
</layer>
|
||||
<layer id="2" name="scales" precision="FP32" type="Const">
|
||||
<output>
|
||||
<port id="0">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
</output>
|
||||
<blobs>
|
||||
<custom offset="8" size="8"/>
|
||||
</blobs>
|
||||
</layer>
|
||||
<layer id="3" name="axes" precision="I32" type="Const">
|
||||
<output>
|
||||
<port id="0">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
</output>
|
||||
<blobs>
|
||||
<custom offset="16" size="8"/>
|
||||
</blobs>
|
||||
</layer>
|
||||
<layer id="4" name="interpolate" precision="FP32" type="Interpolate">
|
||||
<data antialias="False" coordinate_transformation_mode="asymmetric" cube_coeff="123" mode="nearest" nearest_mode="floor" pads_begin="2,3,4,5" pads_end="6,7,8,9" shape_calculation_mode="sizes"/>
|
||||
<input>
|
||||
<port id="0">
|
||||
<dim>1</dim>
|
||||
<dim>2</dim>
|
||||
<dim>300</dim>
|
||||
<dim>300</dim>
|
||||
</port>
|
||||
<port id="1">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
<port id="2">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
<port id="3">
|
||||
<dim>2</dim>
|
||||
</port>
|
||||
</input>
|
||||
<output>
|
||||
<port id="4" precision="FP32">
|
||||
<dim>9</dim>
|
||||
<dim>12</dim>
|
||||
<dim>600</dim>
|
||||
<dim>900</dim>
|
||||
</port>
|
||||
</output>
|
||||
</layer>
|
||||
</layers>
|
||||
<edges>
|
||||
<edge from-layer="0" from-port="0" to-layer="4" to-port="0"/>
|
||||
<edge from-layer="1" from-port="0" to-layer="4" to-port="1"/>
|
||||
<edge from-layer="2" from-port="0" to-layer="4" to-port="2"/>
|
||||
<edge from-layer="3" from-port="0" to-layer="4" to-port="3"/>
|
||||
</edges>
|
||||
</net>
|
||||
)V0G0N";
|
||||
compareIRs(model, modelV5, 24, [](Blob::Ptr& weights) {
|
||||
auto *data = weights->buffer().as<int*>();
|
||||
data[0] = 600;
|
||||
data[1] = 900;
|
||||
data[4] = 2;
|
||||
data[5] = 3;
|
||||
|
||||
auto *fdata = weights->buffer().as<float*>();
|
||||
fdata[2] = 2.0;
|
||||
fdata[3] = 2.0;
|
||||
});
|
||||
}
|
@ -60,6 +60,7 @@ namespace ngraph
|
||||
void set(const std::vector<int64_t>& value) override;
|
||||
static constexpr DiscreteTypeInfo type_info{"AttributeAdapter<AxisSet>", 0};
|
||||
const DiscreteTypeInfo& get_type_info() const override { return type_info; }
|
||||
operator AxisSet&() { return m_ref; }
|
||||
protected:
|
||||
AxisSet& m_ref;
|
||||
std::vector<int64_t> m_buffer;
|
||||
|
@ -38,10 +38,10 @@ op::v0::Interpolate::Interpolate(const Output<Node>& image,
|
||||
|
||||
bool op::v0::Interpolate::visit_attributes(AttributeVisitor& visitor)
|
||||
{
|
||||
visitor.on_attribute("axes", m_attrs.axes);
|
||||
visitor.on_attribute("mode", m_attrs.mode);
|
||||
visitor.on_attribute("align_corners", m_attrs.align_corners);
|
||||
visitor.on_attribute("antialias", m_attrs.antialias);
|
||||
visitor.on_attribute("axes", m_attrs.axes);
|
||||
visitor.on_attribute("mode", m_attrs.mode);
|
||||
visitor.on_attribute("pads_begin", m_attrs.pads_begin);
|
||||
visitor.on_attribute("pads_end", m_attrs.pads_end);
|
||||
return true;
|
||||
|
Loading…
Reference in New Issue
Block a user