ロバの車のガベージコレクターのための自動運転AI
Raspberry Pi plusPiカメラでTensorFlowSSD MobileNetV2 DNNを使用して、物体検出が可能な自動運転車を構築します。
ストーリー
このプロジェクトでは、(Raspberry Pi + Pi Camera)を搭載したRCカーを物体検出と自動運転が可能なものに変換する方法を紹介します。これを行うために、2つのディープニューラルネットワークを展開します。 1つは物体検出用で、もう1つはステアリングとスロットルの推論を使用した自動運転用です。 RPi3は車両のコンピューターとして機能します。 RPiのリソースが限られているため、一度に実行できるネットワークは1つだけです。
車とノートパソコンの識別
第2部では、行動のクローン作成を使用して、車を自律的にナビゲートさせます。改造された車には、超音波距離センサー、GPS、6-DOF IMUなどの追加センサーが追加され、追加のテレメトリ機能が実装されます。
はじめに
2017年(1年前)に、GoogleはMobileNetをリリースし、今年初めにMobileNetV2をリリースしました。これらのネットワークは、スマートフォンなどの組み込みデバイスで動作するようにカスタム最適化されています。偶然にも、RPi 3で使用されるMPUは、LinuxまたはAndroidのいずれかで実行できるため、このカテゴリに分類されます。
最初に遭遇する問題は、Raspberry Pi 3のRAMと計算能力が限られていることです。これはクアッドコアMPUですが、YOLO(You Only Look Once)タイプのネットワーク。
最初に思い浮かぶ解決策は、Piカメラで取得した画像をWIFI経由で外部PCに送信し、そこでオブジェクト推論ステージを実行してから、ロバの車にコマンドを送信することです。本質的には、すべてのステップで母船に連絡する必要があります。これは、外部のラップトップとの通信が不可能なシナリオでは非現実的であることは言うまでもなく、非効率的です。
私は最初、ごみ箱を検出するときに比較的正確なVGG16ネットワークをテストしました。ただし、重量だけで約350MBであったため、RPiでは実行できませんでした。VGGネットワークをテストするには、最後に添付されているコードを参照し、入力と同様の画像を使用してください。
python KerasVGG_test.py
したがって、巨大な重みサイズの問題を解決するために、よりスリムなネットワークを使用してRPiですべてのモデルを実行します。具体的には、MobileNetV2シングルショット検出器ベースのCNNを使用します。これは、非常に小さい(比較的)重みを持つように最適化されたDNNです。
事前にトレーニングされたネットワークウェイトを使用しているため、この手法は転移学習と呼ばれます。
ハードウェア
1.分解
まず、背面のクリップと2本のネジを外して、トップカバーを取り外します。あなたは2人の運転手がいるケージを見つけるでしょう。これも取り外してから、アウタートップケージを取り外します。これで、車の回路にアクセスできるようになります。上から、レシーバー、ESC(Electronic Speed Controller)、サーボを一度見ることができます。
裸のDonkeyCar
2.アダプターを取り付けます
2本のネジとボディトップを取り外した後、2つの3Dプリントプラスチックアダプターが使用されます。同じネジを使用して、既存のクリップの代わりに2つのアダプターをねじ込む必要があります。2つのクリップを2つの3D印刷アダプターに交換した後、上部の木製ロバの車のプレートを取り付けることができます。
長いクリップを交換するアダプター
3.サーボコントローラーとRPi
RPiとサーボコントローラーを木の板に取り付けます。アンテナの近くに金属製のネジを置きたくなかったので、RPiを固定するために結束バンドを使用することになりました。サーボコントローラをねじ込んだ後、RPiからサーボコントローラにI2Cバスピンを接続します。次に、小さなナイフを取り、ESCとサーボ3ピンワイヤーを一緒に保持しているジップタイを切断します。
外部サーボコントローラーに接続するときは、レシーバーへの両方の接続を切断し、後でDonkeyCarトップに取り付けるサーボコントローラーのチャネル0と1に接続する必要があります-プレート。
4.木の板
ロバの車のナンバープレートを上に取り付け、短いUSBケーブルを使用してUSBバッテリーをRPiに接続します。スロットルケーブルとステアリングケーブルはプレートの開口部から突き出ており、ロバの車のプレートに取り付けられているサーボコントローラーのチャネル0と1に接続します。
5.追加のセンサー
標準構成の主な問題は、速度や障害物までの距離を測定するために使用されるセンサーがないことです。 RPiが3D加速度と回転を測定できるようにする6DOFMPU6050 IMUを追加しました。次に、シリアルポートにGPSを追加し、距離測定用のHCSR04センサーも追加しました。ただし、HCSR04は5V経由で動作するため、レベルシフターが必要です。
これで、ユニットのハードウェアステージが完了します。ロバカーは完全に:
を装備した4輪車に変換されましたa)単眼広角カメラ
b)サーボコントローラー。
c)6-DOFIMUセンサー
d)GPS
e)距離センサー
すべての追加センサーは、取得時にタイムスタンプが付けられ、深部神経ネットワークのトレーニングベクトルを増強するために使用されます。
追加のセンサーをサポートするには、manage.pyスクリプトを変更してこの機能を追加する必要があります。
IMUを使用するために、私は最初にDebianStretchでFXOS8700用のPythonライブラリを試しました。 RPiの起動バグが繰り返されたため、これはそのままでは機能しませんでした。そのため、ジャイロスコープも付属しているMPU6050を使用することになりました。
IMUコードをテストするには、以下のスニペットを使用してください。
IMUからインポートMPU6050
mu =MPU6050()
a =imu.run()
a #print answer
sudo apt install python3-smbus
pip install mpu6050-raspberrypi
IMUデータのログ記録をサポートするには、tubフォルダーの下のmeta.jsonファイルを拡張する必要があります。
{「入力」:[「cam / image_array」、「user / angle」、「user / throttle」、「user / mode」、「imu / acl_x」、「imu / acl_y」、「imu / acl_z」、「imu / gyr_x」、「imu / gyr_y」、「imu / gyr_z」]、「types」:[「image_array」、「float」、「float」、「str」、「float」、「float」、「float」、 「float」、「float」、「float」]}
imu =Mpu6050()
V.add(imu、outputs =['imu / acl_x'、 'imu / acl_y'、 'imu / acl_z'、 'imu / gyr_x'、 'imu / gyr_y'、 'imu / gyr_z ']、threaded =True)
#データを保存するためのタブを追加
input =[' cam / image_array '、' user / angle '、' user / throttle '、' user / mode '、 'imu / acl_x'、 'imu / acl_y'、 'imu / acl_z'、 'imu / gyr_x'、 'imu / gyr_y'、 'imu / gyr_z']
types =['image_array'、 'float' 、 'float'、 'str'、 'float'、 'float'、 'float'、 'float'、 'float'、 'float']
最後に、GPSモジュールもユニットに追加しました。これは屋内では使用できませんが、WIFIネットワークに接続できるエリアでの屋外テストに追加すると便利です。
HSCR04距離センサーを使用するには、Python環境からRPI.GPIOライブラリを一度インストールする必要があります。
pi p install RPi.GPIO
これは、すべてのハードウェアの変更をまとめたものです。最終的には、次のようなDonkeyCarが作成されます。
ソフトウェア
ここでのアイデアは、RPiで実行されるオブジェクト検出用のAIパイプラインを実装することです。最初のステップは、外部デバイスに依存せずにRPi3で機能するオブジェクト検出DNNを展開することです。必要なソフトウェアをインストールすることから始めましょう。
1.DNNライブラリをインストールします
pip install tensorflow [pi]
pip install matplotlib raspberry
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-devsudo apt-get install qt4-dev-tools
pip3 install opencv-python
指摘する必要があるのは、ウェイトをh5ファイルとしてロードするための比較的単純なワークフローを持つKerasとは異なり、TensorFlowが異なるファイル形式を使用することです。
sudo pip3 install keras –アップグレード
git clone –recurse-submodules https://github.com/tensorflow/models.git
export PYTHONPATH =$ PYTHONPATH:/ home / pi / tensorflow1 / models / research:/ home / pi / tensorflow1 / models / research / Slim
#sudo shutdown -h now
を使用している場合は、#を非アクティブ化して仮想環境ワークスペースから抜け出します。次のステップは、MobileNetV2SSDの重みに対応するProtobufferコンパイラをインストールすることです。
2.ProtoBufferコンパイラをインストールします
KerasはTensorFlowとは異なるファイル形式を使用しています。そのため、TensorFlowのネイティブ形式であるProtobuffersを処理する必要があります。
sudo apt-get install autoconf automake libtool curl
wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-all–3.5.1.tar.gz
tar -zxvf protobuf-all–3.5.1.tar.gzcd protobuf-3.5.1
./configure
これをコンパイルするには、RPiでかなりの時間(約1.5時間)かかります。もう1つの解決策はクロスコンパイルですが、今のところは単純に保つ必要があります。問題:
作る
make check
sudo make install
cd pythonexport
LD_LIBRARY_PATH =../ src / .libs
python3 setup.py build –cpp_implementation python3 setup.py test –cpp_implementationsudo python3 setup.py install –cpp_implementation
export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION =cpp
export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION =3
sudo ldconfig
最後に、コンパイラをテストするには、次のように入力します。
protoc
これで、私たちはうなり声を上げるように読まれました。これにより、ウェイトをTensorFlowが理解できる形式に変換できるようになります。
詳細を読む:ロバの車のガベージコレクター向けの自動運転AI
製造プロセス