환경 소리 분류

우리는 이미 기계 학습, 분류와 회귀의 기초 지식을 이해했다.본고에서 우리는 어떻게 오디오 분류를 진행하는지 깊이 있게 연구할 것이다.우리는 이 임무를 위해 권적신경망, 다층감지기, 지원 벡터기를 훈련할 것이다.같은 코드도 다른 분류 모델을 훈련하는 데 쉽게 확장할 수 있다.나는 당신이 분류의 기초에 관한 문장을 읽을 것을 강력히 건의합니다. 만약 당신이 아직 이렇게 하지 않았다면.
이곳의 주요 문제는 우리가 어떻게 오디오 파일을 처리하고 그것을 하나의 형식으로 바꾸는가이다. 우리는 그것을 우리의 신경 네트워크에 입력할 수 있다.
그것은 첫 번째 작업의 오디오 분류기를 설정하고 얻는 데 1시간도 걸리지 않을 것입니다!시작합시다!😉

의존항


우리는python을 사용할 것이다.인코딩을 시작하기 전에 우리는 다음과 같은 모듈이 필요하다.이것은 pip를 사용하여 쉽게 다운로드할 수 있다.
  • 콜라스
  • librosa
  • 음향 장치
  • 사운드 파일
  • scikit 학습
  • matplotlib
  • 데이터 세트


    ESC-10 데이터 세트를 사용하여 사운드 분류를 수행합니다.이것은 라벨이 있는 400개의 환경 기록 (10시간, 시간당 40부분, 시간당 5초) 이다.그것은 비교적 큰 값ESC-50 dataset의 서브집합이다
    클래스당 40개가 포함됩니다.ogg 파일.ESC-10 및 ESC-50 데이터 세트는 동일한 원본 소스 레코드에서 추출한 클립이 항상 단일 축소에 포함될 수 있도록 5개의 크기로 균일하게 축소되도록 미리 설정되어 있습니다.

    시각화된 데이터 세트


    특징과 훈련 모델을 추출하기 전에 가시화 데이터가 집중적으로 존재하는 서로 다른 유형의 파형이 필요하다.
    import matplotlib.pyplot as plt
    import numpy as np
    import wave
    import soundfile as sf
    
    다음 함수visualize_wav()는ogg 파일을 가져와 소리 파일 모듈로 읽고 데이터와 샘플링률을 되돌려줍니다.우리는 sf.wav() 함수를 사용하여 상응하는ogg 파일에wav 파일을 쓸 수 있다.matplotlib를 사용하여 신호파가 시간에 따라 변화하고 그림을 만들었습니다.
    def visualize_wav(oggfile):
    
        data, samplerate = sf.read(oggfile)
    
        if not os.path.exists('sample_wav'):
            os.mkdir('sample_wav')
    
        sf.write('sample_wav/new_file.wav', data, samplerate)
        spf = wave.open('sample_wav/new_file_Fire.wav')
        signal = spf.readframes(-1)
        signal = np.fromstring(signal,'Int16')
    
        if spf.getnchannels() == 2:
            print('just mono files. not stereo')
            sys.exit(0)
    
        # plotting x axis in seconds. create time vector spaced linearly with size of audio file. divide size of signal by frame rate to get stop limit
        Time = np.linspace(0,len(signal)/samplerate, num = len(signal))
        plt.figure(1)
        plt.title('Signal Wave Vs Time(in sec)')
        plt.plot(Time, signal)
        plt.savefig('sample_wav/sample_waveplot_Fire.png', bbox_inches='tight')
        plt.show()
    
    
    
    개 짖는 소리의 파형도
    같은 코드를 실행하여 서로 다른 클래스를 위한 파형도를 생성하고 차이를 가시화할 수 있습니다.

    특징 추출


    데이터가 집중된 각 오디오 파일에 대해 MFCC(mel 주파수 스펙트럼 - 각 오디오 샘플에 이미지 표시)와 분류 라벨을 추출합니다.이를 위해 Librosa의 mfcc() 함수를 사용합니다. 이 함수는 시간 시퀀스 오디오 데이터에서 MFCC를 생성합니다.get_features() 채택.ogg 파일과 Librosa 라이브러리를 사용하여 mfcc를 추출합니다.
    def get_features(file_name):
    
        if file_name: 
            X, sample_rate = sf.read(file_name, dtype='float32')
    
        # mfcc (mel-frequency cepstrum)
        mfccs = librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=40)
        mfccs_scaled = np.mean(mfccs.T,axis=0)
        return mfccs_scaled
    
    데이터 세트는 폴더 "dataset"에 다운로드됩니다.우리는 하위 디렉터리 (클래스마다) 를 훑어보고ogg 파일에서 특징을 추출할 것입니다.마지막으로, 우리는 mfcc 특징과 상응하는 클래스 라벨을 가진 데이터 프레임을 만들 것이다.
    def extract_features():
    
        # path to dataset containing 10 subdirectories of .ogg files
        sub_dirs = os.listdir('dataset')
        sub_dirs.sort()
        features_list = []
        for label, sub_dir in enumerate(sub_dirs):  
            for file_name in glob.glob(os.path.join('dataset',sub_dir,"*.ogg")):
                print("Extracting file ", file_name)
                try:
                    mfccs = get_features(file_name)
                except Exception as e:
                    print("Extraction error")
                    continue
                features_list.append([mfccs,label])
    
        features_df = pd.DataFrame(features_list,columns = ['feature','class_label'])
        print(features_df.head())    
        return features_df
    
    

    열차 모형


    일단 우리가 특징을 추출하면, 우리는 그것을 신경 네트워크에 피드백하기 위해numpy 진열로 전환해야 한다.
    def get_numpy_array(features_df):
    
        X = np.array(features_df.feature.tolist())
        y = np.array(features_df.class_label.tolist())
        # encode classification labels
        le = LabelEncoder()
        # one hot encoded labels
        yy = to_categorical(le.fit_transform(y))
        return X,yy,le
    
    Xyy는 80-20의 비율에 따라 열차와 테스트 데이터로 분해된다.
    def get_train_test(X,y):
    
        X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.2, random_state = 42)
        return  X_train, X_test, y_train, y_test
    
    
    이제 우리는 우리의 모델 구조를 정의할 것이다.Keras를 사용하여 다중 감지기 네트워크를 생성합니다.
    def create_mlp(num_labels):
    
        model = Sequential()
        model.add(Dense(256,input_shape = (40,)))
        model.add(Activation('relu'))
        model.add(Dropout(0.5))
    
        model.add(Dense(256,input_shape = (40,)))
        model.add(Activation('relu'))
        model.add(Dropout(0.5))
    
        model.add(Dense(num_labels))
        model.add(Activation('softmax'))
        return model
    
    일단 모델을 정의한다면, 우리는 손실, 지표, 최적화기를 정의하여 그것을 컴파일해야 한다.그리고 모델을 훈련 데이터X_trainy_train에 맞춘다.우리의 모형은 100개 시대를 훈련시켰는데, 대량의 크기는 32이다.훈련된 모형은 최종적으로 로 저장됩니다.하드디스크의hd5 파일입니다.이 모델은 잠시 후에 불러와서 예측할 수 있다.
    
    def train(model,X_train, X_test, y_train, y_test,model_file):    
    
        # compile the model 
        model.compile(loss = 'categorical_crossentropy',metrics=['accuracy'],optimizer='adam')
    
        print(model.summary())
    
        print("training for 100 epochs with batch size 32")
    
        model.fit(X_train,y_train,batch_size= 32, epochs = 100, validation_data=(X_test,y_test))
    
        # save model to disk
        print("Saving model to disk")
        model.save(model_file)
    
    그렇습니다!우리는 이미 우리의 환경 음성 분류기를 훈련시켰다!!😃

    계산 정밀도


    지금, 분명히 우리는 우리의 모델이 얼마나 잘 표현되었는지 검사하고 싶다😛
    def compute(X_test,y_test,model_file):
    
        # load model from disk
        loaded_model = load_model(model_file)
        score = loaded_model.evaluate(X_test,y_test)
        return score[0],score[1]*100
    
    Test loss 1.5628961682319642
    Test accuracy 78.7
    

    예측하다


    우리는 또한 아래의 코드를 사용하여 우리가 제공한 모든 입력 파일의 클래스 라벨을 예측할 수 있다 -
    def predict(filename,le,model_file):
    
        model = load_model(model_file)
        prediction_feature = extract_features.get_features(filename)
        if model_file == "trained_mlp.h5":
            prediction_feature = np.array([prediction_feature])
        elif model_file == "trained_cnn.h5":    
            prediction_feature = np.expand_dims(np.array([prediction_feature]),axis=2)
    
        predicted_vector = model.predict_classes(prediction_feature)
        predicted_class = le.inverse_transform(predicted_vector)
        print("Predicted class",predicted_class[0])
        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') )
    
    이 함수는 우리가 미리 훈련한 모델을 불러와서 당신이 제공한 입력ogg 파일에서 mfcc를 추출하고 모든 종류의 확률 범위를 출력합니다.확률이 가장 큰 것은 우리가 원하는 종류다!😃
    dog류의 예시ogg 파일에 대해 다음과 같은 확률 예측-
    Predicted class 0
    0                :  0.96639919281005859375000000000000
    1                :  0.00000196780410988139919936656952
    2                :  0.00000063572736053174594417214394
    3                :  0.00000597824555370607413351535797
    4                :  0.02464177832007408142089843750000
    5                :  0.00003698830187204293906688690186
    6                :  0.00031352625228464603424072265625
    7                :  0.00013375715934671461582183837891
    8                :  0.00846461206674575805664062500000
    9                :  0.00000165236258453660411760210991
    
    
    예측된 클래스는 0, 클래스 라벨은 Dog이다.

    결론


    오디오 파일을 처리하는 것은 듣기처럼 그렇게 어렵지 않다.오디오 파일은 시간 시퀀스 데이터의 형식으로 쉽게 표시할 수 있다.우리는python에서 라이브러리를 미리 정의했습니다. 이것은 우리의 임무를 더욱 간단하게 합니다.
    너도 나의 Github repo에서 이 방면의 전체 코드를 검사할 수 있다.여기서 저는 같은 데이터 집합을 위해 SVM, MLP, CNN을 훈련시켰고 코드는 적당한 파일에 배치되어 이해하기 쉽습니다.
    https://github.com/apoorva-dave/Environmental-Sound-Classification
    나는 이 때문에 세 가지 다른 모델을 훈련시켰지만 그것들 사이의 정확성 차이는 매우 적다.만약 네가 이 점수를 높일 방법을 생각한다면 반드시 평론을 남겨야 한다.
    만약 네가 이 문장을 좋아한다면, 반드시 좀 보여줘야 한다❤ 더 많은 관심 부탁드립니다!그때까지 즐겁게 공부하다😸

    좋은 웹페이지 즐겨찾기