mapillary_tools を使ってアクションカムで撮った写真をMapillaryに投稿する

[Mapillary](http://www.mapillary.com/map) はストリートビューをクラウドソーシングで作るサービスです。通常はスマートフォンのアプリを使って撮影したものを共有するのですが、GPSロガーで取ったログとアクションカムやデジカメのタイムラプスモードで撮影した静止画を合わせてスクリプトで一括アップロードできます。
日本には美しい四季がありますので、皆さんの身近な場所や旅行先でたくさん撮って共有してください。Mapillaryのストリートビューは [OpenStreetMap](https://www.openstreetmap.org/) の編集にも使えますので自由な地図の充実にもつながります。

## タイムラプス撮影について
私はGoPro Hero3 Silver Editionを使っています。3,680×2,760ピクセルでインターバル1秒のタイムラプスで静止画を撮影しています。GoPro以外のカメラでもインターバル撮影ができるものなら同じ要領でできると思います。
mapillary_tools には動画から静止画を作る機能もありますので必ずしもタイムラプス撮影である必要はありません。ドライブレコーダの動画も（位置情報が取り出せれば）利用できるでしょう。ただし一般的に画質や解像度は動画より静止画の方が高いです。
いわゆる中華アクションカムの場合はタイムラプス撮影に制限があったり、ファイル形式がJPEGはでなかったりするようです。その場合は動画撮影がベストプラクティスと思われます。

## GPSログについて
GPSロガーはGPX形式のログが出力できるものであればどんなものでも良いと思います。私は GARMIN fenix を使っています。現在の mapillary_tools は NMEA 形式のログにも対応しているようです。

## 動作環境
MacOS High Sierra (Python 2.7.10)で動かしてます。Linuxでも動作します。Windowsでの環境構築は「[mapillary_tools を Windows で動かす](https://qiita.com/kudarisenmon/items/d0411ea4ce0ffebbb0ff)」にまとめました。

```
$ python --version
Python 2.7.10
```

## 環境構築
#### pip のアップデート
pip のバージョン10以上が要求されています。私の環境のパッケージは古かったので新しい pip をインストールしました。

```
$ pip --version
pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py
$ pip --version
pip 18.0 from /Library/Python/2.7/site-packages/pip (python 2.7)
```

#### 依存ライブラリをインストール
Mapillaryプロジェクトがフォークした Piexif をインストールします。ここで私の環境では「xcrun: error: invalid active developer path」のエラーが出ました。[この記事](https://qiita.com/tmf16/items/046cdcc5aaa36a3e76d7)を参考に対処しました。

```
$ sudo pip install git+https://github.com/mapillary/Piexif
```
#### ffmpeg のインストール
動画からアップロードできる機能を使用するために ffmpeg をインストールします。[Homebrew](https://brew.sh/) が必要です。動画サポートが必要ない場合はこのステップは省略可能です。

```
$ brew install ffmpeg
```

#### mapillary_tools のインストール

mapillary_tools 本体をインストールします。ここで私の環境では以下のエラーになりました。「--ignore-installed six」のオプションを指定することでインストールできました。

>  Found existing installation: six 1.4.1
Cannot uninstall 'six'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.


```
$ sudo pip install --upgrade git+https://github.com/mapillary/mapillary_tools --ignore-installed six
```

### 動作確認
以下のように表示されればインストール成功です。

```
$ mapillary_tools --version

Mapillary tools version : 0.5.0
```
### 認証
初回のみ認証が必要です。旧mapillary_toolsのようにWebサイトからハッシュを写す必要もありません。認証情報は $HOME/.config/mapillary/config ファイルに書き込まれます。

```
$ mapillary_tools authenticate --advanced
```

## 画像の加工
位置情報や撮影方向のついていない画像（タイムラプス静止画または動画）にGPSログから位置情報を付与してアップロードできるようにします。
あわせて信号待ち等で同じ場所でたくさん撮影されてしまった重複画像をアップロード対象外にします。「5m」と「40度」はスマートフォンのアプリのデフォルト値です。もっと適切な値があるかもしれません。

### タイムラプス静止画の場合
以下のオプションを指定します。この方法だとオリジナルの画像のEXIFに書き込みが行われファイルのタイムスタンプが変更になります。

```
$ mapillary_tools process --advanced --user_name kudarisenmon --geotag_source "gpx"  --local_time --interpolate_directions --duplicate_distance 5 --duplicate_angle 40 --move_duplicates --overwrite_EXIF_direction_tag --overwrite_EXIF_gps_tag --geotag_source_path 2019-04-20.gpx --import_path /media/DCIM 
```

| オプション     | 指定内容 |
|:-----------------|:------------------|
| process | 画像を加工する|
| --advanced|高度なオプションを指定する |
| --user_name|Mapillaryのユーザ名 |
| --geotag_source|GPSログのファイル形式|
| --local_time| 撮影時刻が日本時間で記録されている|
| --interpolate_directions|撮影方向を書き込む |
| --duplicate_distance| 重複と判断する距離(m)|
| --duplicate_angle| 重複と判断する角度|
| --move_duplicates| 重複と判断された写真を duplicates フォルダに移動|
| --overwrite_EXIF_direction_tag|撮影方向のExifを上書き|
| --overwrite_EXIF_gps_tag|撮影地点ののExifを上書き|
| --geotag_source_path| GPSログファイル|
| --import_path|加工対象静止画のフォルダ|

### 動画の場合
以下のオプションを指定します。静止画と違って元の動画ファイルには書き込みは行われません。撮影に使用したデバイスのメーカー名、モデル名は任意で省略可能です。

```
$ mapillary_tools video_process --advanced --user_name kudarisenmon --geotag_source "gpx" --interpolate_directions --duplicate_distance 5 --duplicate_angle 40 --video_sample_interval 1 --overwrite_all_EXIF_tags --move_duplicates --device_make "RICOH" --device_model "RICOH THETA S" -- R0010282_er.MP4 --geotag_source_path 2019-05-03_162711.gpx
```
| オプション     | 指定内容 |
|:-----------------|:------------------|
| video_process | 動画を加工する|
| --advanced|高度なオプションを指定する |
| --user_name|Mapillaryのユーザ名 |
| --geotag_source|GPSログのファイル形式|
| --interpolate_directions|撮影方向を書き込む |
| --duplicate_distance| 重複と判断する距離(m)|
| --duplicate_angle| 重複と判断する角度|
| --overwrite_all_EXIF_tags|Exifを上書きする|
| --move_duplicates| 重複と判断された写真を duplicates フォルダに移動|
| --device_make| 撮影デバイスのメーカー名（任意）|
| --device_model| 撮影デバイスのモデル名(任意)|
| --video_import_path|動画ファイル|
| --geotag_source_path| GPSログファイル|

## アップロード
加工したファイルをアップロードします。重複と判断された画像はここでスキップされます。
4スレッドで送信されますが気長に待ちましょう。:-)

```
$ mapillary_tools upload --import_path /media/DCIM
```

## 情報源
[README.md](https://github.com/mapillary/mapillary_tools/blob/master/README.md)