JetsonNano2GBでYOLOv5を活用した犬の個体数カウントAIを構築してみた

<h2>はじめに</h2>
<p>
低消費電力かつ高性能なエッジAIプラットフォームとして人気の <strong>Jetson Nano 2GB</strong> を使って、リアルタイムで映像内の犬の個体数をカウントするAIシステムを構築しました。
</p>
<p>
本記事では、Jetson Nanoの性能を最大限活用しながら、限られたリソース環境下でどのようにAIを効率良く動作させたかを紹介します。
</p>

<h2>プロジェクト概要</h2>
<ul>
  <li><strong>目的：</strong> 映像内の犬をリアルタイムでカウントするAIシステムの構築</li>
  <li><strong>ハードウェア：</strong> Jetson Nano 2GB + USBカメラ</li>
  <li><strong>OS/SDK：</strong> JetPack 4.6（Ubuntu 18.04 ベース）</li>
  <li><strong>使用モデル：</strong> YOLOv5（v6.0）</li>
  <li><strong>開発言語：</strong> Python 3.6</li>
  <li><strong>主なライブラリ：</strong> PyTorch, OpenCV, NumPy, Matplotlib など</li>
</ul>

<h2>なぜJetson Nano 2GBか？</h2>
<p>Jetson Nano 2GBは以下のような特徴があります：</p>
<ul>
  <li><strong>安価かつ小型：</strong> 教育・試作・個人プロジェクトに最適</li>
  <li><strong>メモリ2GB：</strong> 制限はあるが、設計次第で十分動作可能</li>
  <li><strong>GPU搭載（128 CUDAコア）：</strong> 軽量モデルであればリアルタイム処理も可能</li>
</ul>
<p>
このプロジェクトでは、軽量モデルの選定や処理フローの工夫により、Nano 2GBの制約内でも快適に動作する構成を目指しました。
</p>

![Jetson Nano 2GB](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929358/41e6099e-551d-4cfd-8599-b6be2e80c9cb.jpeg)
![Jetson Nano 2GB](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929358/e8a2f946-9597-4fe4-97c7-b9779ea1407f.jpeg)




<h2>ステップ1：必要ライブラリのインストール</h2>
<p>Jetson Nano 2GBの初期セットアップ後、以下のパッケージを導入して環境を整えます。</p>
<pre><code>!apt-get update
!apt-get install -y python3-pip libopencv-dev
!pip3 install --upgrade pip
!pip3 install torch torchvision torchaudio
!pip3 install numpy opencv-python matplotlib
</code></pre>
<p>
TensorFlowなどは使用せず、<strong>PyTorch + YOLOv5の構成</strong>で軽量かつ高速な実行環境を実現しています。
</p>

<h2>ステップ2：YOLOv5の導入</h2>
<pre><code>!git clone -b v6.0 https://github.com/ultralytics/yolov5.git
</code></pre>
<p>
YOLOv5の中でも <code>yolov5s</code>（smallモデル）を使用し、Jetson Nano 2GBでも安定して動作するモデルを選定しました。
</p>

<h2>ステップ3：依存ライブラリの固定と最適化</h2>
<p>Jetson Nano 2GBの限られたリソースを最大限活かすため、ライブラリのバージョンも明示的に固定しています。</p>
<pre><code>!pip3 install Pillow==8.2.0
!pip3 install requests==2.25.1
!pip3 install scipy==1.5.4
!pip3 install tqdm
</code></pre>

<h2>ステップ4：犬のリアルタイム検出とカウント</h2>
<p>
OpenCVでUSBカメラの映像を取得し、YOLOv5を使って犬（"dog" クラス）の検出と個体数のカウントを行います。結果はリアルタイムに映像へ描画されます。
</p>

<h3>工夫した点</h3>
<ul>
  <li><strong>解像度の最適化：</strong> 推論画像サイズを320x320などに縮小して処理負荷を軽減</li>
  <li><strong>フレームの間引き：</strong> 必要なフレームだけを処理して効率化</li>
  <li><strong>描画最適化：</strong> OpenCV描画を最小限に抑え、処理速度を確保</li>
</ul>
<pre><code>cap = cv2.VideoCapture(0)
if not cap.isOpened():
    raise RuntimeError("USB カメラが見つかりません。")

# FPS 計測用
t0, frame_counter = time.time(), 0

print("Press  [q]  to quit.")

try:
    while True:
        ret, frame = cap.read()
        if not ret:
            break

        # 3-a. 入力フレームをリサイズして推論負荷を低減（必要に応じて）
        img = cv2.resize(frame, (640, 640))

        # 3-b. 推論
        results = model(img, size=320)           # size=320 だと Nano 2GB でも高速
        det = results.xyxy[0].to("cpu").numpy()  # (x1,y1,x2,y2,conf,cls)…

        # 3-c. 犬のバウンディングボックス描画 & カウント
        dog_count = 0
        for (x1, y1, x2, y2, conf, cls_id) in det:
            dog_count += 1
            x1, y1, x2, y2 = map(int, (x1, y1, x2, y2))
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)

        # 3-d. オーバーレイ表示（犬数 & FPS）
        cv2.putText(frame, f"Dogs: {dog_count}", (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

        frame_counter += 1
        if time.time() - t0 >= 1.0:
            fps = frame_counter / (time.time() - t0)
            cv2.putText(frame, f"FPS: {fps:.1f}", (10, 60),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 0), 2)
            t0, frame_counter = time.time(), 0

        cv2.imshow("Dog Counter", frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break

finally:
    cap.release()
    cv2.destroyAllWindows()
</code></pre>
<h2>まとめと今後の展望</h2>
<p>
Jetson Nano 2GBというミニマムな構成でも、工夫次第でYOLOv5を活用したリアルタイム物体検出が実現可能であることを確認できました。
</p>
<p>今後の発展としては以下が考えられます：</p>
<ul>
  <li>TensorRTを用いたさらなる高速化と省メモリ化</li>
  <li>検出結果に応じたデバイス制御（LED点灯、アラームなど）との連携</li>
  <li>フィギュアではなく、実際の動物画像を用いた学習による精度向上</li>
</ul>

<h2>おわりに</h2>
<p>
Jetson Nano 2GBは「制限のある中でどう実現するか」を問う、非常に実践的なプラットフォームです。今回の取り組みを通じて、軽量モデルの運用設計やリアルタイム処理の工夫に多くの学びがありました。
</p>
<p>
今後も引き続きJetsonを活用したAIプロジェクトを推進し、現実世界に活かせるエッジAIの活用方法を深めていきたいと思います。
</p>

</body>
</html>