mirror of
https://github.com/opencv/opencv.git
synced 2026-09-11 21:01:33 -05:00
Re-enable & triage DISABLED tests for DNN module - #29702 Requires: https://github.com/opencv/opencv_extra/pull/1403 **co-authored by: @varun-jaiswal17** ### PR Changes: ## dnn test cleanup: re-enable stale-disabled tests, fix defect-blind tests, remove redundant coverage ### Removed (dead or unbuildable) - `test_int8_layers.cpp` (1118 lines, removed entirely): cannot compile — `Net::quantize()`, `getInputDetails`/`getOutputDetails` are all gone from `dnn.hpp`/`dnn/src`. Disabled in that same PR (#24980) because on-the-fly quantization was removed — every test in this file called `net.quantize()` to calibrate and run its own int8 conversion. Its own header comment said restore "when test models are quantized outside OpenCV". Pre-quantized ONNX/TFLite test models already do that. ### Removed (redundant or assertion-free) - `Tokenizer_BPE.Tokenizer_GPT2_Model`: line-for-line subset of `Tokenizer_GPT2` — same config, same input, same roundtrip assertion. - `Test_TensorFlow.read_inception`: printed `out.dims` and asserted nothing about the result; `inception_accuracy` loads the same `.pb` and checks it against a reference. - `Test_Caffe_nets` fixture + `INSTANTIATE`: registered **zero** `TEST_P` cases — dead scaffolding for Faster R-CNN tests removed earlier. - `Test_ONNX_nets.Squeezenet`: kernels {1×1, 3×3} and every op type already covered by dedicated layer tests. - `Test_ONNX_nets.VGG16_bn`: single conv kernel (3×3), fully covered by dedicated layer tests; skipped by default anyway under `mem_6gb`. - `Test_ONNX_nets.CaffeNet`: identical op multiset, node count (24) and conv signatures to retained `Alexnet`. - `Test_ONNX_nets.RCNN_ILSVRC13`: `Alexnet` minus `Softmax` (23 vs 24 nodes), identical conv signatures. - `Test_ONNX_nets.Inception_v1`: same op set as retained `Googlenet` (+1 `Reshape`) — Inception v1 *is* GoogLeNet. ### Given real assertions instead of stale expectations - `Test_ONNX_layers.Elementwise_Sqrt`: moved `testONNXModels("sqrt")` below `#endif` — its only work line sat inside `INF_ENGINE_VER_MAJOR_LT(2021040000)`, so without OpenVINO the body compiled to nothing and reported `[ OK ]` on all 3 backends. - `Layer_Test_01D.Clip`: now calls `ClipLayer::create` with `"min"`/`"max"` — it set `lp.type = "Clip"` but constructed `ReLU6Layer::create`, and `runLayer` never reads `layer->type`, so it just re-ran `ReLU6`. - `Layer_Arg_Test`: removed the "disabled" comment, corrected the `convertTo` comment — the comment said the test was disabled while it runs 8 cases, and the second said "convert to float" where the code converts to `CV_64S`. ### Re-enabled as-is (stale disable reasons) - `Test_ONNX_layers.LSTM`/`LSTM_bidirectional` (`test_onnx_importer.cpp:1551,1558`): disabled by #21522 (2022) for poor 1-D-mat handling in the importer of that era; no longer reproduces. - `Test_ONNX_layers.Split_sizes_0d` (`:1373`): disabled by #22652 for a Mul/0-d-tensor shape ambiguity (A×1 vs 1×A); dnn now supports real 1-D Mats, so the output matches the reference exactly. - `DNNTestNetwork.YOLOv8n` ### Library fixes found while re-enabling - `Test_ONNX_layers.LSTM_layout_seq`/`LSTM_layout_batch` (`test_onnx_importer.cpp:1721,1728`): `LSTM2` never transposed `X` for ONNX `layout=1` (batch-first); fixed via `transposeND` gated on `layout==BATCH_SEQ_HID` (`recurrent2_layers.cpp:172`). Fixture also had a leaked loop variable that made the reference a copy of the input; rebuilt by hand since ORT itself refuses to run `layout=1`. - `Test_Graph_Simplifier.ResizeSubgraph` (`test_graph_simplifier.cpp:61`): disabled by the block-layout PR #28585; expectations updated for the `TransformLayout` pass that PR introduced. The test now covers 4 subgraphs rather than 6, because `GatherCastSubgraph` and `MulCastSubgraph` were removed by `0e36cafcf4` and `7669897910` (`Gather`/`Mul` -> `Cast` is no longer fused, since folding it away silently dropped the `Cast`'s dtype semantics). The dynamic-scale `Shape`/`Gather`/`Cast`/`Floor`/`Concat`/`Unsqueeze`/`Slice` chain these models use to compute Resize's scale factor therefore no longer collapses, and the `Mul` survives as `NaryEltwise`, which is why the expected layer lists grew ### Deliberately kept - `ZFNet`: its **7×7** conv appears in no dedicated layer test, and its kernel set {7×7, 5×5, 3×3} differs from `Alexnet`'s {11×11, 5×5, 3×3}. ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work - [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [x] The feature is well documented and sample code can be built with the project CMake
161 lines
6.2 KiB
C++
161 lines
6.2 KiB
C++
// This file is part of OpenCV project.
|
|
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
|
// of this distribution and at http://opencv.org/license.html.
|
|
|
|
#include "test_precomp.hpp"
|
|
|
|
namespace opencv_test { namespace {
|
|
|
|
class Test_Graph_Simplifier : public ::testing::Test {
|
|
public:
|
|
bool required;
|
|
|
|
Test_Graph_Simplifier() : required(true) {}
|
|
|
|
void test_conformance(const std::string &basename, const std::string &expected_layer) {
|
|
test(basename + std::string("/model"), std::vector<std::string>{expected_layer}, std::string("dnn/onnx/conformance/node/"));
|
|
}
|
|
|
|
void test(const std::string &basename, const std::string &expected_layer) {
|
|
test(basename, std::vector<std::string>{expected_layer});
|
|
}
|
|
|
|
void test(const std::string &basename, const std::vector<std::string> &expected_layers, const std::string &model_path_prefix = std::string("dnn/onnx/models/")) {
|
|
std::string model_path = findDataFile(model_path_prefix + basename + std::string(".onnx"), required);
|
|
auto net = readNet(model_path);
|
|
std::vector<std::string> layers;
|
|
net.getLayerTypes(layers);
|
|
|
|
// remove Const, Identity (output layer), __NetInputLayer__ (input layer),
|
|
// TransformLayout (inserted by the block layout pass)
|
|
layers.erase(std::remove_if(layers.begin(), layers.end(), [] (const std::string l) { return l == "Const" || l == "Identity" || l == "__NetInputLayer__" || l == "TransformLayout"; }), layers.end());
|
|
// Instead of 'Tile', 'Expand' etc. we may now have 'Tile2', 'Expand2' etc.
|
|
// We should correctly match them with the respective patterns
|
|
for (auto& l: layers) {
|
|
if (!l.empty() && l[l.size()-1] == '2')
|
|
l = l.substr(0, l.size()-1);
|
|
}
|
|
|
|
EXPECT_EQ(layers, expected_layers);
|
|
}
|
|
};
|
|
|
|
TEST_F(Test_Graph_Simplifier, GeluSubGraph) {
|
|
test("gelu", "Gelu");
|
|
test("bias_gelu", std::vector<std::string>{"Gelu", "NaryEltwise"});
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, GeluApproximationSubGraph) {
|
|
test("gelu_approximation", "GeluApproximation");
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, LayerNormSubGraph) {
|
|
test("layer_norm_expanded", "LayerNormalization");
|
|
test("layer_norm_expanded_with_initializers", "LayerNormalization");
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, LayerNormNoFusionSubGraph) {
|
|
test("layer_norm_no_fusion", std::vector<std::string>{"NaryEltwise", "Reduce", "Sqrt"});
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, ResizeSubgraph) {
|
|
/* Test for 4 subgraphs:
|
|
- UpsampleSubgraph
|
|
- ResizeSubgraph1
|
|
- ResizeSubgraph2
|
|
- ResizeSubgraph3
|
|
*/
|
|
test("upsample_unfused_torch1.2", std::vector<std::string>{"BatchNorm", "Cast", "Concat", "Floor", "Gather", "NaryEltwise", "Resize", "Shape", "Slice", "Unsqueeze"});
|
|
// In the models below the BatchNorm is folded into the preceding convolution by fuseBN().
|
|
test("resize_nearest_unfused_opset11_torch1.3", std::vector<std::string>{"Cast", "Concat", "Conv", "Floor", "Gather", "NaryEltwise", "Resize", "Shape", "Unsqueeze"});
|
|
test("resize_nearest_unfused_opset11_torch1.4", std::vector<std::string>{"Cast", "Concat", "Conv", "Floor", "Gather", "NaryEltwise", "Resize", "Shape", "Slice", "Unsqueeze"});
|
|
test("upsample_unfused_opset9_torch1.4", std::vector<std::string>{"Cast", "Concat", "Conv", "Floor", "Gather", "NaryEltwise", "Resize", "Shape", "Slice", "Unsqueeze"});
|
|
test("two_resizes_with_shared_subgraphs", std::vector<std::string>{"NaryEltwise", "Resize"});
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, SoftmaxSubgraph) {
|
|
/* Test for 3 subgraphs
|
|
- SoftMaxSubgraph
|
|
- SoftMaxSubgraph2 (conformance)
|
|
- LogSoftMaxSubgraph (conformance)
|
|
*/
|
|
test("softmax_unfused", "Softmax");
|
|
test_conformance("test_softmax_example_expanded", "Softmax");
|
|
test_conformance("test_softmax_axis_2_expanded", "Softmax");
|
|
test_conformance("test_softmax_default_axis_expanded", "Softmax");
|
|
test_conformance("test_softmax_axis_0_expanded", "Softmax");
|
|
test_conformance("test_softmax_axis_1_expanded", "Softmax");
|
|
test_conformance("test_softmax_large_number_expanded", "Softmax");
|
|
test_conformance("test_softmax_negative_axis_expanded", "Softmax");
|
|
test_conformance("test_logsoftmax_axis_2_expanded", "Softmax");
|
|
test_conformance("test_logsoftmax_example_1_expanded", "Softmax");
|
|
test_conformance("test_logsoftmax_negative_axis_expanded", "Softmax");
|
|
test_conformance("test_logsoftmax_axis_0_expanded", "Softmax");
|
|
test_conformance("test_logsoftmax_axis_1_expanded", "Softmax");
|
|
test_conformance("test_logsoftmax_large_number_expanded", "Softmax");
|
|
test_conformance("test_logsoftmax_default_axis_expanded", "Softmax");
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, HardSwishSubgraph) {
|
|
test_conformance("test_hardswish_expanded", "HardSwish");
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, CeluSubgraph) {
|
|
test_conformance("test_celu_expanded", "Celu");
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, NormalizeSubgraph) {
|
|
/* Test for 6 subgraphs
|
|
- NormalizeSubgraph1
|
|
- NormalizeSubgraph2
|
|
- NormalizeSubgraph2_2
|
|
- NormalizeSubgraph3
|
|
- NormalizeSubgraph4
|
|
- NormalizeSubgraph5
|
|
*/
|
|
test("reduceL2_subgraph_2", "Normalize");
|
|
test("reduceL2_subgraph", "Normalize");
|
|
test("normalize_fusion", "Normalize");
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, BatchNormalizationSubgraph) {
|
|
/* Test for 2 subgraphs
|
|
- BatchNormalizationSubgraph1
|
|
- BatchNormalizationSubgraph2
|
|
*/
|
|
test("frozenBatchNorm2d", "BatchNorm");
|
|
test("batch_norm_subgraph", "BatchNorm");
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, ExpandSubgraph) {
|
|
test("expand_neg_batch", "Expand");
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, MishSubgraph) {
|
|
/* Test for 2 subgraphs
|
|
- SoftplusSubgraph
|
|
- MishSubgraph
|
|
*/
|
|
test("mish_no_softplus", "Mish");
|
|
test("mish", "Mish");
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, AttentionSubgraph) {
|
|
/* Test for 2 subgraphs
|
|
- AttentionSubgraph
|
|
- AttentionSingleHeadSubgraph
|
|
*/
|
|
test("attention", "Attention");
|
|
test("attention_single_head", "Attention");
|
|
}
|
|
|
|
TEST_F(Test_Graph_Simplifier, BiasedMatMulSubgraph) {
|
|
/* Test for 1 subgraphs
|
|
- BiasedMatMulSubgraph
|
|
*/
|
|
const std::string expected = "Gemm";
|
|
test("biased_matmul", expected);
|
|
}
|
|
|
|
}}
|