野生動物の調査方法の一つとしてすっかり定着した、自動撮影カメラ。ただ、撮影画像を集計して作図したり、解析にかけるまでの処理が、画像が多いと面倒くさい。
これまで場当たり的に処理をしてきたが、できるだけRで最初から最後までやろうと思って調べたので、手順をまとめておく。Rでできるだけ一貫させるのは、再現性を高めるため。
画像ファイルからexif情報を抽出
任意のフォルダに画像ファイルを置く。フォルダ内にサブフォルダがあってもなくても構わない。そして、Rで以下のコードを走らせる。
## 作業ディレクトリの設定
setwd("画像ファイルを置いた最上位のフォルダ")
## 必要なパッケージの読み込み
library(exifr)
library(openxlsx) #必須ではない
## .jpgの拡張子を持つファイル名の取得(サブフォルダ含め)
files <- list.files(getwd(), recursive=TRUE, pattern="*.jpg")
## exif情報を取得(この場合はファイル名、ファイルの作成日時、変更日時)
res <- as.data.frame(read_exif(files, tags=c("filename", "createdate", "filemodifydate")))
## (必須ではないけど)フォルダ名を抽出
# どのぐらいサブフォルダがあるかは保存の仕方によって異なるので
# 以下では2層を想定
res$F1 <- sapply(strsplit(res$sourcefile, "\\/"), "[", 1)
res$F2 <- sapply(strsplit(res$sourcefile, "\\/"), "[", 2)
## xlsxファイルとして出力(csvでもいいけど)
write.xlsx(res, file="filename.xlsx")
撮影されている種の判別
画像を見ながら、撮影されている種を判別し、先ほどの出力したxlsxファイルに新たな列「species」に手入力。この際、さらに新たな列として「Male」、「Female」、「Unknown」を作り、性別毎に撮影個体数を記入しておく(こうしなければならない、と言うことはない)。
集計して解析へ
ここからは何をしたいかによってだいぶ変わるので、最低限しておくと便利なことだけ記述。
先ほどの方法でexif情報を抽出していると、ファイルの生成日時が1列にそのまま入力されているが、それだと不便なので年、月、日、年月という列を別に作る。
## 作業ディレクトリの設定
setwd("種名を記入したxlsxファイルがあるフォルダ")
## 必要なパッケージの読み込み
library(openxlsx)
## データの読み込み
d <- read.xlsx("filename.xlsx")
## 時刻データを列ごとに分割
d$time <- as.character(d$CreateDate)
d$Y <- sapply(strsplit(sapply(strsplit(d$time, "\\ "), "[", 1), "\\:"), "[", 1)
d$M <- sapply(strsplit(sapply(strsplit(d$time, "\\ "), "[", 1), "\\:"), "[", 2)
d$D <- sapply(strsplit(sapply(strsplit(d$time, "\\ "), "[", 1), "\\:"), "[", 3)
d$YM <- paste(d$Y, formatC(d$M, width=2, flag="0"), sep="_")
あとは年月なりカメラの設置サイトなり種なりで集計してお好みで。
おまけ
技術的には、深層学習で獣種判定も自動化できる。まだ研究例は限られるが、安藤ら(2019)は参考になる。