nareshmlx/opencv-pr huggingface dataset:
**File:** samples/dnn/face_match.py
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,57 @@
+import argparse
+
+import numpy as np
+import cv2 as cv
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--input1', '-i1', type=str, help='Path to the input image1.')
+parser.add_argument('--input2', '-i2', type=str, help='Path to the input image2.')
+parser.add_argument('--face_detection_model', '-fd', type=str, help='Path to the face detection model. Download the model at https://github.com/ShiqiYu/libfacedetection.train/tree/master/tasks/task1/onnx.')
```

Review comment:
Update threshold
**File:** samples/dnn/face_match.py
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,57 @@
+import argparse
+
+import numpy as np
+import cv2 as cv
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--input1', '-i1', type=str, help='Path to the input image1.')
+parser.add_argument('--input2', '-i2', type=str, help='Path to the input image2.')
+parser.add_argument('--face_detection_model', '-fd', type=str, help='Path to the face detection model. Download the model at https://github.com/ShiqiYu/libfacedetection.train/tree/master/tasks/task1/onnx.')
```

Review comment:
update threshold
**File:** modules/dnn/src/tensorflow/tf_importer.cpp
**Change Type:** modified
**Context:** PR #20466: Add Max layer to TF
**Review Line:** 650

**Code Changes:**
```diff
@@ -647,7 +647,7 @@ const TFImporter::DispatchMap TFImporter::buildDispatchMap()
     dispatch["PriorBox"] = &TFImporter::parsePriorBox;
     dispatch["Softmax"] = &TFImporter::parseSoftmax;
     dispatch["CropAndResize"] = &TFImporter::parseCropAndResize;
-    dispatch["Mean"] = dispatch["Sum"] = &TFImporter::parseMean;
+    dispatch["Mean"] = dispatch["Sum"] = dispatch["Max"] = &TFImporter::parseMean;
     dispatch["Pack"] = &TFImporter::parsePack;
     dispatch["ClipByValue"] = &TFImporter::parseClipByValue;
     dispatch["LeakyRelu"] = &TFImporter::parseLeakyRelu;
@@ -657,6 +657,7 @@ const TFImporter::DispatchMap TFImporter::buildDispatchMap()
     return dispatch;
```

Review comment:
I suppose "Min" can be handled too.
**File:** modules/dnn/src/tensorflow/tf_importer.cpp
**Change Type:** modified
**Context:** PR #20466: Add Max layer to TF
**Review Line:** 650

**Code Changes:**
```diff
@@ -647,7 +647,7 @@ const TFImporter::DispatchMap TFImporter::buildDispatchMap()
     dispatch["PriorBox"] = &TFImporter::parsePriorBox;
     dispatch["Softmax"] = &TFImporter::parseSoftmax;
     dispatch["CropAndResize"] = &TFImporter::parseCropAndResize;
-    dispatch["Mean"] = dispatch["Sum"] = &TFImporter::parseMean;
+    dispatch["Mean"] = dispatch["Sum"] = dispatch["Max"] = &TFImporter::parseMean;
     dispatch["Pack"] = &TFImporter::parsePack;
     dispatch["ClipByValue"] = &TFImporter::parseClipByValue;
     dispatch["LeakyRelu"] = &TFImporter::parseLeakyRelu;
@@ -657,6 +657,7 @@ const TFImporter::DispatchMap TFImporter::buildDispatchMap()
     return dispatch;
```

Review comment:
For this https://github.com/opencv/opencv/issues/20438 for example.
**File:** samples/gdb/mat_pretty_printer.py
**Change Type:** added
**Context:** PR #20547: Add gdb pretty printer for cv::Mat

**Code Changes:**
```diff
@@ -0,0 +1,212 @@
+import gdb
+import numpy as np
+from enum import Enum
+
+np.set_printoptions(suppress=True)  # prevent numpy exponential notation on print, default False
+# np.set_printoptions(threshold=sys.maxsize)
+
+
+def conv(obj, t):
```

Review comment:
It probably may be written like this: ```python steps = np.asarray(int(ptr) for ptr in to_list(m['step']['p'], range(size.dims()), dtype=np.int64) ``` In general, (a for a in b) construction (which is [generator expression](https://docs.python.org/3/reference/expressions.html#generator-expressions)) occurs often, useful, and reads more clear than functional-style code (map, reduce, etc.).
**File:** samples/gdb/mat_pretty_printer.py
**Change Type:** added
**Context:** PR #20547: Add gdb pretty printer for cv::Mat

**Code Changes:**
```diff
@@ -0,0 +1,212 @@
+import gdb
+import numpy as np
+from enum import Enum
+
+np.set_printoptions(suppress=True)  # prevent numpy exponential notation on print, default False
+# np.set_printoptions(threshold=sys.maxsize)
+
+
+def conv(obj, t):
```

Review comment:
inheritance from `object` is not needed in modern python (any python 3)
**File:** samples/gdb/mat_pretty_printer.py
**Change Type:** added
**Context:** PR #20547: Add gdb pretty printer for cv::Mat
**Review Line:** 138

**Code Changes:**
```diff
+            return
+
+        if dtype != np.float16:
+            ctype = gdb.lookup_type(ctype)
+            ptr = ptr.cast(ctype.array(length - 1).pointer()).dereference()
+            self.mat = np.array([ptr[i] for i in range(length)], dtype=dtype)
+        else:
+            u16 = gdb.lookup_type('uint16_t')
+            ptr = ptr.cast(u16.array(length - 1).pointer()).dereference()
+            self.mat = np.array([ptr[i] for i in range(length)], dtype=np.uint16)
+            self.mat = self.mat.view(np.float16)
```

Review comment:
probably, we iterate over all items in `ptr` here? Are there any scenarios when length != len(ptr) ?
**File:** samples/gdb/mat_pretty_printer.py
**Change Type:** added
**Context:** PR #20547: Add gdb pretty printer for cv::Mat
**Review Line:** 138

**Code Changes:**
```diff
+            return
+
+        if dtype != np.float16:
+            ctype = gdb.lookup_type(ctype)
+            ptr = ptr.cast(ctype.array(length - 1).pointer()).dereference()
+            self.mat = np.array([ptr[i] for i in range(length)], dtype=dtype)
+        else:
+            u16 = gdb.lookup_type('uint16_t')
+            ptr = ptr.cast(u16.array(length - 1).pointer()).dereference()
+            self.mat = np.array([ptr[i] for i in range(length)], dtype=np.uint16)
+            self.mat = self.mat.view(np.float16)
```

Review comment:
Yes, we do iterate over all items in ptr. But ptr is not iterable. I'm not sure there is len(ptr).
**File:** modules/core/src/persistence.cpp
**Change Type:** modified
**Context:** PR #20143: port base64 encoding from 3.4 - issue #14977 Test data is at https://github.com/opencv/opencv_extra/pull/877 ``` opencv_extra=base64_encodi...
**Review Line:** 955

**Code Changes:**
```diff
-        if( fmt == FileStorage::FORMAT_JSON && type_name && type_name[0] && FileNode::isMap(struct_flags))
-        {
-            emitter->write("type_id", type_name, false);
-        }
-    }
+    if (fmt != FileStorage::FORMAT_JSON && !FileNode::isFlow(s.flags))
+        flush();
 
-    void writeComment( const char* comment, bool eol_comment )
-    {
-        CV_Assert(write_mode);
```

Review comment:
This somehow fixes JSON indentation mismatch with 3.4, but looks fragile.
**File:** modules/core/src/persistence_impl.hpp
**Change Type:** added
**Context:** PR #20143: port base64 encoding from 3.4 - issue #14977 Test data is at https://github.com/opencv/opencv_extra/pull/877 ``` opencv_extra=base64_encodi...

**Code Changes:**
```diff
@@ -0,0 +1,231 @@
+// 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
+
+#ifndef OPENCV_CORE_PERSISTENCE_IMPL_HPP
+#define OPENCV_CORE_PERSISTENCE_IMPL_HPP
+
+#include "persistence.hpp"
+#include "persistence_base64_encoding.hpp"
```

Review comment:
> precomp.hpp must be used in .cpp files only (as unconditional first include)
**File:** modules/python/test/test_filestorage_io.py
**Change Type:** modified
**Context:** PR #20143: port base64 encoding from 3.4 - issue #14977 Test data is at https://github.com/opencv/opencv_extra/pull/877 ``` opencv_extra=base64_encodi...

**Code Changes:**
```diff
@@ -1,6 +1,8 @@
 #!/usr/bin/env python
 """Algorithm serialization test."""
 from __future__ import print_function
+import base64
+import json
 import tempfile
 import os
 import cv2 as cv
@@ -109,5 +111,96 @@ def test_yml(self):
```

Review comment:
> ch `cn` is usually used in OpenCV code.
**File:** modules/dnn/src/layers/batch_norm_layer.cpp
**Change Type:** modified
**Context:** PR #20228: 8-bit quantization in dnn module and int8 layers

**Code Changes:**
```diff
@@ -409,6 +409,18 @@ class BatchNormLayerImpl CV_FINAL : public BatchNormLayer
     }
 #endif  // HAVE_DNN_NGRAPH
 
+    virtual bool tryQuantize(const std::vector<std::vector<float> > &scales,
+                             const std::vector<std::vector<int> > &zeropoints, LayerParams& params) CV_OVERRIDE
+    {
+        params.set("input_scale", scales[0][0]);
+        params.set("input_zeropoint", zeropoints[0][0]);
+
```

Review comment:
This change causes the BatchNorm test to fail. It makes sense as the test was added for this exact change #17284. In a quantized net, if the int8 version of a layer is not present (like BatchNorm), the fp32 version of the layer is copied along with its params. But here we are overwriting the layer's original parameters with fused ones which causes the layer in the quantized net to give wrong results (NaNs and Infs). Is there a way to solve both the issues?
**File:** modules/dnn/src/layers/batch_norm_layer.cpp
**Change Type:** modified
**Context:** PR #20228: 8-bit quantization in dnn module and int8 layers

**Code Changes:**
```diff
@@ -409,6 +409,18 @@ class BatchNormLayerImpl CV_FINAL : public BatchNormLayer
     }
 #endif  // HAVE_DNN_NGRAPH
 
+    virtual bool tryQuantize(const std::vector<std::vector<float> > &scales,
+                             const std::vector<std::vector<int> > &zeropoints, LayerParams& params) CV_OVERRIDE
+    {
+        params.set("input_scale", scales[0][0]);
+        params.set("input_zeropoint", zeropoints[0][0]);
+
```

Review comment:
> prior to copying blobs to weights_ and bias_ we can save the previous state to some other internal arrays Done. Now batchnorm fusion test pass and quantized nets with fp32 batchnorm layer also work.
**File:** modules/core/misc/java/src/java/core+Mat.java
**Change Type:** modified
**Context:** PR #20731: Add matrix multiplication to Mat for iOS/Android

**Code Changes:**
```diff
@@ -466,16 +466,32 @@ public void locateROI(Size wholeSize, Point ofs) {
     // C++: Mat Mat::mul(Mat m, double scale = 1)
     //
 
-    // javadoc: Mat::mul(m, scale)
+    /**
+     * Element-wise multiplication with scale factor
+     * @param m operand with with which to perform element-wise multiplication
+     * @param scale scale factor
+     */
```

Review comment:
What is wrong with `gemm()`?
**File:** modules/core/misc/java/src/java/core+Mat.java
**Change Type:** modified
**Context:** PR #20731: Add matrix multiplication to Mat for iOS/Android

**Code Changes:**
```diff
@@ -466,16 +466,32 @@ public void locateROI(Size wholeSize, Point ofs) {
     // C++: Mat Mat::mul(Mat m, double scale = 1)
     //
 
-    // javadoc: Mat::mul(m, scale)
+    /**
+     * Element-wise multiplication with scale factor
+     * @param m operand with with which to perform element-wise multiplication
+     * @param scale scale factor
+     */
```

Review comment:
The problem I have with `gemm` is it takes 3 Mat as input. If you want to just simply multiply 2 matrices - you need to create a third completely unnecessary Mat just to do the operation. Also the name `gemm` makes it difficult to find without hunting around on Stack Overflow.
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
Is this needed? You don't use the `smallValues` anywhere in the implementation of `operator()`
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
Unrelated change, please restore the original line.
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
Not used, remove.
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
Remove the `smallValues` assignment, it is not used.
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
Oh, I think you have to leave the lines that assigned `_kernel` to `kernel`, because you read the value of `kernel` in `operator()`.
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
`vs_ll`, `vs_lh`, `vs_hl` and `vs_hh` are only used once, you might want to consider rolling them into the next statement, for example ```c++ v_float32 fvs_ll = v_cvt_f32(v_expand_low(vs_l)); ``` You could say the same about the same pattern lower down with `tmp_vs_`.
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
In all these variables, I don't think `tmp` is very descriptive. To stop these variables shadowing those from the 0th index, might I suggest adding a `0` to those in the block above, and removing the `tmp` on these?
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
These variables have a 0 in them, yet they are used in the subsequent iterations too, would it be more accurate to just call them `vs_ll` etc?
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
Would `vkxk` be a better variable name for this, rather than `tmp`?
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
Is there a particular reason to do the 0th index work, then the rest separately? Would there be any downsides to removing the 0th index, initialising `s0_ll` etc to all zeros and then doing ``` for( k = 0; k < ksize; k++ ) ``` on line 504?
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
> v_expand_low(...) > v_expand_high(...) OpenCV SIMD UI has `v_expand()` intrinsic to handle both calls at once. In general, single call variant is preferable because it allows to apply better optimizations than dedicated calls.
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
> `i < width - v_uint8::nlanes` Why not `i <= width - v_uint8::nlanes`?
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f
**Review Line:** 470

**Code Changes:**
```diff
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
+    {
+        CV_INSTRUMENT_REGION();
```

Review comment:
Do we really need default ctor?
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f
**Review Line:** 509

**Code Changes:**
```diff
+            v_store(dst + i + 3*v_float32::nlanes, s3);
+        }
+        return i;
+    }
+
+    Mat kernel;
+};
 
 struct SymmRowSmallVec_8u32s
 {
@@ -2292,6 +2335,7 @@ struct FilterVec_32f
```

Review comment:
const reference + initializer list in ctor ?
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f

**Code Changes:**
```diff
@@ -465,6 +465,49 @@ struct RowVec_8u32s
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
```

Review comment:
BTW, did you try optimization code with `v_load_expand_q(...)`?
**File:** modules/imgproc/src/filter.simd.hpp
**Change Type:** modified
**Context:** PR #20712: Add RowVec_8u32f
**Review Line:** 470

**Code Changes:**
```diff
     bool smallValues;
 };
 
+struct RowVec_8u32f
+{
+    RowVec_8u32f() {}
+    RowVec_8u32f( const Mat& _kernel ) : kernel(_kernel) {}
+
+    int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
+    {
+        CV_INSTRUMENT_REGION();
```

Review comment:
I think default ctor is needed as an argument of `RowFilter( const Mat& _kernel, int _anchor, const VecOp& _vecOp=VecOp() )` where VecOp is `RowVec_8u32f`.
**File:** samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/README.md
**Change Type:** modified
**Context:** PR #20290: Add paddle humanseg demo

**Code Changes:**
```diff
@@ -1,6 +1,6 @@
-# Run PaddlePaddle model by OpenCV
+# Run PaddlePaddle model using OpenCV
 
-This tutorial shows how to run PaddlePaddle model by opencv.
+These two demonstrations show how to inference PaddlePaddle model using OpenCV.
 
 ## Environment Setup
 
@@ -10,16 +10,69 @@ pip install paddlehub
```

Review comment:
Used images should be properly licensed. Please provide information where did you get this image? (dataset, its license)
**File:** samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/README.md
**Change Type:** modified
**Context:** PR #20290: Add paddle humanseg demo

**Code Changes:**
```diff
@@ -1,6 +1,6 @@
-# Run PaddlePaddle model by OpenCV
+# Run PaddlePaddle model using OpenCV
 
-This tutorial shows how to run PaddlePaddle model by opencv.
+These two demonstrations show how to inference PaddlePaddle model using OpenCV.
 
 ## Environment Setup
 
@@ -10,16 +10,69 @@ pip install paddlehub
```

Review comment:
.png files should be avoided in documentation (it is lossless format which provides huge files). Consider using .jpg image format in documentation.
**File:** samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/README.md
**Change Type:** modified
**Context:** PR #20290: Add paddle humanseg demo

**Code Changes:**
```diff
@@ -1,6 +1,6 @@
-# Run PaddlePaddle model by OpenCV
+# Run PaddlePaddle model using OpenCV
 
-This tutorial shows how to run PaddlePaddle model by opencv.
+These two demonstrations show how to inference PaddlePaddle model using OpenCV.
 
 ## Environment Setup
 
@@ -10,16 +10,69 @@ pip install paddlehub
```

Review comment:
What is about the source of used image?
**File:** samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/README.md
**Change Type:** modified
**Context:** PR #20290: Add paddle humanseg demo

**Code Changes:**
```diff
@@ -1,6 +1,6 @@
-# Run PaddlePaddle model by OpenCV
+# Run PaddlePaddle model using OpenCV
 
-This tutorial shows how to run PaddlePaddle model by opencv.
+These two demonstrations show how to inference PaddlePaddle model using OpenCV.
 
 ## Environment Setup
 
@@ -10,16 +10,69 @@ pip install paddlehub
```

Review comment:
The source of used image comes from Supervise.ly dataset,it is noted in the last line of the readme~
**File:** samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/README.md
**Change Type:** modified
**Context:** PR #20290: Add paddle humanseg demo

**Code Changes:**
```diff
@@ -1,6 +1,6 @@
-# Run PaddlePaddle model by OpenCV
+# Run PaddlePaddle model using OpenCV
 
-This tutorial shows how to run PaddlePaddle model by opencv.
+These two demonstrations show how to inference PaddlePaddle model using OpenCV.
 
 ## Environment Setup
 
@@ -10,16 +10,69 @@ pip install paddlehub
```

Review comment:
Used images should have proper licensing terms. Do you have a link on them?
**File:** samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/README.md
**Change Type:** modified
**Context:** PR #20290: Add paddle humanseg demo

**Code Changes:**
```diff
@@ -1,6 +1,6 @@
-# Run PaddlePaddle model by OpenCV
+# Run PaddlePaddle model using OpenCV
 
-This tutorial shows how to run PaddlePaddle model by opencv.
+These two demonstrations show how to inference PaddlePaddle model using OpenCV.
 
 ## Environment Setup
 
@@ -10,16 +10,69 @@ pip install paddlehub
```

Review comment:
The sample image comes from [supervisely-ecosystem/persons](https://github.com/supervisely-ecosystem/persons#download),it's publicly available and free for academic purposes, and there's no license announcement for the dataset. Do you have any suggestions~