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:
Evgeny Lazarev 2020-09-03 16:00:46 +03:00 committed by GitHub
parent d9e9abcf50
commit f60b46f3d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 198 additions and 37 deletions

View File

@ -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(

View File

@ -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);

View File

@ -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;
});
}

View File

@ -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;

View File

@ -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;