Merge branch 'main' into python-lint
This commit is contained in:
+63
-23
@@ -1,17 +1,20 @@
|
||||
from pathlib import Path
|
||||
from tzlocal import get_localzone
|
||||
import datetime
|
||||
import sqlite3
|
||||
import requests
|
||||
import json
|
||||
import time
|
||||
import math
|
||||
import numpy as np
|
||||
import librosa
|
||||
import argparse
|
||||
import operator
|
||||
import socket
|
||||
import threading
|
||||
import os
|
||||
import librosa
|
||||
import numpy as np
|
||||
import math
|
||||
import time
|
||||
from decimal import Decimal
|
||||
import json
|
||||
import requests
|
||||
import sqlite3
|
||||
import datetime
|
||||
from time import sleep
|
||||
import pytz
|
||||
from tzlocal import get_localzone
|
||||
from pathlib import Path
|
||||
import apprise
|
||||
|
||||
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
|
||||
os.environ['CUDA_VISIBLE_DEVICES'] = ''
|
||||
|
||||
@@ -20,7 +23,6 @@ try:
|
||||
except BaseException:
|
||||
from tensorflow import lite as tflite
|
||||
|
||||
|
||||
HEADER = 64
|
||||
PORT = 5050
|
||||
SERVER = socket.gethostbyname(socket.gethostname())
|
||||
@@ -41,6 +43,7 @@ userDir = os.path.expanduser('~')
|
||||
with open(userDir + '/BirdNET-Pi/scripts/thisrun.txt', 'r') as f:
|
||||
this_run = f.readlines()
|
||||
audiofmt = "." + str(str(str([i for i in this_run if i.startswith('AUDIOFMT')]).split('=')[1]).split('\\')[0])
|
||||
priv_thresh = float("." + str(str(str([i for i in this_run if i.startswith('PRIVACY_THRESHOLD')]).split('=')[1]).split('\\')[0]))/10
|
||||
|
||||
|
||||
def loadModel():
|
||||
@@ -165,13 +168,19 @@ def predict(sample, sensitivity):
|
||||
# Sort by score
|
||||
p_sorted = sorted(p_labels.items(), key=operator.itemgetter(1), reverse=True)
|
||||
|
||||
# Remove species that are on blacklist
|
||||
for i in range(min(10, len(p_sorted))):
|
||||
if p_sorted[i][0] in ['Human_Human', 'Non-bird_Non-bird', 'Noise_Noise']:
|
||||
p_sorted[i] = (p_sorted[i][0], 0.0)
|
||||
# #print("DATABASE SIZE:", len(p_sorted))
|
||||
# #print("HUMAN-CUTOFF AT:", int(len(p_sorted)*priv_thresh)/10)
|
||||
#
|
||||
# # Remove species that are on blacklist
|
||||
|
||||
# Only return first the top ten results
|
||||
return p_sorted[:10]
|
||||
human_cutoff = max(10,int(len(p_sorted)*priv_thresh))
|
||||
|
||||
for i in range(min(10, len(p_sorted))):
|
||||
if p_sorted[i][0]=='Human_Human':
|
||||
with open(userDir + '/BirdNET-Pi/HUMAN.txt', 'a') as rfile:
|
||||
rfile.write(str(datetime.datetime.now())+str(p_sorted[i])+ ' ' + str(human_cutoff)+ '\n')
|
||||
|
||||
return p_sorted[:human_cutoff]
|
||||
|
||||
|
||||
def analyzeAudioData(chunks, lat, lon, week, sensitivity, overlap,):
|
||||
@@ -194,16 +203,47 @@ def analyzeAudioData(chunks, lat, lon, week, sensitivity, overlap,):
|
||||
|
||||
# Make prediction
|
||||
p = predict([sig, mdata], sensitivity)
|
||||
# print("PPPPP",p)
|
||||
HUMAN_DETECTED=False
|
||||
|
||||
#Catch if Human is recognized
|
||||
for x in range(len(p)):
|
||||
if "Human" in p[x][0]:
|
||||
HUMAN_DETECTED=True
|
||||
|
||||
# Save result and timestamp
|
||||
pred_end = pred_start + 3.0
|
||||
|
||||
#If human detected set all detections to human to make sure voices are not saved
|
||||
if HUMAN_DETECTED == True:
|
||||
p=[('Human_Human',0.0)]*10
|
||||
|
||||
detections[str(pred_start) + ';' + str(pred_end)] = p
|
||||
|
||||
pred_start = pred_end - overlap
|
||||
|
||||
print('DONE! Time', int((time.time() - start) * 10) / 10.0, 'SECONDS')
|
||||
|
||||
# print('DETECTIONS:::::',detections)
|
||||
return detections
|
||||
|
||||
def sendAppriseNotifications(species,confidence):
|
||||
if os.path.exists(userDir + '/BirdNET-Pi/apprise.txt') and os.path.getsize(userDir + '/BirdNET-Pi/apprise.txt') > 0:
|
||||
with open(userDir + '/BirdNET-Pi/scripts/thisrun.txt', 'r') as f:
|
||||
this_run = f.readlines()
|
||||
title = str(str(str([i for i in this_run if i.startswith('APPRISE_NOTIFICATION_TITLE')]).split('=')[1]).split('\\')[0]).replace('"', '')
|
||||
body = str(str(str([i for i in this_run if i.startswith('APPRISE_NOTIFICATION_BODY')]).split('=')[1]).split('\\')[0]).replace('"', '')
|
||||
|
||||
if str(str(str([i for i in this_run if i.startswith('APPRISE_NOTIFY_EACH_DETECTION')]).split('=')[1]).split('\\')[0]) == "1":
|
||||
|
||||
apobj = apprise.Apprise()
|
||||
config = apprise.AppriseConfig()
|
||||
config.add(userDir + '/BirdNET-Pi/apprise.txt')
|
||||
apobj.add(config)
|
||||
|
||||
apobj.notify(
|
||||
body=body.replace("$sciname",species.split("_")[0]).replace("$comname",species.split("_")[1]).replace("$confidence",confidence),
|
||||
title=title,
|
||||
)
|
||||
|
||||
def writeResultsToFile(detections, min_conf, path):
|
||||
|
||||
@@ -213,8 +253,8 @@ def writeResultsToFile(detections, min_conf, path):
|
||||
rfile.write('Start (s);End (s);Scientific name;Common name;Confidence\n')
|
||||
for d in detections:
|
||||
for entry in detections[d]:
|
||||
if entry[1] >= min_conf and ((entry[0] in INCLUDE_LIST or len(INCLUDE_LIST) == 0)
|
||||
and (entry[0] not in EXCLUDE_LIST or len(EXCLUDE_LIST) == 0)):
|
||||
if entry[1] >= min_conf and ((entry[0] in INCLUDE_LIST or len(INCLUDE_LIST) == 0) and (entry[0] not in EXCLUDE_LIST or len(EXCLUDE_LIST) == 0) ):
|
||||
sendAppriseNotifications(str(entry[0]),str(entry[1]));
|
||||
rfile.write(d + ';' + entry[0].replace('_', ';') + ';' + str(entry[1]) + '\n')
|
||||
rcnt += 1
|
||||
print('DONE! WROTE', rcnt, 'RESULTS.')
|
||||
|
||||
Reference in New Issue
Block a user