Merge pull request #246 from mcguirepr89/Nachtzuster_improvements_to_birdnet_analysis
Nachtzuster improvements to birdnet analysis
This commit is contained in:
+47
-198
@@ -91,32 +91,16 @@ run_analysis() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
for i in "${files[@]}";do
|
for i in "${files[@]}";do
|
||||||
|
[ ! -f ${1}/${i} ] && continue
|
||||||
echo "${1}/${i}" > $HOME/BirdNET-Pi/analyzing_now.txt
|
echo "${1}/${i}" > $HOME/BirdNET-Pi/analyzing_now.txt
|
||||||
[ -z ${RECORDING_LENGTH} ] && RECORDING_LENGTH=15
|
[ -z ${RECORDING_LENGTH} ] && RECORDING_LENGTH=15
|
||||||
[ ${RECORDING_LENGTH} == "60" ] && RECORDING_LENGTH=01:00
|
|
||||||
FILE_LENGTH="$(ffmpeg -i ${1}/${i} 2>&1 | awk -F. '/Duration/ {print $1}' | cut -d':' -f3-4)"
|
|
||||||
[ -z $FILE_LENGTH ] && sleep 1 && continue
|
|
||||||
echo "RECORDING_LENGTH set to ${RECORDING_LENGTH}"
|
echo "RECORDING_LENGTH set to ${RECORDING_LENGTH}"
|
||||||
a=0
|
a=0
|
||||||
if [ "${RECORDING_LENGTH}" == "01:00" ];then
|
until [ -z "$(lsof -t ${1}/${i})" ];do
|
||||||
until [ "$(ffmpeg -i ${1}/${i} 2>&1 | awk -F. '/Duration/ {print $1}' | cut -d':' -f3-4)" == "${RECORDING_LENGTH}" ];do
|
sleep 2
|
||||||
sleep 1
|
[ $a -ge ${RECORDING_LENGTH} ] && rm -f ${1}/${i} && break
|
||||||
[ $a -ge 60 ] && rm -f ${1}/${i} && break
|
a=$((a+2))
|
||||||
a=$((a+1))
|
done
|
||||||
done
|
|
||||||
elif [ "${RECORDING_LENGTH}" -lt 10 ];then
|
|
||||||
until [ "$(ffmpeg -i ${1}/${i} 2>&1 | awk -F. '/Duration/ {print $1}' | cut -d':' -f3-4)" == "00:0${RECORDING_LENGTH}" ];do
|
|
||||||
sleep 1
|
|
||||||
[ $a -ge ${RECORDING_LENGTH} ] && rm -f ${1}/${i} && break
|
|
||||||
a=$((a+1))
|
|
||||||
done
|
|
||||||
else
|
|
||||||
until [ "$(ffmpeg -i ${1}/${i} 2>&1 | awk -F. '/Duration/ {print $1}' | cut -d':' -f3-4)" == "00:${RECORDING_LENGTH}" ];do
|
|
||||||
sleep 1
|
|
||||||
[ $a -ge ${RECORDING_LENGTH} ] && rm -f ${1}/${i} && break
|
|
||||||
a=$((a+1))
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! grep 5050 <(netstat -tulpn 2>&1) &> /dev/null 2>&1;then
|
if ! grep 5050 <(netstat -tulpn 2>&1) &> /dev/null 2>&1;then
|
||||||
echo "Waiting for socket"
|
echo "Waiting for socket"
|
||||||
@@ -124,183 +108,48 @@ run_analysis() {
|
|||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
if [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then
|
# prepare optional parameters for analyse.py
|
||||||
echo "analyze.py \
|
if [ -f ${INCLUDE_LIST} ]; then
|
||||||
--i "${1}/${i}" \
|
INCLUDEPARAM="--include_list \"${INCLUDE_LIST}\""
|
||||||
--o "${1}/${i}.csv" \
|
else
|
||||||
--lat "${LATITUDE}" \
|
INCLUDEPARAM=""
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}""
|
|
||||||
analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}"
|
|
||||||
elif [ -f ${1}/${i} ] && [ -f ${INCLUDELIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then
|
|
||||||
echo "analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--include_list "${INCLUDE_LIST}""
|
|
||||||
analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--include_list "${INCLUDE_LIST}"
|
|
||||||
elif [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then
|
|
||||||
echo "analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--exclude_list "${EXCLUDE_LIST}""
|
|
||||||
analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--exclude_list "${EXCLUDE_LIST}"
|
|
||||||
elif [ -f ${1}/${i} ] && [ -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ -z $BIRDWEATHER_ID ];then
|
|
||||||
echo "analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--include_list "${INCLUDE_LIST}" \
|
|
||||||
--exclude_list "${EXCLUDE_LIST}""
|
|
||||||
analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--include_list "${INCLUDE_LIST}" \
|
|
||||||
--exclude_list "${EXCLUDE_LIST}"
|
|
||||||
elif [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then
|
|
||||||
echo "analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--birdweather_id "IN_USE""
|
|
||||||
analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--birdweather_id "${BIRDWEATHER_ID}"
|
|
||||||
elif [ -f ${1}/${i} ] && [ -f ${INCLUDE_LIST} ] && [ ! -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then
|
|
||||||
echo "analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--include_list "${INCLUDE_LIST}" \
|
|
||||||
--birdweather_id "IN_USE""
|
|
||||||
analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--include_list "${INCLUDE_LIST}" \
|
|
||||||
--birdweather_id "${BIRDWEATHER_ID}"
|
|
||||||
elif [ -f ${1}/${i} ] && [ ! -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then
|
|
||||||
echo "analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--exclude_list "${EXCLUDE_LIST}" \
|
|
||||||
--birdweather_id "IN_USE""
|
|
||||||
analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--exclude_list "${EXCLUDE_LIST}" \
|
|
||||||
--birdweather_id "${BIRDWEATHER_ID}"
|
|
||||||
elif [ -f ${1}/${i} ] && [ -f ${INCLUDE_LIST} ] && [ -f ${EXCLUDE_LIST} ] && [ ! -z $BIRDWEATHER_ID ];then
|
|
||||||
echo "analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--include_list "${INCLUDE_LIST}" \
|
|
||||||
--exclude_list "${EXCLUDE_LIST}" \
|
|
||||||
--birdweather_id "IN_USE""
|
|
||||||
analyze.py \
|
|
||||||
--i "${1}/${i}" \
|
|
||||||
--o "${1}/${i}.csv" \
|
|
||||||
--lat "${LATITUDE}" \
|
|
||||||
--lon "${LONGITUDE}" \
|
|
||||||
--week "${WEEK}" \
|
|
||||||
--overlap "${OVERLAP}" \
|
|
||||||
--sensitivity "${SENSITIVITY}" \
|
|
||||||
--min_conf "${CONFIDENCE}" \
|
|
||||||
--include_list "${INCLUDE_LIST}" \
|
|
||||||
--exclude_list "${EXCLUDE_LIST}" \
|
|
||||||
--birdweather_id "${BIRDWEATHER_ID}"
|
|
||||||
fi
|
fi
|
||||||
|
if [ -f ${EXCLUDE_LIST} ]; then
|
||||||
|
EXCLUDEPARAM="--include_list \"${EXCLUDE_LIST}\""
|
||||||
|
else
|
||||||
|
EXCLUDEPARAM=""
|
||||||
|
fi
|
||||||
|
if [ ! -z $BIRDWEATHER_ID ]; then
|
||||||
|
BIRDWEATHER_ID_PARAM="--birdweather_id \"${BIRDWEATHER_ID}\""
|
||||||
|
BIRDWEATHER_ID_LOG="--birdweather_id \"IN_USE\""
|
||||||
|
else
|
||||||
|
BIRDWEATHER_ID_PARAM=""
|
||||||
|
BIRDWEATHER_ID_LOG=""
|
||||||
|
fi
|
||||||
|
echo analyze.py \
|
||||||
|
--i "${1}/${i}" \
|
||||||
|
--o "${1}/${i}.csv" \
|
||||||
|
--lat "${LATITUDE}" \
|
||||||
|
--lon "${LONGITUDE}" \
|
||||||
|
--week "${WEEK}" \
|
||||||
|
--overlap "${OVERLAP}" \
|
||||||
|
--sensitivity "${SENSITIVITY}" \
|
||||||
|
--min_conf "${CONFIDENCE}" \
|
||||||
|
${INCLUDEPARAM} \
|
||||||
|
${EXCLUDEPARAM} \
|
||||||
|
${BIRDWEATHER_ID_LOG}
|
||||||
|
analyze.py \
|
||||||
|
--i "${1}/${i}" \
|
||||||
|
--o "${1}/${i}.csv" \
|
||||||
|
--lat "${LATITUDE}" \
|
||||||
|
--lon "${LONGITUDE}" \
|
||||||
|
--week "${WEEK}" \
|
||||||
|
--overlap "${OVERLAP}" \
|
||||||
|
--sensitivity "${SENSITIVITY}" \
|
||||||
|
--min_conf "${CONFIDENCE}" \
|
||||||
|
${INCLUDEPARAM} \
|
||||||
|
${EXCLUDEPARAM} \
|
||||||
|
${BIRDWEATHER_ID_PARAM}
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ install_depends() {
|
|||||||
apt install -qqy caddy ftpd sqlite3 php-sqlite3 alsa-utils \
|
apt install -qqy caddy ftpd sqlite3 php-sqlite3 alsa-utils \
|
||||||
pulseaudio avahi-utils sox libsox-fmt-mp3 php php-fpm php-curl php-xml \
|
pulseaudio avahi-utils sox libsox-fmt-mp3 php php-fpm php-curl php-xml \
|
||||||
php-zip icecast2 swig ffmpeg wget unzip curl cmake make bc libjpeg-dev \
|
php-zip icecast2 swig ffmpeg wget unzip curl cmake make bc libjpeg-dev \
|
||||||
zlib1g-dev python3-dev python3-pip python3-venv
|
zlib1g-dev python3-dev python3-pip python3-venv lsof
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Executable
+31
@@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
OLDIFS=$IFS
|
||||||
|
IFS=\|
|
||||||
|
most_recent_results=($(sqlite3 ~/BirdNET-Pi/scripts/birds.db \
|
||||||
|
'SELECT Com_Name, Time, Date FROM detections
|
||||||
|
ORDER BY Date DESC, Time DESC
|
||||||
|
LIMIT 1'))
|
||||||
|
today=$(date +%F)
|
||||||
|
yesterday=$(date --date="yesterday" +%F)
|
||||||
|
two_days_ago=$(date --date="2 days ago" +%F)
|
||||||
|
|
||||||
|
echo -n The most recent detection was
|
||||||
|
|
||||||
|
if [[ "${most_recent_results[0]}" =~ ^[AEIOU].* ]];then
|
||||||
|
echo -n " an ${most_recent_results[0]} at "
|
||||||
|
else
|
||||||
|
echo -n " a ${most_recent_results[0]} at "
|
||||||
|
fi
|
||||||
|
most_recent_results[1]=$(date --date="${most_recent_results[1]}" +%l:%M%p)
|
||||||
|
echo -n ${most_recent_results[1]}
|
||||||
|
if [[ ${most_recent_results[2]} == $today ]];then
|
||||||
|
echo " today."
|
||||||
|
elif [[ ${most_recent_results[2]} == $yesterday ]];then
|
||||||
|
echo " yesterday."
|
||||||
|
elif [[ ${most_recent_results[2]} == $two_days_ago ]];then
|
||||||
|
echo " two days ago."
|
||||||
|
else
|
||||||
|
echo " on ${most_recent_results[2]}."
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFS=$OLDIFS
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Update BirdNET-Pi
|
# Update BirdNET-Pi's Git Repo
|
||||||
source /etc/birdnet/birdnet.conf
|
source /etc/birdnet/birdnet.conf
|
||||||
trap 'exit 1' SIGINT SIGHUP
|
trap 'exit 1' SIGINT SIGHUP
|
||||||
USER=$(awk -F: '/1000/ {print $1}' /etc/passwd)
|
USER=$(awk -F: '/1000/ {print $1}' /etc/passwd)
|
||||||
@@ -11,13 +11,7 @@ sudo -u${USER} git -C $my_dir pull -f
|
|||||||
sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
sudo -u${USER} git -C $my_dir stash pop
|
sudo -u${USER} git -C $my_dir stash pop
|
||||||
sudo ln -sf $my_dir/* /usr/local/bin/
|
sudo ln -sf $my_dir/* /usr/local/bin/
|
||||||
if ! grep python3 <(head -n1 $my_dir/analyze.py);then
|
|
||||||
echo "Ensure all python scripts use the virtual environment"
|
# The script below handles changes to the host system
|
||||||
sed -si "1 i\\#\!$HOME/BirdNET-Pi/birdnet/bin/python3" $my_dir/*.py
|
# Any additions to the updater should be placed in that file.
|
||||||
fi
|
sudo $my_dir/update_birdnet_snippets.sh
|
||||||
if ! grep PRIVACY_MODE /etc/birdnet/birdnet.conf;then
|
|
||||||
sudo -u${USER} echo "PRIVACY_MODE=off" >> /etc/birdnet/birdnet.conf
|
|
||||||
fi
|
|
||||||
if ! grep RTSP_STREAM /etc/birdnet/birdnet.conf;then
|
|
||||||
sudo -u${USER} echo "RTSP_STREAM=" >> /etc/birdnet/birdnet.conf
|
|
||||||
fi
|
|
||||||
Executable
+17
@@ -0,0 +1,17 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Update BirdNET-Pi
|
||||||
|
source /etc/birdnet/birdnet.conf
|
||||||
|
trap 'exit 1' SIGINT SIGHUP
|
||||||
|
USER=$(awk -F: '/1000/ {print $1}' /etc/passwd)
|
||||||
|
HOME=$(awk -F: '/1000/ {print $6}' /etc/passwd)
|
||||||
|
my_dir=$HOME/BirdNET-Pi/scripts
|
||||||
|
if ! grep python3 <(head -n1 $my_dir/analyze.py) &>/dev/null;then
|
||||||
|
echo "Ensure all python scripts use the virtual environment"
|
||||||
|
sudo -u$USER sed -si "1 i\\#\!$HOME/BirdNET-Pi/birdnet/bin/python3" $my_dir/*.py
|
||||||
|
fi
|
||||||
|
if ! grep PRIVACY_MODE /etc/birdnet/birdnet.conf &>/dev/null;then
|
||||||
|
sudo -u$USER echo "PRIVACY_MODE=off" >> /etc/birdnet/birdnet.conf
|
||||||
|
fi
|
||||||
|
if ! which lsof &>/dev/null;then
|
||||||
|
sudo apt update && sudo apt -y install lsof
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user