From 70d44c29867c99b4be6991935531701e2bd7731a Mon Sep 17 00:00:00 2001 From: banderlog Date: Mon, 22 Jun 2020 14:11:27 +0000 Subject: [PATCH 01/58] upd new version --- build/dldt/dldt_setup.sh | 1 + create_wheel/setup.py | 2 +- download_all_stuff.sh | 15 ++++++--------- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/build/dldt/dldt_setup.sh b/build/dldt/dldt_setup.sh index d8c375f..9042756 100755 --- a/build/dldt/dldt_setup.sh +++ b/build/dldt/dldt_setup.sh @@ -37,6 +37,7 @@ cmake -D CMAKE_BUILD_TYPE=Release \ -D ENABLE_AVX2=ON \ -D ENABLE_AVX512F=OFF \ -D NGRAPH_UNIT_TEST_ENABLE=OFF \ + -D NGRAPH_TEST_UTIL_ENABLE=OFF \ -D NGRAPH_ONNX_IMPORT_ENABLE=ON \ -D NGRAPH_JSON_ENABLE=ON \ -D BLAS_LIBRARIES="$BLAS_LIB" \ diff --git a/create_wheel/setup.py b/create_wheel/setup.py index 3b4b678..28d2be2 100644 --- a/create_wheel/setup.py +++ b/create_wheel/setup.py @@ -15,7 +15,7 @@ def __len__(self): setuptools.setup( name="opencv-python-inference-engine", - version="4.3.0.1", + version="4.3.0.2", url="https://github.com/banderlog/opencv-python-inference-engine", maintainer="Kabakov Borys", license='MIT, BSD, Intel Simplified Software License', diff --git a/download_all_stuff.sh b/download_all_stuff.sh index 4a53fcb..adedc22 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -15,15 +15,16 @@ red () { green "DOWNLOAD ALL ARCHIVES" wget -c https://github.com/opencv/opencv/archive/4.3.0.tar.gz -O opencv.tar.gz -wget -c https://github.com/FFmpeg/FFmpeg/archive/n4.2.2.tar.gz -O ffmpeg.tar.gz -wget -c https://github.com/openvinotoolkit/openvino/archive/2020.2.tar.gz -O dldt.tar.gz +wget -c https://github.com/openvinotoolkit/openvino/archive/2020.3.0.tar.gz -O dldt.tar.gz +wget -c https://github.com/FFmpeg/FFmpeg/archive/n4.3.tar.gz -O ffmpeg.tar.gz +wget -c https://github.com/xianyi/OpenBLAS/archive/v0.3.10.tar.gz -O openblas.tar.gz green "CLEAN LIB DIRS" rm -drf ./dldt/* rm -drf ./ffmpeg/* rm -drf ./opencv/* -find ./openblas/ -mindepth 1 -delete +rm -drf ./openblas/* green "CLEAN BUILD DIRS" find build/dldt/ -mindepth 1 -not -name 'dldt_setup.sh' -delete @@ -38,9 +39,10 @@ rm -drf create_wheel/dist rm -drf create_wheel/*egg-info green "UNZIP ALL STUFF" +tar -xf opencv.tar.gz --strip-components=1 -C ./opencv/ tar -xf dldt.tar.gz --strip-components=1 -C ./dldt/ tar -xf ffmpeg.tar.gz --strip-components=1 -C ./ffmpeg/ -tar -xf opencv.tar.gz --strip-components=1 -C ./opencv/ +tar -xf openblas.tar.gz --strip-components=1 -C ./openblas/ green "GIT RESET FOR ade" cd ./dldt/inference-engine/thirdparty/ade @@ -52,11 +54,6 @@ cd ../../../ngraph git clone https://github.com/NervanaSystems/ngraph ./ git reset --hard edc65ca -green "GET RESET FOR OpenBLAS" -cd ../../openblas/ -git clone --single-branch -b develop https://github.com/xianyi/OpenBLAS ./ -git reset --hard 9f67d03 # 2020-Mar-23 - green "CREATE VENV" cd ../ From fbe9cb95b3904c1d78690ea152e09e7a5dfd9369 Mon Sep 17 00:00:00 2001 From: banderlog Date: Mon, 22 Jun 2020 15:07:32 +0000 Subject: [PATCH 02/58] OpenBLAS faster than JIT --- TODO.md | 4 +--- tests/requirements.txt | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/TODO.md b/TODO.md index 3f2f192..3f3eb5c 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,3 @@ # TODO list -1. Prevent ngrph from building tests via [cmake-flags](https://github.com/NervanaSystems/ngraph/blob/master/CMakeLists.txt) -2. Now `-D GEMM=JIT` has compatible to the OpenBLAS inference speed (not x10 difference, but 2-20%). Do comparison speed test in the next release. -3. Change wheel naming so that it will not be visible for Windows +1. Change wheel naming so that it will not be visible for Windows diff --git a/tests/requirements.txt b/tests/requirements.txt index d97a2d9..0a72c74 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,4 +1,4 @@ -tensorflow-cpu +tensorflow-cpu==2.2.0 +scipy==1.4.1 scikit-image -scipy ipython From 637e46e7bafdb75aa5ee4bc17b744474bdd370e2 Mon Sep 17 00:00:00 2001 From: banderlog Date: Mon, 22 Jun 2020 15:54:41 +0000 Subject: [PATCH 03/58] wheel already manylinux and should not be used for win --- TODO.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/TODO.md b/TODO.md index 3f3eb5c..57c24f4 100644 --- a/TODO.md +++ b/TODO.md @@ -1,3 +1 @@ # TODO list - -1. Change wheel naming so that it will not be visible for Windows From e0a34f2289e8c26dbe9e089a97a73570e315a5a7 Mon Sep 17 00:00:00 2001 From: banderlog Date: Tue, 21 Jul 2020 15:07:09 +0300 Subject: [PATCH 04/58] upd --- build/dldt/dldt_setup.sh | 6 +++++- create_wheel/setup.py | 4 ++-- download_all_stuff.sh | 26 ++++++++++++++++++-------- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/build/dldt/dldt_setup.sh b/build/dldt/dldt_setup.sh index 9042756..321f33a 100755 --- a/build/dldt/dldt_setup.sh +++ b/build/dldt/dldt_setup.sh @@ -42,4 +42,8 @@ cmake -D CMAKE_BUILD_TYPE=Release \ -D NGRAPH_JSON_ENABLE=ON \ -D BLAS_LIBRARIES="$BLAS_LIB" \ -D BLAS_INCLUDE_DIRS="$BLAS_INC" \ - -D ENABLE_CLDNN=OFF ../../dldt/ + -D ENABLE_CLDNN=OFF \ + -D ENABLE_CLDNN_TESTS=OFF \ + -D ENABLE_PROFILING_ITT=OFF \ + -D ENABLE_SAMPLES=OFF \ + -D ENABLE_SPEECH_DEMO=OFF ../../dldt/ diff --git a/create_wheel/setup.py b/create_wheel/setup.py index 28d2be2..54c9986 100644 --- a/create_wheel/setup.py +++ b/create_wheel/setup.py @@ -15,11 +15,11 @@ def __len__(self): setuptools.setup( name="opencv-python-inference-engine", - version="4.3.0.2", + version="4.4.0.0", url="https://github.com/banderlog/opencv-python-inference-engine", maintainer="Kabakov Borys", license='MIT, BSD, Intel Simplified Software License', - description="Wrapper package for OpenCV 4.3.0 with Inference Engine 2020.2 python bindings", + description="Wrapper package for OpenCV 4.4.0 with Inference Engine 2020.4 python bindings", long_description=long_description, long_description_content_type="text/markdown", ext_modules=EmptyListWithLength(), diff --git a/download_all_stuff.sh b/download_all_stuff.sh index adedc22..02f87ad 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -9,14 +9,18 @@ green () { echo -e "${green}${1}${end}" } + red () { echo -e "${red}${1}${end}" } + +ROOT_DIR=$(pwd) + green "DOWNLOAD ALL ARCHIVES" -wget -c https://github.com/opencv/opencv/archive/4.3.0.tar.gz -O opencv.tar.gz -wget -c https://github.com/openvinotoolkit/openvino/archive/2020.3.0.tar.gz -O dldt.tar.gz -wget -c https://github.com/FFmpeg/FFmpeg/archive/n4.3.tar.gz -O ffmpeg.tar.gz +wget -c https://github.com/opencv/opencv/archive/4.4.0.tar.gz -O opencv.tar.gz +wget -c https://github.com/openvinotoolkit/openvino/archive/2020.4.tar.gz -O dldt.tar.gz +wget -c https://github.com/FFmpeg/FFmpeg/archive/n4.3.1.tar.gz -O ffmpeg.tar.gz wget -c https://github.com/xianyi/OpenBLAS/archive/v0.3.10.tar.gz -O openblas.tar.gz @@ -49,13 +53,19 @@ cd ./dldt/inference-engine/thirdparty/ade git clone https://github.com/opencv/ade/ ./ git reset --hard cbe2db6 -green "GIT RESET FOR ngraph" -cd ../../../ngraph -git clone https://github.com/NervanaSystems/ngraph ./ -git reset --hard edc65ca +green "GIT RESET FOR mkl-dnn" +cd ../mkl-dnn +git clone https://github.com/openvinotoolkit/oneDNN/ ./ +git reset --hard 2706f56 + +green "GIT RESET FOR IE samples gflags" +cd ../../samples/thirdparty/gflags/ +git clone https://github.com/gflags/gflags ./ +git reset --hard 46f73f8 + green "CREATE VENV" -cd ../ +cd $ROOT_DIR if [[ ! -d ./venv ]]; then virtualenv --clear --always-copy -p /usr/bin/python3 ./venv From adfb74f13e6ddc6ade9299e09ac51187616b1ec6 Mon Sep 17 00:00:00 2001 From: banderlog Date: Tue, 21 Jul 2020 16:47:08 +0300 Subject: [PATCH 05/58] upd --- build/opencv/opencv_setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/opencv/opencv_setup.sh b/build/opencv/opencv_setup.sh index f4f8ca6..cddeaf3 100755 --- a/build/opencv/opencv_setup.sh +++ b/build/opencv/opencv_setup.sh @@ -73,7 +73,7 @@ cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D WITH_NGRAPH=ON \ -D ngraph_DIR=$ABS_PORTION/build/dldt/ngraph \ -D WITH_INF_ENGINE=ON \ - -D INF_ENGINE_RELEASE=2020020000 \ + -D INF_ENGINE_RELEASE=2020040000 \ -D INF_ENGINE_INCLUDE_DIRS=$ABS_PORTION/dldt/inference-engine/include \ -D INF_ENGINE_LIB_DIRS=$ABS_PORTION/dldt/bin/intel64/Release/lib \ -D CPU_BASELINE=SSE4_2 \ From af205357dc5abcb6a4c359287019ba74d9ee3161 Mon Sep 17 00:00:00 2001 From: banderlog Date: Wed, 22 Jul 2020 14:49:31 +0300 Subject: [PATCH 06/58] 4.4.0 ready --- README.md | 8 ++++---- TODO.md | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index abe957d..e990d6d 100644 --- a/README.md +++ b/README.md @@ -113,22 +113,22 @@ sudo ln -s /usr/bin/python3 /usr/bin/python ```bash cd build/openblas ./openblas_setup.sh && -make -j8 && +make -j6 && make install cd ../ffmpeg ./ffmpeg_setup.sh && ./ffmpeg_premake.sh && -make -j8 && +make -j6 && make install cd ../dldt ./dldt_setup.sh && -make -j8 +make -j6 cd ../opencv ./opencv_setup.sh && -make -j8 +make -j6 ``` ### Wheel creation diff --git a/TODO.md b/TODO.md index 57c24f4..5453709 100644 --- a/TODO.md +++ b/TODO.md @@ -1 +1,5 @@ # TODO list + ++ Auto value for `-D INF_ENGINE_RELEASE` ++ Try to submodule things instead of downloading archives of them ++ check tar.gz integrity otherwise From becb63524f4577e21635d28446f234138140b260 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Wed, 22 Jul 2020 19:33:10 +0300 Subject: [PATCH 07/58] submodules test (#11) --- .gitmodules | 12 ++++++++++++ README.md | 9 ++++++--- dldt | 1 + dldt/.gitkeep | 0 download_all_stuff.sh | 35 ++--------------------------------- ffmpeg | 1 + ffmpeg/.gitkeep | 0 openblas | 1 + openblas/.gitkeep | 0 opencv | 1 + opencv/.gitkeep | 0 11 files changed, 24 insertions(+), 36 deletions(-) create mode 100644 .gitmodules create mode 160000 dldt delete mode 100644 dldt/.gitkeep create mode 160000 ffmpeg delete mode 100644 ffmpeg/.gitkeep create mode 160000 openblas delete mode 100644 openblas/.gitkeep create mode 160000 opencv delete mode 100644 opencv/.gitkeep diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..91b55a9 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,12 @@ +[submodule "dldt"] + path = dldt + url = https://github.com/openvinotoolkit/openvino +[submodule "opencv"] + path = opencv + url = https://github.com/opencv/opencv +[submodule "openblas"] + path = openblas + url = https://github.com/xianyi/OpenBLAS +[submodule "ffmpeg"] + path = ffmpeg + url = https://github.com/FFmpeg/FFmpeg diff --git a/README.md b/README.md index e990d6d..a69c3d6 100644 --- a/README.md +++ b/README.md @@ -104,9 +104,11 @@ sudo ln -s /usr/bin/python3 /usr/bin/python ### Preparing -1. `git clone https://github.com/banderlog/opencv-python-inference-engine` -2. `cd opencv-python-inference-engine` -3. run `download_all_stuff.sh` (refer for script code for details) +```bash +git clone https://github.com/banderlog/opencv-python-inference-engine +cd opencv-python-inference-engine +./download_all_stuff.sh +``` ### Compilation @@ -126,6 +128,7 @@ cd ../dldt ./dldt_setup.sh && make -j6 +# NB: check `-D INF_ENGINE_RELEASE` value cd ../opencv ./opencv_setup.sh && make -j6 diff --git a/dldt b/dldt new file mode 160000 index 0000000..023e7c2 --- /dev/null +++ b/dldt @@ -0,0 +1 @@ +Subproject commit 023e7c2c3f8a8ac83564db09799d2049115d9cf6 diff --git a/dldt/.gitkeep b/dldt/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/download_all_stuff.sh b/download_all_stuff.sh index 02f87ad..fd2829b 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -17,18 +17,8 @@ red () { ROOT_DIR=$(pwd) -green "DOWNLOAD ALL ARCHIVES" -wget -c https://github.com/opencv/opencv/archive/4.4.0.tar.gz -O opencv.tar.gz -wget -c https://github.com/openvinotoolkit/openvino/archive/2020.4.tar.gz -O dldt.tar.gz -wget -c https://github.com/FFmpeg/FFmpeg/archive/n4.3.1.tar.gz -O ffmpeg.tar.gz -wget -c https://github.com/xianyi/OpenBLAS/archive/v0.3.10.tar.gz -O openblas.tar.gz - - -green "CLEAN LIB DIRS" -rm -drf ./dldt/* -rm -drf ./ffmpeg/* -rm -drf ./opencv/* -rm -drf ./openblas/* +green "RESET GIT SUBMODULES" +git submodule update --init --recursive green "CLEAN BUILD DIRS" find build/dldt/ -mindepth 1 -not -name 'dldt_setup.sh' -delete @@ -42,27 +32,6 @@ rm -drf create_wheel/build rm -drf create_wheel/dist rm -drf create_wheel/*egg-info -green "UNZIP ALL STUFF" -tar -xf opencv.tar.gz --strip-components=1 -C ./opencv/ -tar -xf dldt.tar.gz --strip-components=1 -C ./dldt/ -tar -xf ffmpeg.tar.gz --strip-components=1 -C ./ffmpeg/ -tar -xf openblas.tar.gz --strip-components=1 -C ./openblas/ - -green "GIT RESET FOR ade" -cd ./dldt/inference-engine/thirdparty/ade -git clone https://github.com/opencv/ade/ ./ -git reset --hard cbe2db6 - -green "GIT RESET FOR mkl-dnn" -cd ../mkl-dnn -git clone https://github.com/openvinotoolkit/oneDNN/ ./ -git reset --hard 2706f56 - -green "GIT RESET FOR IE samples gflags" -cd ../../samples/thirdparty/gflags/ -git clone https://github.com/gflags/gflags ./ -git reset --hard 46f73f8 - green "CREATE VENV" cd $ROOT_DIR diff --git a/ffmpeg b/ffmpeg new file mode 160000 index 0000000..6b6b9e5 --- /dev/null +++ b/ffmpeg @@ -0,0 +1 @@ +Subproject commit 6b6b9e593dd4d3aaf75f48d40a13ef03bdef9fdb diff --git a/ffmpeg/.gitkeep b/ffmpeg/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/openblas b/openblas new file mode 160000 index 0000000..63b03ef --- /dev/null +++ b/openblas @@ -0,0 +1 @@ +Subproject commit 63b03efc2af332c88b86d4fd8079d00f4b439adf diff --git a/openblas/.gitkeep b/openblas/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/opencv b/opencv new file mode 160000 index 0000000..c3bb57a --- /dev/null +++ b/opencv @@ -0,0 +1 @@ +Subproject commit c3bb57afeaf030f10939204d48d7c2a3842f4293 diff --git a/opencv/.gitkeep b/opencv/.gitkeep deleted file mode 100644 index e69de29..0000000 From 0a474baddfcdcccf84aa9efc57932b7ecc6c1432 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Wed, 22 Jul 2020 19:34:09 +0300 Subject: [PATCH 08/58] Update TODO.md --- TODO.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/TODO.md b/TODO.md index d1bf5f8..221381f 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,3 @@ # TODO list -+ Auto value for `-D INF_ENGINE_RELEASE` -+ Try to submodule things instead of downloading archives of them -+ check tar.gz integrity otherwise \ No newline at end of file ++ Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 From 9376215ea33c8bb6fec042798fd24bcc361fdd85 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 28 Sep 2020 13:28:59 +0300 Subject: [PATCH 09/58] tensorflow-cpu==2.2.0 -> tensorflow-cpu==2.2.1 --- tests/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/requirements.txt b/tests/requirements.txt index 0a72c74..b959118 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,4 +1,4 @@ -tensorflow-cpu==2.2.0 +tensorflow-cpu==2.2.1 scipy==1.4.1 scikit-image ipython From a8aa8c37c3e337d13284d0c902b4c5ff9f0fb429 Mon Sep 17 00:00:00 2001 From: banderlog Date: Thu, 8 Oct 2020 14:37:56 +0300 Subject: [PATCH 10/58] preparations for new version --- README.md | 7 ++++--- dldt | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a69c3d6..d797849 100644 --- a/README.md +++ b/README.md @@ -91,11 +91,12 @@ From [opencv](https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html) ```bash # We need newer `cmake` for dldt (commands from ) -wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add - -sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main' +sudo apt remove --purge cmake +hash -r +sudo snap install cmake --classic sudo apt-get update -sudo apt install build-essential cmake git pkg-config python3-dev nasm python3 virtualenv libusb-1.0-0-dev chrpath autoconf libtool-bin +sudo apt install build-essential git pkg-config python3-dev nasm python3 virtualenv libusb-1.0-0-dev chrpath autoconf libtool-bin # for ngraph # the `dldt/_deps/ext_onnx-src/onnx/gen_proto.py` has `#!/usr/bin/env python` string and will throw an error otherwise diff --git a/dldt b/dldt index 023e7c2..f557dca 160000 --- a/dldt +++ b/dldt @@ -1 +1 @@ -Subproject commit 023e7c2c3f8a8ac83564db09799d2049115d9cf6 +Subproject commit f557dca475cb54dcfc9026fbaad0d93ddb85015c From a64957ee448abf873b8189d4e449e97527bb1063 Mon Sep 17 00:00:00 2001 From: banderlog Date: Thu, 8 Oct 2020 16:56:19 +0300 Subject: [PATCH 11/58] all set. waiting for opencv-4.5.0 --- README.md | 1 + TODO.md | 1 + build/dldt/dldt_setup.sh | 1 - build/opencv/opencv_setup.sh | 2 +- create_wheel/setup.py | 4 ++-- download_all_stuff.sh | 1 + opencv | 2 +- tests/prepare_and_run_tests.sh | 8 +++++--- tests/requirements.txt | 1 + 9 files changed, 13 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index d797849..00974f5 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,7 @@ cd create_wheel for i in cv2/*.so; do chrpath -r '$ORIGIN' $i; done # final .whl will be in /create_wheel/dist/ +# NB: check versions in the `setup.py` ../venv/bin/python3 setup.py bdist_wheel ``` diff --git a/TODO.md b/TODO.md index 221381f..fc1c32e 100644 --- a/TODO.md +++ b/TODO.md @@ -1,3 +1,4 @@ # TODO list + Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 ++ Wait for OpenCV-4.5.0 or it will not compile (version 4.5.0-openvino currently avaliable) diff --git a/build/dldt/dldt_setup.sh b/build/dldt/dldt_setup.sh index 321f33a..1cf3d04 100755 --- a/build/dldt/dldt_setup.sh +++ b/build/dldt/dldt_setup.sh @@ -39,7 +39,6 @@ cmake -D CMAKE_BUILD_TYPE=Release \ -D NGRAPH_UNIT_TEST_ENABLE=OFF \ -D NGRAPH_TEST_UTIL_ENABLE=OFF \ -D NGRAPH_ONNX_IMPORT_ENABLE=ON \ - -D NGRAPH_JSON_ENABLE=ON \ -D BLAS_LIBRARIES="$BLAS_LIB" \ -D BLAS_INCLUDE_DIRS="$BLAS_INC" \ -D ENABLE_CLDNN=OFF \ diff --git a/build/opencv/opencv_setup.sh b/build/opencv/opencv_setup.sh index cddeaf3..f093c58 100755 --- a/build/opencv/opencv_setup.sh +++ b/build/opencv/opencv_setup.sh @@ -73,7 +73,7 @@ cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D WITH_NGRAPH=ON \ -D ngraph_DIR=$ABS_PORTION/build/dldt/ngraph \ -D WITH_INF_ENGINE=ON \ - -D INF_ENGINE_RELEASE=2020040000 \ + -D INF_ENGINE_RELEASE=2021010000 \ -D INF_ENGINE_INCLUDE_DIRS=$ABS_PORTION/dldt/inference-engine/include \ -D INF_ENGINE_LIB_DIRS=$ABS_PORTION/dldt/bin/intel64/Release/lib \ -D CPU_BASELINE=SSE4_2 \ diff --git a/create_wheel/setup.py b/create_wheel/setup.py index 54c9986..e71bf95 100644 --- a/create_wheel/setup.py +++ b/create_wheel/setup.py @@ -15,11 +15,11 @@ def __len__(self): setuptools.setup( name="opencv-python-inference-engine", - version="4.4.0.0", + version="4.5.0.0", url="https://github.com/banderlog/opencv-python-inference-engine", maintainer="Kabakov Borys", license='MIT, BSD, Intel Simplified Software License', - description="Wrapper package for OpenCV 4.4.0 with Inference Engine 2020.4 python bindings", + description="Wrapper package for OpenCV 4.5.0 with Inference Engine 2021.1 python bindings", long_description=long_description, long_description_content_type="text/markdown", ext_modules=EmptyListWithLength(), diff --git a/download_all_stuff.sh b/download_all_stuff.sh index fd2829b..78cb417 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -18,6 +18,7 @@ red () { ROOT_DIR=$(pwd) green "RESET GIT SUBMODULES" +# use `git checkout tags/` for update git submodule update --init --recursive green "CLEAN BUILD DIRS" diff --git a/opencv b/opencv index c3bb57a..464efeb 160000 --- a/opencv +++ b/opencv @@ -1 +1 @@ -Subproject commit c3bb57afeaf030f10939204d48d7c2a3842f4293 +Subproject commit 464efeb7b07211706d0f2615e16c8d144447d362 diff --git a/tests/prepare_and_run_tests.sh b/tests/prepare_and_run_tests.sh index c93aec9..46bb544 100755 --- a/tests/prepare_and_run_tests.sh +++ b/tests/prepare_and_run_tests.sh @@ -12,6 +12,7 @@ red () { echo -e "${red}${1}${end}" } + # check if (no ARG and no some appropriate files are compiled) or # (some args provided but arg1 is not existing file) # of course, you could shoot your leg here in different ways @@ -33,13 +34,14 @@ green "INSTALLING DEPENDENCIES" if [ $1 ]; then # install ARGV1 green "Installing from provided path" - ./venv_t/bin/pip3 install --force-reinstall "$1" + WHEEL="$1" else # install compiled wheel green "Installing from default path" - ./venv_t/bin/pip3 install --force-reinstall ../create_wheel/dist/opencv_python_inference_engine*.whl + WHEEL=$(realpath ../create_wheel/dist/opencv_python_inference_engine*.whl) fi +./venv_t/bin/pip3 install --force-reinstall "$WHEEL" ./venv_t/bin/pip3 install -r requirements.txt @@ -88,7 +90,7 @@ for i in "${!se_net[@]}"; do fi done -green "For \"$1\"" +green "For \"$WHEEL\"" green "RUN TESTS with ./venv_t/bin/python ./tests.py" ./venv_t/bin/python ./tests.py green "RUN TESTS with ./venv_t/bin/python ./speed_test.py" diff --git a/tests/requirements.txt b/tests/requirements.txt index b959118..02a2ef9 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,3 +1,4 @@ +numpy>=1.16.0,<1.19.0 tensorflow-cpu==2.2.1 scipy==1.4.1 scikit-image From 75fd26334713e03acb347108a627e979f52a7899 Mon Sep 17 00:00:00 2001 From: banderlog Date: Thu, 8 Oct 2020 17:05:48 +0300 Subject: [PATCH 12/58] upd README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 00974f5..755c11f 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ pip3 install opencv-python-inference-engine ## Why I needed an ability to fast deploy a small package that able to run models from [Intel's model zoo](https://github.com/opencv/open_model_zoo/) and use [Movidius NCS](https://software.intel.com/en-us/neural-compute-stick). -Wellr-known [opencv-python](https://github.com/skvark/opencv-python) can't do this. +Well-known [opencv-python](https://github.com/skvark/opencv-python) can't do this. The official way is to use OpenVINO, but it is big and clumsy (just try to use it with python venv or fast download it on cloud instance). @@ -68,7 +68,7 @@ Better to find a model description [here](https://github.com/opencv/open_model_z ## Compiling from source -You will need ~6GB RAM and ~10GB disk space +You will need ~7GB RAM and ~10GB disk space I am using Ubuntu 18.04 [multipass](https://multipass.run/) instance: `multipass launch -c 6 -d 10G -m 7G`. From 7a00a02a998ea57dc22971fef8e444328058b1a9 Mon Sep 17 00:00:00 2001 From: banderlog Date: Mon, 12 Oct 2020 20:59:50 +0300 Subject: [PATCH 13/58] opencv 4.5.0 is here --- README.md | 1 + TODO.md | 1 - build/opencv/opencv_setup.sh | 2 ++ download_all_stuff.sh | 2 +- opencv | 2 +- 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 755c11f..b93d44c 100644 --- a/README.md +++ b/README.md @@ -130,6 +130,7 @@ cd ../dldt make -j6 # NB: check `-D INF_ENGINE_RELEASE` value +# should be in form YYYYAABBCC (e.g. 2020.1.0.2 -> 2020010002)") cd ../opencv ./opencv_setup.sh && make -j6 diff --git a/TODO.md b/TODO.md index fc1c32e..221381f 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,3 @@ # TODO list + Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 -+ Wait for OpenCV-4.5.0 or it will not compile (version 4.5.0-openvino currently avaliable) diff --git a/build/opencv/opencv_setup.sh b/build/opencv/opencv_setup.sh index f093c58..17f68fb 100755 --- a/build/opencv/opencv_setup.sh +++ b/build/opencv/opencv_setup.sh @@ -5,6 +5,8 @@ # # -DINF_ENGINE_RELEASE= should match dldt version # See +# From +# "Force IE version, should be in form YYYYAABBCC (e.g. 2020.1.0.2 -> 2020010002)") tmp=$(pwd) ABS_PORTION=${tmp%%"/build/opencv"} diff --git a/download_all_stuff.sh b/download_all_stuff.sh index 78cb417..7e998a9 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -18,7 +18,7 @@ red () { ROOT_DIR=$(pwd) green "RESET GIT SUBMODULES" -# use `git checkout tags/` for update +# use `git pull && git checkout tags/` for update git submodule update --init --recursive green "CLEAN BUILD DIRS" diff --git a/opencv b/opencv index 464efeb..d5fd2f0 160000 --- a/opencv +++ b/opencv @@ -1 +1 @@ -Subproject commit 464efeb7b07211706d0f2615e16c8d144447d362 +Subproject commit d5fd2f0155ffad366f9ac912dfd6d189a7a6a98e From 3b5b418880aa024d6a715c1e331c81ed6e91d12c Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 12 Oct 2020 22:42:38 +0300 Subject: [PATCH 14/58] Update setup.py --- create_wheel/setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/create_wheel/setup.py b/create_wheel/setup.py index e71bf95..3add3fb 100644 --- a/create_wheel/setup.py +++ b/create_wheel/setup.py @@ -18,8 +18,8 @@ def __len__(self): version="4.5.0.0", url="https://github.com/banderlog/opencv-python-inference-engine", maintainer="Kabakov Borys", - license='MIT, BSD, Intel Simplified Software License', - description="Wrapper package for OpenCV 4.5.0 with Inference Engine 2021.1 python bindings", + license='MIT, Apache 2.0', + description="Wrapper package for OpenCV with Inference Engine python bindings", long_description=long_description, long_description_content_type="text/markdown", ext_modules=EmptyListWithLength(), @@ -28,7 +28,7 @@ def __len__(self): include_package_data=True, install_requires=['numpy'], classifiers=[ - 'Development Status :: 4 - Beta', + 'Development Status :: 5 - Production/Stable', 'Environment :: Console', 'Intended Audience :: Developers', 'Intended Audience :: Education', From 9a4a378f0e411ac9edb0e4f24b3c97e3999b13e0 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 12 Oct 2020 22:46:08 +0300 Subject: [PATCH 15/58] Update TODO.md --- TODO.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index 2eb7874..b8d8a8f 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,5 @@ # TODO list + Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 - ++ add [OpenCV's Apache 2 license](https://github.com/opencv/opencv/blob/master/LICENSE) into python package ++ remove `LICENSE-INTEL`, `LICENSE-3RD-PARTY` From 5cc11dfe8665aff088b98b4be851a8c0443c3a13 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Tue, 13 Oct 2020 11:33:23 +0300 Subject: [PATCH 16/58] Update TODO.md --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index b8d8a8f..8c2ad8f 100644 --- a/TODO.md +++ b/TODO.md @@ -3,3 +3,4 @@ + Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 + add [OpenCV's Apache 2 license](https://github.com/opencv/opencv/blob/master/LICENSE) into python package + remove `LICENSE-INTEL`, `LICENSE-3RD-PARTY` ++ check JIT speed From 14ee3eb838e7598c635144cf1211b14cfbbaac95 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Sun, 18 Oct 2020 17:54:43 +0300 Subject: [PATCH 17/58] Update TODO.md --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index 8c2ad8f..f9b0581 100644 --- a/TODO.md +++ b/TODO.md @@ -4,3 +4,4 @@ + add [OpenCV's Apache 2 license](https://github.com/opencv/opencv/blob/master/LICENSE) into python package + remove `LICENSE-INTEL`, `LICENSE-3RD-PARTY` + check JIT speed ++ OpenBLAS 0.3.11 version From eb56e35080ce4e9b9455d44a8e712b11cf2735cc Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:13:09 +0300 Subject: [PATCH 18/58] Update README.md --- README.md | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index b93d44c..ca89310 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ From [opencv](https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html) + `nasm` (for ffmpeg) ```bash -# We need newer `cmake` for dldt (commands from ) +# We need newer `cmake` for dldt (fastest way I know) sudo apt remove --purge cmake hash -r sudo snap install cmake --classic @@ -180,7 +180,7 @@ Make next changes in `opencv-python-inference-engine/build/opencv/opencv_setup.s Exporting `PKG_CONFIG_PATH` for `ffmpeg` somehow messes with default values. -#### IPP +#### [IPP](https://answers.opencv.org/question/12811/whats-exactly-the-opencv-ipp-integration/) Just set `-D WITH_IPP=ON` in `opencv_setup.sh`. @@ -199,34 +199,15 @@ OpenVino comes with 30MB `libmkl_tiny_tbb.so`, but [you will not be able to comp Our opensource MKL-DNN experiment will end with 125MB `libmklml_gnu.so` and inference speed compatible with 5MB openblas ([details](https://github.com/banderlog/opencv-python-inference-engine/issues/5)). -#### OpenBLAS - -Please refer here for details: https://github.com/xianyi/OpenBLAS/issues/2528 - -+ [OpenBLAS Installation guide](https://github.com/xianyi/OpenBLAS/wiki/Installation-Guide) -+ [OpenBLAS User Manual](https://github.com/xianyi/OpenBLAS/wiki/User-Manual) - -If you compile it with `make FC=gfortran`, you'll need to put `libgfortran.so.4` and `libquadmath.so.0` to wheel and set them rpath via `patchelf --set-rpath \$ORIGIN *.so` - #### CUDA -I did not try it. +I did not try it. And it is not in the package for certain [reasons](https://github.com/banderlog/opencv-python-inference-engine/issues/9). + [Compile OpenCV’s ‘dnn’ module with NVIDIA GPU support](https://www.pyimagesearch.com/2020/02/10/opencv-dnn-with-nvidia-gpus-1549-faster-yolo-ssd-and-mask-r-cnn/) + [Use OpenCV’s ‘dnn’ module with NVIDIA GPUs, CUDA, and cuDNN](https://www.pyimagesearch.com/2020/02/03/how-to-use-opencvs-dnn-module-with-nvidia-gpus-cuda-and-cudnn/) -#### Build `ffmpeg` with `tbb` - -Both `dldt` and `opencv` are compiled with `tbb` support, and `ffmpeg` compiled without it -- this does not feel right. -There is some unproved solution for how to compile `ffmpeg` with `tbb` support: - - #### OpenMP It is possible to compile OpenBLAS, dldt and OpenCV with OpenMP. I am not sure that the result would be better than now, but who knows. - -#### Use opencv for NLP - -Presumably, you could also use speech2text model now -- [source](https://docs.openvinotoolkit.org/latest/_inference_engine_samples_speech_libs_and_demos_Speech_libs_and_demos.html) From 0f1e38c10818b69ca682737465c4d71fb95472e6 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:18:13 +0300 Subject: [PATCH 19/58] Update openblas_setup.sh --- build/openblas/openblas_setup.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build/openblas/openblas_setup.sh b/build/openblas/openblas_setup.sh index eaf2f70..3dbd2e6 100755 --- a/build/openblas/openblas_setup.sh +++ b/build/openblas/openblas_setup.sh @@ -1,3 +1,10 @@ +#!/bin/bash + +# Please refer here for details: +# +# If you compile it with `make FC=gfortran`, +# you'll need `libgfortran.so.4` and `libquadmath.so.0` + cmake -D NO_LAPACKE=1 \ -D CMAKE_BUILD_TYPE=Release \ -D NOFORTRAN=ON \ From 3d0225db00730ecbda0cdf17fb156517931ab276 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:24:49 +0300 Subject: [PATCH 20/58] Update README.md --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index ca89310..d6b728e 100644 --- a/README.md +++ b/README.md @@ -186,9 +186,6 @@ Just set `-D WITH_IPP=ON` in `opencv_setup.sh`. It will give +30MB to the final `cv2.so` size. And it will boost _some_ opencv functions. -![](https://www.oreilly.com/library/view/learning-opencv-3/9781491937983/assets/lcv3_0105.png) -(Image from [Learning OpenCV 3 by Gary Bradski, Adrian Kaehler](https://www.oreilly.com/library/view/learning-opencv-3/9781491937983/ch01.html)) - [Official Intel's IPP benchmarks](https://software.intel.com/en-us/ipp/benchmarks) (may ask for registration) #### MKL From 222c2f705f8feadfd612fd5e53bca8f034264143 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:28:28 +0300 Subject: [PATCH 21/58] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d6b728e..d2f67f0 100644 --- a/README.md +++ b/README.md @@ -180,7 +180,9 @@ Make next changes in `opencv-python-inference-engine/build/opencv/opencv_setup.s Exporting `PKG_CONFIG_PATH` for `ffmpeg` somehow messes with default values. -#### [IPP](https://answers.opencv.org/question/12811/whats-exactly-the-opencv-ipp-integration/) +It will add ~16MB to the package. + +#### Integrated Performance Primitives Just set `-D WITH_IPP=ON` in `opencv_setup.sh`. From 7b1753a55f941baf7d01fdbfb7621094cd7fc3a6 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:33:20 +0300 Subject: [PATCH 22/58] Update ffmpeg_premake.sh --- build/ffmpeg/ffmpeg_premake.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/ffmpeg/ffmpeg_premake.sh b/build/ffmpeg/ffmpeg_premake.sh index 6b850a3..02fdc66 100755 --- a/build/ffmpeg/ffmpeg_premake.sh +++ b/build/ffmpeg/ffmpeg_premake.sh @@ -1,5 +1,6 @@ #!/bin/bash -# +# Build ffmpeg shared libraries without version suffix +# from OLD1='SLIBNAME_WITH_VERSION=$(SLIBNAME).$(LIBVERSION)' OLD2='SLIBNAME_WITH_MAJOR=$(SLIBNAME).$(LIBMAJOR)' OLD3='SLIB_INSTALL_NAME=$(SLIBNAME_WITH_VERSION)' From a23d2c591a7f884a2347aab85ec743e30b79ed4c Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:33:48 +0300 Subject: [PATCH 23/58] Update ffmpeg_premake.sh --- build/ffmpeg/ffmpeg_premake.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build/ffmpeg/ffmpeg_premake.sh b/build/ffmpeg/ffmpeg_premake.sh index 02fdc66..faad6fa 100755 --- a/build/ffmpeg/ffmpeg_premake.sh +++ b/build/ffmpeg/ffmpeg_premake.sh @@ -1,6 +1,7 @@ #!/bin/bash # Build ffmpeg shared libraries without version suffix # from + OLD1='SLIBNAME_WITH_VERSION=$(SLIBNAME).$(LIBVERSION)' OLD2='SLIBNAME_WITH_MAJOR=$(SLIBNAME).$(LIBMAJOR)' OLD3='SLIB_INSTALL_NAME=$(SLIBNAME_WITH_VERSION)' From e5fcaccbf3a688764c501cebb8c5adce5383431e Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:40:43 +0300 Subject: [PATCH 24/58] Update README.md --- create_wheel/README.md | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/create_wheel/README.md b/create_wheel/README.md index 2938f94..eb56bdb 100644 --- a/create_wheel/README.md +++ b/create_wheel/README.md @@ -1,16 +1,9 @@ # README This is a pre-built [OpenCV](https://github.com/opencv/opencv) with [dldt](https://github.com/opencv/dldt) module package for Python3. +You need that module if you want to run models from [Intel's model zoo](https://github.com/opencv/open_model_zoo/). +It built with `ffmpeg` and `v4l` but without GTK/QT (use matplotlib for plotting your results). Contrib modules and haarcascades are not included. -It built with `ffmpeg` and `v4l` support, `ffmpeg` libs are included into a package. - -No GTK/QT support -- use matplotlib for plotting your results. - -For additional info read and `cv2.getBuildInformation()` output - -**Why:** - -There is a [guy with an exellent pre-built set of OpenCV packages](https://github.com/skvark/opencv-python), but they are all came without [dldt module](https://github.com/opencv/dldt). And you need that module if you want to run models from [Intel's model zoo](https://github.com/opencv/open_model_zoo/). - +For additional info visit the [project homepage](https://github.com/banderlog/opencv-python-inference-engine) From 08273beb61b95740f9593da1ac75db933b1ab384 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:40:58 +0300 Subject: [PATCH 25/58] Update README.md --- create_wheel/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/create_wheel/README.md b/create_wheel/README.md index eb56bdb..c080bd7 100644 --- a/create_wheel/README.md +++ b/create_wheel/README.md @@ -3,7 +3,7 @@ This is a pre-built [OpenCV](https://github.com/opencv/opencv) with [dldt](https://github.com/opencv/dldt) module package for Python3. You need that module if you want to run models from [Intel's model zoo](https://github.com/opencv/open_model_zoo/). -It built with `ffmpeg` and `v4l` but without GTK/QT (use matplotlib for plotting your results). +It built with `ffmpeg` and `v4l` but without GTK/QT (use matplotlib for plotting your results). Contrib modules and haarcascades are not included. For additional info visit the [project homepage](https://github.com/banderlog/opencv-python-inference-engine) From 703ace052d09288435dd0d0d030f31622dde522e Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:43:11 +0300 Subject: [PATCH 26/58] Update setup.py --- create_wheel/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/create_wheel/setup.py b/create_wheel/setup.py index 3add3fb..f4d919e 100644 --- a/create_wheel/setup.py +++ b/create_wheel/setup.py @@ -7,7 +7,7 @@ # This creates a list which is empty but returns a length of 1. # Should make the wheel a binary distribution and platlib compliant. -# +# from class EmptyListWithLength(list): def __len__(self): return 1 From 6b3bff11277acd573493cfd88c4f5c1dbabe207a Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:45:13 +0300 Subject: [PATCH 27/58] Update ffmpeg_premake.sh --- build/ffmpeg/ffmpeg_premake.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build/ffmpeg/ffmpeg_premake.sh b/build/ffmpeg/ffmpeg_premake.sh index faad6fa..0f2e41b 100755 --- a/build/ffmpeg/ffmpeg_premake.sh +++ b/build/ffmpeg/ffmpeg_premake.sh @@ -1,4 +1,5 @@ #!/bin/bash + # Build ffmpeg shared libraries without version suffix # from From d3d98015c4cdde2515e3f67ece408f8bc03eca89 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:45:29 +0300 Subject: [PATCH 28/58] Update ffmpeg_setup.sh --- build/ffmpeg/ffmpeg_setup.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build/ffmpeg/ffmpeg_setup.sh b/build/ffmpeg/ffmpeg_setup.sh index 72a2abd..1711101 100755 --- a/build/ffmpeg/ffmpeg_setup.sh +++ b/build/ffmpeg/ffmpeg_setup.sh @@ -1,4 +1,5 @@ #!/bin/bash + PATH_TO_SCRIPT=`dirname $(realpath $0)` ../../ffmpeg/configure \ From 9cb9df1ea5d4a6ea973cf4aaa29962fa9f305d10 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:53:16 +0300 Subject: [PATCH 29/58] Update speed_test.py --- tests/speed_test.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/speed_test.py b/tests/speed_test.py index f162e9d..5560c91 100644 --- a/tests/speed_test.py +++ b/tests/speed_test.py @@ -2,15 +2,18 @@ import numpy as np from IPython import get_ipython -# prepare al stuff and do first inference +# prepare all stuff and do the first inference +# it will load all things into memory xml_model_path = "se_net.xml" net = cv2.dnn.readNet(xml_model_path, xml_model_path[:-3] + 'bin') +# generate image and put it into the NN blob = (np.random.standard_normal((1, 3, 224, 224)) * 255).astype(np.uint8) net.setInput(blob) +# select target & backend, please read the documentation for details: +# net.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU) net.setPreferableBackend(cv2.dnn.DNN_BACKEND_INFERENCE_ENGINE) _ = net.forward() # measure the inference speed get_ipython().magic("timeit _ = net.forward()") - From f0e97008bd74258b1dba44c782ac6b5b122c56dc Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 19 Oct 2020 02:56:24 +0300 Subject: [PATCH 30/58] Update tests.py --- tests/tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/tests.py b/tests/tests.py index 8700921..f466083 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -7,13 +7,13 @@ class TestPackage(unittest.TestCase): - def test_dnn(self): + def test_dnn_module(self): model = RateMe() img = cv2.imread('dislike.jpg') answer = model.predict(img) self.assertEqual(answer, 'dislike') - def test_ie(self): + def test_inference_engine(self): img = cv2.imread('helloworld.png') detector4 = PixelLinkDetector('text-detection-0004.xml') detector4.detect(img) From 34ab0bfb6e709ae3c7a05d92de20e8f8ae23e142 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Tue, 20 Oct 2020 18:43:02 +0300 Subject: [PATCH 31/58] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d2f67f0..bcdd972 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Better to find a model description [here](https://github.com/opencv/open_model_z You will need ~7GB RAM and ~10GB disk space -I am using Ubuntu 18.04 [multipass](https://multipass.run/) instance: `multipass launch -c 6 -d 10G -m 7G`. +I am using Ubuntu 18.04 [multipass](https://multipass.run/) instance: `multipass launch -c 6 -d 10G -m 7G 18.04`. ### Requirements From 41efe2eba9fb94ef5fc751ac1b8157d40be7f929 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Tue, 20 Oct 2020 18:51:51 +0300 Subject: [PATCH 32/58] Update TODO.md --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index f9b0581..b224654 100644 --- a/TODO.md +++ b/TODO.md @@ -5,3 +5,4 @@ + remove `LICENSE-INTEL`, `LICENSE-3RD-PARTY` + check JIT speed + OpenBLAS 0.3.11 version ++ do we still need `sudo ln -s /usr/bin/python3 /usr/bin/python`? From e55848c2e2c3a2e6c01d129996d45325800aea6b Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Tue, 20 Oct 2020 18:54:15 +0300 Subject: [PATCH 33/58] Update TODO.md --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index b224654..c54a0c8 100644 --- a/TODO.md +++ b/TODO.md @@ -6,3 +6,4 @@ + check JIT speed + OpenBLAS 0.3.11 version + do we still need `sudo ln -s /usr/bin/python3 /usr/bin/python`? ++ add Ubuntu version check in tests From 43096c6dd70ae8a82831819d930604af0568e13e Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Tue, 20 Oct 2020 18:56:01 +0300 Subject: [PATCH 34/58] Update TODO.md --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index c54a0c8..644c244 100644 --- a/TODO.md +++ b/TODO.md @@ -7,3 +7,4 @@ + OpenBLAS 0.3.11 version + do we still need `sudo ln -s /usr/bin/python3 /usr/bin/python`? + add Ubuntu version check in tests ++ Make `git clone` for submodules faster From 67fad4b16121a3bd7bc3c9640ab65850ffe83eca Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Sat, 24 Oct 2020 21:55:12 +0300 Subject: [PATCH 35/58] Update TODO.md --- TODO.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index 644c244..77eefa8 100644 --- a/TODO.md +++ b/TODO.md @@ -4,7 +4,7 @@ + add [OpenCV's Apache 2 license](https://github.com/opencv/opencv/blob/master/LICENSE) into python package + remove `LICENSE-INTEL`, `LICENSE-3RD-PARTY` + check JIT speed -+ OpenBLAS 0.3.11 version ++ OpenBLAS 0.3.12 version + do we still need `sudo ln -s /usr/bin/python3 /usr/bin/python`? + add Ubuntu version check in tests + Make `git clone` for submodules faster From b3dfd9746e9c32d74e053050173499d979ea89e9 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Thu, 29 Oct 2020 14:58:09 +0200 Subject: [PATCH 36/58] Update TODO.md --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index 77eefa8..1f7d50d 100644 --- a/TODO.md +++ b/TODO.md @@ -8,3 +8,4 @@ + do we still need `sudo ln -s /usr/bin/python3 /usr/bin/python`? + add Ubuntu version check in tests + Make `git clone` for submodules faster ++ https://stackoverflow.com/questions/64313825/what-the-difference-between-the-opencv-cv-version-status-values From 90de49fdfdb90a9165b0631582cce179ead73131 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Thu, 5 Nov 2020 15:58:22 +0200 Subject: [PATCH 37/58] Update TODO.md --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index 1f7d50d..75f3fbf 100644 --- a/TODO.md +++ b/TODO.md @@ -9,3 +9,4 @@ + add Ubuntu version check in tests + Make `git clone` for submodules faster + https://stackoverflow.com/questions/64313825/what-the-difference-between-the-opencv-cv-version-status-values ++ add examples From 7badd35deaceab93c2d0fab303a027cec461b3e5 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Mon, 16 Nov 2020 18:48:41 +0200 Subject: [PATCH 38/58] Update requirements.txt --- tests/requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/requirements.txt b/tests/requirements.txt index c7193f5..e27ec9c 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,5 +1,5 @@ numpy>=1.16.0,<1.19.0 -tensorflow-cpu==2.2.1 +tensorflow-cpu>=2.4.0 scipy==1.4.1 scikit-image -ipython \ No newline at end of file +ipython From 98d4f794958f623e1c44f391195bc3c3949a1d58 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Sat, 27 Feb 2021 17:18:57 +0200 Subject: [PATCH 39/58] Update TODO.md --- TODO.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/TODO.md b/TODO.md index 75f3fbf..05f1666 100644 --- a/TODO.md +++ b/TODO.md @@ -1,12 +1,15 @@ # TODO list -+ Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 + ++ OpenBLAS 0.3.12 version ++ opencv 4.5.1 ++ dldt 2021.2 + add [OpenCV's Apache 2 license](https://github.com/opencv/opencv/blob/master/LICENSE) into python package + remove `LICENSE-INTEL`, `LICENSE-3RD-PARTY` -+ check JIT speed -+ OpenBLAS 0.3.12 version -+ do we still need `sudo ln -s /usr/bin/python3 /usr/bin/python`? + add Ubuntu version check in tests ++ do we still need `sudo ln -s /usr/bin/python3 /usr/bin/python`? ++ Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 ++ check JIT speed + Make `git clone` for submodules faster + https://stackoverflow.com/questions/64313825/what-the-difference-between-the-opencv-cv-version-status-values + add examples From a0164ada5184828c02655c08be3cef63c26a6524 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Sun, 28 Feb 2021 02:50:37 +0200 Subject: [PATCH 40/58] Update TODO.md --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index 05f1666..25b4a5b 100644 --- a/TODO.md +++ b/TODO.md @@ -13,3 +13,4 @@ + Make `git clone` for submodules faster + https://stackoverflow.com/questions/64313825/what-the-difference-between-the-opencv-cv-version-status-values + add examples ++ versioning change From ff72436ba5cbe41d86f8f8f1dc14c0fa0d2d016c Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 14:42:56 +0200 Subject: [PATCH 41/58] dldt subodule upd --- dldt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dldt b/dldt index f557dca..4795391 160000 --- a/dldt +++ b/dldt @@ -1 +1 @@ -Subproject commit f557dca475cb54dcfc9026fbaad0d93ddb85015c +Subproject commit 4795391b73381660b69b4cd3986c7a0bf902e868 From b192dab9bda222a21d9538e5e9d79dbb0598e8ac Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 14:50:45 +0200 Subject: [PATCH 42/58] submodules upd --- README.md | 29 +++++++++++++++++++---------- download_all_stuff.sh | 4 ++-- ffmpeg | 2 +- openblas | 2 +- opencv | 2 +- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index bcdd972..e0e014b 100644 --- a/README.md +++ b/README.md @@ -12,16 +12,30 @@ Remove previously installed versions of `cv2` pip3 install opencv-python-inference-engine ``` +## Examples of usage -## Why +I'll do more straightforward and well-documented examples of usage in the foreseeable future. But for now, please see the tests folder. + +You will need to preprocess data as a model requires and decode the output. A description of the decoding *should* be in the model documentation with examples in open-vino documentation, however, in some cases, the original article may be the only information source. Some models are very simple to encode/decode, others are tough (e.g., PixelLink in tests). + + +## Downloading intel models + +The official way is clumsy because you need to git clone the whole [model_zoo](https://github.com/opencv/open_model_zoo) ([details](https://github.com/opencv/open_model_zoo/issues/522)) + +Better to find a model description [here](https://github.com/opencv/open_model_zoo/blob/master/models/intel/index.md) and download manually from [here](https://download.01.org/opencv/2020/openvinotoolkit/2020.1/open_model_zoo/models_bin/1/) + + +## Description + + +### Why I needed an ability to fast deploy a small package that able to run models from [Intel's model zoo](https://github.com/opencv/open_model_zoo/) and use [Movidius NCS](https://software.intel.com/en-us/neural-compute-stick). Well-known [opencv-python](https://github.com/skvark/opencv-python) can't do this. The official way is to use OpenVINO, but it is big and clumsy (just try to use it with python venv or fast download it on cloud instance). -## Description - ### Limitations + Package comes without contrib modules. @@ -59,12 +73,6 @@ For additional info read `cv2.getBuildInformation()` output. The first 3 letters are the version of OpenCV, the last one -- package version. E.g, `4.1.0.2` -- 2nd version of based on 4.1.0 OpenCV package. Package versions are not continuously numbered -- each new OpenCV version starts its own numbering. -## Downloading intel models - -The official way is clumsy because you need to git clone the whole [model_zoo](https://github.com/opencv/open_model_zoo) ([details](https://github.com/opencv/open_model_zoo/issues/522)) - -Better to find a model description [here](https://github.com/opencv/open_model_zoo/blob/master/models/intel/index.md) and download manually from [here](https://download.01.org/opencv/2020/openvinotoolkit/2020.1/open_model_zoo/models_bin/1/) - ## Compiling from source @@ -201,7 +209,8 @@ Our opensource MKL-DNN experiment will end with 125MB `libmklml_gnu.so` and infe #### CUDA -I did not try it. And it is not in the package for certain [reasons](https://github.com/banderlog/opencv-python-inference-engine/issues/9). +I did not try it. But it cannot be universal, it will only work with the certain combination of GPU+CUDA+cuDNN for which it will be compiled for. + + [Compile OpenCV’s ‘dnn’ module with NVIDIA GPU support](https://www.pyimagesearch.com/2020/02/10/opencv-dnn-with-nvidia-gpus-1549-faster-yolo-ssd-and-mask-r-cnn/) + [Use OpenCV’s ‘dnn’ module with NVIDIA GPUs, CUDA, and cuDNN](https://www.pyimagesearch.com/2020/02/03/how-to-use-opencvs-dnn-module-with-nvidia-gpus-cuda-and-cudnn/) diff --git a/download_all_stuff.sh b/download_all_stuff.sh index 4eacfea..f907495 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -19,7 +19,7 @@ ROOT_DIR=$(pwd) green "RESET GIT SUBMODULES" # use `git pull && git checkout tags/` for update -git submodule update --init --recursive +git submodule update --init --recursive --depth=1 --jobs=4 green "CLEAN BUILD DIRS" find build/dldt/ -mindepth 1 -not -name 'dldt_setup.sh' -delete @@ -39,4 +39,4 @@ cd $ROOT_DIR if [[ ! -d ./venv ]]; then virtualenv --clear --always-copy -p /usr/bin/python3 ./venv ./venv/bin/pip3 install numpy -fi \ No newline at end of file +fi diff --git a/ffmpeg b/ffmpeg index 6b6b9e5..c40983a 160000 --- a/ffmpeg +++ b/ffmpeg @@ -1 +1 @@ -Subproject commit 6b6b9e593dd4d3aaf75f48d40a13ef03bdef9fdb +Subproject commit c40983a6f631d22fede713d535bb9c31d5c9740c diff --git a/openblas b/openblas index 63b03ef..d2b11c4 160000 --- a/openblas +++ b/openblas @@ -1 +1 @@ -Subproject commit 63b03efc2af332c88b86d4fd8079d00f4b439adf +Subproject commit d2b11c47774b9216660e76e2fc67e87079f26fa1 diff --git a/opencv b/opencv index d5fd2f0..1363496 160000 --- a/opencv +++ b/opencv @@ -1 +1 @@ -Subproject commit d5fd2f0155ffad366f9ac912dfd6d189a7a6a98e +Subproject commit 1363496c1106606684d40447f5d1149b2c66a9f8 From 2a6c602eb420d45ebb5828cef05d32313c4ee89e Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 15:20:44 +0200 Subject: [PATCH 43/58] submodule upd --- ffmpeg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ffmpeg b/ffmpeg index c40983a..f719f86 160000 --- a/ffmpeg +++ b/ffmpeg @@ -1 +1 @@ -Subproject commit c40983a6f631d22fede713d535bb9c31d5c9740c +Subproject commit f719f869907764e6412a6af6e178c46e5f915d25 From f16a1c5f4d88fb69092c71331a108bbbb7ee32be Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 16:04:33 +0200 Subject: [PATCH 44/58] dependencies problem --- dldt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dldt b/dldt index 4795391..8581a07 160000 --- a/dldt +++ b/dldt @@ -1 +1 @@ -Subproject commit 4795391b73381660b69b4cd3986c7a0bf902e868 +Subproject commit 8581a0730d7ce24da282e8da8be8d159f769bf08 From 54c3bae4e3d525f292653b5d9db07d19166492c8 Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 16:42:17 +0200 Subject: [PATCH 45/58] dldt bugfix --- .gitignore | 1 + TODO.md | 6 +- build/dldt/dependencies.patch | 227 ++++++++++++++++++++++++++++++++++ dldt | 2 +- download_all_stuff.sh | 4 +- 5 files changed, 232 insertions(+), 8 deletions(-) create mode 100644 build/dldt/dependencies.patch diff --git a/.gitignore b/.gitignore index 67f7785..196ba09 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ build/opencv/* !build/dldt build/dldt/* !build/dldt/dldt_setup.sh +!build/dldt/*.patch !build/ffmpeg build/ffmpeg/* diff --git a/TODO.md b/TODO.md index 25b4a5b..67a4b91 100644 --- a/TODO.md +++ b/TODO.md @@ -1,16 +1,12 @@ # TODO list -+ OpenBLAS 0.3.12 version -+ opencv 4.5.1 -+ dldt 2021.2 + add [OpenCV's Apache 2 license](https://github.com/opencv/opencv/blob/master/LICENSE) into python package + remove `LICENSE-INTEL`, `LICENSE-3RD-PARTY` + add Ubuntu version check in tests + do we still need `sudo ln -s /usr/bin/python3 /usr/bin/python`? + Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 + check JIT speed -+ Make `git clone` for submodules faster -+ https://stackoverflow.com/questions/64313825/what-the-difference-between-the-opencv-cv-version-status-values ++ https://answers.opencv.org/question/236271/what-the-difference-between-cv_version_status-values/ + add examples + versioning change diff --git a/build/dldt/dependencies.patch b/build/dldt/dependencies.patch new file mode 100644 index 0000000..f3410e1 --- /dev/null +++ b/build/dldt/dependencies.patch @@ -0,0 +1,227 @@ +7,10c7 +< include(models) +< +< #we have number of dependencies stored on ftp +< include(dependency_solver) +--- +> # we have number of dependencies stored on ftp +35d31 +< include(linux_name) +43c39 +< include(vpu_dependencies) +--- +> include(cmake/vpu_dependencies.cmake) +63c59,60 +< ENVIRONMENT "OpenBLAS_DIR") +--- +> ENVIRONMENT "OpenBLAS_DIR" +> SHA256 "c75aac901d5297d6d60a4b1f941f0335d8fd7f52e0dff8c445f644e2e45e6fba") +109c106,107 +< VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*") +--- +> VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*" +> SHA256 "62c68646747fb10f19b53217cb04a1e10ff93606f992e6b35eb8c31187c68fbf") +115c113,114 +< VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*") +--- +> VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*" +> SHA256 "7832b16d82513ee880d97c27c7626f9525ebd678decf6a8fe6c38550f73227d9") +121c120,121 +< VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*") +--- +> VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*" +> SHA256 "591ea4a7e08bbe0062648916f42bded71d24c27f00af30a8f31a29b5878ea0cc") +127a128,134 +> +> ie_cpack_add_component(omp) +> file(GLOB_RECURSE source_list "${OMP}/*${CMAKE_SHARED_LIBRARY_SUFFIX}*") +> install(FILES ${source_list} +> DESTINATION "deployment_tools/inference_engine/external/omp/lib" +> COMPONENT omp) +> +132c139 +< reset_deps_cache(TBBROOT) +--- +> reset_deps_cache(TBBROOT TBB_DIR) +134,162c141,170 +< if(NOT DEFINED TBB_DIR AND NOT DEFINED ENV{TBB_DIR}) +< if (WIN32 AND X86_64) +< #TODO: add target_path to be platform specific as well, to avoid following if +< RESOLVE_DEPENDENCY(TBB +< ARCHIVE_WIN "tbb2020_20200415_win.zip" +< TARGET_PATH "${TEMP}/tbb" +< ENVIRONMENT "TBBROOT") +< elseif(ANDROID) # Should be before LINUX due LINUX is detected as well +< RESOLVE_DEPENDENCY(TBB +< ARCHIVE_ANDROID "tbb2020_20200404_android.tgz" +< TARGET_PATH "${TEMP}/tbb" +< ENVIRONMENT "TBBROOT") +< elseif(LINUX AND X86_64) +< RESOLVE_DEPENDENCY(TBB +< ARCHIVE_LIN "tbb2020_20200415_lin_strip.tgz" +< TARGET_PATH "${TEMP}/tbb") +< elseif(LINUX AND AARCH64) +< RESOLVE_DEPENDENCY(TBB +< ARCHIVE_LIN "keembay/tbb2020_38404_kmb.tgz" +< TARGET_PATH "${TEMP}/tbb_yocto" +< ENVIRONMENT "TBBROOT") +< elseif(APPLE AND X86_64) +< RESOLVE_DEPENDENCY(TBB +< ARCHIVE_MAC "tbb2020_20200404_mac.tgz" +< TARGET_PATH "${TEMP}/tbb" +< ENVIRONMENT "TBBROOT") +< else() +< message(FATAL_ERROR "TBB is not available on current platform") +< endif() +--- +> if (WIN32 AND X86_64) +> #TODO: add target_path to be platform specific as well, to avoid following if +> RESOLVE_DEPENDENCY(TBB +> ARCHIVE_WIN "tbb2020_20200415_win.zip" +> TARGET_PATH "${TEMP}/tbb" +> ENVIRONMENT "TBBROOT" +> SHA256 "f1c9b9e2861efdaa01552bd25312ccbc5feeb45551e5f91ae61e29221c5c1479") +> elseif(ANDROID) # Should be before LINUX due LINUX is detected as well +> RESOLVE_DEPENDENCY(TBB +> ARCHIVE_ANDROID "tbb2020_20200404_android.tgz" +> TARGET_PATH "${TEMP}/tbb" +> ENVIRONMENT "TBBROOT" +> SHA256 "f42d084224cc2d643314bd483ad180b081774608844000f132859fca3e9bf0ce") +> elseif(LINUX AND X86_64) +> RESOLVE_DEPENDENCY(TBB +> ARCHIVE_LIN "tbb2020_20200415_lin_strip.tgz" +> TARGET_PATH "${TEMP}/tbb" +> SHA256 "95b2f3b0b70c7376a0c7de351a355c2c514b42c4966e77e3e34271a599501008") +> elseif(LINUX AND AARCH64) +> RESOLVE_DEPENDENCY(TBB +> ARCHIVE_LIN "keembay/tbb2020_38404_kmb_lic.tgz" +> TARGET_PATH "${TEMP}/tbb_yocto" +> ENVIRONMENT "TBBROOT" +> SHA256 "321261ff2eda6d4568a473cb883262bce77a93dac599f7bd65d2918bdee4d75b") +> elseif(APPLE AND X86_64) +> RESOLVE_DEPENDENCY(TBB +> ARCHIVE_MAC "tbb2020_20200404_mac.tgz" +> TARGET_PATH "${TEMP}/tbb" +> ENVIRONMENT "TBBROOT" +> SHA256 "ad9cf52e657660058aa6c6844914bc0fc66241fec89a392d8b79a7ff69c3c7f6") +164,168c172 +< if(DEFINED TBB_DIR) +< get_filename_component(TBB ${TBB_DIR} DIRECTORY) +< else() +< get_filename_component(TBB $ENV{TBB_DIR} DIRECTORY) +< endif() +--- +> message(FATAL_ERROR "TBB is not available on current platform") +171a176 +> update_deps_cache(TBB_DIR "${TBB}/cmake" "Path to TBB cmake folder") +184,185c189,190 +< set(OPENCV_VERSION "4.5.0") +< set(OPENCV_BUILD "36") +--- +> set(OPENCV_VERSION "4.5.1") +> set(OPENCV_BUILD "044") +205c210,211 +< VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") +--- +> VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" +> SHA256 "b5239e0e50b9009f95a29cb11f0840ec085fa07f6c4d3349adf090f1e51b0787") +215c221,222 +< VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") +--- +> VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" +> SHA256 "5250bfe5860c15eb1b31963c78804ee9b301a19d8d6e920c06ef41de681cb99e") +221c228,229 +< VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") +--- +> VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" +> SHA256 "f3ebc5cc72c86106c30cc711ac689e02281556bb43c09a89cd45cb99b6bef9a8") +228c236,238 +< elseif (LINUX_OS_NAME STREQUAL "CentOS 7" OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9") +--- +> set(OPENCV_HASH "0e787d6738092993bc92bb55975f52caabae45dc73473b5196d15e65e87d6b9d") +> elseif ((LINUX_OS_NAME STREQUAL "CentOS 7" OR +> CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9") AND X86_64) +230c240,241 +< elseif (LINUX_OS_NAME MATCHES "CentOS 8") +--- +> set(OPENCV_HASH "9b813af064d463b31fa1603b11b6559532a031d59bb0782d234380955fd397e0") +> elseif (LINUX_OS_NAME MATCHES "CentOS 8" AND X86_64) +232c243,244 +< elseif (LINUX_OS_NAME STREQUAL "Ubuntu 16.04") +--- +> set(OPENCV_HASH "8ec3e3552500dee334162386b98cc54a5608de1f1a18f283523fc0cc13ee2f83") +> elseif (LINUX_OS_NAME STREQUAL "Ubuntu 16.04" AND X86_64) +234c246,247 +< elseif (LINUX_OS_NAME STREQUAL "Ubuntu 18.04") +--- +> set(OPENCV_HASH "cd46831b4d8d1c0891d8d22ff5b2670d0a465a8a8285243059659a50ceeae2c3") +> elseif (LINUX_OS_NAME STREQUAL "Ubuntu 18.04" AND X86_64) +236c249,250 +< elseif (LINUX_OS_NAME STREQUAL "Ubuntu 20.04") +--- +> set(OPENCV_HASH "8ec3e3552500dee334162386b98cc54a5608de1f1a18f283523fc0cc13ee2f83") +> elseif ((LINUX_OS_NAME STREQUAL "Ubuntu 20.04" OR LINUX_OS_NAME STREQUAL "LinuxMint 20.1") AND X86_64) +238c252,253 +< else() +--- +> set(OPENCV_HASH "2b7808d002864acdc5fc0b19cd30dadc31a37cc267931cad605f23f2383bfc21") +> elseif(NOT DEFINED OpenCV_DIR AND NOT DEFINED ENV{OpenCV_DIR}) +245c260,261 +< VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") +--- +> VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" +> SHA256 ${OPENCV_HASH}) +265a282,283 +> else() +> reset_deps_cache(OpenCV_DIR) +268c286,288 +< include(ie_parallel) +--- +> # TODO: remove global CMAKE_MODULE_PATH +> list(APPEND CMAKE_MODULE_PATH "${IEDevScripts_DIR}") +> include(cmake/ie_parallel.cmake) +282c302,303 +< TARGET_PATH "${TEMP}/gna") +--- +> TARGET_PATH "${TEMP}/gna" +> SHA256 "b631d6cc5f6cca4a89a3f5dfa383066f3282fee25d633d9085c605bdd8090210") +285a307 +> set(GNA_HASH "cc954e67525006bf8bd353a6682e38bf208f6d74e973e0fc292850e721f17452") +288a311 +> set(GNA_HASH "20820e07392a1e876cf5577430c1c4c74b924d8f34cc17bfa3e36e641555e05d") +293c316,317 +< VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+.[0-9]+).*") +--- +> VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+.[0-9]+).*" +> SHA256 ${GNA_HASH}) +313c337,338 +< TARGET_PATH "${TEMP}/speech_demo_1.0.0.755") +--- +> TARGET_PATH "${TEMP}/speech_demo_1.0.0.755" +> SHA256 "58adef14b8a749f70fa83888614cee34b941956e6e958e445e3f48885b3c20a0") +320c345,346 +< TARGET_PATH "${TEMP}/speech_demo_1.0.0.755") +--- +> TARGET_PATH "${TEMP}/speech_demo_1.0.0.755" +> SHA256 "716201e377714ac50f3909c445d36d47a089de50a557d8ef65232de040671188") +326c352,353 +< TARGET_PATH "${TEMP}/speech_demo_1.0.0.755") +--- +> TARGET_PATH "${TEMP}/speech_demo_1.0.0.755" +> SHA256 "7714b8776ec0183ed73eed6d3d965ee6d5c15d2dc49ee5ae118cc368c89c7a9d") +336,350d362 +< +< configure_file( +< "${IE_MAIN_SOURCE_DIR}/cmake/share/InferenceEngineConfig.cmake.in" +< "${CMAKE_BINARY_DIR}/share/InferenceEngineConfig.cmake" +< @ONLY) +< +< configure_file( +< "${IE_MAIN_SOURCE_DIR}/cmake/share/InferenceEngineConfig-version.cmake.in" +< "${CMAKE_BINARY_DIR}/share/InferenceEngineConfig-version.cmake" +< COPYONLY) +< +< configure_file( +< "${IE_MAIN_SOURCE_DIR}/cmake/ie_parallel.cmake" +< "${CMAKE_BINARY_DIR}/share/ie_parallel.cmake" +< COPYONLY) diff --git a/dldt b/dldt index 8581a07..4795391 160000 --- a/dldt +++ b/dldt @@ -1 +1 @@ -Subproject commit 8581a0730d7ce24da282e8da8be8d159f769bf08 +Subproject commit 4795391b73381660b69b4cd3986c7a0bf902e868 diff --git a/download_all_stuff.sh b/download_all_stuff.sh index f907495..6e65025 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -18,11 +18,11 @@ red () { ROOT_DIR=$(pwd) green "RESET GIT SUBMODULES" -# use `git pull && git checkout tags/` for update +# use `git fetch --unshallow && git checkout tags/` for update git submodule update --init --recursive --depth=1 --jobs=4 green "CLEAN BUILD DIRS" -find build/dldt/ -mindepth 1 -not -name 'dldt_setup.sh' -delete +find build/dldt/ -mindepth 1 -not -name 'dldt_setup.sh' -not -name '*.patch' -delete find build/opencv/ -mindepth 1 -not -name 'opencv_setup.sh' -delete find build/ffmpeg/ -mindepth 1 -not -name 'ffmpeg_*.sh' -delete find build/openblas/ -mindepth 1 -not -name 'openblas_setup.sh' -delete From 726b31513b947525454d480972ad1f54baf1052a Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 16:47:47 +0200 Subject: [PATCH 46/58] dldt bugfix patch apply --- build/dldt/dldt_setup.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/dldt/dldt_setup.sh b/build/dldt/dldt_setup.sh index 1cf3d04..45cf82e 100755 --- a/build/dldt/dldt_setup.sh +++ b/build/dldt/dldt_setup.sh @@ -14,6 +14,10 @@ if [ ! -f $BLAS_LIB ] || [ ! -d $BLAS_INC ]; then exit fi +# +patch ../../dldt/inference-engine/cmake/dependencies.cmake dependencies.patch + + # Manually-specified variables were not used by the project: # -D ENABLE_NGRAPH=ON \ cmake -D CMAKE_BUILD_TYPE=Release \ From 00fc15d8fccb6ac118e27626d87536d74e5d4f7c Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 17:16:53 +0200 Subject: [PATCH 47/58] depend patch --- build/dldt/dependencies.patch | 202 +++++++--------------------------- 1 file changed, 40 insertions(+), 162 deletions(-) diff --git a/build/dldt/dependencies.patch b/build/dldt/dependencies.patch index f3410e1..53fda1b 100644 --- a/build/dldt/dependencies.patch +++ b/build/dldt/dependencies.patch @@ -1,37 +1,9 @@ -7,10c7 -< include(models) -< -< #we have number of dependencies stored on ftp -< include(dependency_solver) ---- -> # we have number of dependencies stored on ftp -35d31 -< include(linux_name) -43c39 -< include(vpu_dependencies) ---- -> include(cmake/vpu_dependencies.cmake) -63c59,60 +63c63,64 < ENVIRONMENT "OpenBLAS_DIR") --- > ENVIRONMENT "OpenBLAS_DIR" > SHA256 "c75aac901d5297d6d60a4b1f941f0335d8fd7f52e0dff8c445f644e2e45e6fba") -109c106,107 -< VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*") ---- -> VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*" -> SHA256 "62c68646747fb10f19b53217cb04a1e10ff93606f992e6b35eb8c31187c68fbf") -115c113,114 -< VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*") ---- -> VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*" -> SHA256 "7832b16d82513ee880d97c27c7626f9525ebd678decf6a8fe6c38550f73227d9") -121c120,121 -< VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*") ---- -> VERSION_REGEX ".*_([a-z]*_([a-z0-9]+\\.)*[0-9]+).*" -> SHA256 "591ea4a7e08bbe0062648916f42bded71d24c27f00af30a8f31a29b5878ea0cc") -127a128,134 +127a129,135 > > ie_cpack_add_component(omp) > file(GLOB_RECURSE source_list "${OMP}/*${CMAKE_SHARED_LIBRARY_SUFFIX}*") @@ -39,189 +11,95 @@ > DESTINATION "deployment_tools/inference_engine/external/omp/lib" > COMPONENT omp) > -132c139 -< reset_deps_cache(TBBROOT) ---- -> reset_deps_cache(TBBROOT TBB_DIR) -134,162c141,170 -< if(NOT DEFINED TBB_DIR AND NOT DEFINED ENV{TBB_DIR}) -< if (WIN32 AND X86_64) -< #TODO: add target_path to be platform specific as well, to avoid following if -< RESOLVE_DEPENDENCY(TBB -< ARCHIVE_WIN "tbb2020_20200415_win.zip" -< TARGET_PATH "${TEMP}/tbb" +140c148,149 < ENVIRONMENT "TBBROOT") -< elseif(ANDROID) # Should be before LINUX due LINUX is detected as well -< RESOLVE_DEPENDENCY(TBB -< ARCHIVE_ANDROID "tbb2020_20200404_android.tgz" -< TARGET_PATH "${TEMP}/tbb" +--- +> ENVIRONMENT "TBBROOT" +> SHA256 "f1c9b9e2861efdaa01552bd25312ccbc5feeb45551e5f91ae61e29221c5c1479") +145c154,155 < ENVIRONMENT "TBBROOT") -< elseif(LINUX AND X86_64) -< RESOLVE_DEPENDENCY(TBB -< ARCHIVE_LIN "tbb2020_20200415_lin_strip.tgz" +--- +> ENVIRONMENT "TBBROOT" +> SHA256 "f42d084224cc2d643314bd483ad180b081774608844000f132859fca3e9bf0ce") +149c159,160 < TARGET_PATH "${TEMP}/tbb") -< elseif(LINUX AND AARCH64) -< RESOLVE_DEPENDENCY(TBB -< ARCHIVE_LIN "keembay/tbb2020_38404_kmb.tgz" -< TARGET_PATH "${TEMP}/tbb_yocto" +--- +> TARGET_PATH "${TEMP}/tbb" +> SHA256 "95b2f3b0b70c7376a0c7de351a355c2c514b42c4966e77e3e34271a599501008") +154c165,166 < ENVIRONMENT "TBBROOT") -< elseif(APPLE AND X86_64) -< RESOLVE_DEPENDENCY(TBB -< ARCHIVE_MAC "tbb2020_20200404_mac.tgz" -< TARGET_PATH "${TEMP}/tbb" +--- +> ENVIRONMENT "TBBROOT" +> SHA256 "57ad3ceeab119c8a4d5e9fc38e80952fc19d4bf23ae065e9540cde89b25561d5") +159c171,172 < ENVIRONMENT "TBBROOT") -< else() -< message(FATAL_ERROR "TBB is not available on current platform") -< endif() ---- -> if (WIN32 AND X86_64) -> #TODO: add target_path to be platform specific as well, to avoid following if -> RESOLVE_DEPENDENCY(TBB -> ARCHIVE_WIN "tbb2020_20200415_win.zip" -> TARGET_PATH "${TEMP}/tbb" -> ENVIRONMENT "TBBROOT" -> SHA256 "f1c9b9e2861efdaa01552bd25312ccbc5feeb45551e5f91ae61e29221c5c1479") -> elseif(ANDROID) # Should be before LINUX due LINUX is detected as well -> RESOLVE_DEPENDENCY(TBB -> ARCHIVE_ANDROID "tbb2020_20200404_android.tgz" -> TARGET_PATH "${TEMP}/tbb" -> ENVIRONMENT "TBBROOT" -> SHA256 "f42d084224cc2d643314bd483ad180b081774608844000f132859fca3e9bf0ce") -> elseif(LINUX AND X86_64) -> RESOLVE_DEPENDENCY(TBB -> ARCHIVE_LIN "tbb2020_20200415_lin_strip.tgz" -> TARGET_PATH "${TEMP}/tbb" -> SHA256 "95b2f3b0b70c7376a0c7de351a355c2c514b42c4966e77e3e34271a599501008") -> elseif(LINUX AND AARCH64) -> RESOLVE_DEPENDENCY(TBB -> ARCHIVE_LIN "keembay/tbb2020_38404_kmb_lic.tgz" -> TARGET_PATH "${TEMP}/tbb_yocto" -> ENVIRONMENT "TBBROOT" -> SHA256 "321261ff2eda6d4568a473cb883262bce77a93dac599f7bd65d2918bdee4d75b") -> elseif(APPLE AND X86_64) -> RESOLVE_DEPENDENCY(TBB -> ARCHIVE_MAC "tbb2020_20200404_mac.tgz" -> TARGET_PATH "${TEMP}/tbb" -> ENVIRONMENT "TBBROOT" -> SHA256 "ad9cf52e657660058aa6c6844914bc0fc66241fec89a392d8b79a7ff69c3c7f6") -164,168c172 -< if(DEFINED TBB_DIR) -< get_filename_component(TBB ${TBB_DIR} DIRECTORY) -< else() -< get_filename_component(TBB $ENV{TBB_DIR} DIRECTORY) -< endif() ---- -> message(FATAL_ERROR "TBB is not available on current platform") -171a176 -> update_deps_cache(TBB_DIR "${TBB}/cmake" "Path to TBB cmake folder") -184,185c189,190 +--- +> ENVIRONMENT "TBBROOT" +> SHA256 "ad9cf52e657660058aa6c6844914bc0fc66241fec89a392d8b79a7ff69c3c7f6") +184,185c197,198 < set(OPENCV_VERSION "4.5.0") < set(OPENCV_BUILD "36") --- > set(OPENCV_VERSION "4.5.1") > set(OPENCV_BUILD "044") -205c210,211 +205c218,219 < VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") --- > VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" > SHA256 "b5239e0e50b9009f95a29cb11f0840ec085fa07f6c4d3349adf090f1e51b0787") -215c221,222 +215c229,230 < VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") --- > VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" > SHA256 "5250bfe5860c15eb1b31963c78804ee9b301a19d8d6e920c06ef41de681cb99e") -221c228,229 +221c236,237 < VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") --- > VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" > SHA256 "f3ebc5cc72c86106c30cc711ac689e02281556bb43c09a89cd45cb99b6bef9a8") -228c236,238 -< elseif (LINUX_OS_NAME STREQUAL "CentOS 7" OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9") ---- +227a244 > set(OPENCV_HASH "0e787d6738092993bc92bb55975f52caabae45dc73473b5196d15e65e87d6b9d") -> elseif ((LINUX_OS_NAME STREQUAL "CentOS 7" OR -> CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9") AND X86_64) -230c240,241 -< elseif (LINUX_OS_NAME MATCHES "CentOS 8") ---- +229a247 > set(OPENCV_HASH "9b813af064d463b31fa1603b11b6559532a031d59bb0782d234380955fd397e0") -> elseif (LINUX_OS_NAME MATCHES "CentOS 8" AND X86_64) -232c243,244 -< elseif (LINUX_OS_NAME STREQUAL "Ubuntu 16.04") ---- +231a250 > set(OPENCV_HASH "8ec3e3552500dee334162386b98cc54a5608de1f1a18f283523fc0cc13ee2f83") -> elseif (LINUX_OS_NAME STREQUAL "Ubuntu 16.04" AND X86_64) -234c246,247 -< elseif (LINUX_OS_NAME STREQUAL "Ubuntu 18.04") ---- +233a253 > set(OPENCV_HASH "cd46831b4d8d1c0891d8d22ff5b2670d0a465a8a8285243059659a50ceeae2c3") -> elseif (LINUX_OS_NAME STREQUAL "Ubuntu 18.04" AND X86_64) -236c249,250 -< elseif (LINUX_OS_NAME STREQUAL "Ubuntu 20.04") ---- +235a256 > set(OPENCV_HASH "8ec3e3552500dee334162386b98cc54a5608de1f1a18f283523fc0cc13ee2f83") -> elseif ((LINUX_OS_NAME STREQUAL "Ubuntu 20.04" OR LINUX_OS_NAME STREQUAL "LinuxMint 20.1") AND X86_64) -238c252,253 -< else() ---- +237a259 > set(OPENCV_HASH "2b7808d002864acdc5fc0b19cd30dadc31a37cc267931cad605f23f2383bfc21") -> elseif(NOT DEFINED OpenCV_DIR AND NOT DEFINED ENV{OpenCV_DIR}) -245c260,261 +245c267,268 < VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") --- > VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" > SHA256 ${OPENCV_HASH}) -265a282,283 -> else() -> reset_deps_cache(OpenCV_DIR) -268c286,288 -< include(ie_parallel) ---- -> # TODO: remove global CMAKE_MODULE_PATH -> list(APPEND CMAKE_MODULE_PATH "${IEDevScripts_DIR}") -> include(cmake/ie_parallel.cmake) -282c302,303 +282c305,306 < TARGET_PATH "${TEMP}/gna") --- > TARGET_PATH "${TEMP}/gna" > SHA256 "b631d6cc5f6cca4a89a3f5dfa383066f3282fee25d633d9085c605bdd8090210") -285a307 +285a310 > set(GNA_HASH "cc954e67525006bf8bd353a6682e38bf208f6d74e973e0fc292850e721f17452") -288a311 +288a314 > set(GNA_HASH "20820e07392a1e876cf5577430c1c4c74b924d8f34cc17bfa3e36e641555e05d") -293c316,317 +293c319,320 < VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+.[0-9]+).*") --- > VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+.[0-9]+).*" > SHA256 ${GNA_HASH}) -313c337,338 +313c340,341 < TARGET_PATH "${TEMP}/speech_demo_1.0.0.755") --- > TARGET_PATH "${TEMP}/speech_demo_1.0.0.755" > SHA256 "58adef14b8a749f70fa83888614cee34b941956e6e958e445e3f48885b3c20a0") -320c345,346 +320c348,349 < TARGET_PATH "${TEMP}/speech_demo_1.0.0.755") --- > TARGET_PATH "${TEMP}/speech_demo_1.0.0.755" > SHA256 "716201e377714ac50f3909c445d36d47a089de50a557d8ef65232de040671188") -326c352,353 +326c355,356 < TARGET_PATH "${TEMP}/speech_demo_1.0.0.755") --- > TARGET_PATH "${TEMP}/speech_demo_1.0.0.755" > SHA256 "7714b8776ec0183ed73eed6d3d965ee6d5c15d2dc49ee5ae118cc368c89c7a9d") -336,350d362 -< -< configure_file( -< "${IE_MAIN_SOURCE_DIR}/cmake/share/InferenceEngineConfig.cmake.in" -< "${CMAKE_BINARY_DIR}/share/InferenceEngineConfig.cmake" -< @ONLY) -< -< configure_file( -< "${IE_MAIN_SOURCE_DIR}/cmake/share/InferenceEngineConfig-version.cmake.in" -< "${CMAKE_BINARY_DIR}/share/InferenceEngineConfig-version.cmake" -< COPYONLY) -< -< configure_file( -< "${IE_MAIN_SOURCE_DIR}/cmake/ie_parallel.cmake" -< "${CMAKE_BINARY_DIR}/share/ie_parallel.cmake" -< COPYONLY) From 650b43da79f2c0e355e7da07cfbd7596b5f2ee3d Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 18:00:47 +0200 Subject: [PATCH 48/58] patch fix and python link todo --- TODO.md | 2 - build/dldt/dependencies.patch | 99 ----------------------------------- 2 files changed, 101 deletions(-) diff --git a/TODO.md b/TODO.md index 67a4b91..ed2509c 100644 --- a/TODO.md +++ b/TODO.md @@ -1,10 +1,8 @@ # TODO list - + add [OpenCV's Apache 2 license](https://github.com/opencv/opencv/blob/master/LICENSE) into python package + remove `LICENSE-INTEL`, `LICENSE-3RD-PARTY` + add Ubuntu version check in tests -+ do we still need `sudo ln -s /usr/bin/python3 /usr/bin/python`? + Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 + check JIT speed + https://answers.opencv.org/question/236271/what-the-difference-between-cv_version_status-values/ diff --git a/build/dldt/dependencies.patch b/build/dldt/dependencies.patch index 53fda1b..85418dc 100644 --- a/build/dldt/dependencies.patch +++ b/build/dldt/dependencies.patch @@ -1,105 +1,6 @@ -63c63,64 -< ENVIRONMENT "OpenBLAS_DIR") ---- -> ENVIRONMENT "OpenBLAS_DIR" -> SHA256 "c75aac901d5297d6d60a4b1f941f0335d8fd7f52e0dff8c445f644e2e45e6fba") -127a129,135 -> -> ie_cpack_add_component(omp) -> file(GLOB_RECURSE source_list "${OMP}/*${CMAKE_SHARED_LIBRARY_SUFFIX}*") -> install(FILES ${source_list} -> DESTINATION "deployment_tools/inference_engine/external/omp/lib" -> COMPONENT omp) -> -140c148,149 -< ENVIRONMENT "TBBROOT") ---- -> ENVIRONMENT "TBBROOT" -> SHA256 "f1c9b9e2861efdaa01552bd25312ccbc5feeb45551e5f91ae61e29221c5c1479") -145c154,155 -< ENVIRONMENT "TBBROOT") ---- -> ENVIRONMENT "TBBROOT" -> SHA256 "f42d084224cc2d643314bd483ad180b081774608844000f132859fca3e9bf0ce") -149c159,160 -< TARGET_PATH "${TEMP}/tbb") ---- -> TARGET_PATH "${TEMP}/tbb" -> SHA256 "95b2f3b0b70c7376a0c7de351a355c2c514b42c4966e77e3e34271a599501008") -154c165,166 -< ENVIRONMENT "TBBROOT") ---- -> ENVIRONMENT "TBBROOT" -> SHA256 "57ad3ceeab119c8a4d5e9fc38e80952fc19d4bf23ae065e9540cde89b25561d5") -159c171,172 -< ENVIRONMENT "TBBROOT") ---- -> ENVIRONMENT "TBBROOT" -> SHA256 "ad9cf52e657660058aa6c6844914bc0fc66241fec89a392d8b79a7ff69c3c7f6") 184,185c197,198 < set(OPENCV_VERSION "4.5.0") < set(OPENCV_BUILD "36") --- > set(OPENCV_VERSION "4.5.1") > set(OPENCV_BUILD "044") -205c218,219 -< VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") ---- -> VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" -> SHA256 "b5239e0e50b9009f95a29cb11f0840ec085fa07f6c4d3349adf090f1e51b0787") -215c229,230 -< VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") ---- -> VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" -> SHA256 "5250bfe5860c15eb1b31963c78804ee9b301a19d8d6e920c06ef41de681cb99e") -221c236,237 -< VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") ---- -> VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" -> SHA256 "f3ebc5cc72c86106c30cc711ac689e02281556bb43c09a89cd45cb99b6bef9a8") -227a244 -> set(OPENCV_HASH "0e787d6738092993bc92bb55975f52caabae45dc73473b5196d15e65e87d6b9d") -229a247 -> set(OPENCV_HASH "9b813af064d463b31fa1603b11b6559532a031d59bb0782d234380955fd397e0") -231a250 -> set(OPENCV_HASH "8ec3e3552500dee334162386b98cc54a5608de1f1a18f283523fc0cc13ee2f83") -233a253 -> set(OPENCV_HASH "cd46831b4d8d1c0891d8d22ff5b2670d0a465a8a8285243059659a50ceeae2c3") -235a256 -> set(OPENCV_HASH "8ec3e3552500dee334162386b98cc54a5608de1f1a18f283523fc0cc13ee2f83") -237a259 -> set(OPENCV_HASH "2b7808d002864acdc5fc0b19cd30dadc31a37cc267931cad605f23f2383bfc21") -245c267,268 -< VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*") ---- -> VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+).*" -> SHA256 ${OPENCV_HASH}) -282c305,306 -< TARGET_PATH "${TEMP}/gna") ---- -> TARGET_PATH "${TEMP}/gna" -> SHA256 "b631d6cc5f6cca4a89a3f5dfa383066f3282fee25d633d9085c605bdd8090210") -285a310 -> set(GNA_HASH "cc954e67525006bf8bd353a6682e38bf208f6d74e973e0fc292850e721f17452") -288a314 -> set(GNA_HASH "20820e07392a1e876cf5577430c1c4c74b924d8f34cc17bfa3e36e641555e05d") -293c319,320 -< VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+.[0-9]+).*") ---- -> VERSION_REGEX ".*_([0-9]+.[0-9]+.[0-9]+.[0-9]+).*" -> SHA256 ${GNA_HASH}) -313c340,341 -< TARGET_PATH "${TEMP}/speech_demo_1.0.0.755") ---- -> TARGET_PATH "${TEMP}/speech_demo_1.0.0.755" -> SHA256 "58adef14b8a749f70fa83888614cee34b941956e6e958e445e3f48885b3c20a0") -320c348,349 -< TARGET_PATH "${TEMP}/speech_demo_1.0.0.755") ---- -> TARGET_PATH "${TEMP}/speech_demo_1.0.0.755" -> SHA256 "716201e377714ac50f3909c445d36d47a089de50a557d8ef65232de040671188") -326c355,356 -< TARGET_PATH "${TEMP}/speech_demo_1.0.0.755") ---- -> TARGET_PATH "${TEMP}/speech_demo_1.0.0.755" -> SHA256 "7714b8776ec0183ed73eed6d3d965ee6d5c15d2dc49ee5ae118cc368c89c7a9d") From b99060b73f6277e80e1aefb83d559ad1956b81c8 Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 18:03:09 +0200 Subject: [PATCH 49/58] restore changes in shallow submodules --- download_all_stuff.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/download_all_stuff.sh b/download_all_stuff.sh index 6e65025..5eff640 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -20,12 +20,14 @@ ROOT_DIR=$(pwd) green "RESET GIT SUBMODULES" # use `git fetch --unshallow && git checkout tags/` for update git submodule update --init --recursive --depth=1 --jobs=4 +# restore changes +git submodule foreach --recursive git restore . green "CLEAN BUILD DIRS" find build/dldt/ -mindepth 1 -not -name 'dldt_setup.sh' -not -name '*.patch' -delete find build/opencv/ -mindepth 1 -not -name 'opencv_setup.sh' -delete -find build/ffmpeg/ -mindepth 1 -not -name 'ffmpeg_*.sh' -delete -find build/openblas/ -mindepth 1 -not -name 'openblas_setup.sh' -delete +#find build/ffmpeg/ -mindepth 1 -not -name 'ffmpeg_*.sh' -delete +#find build/openblas/ -mindepth 1 -not -name 'openblas_setup.sh' -delete green "CLEAN WHEEL DIR" find create_wheel/cv2/ -type f -not -name '__init__.py' -delete From 7ce0c8ea50e0dc5969d18e449aa31e708184aa45 Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 18:20:39 +0200 Subject: [PATCH 50/58] license and versionong change --- README.md | 5 +- TODO.md | 8 +- create_wheel/LICENSE | 223 +++++++++++-- create_wheel/LICENSE-3RD-PARTY | 587 --------------------------------- create_wheel/LICENSE-INTEL | 28 -- create_wheel/LICENSE_MIT | 21 ++ create_wheel/setup.py | 3 +- 7 files changed, 230 insertions(+), 645 deletions(-) delete mode 100644 create_wheel/LICENSE-3RD-PARTY delete mode 100644 create_wheel/LICENSE-INTEL create mode 100644 create_wheel/LICENSE_MIT diff --git a/README.md b/README.md index e0e014b..c32bbef 100644 --- a/README.md +++ b/README.md @@ -70,8 +70,9 @@ For additional info read `cv2.getBuildInformation()` output. ### Versioning -The first 3 letters are the version of OpenCV, the last one -- package version. E.g, `4.1.0.2` -- 2nd version of based on 4.1.0 OpenCV package. Package versions are not continuously numbered -- each new OpenCV version starts its own numbering. - +The first 3 letters are the version of OpenCV, underscore, then inference engine (dldt/openvino) version, underscore, package version. +E.g, `4.5.1_2120.2_0` -- first version of based on 4.5.1 OpenCV package with 2021.2 inference engine module. +Package versions are not continuously numbered -- each new OpenCV-dldt version pair starts its own numbering. ## Compiling from source diff --git a/TODO.md b/TODO.md index ed2509c..a56e403 100644 --- a/TODO.md +++ b/TODO.md @@ -1,10 +1,8 @@ # TODO list -+ add [OpenCV's Apache 2 license](https://github.com/opencv/opencv/blob/master/LICENSE) into python package -+ remove `LICENSE-INTEL`, `LICENSE-3RD-PARTY` + add Ubuntu version check in tests -+ Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 + check JIT speed -+ https://answers.opencv.org/question/236271/what-the-difference-between-cv_version_status-values/ + add examples -+ versioning change ++ dldt config keeps downloaded libs -- this is bad ++ Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 ++ https://answers.opencv.org/question/236271/what-the-difference-between-cv_version_status-values/ diff --git a/create_wheel/LICENSE b/create_wheel/LICENSE index cc50cd6..d645695 100644 --- a/create_wheel/LICENSE +++ b/create_wheel/LICENSE @@ -1,21 +1,202 @@ -MIT License - -Copyright (c) 2019 Kabakov Borys - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/create_wheel/LICENSE-3RD-PARTY b/create_wheel/LICENSE-3RD-PARTY deleted file mode 100644 index 9daba95..0000000 --- a/create_wheel/LICENSE-3RD-PARTY +++ /dev/null @@ -1,587 +0,0 @@ -OpenCV library is redistributed within opencv-python package. -This license applies to OpenCV binary in the directory cv2/. - -By downloading, copying, installing or using the software you agree to this license. -If you do not agree to this license, do not download, install, -copy or use the software. - - - License Agreement - For Open Source Computer Vision Library - (3-clause BSD License) - -Copyright (C) 2000-2018, Intel Corporation, all rights reserved. -Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved. -Copyright (C) 2009-2016, NVIDIA Corporation, all rights reserved. -Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. -Copyright (C) 2015-2016, OpenCV Foundation, all rights reserved. -Copyright (C) 2015-2016, Itseez Inc., all rights reserved. -Third party copyrights are property of their respective owners. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the names of the copyright holders nor the names of the contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -This software is provided by the copyright holders and contributors "as is" and -any express or implied warranties, including, but not limited to, the implied -warranties of merchantability and fitness for a particular purpose are disclaimed. -In no event shall copyright holders or contributors be liable for any direct, -indirect, incidental, special, exemplary, or consequential damages -(including, but not limited to, procurement of substitute goods or services; -loss of use, data, or profits; or business interruption) however caused -and on any theory of liability, whether in contract, strict liability, -or tort (including negligence or otherwise) arising in any way out of -the use of this software, even if advised of the possibility of such damage. - ------------------------------------------------------------------------------- -libvpx is redistributed within opencv-python Linux packages. -This license applies to libvpx binary in the directory cv2/. - -Copyright (c) 2010, The WebM Project authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google, nor the WebM Project, nor the names - of its contributors may be used to endorse or promote products - derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------------------------------------------------------------------------------- -FFmpeg is redistributed within opencv-python Windows packages. -Qt 4.8.7 is redistributed within opencv-python Linux and macOS packages. -This license applies to FFmpeg and Qt binaries in the directory cv2/. - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/create_wheel/LICENSE-INTEL b/create_wheel/LICENSE-INTEL deleted file mode 100644 index 08202f6..0000000 --- a/create_wheel/LICENSE-INTEL +++ /dev/null @@ -1,28 +0,0 @@ -Intel Simplified Software License (Version February 2020) - -Use and Redistribution. You may use and redistribute the software (the “Software”), without modification, provided the following conditions are met: - - Redistributions must reproduce the above copyright notice and the following terms of use in the Software and in the documentation and/or other materials provided with the distribution. - Neither the name of Intel nor the names of its suppliers may be used to endorse or promote products derived from this Software without specific prior written permission. - No reverse engineering, decompilation, or disassembly of this Software is permitted. - -Limited patent license. Intel grants you a world-wide, royalty-free, non-exclusive license under patents it now or hereafter owns or controls to make, have made, use, import, offer to sell and sell (“Utilize”) this Software, but solely to the extent that any such patent is necessary to Utilize the Software alone. The patent license shall not apply to any combinations which include this software. No hardware per se is licensed hereunder. - -Third party programs. The Software may contain Third Party Programs. “Third Party Programs” are third party software, open source software or other Intel software listed in the “third-party-programs.txt” or other similarly named text file that is included with the Software. Third Party Programs, even if included with the distribution of the Software, may be governed by separate license terms, including without limitation, third party license terms, open source software notices and terms, and/or other Intel software license terms. These separate license terms may govern your use of the Third Party Programs. - -DISCLAIMER. THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED. THIS SOFTWARE IS NOT INTENDED FOR USE IN SYSTEMS OR APPLICATIONS WHERE FAILURE OF THE SOFTWARE MAY CAUSE PERSONAL INJURY OR DEATH AND YOU AGREE THAT YOU ARE FULLY RESPONSIBLE FOR ANY CLAIMS, COSTS, DAMAGES, EXPENSES, AND ATTORNEYS’ FEES ARISING OUT OF ANY SUCH USE, EVEN IF ANY CLAIM ALLEGES THAT INTEL WAS NEGLIGENT REGARDING THE DESIGN OR MANUFACTURE OF THE MATERIALS. - -LIMITATION OF LIABILITY. IN NO EVENT WILL INTEL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. YOU AGREE TO INDEMNIFY AND HOLD INTEL HARMLESS AGAINST ANY CLAIMS AND EXPENSES RESULTING FROM YOUR USE OR UNAUTHORIZED USE OF THE SOFTWARE. - -No support. Intel may make changes to the Software, at any time without notice, and is not obligated to support, update or provide training for the Software. - -Termination. Intel may terminate your right to use the Software in the event of your breach of this Agreement and you fail to cure the breach within a reasonable period of time. - -Feedback. Should you provide Intel with comments, modifications, corrections, enhancements or other input (“Feedback”) related to the Software Intel will be free to use, disclose, reproduce, license or otherwise distribute or exploit the Feedback in its sole discretion without any obligations or restrictions of any kind, including without limitation, intellectual property rights or licensing obligations. - -Compliance with laws. You agree to comply with all relevant laws and regulations governing your use, transfer, import or export (or prohibition thereof) of the Software. - -Governing law. All disputes will be governed by the laws of the United States of America and the State of Delaware without reference to conflict of law principles and subject to the exclusive jurisdiction of the state or federal courts sitting in the State of Delaware, and each party agrees that it submits to the personal jurisdiction and venue of those courts and waives any objections. The United Nations Convention on Contracts for the International Sale of Goods (1980) is specifically excluded and will not apply to the Software. - -*Other names and brands may be claimed as the property of others. - diff --git a/create_wheel/LICENSE_MIT b/create_wheel/LICENSE_MIT new file mode 100644 index 0000000..cc50cd6 --- /dev/null +++ b/create_wheel/LICENSE_MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Kabakov Borys + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/create_wheel/setup.py b/create_wheel/setup.py index f4d919e..47a7c54 100644 --- a/create_wheel/setup.py +++ b/create_wheel/setup.py @@ -15,7 +15,7 @@ def __len__(self): setuptools.setup( name="opencv-python-inference-engine", - version="4.5.0.0", + version="4.5.1_2021.2_0", url="https://github.com/banderlog/opencv-python-inference-engine", maintainer="Kabakov Borys", license='MIT, Apache 2.0', @@ -34,7 +34,6 @@ def __len__(self): 'Intended Audience :: Education', 'Intended Audience :: Information Technology', 'Intended Audience :: Science/Research', - 'License :: OSI Approved :: MIT License', 'Programming Language :: Python :: 3', 'Programming Language :: C++', 'Operating System :: POSIX :: Linux', From 46af98b72deb89abd64876c47a9091f05d60ebac Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 18:39:50 +0200 Subject: [PATCH 51/58] ubuntu version check --- TODO.md | 5 ++--- download_all_stuff.sh | 9 +++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/TODO.md b/TODO.md index a56e403..028ec7e 100644 --- a/TODO.md +++ b/TODO.md @@ -1,8 +1,7 @@ # TODO list -+ add Ubuntu version check in tests -+ check JIT speed -+ add examples + dldt config keeps downloaded libs -- this is bad ++ add examples ++ check JIT speed + Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 + https://answers.opencv.org/question/236271/what-the-difference-between-cv_version_status-values/ diff --git a/download_all_stuff.sh b/download_all_stuff.sh index 5eff640..06b7352 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -17,6 +17,11 @@ red () { ROOT_DIR=$(pwd) +# check Ubuntu version (20.04 build will not work on 18.04) +if test $(lsb_release -rs) != 18.04; then + red "\n!!! You are NOT on the Ubuntu 18.04 !!!\n" +fi + green "RESET GIT SUBMODULES" # use `git fetch --unshallow && git checkout tags/` for update git submodule update --init --recursive --depth=1 --jobs=4 @@ -26,8 +31,8 @@ git submodule foreach --recursive git restore . green "CLEAN BUILD DIRS" find build/dldt/ -mindepth 1 -not -name 'dldt_setup.sh' -not -name '*.patch' -delete find build/opencv/ -mindepth 1 -not -name 'opencv_setup.sh' -delete -#find build/ffmpeg/ -mindepth 1 -not -name 'ffmpeg_*.sh' -delete -#find build/openblas/ -mindepth 1 -not -name 'openblas_setup.sh' -delete +find build/ffmpeg/ -mindepth 1 -not -name 'ffmpeg_*.sh' -delete +find build/openblas/ -mindepth 1 -not -name 'openblas_setup.sh' -delete green "CLEAN WHEEL DIR" find create_wheel/cv2/ -type f -not -name '__init__.py' -delete From c39dae6a5020798c13a4ddacc73433c6d7d4d8e3 Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 18:40:08 +0200 Subject: [PATCH 52/58] dldt version upd --- build/opencv/opencv_setup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/opencv/opencv_setup.sh b/build/opencv/opencv_setup.sh index 9590442..a9f7931 100755 --- a/build/opencv/opencv_setup.sh +++ b/build/opencv/opencv_setup.sh @@ -75,8 +75,8 @@ cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D WITH_NGRAPH=ON \ -D ngraph_DIR=$ABS_PORTION/build/dldt/ngraph \ -D WITH_INF_ENGINE=ON \ - -D INF_ENGINE_RELEASE=2021010000 \ + -D INF_ENGINE_RELEASE=2021020000 \ -D INF_ENGINE_INCLUDE_DIRS=$ABS_PORTION/dldt/inference-engine/include \ -D INF_ENGINE_LIB_DIRS=$ABS_PORTION/dldt/bin/intel64/Release/lib \ -D CPU_BASELINE=SSE4_2 \ - -D CPU_DISPATCH=AVX,AVX2,FP16,AVX512 ../../opencv \ No newline at end of file + -D CPU_DISPATCH=AVX,AVX2,FP16,AVX512 ../../opencv From 4835c4b4fb1fbeec3c6f6c12adfeef96a1dee929 Mon Sep 17 00:00:00 2001 From: banderlog Date: Sun, 28 Feb 2021 19:14:17 +0200 Subject: [PATCH 53/58] numpy import problem --- create_wheel/setup.py | 2 +- download_all_stuff.sh | 2 +- requirements.txt | 1 + tests/requirements.txt | 4 ++-- 4 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 requirements.txt diff --git a/create_wheel/setup.py b/create_wheel/setup.py index 47a7c54..41efd2d 100644 --- a/create_wheel/setup.py +++ b/create_wheel/setup.py @@ -26,7 +26,7 @@ def __len__(self): packages=['cv2'], package_data={'cv2': ['*.so*', '*.mvcmd', '*.xml']}, include_package_data=True, - install_requires=['numpy'], + install_requires=['numpy~=1.19.2'], classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Console', diff --git a/download_all_stuff.sh b/download_all_stuff.sh index 06b7352..23aee64 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -45,5 +45,5 @@ cd $ROOT_DIR if [[ ! -d ./venv ]]; then virtualenv --clear --always-copy -p /usr/bin/python3 ./venv - ./venv/bin/pip3 install numpy + ./venv/bin/pip3 install -r requirements.txt fi diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7f2254c --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +numpy==1.19.2 diff --git a/tests/requirements.txt b/tests/requirements.txt index e27ec9c..c24868d 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,5 +1,5 @@ -numpy>=1.16.0,<1.19.0 -tensorflow-cpu>=2.4.0 +tensorflow-cpu>=2.4.1 +numpy==1.19.2 scipy==1.4.1 scikit-image ipython From 5e083fb10c31723c65fea21d75788a9ef11fbc87 Mon Sep 17 00:00:00 2001 From: Borys Kabakov Date: Sun, 28 Feb 2021 19:18:52 +0200 Subject: [PATCH 54/58] Update TODO.md --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index 028ec7e..3a7cdc6 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,6 @@ # TODO list ++ numpy version should be the same as for tensorflow-cpu + dldt config keeps downloaded libs -- this is bad + add examples + check JIT speed From 33ae09879d7f502132e27c70aab6ac7381111b7c Mon Sep 17 00:00:00 2001 From: banderlog Date: Mon, 1 Mar 2021 14:21:24 +0200 Subject: [PATCH 55/58] remove untracked --- TODO.md | 1 - download_all_stuff.sh | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index 3a7cdc6..c06de8c 100644 --- a/TODO.md +++ b/TODO.md @@ -1,7 +1,6 @@ # TODO list + numpy version should be the same as for tensorflow-cpu -+ dldt config keeps downloaded libs -- this is bad + add examples + check JIT speed + Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 diff --git a/download_all_stuff.sh b/download_all_stuff.sh index 23aee64..5e7bf39 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -27,6 +27,8 @@ green "RESET GIT SUBMODULES" git submodule update --init --recursive --depth=1 --jobs=4 # restore changes git submodule foreach --recursive git restore . +# remove untracked +git submodule foreach --recursive git clean -dxf green "CLEAN BUILD DIRS" find build/dldt/ -mindepth 1 -not -name 'dldt_setup.sh' -not -name '*.patch' -delete From d92a301882a572dadc0dccff575472a406403ea9 Mon Sep 17 00:00:00 2001 From: banderlog Date: Mon, 1 Mar 2021 23:42:08 +0200 Subject: [PATCH 56/58] oldubuntu fix --- TODO.md | 3 ++- download_all_stuff.sh | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/TODO.md b/TODO.md index c06de8c..2455209 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,7 @@ # TODO list -+ numpy version should be the same as for tensorflow-cpu ++ numpy version should be the same as for tensorflow-cpu (?) ++ get rid of tensorflow-cpu in tests + add examples + check JIT speed + Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 diff --git a/download_all_stuff.sh b/download_all_stuff.sh index 5e7bf39..f13ead1 100755 --- a/download_all_stuff.sh +++ b/download_all_stuff.sh @@ -25,8 +25,8 @@ fi green "RESET GIT SUBMODULES" # use `git fetch --unshallow && git checkout tags/` for update git submodule update --init --recursive --depth=1 --jobs=4 -# restore changes -git submodule foreach --recursive git restore . +# restore changes command will differ between GIT versions (e.g., `restore`) +git submodule foreach --recursive git checkout . # remove untracked git submodule foreach --recursive git clean -dxf From ed3b0de57b704d91f0363f7a0f482c97aa72c0b4 Mon Sep 17 00:00:00 2001 From: banderlog Date: Tue, 2 Mar 2021 15:32:30 +0200 Subject: [PATCH 57/58] examples added --- README.md | 2 +- tests/examples.ipynb | 248 +++++++++++++++++++++++++++++++++++++++++++ tests/tests.ipynb | 121 --------------------- 3 files changed, 249 insertions(+), 122 deletions(-) create mode 100644 tests/examples.ipynb delete mode 100644 tests/tests.ipynb diff --git a/README.md b/README.md index c32bbef..57f91db 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ pip3 install opencv-python-inference-engine ## Examples of usage -I'll do more straightforward and well-documented examples of usage in the foreseeable future. But for now, please see the tests folder. +Please see the `examples.ipynb` in the `tests` folder. You will need to preprocess data as a model requires and decode the output. A description of the decoding *should* be in the model documentation with examples in open-vino documentation, however, in some cases, the original article may be the only information source. Some models are very simple to encode/decode, others are tough (e.g., PixelLink in tests). diff --git a/tests/examples.ipynb b/tests/examples.ipynb new file mode 100644 index 0000000..3a2d4ee --- /dev/null +++ b/tests/examples.ipynb @@ -0,0 +1,248 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Examples\n", + "\n", + "Models for examples should be downloaded manually, or just run `prepare_and_run_tests.sh`\n", + "\n", + "For actual code, please refer to python modules, from where model classes were imported" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RateMe is a YOLO3 example\n", + "\n", + "It trained to detect like/dislike gestures\n", + "\n", + "https://github.com/heyml/rateme" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import cv2\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from rateme.utils import RateMe" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'dislike'" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = RateMe()\n", + "img = cv2.imread('dislike.jpg')\n", + "model.predict(img)\n", + "#'dislike'" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# show original RGB image\n", + "plt.imshow(img[::,::,::-1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Text detection and recognition pipeline\n", + "\n", + "PixelLink (text detector):\n", + "+ [description](https://github.com/openvinotoolkit/open_model_zoo/blob/master/models/intel/text-detection-0004/description/text-detection-0004.md)\n", + "+ [original article](https://arxiv.org/abs/1801.01315)\n", + "\n", + "Text Recognizer (BiLSTM + VGG16):\n", + "+ [description](https://github.com/openvinotoolkit/open_model_zoo/blob/master/models/intel/text-recognition-0012/description/text-recognition-0012.md)\n", + "\n", + "> The network output can be decoded by CTC Greedy Decoder or CTC Beam Search decoder\n", + "\n", + "For that I am using TensorFlow" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['hello', 'world']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import cv2\n", + "from pixellink import PixelLinkDetector\n", + "from text_recognition import TextRecognizer\n", + " \n", + "img = cv2.imread('helloworld.png')\n", + "detector4 = PixelLinkDetector('text-detection-0004.xml')\n", + "detector4.detect(img)\n", + "bboxes = detector4.decode()\n", + "\n", + "recognizer12 = TextRecognizer('./text-recognition-0012.xml')\n", + "recognizer12.do_ocr(img, bboxes)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Text detection output" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "tmp = img.copy()\n", + "for b in bboxes:\n", + " cv2.rectangle(tmp, (b[1], b[0]), (b[3], b[2]), (255, 255, 0), 5)\n", + "plt.imshow(tmp)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# text mask, from which bounding boxes were calculated\n", + "plt.imshow(detector4.get_mask())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tests/tests.ipynb b/tests/tests.ipynb deleted file mode 100644 index 3208194..0000000 --- a/tests/tests.ipynb +++ /dev/null @@ -1,121 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import cv2\n", - "from rateme.utils import RateMe\n", - "\n", - "model = RateMe()\n", - "img = cv2.imread('dislike.jpg')\n", - "model.predict(img)\n", - "#'dislike'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import cv2\n", - "from pixellink import PixelLinkDetector\n", - "from text_recognition import TextRecognizer\n", - " \n", - "img = cv2.imread('helloworld.png')\n", - "detector4 = PixelLinkDetector('text-detection-0004.xml')\n", - "detector4.detect(img)\n", - "bboxes = detector4.decode()\n", - "\n", - "recognizer12 = TextRecognizer('./text-recognition-0012.xml')\n", - "recognizer12.do_ocr(img, bboxes)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "\n", - "tmp = img.copy()\n", - "for b in bboxes:\n", - " cv2.rectangle(tmp, (b[1], b[0]), (b[3], b[2]), (255, 255, 0), 5)\n", - "plt.imshow(tmp)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# plt.imshow(detector4.get_mask())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import cv2\n", - "import matplotlib.pyplot as plt\n", - "\n", - "\n", - "cap = cv2.VideoCapture('short_video.mp4')\n", - "\n", - "a, img = cap.read()\n", - "\n", - "plt.imshow(img[::,::,::-1])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.9" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} From 3c439f065881c16a0f51f5187ff6cb5adfe25001 Mon Sep 17 00:00:00 2001 From: banderlog Date: Tue, 2 Mar 2021 15:33:15 +0200 Subject: [PATCH 58/58] todo upd --- TODO.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/TODO.md b/TODO.md index 2455209..ab6fc57 100644 --- a/TODO.md +++ b/TODO.md @@ -1,8 +1,5 @@ # TODO list -+ numpy version should be the same as for tensorflow-cpu (?) + get rid of tensorflow-cpu in tests -+ add examples -+ check JIT speed + Auto value for `-D INF_ENGINE_RELEASE`: https://github.com/openvinotoolkit/openvino/issues/1435 + https://answers.opencv.org/question/236271/what-the-difference-between-cv_version_status-values/