Transformers Object detection - detr の転移学習とONNX変換と実行。#2

Transformers Object detection - detr の転移学習とONNX変換と実行。#2

Transformers Object detection - detr の転移学習とONNX変換と実行。 の続きです。

ONNX -> rknn に変換して、 Orange pi 5 armbian(22.04) で、NPU で動かしてみました。
USB Camera -> predict -> Open cv 表示
rate: 10[fps] 前後 みたいです。
model 単体ベンチマーク: 0.1[sec] 前後
cpu 負荷は、all core 23[%] 前後みたい。 c++ で行えばもっと、良いかも。
体感は、なんとかつかそう。ただ、実際のアプリでは、Open CV で表示などせずに、
プログラムの中で使うのであれば、もっと早いかも?
orange pi 5 x 1 で、同時に、ROS2 で、ロボットを動かせるかも?
でも、2 台構成が無難かもしれない。

開発環境:
Ubuntu 24.04 PC and GTX 1070
torch 2.6.0+cu126
torchaudio 2.6.0+cu126
torchvision 0.21.0+cu126

実機環境:
Orange pi 5 armbian(22.04)
注) armbian(22.04) でないと、NPU ドライバーが入っていないので、注意!!
最新の armbian(24.04 以降) だと、自分でドライバーをソースbuild して追加しないと、できましぇん!!
python 3.10
RKNNLite
USB カメラ

実機環境2:
Joshua Piek ubuntu 24.04
こちらが、今は良いみたい。
USB Camera -> predict -> open cv 表示
fps: 12 - 13 [Hz] みたいです。
検出精度、良好!! by nishi 2026.3.29

1. 転移学習
雑草 3class(実際は、4 class になった) の転移学習を行う。
今までは、学習データを、アスペクト比を無視して、480x480 にリサイズしていましたが、
今回は、画像のアスペクト比を維持して、480x480 にリサイズして、余白は、黒埋めします。
実際の学習用 コードは、github に公開しました。
github@tosa-no-onchan/transform_object_detection
zasou_train_3class.ipynb

学習は、2回にわけて行いました。
1 回め
165 エポック
7800 0.304700
2 回め。続きから。
46 エポック
で、 train loss 0.19 になりました。
多分、huging face にアップロードされているでは? tosa-no-onchan/detr-resnet-50_finetuned_zasou

おんちゃんの Tips.
image_processor に、size={"shortest_edge": 480,...
を渡して、入力サイズを、480x480 にすると良いみたい。

これだけで、 rknn での実行速度が改善されるみたいじゃ。--> 実際は、変わらない!!

おんちゃんの Tips.2
画像のアスペクト比を維持して、余白を黒埋めにするには。
transform = albumentations.Compose(...)
を変更する。

おんちゃんの Tips.3
transform_aug_ann(examples) にバグがあるみたい。
dataset の img は、 pillow で読み込んだ object で、rgb 形式だと思う。
だけど、更に、transform_aug_ann(examples) で、 bgr -> rgb 変換をしているみたい。
下記のように、修正する。

雑草用、学習データは、やはり google のダウンロードではNG で、
自分で、カメラをもってあちこち行って撮影しました。
コツは、 ROS2 草刈りロボットカーのカメラ目線になって、30[cm] - 40[cm] の高さで、前方を、水平に撮影します。
草刈りにの邪魔になりそうな雑草の壁みたいなのを、メインに撮し、一緒に、木とかも撮影しました。
木の撮影も、 1.5[M] -3[M] 手前から撮影します。
アノテーションは、あまり遠い(1.5[M] - 3[M] 以外)、草、木、鉢植え は、使いません。
あくまでも、本来、ロボットが草刈りしなければ行けない所なのに、ROS2 の Depth Camera で、 local cost map に障害物と判定される雑草に限定します。

この目的は、localcost map で、障害物だと出ても、それが 雑草群 であれば、その場所をあえて通過させる事ぞね!!

ただし、実際の predict 結果を見ていると、草刈りに邪魔になる雑草以外の物(人、動物、物、木、etc) を検出させて、それらが検出されなければ、
localcost map に障害物が出ていても、草刈り ロボットを進める方が簡単な気がしてきたぞね!!

また、学習画像には、対象を含まない画像や、オリジナル model の学習時に使った画像を、annotationナシ(class id ナシ) として、10[%] ほど加えます。

2. ONNX に変換。
順序がバラバラですが、
転移学習した、 雑草 hugging face dtr モデル (detr-resnet-50_finetuned_zasou_ex/final_model) を、 onnx に変換します。
zasou_dtr2onnx.py


$ python zasou_dtr2onnx.py
で、
detr_zasou_480.onnx
が作成される。

2.1 スリム化と入力サイズの固定化をする。

$ python -m pip install onnxsim
$ onnxsim detr_zasou_480.onnx detr_zasou_480_sim.onnx --overwrite-input-shape pixel_values:1,3,480,480
上記で、
detr_zasou_480_sim.onnx
が作成される。

3. onnx -> rknn への変換を行う。



(rknn_env310) $ python convert_dtr_onnx2rknn.py
で、
detr_zasou_480_sim.rknn
が作成される。

注) convert_dtr_onnx2rknn.py を実行するには、
python 3.10 で、下記環境が必要
setuptools==68.2.2
onnx==1.14.1
rknn-toolkit2

ubuntu 24.04 に、python 3.10.20 をインストールします。
python 3.10 で、rknn 用、virtualenv を作成します。
$ python3 -m virtualenv -p python3.10 rknn310
$ source rknn310/bin/activate
(rknn_env310) $
(rknn_env310) $ pip install --upgrade pip
(rknn_env310) $ pip install setuptools==68.2.2
(rknn_env310) $ pip install onnx==1.14.1
(rknn_env310) $ pip install rknn-toolkit2

注) 必ず、上記バージョンを使います!!
念の為、 python -m pip freeze の結果を上げておきます。

注)
setuptools 68.2.2

後は、detr_zasou_480_sim.rknn を、Orange pi 5 armbian(22.04) へ持って行って、実行させるだけじゃ!!

4. Orange pi 5 armbian(22.04) で、実行。
入力画像は、アスペクト比を維持して、480x480 リサイズ、余白を、黒(0,0,0) 埋めにして渡します。

$ python detr_rknn_3class_ex_test.py

4.1 RKNNLite 環境の作成。
armbian 22.04 で行います。
$ sudo uname -a
Linux orangepi5 5.10.110-rockchip-rk3588 #23.02.2 SMP Fri Feb 17 23:59:20 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux

$ python --version
Python 3.10.12

virtualenv で、rknn_env を作成。
$ python3 -m virtualenv rknn_env
$ source rknn_env/bin/activate
(rknn_env) $
(rknn_env) $ python -m pip install numpy


https://github.com/airockchip/rknn-toolkit2/ のダウンロード、
(rknn_env) $ cd ~/local/git-download/
(rknn_env) $ git clone https://github.com/airockchip/rknn-toolkit2.git
(rknn_env) $ cd rknn-toolkit2/rknn-toolkit-lite2/packages
(rknn_env) $ python -m pip install rknn_toolkit_lite2-2.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

あと、ライブラリーのシンボリックリンクをする。

これで、実行できると思う。
あと、/dev/video0 が使えるように、
グループ登録をします。

5. 雑草、木、鉢植え、雑草群 の画像を、カメラで撮影する。(順番が、違いますが、ここが一番始め)

6. 画像サイズの適正化
resize2dtr_size.py
を使って、 LabelImg でアノテーションする前に、画像を、 480x480 サイズに小さくしておくことをおすすめします。

7. LabelImg で、アノテーションファイルを作成します。
classes.txt
zasou
tree
potted-plant
zasou_cluster

アノテーションファイル の中身。
2.jpeg に対応する、アノテーションファイルの例。
2.txt

先頭が、class id
class_id x y width height

8. LabelImg で作成した、YOLO アノテーションファイルと画像パスを使って、metadata.jsonl を作成する。

$ python yolo2huggingface_metadata_3class.py

datasets/train/metadata.jsonl
が作成されます。
最後に、下記、サブディレクトリーに、アノテーションで使った画像ファイルをコピーする。
datasets/train/
 zasou/
 tree/
 potted_plant/

ここまでくれば、あとは学習をするだけ。

9. ROS2 での利用。
いま考えているのは、雑草群を検出した、バウンディングボックスを、 ros2 topic で出して、
depth camera で取り込んだ、 depth データに、この バウンディングボックスをマスクとして使う。
depth データのバウンディングボックスのマスク部分は、データを、all 0 にして、距離ナシにする。
これを、pointcloud2 作成ノード -> localcost map の作成ノードへと渡す。
じゃが!!

10. 最後に!!
一応、 Hugging face detr を、転移学習して Orange pi 5 NPU で動かせる事が、確認できたぞね!!
detr の検出性能は、やはり良いとおもう!!
ターゲットの距離、大きさがの許容範囲がおおきい、YOLO は、距離がずれると、まるっきり検出できない!!
これを使ったら、YOLO8 なぞ使う気がしないのは、おんちゃんだけ?

このブログ記事について

このページは、おんちゃんが2026年3月15日 18:10に書いたブログ記事です。

ひとつ前のブログ記事は「node.js+express+typescript で、ブロクチェーン!!」です。

次のブログ記事は「Baidu RT-DETRv2 の転移学習と Orange pi 5 NPU での実行。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

月別 アーカイブ

ウェブページ

サイトナビ