360 Live Streaming の画像データをリアルタイムで物体検出してみました。
360°カメラはRICOH THETA を使っています。
KR260とPYNQ-DPUで物体検出して、GPIOやPWMを動作させた旨を紹介します。
360 Live Streaming で物体検出。KR260+PYNQ-DPU編
360 Live Streaming の画像データをリアルタイムで物体検出してみました。
360°カメラはRICOH THETA を使っています。
まずはKR260のDPUを使って、物体検出(Yolo)を実施しています。
次にKR260とPYNQ-DPUで物体検出して、LED(GPIO)含めて動作させた旨を紹介します。
また人を物体検出させて、その向きにカーロボットを自動回転させています。
PWMとモータドライバ+DCモータで制御させました。
テスト動画は下記です。
プログラムやGstreamer、OpenCVの処理含めて説明していきます
PYNQのOpenCVにはGStreamerが入っていない
今回、物体検出(Yolo)をPYNQ-DPUで実施しています。
DPUを動かすには、PYNQの仮想環境で実行する必要がありました。
ただし、PYNQのOpenCVのビルド情報を見ると、GStreamerが含まれていませんでした。
360°ビデオストリームをリアルタイムで処理するにはGStreamerが必要です。
OpenCVのビルド情報を確認したプログラムは下記に置いています。
PYNQの仮想環境でのOpenCVのビルド情報が下記です。
GStreamer: NO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
(pynq-venv) root@kria:/home/ubuntu# python3 gst-back-check.py General configuration for OpenCV 4.9.0 ===================================== Version control: 4.9.0-dirty Platform: Timestamp: 2023-12-31T13:36:01Z Host: Linux 5.3.0-28-generic aarch64 CMake: 3.28.1 CMake generator: Unix Makefiles CMake build tool: /bin/gmake Configuration: Release CPU/HW features: Baseline: NEON FP16 Dispatched code generation: NEON_DOTPROD NEON_FP16 NEON_BF16 requested: NEON_FP16 NEON_BF16 NEON_DOTPROD NEON_DOTPROD (1 files): + NEON_DOTPROD NEON_FP16 (2 files): + NEON_FP16 NEON_BF16 (0 files): + NEON_BF16 C/C++: Built as dynamic libs?: NO C++ standard: 11 C++ Compiler: /opt/rh/devtoolset-10/root/usr/bin/c++ (ver 10.2.1) C++ flags (Release): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG C++ flags (Debug): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG C Compiler: /opt/rh/devtoolset-10/root/usr/bin/cc C flags (Release): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -O3 -DNDEBUG -DNDEBUG C flags (Debug): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -g -O0 -DDEBUG -D_DEBUG Linker flags (Release): -L/ffmpeg_build/lib -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined Linker flags (Debug): -L/ffmpeg_build/lib -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined ccache: YES Precompiled headers: NO Extra dependencies: /lib64/libopenblas.so Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Test Qt5::Concurrent /usr/local/lib/libpng.so /lib64/libz.so dl m pthread rt 3rdparty dependencies: libprotobuf ade ittnotify libjpeg-turbo libwebp libtiff libopenjp2 IlmImf tegra_hal OpenCV modules: To be built: calib3d core dnn features2d flann gapi highgui imgcodecs imgproc ml objdetect photo python3 stitching video videoio Disabled: world Disabled by dependency: - Unavailable: java python2 ts Applications: - Documentation: NO Non-free algorithms: NO GUI: QT5 QT: YES (ver 5.15.0 ) QT OpenGL support: NO GTK+: NO VTK support: NO Media I/O: ZLib: /lib64/libz.so (ver 1.2.7) JPEG: libjpeg-turbo (ver 2.1.3-62) WEBP: build (ver encoder: 0x020f) PNG: /usr/local/lib/libpng.so (ver 1.6.40) TIFF: build (ver 42 - 4.2.0) JPEG 2000: build (ver 2.5.0) OpenEXR: build (ver 2.3.0) HDR: YES SUNRASTER: YES PXM: YES PFM: YES Video I/O: DC1394: NO FFMPEG: YES avcodec: YES (59.37.100) avformat: YES (59.27.100) avutil: YES (57.28.100) swscale: YES (6.7.100) avresample: NO GStreamer: NO v4l/v4l2: YES (linux/videodev2.h) Parallel framework: pthreads Trace: YES (with Intel ITT) Other third-party libraries: Lapack: YES (/lib64/libopenblas.so) Eigen: NO Custom HAL: YES (carotene (ver 0.0.1, Auto detected)) Protobuf: build (3.19.1) Flatbuffers: builtin/3rdparty (23.5.9) OpenCL: YES (no extra features) Include path: /io/opencv/3rdparty/include/opencl/1.2 Link libraries: Dynamic load Python 3: Interpreter: /opt/python/cp37-cp37m/bin/python3.7 (ver 3.7.17) Libraries: libpython3.7m.a (ver 3.7.17) numpy: /home/ci/.local/lib/python3.7/site-packages/numpy/core/include (ver 1.19.3) install path: python/cv2/python-3 Python (for build): /opt/python/cp37-cp37m/bin/python3.7 Java: ant: NO Java: NO JNI: NO Java wrappers: NO Java tests: NO Install to: /io/_skbuild/linux-aarch64-3.7/cmake-install ----------------------------------------------------------------- GStreamer: GStreamer: NO |
ただし、KR260のUbuntu環境にはGStreamerが入っていることを下記記事で確認しています。
360°カメラ(RICOH THETA)をGstreamer+OpenCVで処理してみた
またKria-PYNQインストール時にはopencv-pythonを入れていることが下記から分かります。
そのため、PYNQ仮想環境上で、一度opencv-pythonをアンインストールしました。
1 2 3 4 5 |
sudo su python3 gst-back-check.py source /etc/profile.d/pynq_venv.sh pip uninstall opencv-python python3 gst-back-check.py |
アンインストール後はKR260のUbuntuに切り替わり、GStreamerが使えるようになりました。
あまり良くない方法だと思いますが、テスト的にこれで進めていきます。
360 Live Streaming + 物体検出(DPU)のテスト
360 Live Streaming の画像データをリアルタイムで物体検出してみました。
360°カメラはRICOH THETA を使っています。プログラムは下記GitHubに置いています
https://github.com/iotengineer22/AMD-Pervasive-AI-Developer-Contest/tree/main/src/gst-dpu-test
app_gst-real-360-yolov3_tf2.py
またこのプロジェクトではKR260のDPUを動かします。
「.bit」「.xclbin」「.hwh」のファイルが必要になります。
必要なファイルも上記リンク先に保存しています。
またテスト動画は下記です。
最初にPythonのプログラムを実行します。
2k(1920x960)の360°画像データを、480x480の4枚の画像に分割・カットしています。
通常の物体検出のYoloモデルだと非常に横長い360°画像を適用させても、物体検出できないためです。
前処理の画面のリサイズの箇所で画像が大きく崩れてしまいます。
4分割して、480x480にクロップしています。
各セクションで物体検出できることが分かります。
360°画像を分割して物体検出する
360°画像を分割して、物体検出しているプログラムの一部です。
画像分割して、単純にfor文で回しているだけです。詳細はプログラムを参考ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
while True: ret, frame = cap.read() if not ret: break # Get the height and width of the image height, width, _ = frame.shape # Shift the image to the right by 240 pixels (to center the front in Section 1) shift = width // 8 frame_shifted = np.roll(frame, shift, axis=1) # Split the shifted image into 4 sections 480:480 sections = [ frame_shifted[360:840, :width // 4], frame_shifted[360:840, width // 4:width // 2], frame_shifted[360:840, width // 2:3 * width // 4], frame_shifted[360:840, 3 * width // 4:] ] # Display each section for i, section in enumerate(sections): run(section, i+1, display) if display: cv2.imshow(f"Section {i+1}", section) |
360 Live Streaming + 物体検出(DPU) + GPIO
KR260とPYNQ-DPUで物体検出して、LED(GPIO)含めて動作させた旨を紹介します。
DPUとGPIOを組み合わせた、FPGAのOverlayに関しては下記記事で説明しています。
プログラムは先ほどと同じです。
GPIO動作を確認するため、PMODコネクタにデバッグ(LED・SW)基板を接続しています。
この基板の詳細に関しては、下記記GitHubで紹介しています。
https://github.com/iotengineer22/PCB-KV260-PMOD-TEST
実行するプログラムは、基板接続する前のものと同じです。
テスト動画は下記です。
360°画像でボールを検出した領域を区分して、赤・緑・青色のLEDを点灯させます。
先ほどと同様に360°画像データを、480x480の4枚の画像に分割・カットしています。
section 1(Front side)でボールを検出すると、全LEDがONするようにしています。
section4(Left side)でボールを検出すると、青LEDがONするようにしています。
section3(Back side)でボールを検出すると、緑LEDがONするようにしています。
section2(Right side)でボールを検出すると、緑LEDがONするようにしています。
360 Live Streaming + 物体検出(DPU) + PWM
KR260とPYNQ-DPUで物体検出して、PWM含めて動作させた旨を紹介します。
テストプログラムは下記です。
テスト動画は下記です。
360°カメラで人(の手)を検出すると、人の向きにモータを回転させます。
横90°の位置に人を検出すると、90°動くようにしています
また後180°の位置に人を検出すると、180°動くようにしています
まとめ
360 Live Streaming の画像データをリアルタイムで物体検出してみました。
KR260とPYNQ-DPUで物体検出して、GPIOやPWMも動作できています。
今回のKR260で実施した内容は、下記記事で紹介したテストの一部です。
コメント