μμνλ©°
2019λ AIκ΄λ ¨ μμ μ μκ°νλ©° computer visionμ λν΄μ λ°°μ λ€. μ΄ μ΄ν, λΉμ ν λ°μ΄ν°μ λν μμ¬μ΄ μκΈ°κΈ° μμνμΌλ©° 3νλ μ£Όμ μ 4νλ μ΄ μ‘Έμ νλ‘μ νΈλ‘ λκ°λ νμ λνμ μ°Έμ¬λ₯Ό λμ νκ² λμλ€. 4νλ μ μ‘Έμ νλ‘μ νΈλ κΈ°μ μ°κ³ νλ‘μ νΈλ‘ μ€μ λ‘ κΈ°μ νμ§μλ€κ³Ό ν¨κ»νλ νλ‘μ νΈλ€ μ΄μλ€.
μ΄ μ¬κ±΄μ κ³κΈ°λ‘, λ§μ λνμ μ°Έμ¬νλ μ©κΈ°λ₯Ό μ»κ²λλ€ :) λ, λκΈ°μκ² λμ νκ³ κ²°κ³Όλ¬Όμ λ§μ‘±μ€λ½κ² λ½μλΈ κ²°κ³Ό λ΄ μΈμ μ²μμΌλ‘ ν° λνμμ μμ λ°κ² λλ€. κ·Έ μ’μ κΈ°μ΅μ λ μ¬λ¦¬λ©°, μ°λ¦¬νμ΄ λ§λ€μλ μμ€ν μ 리뷰ν΄λ³΄λ €κ³ νλ€ .
1. νλ‘μ νΈ κ°μ
1.1 νλ‘μ νΈ μ£Όμ μ μ λ°°κ²½
μ²κ°μ₯μ μΈμ΄ μ리λ₯Ό λ£μ§λͺ»ν΄ 격λ λ¬Έμ μ μ
β μν κ°μ§ μ΄λ €μ
- μ°¨ κ²½μ μ리, μ¬μ΄λ μ리 λ± μν κ°μ§ μμκ° λ μ μλ μ리λ₯Ό νμ νμ§ λͺ»νμ¬ μν λ ΈμΆ κ°λ₯μ±μ΄ λλ€.
- μ€μ μ¬λ‘) μ²κ°μ₯μ μΈμ νμ€κ³Ό μꡬμ¬ν
‘보μ²κΈ°’λΏμΈ μ²κ°μ₯μ 보쑰기 μμ₯μ μλ°λ μΌμΌν¨ η·
“λ μ 맨λ λ²½μ λΆμ΄λ€λλ?”μ΄λ λ μ λ°°κ° λ΄κ² λ¬Όμλ€. “λ€μμ μ°¨κ° λΉ΅λΉ΅ 거리λ κ±Έ λ€μ μ μμΌλκΉμ. ν λ²μ κΈ°λ€λ¦¬λ μ΄μ μκ° μΈκ² λ°μμ νλ¦¬κ° λκ° λ»ν μ λ μκ³ μ.” 보
brunch.co.kr
β‘ μ²κ° 보쑰기기μ λμ κ°κ²©
- νΉμ μ리λ₯Ό κ°μ§νκΈ° μν΄ λμ κ°κ²©μ μ²κ°λ³΄μ‘°κΈ°κΈ°λ₯Ό ꡬ맀ν΄μΌ νλ€. μ λΆ μ§μκΈ μ λκ° μμΌλ μ΄λ₯Ό μ§μ λ°μ§ λͺ»νλ μ₯μ μΈμ΄ λ€μμλ€.
- μ€μ μ¬λ‘) 보μ²κΈ° 보쑰κΈμ νμ€
‘μ΅λ 131λ§μ’ 보μ²κΈ° 보쑰κΈ, μ μ°¨μ μ격쑰건 TIP
β μ΅λ 131λ§μκΉμ§ μ§μ =μ°μ 보μ²κΈ° λ³΄μ‘°κΈ λμμλ 2~6λ±κΈ μ²κ°μ₯μ νμ μ λ°μ λμ²μΈμ ννλ©°, λ±κΈλ³ κ°κ²© μ°¨μ΄ μμ΄ λ³΄μ²κΈ° μ§μκΈ μ΅λ μ‘μλ 131λ§μμ΄λ€. μ΄λ°μ 보μ²κΈ° ꡬμ λΆν°
news.joins.com
β’ νμ€μ λμ λΆμ‘±
- μ²κ°μ₯μ μΈμ΄ νμ€μ μΌλ‘ μꡬνλ νλͺ©μ λΆν©νλ μ νμ΄ κ±°μ μλ€.
- μ€μ μ¬λ‘) νμ¬κ²½λ³΄κΈ° μ€μΉ νν©
"μ²κ°μ₯μ μΈμ© 경보μ₯μΉ, λͺ¨λ 건물μ μ€μΉ μ무ν ν΄μΌ" - λΉλ§μ΄λ
μ²κ°μ₯μ μΈμ© μ¬λ 경보μ₯μΉλ₯Ό λͺ¨λ 건μΆλ¬Όμ μ무μ μΌλ‘ μ€μΉν΄μΌ νλ€λ μ£Όμ₯μ΄ μ κΈ°λμλ€. '(κ°)μ₯μ μ λ²½μ ν무λ μ¬λλ€(μλ μ₯λ²½νμ¬)'μ μ§λ 6μΌ κ²½κΈ°λ νμ±μμ λ°μν νμ¬λ‘ 60λ
www.beminor.com
1.2 λͺ©ν μ μ
μ²κ°μ₯μ μΈμ μν μ¬μ©μ λ§μΆ€ν μ리 μλ¦Ό μ΄ν리μΌμ΄μ ‘μ리미’ μ μ
- μ€λ§νΈν° μ§λ μλ¦Ό μ΄νμ ꡬνν¨μΌλ‘μ¨ μ²κ°μ₯μ μΈλ€μ΄ λλΌλ μ²κ° 보쑰기ꡬμ κ°κ²©μ λν λΆλ΄μ μ€μ΄κ³ , μ¬μ©λ°©λ²μ΄ κ°λ¨νλ©°, μΈμνκ³ μΆμ μ리λ₯Ό μ¬μ©μκ° μ§μ μ ννμ¬ μνλ μλ¦Όμ λ°μ μ μλλ‘ ν¨
1.3 λ²μ μ μ
νλ‘μ νΈμ λ²μλ₯Ό μ μν¨μΌλ‘μ¨ νλ‘μ νΈμ μμΈν μ€κ³½μ μ‘μλ³΄κ³ , μΆν ν΄λΉ μ£Όμ λ₯Ό λ²μ΄λμ§ μλλ‘ λ―Έλ¦¬ λ²μλ₯Ό μ μν΄λκ³ μμνλ€. μ€μ λ‘ λ³Έ μμ€ν μ ꡬνν λ, μ¬μ©μκ° λꡬμΈμ§, μ μ΄ μμ€ν μ κ°λ°ν΄μΌ νλμ§ ν·κ°λ¦¬κ±°λ λ²μλ₯Ό λ²μ΄λ μκ°μ νλ κ²½μ°κ° μ’ μ’ μκ²Όλλ° λ²μ μ€μ μ ν΄λμ΄μ μ£Όμ λ₯Ό λ€μ λ€μ‘κ³ ν νμλ₯Ό μ§ννλ μ’μ μν μ ν΄μ£ΌκΈ°λ νμλ€.
2. μ€κ³ λ° κ΅¬ν
2.1 νλ‘μ νΈ μ€κ³
2.1.1 Activity Diagram
Activity Diagramμ κ·Έλ €λ΄μΌλ‘μ¨ νλ‘κ·Έλ¨μ νλ‘μΈμ€μ λν ꡬ체μ μΈ μ μλ₯Ό νκ³ , μ€κ³μ λν λλ΅μ μΈ κ·Έλ¦Όμ κ·Έλ €λ³΄μλ€.
2.1.2 AS-IS, TO-BE λΆμ
AS-IS, TO-BE λΆμμ ν΅ν΄ λ³Έ μμ€ν ꡬνμ ν΅ν΄ μ΄λ€ μ μ΄ ν΄κ²°λλμ§, κΈ°μ‘΄ μμ€ν μ λν λ¬Έμ λ₯Ό νμ ν΄λ³΄λ μκ°μ κ°μ‘λ€.
β AS-IS λΆμ λ° λ¬Έμ μ μ
β‘ TO-BE λΆμ
2.1.3 User Journey Map
ν΄λΉ μμ€ν μ΄ κ΅¬νλμμ λ, μ¬μ©μκ° μ΄λ»κ² λ°μνλμ§μ λν μ¬μ©μ κ²½νμ μκ°ν νμ¬ ννν¨μΌλ‘μ¨ λ³Έ μμ€ν μ λν νμμ±μ λμ± κ°μ‘°νλ€.
μ΄ user journey mapμ μ΄ν΄λ³΄μλ, μ¬μ©μμ λμ¦κ° λ§€μ° λ€μν¨μ μ μ μλ€. μ΄ λͺ¨λ μ¬μ©μμ λμ¦λ₯Ό μΆ©μ‘±μμΌμ£Όλ μμ€ν μΈ μ¬μ©μ λ§μΆ€ν μλΉμ€λ₯Ό μ 곡νμ¬ Installed Baseλ₯Ό ν보νλ κ²μ μ΅μ’ λͺ©νλ‘ λμλ€.
2.2 νλ‘μ νΈ κ΅¬ν
2.2.1 λ°μ΄ν° μμ§
λκ°μ§μ λ°μ΄ν° μ μ μ¬μ©νλ€.
FSD Kaggle 2018 | Kaggle λνλ₯Ό μν΄ Google AudioSetμμ λ°μ·ν λ°μ΄ν°μ
μΌλ‘, 18873κ°μ μ¬μ΄λ λ°μ΄ν°λ₯Ό 41κ°μ ν΄λμ€λ‘ λΌλ²¨λ§ν λ°μ΄ν° |
Urbansound8K | λμ μμμμ μΆμΆν μ¬μ΄λλ‘ κ΅¬μ±λ λ°μ΄ν°μ
μΌλ‘, 8732κ°μ μ¬μ΄λ λ°μ΄ν°λ₯Ό 10κ°μ ν΄λμ€λ‘ λΌλ²¨λ§ν λ°μ΄ν° |
μ¬κΈ°μ μλ λͺ¨λ λ°μ΄ν°λ₯Ό μ¬μ©νμ§λ μμκ³ , νλ‘μ νΈ μ£Όμ μ μ ν©ν 8κ°μ ν΄λμ€λ§ μΌλΆ μΆμΆνμ¬ μ¬μ©νλ€.
ν΄λμ€ λΆκ· ν λ°©μ§λ₯Ό μν΄ μλ ν΄λμ€μμλ λ무 λ§μ λ°μ΄ν°λ₯Ό 보μ ν λ°μ΄ν°μ κ²½μ°λ μ΅λ 500κ°μ λ°μ΄ν°λ§ μ¬μ©νλ€. λ°λΌμ μ΄ 8κ°μ ν΄λμ€λ‘ λΌλ²¨λ§ λ 2721κ°μ μ¬μ΄λ λ°μ΄ν°λ₯Ό νμ©νλ€.
μ¬μ©λ 8κ°μ ν΄λμ€ | Knock, Cough, Meow, Chime, Engine_idling, Dog-bark, Siren, Car-horn |
print(metadata.class_name.value_counts())
2.2.2 λ°μ΄ν° νν μκ°ν
μ리 λ°μ΄ν°λ λͺ¨λ ννμ ννμ΄ λ€μνκΈ° λλ¬Έμ μκ°ννμ¬ κ·Έ λͺ¨μ΅μ μ΄ν΄λ³΄μλ€.
filename = 'c:/code/dataset/kaggle_sample/00fbb28b.wav'
plt.figure(figsize = (12, 4))
data.sample_rate = librosa.load(filename)
_ = librosa.display.waveplot(data, sr = sample_rate)
2.2.3 λ°μ΄ν° μμ± λΆμ
β Audio Channels
- μ€λμ€λ μ€ν λ μ€, λͺ¨λ Έ λ κ°μ§μ νμ μΌλ‘ μ‘΄μ¬
- μ€ν λ μ€λ λκ°μ μ±λ, λͺ¨λ Έλ ν κ°μ μ±λμ κ°μ§
- μμ§λ°μ΄ν°λ λ κ°μ§μ νμ΄μ΄ νΌμ¬λμ΄ μλ ννλ‘ λ³΄μ
β‘ Sample Rate
- μ΄μ°μ μΈ μ νΈλ₯Ό λ§λ€κΈ° μν΄μ μ°μμ μΈ μ νΈμμ μ»μ΄μ§ λ¨μλΉ (μ£Όλ‘ μ΄) μνλ§ νμ
- μμ§λ°μ΄ν°μ Sample Rateλ 96K ~ 11Kλ‘ λ€μ
print(audiodf.sample_rate.value_counts(normalize = True))
β’ Bit Depth
- μ€λμ€λ₯Ό μΈλΆννμ¬ νννλ μ λ, λΉνΈμ μ¬λλΌκ³ λΆλ¦.
- μμ§ λ°μ΄ν°μ Bit Depth λν λ§€μ° λ€μνκ² λΆν¬ν¨.
print(audiodf.bit_depth.value_counts(normalize = True))
2.2.4 λ°μ΄ν° μ μ²λ¦¬
β νλμ μ±λλ‘ ν΅ν©
- μ€ν λ μ€ νμ μ λ°μ΄ν°λ₯Ό λ μ±λμ νκ· κ°μ μ΄μ©νμ¬ νλλ‘ λ³ν©νκ³ , λͺ¨λ Έ νμ μΌλ‘ λ³νν΄ μ£Όμλ€.
import matplotlib.pyplot as plt
# μλ original λ°μ΄ν°μ νν
plt.figure(figsize=(12, 4))
plt.plot(scipy_audio)
# ν©μ³μ§ μ±λ
plt.figure(figsize=(12, 4))
plt.plot(librosa_audio)
β‘ Sample Rate κ°λ€μ νμ€ν
- λ€μνκ² λΆν¬νλ Sample Rate κ°λ€μ νμ€ν μμΌμ£Όλ μμ μ μννλ€.
- Sample-rate conversion κΈ°μ μ νμ©νμ¬ λ€μν Sample Rateλ€μ νμ€ν μμΌ°λ€.
- Sample-rate conversion? μ΄μ°μ νΈμ μνλ§ μλλ₯Ό λ³κ²½νμ¬ κΈ°λ³Έ μ°μ μ νΈμ μλ‘μ΄ μ΄μ° ννμ μ»λ κ³Όμ
- Librosa λͺ¨λμ load κΈ°λ₯μ μ΄μ©νμ¬ λ°μ΄ν°λ€μ Sample Rateλ₯Ό 22.05KHzλ‘ λ³ννλ€.
- librosa.load(filename, sr=None) μ΄ νν, srμ NoneμΌλ‘ μ€μ ν΄μ£Όμ§ μμΌλ©΄ μλμΌλ‘ resamplingμ΄ μ§νλ¨
- λ³Έ νλ‘μ νΈμμλ μ§μ ν΄μ£Όμ§ μμκΈ° λλ¬Έμ resamplingμ΄ μ§νλμμ μ μ μμ.
- resamplingλ λ°μ΄ν°μ λΆν¬λ -1κ³Ό 1μ¬μ΄λ‘ μ κ·νλ¨
- μ°Έκ³ λ§ν¬
import librosa
from scipy.io import wavfile as wav
import numpy as np
filename = 'UrbanSound_Dataset_sample/audio/102857-5-0-0.wav'
librosa_audio, librosa_sample_rate = librosa.load(filename)
scipy_sample_rate, scipy_audio = wav.read(filename)
print('Original sample rate:', scipy_sample_rate)
print('Librosa sample rate:', librosa_sample_rate)
β’ Bit Depth κ°λ€μ μ κ·ν
- librosa λͺ¨λμ load κΈ°λ₯μ μ΄μ©νμ¬ κ° λ°μ΄ν°λ€μ Bit Depthλ₯Ό -1 κ³Ό 1 μ¬μ΄μ κ°μ κ°λλ‘ μ κ·ν μμΌμ£Όμλ€.
print('Original audio file min~max range:', np.min(scipy_audio), 'to', np.max(scipy_audio))
print('Librosa audio file min~max range:', np.min(librosa_audio), 'to', np.max(librosa_audio))
2.2.5 λ°μ΄ν° νΉμ± μΆμΆ
μ리λ°μ΄ν°λ λ€λ₯Έ λΉμ ν λ°μ΄ν°μλ λ€λ₯΄κ² μ£Όνμ λ° μκ³μ΄μ νΉμ±μ λͺ¨λ λΆμν featureκ° νμνλ€. μ¬λ¬λ²μ μ€ν¨λ₯Ό λ§λ³΄κ³ , νμλ€κ³Ό μ΄μ¬ν 곡λΆν κ²°κ³Ό MFCC μ리μ¦μ νμ©ν΄μ Featureλ₯Ό μΆμΆν΄μ£Όμ΄μΌ νλ€λ μ μ μκ² λμλ€. MFCC μ λν μμΈν ν¬μ€ν μ λμ€μ νλλ‘ νκ³ , νλ‘μ νΈμ νμν κ°λ¨ν μ§μκ³Ό κ°λ¨ν μ½λλ₯Ό ꡬννμ¬ λ³Έ νλ‘μ νΈλ₯Ό λ§μ μ λ‘λ ν΄λ³΄κ² λ€.
- MFCC (Mel-Frequency Cepstral Coefficients)
- μ리λ°μ΄ν°λ₯Ό μΌμ ꡬκ°μΌλ‘ λλμ΄ ν΄λΉ ꡬκ°μ λν μ€ννΈλΌμ λΆμνμ¬ νΉμ§μ μΆμΆν΄μ£Όλ λνμ μΈ μμ±μΈμ μκ³ λ¦¬μ¦
- μμ μ΄ λ³ν΄λ MFCCκ° μΌμ νκ² μ μ§λκΈ° λλ¬Έμ νμ©λ²μκ° μλΉν λμμ μ μμλ€.
- μ리μ μ£Όνμ λ° μκ°μ νΉμ±κΉμ§ λͺ¨λ λΆμν΄μ€λ€.
- μ리λ μκ³μ΄ λ°μ΄ν°μ΄κΈ° λλ¬Έμ μκ°μ νΉμ±κΉμ§ λΆμμ΄ νμνκ³ , μ£Όλ³μ μΌμ νμ§ μμ μ리λ₯Ό μΈμνκ³ , μμ μ΄ λ¬λΌλ κ°μμλ¦¬λ‘ μΈμν΄μ£Όμ΄μΌ νκΈ° λλ¬Έμ MFCC μκ³ λ¦¬μ¦μ μ¬μ©ν΄λ³΄κΈ°λ‘ νλ€.
import librosa
import numpy as np
import pandas as pd
import os
max = 0
def extract_features(file_name):
try:
audio, sample_rate = librosa.load(file_name, res_type='kaiser_fast')
mfccs = librosa.feature.mfcc(y=audio, sr=sample_rate, n_mfcc=40)
# print(mfccs.shape) # μ΄κ±° μΆκ°ν΄λ΄
mfccsscaled = np.mean(mfccs.T,axis=0)
global max
if mfccs.shape[1] > max:
max = mfccs.shape[1]
# print(max)
except Exception as e:
print("Error encountered while parsing file: ", file_name)
return None
return mfccsscaled
# λ°μ΄ν°μ
path μ§μ
fulldatasetpath = 'C:/code/cap_sound/dataset/final_dataset_500/'
metadata = pd.read_csv('C:/code/cap_sound/dataset/final_500.csv')
features = []
# κ° μ리μ λν΄ featureλ₯Ό μΆμΆ
for index, row in metadata.iterrows():
file_name = os.path.join(os.path.abspath(fulldatasetpath)+'/'+str(row["slice_file_name"]))
class_label = row["class_name"]
data = extract_features(file_name)
features.append([data, class_label])
# dfλ‘ λ§λ€κΈ°
featuresdf = pd.DataFrame(features, columns=['feature','class_label'])
print('Finished feature extraction from ', len(featuresdf), ' files')
print('Max :',max)
μμ½ν΄μ μΆμΆλ featureλ₯Ό μ΄ν΄λ³΄λ©΄
mfccs = librosa.feature.mfcc(y = librosa_audio, sr = librosa_sample_rate, n_mfcc = 40)
print(mfccs.shape)
import librosa.display
librosa.display.specshow(mfccs, sr = librosa_sample_rate, x_axis = 'time')
2.2.6 λͺ¨λΈ ꡬμΆ
λ°°μ΄ μ§μμ νμ©ν΄λ³΄κ³ μ μΈ κ°μ§μ λͺ¨λΈμ ꡬμΆνκ³ , κ° λͺ¨λΈ λ³ Accuracyλ₯Ό λ³΄κ³ μ΅μ’ λͺ¨λΈμ κ²°μ νμλ€.
β λ°μ΄ν° λΆν λ° μ μ₯
- λ°μ΄ν° λ³ν λ° λΌλ²¨ μΈμ½λ μ μ©
- Sklearnμ labelEncoderλ₯Ό μ μ©νλ€.
- λ²μ£Όν ν μ€νΈ λ°μ΄ν°λ₯Ό μ΄ν΄ν μ μλ μμΉν λ°μ΄ν°λ‘ λ³ννκΈ° μν΄μ
from sklearn.preprocessing import LabelEncoder
from keras.utils import to_catagorical
x = np.array(featuresdf.feature.tolist())
y = np.array(featuresdf.class_label.tolist())
le = LabelEncoder()
yy = to_categorical(le.fit_transform(y))
β‘ λ°μ΄ν° λΆν
- sklearnμ train_test_splitμ μ μ©νμ¬ train:test = 8:2λ‘ λΆν νλ€.
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, yy, test_size = 0.2, random_state = 42)
2.2.6.1 MLP (Multi-Layer Perception)
- λͺ¨λΈ μ μ μ΄μ
- μ κ²½λ§μ κΈ°λ³Έμ΄ λλ λͺ¨λΈλ‘μ, μ λ ₯μΈ΅, μλμΈ΅, μΆλ ₯μΈ΅μ λ¨μν κ΅¬μ‘°λ‘ κ΅¬νμ΄ μ©μ΄νμ¬ νμ΅ μμμκ°μ΄ μ§§μΌλ―λ‘ μ±ν
- μ§λνμ΅μ΄ νμν λ¬Έμ λ₯Ό ν΄κ²°νλλ° μ£Όλ‘ μ¬μ©λλ©°, μμ±μΈμ νΉμ μ΄λ―Έμ§ μΈμμμ μ£Όλ‘ μ¬μ©λκΈ° λλ¬Έμ μ¬μ©
- λͺ¨λΈ ꡬν
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.optimizers import Adam
from keras.utils import np_utils
from sklearn import metrics
num_labels = yy.shape[1]
filter_size = 2
# Construct model
model = Sequential()
model.add(Dense(256, input_shape=(40,)))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_labels))
model.add(Activation('softmax'))
- μμ μ°κ²° κ³μΈ΅ 3μΈ΅μΌλ‘ ꡬμ±
- νμ±ν ν¨μλ κ° layer λ§λ€ ReLU, ReLU, softmax ν¨μλ₯Ό μ¬μ©
- Batch 256 / epoch λ 100, 150,,,, 1000 κΉμ§ λ€μνκ² νμ΅ μ§ν
- νμ΅ μ§ν
from keras.callbacks import ModelCheckpoint
from datetime import datetime
num_epochs = 1000
num_batch_size = 32
# μ μλ μλ λͺ¨λΈμ μ°λκ² λ§λμ§
checkpointer = ModelCheckpoint(filepath='C:/code/cap_sound/save_models/weights.best.basic_mlp.hdf5',
verbose=1, save_best_only=True)
start = datetime.now()
model.fit(x_train, y_train, batch_size=num_batch_size, epochs=num_epochs, validation_data=(x_test, y_test), callbacks=[checkpointer], verbose=1)
duration = datetime.now() - start
print("Training completed in time: ", duration)
- μ€νκ²°κ³Ό νμ΅μκ°μ΄ λ§€μ° μ§§λ€λ μ₯μ μ΄ μμμ. (epoch 1000 μΌλ νμ΅ μμ μκ° μ½ 38μ΄)
- μ μ²λ¦¬ λ° MFCC λ₯Ό μ μ©ν λ°μ΄ν°λ₯Ό λ°λ‘ λ³νμμ΄ λ°λ‘ μ¬μ© κ°λ₯νλ€λ μ μ΄ νΈλ¦¬νμ.
2.2.6.2 CNN (Convolutional Nural Network)
- λͺ¨λΈ μ μ μ΄μ
- λ³Έμ§μ μΌλ‘λ λ¨μν MLPμ νμ₯μ΄μ§λ§, μ λ ₯μΈ΅, 컨볼루μ μΈ΅, ν΄λ§μΈ΅, μμ μ°κ²°κ³μΈ΅μ΄ κ²°ν©λ ννλ‘ λλΆλΆμ κ²½μ° MLPλ³΄λ€ λ μ’μ μ±λ₯μ λ°ννκΈ°μ μ±ν
β λ°μ΄ν° μ μ²λ¦¬, νΉμ§ μΆμΆ, μ λ‘ν¨λ© μν
# extract feature ν¨μ μ¬μ μ
import numpy as np
max_ped_len = 1287
test_num = 0
def extract_features(file_name):
try:
audio, sample_rate = librosa.load(file_name, res_type = 'kaiser_fast')
mfccs = librosa.feature.mfcc(y=audio, sr = sample_rate, n_mfcc = 40)
pad_width = max_pad_len - mfcc.shape[1]
mfccs = np.pad(mfccs, pad_width = ((0, 0), (0, pad_width)), mode = 'constant')
except Exception as e:
print("Error λ°μ: ", file_name)
return None
return mfccs
import pandas as pd
import os
import librosa
fulldatasetpath = 'C:/AI/final_dataset_500/'
metadata = pd.read_csv("C:/AI/final_500.csv')
features = []
for index, row in metadata.iterrows():
file_name = os.path.join(os.path.abspath(fulldatasetpath) + '/' + str(row["slice_file_name"]))
class_label = row['class_name']
data = extract_features(file_name)
features.append([data, class_label])
featuresdf = pd.DataFrame(features, columns = ['feature', 'class_label'])
print("Finished feature extraction from ', len(featuresdf), ' files')
β‘ νμ΅ λ°μ΄ν° reshape
num_rows = 40
num_columns = 1287
num_channels = 1
prnt("train data shape")
print(x_train.shape)
print(x_test.shape)
x_train = x_train.reshape(x_train.shape[0], num_rows, num_columns, num_channels)
x_test = x_test.reshape(x_test.shape[0], num_rows, num_columns, num_channels)
print("\ntrain data reshape κ²°κ³Ό")
print(x_train.shape)
print(x_test.shape)
β’ λͺ¨λΈ ꡬν
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D, GlobalAveragePooling2D
from keras.optimizers import Adam
from keras.utils import np_utils
from sklearn import metrics
num_labels = yy.shape[1]
filter_size = 2
#CNNλͺ¨λΈ ꡬν
model = Sequential()
model.add(Conv2D(filters = 16, kernel_size = 2, input_shape = (num_rows, num_columns, num_channels), activation = 'relu'))
model.add(MaxPooling2D(pool_size = 2))
model.add(Dropout(0.2))
model.add(Conv2D(filters = 32, kernel_size = 2, activation = 'relu'))
model.add(MaxPooling2D(pool_size = 2))
model.add(Dropout(0.2))
model.add(Conv2D(filters = 64, kernel_size = 2, activation = 'relu'))
model.add(MaxPooling2D(pool_size = 2))
model.add(Dropout(0.2))
model.add(Conv2D(filters = 128, kernel_size = 2, activation = 'relu'))
model.add(MaxPooling2D(pool_size = 2))
model.add(Dropout(0.2))
model.add(GlobalAveragePooling2D())
model.add(Dense(num_labels, activation = 'softmax'))
#μ»΄νμΌ
model.compile(loss = 'categorical_crossentropy'
, metrics = ['accuracy']
, optimizer = 'adam')
model.summary()
score = model.evaluate(x_test, y_test, verbose = 1)
accuracy = 100 * score[1]
print('Pre-training accuracy: %.4f%%' % accuracy)
- λͺ¨λΈ μ€λͺ
- 4κ°μ convolution κ³μΈ΅κ³Ό 4κ°μ Max pooling κ³μΈ΅μΌλ‘ ꡬμ±
- κ° layerμ νμ±νν¨μλ ReLUν¨μ, μΆλ ₯μΈ΅μ softmaxν¨μλ₯Ό μ΄μ©
- drop out κ°μ 0.2
- νμ΅ μ§ν
- batch 256
- epochλ 100, 150,,, 1000 κΉμ§ λ€μνκ² μνν΄λ΄
- νΉμ΄μ¬ν
- CNNλͺ¨λΈμμλ μΈν λ°μ΄ν°μ ν¬κΈ°κ° (3μ°¨μ)μΌλ‘ λͺ¨λ λμΌν΄μΌν¨
- κ·Έλ¬λ MFCC μ μ²λ¦¬κ° μ μ©λ λ°μ΄ν°μ κ²½μ° λ€μκ³Ό κ°μΌ λͺ¨λ λ€μν shapeμ 보μ νκΈ°μ λͺ¨λ λμΌν ννλ‘ reshapeμ΄ λ°λ‘ νμνμ.
- λ°λΌμ max len = 1287λ‘ μ λ‘ν¨λ©μ μνν΄μ£Όμμ.
- κ²°λ‘ μ μΌλ‘ λ°μ΄ν° shapeλ μλ ν μ²λΌ λ³νν¨
2.2.6.3 LSTM (Long Short-Term Memory)
- λͺ¨λΈ μ μ μ΄μ
- RNNμ μ½μ μΌλ‘ μ§μ λλ Vanishing Gradient Problemμ κ°μ ν λͺ¨λΈλ‘, λλΆλΆμ κ²½μ°μμ RNNλ³΄λ€ μ’μ μ±λ₯μ 보μ΄λ―λ‘ μ±ν
β νμ΅λ°μ΄ν° reshape
print("train data shape")
print(x_train.shape)
print(x_test.shape)
#x_train=x_train.reshape(2176,40,1)
x_train = np.reshape(x_train, (len(x_train), len(x_train[0]), -1))
x_test = np.reshape(x_test, (len(x_test), len(x_test[0]), -1))
#print(y_train.shape)
#print(y_test.shape)
print("\ntrain data reshape κ²°κ³Ό")
print(x_train.shape)
print(x_test.shape)
β‘ λͺ¨λΈ ꡬν
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, Conv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.layers import GRU, LSTM, Embedding # RNN
from keras.optimizers import Adam
from keras.utils import np_utils
from sklearn import metrics
num_labels = y_train.shape[1]
#LSTM λͺ¨λΈ ꡬν
model = Sequential()
model.add(LSTM(256,input_shape=(40,1),return_sequences=False))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
#model.add(TimeDistributed(Dense(vocabulary)))
model.add(Dense(num_labels, activation='softmax'))
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')
# Display model architecture summary
model.summary()
- λͺ¨λΈ μ€λͺ
- LSTM λͺ¨λΈμ μμ μ°κ²°κ³μΈ΅ 5κ° μ°κ²°
- κ° κ³μΈ΅μμ ReLUν¨μ, μΆλ ₯κ³μΈ΅μμ softmaxν¨μλ₯Ό μ¬μ©
- 5κ°μ Dense
- drop out 0.2
- λ€μκ³Ό κ°μ΄ νμ΅ μ§ν
- Batch 256
- epochλ 100, 150,,,,, 1000 κΉμ§ λ€μνκ² μ§νν΄λ΄
- νΉμ΄μ¬ν
- LSTMλͺ¨λΈμ μμ°μ΄ μ²λ¦¬μ μ¬μ©μ, μΈνλ°μ΄ν°λ₯Ό μ«μ ννλ‘ λ³ννκΈ°μν΄ μ£Όλ‘ μ-ν«μΈμ½λ©μ μ μ©νλ€.
- μμ MLPλͺ¨λΈμμ μ μν μ μ²λ¦¬ν¨μ (Extract_feature) μμ MFCCμ μ©μ ν΅ν΄ μΈνλ°μ΄ν°λ₯Ό μ«μλ‘ λ³ννμκΈ°μ λ³λμ μΈμ½λ©μ μ§ννμ§ μμλ€. λ€λ§, λ°μ΄ν°μ shapeλ§ μ΄μ§ λ°κΎΈμ΄ μ£Όμλ€.
2.2.7 λͺ¨λΈ μ νλ λΉκ΅ λ° λͺ¨λΈ μ ν
MLP, CNN, LSTM κ°κ° epoch 300, eopch 300, eopch 600μμ accuracy κ° κ°μ₯ λκ² λνλ¬λ€. μ νλλ CNN > MLP > LSTM μμΌλ‘ λμκ³ , νμ΅ μκ°μ MLP, LSTM, CNN μμΌλ‘ μ§§μλ€. LSTMμ μ νλκ° 85% λ―Έλ§μ΄κ³ , νμ΅μκ°μ MLP λλΉ κΈΈκΈ° λλ¬Έμ λͺ¨λΈ μ±νμμ μ μΈνκ³ , μ±λ₯μ΄ μ’μ§λ§ μκ°μ΄ μ€λ걸리λ CNNκ³Ό μ±λ₯μ΄ λ€μ λ¨μ΄μ§μ§λ§ νμ΅μκ°μ΄ μ§§μ MLP μ€μ λͺ¨λΈμ μ ννκΈ°λ‘ νλ€.
2.2.7.1 MFCC λ³κ²½
κ΅μλκ»μ μΈν λ°μ΄ν°μ κΈΈμ΄κ° κΈ΄ κ²½μ°μ μ§§μ κ²½μ°μ κ²μ€ μ΄λ κ²μ΄ λ μ νλκ° λμμ§μ λν μΆκ° μ°κ΅¬κ° νμν κ²μ΄λΌλ μ견μ μ£Όμ §λ€. λ°λΌμ MFCC μ νλ μ κΈΈμ΄λ₯Ό λ³κ²½ν΄μ λͺ¨λΈ νμ΅μ μ§νν΄λ³΄κΈ°λ‘ νλ€.
μΌλ°μ μΌλ‘ MFCCμμλ μ΄ νλ μμ κΈΈμ΄κ° 20~40ms μ λμ΄λ€. νλ μμ κΈΈμ΄κ° λ무 κΈΈλ©΄ μ£Όνμ λΆμμμ μ λ’°λκ° λ¨μ΄μ§λ€. λν νλ μμ κΈΈμ΄κ° λ무 μ§§μΌλ©΄ ν νλ μ λ΄ μ νΈ λ³νκ° μ»€μ§κΈ° λλ¬Έμ μ’μ§ μμλ€. κ°μ₯ μ’μ λͺ¨λΈ MLP μ CNN λͺ¨λΈ μ€, MFCC κΈΈμ΄μ κ°μ λ³κ²½ν΄μ λ νμ΅μ μ§ν΄ν΄ 보μλ€. MFCC=20μΌλμ MFCC=40μΌλμ λͺ¨λΈμ λΉκ΅νμ¬ μ΅μ’ λͺ¨λΈμ μ νν κ²μ΄λ€.
λͺ¨λΈ νμ΅ κ²°κ³Ό, μ°λ¦¬ νμ μ΅μ’ λͺ¨λΈμ MFCC = 40 μΌλ, CNNλͺ¨λΈμ μ¬μ©νκΈ°λ‘ νλ€.
2.2.8 κ²°κ³Ό μμ
μ΅μ’ μ νλ λͺ¨λΈλ‘ μ리λ₯Ό λΆλ₯ν΄ λ³΄κ² λ€.
def print_prediction(file_name):
prediction_feature = extract_feature(file_name)
predicted_vector = model.predict_classes(prediction_feature)
predicted_class = le.inverse_transform(predicted_vector)
print("The predicted class is:", predicted_class[0], '\n')
predicted_proba_vector = model.predict_proba(prediction_feature)
predicted_proba = predicted_proba_vector[0]
for i in range(len(predicted_proba)):
category = le.inverse_transform(np.array([i]))
print(category[0], "\t\t : ", format(predicted_proba[i], '.32f') )
filename = 'UrbanSound Dataset sample/audio/100648-1-0-0.wav'
print_prediction(filename)
μλμ°¨ μ리λ₯Ό 무μ¬ν μλμ°¨ μ리λΌκ³ λΆλ₯ν μ μμλ€!!
filename = '../Evaluation audio/siren_1.wav'
print_prediction(filename)
λ€λ₯Έ λ°μ΄ν°μ
μ μ¬μ©ν΄λ 무μ¬ν μ¬μ΄λ μ리λ₯Ό μ¬μ΄λ μλ¦¬λ‘ κ΅¬λ³ν μμμλ€.
μ°λ¦¬νμ μΌμ μ리μΌ
2.2.9 νλ‘ν νμ μ μ
μ°λ¦¬μ μ£Όμ λ μ μ΄μ 'μ΄ν리μΌμ΄μ 'μ΄μ§λ§, μ ν μκ° μ΄λ΄λ‘ μλλ‘μ΄λμ Javaλ₯Ό μλ ¨μμΌ μ΄ν리μΌμ΄μ μ μ€μ λ‘ μ μνκΈ°μ λ¬΄λ¦¬κ° μμλ€. λ°λΌμ μ°λ¦¬ νμ μ΄ν리μΌμ΄μ μΌλ‘ λ³΄μΌ μ μλ exe νμΌμ μ μνμ¬ νλ‘ν νμ μ μ μνλ‘ νκ³ νλ‘μ νΈλ₯Ό μ§ννμλ€. pythonμΌλ‘ ꡬνν λͺ¨λΈκ³Ό PyQtλ₯Ό μ°λμμΌ νλ‘ν νμ μ μ μν μ μμλ€.
μλ λ°©λ²μΌλ‘ νλ‘ν νμ μ μμ μ§ννλ€.
ν΄λΉ λ§μ§λ§ κ³Όμ μ λ΄κ° μ°Έμ¬ν κ²μ΄ μλ νμμ μνμ΄κΈ°μ μμΈν μ½λλ 첨λΆνμ§ μκ³ , μ΅μ’ κ²°κ³Όλ¬Όμ μ λ‘λ ν΄λ³΄κ² λ€.
μ§μ§ μ΄ν리μΌμ΄μ μ μλλλΌλ μ΄λ κ² νλ‘ν νμ μΌλ‘ μ μνμ¬ μ€μνμμ μ΄λ»κ² μ¬μ©λ μ§ μ§μ ꡬννμ¬ λ°νν μ μ΄ νμ λν κΈμ μμμ κ°μ₯ ν° μν₯μ λΌμΉ κ²μ΄ μλκΉ μκ°νλ€. λ³΄ν΅ μ½λλ₯Ό ν΅ν΄ μ리λ₯Ό inputν΄μ, outλλ κ²°κ³Όκ°μ 보μ¬μ£Όλ λΆλ₯μ κ°λ₯μ±μ 보μ¬μ£Όμλλ°, μ°λ¦¬ νμ μ€μ λ‘ μ리λ₯Ό λ€λ €μ£Όκ³ , μ΄λ₯Ό λΆλ₯νλ κ³Όμ κΉμ§ λμμμ ν΅ν΄ 보μ¬μ£Όλ©΄μ λ§μ μ¬λλ€μκ² μΈμ λ°μ μ μμλ κ² κ°λ€.
μ¬μ©μκ° μ리λ₯Ό μ ννκ³ , ν΄λΉ μ리μ μνλ μ§λν¨ν΄μ μ νν μ μλλ‘ λ§λ€μλ€. λν μ²κ°μ₯μ μΈμ΄ μ΄κ°μΌλ‘ μ리λ₯Ό λλ μ μλλ‘ μ§λμΌλ‘ ꡬννκ³ μ νμ§λ§, λ°νλΌλ νΉμ±μ νλ‘ν νμ μ μ²κ° λ° μκ°μ μΈ ν¨κ³Όλ₯Ό μν΄ μ--- μ리λ₯Ό μ΄μ©ν΄μ ꡬνν΄ λ³΄μλ€.
3. κΈ°λν¨κ³Ό λ° μΆν μ°κ΅¬ λ°©ν₯
- κΈ°λν¨κ³Ό
- λ²μ£ λ°μλ₯ μ΄ λμ μ§μμ κΈ°κΈ°λ₯Ό μ€μΉνμ¬ λ°©λ²μ©μΌλ‘ μ¬μ© κ°λ₯
- μ΄μ΄ν° μ°©μ©μ€μλ μ°¨ κ²½μ λ° μμ§μ리λ₯Ό κ°μ§νλ μλ¦Όμ μ£Όλ μ΄ν리μΌμ΄μ μΌλ‘ λ°μ κ°λ₯
- μ²κ°μ₯μ μΈμ μν μμ€ λΉμ©μ μ κ°ν μ μμ
- μ리λ₯Ό λ£μ§ λͺ»ν΄μ μκΈ°λ μνμ λ°©μ§ν μ μμ.
- λ§μΆ€ν μ리 λΆλ₯ μμ€ν μΌλ‘ μΆμ μ§ ν₯μ κ°λ₯
- μ μ‘° μ°μ μμμ μν μ¬κ³ λ°μ κ°μ§, κ²μ μ°μ μμμ μμ±μΈμ, ott λ± λ―Έλμ΄ μ°μ μμμ μμ± μΈμ, κΈμ΅μ μμμ μ±λ΄ λ± λ€μν μ°μ μμμ λ°μ κ°λ₯μ±μ΄ 무νν μ‘΄μ¬ν¨
- νκ³ λ° μΆν μ°κ΅¬ λ°©ν₯
- μ리 λΆλ₯μ μ νλλ μ£Όλ³ μν©μ λ°λΌ λ¬λΌμ§ μ μκΈ°μ λ Έμ΄μ¦ κ΄λ ¨ μ°κ΅¬κ° μΆκ°λ‘ μ§νμ΄ νμνλ€.
- μ리λ₯Ό νμ§νλ λ§μ΄ν¬μ μ±λ₯λ μ€μνκ² μμ©νλ€.
- κ°μ§ν΄μΌν μλ¦¬κ° λμλ€λ°μ μΌλ‘ λ°μνλ©΄, λͺ¨λ μ리λ₯Ό μΈμνκΈ° νλ€λ€λ νκ³κ° μ‘΄μ¬νλ€.
- λ°λΌμ λμλ€λ°μ μΌλ‘ λ°μνλ μ리μ λν μ²λ¦¬λ₯Ό μν λͺ¨λΈ μ±λ₯ κ°μ μ΄ νμνλ€.
- μ리μ μ’ λ₯λ₯Ό λλ €μ μ μ‘°, 곡μ , λμ§νΈ ν¬μ€μΌμ΄, κΈμ΅, κ²μ λ± λ€μν μ°μ μμ μ¬μ© κ°λ₯νλλ‘ μ°κ΅¬κ° νμνλ€.
λ§μΉλ©° ... :)
κΈΈκ³ κΈ΄ ν¬μ€ν μ΄ λλ¬λ€. λ§μ§λ§μ μ΄ν리μΌμ΄μ μ μλ²½νκ² κ΅¬ννμ§λͺ»νμ§λ§, μ΄λ κ²λΌλ AIκ° μ°μ μ μ΄λ»κ² μ μ©λμ΄ μ¬μ©λκ³ , μ΄ν리μΌμ΄μ μ μ΄λ€ κΈ°λ₯μΌλ‘ μ μ©λλμ§μ λν΄μ 곡λΆν΄λ³Ό μ μμλ€. PyQt ν΄λ μ μ νκ³ , μ΄λ₯Ό ν΅ν΄ κ°λ¨ν νλ‘κ·Έλ¨μ ꡬνν μ μλ€λ μ λ μ μ νλ€.
λ§μ§λ§μΌλ‘,,, μ§μ§ μ½ 3κ°μκ°μ κ³ μλμ λͺ¨λ μ λ°°λ€, λͺ¨λ νλ€μ μ μΉκ³ μμν μμ₯ μ¬μ§μ λ§μ§λ§μΌλ‘ ν¬μ€ν λ§λ¬΄λ¦¬μ§κ²λ€!!!!!!!!!!! ν볡νλ°!!!!!!!!!!
λ Έλ ₯μ λ°°μ νμ§ μλλ€ :)