nareshmlx/opencv-pr huggingface dataset:
**File:** modules/dnn/src/layer_internals.hpp
**Change Type:** modified
**Context:** PR #25555: Disabled conversion to float of model's input
**Review Line:** 160

**Code Changes:**
```diff
-            if (inputsData[i].type() == CV_32S || inputsData[i].type() == CV_64S) {
+            if (inputsData[i].type() != CV_32F)
+            {
                 CV_CheckTypeEQ(outputs[i].type(), inputsData[i].type(), "");
-                CV_Assert(means[i] == Scalar() && scaleFactors[i] == 1.0);
+                CV_CheckTrue(means[i] == Scalar() && scaleFactors[i] == 1.0, "Input mean and scale are supported only for float32 input");
                 inputsData[i].copyTo(outputs[i]);
                 continue;
             }
@@ -221,9 +222,10 @@ struct DataLayer : public Layer
         for (int i = 0; i < inputsData.size(); ++i)
```

Review comment:
Make it a warning (or info log) instead? It does not crash the program in case users give mean and scale if input is of type other than float (which is rare though) and can have better experience I thought.
**File:** modules/dnn/src/onnx/onnx_importer.cpp
**Change Type:** modified
**Context:** PR #25555: Disabled conversion to float of model's input
**Review Line:** 4119

**Code Changes:**
```diff
@@ -4116,7 +4116,7 @@ Mat readTensorFromONNX(const String& path)
     {
         CV_Error(Error::StsUnsupportedFormat, cv::format("Failed to parse ONNX data: %s", path.c_str()));
     }
-    Mat mat = getMatFromTensor(tensor_proto);
+    Mat mat = getMatFromTensor(tensor_proto, false);
     releaseONNXTensor(tensor_proto);
     return mat;
 }
```

Review comment:
If conversion is set to off by default for all cases, why not just remove the conversion?
**File:** modules/dnn/src/onnx/onnx_importer.cpp
**Change Type:** modified
**Context:** PR #25555: Disabled conversion to float of model's input
**Review Line:** 4119

**Code Changes:**
```diff
@@ -4116,7 +4116,7 @@ Mat readTensorFromONNX(const String& path)
     {
         CV_Error(Error::StsUnsupportedFormat, cv::format("Failed to parse ONNX data: %s", path.c_str()));
     }
-    Mat mat = getMatFromTensor(tensor_proto);
+    Mat mat = getMatFromTensor(tensor_proto, false);
     releaseONNXTensor(tensor_proto);
     return mat;
 }
```

Review comment:
getMatFromTensor is used in several places in onnx_importer.cpp and onnx_graph_simplifier.cpp. Removing the conversion breaks several tests.
**File:** modules/dnn/src/layer_internals.hpp
**Change Type:** modified
**Context:** PR #25555: Disabled conversion to float of model's input
**Review Line:** 160

**Code Changes:**
```diff
-            if (inputsData[i].type() == CV_32S || inputsData[i].type() == CV_64S) {
+            if (inputsData[i].type() != CV_32F)
+            {
                 CV_CheckTypeEQ(outputs[i].type(), inputsData[i].type(), "");
-                CV_Assert(means[i] == Scalar() && scaleFactors[i] == 1.0);
+                CV_CheckTrue(means[i] == Scalar() && scaleFactors[i] == 1.0, "Input mean and scale are supported only for float32 input");
                 inputsData[i].copyTo(outputs[i]);
                 continue;
             }
@@ -221,9 +222,10 @@ struct DataLayer : public Layer
         for (int i = 0; i < inputsData.size(); ++i)
```

Review comment:
I don't agree. If the program crashes and prints that the input is not supported, the user just easily fixes the input. I think that is a normal experience with a library. If a user sets mean and scale, but we ignore it, the model returns a wrong result. It is not guaranteed that the user notices the warning message or notices the wrong result, so he will have some problems later that will be hard to find.
**File:** modules/dnn/src/layer_internals.hpp
**Change Type:** modified
**Context:** PR #25555: Disabled conversion to float of model's input
**Review Line:** 160

**Code Changes:**
```diff
-            if (inputsData[i].type() == CV_32S || inputsData[i].type() == CV_64S) {
+            if (inputsData[i].type() != CV_32F)
+            {
                 CV_CheckTypeEQ(outputs[i].type(), inputsData[i].type(), "");
-                CV_Assert(means[i] == Scalar() && scaleFactors[i] == 1.0);
+                CV_CheckTrue(means[i] == Scalar() && scaleFactors[i] == 1.0, "Input mean and scale are supported only for float32 input");
                 inputsData[i].copyTo(outputs[i]);
                 continue;
             }
@@ -221,9 +222,10 @@ struct DataLayer : public Layer
         for (int i = 0; i < inputsData.size(); ++i)
```

Review comment:
Agree with Alexander.
**File:** modules/dnn/src/tflite/tflite_importer.cpp
**Change Type:** modified
**Context:** PR #25297: Support Transpose op in TFlite
**Review Line:** 765

**Code Changes:**
```diff
+    else {
+        layerParams.set("order", DictValue::arrayInt<int*>(perm.data(), perm.size()));
+    }
+
+    addLayer(layerParams, op);
+}
+
 int TFLiteImporter::addPermuteLayer(const std::vector<int>& order, const std::string& permName,
                                     const std::pair<int, int>& inpId, int dtype)
 {
```

Review comment:
Check layout and do NHWC->NCHW conversion of the axes if needed
**File:** modules/dnn/test/test_tflite_importer.cpp
**Change Type:** modified
**Context:** PR #25297: Support Transpose op in TFlite

**Code Changes:**
```diff
@@ -251,6 +251,15 @@ TEST_P(Test_TFLite, fully_connected) {
     testLayer("fully_connected");
 }
 
+TEST_P(Test_TFLite, permute) {
+    testLayer("permutation_3d");
+    // Temporarily disabled as TFLiteConverter produces a incorrect graph in this case
+    //testLayer("permutation_4d_0123");
+    testLayer("permutation_4d_0132");
+    testLayer("permutation_4d_0213");
```

Review comment:
```suggestion ASSERT_EQ(ref.size, outs[i].size); ```
**File:** modules/dnn/src/tflite/tflite_importer.cpp
**Change Type:** modified
**Context:** PR #25297: Support Transpose op in TFlite

**Code Changes:**
```diff
@@ -70,6 +70,7 @@ class TFLiteImporter {
     void parseFullyConnected(const Operator& op, const std::string& opcode, LayerParams& layerParams);
     void parseSoftmax(const Operator& op, const std::string& opcode, LayerParams& layerParams);
     void parseCast(const Operator& op, const std::string& opcode, LayerParams& layerParams);
+    void parseTranspose(const Operator& op, const std::string& opcode, LayerParams& layerParams);
 
     void parseFusedActivation(const Operator& op, ActivationFunctionType activ);
     void parseActivation(const Operator& op, const std::string& opcode, LayerParams& layerParams, bool isFused);
@@ -284,6 +285,7 @@ TFLiteImporter::DispatchMap TFLiteImporter::buildDispatchMap()
     dispatch["SOFTMAX"] = &TFLiteImporter::parseSoftmax;
```

Review comment:
Also, change layout of output: https://github.com/opencv/opencv/blob/197626a5bf6e6347122937fe44a204474c73b7ac/modules/dnn/src/tensorflow/tf_importer.cpp#L1339
**File:** modules/dnn/src/tflite/tflite_importer.cpp
**Change Type:** modified
**Context:** PR #25297: Support Transpose op in TFlite
**Review Line:** 742

**Code Changes:**
```diff
+        if (perm[0] != 0) {
+            CV_Error(Error::StsParseError, "The first axis should not be permuted.");
+        }
+        if (perm[1] == 1 && perm[2] == 2 && perm[3] == 3) {
+            std::vector<int> orderLP = {0, 1, 2, 3};
+            layerParams.set("order", DictValue::arrayInt<int*>(orderLP.data(), orderLP.size()));
+            layouts[op.outputs()->Get(0)] = DNN_LAYOUT_NCHW;
+        }
+        else if (perm[1] == 1 && perm[2] == 3 && perm[3] == 2) {
+            std::vector<int> orderLP = {0, 3, 2, 1};
+            layerParams.set("order", DictValue::arrayInt<int*>(orderLP.data(), orderLP.size()));
```

Review comment:
reduce code duplications
**File:** modules/dnn/src/tflite/tflite_importer.cpp
**Change Type:** modified
**Context:** PR #25297: Support Transpose op in TFlite
**Review Line:** 748

**Code Changes:**
```diff
+            layouts[op.outputs()->Get(0)] = DNN_LAYOUT_NCHW;
+        }
+        else if (perm[1] == 1 && perm[2] == 3 && perm[3] == 2) {
+            std::vector<int> orderLP = {0, 3, 2, 1};
+            layerParams.set("order", DictValue::arrayInt<int*>(orderLP.data(), orderLP.size()));
+        }
+        else if (perm[1] == 2 && perm[2] == 1 && perm[3] == 3) {
+            std::vector<int> orderLP = {0, 1, 3, 2};
+            layerParams.set("order", DictValue::arrayInt<int*>(orderLP.data(), orderLP.size()));
+            layouts[op.outputs()->Get(0)] = DNN_LAYOUT_NCHW;
+        }
```

Review comment:
Incorrect permutation. In TensorFlow it's NHWC->NHCW so in OpenCV it should be also NCHW->NHCW. So order is `{0, 2, 1, 3}`
**File:** modules/dnn/include/opencv2/dnn/dnn.hpp
**Change Type:** modified
**Context:** PR #25591: remove dnn::layer::allocate in doc

**Code Changes:**
```diff
@@ -214,7 +214,7 @@ CV__DNN_INLINE_NS_BEGIN
 
     /** @brief This interface class allows to build new Layers - are building blocks of networks.
      *
-     * Each class, derived from Layer, must implement allocate() methods to declare own outputs and forward() to compute outputs.
+     * Each class, derived from Layer, must implement forward() method to compute outputs.
      * Also before using the new layer into networks you must register your layer by using one of @ref dnnLayerFactory "LayerFactory" macros.
      */
     class CV_EXPORTS_W Layer : public Algorithm
```

Review comment:
`forward()` method
**File:** CMakeLists.txt
**Change Type:** modified
**Context:** PR #25443: Integrate ARM KleidiCV as OpenCV HAL

**Code Changes:**
```diff
@@ -13,7 +13,6 @@ FATAL: In-source builds are not allowed.
 ")
 endif()
 
-
 include(cmake/OpenCVMinDepVersions.cmake)
 
 if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
@@ -258,6 +257,8 @@ OCV_OPTION(WITH_CAP_IOS "Enable iOS video capture" ON
   VERIFY HAVE_CAP_IOS)
```

Review comment:
There is CMake's `<project>_SOURCE_DIR` for that: https://cmake.org/cmake/help/latest/variable/PROJECT-NAME_SOURCE_DIR.html Should be used as `OpenCV_SOURCE_DIR`.
**File:** CMakeLists.txt
**Change Type:** modified
**Context:** PR #25443: Integrate ARM KleidiCV as OpenCV HAL
**Review Line:** 1002

**Code Changes:**
```diff
@@ -990,6 +998,10 @@ foreach(hal ${OpenCV_HAL})
     else()
       message(STATUS "Carotene: NEON is not available, disabling carotene...")
     endif()
+  elseif(hal STREQUAL "kleidicv")
+    add_subdirectory(3rdparty/kleidicv)
+    ocv_hal_register(KLEIDICV_HAL_LIBRARIES KLEIDICV_HAL_HEADERS KLEIDICV_HAL_INCLUDE_DIRS)
+    list(APPEND OpenCV_USED_HAL "KleidiCV (ver ${KLEIDICV_HAL_VERSION})")
   elseif(hal STREQUAL "openvx")
     add_subdirectory(3rdparty/openvx)
     ocv_hal_register(OPENVX_HAL_LIBRARIES OPENVX_HAL_HEADERS OPENVX_HAL_INCLUDE_DIRS)
```

Review comment:
This is for OpenCV's 3rdparty "builtin" optimizations only. Added case is external library and we should use here generic approach without specific implementation details). 1. See on the "else()" branch which uses `find_package()` - library should provide CMake's scripts for detection / usage. 2. Also we could add "PATH" support (e.g. through `if (IS_DIRECTORY "${hal}")` check)
**File:** CMakeLists.txt
**Change Type:** modified
**Context:** PR #25443: Integrate ARM KleidiCV as OpenCV HAL
**Review Line:** 1002

**Code Changes:**
```diff
@@ -990,6 +998,10 @@ foreach(hal ${OpenCV_HAL})
     else()
       message(STATUS "Carotene: NEON is not available, disabling carotene...")
     endif()
+  elseif(hal STREQUAL "kleidicv")
+    add_subdirectory(3rdparty/kleidicv)
+    ocv_hal_register(KLEIDICV_HAL_LIBRARIES KLEIDICV_HAL_HEADERS KLEIDICV_HAL_INCLUDE_DIRS)
+    list(APPEND OpenCV_USED_HAL "KleidiCV (ver ${KLEIDICV_HAL_VERSION})")
   elseif(hal STREQUAL "openvx")
     add_subdirectory(3rdparty/openvx)
     ocv_hal_register(OPENVX_HAL_LIBRARIES OPENVX_HAL_HEADERS OPENVX_HAL_INCLUDE_DIRS)
```

Review comment:
Can KleidiCV be integrated via [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) please? In that way it can be treated more like the other 3rdparty HALs, and can be enabled in OpenCV with a simple `-DWITH_KLEIDICV=ON` cmake argument.
**File:** 3rdparty/kleidicv/CMakeLists.txt
**Change Type:** added
**Context:** PR #25443: Integrate ARM KleidiCV as OpenCV HAL

**Code Changes:**
```diff
@@ -0,0 +1,23 @@
+project(kleidicv_hal)
+
+set(KLEIDICV_SOURCE_PATH "" CACHE PATH "Directory containing KleidiCV sources")
+ocv_update(KLEIDICV_SRC_COMMIT "a9971ba8bf1d8b008a32c6ed8fea05cd8eb16748")
+ocv_update(KLEIDICV_SRC_HASH "53d1d80620395a12c7fee91460499368")
+
+if(KLEIDICV_SOURCE_PATH)
+  set(THE_ROOT "${KLEIDICV_SOURCE_PATH}")
+else()
```

Review comment:
no space after `if`
**File:** 3rdparty/kleidicv/CMakeLists.txt
**Change Type:** added
**Context:** PR #25443: Integrate ARM KleidiCV as OpenCV HAL

**Code Changes:**
```diff
@@ -0,0 +1,23 @@
+project(kleidicv_hal)
+
+set(KLEIDICV_SOURCE_PATH "" CACHE PATH "Directory containing KleidiCV sources")
+ocv_update(KLEIDICV_SRC_COMMIT "a9971ba8bf1d8b008a32c6ed8fea05cd8eb16748")
+ocv_update(KLEIDICV_SRC_HASH "53d1d80620395a12c7fee91460499368")
+
+if(KLEIDICV_SOURCE_PATH)
+  set(THE_ROOT "${KLEIDICV_SOURCE_PATH}")
+else()
```

Review comment:
Define variables through ocv_update instead of hardcoding (see ffmpeg for example)
**File:** CMakeLists.txt
**Change Type:** modified
**Context:** PR #25443: Integrate ARM KleidiCV as OpenCV HAL
**Review Line:** 16

**Code Changes:**
```diff
@@ -13,7 +13,6 @@ FATAL: In-source builds are not allowed.
 ")
 endif()
 
-
 include(cmake/OpenCVMinDepVersions.cmake)
 
 if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
@@ -258,6 +257,8 @@ OCV_OPTION(WITH_CAP_IOS "Enable iOS video capture" ON
   VERIFY HAVE_CAP_IOS)
 OCV_OPTION(WITH_CAROTENE "Use NVidia carotene acceleration library for ARM platform" (NOT CV_DISABLE_OPTIMIZATION)
```

Review comment:
unrelated change
**File:** CMakeLists.txt
**Change Type:** modified
**Context:** PR #25443: Integrate ARM KleidiCV as OpenCV HAL
**Review Line:** 973

**Code Changes:**
```diff
 endif()
 
+if(WITH_KLEIDICV)
+  ocv_debug_message(STATUS "Enable KleidiCV acceleration")
+  if(NOT ";${OpenCV_HAL};" MATCHES ";kleidicv;")
+    set(OpenCV_HAL "kleidicv;${OpenCV_HAL}")
+  endif()
+endif()
+
 if(WITH_CAROTENE)
   ocv_debug_message(STATUS "Enable carotene acceleration")
```

Review comment:
In case of carotine enabled it seems to have higher priority.
**File:** 3rdparty/kleidicv/CMakeLists.txt
**Change Type:** added
**Context:** PR #25443: Integrate ARM KleidiCV as OpenCV HAL

**Code Changes:**
```diff
@@ -0,0 +1,23 @@
+project(kleidicv_hal)
+
+set(KLEIDICV_SOURCE_PATH "" CACHE PATH "Directory containing KleidiCV sources")
+ocv_update(KLEIDICV_SRC_COMMIT "a9971ba8bf1d8b008a32c6ed8fea05cd8eb16748")
+ocv_update(KLEIDICV_SRC_HASH "53d1d80620395a12c7fee91460499368")
+
+if(KLEIDICV_SOURCE_PATH)
+  set(THE_ROOT "${KLEIDICV_SOURCE_PATH}")
+else()
```

Review comment:
not HASH only, but commit SHA and download URL BASE (to support GitHub mirrors)
**File:** CMakeLists.txt
**Change Type:** modified
**Context:** PR #25443: Integrate ARM KleidiCV as OpenCV HAL
**Review Line:** 973

**Code Changes:**
```diff
 endif()
 
+if(WITH_KLEIDICV)
+  ocv_debug_message(STATUS "Enable KleidiCV acceleration")
+  if(NOT ";${OpenCV_HAL};" MATCHES ";kleidicv;")
+    set(OpenCV_HAL "kleidicv;${OpenCV_HAL}")
+  endif()
+endif()
+
 if(WITH_CAROTENE)
   ocv_debug_message(STATUS "Enable carotene acceleration")
```

Review comment:
Please put `if(WITH_KLEIDICV)` back above `if(WITH_CAROTENE)`, as it was before. `WITH_KLEIDICV` should default to `OFF` before this patch lands, but for the purposes of CI it's interesting to see what builds with it `ON`. Since `WITH_KLEIDICV` will default to `OFF` and `WITH_CAROTENE` will default to `ON`, it's better that `WITH_KLEIDICV` takes precedence when you do explicitly set it to `ON`.
**File:** samples/dnn/models.yml
**Change Type:** modified
**Context:** PR #25559: Improved segmentation sample
**Review Line:** 250

**Code Changes:**
```diff
-  scale: 1.0
+    url: "https://github.com/onnx/models/raw/491ce05590abb7551d7fae43c067c060eeb575a6/validated/vision/object_detection_segmentation/fcn/model/fcn-resnet50-12.onnx"
+    sha1: "1bb0c7e0034038969aecc6251166f1612a139230"
+  model: "fcn-resnet50-12.onnx"
+  mean: [103.5, 116.2, 123.6]
+  scale: 0.019
   width: 500
   height: 500
   rgb: false
@@ -265,3 +264,15 @@ fcnresnet101:
   height: 500
```

Review comment:
`sample` is missing.
**File:** modules/dnn/src/layers/tile_layer.cpp
**Change Type:** modified
**Context:** PR #25409: 0/1D test for tile layer

**Code Changes:**
```diff
@@ -42,14 +42,20 @@ class TileLayerImpl CV_FINAL : public TileLayer
         CV_CheckEQ(inputs.size(), 1ull, "Tile: one input is expected");
 
         // repeats must have the same length as input's dimension number
-        // FIXIT: it breaks when the input is 1d tensor (represented as 2d mat with size=2 in opencv dnn)
-        CV_CheckEQ(inputs[0].size(), repeats.size(), "Tile: repeats must be a 1D tensor of the same length as input's dimension number");
-
-        outputs.assign(1, inputs[0]);
-        for (int i = 0; i < repeats.size(); i++)
-        {
```

Review comment:
Please remove irrelevant comments and dead code.
**File:** modules/dnn/src/layers/tile_layer.cpp
**Change Type:** modified
**Context:** PR #25409: 0/1D test for tile layer

**Code Changes:**
```diff
@@ -42,14 +42,20 @@ class TileLayerImpl CV_FINAL : public TileLayer
         CV_CheckEQ(inputs.size(), 1ull, "Tile: one input is expected");
 
         // repeats must have the same length as input's dimension number
-        // FIXIT: it breaks when the input is 1d tensor (represented as 2d mat with size=2 in opencv dnn)
-        CV_CheckEQ(inputs[0].size(), repeats.size(), "Tile: repeats must be a 1D tensor of the same length as input's dimension number");
-
-        outputs.assign(1, inputs[0]);
-        for (int i = 0; i < repeats.size(); i++)
-        {
```

Review comment:
"leats" - typo.
**File:** modules/dnn/src/layers/tile_layer.cpp
**Change Type:** modified
**Context:** PR #25409: 0/1D test for tile layer

**Code Changes:**
```diff
@@ -42,14 +42,20 @@ class TileLayerImpl CV_FINAL : public TileLayer
         CV_CheckEQ(inputs.size(), 1ull, "Tile: one input is expected");
 
         // repeats must have the same length as input's dimension number
-        // FIXIT: it breaks when the input is 1d tensor (represented as 2d mat with size=2 in opencv dnn)
-        CV_CheckEQ(inputs[0].size(), repeats.size(), "Tile: repeats must be a 1D tensor of the same length as input's dimension number");
-
-        outputs.assign(1, inputs[0]);
-        for (int i = 0; i < repeats.size(); i++)
-        {
```

Review comment:
anything -> any
**File:** modules/dnn/test/test_layers_1d.cpp
**Change Type:** modified
**Context:** PR #25409: 0/1D test for tile layer

**Code Changes:**
```diff
@@ -682,6 +682,48 @@ INSTANTIATE_TEST_CASE_P(/*nothing*/, Layer_Const_Test, testing::Values(
     std::vector<int>({4, 1})
     ));
 
+typedef testing::TestWithParam<std::vector<int>> Layer_Tile_Test;
+TEST_P(Layer_Tile_Test, Accuracy_01D){
+
+    std::vector<int> input_shape = GetParam();
+    std::vector<int> repeats = {2, 2};
+
```

Review comment:
tuple is redundant.
**File:** modules/dnn/test/test_layers_1d.cpp
**Change Type:** modified
**Context:** PR #25409: 0/1D test for tile layer

**Code Changes:**
```diff
@@ -682,6 +682,48 @@ INSTANTIATE_TEST_CASE_P(/*nothing*/, Layer_Const_Test, testing::Values(
     std::vector<int>({4, 1})
     ));
 
+typedef testing::TestWithParam<std::vector<int>> Layer_Tile_Test;
+TEST_P(Layer_Tile_Test, Accuracy_01D){
+
+    std::vector<int> input_shape = GetParam();
+    std::vector<int> repeats = {2, 2};
+
```

Review comment:
Why tests removed?
**File:** modules/dnn/test/test_layers_1d.cpp
**Change Type:** modified
**Context:** PR #25409: 0/1D test for tile layer

**Code Changes:**
```diff
@@ -682,6 +682,48 @@ INSTANTIATE_TEST_CASE_P(/*nothing*/, Layer_Const_Test, testing::Values(
     std::vector<int>({4, 1})
     ));
 
+typedef testing::TestWithParam<std::vector<int>> Layer_Tile_Test;
+TEST_P(Layer_Tile_Test, Accuracy_01D){
+
+    std::vector<int> input_shape = GetParam();
+    std::vector<int> repeats = {2, 2};
+
```

Review comment:
Removed test?
**File:** modules/dnn/test/test_layers_1d.cpp
**Change Type:** modified
**Context:** PR #25409: 0/1D test for tile layer

**Code Changes:**
```diff
@@ -682,6 +682,48 @@ INSTANTIATE_TEST_CASE_P(/*nothing*/, Layer_Const_Test, testing::Values(
     std::vector<int>({4, 1})
     ));
 
+typedef testing::TestWithParam<std::vector<int>> Layer_Tile_Test;
+TEST_P(Layer_Tile_Test, Accuracy_01D){
+
+    std::vector<int> input_shape = GetParam();
+    std::vector<int> repeats = {2, 2};
+
```

Review comment:
Ahh, I rebased somehthing wrong
**File:** modules/dnn/src/layers/tile_layer.cpp
**Change Type:** modified
**Context:** PR #25409: 0/1D test for tile layer
**Review Line:** 106

**Code Changes:**
```diff
-                tmp = cv::repeat(tmp, 1, rep_i);
+                tmp = cv::repeat(tmp, repeats[i], 1);
+                dims *= out_shape[i];
             }
-            dims *= out_shape[i];
+            tmp = tmp.reshape(0, out_shape);
         }
-        tmp = tmp.reshape(0, out_shape);
-
         tmp.copyTo(out);
     }
```

Review comment:
Do these changes imply we need to do something to `cv::repeat` so that it can be used in the same way regardless 1D or 2D mat?
**File:** modules/dnn/src/layers/tile_layer.cpp
**Change Type:** modified
**Context:** PR #25409: 0/1D test for tile layer

**Code Changes:**
```diff
@@ -42,14 +42,20 @@ class TileLayerImpl CV_FINAL : public TileLayer
         CV_CheckEQ(inputs.size(), 1ull, "Tile: one input is expected");
 
         // repeats must have the same length as input's dimension number
-        // FIXIT: it breaks when the input is 1d tensor (represented as 2d mat with size=2 in opencv dnn)
-        CV_CheckEQ(inputs[0].size(), repeats.size(), "Tile: repeats must be a 1D tensor of the same length as input's dimension number");
-
-        outputs.assign(1, inputs[0]);
-        for (int i = 0; i < repeats.size(); i++)
-        {
```

Review comment:
"Tile: Provide at least one repeat along any dimension"
**File:** modules/dnn/src/layers/blank_layer.cpp
**Change Type:** modified
**Context:** PR #25458: Added int support for OpenVINO dnn backend
**Review Line:** 164

**Code Changes:**
```diff
                                         const std::vector<Ptr<BackendNode> >& nodes) CV_OVERRIDE
     {
         auto ieInpNode = nodes[0].dynamicCast<InfEngineNgraphNode>()->node;
-        ov::OutputVector inp{ieInpNode};
-        auto blank = std::make_shared<ov::op::v0::Concat>(inp, 0);
+        auto blank = std::make_shared<ov::op::v1::ConvertLike>(ieInpNode, ieInpNode);
         return Ptr<BackendNode>(new InfEngineNgraphNode(blank));
     }
 #endif  // HAVE_DNN_NGRAPH
```

Review comment:
Concat doesn't work here when with 0d tensors
**File:** modules/dnn/src/ie_ngraph.cpp
**Change Type:** modified
**Context:** PR #25458: Added int support for OpenVINO dnn backend
**Review Line:** 494

**Code Changes:**
```diff
 
@@ -445,6 +491,7 @@ NgraphBackendWrapper::NgraphBackendWrapper(int targetId, const cv::Mat& m)
     , host((Mat*)&m)
 {
     blob = wrapToNgraphBlob(m);
+    hostMatDepth = m.depth();
 }
 
 NgraphBackendWrapper::NgraphBackendWrapper(Ptr<BackendWrapper> wrapper)
```

Review comment:
unused variable
**File:** modules/dnn/src/layers/blank_layer.cpp
**Change Type:** modified
**Context:** PR #25458: Added int support for OpenVINO dnn backend
**Review Line:** 164

**Code Changes:**
```diff
                                         const std::vector<Ptr<BackendNode> >& nodes) CV_OVERRIDE
     {
         auto ieInpNode = nodes[0].dynamicCast<InfEngineNgraphNode>()->node;
-        ov::OutputVector inp{ieInpNode};
-        auto blank = std::make_shared<ov::op::v0::Concat>(inp, 0);
+        auto blank = std::make_shared<ov::op::v1::ConvertLike>(ieInpNode, ieInpNode);
         return Ptr<BackendNode>(new InfEngineNgraphNode(blank));
     }
 #endif  // HAVE_DNN_NGRAPH
```

Review comment:
Please add cv_assert with comment then.