improve setup script and update readme accordingly

This commit is contained in:
Mathieu Broillet 2024-07-19 21:42:47 +02:00
parent a9807154bc
commit c692f88fce
Signed by: mathieu
GPG Key ID: C4A6176ABC6B2DFC
4 changed files with 162 additions and 79 deletions

View File

@ -42,24 +42,12 @@ the ``dist`` folder.
## Setup development environment ## Setup development environment
### Install ultimateALPR SDK ### Use automatic setup script
#### Manually build the wheel You can use the ``build_and_setup_ultimatealvr.sh`` script to automatically install the necessary packages and build the ultimateALPR SDK wheel, copy the assets and the libs.
If you want to build the wheel yourself, you can use the ``build_and_setup_ultimatealvr.sh`` script. It will create a new
directory ``tmp`` and build the wheel in there. It also includes the assets and libs folders needed when developing.
> [!IMPORTANT] > [!IMPORTANT]
> Make sure to install the package python3-dev (APT) python3-devel (RPM) before running the build and setup script. > Make sure to install the package python3-dev (APT) python3-devel (RPM) before running the build and setup script.
#### Use already built wheel (quick and easy but not recommended for dev)
I have already built the ultimateALPR SDK for x86_64 and ARM64 and included the python3.10 wheel in the wheel folder.
You can install the wheel using : ``pip install wheel/*.whl``
### Copy necessary files/folders The end structure should look like this:
Copy the ``assets`` and ``libs`` folders to the same directory as the script.
- If you built the wheel in the previous step, you can copy the ``assets`` and ``libs`` folders from the ``tmp`` directory.
- *If you used the already built wheel, you can find the 'assets' and 'libs' folders on the [GitHub repository](https://github.com/DoubangoTelecom/ultimateALPR-SDK/tree/master/assets), although you will manually copy every ``*.so*`` file from ``/binaries/linux/<arch>/`` into a newly created ``libs`` folder.*
The structure should look like this:
```bash ```bash
. .
├── alpr_api.py ├── alpr_api.py
@ -74,7 +62,7 @@ The structure should look like this:
``` ```
### Important notes ### Important notes
When building or developing the script, make sure to set the ``LD_LIBRARY_PATH`` environment variable to the libs folder When running, building or developing the script, make sure to set the ``LD_LIBRARY_PATH`` environment variable to the libs folder
*(limitation of the ultimateALPR SDK)*. *(limitation of the ultimateALPR SDK)*.
```bash ```bash
export LD_LIBRARY_PATH=libs:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=libs:$LD_LIBRARY_PATH

View File

@ -1 +1 @@
pyinstaller --noconfirm --onefile --console --add-data libs:. --add-data assets:assets --add-data static:static --add-data templates:templates --add-binary plugins.xml:. --name easy-local-alpr-1.0.0-linux_x86_64 "alpr_api.py" pyinstaller --noconfirm --onefile --console --add-data libs:. --add-data assets:assets --add-data static:static --add-data templates:templates --name easy-local-alpr-1.0.0-linux_x86_64 "alpr_api.py"

View File

@ -1,58 +1,173 @@
# clone sdk #!/bin/bash
mkdir ./tmp
cd tmp
wget https://github.com/DoubangoTelecom/ultimateALPR-SDK/archive/8130c76140fe8edc60fe20f875796121a8d22fed.zip -O temp-sdk.zip
unzip temp-sdk.zip
rm temp-sdk.zip
mkdir temp-sdk # Function to create virtual environment, install the wheel, and copy assets and libs
mv ultimateALPR-SDK*/* ./temp-sdk install_and_setup() {
rm -R ultimateALPR-SDK* echo "Creating virtual environment at the root..."
python3.10 -m venv "$ROOT_DIR/venv" >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Failed to create virtual environment."
exit 1
fi
# create env to build ultimatealpr-sdk for python echo "Activating virtual environment..."
python3.10 -m venv venv source "$ROOT_DIR/venv/bin/activate"
source venv/bin/activate
pip install setuptools wheel Cython
cd temp-sdk echo "Installing the wheel..."
pip install "$BUILD_DIR"/ultimateAlprSdk-*.whl >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Failed to install the wheel."
exit 1
fi
# move folders to simplify build echo "Deactivating virtual environment..."
mkdir -p binaries/linux/x86_64/c++ deactivate
cp c++/* binaries/linux/x86_64/c++
cp python/* binaries/linux/x86_64/
# edit setup.py to simplify build echo "Copying assets and libs folders to the root directory..."
cd binaries/linux/x86_64/ cp -r "$BUILD_DIR/assets" "$ROOT_DIR"
cp -r "$BUILD_DIR/libs" "$ROOT_DIR"
if [ -f "$ROOT_DIR/requirements.txt" ]; then
echo "Installing requirements..."
source "$ROOT_DIR/venv/bin/activate"
pip install -r "$ROOT_DIR/requirements.txt" >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Failed to install requirements."
exit 1
fi
deactivate
fi
rm -rf "$BUILD_DIR"
echo "Virtual environment created and wheel installed successfully."
echo "Assets and libs folders copied to the root directory."
echo "Setup completed."
}
# Function to prompt user for auto setup choice
prompt_auto_setup() {
read -r -p "Do you want to automatically create a new virtual environment, install the wheel and copy the assets and libs? (y/n): " choice
case "$choice" in
y|Y ) install_and_setup;;
n|N ) echo "Setup completed.";;
* ) echo "Invalid choice. Please run the script again and choose y or n.";;
esac
}
# Directories
ROOT_DIR=$(pwd)
BUILD_DIR="$ROOT_DIR/tmp-build-env"
SDK_ZIP_URL="https://github.com/DoubangoTelecom/ultimateALPR-SDK/archive/8130c76140fe8edc60fe20f875796121a8d22fed.zip"
SDK_ZIP="$BUILD_DIR/temp-sdk.zip"
SDK_DIR="$BUILD_DIR/temp-sdk"
BIN_DIR="$SDK_DIR/binaries/linux/x86_64"
# Create build environment
mkdir -p "$BUILD_DIR"
cd "$BUILD_DIR" || exit
# Clone SDK
echo "Downloading SDK..."
wget "$SDK_ZIP_URL" -O "$SDK_ZIP" >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Failed to download SDK."
exit 1
fi
echo "Unzipping SDK..."
unzip "$SDK_ZIP" >/dev/null 2>&1
rm "$SDK_ZIP"
mkdir "$SDK_DIR"
mv ultimateALPR-SDK*/* "$SDK_DIR"
rm -r ultimateALPR-SDK*
# Create environment to build ultimatealpr-sdk for Python
echo "Creating virtual environment for building SDK..."
python3.10 -m venv "$BUILD_DIR/venv" >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Failed to create virtual environment."
exit 1
fi
echo "Activating virtual environment..."
source "$BUILD_DIR/venv/bin/activate"
echo "Installing build dependencies..."
pip install setuptools wheel Cython >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Failed to install build dependencies."
exit 1
fi
# Move folders to simplify build
mkdir -p "$BIN_DIR/c++"
mv "$SDK_DIR/c++"/* "$BIN_DIR/c++"
mv "$SDK_DIR/python"/* "$BIN_DIR/"
# Edit setup.py to simplify build
echo "Editing setup.py for simplified build..."
cd "$BIN_DIR" || exit
sed -i "s|sources=\[os.path.abspath('../../../python/ultimateALPR-SDK-API-PUBLIC-SWIG_python.cxx')\]|sources=[os.path.abspath('ultimateALPR-SDK-API-PUBLIC-SWIG_python.cxx')]|g" setup.py sed -i "s|sources=\[os.path.abspath('../../../python/ultimateALPR-SDK-API-PUBLIC-SWIG_python.cxx')\]|sources=[os.path.abspath('ultimateALPR-SDK-API-PUBLIC-SWIG_python.cxx')]|g" setup.py
sed -i "s|include_dirs=\['../../../c++'\]|include_dirs=['c++']|g" setup.py sed -i "s|include_dirs=\['../../../c++'\]|include_dirs=['c++']|g" setup.py
sed -i "s|library_dirs=\['.'\]|library_dirs=['libs']|g" setup.py sed -i "s|library_dirs=\['.'\]|library_dirs=['libs']|g" setup.py
# move all .so files into libs folder # Move all .so files into libs folder
mkdir libs mkdir "$BIN_DIR/libs"
mv *.so libs/ mv "$BIN_DIR/"*.so* "$BIN_DIR/libs"
mv *.so.* libs/
# build the wheel # Download TensorFlow
python setup.py bdist_wheel -v read -r -p "Do you want TensorFlow for CPU or GPU? (cpu/gpu): " tf_choice
mkdir -p "$BIN_DIR/tensorflow"
if [ "$tf_choice" == "gpu" ]; then
echo "Downloading TensorFlow GPU..."
wget https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-gpu-linux-x86_64-2.6.0.tar.gz >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Failed to download TensorFlow GPU."
exit 1
fi
echo "Extracting TensorFlow GPU..."
tar -xf libtensorflow-gpu-linux-x86_64-2.6.0.tar.gz -C "$BIN_DIR/tensorflow" >/dev/null 2>&1
else
echo "Downloading TensorFlow CPU..."
wget https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-cpu-linux-x86_64-2.6.0.tar.gz >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Failed to download TensorFlow CPU."
exit 1
fi
echo "Extracting TensorFlow CPU..."
tar -xf libtensorflow-cpu-linux-x86_64-2.6.0.tar.gz -C "$BIN_DIR/tensorflow" >/dev/null 2>&1
fi
# move the built whl and the libs back to root dir mv "$BIN_DIR/tensorflow/lib/"* "$BIN_DIR/libs/"
mv dist/* ../../../../ cp "$BIN_DIR/libs/libtensorflow.so.2" "$BIN_DIR/libs/libtensorflow.so.1"
mv libs ../../../../ # Build the wheel
echo "Building the wheel..."
python "$BIN_DIR/setup.py" bdist_wheel -v >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Failed to build the wheel."
exit 1
fi
# move the assets to root dir # Move the built wheel and the libs back to the root directory
cd ../../../ mv "$BIN_DIR/dist/"*.whl "$BUILD_DIR"
mv assets ../assets mv "$BIN_DIR/libs" "$BUILD_DIR"
mv "$BIN_DIR/plugins.xml" "$BUILD_DIR/libs"
## install the whl # Move the assets to the root directory
#cd .. mv "$SDK_DIR/assets" "$BUILD_DIR/assets"
#pip install *.whl
#rm *.whl
cd ../ # Deactivate and clean up the build virtual environment
echo "Deactivating and cleaning up virtual environment..."
deactivate
cd "$ROOT_DIR" || exit
rm -rf "$BUILD_DIR/venv"
rm -rf "$SDK_DIR"
# remove sdk # Inform the user of the successful build
rm -R temp-sdk echo "UltimateALPR SDK built and setup successfully."
echo "You can now create a virtual environment, install the wheel and copy the assets and libs and start developing. Say 'y' to the next prompt to do this automatically (recommended)."
echo "UltimateALPR SDK built and setup successfully" echo "Tip: Look at the assets folder as you might not need all the models depending on your platform/use case."
echo "You can now install the wheel using 'pip install ultimateAlprSdk-*.whl'" # Prompt user for auto setup choice
prompt_auto_setup

View File

@ -1,20 +0,0 @@
<ie>
<plugins>
<plugin name="GNA" location="libGNAPlugin.so">
</plugin>
<plugin name="HETERO" location="libHeteroPlugin.so">
</plugin>
<plugin name="CPU" location="libMKLDNNPlugin.so">
</plugin>
<plugin name="MULTI" location="libMultiDevicePlugin.so">
</plugin>
<plugin name="GPU" location="libclDNNPlugin.so">
</plugin>
<plugin name="MYRIAD" location="libmyriadPlugin.so">
</plugin>
<plugin name="HDDL" location="libHDDLPlugin.so">
</plugin>
<plugin name="FPGA" location="libdliaPlugin.so">
</plugin>
</plugins>
</ie>