# Raspi4にyolov5、filebeat、VPNを実装する ###### tags: `トラサポ関連` 今回は、トラサポで用いるraspi4に上記のものを実装していく。 ## 1:OSを入れる 今回用いたOSは、ubuntu desktop 22.04 LTSである。 インストールにはRaspberry Pi imagerを用いるとよい。 ## 2:インストーラの準備 これから様々なものをインストールする必要があるため、raspiでapt、pip、gitの準備を行う。まずは、aptのアップデート、アップグレードを行う。 ``` sudo apt update sudo apt upgrade ``` 次に、pipのインストール、アップデートを行う必要がある。 ``` sudo apt install python3-pip python3 -m pip install --upgrade pip setuptools ``` 最後に、その他の必要なものをインストールする。 ``` sudo apt install git sudo apt install curl ``` ## 3:sshの準備 sshを行うために、下記のコマンドでsshをraspiにインストールする。その後、sshを有効化する。 ``` sudo apt install openssh-server sudo systemctl disable ssh --now sudo systemctl status ssh (確認用) ``` ## 4:yolov5の準備 raspiで、yolov5のインストールをするためgitからクローンしてくる。 ``` git clone https://github.com/ultralytics/yolov5 ``` クローンできたらyolov5のディレクトリに移動し、requirements.txtがあることを確認する。その後requirements.txtを用いて必要なライブラリをインストールする。 ``` pip install -r requirements.txt ``` 無事にすべてのパッケージのインストールが完了したら、yolov5が正常に動作するか確認する必要がある。この際、現在の段階ではsshから実行すると動かせないため注意する。実行する際には、下記のコマンドを実行する。 sshで実行するには項目5,7を行う必要である。 ``` python3 detect.py --source 0 ``` yolov5が動いたら、次は実行結果をlogファイルに書き出す必要があるためdetect.pyを編集する必要がある。下に示す画像の、選択している部分を追加する必要がある。場所は、#print resultsと#write resultsの間である。画像の下に、追加したコードを記す。 ![](https://i.imgur.com/NnKpR1Y.png) ```(python) # Print time (inference-only) LOGGER.info(f'{s}Done. ({t3 - t2:.3f}s)') f = open("trasapo.log", "a") f.write(f'{n}\n') f.close() ``` ### 余談 windowsでyolov5の環境を整えようとすると、 ``` pip install -r requirements.txt ``` でなぜかエラーが起きる これはwindows側がデフォルトでUTF-8に対応していないから生じてしまうエラーらしい 設定から有効にするとうまくインストールできたのでメモしておく ## 5:VPNの準備 raspiは学内のeduraum内で実行させるため、固定IPアドレスを指定することができない。そこでtalescaleを用いて、VPNを設定する。 まず、raspiでtailscaleをインストールしていく。そのため、下記に記した命令を実行していく。 ``` curl -fsSL https://tailscale.com/install.sh | sh curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list sudo apt install tailscale ``` インストールができたら下記の命令を実行し、ブラウザからログインする。今回は、nutfesのアカウントでログインした。これで、仮想的にnutfesサーバのローカル上にraspiを設置することができる。 ``` sudo tailscale up ``` 操作するPC側でもtalescaleをインストールし、インジケーターに現れれば完了である。 ## 6:filebeatの準備 まずfilebeatをインストールするために、raspiで下記の命令を実行する。 ``` wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - sudo apt-get install apt-transport-https echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list sudo apt-get install filebeat ``` インストールできたら、filebeatを有効化する ``` sudo systemctl enable filebeat ``` ここまで用意できたら、次はfilebeatの設定を書き込んでいく。設定ファイルは、/etc/filebeatのfilebeat.ymlに記述されている。 まず、filebeat.ymlの権限を変更するために、root下で以下を実行する。 ``` sudo chown -R root ./ ``` 権限の変更ができたら、filebeat.yml内を編集していく。 filebeat.yml内で重要なのは、Filebeat inputsとLogstash Outputの項目である。そのため、まずそれ以外をコメントアウトする。 そして、Filebeat inputsのpathsの部分に、yolov5が出力するlogファイルのパスを指定する。 次に、Logstash Outputのhost部分を、tracking-supportのVPNである` hosts: ["100.65.173.38:5044"]`に変更する。 最終的に必要なのは、以下に示す部分のみである。以下は編集後である。 ``` paths: - /home/nutmeg02/yolov5/*.log output.logstash: hosts: ["100.65.173.38:5044"] ``` 編集が終わったら、filebeatが動作するか確認する必要がある。下記のコマンドで、filebeatを実行する。このときに、送信できていれば成功である。 ``` filebeat -e -c filebeat.yml ``` 実行できない場合の対処は、項目8で述べているため確認すること ## 7:遠隔からraspiを動作させる準備 前述した通りで、raspiの準備はほとんど終了している。 しかし、ただterminalからraspiにsshしただけではyolov5を動かすことはできない。そのため、いろいろと準備する必要はある。 まずraspi側の準備だが、sshd_configを編集する必要がある。 /etc/ssh/内のsshd_configの該当部分を下記のようにYESに変更する必要がある。 ``` X11Forwarding **yes ``` 次からは、操作するPC側での準備になる。 まず、[VcXsrv(ダウンロード後はXlaunch)](https://sourceforge.net/projects/vcxsrv/)をインストールする。 次に、sshの設定を書き込んでいく。 自分が使うcmdプロンプトを開き、.sshに移動する。 .sshでconfigというファイルを作製し、以下のように書き込んだ。 ``` Host nutmeg1 HostName talescaleで得たVPN User ユーザー名 ForwardAgent yes ForwardX11 yes ForwardX11Trusted yes ForwardX11Timeout 596h ``` 実際に接続する際には、まずxlaunch開き何もいじらず進み続けて完了を押す。 これは、パソコンを一度シャットダウンした場合毎回行う必要がある。 次に、sshで接続する。接続する際には、上記のHostに設定した名前を用いる。今回であれば、`ssh nutmeg1`と入力する必要がある。 ### 動作方法 実際に動作させる場合の手順を以下に示す。 1:xlaunchの起動(windows側) 2:sshで接続する。sshで接続する際の名前は、以下を参考にすること Froom⇒nutmeg1,gym⇒nutmeg2,egg⇒nutmeg3 ``` ssh nutmeg1~3 ``` 3:tmuxの起動(tmux) 4:tmux内でyolov5のディレクトリに移動し、detect.py(eggにあるraspiはdetect3.py)を、以下のように引数をつけ実行する。 ``` python3 detect.py --source 0 --classes 0 ``` 5:実行が確認できたらプリフィックスキー(ctrl+b)を押したのちにdでtmuxから抜ける。 6:違うtmuxのタブを作り、filebeatを以下の命令で実行させる。 ``` sudo filebeat -e -c filebeat.yml ``` 7:tmuxに戻りたいときは、`tmux a -t タブの名前`と入力する。 タブの名前は、`tmux ls`で確認できる。 ## 8:その他困った点 #### 画面がつかない OSを焼いた後、なぜかraapiの画面が出力されず、HDMIはno signalを示す。 結果としては、以下をbootディレクトリのconfig.txtに書き込んだら画面は表示されるようになった。 原因はよくわからなかったが、ubuntu22.04ではたまにある症状らしい。 下記の内容で、強制的にHDMIの入力を確認するようにしているらしい。 hdmi_groupは、テレビの場合は1を、PCモニターの場合は2を選択すると良いらしい。 調べてもこの辺りはよくわからなかったので偉い人に教えてほしい。 ``` hdmi_force_hotplug=1 hdmi_group=2 disable_overscan=1 ``` #### wslのubuntuからssh接続できない windows terminalからならつながるのだが、なぜがwslのubuntuからは接続ができなかった。具体的に解決することはできなかったが、VPN設定後の、VPNで接続することはできた。確信はないが、ネットワークが原因だったと考えている。 #### カメラがつながらない raspiを起動してsshはつながったのに、カメラはつながらない現象がおきた。 原因は、ユーザーがvideoグループに所属していなかったからである。これを解決するために、 ```shell sudo usermod -aG video nutmeg ``` を実行することでユーザーをカメラグループに属させることで解決した。 #### hostnameを変えたい elasticで見やすくするために、hostnameを場所の名前に変更したい。 下記のコマンドで変更することができる。 ``` hostnamectl set-hostname 変更後の名前 ``` #### filebeatが動作しない filebeatが動作しない場合、systemctlでの動作を止める必要があるため、下記の命令を実行する。 ``` systemctl stop filebeat.service ```