この記事ではCSI-2カメラを使ってYOLOv5をJetson Nanoで動作させる方法について解説します。こちらの記事はUSBカメラを使用してYOLOv5をJetson Nanoで動作させましたが、今回はCSI-2カメラを使用します。CSI-2カメラはRaspberry Pi Camera V2を使用しました。
今回は、予めビルドしたライブラリをダウンロードして実行する方法を解説します。
こちらの記事を参考に、PyTorch、TorchVisionをJetson Nanoにインストールし、こちらの記事を参考に、OpenCVをインストールしても構いません。あるいは、こちらの記事を参考にホストでライブラリをビルドてJetson Nanoにインストールしても構いません。
必要なパッケージをインストールします。 なお今回もpython3.8を使用します。(予めビルドされたパッケージもpython3.8をターゲットにしています)
sudo apt update
sudo apt install -y \
python3.8 python3.8-dev python3-pip \
libopenmpi-dev libomp-dev libopenblas-dev libblas-dev libeigen3-dev libcublas-dev
Code language: Bash (bash)
次に予めビルドしたOpenCVパッケージをダウンロードします。
python3.8 -m pip install -U pip
python3.8 -m pip install gdown
export PATH=.local/bin:$PATH
gdown https://drive.google.com/uc?id=1VPU1oUO0_trI8Dm1AJ5UVTEGzqcnl3HU
gdown https://drive.google.com/uc?id=1Z4yKz_5azGbqq3aslc7k0WAwR-yF4Mgc
gdown https://drive.google.com/uc?id=1ZNio67dove9W5kMHqz_nmvmf1GR2y3hQ
gdown https://drive.google.com/uc?id=1_loSh1aD6_FARGhVNFIBz2W4lSw7dfqN
gdown https://drive.google.com/uc?id=1dWN5QWx-8htYURSELGbj4caqHY1228HL
gdown https://drive.google.com/uc?id=1uMfj78AxtDaIirnR5T_qfWsE4Xf8WdJP
Code language: Bash (bash)
なおこちらの記事でYOLOv5を動作させたときにはOpenCVのパッケージを特別にインストールする必要はありませんでしたが、今回OpenCVがGStreamerに対応する必要があるためGStreamer対応のOpenCVパッケージをインストールします。
事前にインストールされているOpenCVパッケージはコンフリクトするため削除し、その後ダウンロードしたOpenCVパッケージをインストールします。
apt list --installed *opencv*|awk -F/ '/opencv/ {print $1}'|sudo xargs apt remove -y
sudo apt install -y ./OpenCV*.deb
Code language: Bash (bash)
次に予めビルドしたPyTorch、TorchVisionパッケージをダウンロードしインストールします。
# pytorch 1.11.0
gdown https://drive.google.com/uc?id=1hs9HM0XJ2LPFghcn7ZMOs5qu5HexPXwM
# torchvision 0.12.0
gdown https://drive.google.com/uc?id=1m0d8ruUY8RvCP9eVjZw4Nc8LAwM8yuGV
python3.8 -m pip install torch-*.whl torchvision-*.whl
Code language: Bash (bash)
YOLOv5をクローンし、必要なpythonパッケージをインストールします。なおopencv-pythonパッケージはpipでインストールしないようにrequirements.txtをコメントアウトします。
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
sed -i 's/^opencv-python/#opencv-python/g' requirements.txt
python3.8 -m pip install -r requirements.txt
Code language: Bash (bash)
YOLOv5はGStreamerに対応していないため以下のパッチファイル(patch.txt
)を作成します。
diff --git a/utils/dataloaders.py b/utils/dataloaders.py
index d849d51..b4a5fbc 100644
--- a/utils/dataloaders.py
+++ b/utils/dataloaders.py
@@ -359,7 +359,7 @@ class LoadStreams:
if s == 0:
assert not is_colab(), '--source 0 webcam unsupported on Colab. Rerun command in a local environment.'
assert not is_kaggle(), '--source 0 webcam unsupported on Kaggle. Rerun command in a local environment.'
- cap = cv2.VideoCapture(s)
+ cap = cv2.VideoCapture(self._gstreamer_pipeline(flip_method=0), cv2.CAP_GSTREAMER)
assert cap.isOpened(), f'{st}Failed to open {s}'
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
@@ -420,6 +420,25 @@ class LoadStreams:
def __len__(self):
return len(self.sources) # 1E12 frames = 32 streams at 30 FPS for 30 years
+ def _gstreamer_pipeline(
+ self,
+ capture_width=1280,
+ capture_height=720,
+ display_width=1280,
+ display_height=720,
+ framerate=60,
+ flip_method=0,
+ ):
+ return (
+ "nvarguscamerasrc ! "
+ "video/x-raw(memory:NVMM), "
+ f"width=(int){capture_width}, height=(int){capture_height}, "
+ f"format=(string)NV12, framerate=(fraction){framerate}/1 ! "
+ f"nvvidconv flip-method={flip_method} ! "
+ f"video/x-raw, width=(int){display_width}, height=(int){display_height}, format=(string)BGRx ! "
+ "videoconvert ! "
+ "video/x-raw, format=(string)BGR ! appsink"
+ )
def img2label_paths(img_paths):
# Define label paths as a function of image paths
Code language: Diff (diff)
上記パッチを当てます。
patch -p1 < patch.txt
Code language: Bash (bash)
実行します。
LD_LIBRARY_PATH=/usr/ python3.8 detect.py --source 0
Code language: Bash (bash)
LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libgomp.so.1
は以下で説明されているワークアラウンドになります。https://forums.developer.nvidia.com/t/error-importerror-usr-lib-aarch64-linux-gnu-libgomp-so-1-cannot-allocate-memory-in-static-tls-block-i-looked-through-available-threads-already/166494
以上です。