えいあーるれいの技術日記

技術系を中心にした日記です

YOLOXをROS2に実装してみた

皆さんは、YOLOXについて知っていますか?

YOLOXはつい最近論文が公開された新しい物体検出アルゴリズムです。論文

まだ詳しく知っているわけではありませんが、darknet/YOLOv3から派生した物体検出アルゴリズムで、YOLOv4やv5と異なりアンカーボックスを使わない(アンカーフリー)という特徴があります。

アンカーフリーにすることで複雑なパラメータを設定せずに高い再現率を得られるそうです。

medium.com

論文では、より高い精度を出せると主張されており、表を見る限りだと速度はYOLOv5に劣るものの、それを上回る再現率を出せてそうです。

f:id:Ray_ar:20210728021645p:plain

GitHubソースコードが公開されており、まだ公開から1週間程度なのに既に2500スターがついています。

github.com

ちなみに、YOLOv4の作者であるAlexey Bochkovskiy氏は、「依然としてウチラのYOLOのほうが強い」とのことです…

ビックウェーブなるかもしれないので乗ってみた🌊

YOLOXのスター数の伸びがすごかったので、乗るしかないこのビッグウェーブに!!ということでYOLOXをROS2に移植してみました。

YOLOXは最適化のために使えるモデルの種類が多く、ライセンスも非常に扱いやすいApache2.0であるため、これの派生プログラムが次々と開発されると思います。

私は短い開発期間でお試ししたい人のために、pythonのデモをベースにしたプログラムを作りました。その使い方について簡単に解説します。

詳しい解説込でQiitaにも上げたいと思っています。

GitHubリポジトリは以下のリンクから。

github.com

YOLOX-ROSの仕様

YOLOXを従来のdarknet-rosにできる限り近づけるための工夫をしました。入力をWebカメラからの映像だとすれば、出力はリサイズされた画像とバウンディングボックスとなります。実装には、過去に作成したmotpy-rosを使用しました。

qiita.com

しかし、darknet_rosが扱うdarket_ros_msgsはdarknet_rosのリポジトリの中に埋まっているので、初めて使う人には少し扱いづらいところがあります。そのため、新しくバウンディングボックスの拡張版となるメッセージを作成しました。darknet_ros_msgsの拡張版であるため、そのまま置き換えられます。

github.com

メッセージについては別記事で詳説する予定です。

パラメータは次に示すものをlaunchファイルに書きます。現時点では最低限のパラメータしかサポートしていないので、書き換えても意味のないパラメータが存在します。以下に変更が反映されるものを示します。

  • image_size/width or /height:入力画像サイズ(縦・横それぞれのピクセル数)
  • yolo_type:タイプ(yolox-sなど)
  • ckpt_file:重みファイル(yolox_s.pth)
  • conf:しきい値

その他にもrankやnmsthreやimg_size(正方形へのリサイズ)も変更可能です。

環境構築

環境構築は、YOLOXのインストールをしてから行います。YOLOXはPyTorchなどに依存しています。

YOLOXのデモが正しく動くことを確認してからYOLOX-ROSの環境構築を行いましょう。


ROSの環境構築は以下の通りにv4l2-cameraなどのパッケージをインストール後にソースコードをビルドするだけで終わります。ただし、Pythonではソースコード検査は行われないためリンク付けされているかどうかは注意してください。

source /opt/ros/foxy/setup.bash
sudo apt install ros-foxy-v4l2-camera
git clone --recursive https://github.com/Ar-Ray-code/yolox_ros.git ~/ros2_ws/src/yolox_ros/
cd ~/ros2_ws
colcon build --symlink-install # weights files will be installed automatically.

デモの際は、環境をロードしてからlaunchファイル起動で実行できます。Webカメラは起動しておいてください。

source ~/ros2_ws/install/setup.bash
ros2 launch yolox_ros_py demo_yolox_s.launch.py

f:id:Ray_ar:20210728040721p:plain

トピックは次のように出現します。

https://raw.githubusercontent.com/Ar-Ray-code/YOLOX-ROS/main/images_for_readme/yolox_topic.png

要望やバグがあれば適宜改善していこうと思います。できればC++で実装できればいいですねーー。したいなーー。

OpenCV4のaptによる簡単インストールメモ(C++,Python)

OpenCVを人にインストールさせるのってやたらめんどうだと思っています。

なぜなら、人によってインストール方法が全く違うからです。

C++なら、ビルドするかaptで取得するとかの違いがあり、バージョンは2・3・4が未だに混在している例が多い。Pythonならもっと手段があって、aptでインストールするのかpipでインストールするのか、condaでインストールするのか、自力ビルドするのか…(そしてPythonはやたら環境が壊れる)


自力でビルドするのが望ましいと思っている人もいれば、初心者の障壁はできるだけ取り除くべきだと考えている人もいると思います。


私は、ROSのパッケージ郡を使っていますが、ROS1やROS2を扱うとほぼ確実にlibopencv-devpython3-opencvがインストールされます。それらはCPUさえしっかりしていればあまり環境を気にせずに環境構築できるので重宝しています。

私はGitHubでドキュメントを書くたびにOpenCVの扱いに困っていたので、ここで備忘録を兼ねて書こうと思います。C++で度々必要になるCMakeLists.txtについても改めて書きます。

インストール方法

Ubuntu20を前提にしています。ただし、Ubuntu16以降ならおそらくインストール可能です。

バージョンに注意が必要な場合があります。

C++

$ sudo apt install libopencv-dev

Python

$ sudo apt install python3-opencv

アンインストールは、apt purge`apt removeで行います。

C++での使い方

プログラム内では次のようにヘッダーを設定します。VSCodeでエラー波線を消す場合は、インクルードパスに/usr/include/opencv4を追加します。

#include <opencv2/opencv.hpp>

CMakeLists.txtでは次のように書きます。<>で囲まれている文字列はそれぞれファイル名に置き換えてください。<execute_file_name>が実際に生成され、実行できるファイル名です。

cmake_minimum_required(VERSION 2.8)
project(test_cmake CXX)

add_executable(<execute_file_name> <c++_source_name>)

find_package(OpenCV REQUIRED)
if(OpenCV_FOUND)
    target_include_directories(<execute_file_name> PUBLIC ${OpenCV_INCLUDE_DIRS})
    target_link_libraries(<execute_file_name> ${OpenCV_LIBS})
endif()

Python3での使い方

こちらはとても簡単。

$ python3
>> import cv2
>> cv2.__version__
'4.5.2'

ちなみに、OpenCV-OpenVINOの設定などをしている場合は'4.5.2-openvino'などの表記になります。(以下の記事で環境構築しています。)

ar-ray.hatenablog.com

参考リポジトリ

特に新しい手法ではないので、この記事の元になった私のリポジトリを貼ります。

github.com

github.com

OpenCVは機能がとても多いので、特に初学者なら本を1冊は持っておくと良いでしょう。

rclshark v1.0.1を公開しました。

実は、このブログでrclsharkのこと一言も触れてなかったり…


1週間ほど前にrclshark v1.0.0をリリースしました。以下のリンクで紹介しているので、是非見て使ってください。

今日、動作確認用の動画を取るために、今一度インストール方法の確認をしていたら、とんでも無い不具合に気づきました。

それは、ubuntuというユーザネーム以外にインストールできないことです。

v1.0.0のリリースを急いでいたのが悪かったのかもしれません。自分のテスト用コンピュータのユーザ名を全て"ubuntu"にしていたため今まで問題にならなかったものが、今になって出ました。

おそらくこれからも多発しそうですね…

そこで、明日のrosjpの組み込み勉強会の前に大急ぎで修正バージョンを作ったわけです。

組み込み勉強会はこちら

技術的な変更点

今回大きく修正したのは、「service ファイル」です。この不具合が起こるまではあまりsystemdの仕様を理解せずに、ネットに転がっているものをただただコピペ&修正でなんとかしてきました。しかし、ROSを使うときはそうは行かなかったのです。

修正前

修正前のサービスファイルを以下に示します。この場合は、User=ubuntuとGroup=ubuntuのせいで、他のユーザにインストールできないという不具合が起きていました。なぜ気づかなかった

[Unit]
Descripton=ROS2 IP Publisher Start

[Service]
ExecStart=/bin/bash /opt/rclshark_ws/src/rclshark/rclshark/rclshark.bash

Type=simple

User=ubuntu
Group=ubuntu

[Install]
WantedBy=multi-user.target

修正後1

そして、以下のように修正しました。ついでに、GUI状態でも起動するように、WantedByの項目について、multi-user.targetからdefault.targetに変更してどの状態でも良いようにしました。

[Unit]
Descripton=ROS2 IP Publisher Start

[Service]
ExecStart=/bin/bash /opt/rclshark_ws/src/rclshark/rclshark/rclshark.bash

Type=simple

[Install]
WantedBy=default.target

これでも一応動く…はずでした。しかしROSのプログラムは動きません!!!

これには理由がありました。順を追って説明すると、

  1. rclを使用したプログラムが立ち上がる。

  2. rclが"~/.ros/log/"の中にファイルを作成しようとする。

  3. "~"を解析できない(ユーザが指定されていない)ので詰む

ログはプログラム内で無効化することはできますが、ファイル生成は免れないようで意味がありませんでした。

つまり、User=...は避けられないらしいです…

修正後2

そこで、User臨機応変(=強引)に追加することにしました。以下にserviceファイルを示します。

[Unit]
Descripton=ROS2 IP Publisher Start

[Install]
WantedBy=default.target

[Service]
ExecStart=/bin/bash /opt/rclshark_ws/src/rclshark/rclshark/rclshark.bash
Type=simple
Restart=on-failure

# Be sure to leave a line feed.

[Install][Service]を逆にして、Userを追加するスクリプトを使用してインストール用シェルファイルにUser=$USERを追加します。

for service_file in $RCLSHARK_WS/src/rclshark/rclshark/service/*.service ; do
    echo "User=$USER" >> $service_file
# (省略)
done

これによって末尾にUserを補完し、ホームディレクトリを定義することができました。


これから、様々なコミュニティで発表していきます。アプデ報告も引き続きこのブログ上で行っていきます🐢

rclshark v1.0.1はこちらから❗

github.com

↓ちなみに、新しくrclsharkの亀のアスキーアートを作りました。インストール後に見ることができます。

f:id:Ray_ar:20210716231324p:plain

GitHub Copilotを1週間お試しレビュー。「ROS」すらもコーディング!?

先週くらいにリリースされた開発版の「GitHub Copilot」。AIがプログラムのソースコードを自動で補完する各基的なプログラムとして一気に話題になりました。

最近のソフトウェア関連のニュースが賑わっております…!

私はこのCopilotのリリースに合わせてCopilotに登録しました。

↓登録はこちらから

copilot.github.com

登録されたら、3日〜5日程度待ちます。登録されたらメールが届きます。

VSCodeのCopilotプラグインをインストールして認証を行うことで有効化できます。

早速お試し。

Pythonプログラムを灰色の文字で補完することができます。Tabを押すとその候補を決定します。また、Ctrl+Enterで最大10個の候補を表示します。

f:id:Ray_ar:20210711202526p:plain

PythonJavaなどのプログラムのほかにもC++も補完できるみたいです。文章も補完できるようなので、AIが言語処理できれば全ての言語でCopilotが使えそうです。

classや関数をコメント文で示すことで、まとめて補完してくれます。便利!

うまくハマれば、Tab→Enter→Tab→Enter→…の連続で文章を補完することができます。

f:id:Ray_ar:20210711203756p:plain

その他

コーパスに含まれていればアスキーアートも提案してくれる。会話文とかも補完してくれるらしいですね。

使ってみた感想

VSCode自体にもともと補完機能があるため、この機能の追加によって操作が変わるということはありません。ただ、最初からコメント文を考えてから書くと、全く関係のない提案が来ることもあるためストレスかもしれません。

また、Copilotは学習したデータをもとに提案してくるため、やはり自分のコードとは違うなとは感じます。自分がこれまで思いつかなかったトリッキーな記法も提案することがあるので、意外とプログラミングの勉強になるなーーと思うところがあります。

まぁ、あとはプログラムの著作権てきなものについて安心して使えるシステムになれば誰にでも使えるシステムになるのかなーと思います。これほど高速にプログラムを書けるの結構爽快感があります😊

youtu.be

一度試してみるべし❗

GitHubアカウントを正規分布で確認できる「LAPRAS」を使ってみた

Twitterの広告でGitHub診断の広告が新しく出ていて「ほほう」と思い診断してみました!

いままでGitHubを「スキル偏差値」として測る「findy」の広告とその亜種ばっかり見てきたので少し新鮮でした。

実はこの広告ツイート1年前からあったみたいです…(?)

LAPRASとは?

LAPRASとは、いわゆる最近流行りのソフトウェア中心の転職支援企業です。設立が2016年で代表取締役含め執行役員の方々もかなり若く、ベンチャーIT企業らしいベンチャー企業です。

この会社が2018年にリリースしたサービスがscouty(のちにLAPRAS)で、AIを活用した分析によって技術力・ビジネス力・影響力を算出します。

最近のソースコード流出や個人情報流出事件などでこの類のサービスには何かとマイナスなイメージがついていますが、このサービスは別に胡散臭いサイトではなく、しっかりと国際会議での査読を通して論文採択されています。ちなみに採択率は22%でかなり高レベルであることが分かります。

LAPRAS、人工知能分野の国際会議「ICML」にて論文採択 | NEWS | LAPRAS株式会社 - すべての人に最善の選択肢をマッチングする -

論文はこちら↓

[1902.04335] Hyperbolic Disk Embeddings for Directed Acyclic Graphs

また、このサービスの参照情報はすべて(あなたが)公開している情報のみを参照しているのでいまさら情報流出wとなりますね。

使ってみる

以下のサイトからログインして各種アカウント情報を紐づけます。

lapras.com

診断対象のアカウントは以下の通りです。

6時間程度しばらく待ちます。特にGitHubの診断時間が長めです。

全て診断が終了すると、次のように結果がでます。

f:id:Ray_ar:20210706022219p:plain

結構カッコいい!!!

私の技術力は3.39… スコアは3.0が平均で、3.3以上は上位13%、3.5以上は上位4%らしいので、まぁ10%くらいということでしょう。半年間学生が投稿しただけで10%だなんて、エンジニア楽勝ですね( ´_ゝ`)フーン

Findyではスキル偏差値としてほぼ青天井なスコアが出ている人もいるため正直なところネタ感もありましたが、こちらは5を絶対に超えないので自分の「立ち位置」を知るのに便利かもしれませんね。

不満点

ぜひ改善してもらえるならしてほしいところを挙げます。あくまで転職の対象外な学生の一意見として参考程度に。

Tag Countの説明不足感

Tag Countという評価項目があり、SNSにおいて技術に関連したタグを検出してレベルを1~10で算出、そのレベルが6以上のタグ数をカウントして数値を出すそうです。私はこの数字が非常に高いそうで、345位、1~5の中で4.62となっています。

しかし、その「6」という数値の基準が何なのか、そのTag Countがどのように技術力にどのようにかかわっているのかが少し不透明で不親切です。本当に私のTag Count値が適正値なのかを疑ってしまいます。

f:id:Ray_ar:20210706030624p:plain

Twitterの情報が少し古い

2週間くらい前のデータを参考にしているようでフォロー/フォロワーの数が正確ではありません。

プラットフォームの参入数は影響力のほうのみに反映すべき

私はTeratailに参加していないのでその技術スコアにおいては2.06となっています。別々のプラットフォームで活動するのも技術力なのかもしれませんが、べつに私が今Teratailに入ろうがスキルが向上するとは思わないので、ぜひ連携していない項目はほかの技術スコアを反映してほしいです。

総評

サイトの転職プラットフォームとしての適性は私にはわかりませんが、分析ツールとしてはかなり面白いほうだと思います。結構詳しく情報が表示されているため、そのままプロフィールとして使いたいくらいです。

しかし、このようなGitHubを活用したスコア評価は少し頑張っただけで平均を大きく上回るスコアを叩き出せてしまうので、あまり相性がよくないのかなー--と思います。

確かに1リポジトリでスターを1つ獲得するのも結構難しかったりするのである意味反映しているのかもしれませんが、GItHubアカウントほとんど使っていない人もいますからねーー。

今後もGitHub連携系の診断サービスをレビューしたいと思うので、もし私が扱っていないものがあれば教えていただけるとありがたいです。

私のスコア結果はこちらから! ↓

lapras.com