AMD(Xilinx)のFPGAコンテストに参加した感想

本サイトはアフィリエイト広告を利用しています。
AI

AMD(Xilinx)とHackster(Avnet)が合同主催する、海外のコンテストに参加していました。

AMD Pervasive AI Developer Contest の「Robotics AI」部門です。

KR260というFPGAボードを使って、コンテスト参加した旨を紹介します。

 

スポンサーリンク
  1. AMD(Xilinx)のFPGAコンテストに参加した感想
    1. AMD Pervasive AI Developer Contest
    2. Robotics AI部門に参加
    3. コンテストの期間は約7か月
    4. 書いている人のAIやRoboticsのレベル
  2. Kria KR260 Robotics Starter Kit(評価ボード)
    1. Webテスト+要旨(Abstract)の予選あり
      1. Webテスト
      2. 要旨(Abstract)
    2. 趣味で経験があった評価ボード
  3. コンテストで開発したテーマ
    1. コンテストの要件
    2. 360°カメラを使った理由
    3. 部品構成
      1. 360°カメラ
      2. ロボットカー・アーム・フレーム
      3. モータドライバ
      4. デバッグ基板
    4. 電気回路図
  4. コンテストで開発・テストしたもの(サブプロジェクト)
      1. PYNQ から GPIO(Lチカ)の動作確認
      2. PYNQ からPWM(DCモータ)制御
      3. DPU-PYNQからの物体検出(YOLOv3)
      4. DPUとGPIOとPWM含めたPYNQへの合成
      5. RICOH THETA(360°カメラ)のリモート操作
      6. GStreamerで360°ライブストリーミング
      7. 360 °ライブストリーミング+物体検出(DPU)
      8. 360°物体検出のデータをROS2へ出力
      9. 360°物体検出のロボットカーのテスト
      10. YOLOv3→YOLOXで物体検出の高速化
      11. DPUの各アーキテクチャの速度比較
      12. ロボットカーの消費電力の見積
      13. Vitis AI ONNX Runtimeの応用
      14. 普通のWebカメラでのテスト
  5. コンテストへの感想
    1. 海外のコンテストも何とかなる
    2. コンテストだと強制的にレベルアップする
    3. AIのコンテストで完走できたのは初
  6. 謝辞
  7. PyCon mini 東海 2024 でも発表しました
    1. 発表した際にいただいた質問
      1. 360°カメラから距離(深度)まで計算したのか
      2. 画像認識のfpsの制約は
      3. デバイスは全部どれぐらいのコストなのか?趣味?
      4. FPGAはデバイスの設定とか必要ではなかったでしょうか
      5. ZYNQでしかできないのか?
  8. まとめ

AMD(Xilinx)のFPGAコンテストに参加した感想

FPGA(KR260)、PYNQ、Vitis-AIがテーマのコンテストに参加していました。

AMD(Xilinx)とhackster.ioが合同主催する、海外のコンテストで結構規模が大きいものでした。

Pervasive AI Developer Contest
Fueling Groundbreaking Innovations With AMD.

 

(表彰・順位発表は1か月以上先で、たぶん多くのことを忘れると思うので…)

忘備録もかねて、参加した感想記事を残しておきます。

 

*2024/10/13追記

(運良く)2位になりました。サンフランシスコで下記のAMDのイベントで表彰されました。

AMDの開発者向けイベントのAdvancing AIに参加してきた

AMDの開発者向けイベントのAdvancing AIに参加してきた
AMDの開発者向けイベント「Advancing AI 2024」に参加してきました。アメリカのサンフランシスコで開催され、現地まで行ってきました。当日のイベントの様子から、表彰された旨を紹介します。AMDの開発者向けイベントのAdvanci...

 

AMD Pervasive AI Developer Contest

「AMD Pervasive AI Developer Contest」というタイトルの通り、AI関連のコンテストでした。

AMDがAIを開発者(Developer)に普及(Pervasive)しようぜ! という感じの内容です。

(主催者(AMD)が評価ボードやGPU、mini_PCを配布して、開発・紹介してもらう内容です。)

 

Robotics AI部門に参加

AMD・Avnetという、海外メーカ・商社の主催コンテストでした。

筆者としても、海外のコンテストに参加するのは初めての経験です。

ただ海外と言っても応募から表彰まで全てネットで完結するので、気軽に参加出来ました。

 

今回のコンテストは、下記の3部門に分けられていました。

可能ならば全部に参加したかったですが、一番開発したい「Robotics部門」を選びました。

「FPGAの評価ボード(KR260)を使って、ロボットとAIっぽいことしようぜ」という内容です。

  • GPU部門   …AMDのGPUを使ったコンテスト
  • Robotics部門 …AMDのFPGA(Kria_KR260)を使ったコンテスト ←コレに参加
  • PC部門     …AMDのminiPCを使ったコンテスト

 

一応、全世界の規模でコンテストの参加人数としては、世界中から約8000人程度いました。

ハードウェアを絡めたコンテストとしては、結構大きい規模だと思います。

(多分Botとか登録しただけ人も多いので、実際の参加者はもっと少ないと感じましたが…)

 

コンテストの期間は約7か月

コンテスト期間も「約7か月」と相当長かったです。

(アナウンス~表彰・順位発表まで入れると、9か月以上にもなる長期戦でした)

「評価ボード当選までの予選が約2か月」+「最終提出期限まで約5か月」という期間でした。

・2023/12…コンテストの開催アナウンス
2024/2…評価ボードの申請期限(英語のWebテスト+応募のAbstract提出)
・2024/3…評価ボードの当選発表
・2024/4…評価ボードが到着
・2024/7…コンテストの提出期限(プロジェクト記事投稿)
・2024/9…コンテストの入賞者発表

 

後半は若干中だるみもしましたが、何とか完走できました。

元々は提出期限が6月だったのですが、1か月伸びるアナウンスが来た時は精神的にキツかった…。

 

書いている人のAIやRoboticsのレベル

正直なところ、筆者のAIやRoboticsの仕事での経験は「無し」です。

仕事はハードウェアのエンジニアをしています。(主に電気回路や基板を設計している人)

AI・機械学習や、Python、ROSも普段の仕事では全く使わない人です。

 

土日の趣味でブログとか書きつつ、電子工作やプログラムで遊んでいる人です。

(このブログの過去記事をさらっと見てもられば、普段何しているのか分かると思います)

そのため結構適当なコードを書いているので、あんまり信用・期待しないでください。

 

Kria KR260 Robotics Starter Kit(評価ボード)

今回使用した評価ボードは「Kria KR260 Robotics Starter Kit」でした。

「CPU + FPGA」が1チップの、Zynq UltraScale+が搭載された開発者用ボードです。

 

無事に当選して、無償でいただけました。円安もあり7万円ぐらいする評価ボードです。

このRobotics部門だけで200人にボードを無償配布していました。

(やっぱりAMD相当に儲かっているんだな…とちょっと思いました)

 

Webテスト+要旨(Abstract)の予選あり

無償でしたが、もちろん応募すれば誰でも貰えるわけではありませんでした。

Webテストとコンテストの要旨(Abstract)を提出した、上位200人に無償配布される形でした。

通過・パスしたら、国際便(DHL)で送られてきました。

 

海外のコンテストなので、WebテストもAbstract提出も全て英語でした。

(ただSpeaking/Listeningがあるわけではないので、そこまでハードルは高くなかったです)

 

Webテスト

受けたWebテストの感想としては、今回のKR260の開発テーマに関するテストでした。

FPGAやDPUの高位合成、ZYNQの環境構築を経験した人なら解けたテストだったと思います。

(筆者の趣味の開発レベルで特に問題ありませんでした。)

 

特に時間制限もなく、4択問題でした。またWebなので翻訳・調べながら解けました。

そこまで苦労はなかったです。

80点以上がボーダーでしたが、何とかクリアできました。

 

要旨(Abstract)

要旨(Abstract)に関しては、今回のコンテストで作る予定のものをまとめて記載しました。

下記が筆者の要旨(Abstract)です。他の候補者のも確認できるようになっています。

結構あっさり書きましたが、(当選したということは)特に問題なかったようです。

 https://www.hackster.io/contests/amd2023/hardware_applications/16888

 

 

趣味で経験があった評価ボード

KR260は元々2年ほど前に面白いなと思って、個人で購入して使用経験があるボードでした。

その際はTSN(Time Sensitive Networking)というネットワーク関係で使って、遊んでしました。

TSN通信の仕組みのまとめ。実際にテスト・調べてみた

 

あと同じシリーズのKV260という評価ボードも1年ほど前に使用した経験がありました

AIエッジコンテストという大会に参加していました。

第6回AIエッジコンテストが凄く難しいけど勉強になった感想

 

コンテストで開発したテーマ

筆者は「360°Object Detection Robot Car」というテーマで参加しました。

メインプロジェクトは下記リンク先です。(各サブプロジェクトへのリンクにも繋がっています)

 https://www.hackster.io/iotengineer22/360-object-detection-robot-car-bdb1bd

360° Object Detection Robot Car
This is the 360° Object Detection Robot Car featuring the KR260. This Robot was built for the AMD Pervasive AI Developer...

上記で詳細に記載していますので、この記事では凄く簡単に紹介します。

 

ソースコードやコンパイル・ビルド済のモデルは下記GitHubです。

GitHub - iotengineer22/AMD-Pervasive-AI-Developer-Contest: This repository present solution for the AMD Pervasive AI Developer Contest.
This repository present solution for the AMD Pervasive AI Developer Contest. - iotengineer22/AMD-Pervasive-AI-Developer-...

 

「360°カメラとKR260を搭載したロボットカー」を作るというテーマにしました。

 

KR260のDPUを利用することで、360°の物体検出の推論をPL(FPGA)で処理しています。

またロボットカーとアームを駆動するPWM・GPIOのIPもFPGAで処理しています。

FPGAとCPUを連携することで、360°のAI visionを持つロボットを構成しました。

 

主に下記辺りの内容を開発しました。

  • 360°カメラからのROS2 3Dマーカーの可視化
  • DPU-PYNQを使用した360ライブストリーミング中の物体検出
  • PYNQ + オリジナル基板によるロボットカーおよびアームの制御
  • 最新のVitis AIを使って、ONNXRuntimeへの展開

 

コンテストのまとめの1分動画が下記です。多分これが一番分かりやすいと思います。

 

 

コンテストの要件

まず今回のコンテストの「Requirements」として必ず下記の2つを使う必要がありました。

  • Use the Kria KR260 Robotics Starter Kit
  • Use Vitis AI or PYNQ

 

また概要には、カメラなど使ったAIビジョン・ROSへの出力も望まれていました。

For this category, we want to see developers create unique AI vision-guided robotics applications using camera inputs and control output with ROS and AI targeting the Kria KR260

 

なので、KR260・Vitis AI ・PYNQ・カメラ・ROSも全部使うプロジェクトにしました。

また普通のカメラを使うのも何だな…と思い、折角なので360°カメラを使ってみました。

ROSも使った経験なかったですが、いい機会なので今回初めて触ってみました。

 

360°カメラを使った理由

(360°)物体検出するならばLidar(点群データ)を使うのが、良いかなとも思っていました。

ただ前回の2021年のコンテストの優勝者が、既に同様なコンセプトでLidarを使っていました。

また普通のカメラからの物体検出も行っていました。

 https://www.hackster.io/jlamperez10/karp-5e19e9

 

その中で普通のカメラ・Lidarを使って物体検出しても、似た構成になると思いました。

そのため「新規性 + 以前から触りたかった360°カメラを使ってみるか」と決めました。

 

360°カメラは要旨(abstract)を書く時から考えており、予選の段階から購入していました。

年始にラズパイでプレテストとして、遊んだりもしていました。

ラズパイでRICOH THETAをUSBから操作するメモ

ラズパイでRICOH THETAをUSBから操作するメモ
360度カメラのRICOH THETAを入手したので、ラズパイから操作してみました。GithubにあるライブラリでUSBから簡単に操作できます。インストール方法から実行例含めて紹介します。ラズパイでRICOH THETAをUSBから操作する...

 

360°カメラの中でもRICOH THETAを選んだ理由は、APIやライブラリが充実していたからです。

(「Insta360」や「Gopro MAX 360」も一度は考えましたが、ギブアップしました)

360°ライブストリーミングをPython・OpenCV経由で簡単に入手できるのがTHETAでした。

 

今回のプロジェクトは「RICOH THETA V」が無かったら、成立しなかったです。

THETA Vは古い(安い)モデルでしたが、十分に360ライブストリーミングを処理してくれました。

RICOH様には、この場を借りてお礼申し上げます。

 

部品構成

基本的に安く手に入る、汎用的の部品のみで構成しています。

定価だと360°カメラを含めて約$500、含めなければ約$200と、低コストのロボットカーです。

筆者は古い360°カメラを使ったり、パーツ流用もしたので実質は2万円ぐらいでした。

というかあくまで趣味・遊びのコンテストのため、莫大なお金はかけれない…

 

360°カメラ

360°カメラはロボットカーに固定して使用しています。

360°カメラに1/4インチの取り付け穴が最初からありますので、簡単に固定できます。

  • 360°カメラ…RICOH THETA V
  • 固定用ボルト…直径1/4インチ_長さ3インチボルト+ナット

 

ロボットカー・アーム・フレーム

FPGA・プログラムに集中するために、メカ箇所はTAMIYAのキットを改造して使いました。

(こども向けと書いてありましたが、結構組み立ての難易度ありました。)

 

KR260も搭載できるように、追加できるフレームも作成しています。

またタイヤも大きいものに変更しています。

 

TAMIYAの汎用キットを使っているので、DCモータ・細かいネジなども同梱されています。

ロボットカー駆動箇所の写真です。ギアボックスはトルク増やすために追加購入しています。

 

アーム箇所です。アーム箇所はキットのデフォルト構成を使用しています。

 

KR260を簡単にロボット・アーム箇所と分離できるようにしました。

これが本当に良かった。

モータパワーが不足しがちで、不必要なときは外して(軽くして)テストしていました。

 

本当にTAMIYAの品質は神でした。安定感がレベチです。

結構無理した使い方をしたのですが、この長期間のコンテストを耐えきってくれました。

TAMIYA様にはこの場を借りてお礼申し上げます。

 

モータドライバ

自作のKR260専用のDCモータドライバ基板です。

ロボットカー駆動用とアーム駆動用で2枚使いました。

基板のデータはGitHubで公開しています。リンク先はこちら。

GitHub - iotengineer22/PCB-DRV8833-TEST: DRV8833-PCB-KiCad-DATA
DRV8833-PCB-KiCad-DATA. Contribute to iotengineer22/PCB-DRV8833-TEST development by creating an account on GitHub.

 

 

PMODコネクタに直接接続できる構成となっています。

J4コネクタにモータ電源を入れて、J2/J3コネクタからDCモータをそれぞれ制御可能です。

自分の簡単・お手製ドライバでも、壊れることなく、問題なくPWM制御出来ました。

 

 

デバッグ基板

自作のKR260専用のデバッグ(LED/SW)基板です。

基板のデータはGitHubで公開しています。

GitHub - iotengineer22/PCB-KV260-PMOD-TEST: PCB-KV260(KR260)-PMOD-INOUT
PCB-KV260(KR260)-PMOD-INOUT. Contribute to iotengineer22/PCB-KV260-PMOD-TEST development by creating an account on GitHu...

 

PMODコネクタに直接接続できる構成でLED3つとSW1つが搭載されています。

このデバッグ基板がコンテストで一番使いました。本当にMVPでした。

マジで最初に作って良かった。物体検出・PWM等のデバッグで役立ってくれました。

 

 

電気回路図

全体回路図です。本当にシンプルな回路を意識しました。

特殊な電源などは使用せず、評価ボードの電源をそのまま使っています。

(後述していますが、本当はTypeCのモバイルバッテリを試みましたが容量足りなかった)

 

各PMODコネクタへの回路図は下記です。

 

コンテストで開発・テストしたもの(サブプロジェクト)

このコンテストの開発は完成までに長い手順となっています。

各手順をサブプロジェクト化しています。

(筆者の感想がメインですが)凄く簡単にですが、この記事でも紹介します。

 

詳細を確認したい方は、各リンク先・また下記のメインプロジェクトを参考ください。

 https://www.hackster.io/iotengineer22/360-object-detection-robot-car-bdb1bd

 

また今回コンテストのリファレンスである下記のセットアップが前提となっています。

下記GitHubの手順を沿うことでKR260上のUbuntuの開発環境(PYNQ,ROS)が整います。

 https://github.com/amd/Kria-RoboticsAI

 

PYNQ から GPIO(Lチカ)の動作確認

一番最初に自作のデバッグ基板を使って、KR260のFPGA(PL)からLED点滅をしました。

GPIOを駆動させることからスタートです。(やはりLチカできないと、本当に何も進まない)

コンテストの開発要件であるPYNQから制御しています。

詳細のリンク先は下記です

 https://www.hackster.io/iotengineer22/control-gpio-from-pynq-and-kr260-0d3613

 

テスト動画は下記です。

 

PYNQ からPWM(DCモータ)制御

ロボットカー・アーム動作に必要なPWM制御のテストをしました。

FPGA(PL)のPWMのIPのレジスタをPYNQ経由で触っています。

モータドライバ基板のテストも兼ねてでしたが、問題なくPWM動作しました。

(コンテスト通じて、ドライバICを数個は壊すと考えていましたが、全部生き残りました)

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/control-pwm-dc-motor-from-pynq-and-kr260-bb0296

 

テスト動画は下記です。

 

DPU-PYNQからの物体検出(YOLOv3)

Vitis AIやDPUの経験はあったのですが、DPU-PYNQは初めてでした。

練習兼ねて、DPU-PYNQのサンプルにもあるYOLOv3を改造して物体検出のテストをしました。

TensorflowからTensorflow2のモデルにしたり、Coco2017にlistを更新などしました。

 

上写真の通り、360°の横長の画像を直接YOLOv3にぶち込んでも検出精度が微妙でした。

2枚の画像に分割して、縦横比を1:1にするとより検出できるようになりました。

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/object-detection-yolo-with-dpu-pynq-and-kr260-777fb5

 

テスト動画は下記です。

 

DPUとGPIOとPWM含めたPYNQへの合成

DPUの経験あったのですが、PYNQ向けかつGPIOとPWM含めての合成は初めてでした。

ここが最初に躓いた?ハードル?あったところでした。

Vivado(クロック)→Vitis(DPU)→Vivado(GPIO等)と順に合成することで対応できました。

正直これが、正式な手順なのかが???でしたが、動いたからヨシとしました。

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/object-detection-yolo-with-dpu-pynq-and-kr260-777fb5

 

テスト動画は下記です。

 

RICOH THETA(360°カメラ)のリモート操作

RICOH THETAをKR260から遠隔(リモート)操作できるようにしました。

WakeUP~カメラ撮影モード~撮影~データ転送の一連の流れを確認しています。

 

ただ単純にRICOHの(APIの)撮影だと、360カメラ画像1枚あたり約3秒かかりました。

(撮影・転送が速ければ、動画ではなく静止画を使って楽・誤魔化そうかとも考えていた…)

リアルタイムで360°物体検出をするには、次章のGStreamerが必要になりました。

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/remote-control-360-camera-from-kr260-f0ead0

 

テスト動画は下記です。

 

GStreamerで360°ライブストリーミング

KR260にRICOH THETAから、360ライブストリーミングのデータを流し込んでいます。

GStreamerを使うことで、リアルタイムで360°画像を処理できるようになりました。

USB2.0でも2K(1920x960)の転送スピードとして約6fpsほどは出ていました。

 

筆者がGStreamerを使うのが初めてで、パイプラインの定義などに苦労しました。

専用プラングインをmakeしたり、指定の場所に置いたりなども、最初は???でした。

ただ一度使い始めると、「GStreamer凄い!+ 奥深い!」と感動?していました。

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/gstreamer-opencv-with-360-camera-and-kr260-308442

 

テスト動画は下記です。

 

360 °ライブストリーミング+物体検出(DPU)

360°ライブストリーミング中にKR260のDPUを使って物体検出を行いました。

GPIOやPWMも一緒に制御できることも確認しています。

(GW休みが消えましたが…)テーマの「360°物体検出のロボットカー」の大筋はできました。

 

PYNQの仮想環境だとGStreamerがインストールされていない点には、少し悩みました。

(OpenCV環境を再ビルドする手段も考えましたが、)

今回は、PYNQ環境のopencv-pythonをアンインストールする手段を取りました。

Ubuntu環境側のOpenCVと紐づけることで、PYNQでもGStreamerを使えました。

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/360-live-streaming-object-detect-dpu-with-kr260-69dced

 

テスト動画は下記です。

 

360°物体検出のデータをROS2へ出力

ROS2は未経験でしたが、良い機会でしたので挑戦してみました。

360°の物体検出したデータから、ROS2へ3Dマーカーとイメージを出力させました。

無事360°の位置情報をrviz2で表示させることが出来ました。

 

正直なところ、ROS2の3Dマーカー出力はかなり強引にやっています。

(360°画像を分割して、各方向に対して雑なアフィン変換しているだけです。)

ただLidarを使わなくとも、360カメラで簡単な感じに視覚化できたことは良かったです。

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/ros2-3d-marker-from-360-live-streaming-with-kr260-a8c51c

 

テスト動画は下記です。

 

360°物体検出のロボットカーのテスト

360°物体検出に加えて、ロボットカー・アーム駆動のテストを行いました。

「ロボット駆動」と「360°物体検出・ROS出力」をスレッド分けて処理させています。

PYNQ(Python)経由だと、簡単にスレッド分けて処理できました。(ただバグは沢山作ったが…)

 

360°で手を検出して、ロボットカーを自動回転させるテストも試してみました。

 

今回の構成で一番失敗したと感じたのは、モータパワーが足りなかったことでした。

KR260を積むと、5VのDCモータだとギアを高くしても、かなり動作に制限がありました。

(逆にKR260を搭載しないと、動きが明確に軽やかになるのは一目瞭然でした)

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/control-360-object-detection-robot-car-with-kr260-95a07e

 

テスト動画は下記です。

 

YOLOv3→YOLOXで物体検出の高速化

本当のこと言うと当初の予定では、これ以降は実施する予定はありませんでした。

ただコンテスト1か月が途中で伸びたので、物足りなかった箇所を改善してみました。

まず古いYOLOv3だとリアルタイム検出で遅さを感じていたので、YOLOXに書き直しました。

 

YOLOXだとYOLOv3と比べて数倍速くなりました。

(フレームワークの関係や、モデルサイズなども色々影響あったと思いますが…)

普通の写真でも、360°ライブストリーミングでも大分改善できました。

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/object-detection-with-yolox-pynq-and-kr260-13d32f

 

テスト動画は下記です。

 

DPUの各アーキテクチャの速度比較

DPUはサイズを大きくしてクロックを速くすれば、処理速度も上がります。

ただ実際にどれぐらい速くなるか、FPGAの使用率(Utilization)の変化は気になっていました。

折角なので、一通りDPUを合成して確認してみました。(多分こんな機会がないとやらない…)

 

最初は、DPUを厳しい条件(B4096+300MHz)でも追加のIP合成は余裕かなと思っていました。

ただ実際はギリギリでした。(実はPWMのIPをあと1個追加するのも厳しかったぐらい…)

DPUへIPのクロックはかなり厳しいタイミング要求でした。

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/benchmark-architectures-of-the-dpu-with-kr260-699f19

 

ロボットカーの消費電力の見積

最初のプランではモバイルバッテリーから電源供給して、電源ケーブル無しを考えていました。

しかし想定より電力消費量が大きく、20Wでは不足でした。リブートを繰り返します。

DPU処理までは耐えれたのですが、モータ動作まではカバーできなかった旨をまとめました。

 

ただ20Wを超えるとモバイルバッテリの容量ではカバーできませんでした。

(モータパワーが足りない状況で、更に重いバッテリを積むわけにはいかなかった)

今回のロボット構成だとバッテリ駆動は難しかったです。設計時点で悪かったです。

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/power-consumption-of-robot-car-with-kr260-8c9fbc

 

テスト動画は下記です。

 

Vitis AI ONNX Runtimeの応用

Vitis AIの最新機能も試してみたいなと思い、ONNXにも触れてみました。

今回使用したVitis AI 3.5のVerからは、ONNXのRuntimeもサポートされています。

ただUbuntu環境ではどうにも出来なかったので、PetaLinux環境を作ってテストしました。

 

ONNXを触るのも初めてでしたが、非常に便利でした。

推論のCPU/DPUの切り替えも簡単ですし、DPUへのコンパイルも自動にしてくれます。

ちょうどDPUの性能を示す、ベンチマークという意味でも都合が良かったです。

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/vitis-ai-onnx-runtime-engine-voe-with-kr260-python-0d02c3

 

テスト動画は下記です。

 

普通のWebカメラでのテスト

提出期限まで少し時間余ったので、汎用のWebカメラにも適用してみました。

GStreamerのPipeline処理や、画像の分割処理を省略すれば、ROS2出力含めて動きました。

360°カメラ(RICOH THETA)を毎回用意するのも手間なので、筆者含めてプレ検証用です。

 

今回360°カメラを無理に使う必要はなく、格安のWebカメラ2個使えば良かったのでは…

と最後に冷静になって思った…のは言うまでもないです。

 

詳細のリンク先は下記です。

 https://www.hackster.io/iotengineer22/object-detection-with-kr260-from-a-webcam-85c261

 

テスト動画は下記です。

 

コンテストへの感想

まず最初に思うのは「凄く疲れた」+「凄くやり切った」です。

(半年クラスは過去にもありましたが)、7か月を超える開発コンテストは初でした。

 

海外のコンテストも何とかなる

正直、筆者も英語は苦手な人です。(会社のチームの中でも下手な方です。)

ただ今は、ChatGPT・Google翻訳・DEEPLなど便利なツールが沢山あります。

海外のコンテストの登録~申請~提出を一通りこなしましたが、何とかなる感じです(N=1小並感)

 

国内含めて、趣味が合う(ハードウェアの)コンテストは少ないです。

もし面白そうなコンテストが海外であったら積極的に参加するべきだと実感しました。

(大体はネットで完結するはずだし、仮に失敗しても面白い?良い?経験になると思います)

 

コンテストだと強制的にレベルアップする

コンテスト・コンペ参加の一番のメリットは、技術の伸びしろが大きいことかと思います。

課題をクリアするために、経験ないこととも半強制的に頭抱えながら対応する必要があります。

今回のコンテストでも以下は実は全部初の経験でした。

  • 360°カメラ…レンズによる端の歪み+切れ目があり、結構使いこなすの難しい…。
  • 基板発注…仕事で経験ありますが、個人発注は初めて。速く・便利で凄く驚きでした。
  • GStreamer…各プラグイン、パイプラインの定義含めて奥が深かったです。
  • ROS2…全く使いこなせなかった。出力テストした程度で終わってしまった。
  • ONNX…周りから便利だよと言われてましたが、納得です。テストしやすいです。

 

普段は興味ないことも、コンテストでは結構真面目に勉強・経験する良いタイミングになります。

(興味ある・好きなことばっかりやっていると技術も偏っていくので…)

 

AIのコンテストで完走できたのは初

筆者もソフト・AI・ロボットが仕事でもなく専門でもない人です。

今回のようなDPUや物体検出に関しては、コツコツ?時たま?週末に触っている程度です

あくまで趣味で遊んでいるレベルです。

 

2~3年前にも国内の「第5回AIエッジコンテスト」というものに参加していました。

画像処理やAI関係のコンペは初めてで、全く太刀打ちできませんでした。

サンプルプログラム動かす程度に終わりました。

 https://misoji-engineer.com/archives/ai-edge-contest.html

 

1~2年前にも同じく「第6回AIエッジコンテスト」に参加していました。

ある程度使えるかなと思ってきましたが、ここでも完走できませんでした。

 https://misoji-engineer.com/archives/6th-ai-edge-contest.html

 

今回ようやく完走できたという感じです。

(ただ今回は何か作ってアウトプットすれば完走にはなるので、比較的楽でしたが…)

 

という感じで、書いている人も結構失敗しながらコンテストに参加しています。

なので(初心者・未経験の方は)上手くいくかは気にしなくて良いと感じています。

筆者も興味あるコンテスト・コンペは継続的に参加していきたいと再実感しました。

 

謝辞

今回のコンテストでは多くのリポジストリ・Web記事を参考にさせていただきました。

その中でも、特に助けていただいたものを紹介していきます。

この場を借りてお礼申し上げます。

 

・KR260 の PMOD ピン番号表

 https://marsee101.blog.fc2.com/blog-entry-5847.html

KR260のPMODコネクタのピン番号が分かりやすく記載されていました。

 

・KV260にVitis AIを組み込む(AIEDGEコンテスト対応版)

 https://qiita.com/basaro_k/items/dc439ffbc3ea3aed5eb2

毎回KV260/KR260にVitis AIを組み込むときに見させていただいてます。

 

・KV260向けにVitisプラットフォームを作成してDPUを動かす その1 (Vitis 2022.1 + Vitis-AI v2.5)

 https://qiita.com/lp6m/items/df1b87b11f8275ee6210

同じくDPU触るとき、毎回見させていただいています。

 

・YOLOX-ONNX-TFLite-Sample

 https://github.com/Kazuhito00/YOLOX-ONNX-TFLite-Sample/

YOLOv3→Xにして高速化しましたが、この方のコードを本当に参考にさせていただきました。

 

・gstthetauvc

 https://github.com/nickel110/gstthetauvc

このリポジストリが無かったらRICOH THETAでライブストリーミングできなかったです。

 

・AIエッジコンテストの入賞者のレポート

 https://signate.jp/competitions/537/summary

 https://signate.jp/competitions/732/summary

第5回・第6回の上位入賞者のレポートです。これ読むだけでも本当に勉強になります。

(上記のコンテストでDPUの経験がなかったら、今回のアウトプットは無かったです)

 

PyCon mini 東海 2024 でも発表しました

PyCon mini 東海 2024で発表者として、今回のネタで参加してきました。

発表テーマは「Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた」です。

今回使ったPYNQに焦点を当てて、発表してきました。

 

PyCon mini 東海 2024の感想記事のリンク先は下記です。

PyCon mini 東海 2024 - 名古屋の中日ビルで発表してきた

PyCon mini 東海 2024 - 名古屋の中日ビルで発表してきた
PyCon mini 東海 2024で発表者として参加してきました。発表テーマは「Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた」です。当日のカンファレンスの様子から、懇親会の様子含めて紹介します。PyCon...

 

発表した際にいただいた質問

ありがたいことに、発表した際に質問が何点かいただきました。

鋭い質問ばかりでした。忘備録として記載しておきます。

 

360°カメラから距離(深度)まで計算したのか

すみません、これは実施していないです。

360°物体検出した2D画面データの座標を元に、雑にアフィ変換して投影しただけです。

ROS2のマーカ位置関係は凄く曖昧です。大体ここにいるというのを表示しているだけでした。

 

画像認識のfpsの制約は

今回RICOH-THETAのカメラがUSB2.0で、そこで大きく制約掛かりました。

単純に1920x960の360°画像を送り続けると大体6fpsぐらいでした。

それを分割してYOLOXで物体検出して3~4fps程度でした。

 

デバイスは全部どれぐらいのコストなのか?趣味?

今回コンテストでは評価ボードは支給されたので、それ以外の値段で大体$500ぐらいでした。

(一番高いのは評価ボードは$399なので、7万ぐらい浮いた形になります)

既に持っていた360°カメラを除くと$200ぐらいでした。趣味でカバーできる費用でした。

 

FPGAはデバイスの設定とか必要ではなかったでしょうか

はい、(FPGAの細かい設定までは)全てPythonで設定しているわけではないです。

最初に一度はFPGAのツール使って、デバイスや入出力ポートを設定(合成)しています。

あくまでロジック箇所をハードウェア言語を書かずに、FPGAで対応したイメージです。

 

ZYNQでしかできないのか?

はいその通りです。今回は、PYNQ(Pythonを動かせるフレームワーク)を使っています。

AMDのZYNQというデバイスのみでサポートされています。

全てのFPGAでPythonが使えるわけでないので注意です。

 

まとめ

AMD(Xilinx)とHackster(Avnet)が合同主催する、海外のコンテストに参加していました。

AMD Pervasive AI Developer Contest の「Robotics AI」部門です。

KR260というFPGAボードを使って、コンテスト参加した旨を紹介しました。

 

前回が2021年だったので、次回は数年後かもしれませんが興味ある方は参加してみてください。

 https://www.hackster.io/iotengineer22/360-object-detection-robot-car-bdb1bd

360° Object Detection Robot Car
This is the 360° Object Detection Robot Car featuring the KR260. This Robot was built for the AMD Pervasive AI Developer...

コメント