TaiwanFrog / app.py
yfyangd's picture
Update app.py
a4c9486
import numpy as np
import pandas as pd
from pandas.core.frame import DataFrame
import os
from tqdm import tqdm, tqdm_pandas
tqdm.pandas()
import librosa
import librosa.display
SAMPLE_RATE = 44100
import joblib
#import IPython.display as ipd
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
import cv2
import matplotlib.pyplot as plt
import joblib
import gradio as gr
import io
from DataGenerator import Data_Generator, Audio
from FeatureExtraction import MFCC_spectrogram, FeatureExtraction
labels = ['American_bull','Brauer_treefrog','Brown_treefrog','Butler',
'Chinese_bull','Eiffinger','Emerald_treefrog','Farmland_treefrog',
'Fujian','Green_pond','Gunther','Harpist','Heymon','Japanese_Buerger',
'Latouchte','Long-legged','Malaysian_narrow_mouthed_toad','Mangrove',
'Meintein_treefrog','Moltrecht_treefrog','Olive','Orange_belly_treefrog',
'Ornate_rice','Ota_treefrog','Rice_field','Sauter','Spot_legged_treefrog',
'Stejneger','Swinhoe','Taipei_grass','Taipei_treefrog','Wang_treefrog']
dict_frog={'American_bull':'美洲牛蛙','Brauer_treefrog':'布氏樹蛙','Brown_treefrog':'褐樹蛙','Butler':'巴氏小雨蛙','Chinese_bull':'虎斑蛙','Eiffinger':'艾氏樹蛙','Emerald_treefrog':'碧眼樹蛙','Farmland_treefrog':'諸羅樹蛙','Fujian':'古氏赤蛙','Green_pond':'金線蛙','Gunther':'貢德氏赤蛙','Harpist':'豎琴蛙','Heymon':'黑蒙西氏小雨蛙','Japanese_Buerger':'日本樹蛙','Latouchte':'拉都希氏赤蛙','Long-legged':'長腳赤蛙','Malaysian_narrow_mouthed_toad':'亞洲錦蛙','Mangrove':'海蛙','Meintein_treefrog':'面天樹蛙','Moltrecht_treefrog':'莫氏樹蛙','Olive':'腹斑蛙','Orange_belly_treefrog':'橙腹樹蛙','Ornate_rice':'小雨蛙','Ota_treefrog':'太田樹蛙','Rice_field':'澤蛙','Sauter':'梭德氏赤蛙','Spot_legged_treefrog':'斑腿樹蛙','Stejneger':'長腳赤蛙','Swinhoe':'斯文豪氏赤蛙','Taipei_grass':'臺北赤蛙','Taipei_treefrog':'臺北樹蛙','Wang_treefrog':'王氏樹蛙'}
dict_frog_desc={'American_bull':'赤蛙科,是一種水生青蛙。是現存北美的最大的蛙之一。也在多個地方成為入侵物種,國際自然保護聯盟物種存續委員會的入侵物種專家小組也已將美國牛蛙給列為世界百大外來入侵種。',
'Brauer_treefrog':'樹蛙科,是分佈在中國大陸南方,西至西藏,北至甘肅、香港、海南島、台灣、印度的一種樹蛙,俗名白頷樹蛙,與另一種斑腿泛樹蛙相似。',
'Brown_treefrog':'樹蛙科,為樹蛙科溪樹蛙屬的兩棲動物,是台灣的特有物種。分布於台灣本島。廣泛分布於全省低海拔地區。',
'Butler':'狹口蛙科,又名粗皮姬蛙,為狹口蛙科姬蛙屬的兩棲動物。本種分布中國中部,南部和西南部,臺灣和香港,緬甸東部,泰國,寮國、柬埔寨、越南、馬來半島和新加坡。',
'Chinese_bull':'叉舌蛙科,又稱虎斑蛙、皺皮蛙、田雞或水雞,是一種水生青蛙,屬於無尾目叉舌蛙科虎紋蛙屬的一種,生性機警。',
'Eiffinger':'樹蛙科,是樹蛙科原指樹蛙屬的一種,其主要棲息於台灣以及日本琉球群島中、低海拔、氣候濕潤的森林或熱帶濕潤山地森林。艾氏樹蛙當下面臨著棲息地破壞的威脅。',
'Emerald_treefrog':'樹蛙科,碧眼樹蛙是2016年從艾氏樹蛙分出來的新種,體長3至5公分,樹棲性 夜行性。生態習性和艾氏樹蛙一樣,雄蛙會躲到有水的竹筒或樹洞內鳴叫,雄蛙有單一外鳴囊,叫聲是較規律的「逼逼、逼逼」。',
'Farmland_treefrog':'樹蛙科, 俗稱雨怪, 青腰仔. 樹蛙科, 分布在台灣嘉義雲林一帶的竹林;果園、低窪積水處. 1995年由國立台灣師範大學呂光洋教授所鑑定樹蛙科新種的樹蛙,因為首次發現的地點在嘉義,便以嘉義舊名諸羅來命名.',
'Fujian':'叉舌蛙科,又命名為福建大頭蛙,為叉舌蛙科大頭蛙屬的兩棲動物。該物種的產地在中國的福建省。亦可見於湖南,浙江和江西以及台灣。',
'Green_pond':'赤蛙科,金線蛙的體長5至10公分,體側綠色,兩側背側褶白色或淺綠色,中央有一條淺綠色背中線。平常棲息在靜水域,以水生動物為食。生性隱密機警,常常僅露出頭來觀察四周的動靜,若受到干擾,馬上跳入水中。',
'Gunther':'赤蛙科,是大型的蛙類,身體修長,可達12公分。上下唇皆白色,鼓膜周圍白色,像戴一個白色耳環。身體背部棕色或淺褐色,身體兩側各有一條明顯的背側褶,沿背側褶有黑色線條及不規則的黑斑。貢德氏赤蛙有一對外鳴囊,叫聲是如同狗叫般的「茍、茍、茍」,聲音低濁而且大聲。因為叫聲像狗叫,所以暱稱牠們為狗蛙。',
'Harpist':'赤蛙科,僅知分佈於琉球及台灣。中型肥碩,體長約4至5公分。鼓膜周圍有黑色菱形斑。背部是灰褐色或深褐色,有一條明顯淺色細長的背中線直達吻端,體側有一對淺色細長的背側褶。豎琴蛙目前僅在南投縣魚池鄉蓮華池一帶及宜蘭發現,因分佈侷限,易受干擾及傷害,2008年列為保育類。',
'Heymon':'狹口蛙科,黑蒙西氏小雨蛙是德國學者Theodor Vogt於1911年根據採集自台灣的標本所命名. 體長僅2至3公分,是台灣青蛙家族中體型最小的成員之一。牠們有典型的狹口蛙科體型,頭小體寬。背面淺褐色或灰色,身體兩側有縱向的深色紋,讓牠們看起來更像個三角形。',
'Japanese_Buerger':'樹蛙科,日本樹蛙又稱日本溪樹蛙,日本河鹿樹蛙,溫泉蛙,是樹蛙科溪樹蛙屬的一個不會爬樹的樹蛙物種,體型較其他樹蛙小,而雌性的日本樹蛙比雄性樹蛙稍大,成年的雄性長2.5至3公分,雌性長3至4公分,而其頭部的寬度約相等於全身的寬度.',
'Latouchte':'拉都希氏赤蛙是英國博物學者Geogre A.Boulenger以英國人拉圖許(1861-1953)命名的蛙類,命名的模式標本採集自中國福建。拉圖許對自然歷史事物非常有興趣,21歲時就抵達中國,並逗留長達三十年。其間拉圖許三次造訪台灣,在他的第一次台灣探險之旅,曾在大武山腳和以他之名命名的拉都希氏赤蛙相遇。',
'Long-legged':'長腳赤蛙是在1898年由美國學者史丹吉氏Leonhard Stejneger(1851-1943)描述命名,史丹吉氏是在研究日本學者Tsunasuke Tada於1896-1897年在台灣採集的一批兩棲爬蟲類標本時,發現長腳赤蛙是新種,並加以命名,命名用的模式標本來自台北,全世界僅分佈於台灣及中國福建省。',
'Malaysian_narrow_mouthed_toad':'別名花狹口蛙, 是英國學者J.E.Gray根據採集自中國的標本所命名。種名pulchra拉丁文的意思是美麗的花紋,因此花狹口蛙是根據外型命名。',
'Mangrove':'叉舌蛙科, 由德國自然學者Johann Gravenhorst(1777-1857)根據產於印尼爪哇的標本命名。海蛙體長約5至9公分,外型和澤蛙很像,但體型比澤蛙大,乍看很像放大版的澤蛙。背部花紋和澤蛙類似,有些個體有淺色背中線。',
'Meintein_treefrog':'面天樹蛙是由日本學者M.Kuramoro及台灣學者王慶讓先生於1987年命名發表的新種,其種名idiootocus指的是不同的產卵型態,因為面天樹蛙的外型和叫聲和艾氏樹蛙很像,所以先前一直被誤認為同一種,但因這兩種蛙類有不同的產卵方式,所以確定為不同種,因此將其種名取為idiootocus。至於俗名面天樹蛙則是因為模式標本的採集地點位於陽明山的面天山區,所以是地名。',
'Moltrecht_treefrog':'莫氏樹蛙是台灣特有種,在1908年由英國兩爬學者George A. Boulenger命名發表。模式標本是由Arnold Moltrecht在南投採集,再寄到英國給George A.Boulenger鑑定,因此莫氏樹蛙是用採集者的姓氏命名的。',
'Olive':'腹斑蛙是英國學者G.A.Boulenger在1909年根據採集自台灣南投的標本命名,種名拉丁文adeno是指腺體,pleura是腹側,指的是腹側有腺狀突起的蛙。而腹斑蛙雄蛙在體側肩後方有扁平黃色三角形肩腺隆起,所以學名是根據外型特徵命名。',
'Orange_belly_treefrog':'橙腹樹蛙是台師大呂光洋教授在1994年根據採集自宜蘭福山植物園標本發表的新種,是台灣特有種。種名拉丁文aurentiventris指的是橘紅色的腹部,所以是根據外型命名。',
'Ornate_rice':'小雨蛙是Boulenger在1884年根據採集自台灣台南的標本命名。廣泛分布於全省平地稻田、水池等開墾地、草澤及低海拔山區的森林底層落葉間,北部較常見。',
'Ota_treefrog':'在2012年前後,師大生科系林思民組成的研究團隊就已經發現全台灣不同流域的日本樹蛙有劇烈的遺傳分化,而且東南部與西北部的樹蛙族群並不是單系群。王盈涵同學檢測不同流域的蛙鳴,發現居住在台灣西北部地區的日本樹蛙只會發出一種叫聲,聽起來宛如微細而規則的蟲鳴聲;但是東部和南部的新種樹蛙卻可發出另一種高低起伏、強弱參雜的曲式。將這個新種命名為「太田樹蛙」',
'Rice_field':'澤蛙是自然採集者Heinrich Boie於1934年命名,命名的模式採集地點不詳。種名拉丁字limmo指的是湖泊、沼澤,charis是美麗,所以澤蛙的學名指的是沼澤裡的美麗蛙類,非常有詩意。',
'Sauter':'梭德氏赤蛙是英國學者G.A.Boulenger於1909年根據採集自台灣關子嶺的標本命名,為了紀念奧國動物採集者Hands Sauter,Boulener將其命名為sauteri。每年九月和十二月,牠們會成群結隊,一起遷移到溪流裡進行生殖活動。',
'Spot_legged_treefrog':'斑腿樹蛙是E. Hallowell在1861年根據採集自香港的標本命名為新種,屬名Polypedates是泛樹蛙屬。日本學者M. Matsui等人在1986年檢驗台灣及婆羅州標本後,曾將台灣的白頷樹蛙學名變更為Polypedates megacephalus。因此,就學名及中文俗文來看,Polypedates megacephalus曾經指斑腿樹蛙及白頷樹蛙。台灣的族群2006年之後才在彰化田尾出現,是外來種。',
'Stejneger':'長腳赤蛙是在1898年由美國學者史丹吉氏Leonhard Stejneger(1851-1943)描述命名,史丹吉氏是在研究日本學者Tsunasuke Tada於1896-1897年在台灣採集的一批兩棲爬蟲類標本時,發現長腳赤蛙是新種,並加以命名,命名用的模式標本來自台北,全世界僅分佈於台灣及中國福建省。',
'Swinhoe':'斯文豪氏赤蛙分佈於台灣,由英國學者George A. Boulenger於1903年根據採集自台灣萬巒的標本命名為新種。斯文豪氏赤蛙屬於大型蛙,體長約6至10公分,背部顏色變化多端,有綠色、褐色或綠色褐色交雜。身體修長,指(趾)端膨大呈吸盤狀,以適應溪流生活。牠們終年住在溪澗裡,白天躲在石縫或溪邊草叢裡,閒來無事也會叫一叫。',
'Taipei_grass':'台北赤蛙是美國學者John VanDenburgh(1872-1924)於1909年命名,命名標本採集自台北,所以稱之為台北赤蛙。臺北赤蛙本來是台灣平地常見的蛙類,但由於農藥的濫用以及棲地的破壞,目前僅零散出現在台北石門及三芝、桃園楊梅、台南官田、屏東屏科大附近等少數地方,因此列為保育類動物。',
'Taipei_treefrog':' 台北樹蛙是在1978年由台大梁潤生及王慶讓教授共同發表的台灣特有種,是台灣蛙類中,第一種由台灣學者發現並命名的種類,在台灣蛙類分類學史上有其重要意義。發表的模式標本採集於台北縣樹林鎮,所以稱之為台北樹蛙。據在陽明山連續五年的野外調查發現,牠們的壽命可達5年,每年會回到同一個生殖場所繁殖。雖然繁殖期長達半年',
'Wang_treefrog':'王氏樹蛙是2016年從艾氏樹蛙分出來的新種,體長3至5公分,樹棲性 夜行性。生態習性和艾氏樹蛙一樣,雄蛙會躲到有水的竹筒或樹洞內鳴叫,雄蛙有單一外鳴囊,叫聲是類似面天樹蛙較不規律的「逼、逼、逼」。三月到九月是主要的繁殖期。'}
loaded_model = joblib.load('./RFC_model')
def Audio(fname,SAMPLE_RATE):
y, sr = librosa.load(fname, sr=SAMPLE_RATE)
return y, sr
def AudioImg(y,sr):
img=librosa.display.waveshow(y, sr)
fig = plt.figure()
plot_img_np = get_img_from_fig(fig)
return plot_img_np
def MFCC_spectrogram(y,sr):
# 提取頻域音頻資料 MFCC spectrogram feature
melspec = librosa.feature.melspectrogram(y, sr, n_fft=1024, hop_length=512, n_mels=128)
# 轉成 log scale 已呈現頻譜資料
logmelspec = librosa.power_to_db(melspec)
# 繪圖
img=librosa.display.specshow(logmelspec, sr=sr, x_axis='time', y_axis='mel')
fig = plt.figure()
plot_img_np = get_img_from_fig(fig)
#plt.title('Features of unknow frog by MFCC (Mel Frquency Cepstral Coefficients)')
#plt.show()
return plot_img_np
def get_img_from_fig(fig, dpi=180):
buf = io.BytesIO()
fig.savefig(buf, format="png", dpi=dpi)
buf.seek(0)
img_arr = np.frombuffer(buf.getvalue(), dtype=np.uint8)
buf.close()
img = cv2.imdecode(img_arr, 1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
return img
def flog(A):
SAMPLE_RATE=44100
test_scaled = FeatureExtraction(A)
result = loaded_model.predict(test_scaled)
img=cv2.imread('./pic/'+labels[result[0]]+'.jpg')
img=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
y,sr=Audio(A,SAMPLE_RATE)
fig = plt.figure()
plt.title("Waveplot",fontsize=20)
AudioImg(y,sr)
img2 = get_img_from_fig(fig)
fig = plt.figure()
plt.title("MFCC Feature",fontsize=20)
MFCC_spectrogram(y,sr)
img3 = get_img_from_fig(fig)
#return dict_frog[labels[result[0]]],img
return dict_frog[labels[result[0]]],dict_frog_desc[labels[result[0]]],img,img2,img3
output_label = gr.Label()
output_desc = gr.Label()
output_image = gr.Image()
output_image2 = gr.Image()
output_image3 = gr.Image()
title="台灣青蛙聲音辨識"
description='''
在新北市三峽北114和115線往滿月圓森林遊樂區的路上,可能有用路人看過「當心青蛙」的號誌,但是應該很少人知道路中央可是經常遍佈命喪輪下的青蛙。 5-8月是褐樹蛙的繁殖期,牠們必須從森林穿越馬路來到溪邊繁殖,路殺機率因而大增,志工在晚間沿路撿拾路中央的青蛙放到路邊,以及把屍體移走,志工表示,最高兩人一晚曾撿到90幾隻屍體,他們最不忍心的不只是看到青蛙遭輾斃,還有看到受重傷的青蛙,就算移到路邊,這些青蛙也無法在野外存活太久。
<th>
<iframe width="560" height="315" src="https://www.youtube.com/embed/oGqB8ToAOGs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</th>
兩棲類是重要的環境指標,因此調查與監測兩棲類的族群變化,已成為生物多樣性保育的重要工作之一。然而若僅倚賴科學家進行調查,常會受限時間、經費、人力的因素。目前東華大學生態與環境調查研究所楊懿如教授所率領的兩棲類調查團隊, 全台灣共有31組志工團隊. 共調查32種青蛙的分佈. 志工必須要輪流排班, 深入池塘或是森林中進行現場調查。 大部分的青蛙藏匿在沼澤或是樹林中, 無法依靠目視判斷,主要由志工聆聽其叫聲來調查青蛙品種分佈。
本網站藉由機器學習,開發出青蛙聲音自動辨識.以幫助生物學家研究青蛙生態學。志工可以更快展開生態調查, 建立資料庫以了解環境變化。
### 請按下 "Record from microphone" 收音
### 收音結束之後, 請按下 "Submit"
'''
article = """
<p style='text-align: center'>Ref: <a href='https://metadata.froghome.org/' target='_blank'>台灣地區兩棲類物種描述資料</a></p>
<br>
"""
gr.Interface(flog,
inputs=[
gr.inputs.Audio(source="microphone", type="filepath",label="Input:錄製聲音"),],
outputs=[output_label,output_desc,output_image,output_image2,output_image3],
title=title,description=description,article=article).launch()
#outputs=[output_label,output_image],title=title,description=description).launch()