darknet_rosにおける物体認識のfps値を向上させよう！

# 本記事の目的
前回Jetson nanoを用いて物体検出を行いましたが、その際のfps値が8~10程度だったので今回はとにかくfps値を上げる方法について模索します。

https://qiita.com/MMM-lab/items/04431add6210c80d3462

## パフォーマンスの最大化
　以下コマンドでパフォーマンスモードを変更できます。-mの後の数字が0のときが最大(Maxモード）で1が最小（5Wモード）です。

```bash
$ sudo nvpmodel -m 0
$ sudo jetson_clocks
```

https://qiita.com/karaage0703/items/b14c249aa33112669ee4

## 画像サイズの変更
darknet_ros.launchを見てみましょう。

```xml
<?xml version="1.0" encoding="utf-8"?>

<launch>
  <!-- Console launch prefix -->
  <arg name="launch_prefix" default=""/>
  <arg name="image" default="/camera/rgb/image_raw" />

  <!-- Config and weights folder. -->
  <arg name="yolo_weights_path"          default="$(find darknet_ros)/yolo_network_config/weights"/>
  <arg name="yolo_config_path"           default="$(find darknet_ros)/yolo_network_config/cfg"/>

  <!-- ROS and network parameter files -->
  <arg name="ros_param_file"             default="$(find darknet_ros)/config/ros.yaml"/>
  <arg name="network_param_file"         default="$(find darknet_ros)/config/yolov2-tiny.yaml"/>

  <!-- Load parameters -->
  <rosparam command="load" ns="darknet_ros" file="$(arg ros_param_file)"/>
  <rosparam command="load" ns="darknet_ros" file="$(arg network_param_file)"/>

  <!-- Start darknet and ros wrapper -->
  <node pkg="darknet_ros" type="darknet_ros" name="darknet_ros" output="screen" launch-prefix="$(arg launch_prefix)">
    <param name="weights_path"          value="$(arg yolo_weights_path)" />
    <param name="config_path"           value="$(arg yolo_config_path)" />
    <remap from="camera/rgb/image_raw"  to="$(arg image)" />
  </node>

 <!--<node name="republish" type="republish" pkg="image_transport" output="screen" 	args="compressed in:=/front_camera/image_raw raw out:=/camera/image_raw" /> -->
</launch>
```
この内、yolov2-tiny.yamlのyolov2-tiny.cfgで画像サイズを調整することが出来ます。 
デフォルトでは以下のような値になっていました。

![68747470733a2f2f757365722d696d616765732e67697468756275736572636f6e74656e742e636f6d2f35323330373433322f3131383530303435382d63326565333038302d623736322d313165622d393536342d3964393062353](https://user-images.githubusercontent.com/52307432/118502609-d0a4b580-b764-11eb-867d-e15d364747e4.png)


この際、fps値は8~10程度でした。
そこで以下のサイトを参考にwidthとheigthを288まで下げました。

https://forums.developer.nvidia.com/t/yolov3-on-agx-xavier-how-to-increase-fps/109141

```
width  = 288
height = 288
```

結果としてfps値は12~18程度と向上しましたが、認識精度が劣化しました。

![68747470733a2f2f757365722d696d616765732e67697468756275736572636f6e74656e742e636f6d2f35323330373433322f3131383530313736342d30373265303038302d623736342d313165622d393830632d6436616131623064343836322e706e67](https://user-images.githubusercontent.com/52307432/118503492-a3a4d280-b765-11eb-8f9a-336d26783ac1.png)

次に144まで下げてみました。

```
width  = 144
height = 144
```

結果としてfps値は25~35程度まで向上しましたが、認識する対象物の数が減少しました。

![68747470733a2f2f757365722d696d616765732e67697468756275736572636f6e74656e742e636f6d2f35323330373433322f3131363537353038372d34616631636630302d613934392d313165622d396134332d6263636130346463376439622e706e67](https://user-images.githubusercontent.com/52307432/118503632-c46d2800-b765-11eb-9452-bc98e7ad6c62.png)


最後に32まで引き下げてみました。

```
width  = 32
height = 32
```

結果としてfps値は30~40程度まで向上しましたが、捉える画像サイズが小さすぎて何も検出しなくなりました・・・（笑）

## 認識精度の高いネットワークの利用

YOLOには認識精度の高い通常モデルと、認識精度が若干劣る代わりに高速に動作するtinyモデルがあります。以下の記事によると通常モデルのYOLOの認識精度は55.3、tinyモデルの認識精度は33.1で、演算量はそれぞれ、65.86 Bn、5.56 Bnになるそうです。そこで通常のyolov3をwidth=288,heigth=288の画像サイズで試しました。

https://medium.com/axinc/yolov3-66c9b998c096

```xml
<arg name="network_param_file"         default="$(find darknet_ros)/config/yolov3.yaml"/>
```

結果として認識精度は向上しましたが、fps値が2.5程度まで低下しました。

# まとめ
- fps値を向上させる方法について調査しました
- ネットワークが単純なtinyモデルを使用すればある程度fps値を上げて認識する事が出来ましたが、精度はかなり低く出ました
- ネットワークが複雑な通常のモデルを使用したことで認識精度は向上しましたが、fps値がかなり低下しました

# 参考文献

https://developer.nvidia.com/embedded/jetson-benchmarks

https://github.com/NVIDIA-AI-IOT/jetson_benchmarks

https://forums.developer.nvidia.com/t/yolov3-on-agx-xavier-how-to-increase-fps/109141

https://github.com/pjreddie/darknet/issues/80

https://developer.nvidia.com/embedded/jetson-nano-dl-inference-benchmarks