Drone画像
撮影画像のexif情報の高度は「GPS Altitude」は、GPSで測位した標高楕円体高で精度はあまり良くない。
「Relative Altitude」は、気圧センサーによる対地高度で、精度は「GPS Altitude」よりも良さげで、こっちを使ったほうが良い
exiftoolを使ってバッチ処理で一気にディレクトリ上のGPS AltitudeをRelative Altitudeに変換する。
(https://tmizu23.hatenablog.com/entry/20160330/1459307760)。
コマンドプロンプトを利用する。下記は自分用のメモ。
1. 画像があるフォルダに移動
・別のドライブにあるディレクトリへ変更する
C:\Users\00007795>I:
・目的のディレクトリに移動はcd
example
cd \Pix4D\20241217犬吠埼\100m_extract
2. 高度の確認
exiftool.exe DJI_0001.JPG
3. GPS AltitudeをRelative Altitudeに変更
以下のコマンドを打って、imagesフォルダに入っているJPGファイルのGPS Altitudeの値を Relative Altitudeの値に変更します。なお、gpsaltituderefの値は0だと標高値がプラス、1だと標高値がマイナスを表すので、微妙な場所を飛行させた場合は、個別に考えてください。
for %i in (*.JPG) do exiftool %i -s -s -s -RelativeAltitude | exiftool -overwrite_original %i "-GPSAltitude<=-" -gpsaltituderef#=0
4. GPS Altitude(Relative Altitudeの値が入っている)にオフセットを加える
*Relative Altitudeの値は対地高度なので、それを標高値に変換するために、飛ばし始めの標高値を加えます。
ここでは、例として10mを加えています。
for %i in (*.JPG) do exiftool %i -overwrite_original -GPSAltitude+=7
Python tips(備忘録)
Condaかpipどちらのサービスからライブラリを入れるか
ライブラリは基本的にcondaでインストール
conda の場合、互換性をチェックし、結果を教えてくれる、condaが環境を壊さないよう注意してくれる
Anaconda Prompt
Drive を変えるときはまず Drive名(ex. D:, I:)を入れる
Directory の変更 cd ....
cd I:\Python
labelme を使ったanottationのVOC変換
・利用したシステム
Windows 10 pro 64 bit
プロセッサ:Intel® Core(TM) i7-8700 CPU@3.70GHz
実装メモリ(RAM):16.0 GB
conda version 4.9.2
python version 3.8.3
水中ドローンで撮影した動画から静止画を数秒おきに取り出す(間隔は調査の目的により任意に設定)
静止画取り出しのpythonコード(video_capture.py)を下記に記載。
labelme を使ったanottationのVOC変換
参考URL(https://qiita.com/mucchyo/items/d21993abee5e6e44efad)
Git Bash (https://gitforwindows.org/)で下記コード打ち込んで、labelmeのソースを入手
git clone https://github.com/wkentaro/labelme
conda上でlablemeをインストール(lablemeインストールの方法が載っているウェブサイトなどを参照:https://qiita.com/okubo999/items/a862dcbfe7b4812192b4)
labelmeを使うと、判別したい藻場部分を囲んでアノテーションデータ(教師データを作成できる)。
labelme\examples\semantic_segmentation\labelme2voc.py
を使ってアノテーション済データセット(jsonファイル)をPascalVOC形式(アノテーションされたpngファイル)に変換
以下をanaconda Prompt上で実行(labelmeは最新版を使わないとLabelFileが使えないとエラー出た)。
Directoryは変換用のファイルがあるところに移動する。
python labelme2voc.py ".\labelme_annotation\0603ManaLine-17" ".\VOC\0603ManaLine-17" --labels labels.txt
上記の意味
labelme2voc.py [input_dir] [output_dir] --labels [labels]
labels.txtはファイルごとのkasso, koso, ryokusyoなどlabel名ごとに設定する。
(kassoをKassoなどにすると設定できない)
input_dir: labelmeでアノテーションした画像とjsonセットのディレクトリへのパス
output_dir: 出力ディレクトリへのパス
labels: ラベル情報テキストへのパス
Unetを使った深層学習による判別
.\VOCの下に、深層学習用の該当フォルダを作ってその中にtrainのフォルダとtestのフォルダを作る。
trainフォルダにはimagesフォルダを作ってその中にtrain用のjpgファイルを入れ、もう一つseg_imagesフォルダを作って、その中にVOC変換で作成したSegmentationClassPNGフォルダ内のpngファイルを入れる。
testフォルダにはimagesフォルダを作ってその中に検証させたいjpeg画像を入れて、深層学習の結果を試す。
・anaconda prompt
python semaseg_UNetLike_pytorch_ROV.py
で実行。
セグメンテーション結果が一つ一つ出てくる。一つ保存して×で消しての繰り返し。
うまいプログラムの消し方ないかな。
・spyder
semaseg_UNetLike_pytorch_ROV.pyの該当ラインを実行する。
spyderのプロットペインで元画像とsegmentationの判別結果の画像が出てくるので、pngファイルとして適宜保存する。
プロットペイン内ですべての画像を一括して保存できるが、名前が保存した時間になってしまう。
・エラーが出た時の対応
RuntimeError: CUDA out of memory. Tried to allocate 16.00 MiB (GPU 0; 3.00 GiB total capacity; 1.94 GiB already allocated; 11.86 MiB free; 1.97 GiB reserved in total by PyTorch)
→バッチサイズを小さくして対応する
mb=16 to mb=8
判別結果からの被度の算出
・ファイル名の一括修正
深層学習のsegmentation結果のpngファイルを一括保存すると、元ファイルの名前から変わってしまう。
うまくsegmentatio結果に元ファイル名をつけれるようにするには以下の手順を踏む。
ファイル名をエクスプローラーのshift+右クリック→パスのコピーで一括コピーする。
同様に変更先のファイル名もこの方法で一括コピーする。エクセルなどにコマンドプロンプトの名前変更コマンドのren *元ファイル名* 変更ファイル名 を列に並べる。
これは元ファイル名の中に半角スペースがあって、そのままだとコマンドプロンプトでコマンドを読めないので、*で囲んでメモ帳上で"に変更する。
エクセルでは"(ダブルクオーテーション)は使えないので、代わりに*を使っている。
ren *元ファイル名* 変更ファイル名 をテキスト上にコピーし、*を"に、列間のタブを半角スペースに置換する。
それをコマンドプロンプトにコピーして名前を変更する。
・segmentation部分のクリップ(抜き出し)
判別結果は元画像とsegmentationの判別結果の画像が結合されているものだから、そこからsegmentation部分だけを抜き出す。
image_crop_rm_xyaxis 0.7.py
・被度の計算
coverage_cal_成功0302.pyをBGRで褐藻(0,0,128)、紅藻(0,128,0)、緑藻(0.128,128)のセグメンテーションの色ごとに被度を計算。