# YOLOX-ROS-CPP
## Requirements
- ROS2 Iron
- ros-jazzy-generate-parameter-library
- ros-jazzy-vision-msgs
- ros-jazzy-usb-cam
- OpenCV 4.x
- OpenVINO 2024.*
- TensorRT 10.x *
- ONNXRuntime *
- Tensorflow Lite *
- **CUDA 12**
※ Either one of OpenVINO or TensorRT or ONNXRuntime or Tensorflow Lite is required.
※ Tensorflow Lite support XNNPACK Delegate only.
※ Tensorflow Lite support float model and does not support integer model.
## Clone YOLOX-ROS
```bash
cd ~/ros2_ws/src
git clone --recursive https://github.com/Ar-Ray-code/YOLOX-ROS -b jazzy
```
## Model Convert or Download
### OpenVINO・ONNXRuntime
```bash
cd ~/ros2_ws
./src/YOLOX-ROS/weights/onnx/download.bash yolox_tiny
```
### TensorRT
```bash
cd ~/ros2_ws
# Download onnx model and convert to TensorRT engine.
# argument is model name. set yolox_tiny, yolox_nano, yolox_s, yolox_m or yolox_l.
./src/YOLOX-ROS/weights/tensorrt/convert.bash yolox_tiny
```
### Tensorflow Lite
```bash
cd ~/ros2_ws
# Download tflite Person Detection model: https://github.com/Kazuhito00/Person-Detection-using-RaspberryPi-CPU/
./src/YOLOX-ROS/weights/tflite/download_model.bash
```
### PINTO_model_zoo
- Support PINTO_model_zoo model
- Download model using the following script.
- https://github.com/PINTO0309/PINTO_model_zoo/blob/main/132_YOLOX/download_nano.sh
- `curl -s https://raw.githubusercontent.com/PINTO0309/PINTO_model_zoo/main/132_YOLOX/download_nano.sh | bash`
- ONNX model copy to weight dir
- `cp resouces_new/saved_model_yolox_tiny_480x640/yolox_tiny_480x640.onnx ./src/YOLOX-ROS/weights/onnx/`
- Convert to TensorRT engine
- `./src/YOLOX-ROS/weights/tensorrt/convert.bash yolox_tiny_480x640`
- tflite model copy to weight dir
- `cp resouces_new/saved_model_yolox_tiny_480x640/model_float32.tflite ./src/YOLOX-ROS/weights/tflite/`
## Build
### OpenVINO
```bash
# build with openvino
source /opt/ros/jazzy/setup.bash
colcon build --symlink-install --cmake-args -DYOLOX_USE_OPENVINO=ON
```
### TensorRT
```bash
# build with tensorrt
source /opt/ros/jazzy/setup.bash
colcon build --symlink-install --cmake-args -DYOLOX_USE_TENSORRT=ON
```
### TFLite
**TFLite build**
https://www.tensorflow.org/lite/guide/build_cmake
Below is an example build script.
Please change `${WORKSPACE}` as appropriate for your envjazzyment.
```bash
export WORKSPACE=${HOME}/ws_tflite
mkdir -p ${WORKSPACE}
cd ${WORKSPACE}
git clone https://github.com/tensorflow/tensorflow.git tensorflow_src
mkdir tflite_build
cd tflite_build
cmake ../tensorflow_src/tensorflow/lite \
-DBUILD_SHARED_LIBS=ON \
-DTFLITE_ENABLE_INSTALL=OFF \
-DTFLITE_ENABLE_XNNPACK=ON \
-DTFLITE_ENABLE_RUY=OFF \
-DCMAKE_BUILD_TYPE=Release
make -j"$(nproc)"
```
```bash
colcon build --symlink-install \
--cmake-args \
-DYOLOX_USE_TFLITE=ON \
-DTFLITE_LIB_PATH=${WORKSPACE}/tflite_build \
-DTFLITE_INCLUDE_DIR=${WORKSPACE}/tensorflow_src/ \
-DABSEIL_CPP_ICLUDE_DIR=${WORKSPACE}/tflite_build/abseil-cpp \
-DFLATBUFFERS_INCLUDE_DIR=${WORKSPACE}/tflite_build/flatbuffers/include
```
## Run
### OpenVINO
```bash
ros2 launch yolox_ros_cpp yolox_openvino.launch.py
## run other model
# ros2 launch yolox_ros_cpp yolox_openvino.launch.py \
# model_path:=install/yolox_ros_cpp/share/yolox_ros_cpp/weights/openvino/yolox_s.xml
## run PINTO_model_zoo model (version 0.1.0)
# ros2 launch yolox_ros_cpp yolox_openvino.launch.py \
# model_path:=install/yolox_ros_cpp/share/yolox_ros_cpp/weights/onnx/yolox_tiny_480x640.onnx \
# model_version:="0.1.0"
```
### TensorRT
```bash
ros2 launch yolox_ros_cpp yolox_tensorrt.launch.py
## run PINTO_model_zoo model (version 0.1.0)
# ros2 launch yolox_ros_cpp yolox_tensorrt.launch.py \
# model_path:=install/yolox_ros_cpp/share/yolox_ros_cpp/weights/tensorrt/yolox_tiny_480x640.trt \
# model_version:="0.1.0"
```
### ONNXRuntime
```bash
# run yolox_tiny
ros2 launch yolox_ros_cpp yolox_onnxruntime.launch.py
```
### Tensorflow Lite
```bash
ros2 launch yolox_ros_cpp yolox_tflite.launch.py
# # run PINTO_model_zoo model (version 0.1.0)
# ros2 launch yolox_ros_cpp yolox_tflite.launch.py \
# model_path:=install/yolox_ros_cpp/share/yolox_ros_cpp/weights/tflite/model_float32.tflite \
# model_version:=0.1.0 \
# num_classes:=80 \
# is_nchw:=false
```
### Parameter
OpenVINO example
- `model_path`: ./src/YOLOX-ROS/weights/onnx/yolox_tiny.onnx
- `p6`: false
- `class_labels_path`: ""
- if not set, use coco_names.
- See [here](https://github.com/fateshelled/YOLOX-ROS/blob/dev_cpp/yolox_ros_cpp/yolox_ros_cpp/labels/coco_names.txt) for label format.
- `num_classes`: 80
- `model_version`: 0.1.1rc0
- `openvino_device`: AUTO
- `nms`: 0.45
- `imshow_isshow`: true
- `src_image_topic_name`: /image_raw
- `publish_image_topic_name`: /yolox/image_raw
- `publish_boundingbox_topic_name`: /yolox/bounding_boxes
- `use_bbox_ex_msgs`: false
- `publish_resized_image`: false
TensorRT example
- `model_path`: ../src/YOLOX-ROS/weights/tensorrt/yolox_tiny.trt
- `p6`: false
- `class_labels_path`: ""
- `num_classes`: 80
- `model_version`: 0.1.1rc0
- `tensorrt_device`: 0
- `conf`: 0.3
- `nms`: 0.45
- `imshow_isshow`: true
- `src_image_topic_name`: /image_raw
- `publish_image_topic_name`: /yolox/image_raw
- `publish_boundingbox_topic_name`: /yolox/bounding_boxes
- `use_bbox_ex_msgs`: false
- `publish_resized_image`: false
ONNXRuntime example
- `model_path`: ./src/YOLOX-ROS/weights/onnx/yolox_tiny.onnx
- `p6`: false
- `class_labels_path`: ""
- `num_classes`: 80
- `model_version`: 0.1.1rc0
- `onnxruntime_use_gpu`: true
- `onnxruntime_use_parallel`: false
- `onnxruntime_device_id`: 0
- `onnxruntime_inter_op_num_threads`: 1
- if `onnxruntime_use_parallel` is true, the number of threads used to parallelize the execution of the graph (across nodes).
- `onnxruntime_intra_op_num_threads`: 1
- the number of threads to use to run the model
- `conf`: 0.3
- `nms`: 0.45
- `imshow_isshow`: true
- `src_image_topic_name`: /image_raw
- `publish_image_topic_name`: /yolox/image_raw
- `publish_boundingbox_topic_name`: /yolox/bounding_boxes
- `use_bbox_ex_msgs`: false
- `publish_resized_image`: false
Tensorflow Lite example
- `model_path`: ./src/YOLOX-ROS/weights/tflite/model.tflite
- `p6`: false
- `is_nchw`: true
- `class_labels_path`: ""
- `num_classes`: 1
- `model_version`: 0.1.1rc0
- `tflite_num_threads`: 1
- `conf`: 0.3
- `nms`: 0.45
- `imshow_isshow`: true
- `src_image_topic_name`: /image_raw
- `publish_image_topic_name`: /yolox/image_raw
- `publish_boundingbox_topic_name`: /yolox/bounding_boxes
- `use_bbox_ex_msgs`: false
- `publish_resized_image`: false
## Reference
Reference from YOLOX demo code.
- https://github.com/Megvii-BaseDetection/YOLOX/blob/5183a6716404bae497deb142d2c340a45ffdb175/demo/OpenVINO/cpp/yolox_openvino.cpp
- https://github.com/Megvii-BaseDetection/YOLOX/tree/5183a6716404bae497deb142d2c340a45ffdb175/demo/TensorRT/cpp