Urban Sound Classification

뉴욕 대학교 MARL(Music and Audio Research Lab)에서 2014 년에 공개한 UrbanSound8K 데이터를 이용하여 텐서플로우를 사용해 사운드를 분류 모델을 만들어 보았습니다. 텐서플로우 코드는 아퀴브 사이드(Aaqib Saeed)의 블로그를 참고하였습니다.

UrbanSound8K 데이터는 모두 10 가지 종류의 소리를 4 초 가량 녹음한 것으로 8 천개가 넘는 wav 파일들 입니다. 소리의 종류는 ‘air_conditioner’, ‘car_horn’, ‘children_playing’, ‘dog_bark’, ‘drilling’, ‘engine_idling’, ‘gun_shot’, ‘jackhammer’, ‘siren’, ‘street_music’ 입니다. 압축을 풀기 전의 데이터 사이즈가 5 GB 가 넘습니다. 이 데이터를 받기 위해서는 깃허브에서 다운로드 주소를 이용해 다운받을 수 있지만 사용 목적에 대해 알려달라고 합니다.

먼저 wav 파일을 이용해서 피처를 뽑아 내야합니다. 아퀴브 사이드가 사용한 방법은 사운드 분석 파이썬 라이브러리인 librosa 를 이용해서 특성을 추출하였습니다. 사용된 특성은 mfcc(Mel-frequency cepstral coefficients), chroma_stft(chromagram from a waveform or power spectrogram), melspectrogram(Mel-scaled power spectrogram), spectral_contrast(spectral contrast), tonnetz(tonal centroid features) 입니다. 이 데이터를 모두 행으로 늘여 놓으면 총 193 개의 입력 데이터가 만들어 집니다.

오디오 파일이 많다보니 이 데이터를 주피터 노트북에서 생성하고 모델을 만들기가 부담스러운 작업입니다. 별도의 파이썬 스크립트로 입력 데이터를 미리 가공하여 하나의 파일로 합쳐 놓은 urban_sound.npz 파일을 제 깃허브에 올려 놓았습니다. 이 파일은 입력 데이터로 만들어진 넘파이 배열을 파일로 저장해 놓은 것입니다. 특성을 추출하여 npz 데이터를 생성한 코드는 깃허브의 feature_extraction.py 와 feature_merge.py 파일을 참고하세요.

npz 파일을 사용하면 모델을 만들고 테스트할 때 오디오 파일을 매번 가공할 필요 없이 npz 파일로 부터 바로 입력 특성을 로드할 수 있습니다.

sound_data = np.load('urban_sound.npz')

모델 훈련은 20% 를 테스트 데이터로 떼어내고 20% 를 다시 밸리데이션 데이터로 분리하였습니다. 노트북에서 돌리다 보니 속도가 느려 크로스 밸리데이션은 사용하지 않았습니다. 밸리데이션 데이터로 하이퍼파라메타를 적절히 고르고 훈련 데이터와 밸리데이션 데이터를 합쳐서 최종 모델을 훈련시키고 테스트 데이터로 모델을 평가하였습니다.

사용한 뉴럴 네트워크는 완전 연결 뉴럴 네트워크로 3 개의 히든 레이어에 각각 뉴런을 300 개, 200 개, 100 개를 설정하였습니다.

n_hidden_units_one = 300
n_hidden_units_two = 200
n_hidden_units_three = 100

파라메타 초기 값은 입력 데이터의 크기인 193 의 제곱근의 역수를 사용했는데 각 레이어의 히든 유닛 수나 활성화 함수에 맞게 다르게 했으면 더 좋았을 것 같았습니다. 3개의 히든 레이어와 출력 레이어에 대한 텐서플로우 그래프를 아래와 같이 생성하였습니다. 첫번째 세번째의 활성화 함수는 시그모이드를 사용하였고 두번째 활성화 함수는 하이퍼볼릭 탄젠트 함수를 사용했습니다.

X = tf.placeholder(tf.float32,[None,n_dim])
Y = tf.placeholder(tf.float32,[None,n_classes])

W_1 = tf.Variable(tf.random_normal([n_dim, n_hidden_units_one], mean=0, stddev=sd), name="w1")
b_1 = tf.Variable(tf.random_normal([n_hidden_units_one], mean=0, stddev=sd), name="b1")
h_1 = tf.nn.sigmoid(tf.matmul(X, W_1) + b_1)

W_2 = tf.Variable(tf.random_normal([n_hidden_units_one, n_hidden_units_two], mean=0, stddev=sd), name="w2")
b_2 = tf.Variable(tf.random_normal([n_hidden_units_two], mean=0, stddev=sd), name="b2")
h_2 = tf.nn.tanh(tf.matmul(h_1, W_2) + b_2)

W_3 = tf.Variable(tf.random_normal([n_hidden_units_two, n_hidden_units_three], mean=0, stddev=sd), name="w3")
b_3 = tf.Variable(tf.random_normal([n_hidden_units_three], mean=0, stddev=sd), name="b3")
h_3 = tf.nn.sigmoid(tf.matmul(h_2, W_3) + b_3)

W = tf.Variable(tf.random_normal([n_hidden_units_three, n_classes], mean=0, stddev=sd), name="w")
b = tf.Variable(tf.random_normal([n_classes], mean = 0, stddev=sd), name="b")
y_ = tf.nn.softmax(tf.matmul(h_3, W) + b)

비용 함수는 크로스 엔트로피를 사용하고 그래디언트 디센트 옵티마이저를 사용하였습니다. 모델의 반복은 총 6000 회를 진행했습니다. 최종 테스트 결과는 대략 86.7% 의 정확도를 내었습니다.(아래 코드에 Validation accuracy 라고 되어 있는데 최종 테스트 정확도를 계산하면서 수정하지 못했습니다. Test accuracy 라고 이해해 주세요.)

cost_history = np.empty(shape=[1],dtype=float)
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(training_epochs):
        _,cost = sess.run([optimizer, cost_function], feed_dict={X: X_sub, Y: y_sub})
        cost_history = np.append(cost_history,cost)
 
    print('Validation accuracy: ',round(sess.run(accuracy, feed_dict={X: X_test, Y: y_test}) , 3))
    saver.save(sess, "model_321.ckpt")
Validation accuracy:  0.867

비용 값의 감소 그래프를 그려 보면 비교적 요동이 심한 것으로 보입니다. 이 요동의 원인을 잡아낼 수 있다면 좀 더 정확도를 높일 수 있지 않을까 생각됩니다.

urban-sound-learning

다른 곳에서 구한 사운드 데이터로 테스트해 보니 강아지 소리는 잘 구분해 냈는데 드릴 소리는 절반 정도를 구분하지 못했습니다. 드릴 소리를 스트리트 뮤직이라고 판단하는 경우가 많았습니다.

만들어진 모델 파라메타는 model_321.ckpt 파일에 저장하여 깃허브에 올려 놓았습니다. 필요하신 분이 있다면 자유롭게 사용하시고 혹 더 좋은 팁이 있다면 피드백 부탁 드립니다.

 

Urban Sound Classification”에 대한 46개의 생각

  1. 호찬이

    안녕하십니까 선생님. 선생님이 번역하신 텐서플로 첫걸음과 본 블로그를 통해 텐서플로를 공부중인 박찬호라고 합니다. 위 포스팅과 아퀴브 사이드 씨의 블로그를 참고하며 Sound classification 공부를 하는 와중 좀 헷갈리는부분이 몇 있어 도움을 얻고자 글 남깁니다.

    우선 첫째로는 사운드 feature 추출파일인 npz 파일을 선생님께서 만드신 것을 이용해 모델파라미터 파일을 생성하고, 이를이용해 다른곳에서 구해온 사운드파일을이용해 분류를 하였을때 올바른 category를 찾지못한다면, 이를 정정하기 위해 어떻게 해야할까요. 구글링을 통해 얻어온 dog bark wav파일을 car horn으로 분류하는 경우가 좀 잦던데 해당 파일을 추가하여 npz파일을 추가해야 하는것인가요? 추가한다해도 이소리가 car horn이 아닌 dog bark임을 어떻게 훈련시켜야하는지 부분이.. 난해합니다 ..ㅠㅠ urban sound 데이터를 분석해보니 category별로 폴더를 나눈것이 아니더라고요..

    두번째로는 아퀴브씨는 2개의 히든레이어를 사용하였고, 선생님께서는 3개의 히든레이어를 사용하셨는데, 이 아키텍쳐를 뭐라고 분류한다고 알고있어야 하는지가 햇갈립니다. 단순히 Multilayer Neural Network라고 알고있으면되는지요? NN, CNN, RNN처럼 통상적으로 쓰이는 아키텍처 중 정확히 어디에 속하는 것인지요??

    마지막으로는 제가 지금 하고있는게 정확히 머신러닝인 것인지 딥러닝인 것인지.. 모르겠습니다 막무가내로 책과 포스팅을 보며 하고있습니다..

    부디.. 답을 부탁드리겠습니다 ㅠㅠ

    좋아요

    응답
    1. 로드홈 글의 글쓴이

      안녕하세요. 블로그에 들려 주셔서 감사합니다. ^^
      실전에서 dog 소리를 car horn으로 분류하는 경우가 많다면 모델이 그 만큼 잘 일반화되지 못했다고 볼 수 있습니다. 여러가지 이유가 있겠지만 기본적으로 다양하고 충분한 데이터를 공급했을 때 좋은 모델을 만들 수 있습니다. 하지만 한두개의 데이터를 추가해서는 효과를 보기가 어렵습니다. 원하시는 음원 데이터가 충분히 있다면 feature_extraction.py 에 있는 extract_feature 함수를 사용하여 특성을 뽑아내면 제가 만든 입력 데이터(X_data)과 합칠 수 있습니다. 카테고리는 UrbanSound8K_README.txt 파일에 들어있습니다. dog_bark 는 3 이네요.
      여기서 사용한 뉴럴 네트워크는 일반적인 피드 포워드 뉴럴 네트워크입니다. 혹은 완전 연결 뉴럴 네트워크, 멀티 레이어 퍼셉트론, 그냥 뉴럴 네트워크라고도 부릅니다. 굳이 약자를 사용하자면 히든 레이어를 사용했으니 DNN이라고 할 수 있습니다.
      지금 하고 계시는 것은 딥러닝이기도 하고 머신 러닝이기도 합니다. 딥러닝은 뉴럴 네트워크를 사용하는 경우를 말하고 머신 러닝은 딥러닝을 포함하고 있습니다. ^^

      좋아요

      응답
    1. 호찬이

      선생님.. 추가 질문사항이있는데.. 코드부를 추가하여 댓글을 다려니 어떤이유인지 달리지가 않습니다.. 혹시 이메일등 따로 질문을 드릴 루트가 있을까요? ㅠ 선생님 댓글에 대한 댓글, 새로운 댓글 제댓글에 대한 댓글 모두 시도 하여도 추가가 되질않습니다.. ㅠㅠㅠㅠ

      좋아요

      응답
      1. 로드홈 글의 글쓴이

        아 네 워드프레스가 코드를 넣으면 자동으로 스팸처리하더리구요. 블로그 메뉴 about 에 들어가시면 저에게 멜 보내실 수 있습니다.

        좋아요

  2. 윤상연

    현재 텐서플로우쪽 처음 접하면서 배우고 있는 학생입니다. 올리신 깃허브 코드를 통해서, 다른 방식의 파일로 실습을 해보려고 하는데요. 현재 0~9번까지 정해져 있는 소리의 종류를 다른 종류인 음악의 장르나 템포등을 바꿔서, 시중에서 들리는 일반노래를 분류해보려고 하는데요. 그러면 parse_audio_files를 바꿔야 되는건가요? 그리고 올려주신 코드에 UrbanSound8k가 아닌 다른 wav파일을 집어넣었을경우, train_test_split시 test로 데이터가 쏠리고, Classification시 나눠진 train을 Classification_train으로 읽어들이지못해서 계속 groups(0,1)부분이 shape(0,1)이 최소 1의 값을 가져야한다는 value error가 파라미터설정부분부터 계속 에러가 나기에, 어떤 부분을 수정해야하나 궁금하여 질문하게 되었습니다.

    Liked by 1명

    응답
    1. 로드홈 글의 글쓴이

      안녕하세요. 훈련 데이터를 만드는 함수는 parse_audio_files와 extract_feature 함수입니다. 원하시는 특성을 만드시려면 이 파일들을 적당히 가공하시면 될 것 같습니다. 그 아래 문의 주신 내용은 아마도 GroupShuffleSplit에 관한 내용 같은데 정확히 어떤 말씀인지 잘 이해가 안되네요.^^ 좀 더 자세히 알려 주시면 좋을 것 같습니다.

      좋아요

      응답
  3. 정재훈

    feature_extraction.py와 feature_merge.py를 이용해 데이터를 추출했는데
    그 다음에 urban_sound_classifier.py 이걸 이용해 flask run을 하는데 404에러가 떠서질문드립니다.
    제가 서버를 직접 구축하고 flask를 이용해 파일들을 웹 서버에 업로드 하여 테스트를 해야하는건가요?

    좋아요

    응답
    1. 박해선 글의 글쓴이

      로컬 컴퓨터에서 flask 실행 후 브라우저 접속에서 404 에러가 나는 거라면 사용하는 컴퓨터의 로컬 호스트 접속에 제한이 있는지 확인해 보아야 합니다. 이 스크립트는 5000번 포트를 바인딩하도록 되어 있는데요. 필요하다면 적절한 포트로 바꾸고 실행해도 됩니다.

      좋아요

      응답
      1. 정재훈

        선생님 답변 감사합니다! 로컬호스트 접속에 제한이 있는지 확인해 보고싶어서 구글링을 해보았지만 정확한 답변을 얻을 수가 없어서 다시 질문드립니다! 제가 맥북을 사용하고 있는데 어떻게 확인하는지 궁금합니다! 감사합니다.

        좋아요

      2. 정재훈

        해결을 하였습니다! 하지만 파일을 선택하고 업로드를 하는데 Internal Server Error가 뜹니다. 터미널 창은 이렇게 뜨는데 127.0.0.1 – – [09/May/2018 20:51:00] “POST /upload HTTP/1.1” 500 어떻게 해야할지 잘 모르겠어서 질문드립니다!

        좋아요

      3. 박해선 글의 글쓴이

        500 에러면 서버측 스크립트 문제입니다. 즉 urban_sound_classifier.py의 에러입니다. 이 파일을 실행시킨 터미널에서 에러 메세지를 확인해 보시겠어요?

        좋아요

      4. 정재훈

        AttributeError: ‘tuple’ object has no attribute ‘size’ 사이즈 에러가 나는것 같습니다. 텐서플로와 파이썬을 처음 다루어 보는데
        mfccs = extract_feature(audio_file)
        np.array(mfccs)
        print(“mfcc len : ” +str(mfccs.size))
        이부분이 에러가 있다고 하는데 어떻게 해야하나요?

        좋아요

      5. 박해선 글의 글쓴이

        extract_feature 함수가 여러개의 값을 반환하는데 mfccs 한 변수로 받기 때문에 mfccs가 튜플이 되어 버린 것 같습니다. 반환되는 값의 개수에 맞게 변수를 나열해 주시면 될 것 같네요. 어떤 사정인지 모르겠지만 언어와 도구에 먼저 익숙해 지시고 문제 해결을 하시는게 좋을 것 같습니다. 🙂

        좋아요

  4. 이수현

    안녕하세요, 텐서플로 공부를 처음 수행해보는 학생입니다. 다름이 아니라 선생님이 올려주신 깃헙 코드를 기반으로 돌려보고 있는데 urban_sound_classifier를 플라스크를 통해 돌리는 과정에서 에러가 생겨 댓글드립니다.

    현재 feature_extraction 코드와 feature_merge 코드를 돌려서 urban_sound.npz 파일을 만들어 둔 상태고 이후 바로 urban_classifier.py 코드를 수행하려고 하였으나 127.0.0.1:5000 에 접속했더니 404 에러가 발생했습니다.

    이에 포트 바인딩에 문제가 있는 것인지 확인하려고 간단한 hello world 출력 예제로 테스트해보았으나, 해당 예제 코드는 문제 없이 실행되었기 때문에 로컬 호스트의 포트 바인딩 문제는 아니라고 생각됩니다.

    해당 urban_sound_classifier 코드에서는 app.run()이 보이지 않는데 어떻게 flask를 통해 웹 페이지를 돌릴 수 있는 것인지, 올려주신 주피터 노트북 코드(모델 트레이닝)과 해당 코드를 비교해 봤을 때 urban_sound_classifier는 트레이닝을 거치지 않는데 어떻게 웹 페이지를 통해서 모델을 돌리고, 웹 서버에 소리 파일을 전송하면(sound_poster.py) 결과를 받을 수 있는 것인지 궁금합니다.

    번거롭게 해 드려서 죄송합니다. 좋은 하루 되시기를 바랍니다.

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. saver.restore(sess, ‘model_321.ckpt’) 에서 학습된 모델 파라미터를 불러서 준비합니다. 플라스크 서버를 실행할 때 app.run()을 사용할 수도 있고 파일 맨위에 주석에 나온것처럼 환경변수를 지정해서 실행할 수도 있습니다. @app.route(‘/upload’, methods=[‘POST’])로 되어 있으니 127.0.0.1:5000/upload 주소로 POST 요청을 보내 주시면 됩니다. 🙂

      좋아요

      응답
  5. 이수현

    안녕하세요 선생님. 다시 질문을 남기게 되어 죄송합니다. ㅠㅠ 다름이 아니라 feature_extraction 코드와 feature_merge 코드를 수행한 후, urban_classifier.py 코드에 적힌 대로 FLASK_APP을 세팅한 후 flask run을 수행한 후, sound_poster.py를 수행해 봤는데, file not found error가 발생했습니다. app.route에서 upload_file()을 수행해 주는 것으로 알고 있는데, 파일을 로컬 서버에 올리기 위해서 추가적으로 실행해 줘야 하는 코드가 있는 것인지요ㅠㅠ? 답이 도저히 나오지 않아서 실례를 무릅쓰고 질문드립니다. 정말 죄송합니다.ㅜㅜ

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. 질문을 많이 하셔도 실례되지 않습니다.^^ file not found 가 어디에서 나오는지 정확히는 모르겠지만 혹시 sound_poster.py 에서 나는 거라면 open(‘…’, ‘rb’) 가 아닐까 생각되네요. wav 파일의 경로를 정확히 지정해 주셨는지 확인해 보시면 좋을 것 같습니다.

      좋아요

      응답
      1. 이수현

        친절한 답변 감사드립니다. 추가적인 확인차 질문드립니다. app.route를 통해 자동적으로 upload_file()이 수행되는 것이 맞는 것이지요ㅠㅠ? 그 후 sound_poster.py를 수행하면 되는 것이고요. 감사합니다.

        좋아요

      2. 박해선 글의 글쓴이

        안녕하세요. 워드프레스 스팸 방지 기능이 가끔 다른 것도 걸러내더라구요.^^ 서버가 띄워지고 나면 5000번 포트에서 대기 상태에 있게 됩니다. 그다음 sound_poster.py 에서 http://127.0.0.1:5000/upload 로 호출하면, app.route에 등록된 upload_file() 함수가 실행되는 것이 맞습니다.

        좋아요

  6. 강현욱

    안녕하십니까 선생님 저는 선생님의 자료를 기초 5개의 데이터를 분류할려고 합니다 npz 파일과 ckpt파일은 5개의 라벨된 파일로 만들어 졌는데 분류를 할려고 하니까 모양이 10개 되었습니다. 혹시 답을 주실 수 있나여
    InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [100,5] rhs shape= [100,10]
    [[Node: save/Assign_4 = Assign[T=DT_FLOAT, _class=[“loc:@w”], use_locking=true, validate_shape=true, _device=”/job:localhost/replica:0/task:0/device:GPU:0″](w, save/RestoreV2/_3)]]

    좋아요

    응답
    1. 강현욱

      앞의 글은 제가 groups을 빼고 npz를 만들었을 때 Sound Classification.ipynb 에서 그래프 까지 다 나오고 urban_sound_classifier 파일에서 생긴 에러입니다. 사실 쫌 아닌거 같아서
      원래 알려주신대로 진행하면서 저는 5개의 분류 파일을 만드니까 10의 할당되는 값들을 전부 5로 바꿨습니다. 이번엔 잘 되는 가 싶더니 Sound Classification.ipynb 에서 계속 0 이 뜨네요 ㅠㅠ 혹시 답이 있을 까요? 또 train_test_split 파일의 역활은 무엇인가요?

      좋아요

      응답
      1. 박해선 글의 글쓴이

        안녕하세요. 5개의 클래스를 분류하시려면 코드에서 n_classes = 5로 바꾸시면 됩니다. 그리고 준비하신 훈련 데이터의 y_train, y_test의 두 번째 차원이 동일하게 5인지를 확인해 보세요. train_test_split는 가지고 있는 데이터를 훈련과 테스트 용으로 나누어 줍니다. 훈련 데이터와 테스트 데이터 혹은 검증 데이터를 나누는 이유는 ‘해커에게 전해 들은 머시러닝’ 포스트나 머신러닝 관련 도서들을 참고해 주세요. 댓글로 답변 드리긴 너무 길 것 같아요. 편안한 저녁 되세요! 🙂

        좋아요

  7. 강현욱

    늦은 시간에도 답글을 남겨주셔서 감사합니다. 말씀 해주신 것은 이미 확인을 했던 사항입니다. 허허 말씀하신 건 읽어보겠습니다

    좋아요

    응답
  8. 이수현

    안녕하세요 선생님. 저번에 말씀해 주신 대로 수행했더니 소리 분석이 완료되는 것을 볼 수 있었습니다. 친절하게 답변해 주신 것에 대해서 감사드립니다:)

    다름이 아니라, urban sound classification-update라는 글을 보았고 이에 대해서 질문이 있어 다시 답글을 달게 되었습니다. 모델 생성 관련 질문인데요, 저는 urban_sound_classifier 코드를 통해서 모델이 새로 생성되는 것으로 알았는데 파일의 수정한 날짜가 변경되지 않았습니다. 제가 따로 수행해줘야 하는 작업이 존재하나요?

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. urban_sound_classifier.py 에서 모델을 정의하고 학습된 파라미터를 읽어 사용합니다. 업데이트된 파라미터는 model_adam.ckpt 이고 이 파일을 사용하는 스크립트는 urban_sound_classifier2.py 입니다. ^^

      좋아요

      응답
  9. 이수현

    답변 감사합니다. 저는 urban_sound_classifier에서 모델을 새로 생성하는 작업을 수행하고 싶으면 sess.restore 대신에 sess.save를 수행해 주면 되나요? 6000회 iteration에 대한 코드가 보이지 않아 궁금합니다.ㅠㅠ

    좋아요

    응답
      1. 이수현

        앗 주피터 코드를 보지 못했었네요. ㅠㅠ 덕분에 새로운 데이터로 모델을 훈련시키는 작업을 수행할 수 있었습니다 🙂 답변 감사합니다!

        Liked by 1명

  10. 김성훈

    안녕하세요.
    classifier2에서 y_hat이 들어온 값을 분류해주는 것 같은데 0~100 사이의 값이 나오는 것 같습니다.
    이 값의 정확한 의미가 무엇일까요??

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. y_hat은 신경망의 출력값으로 보통 임의의 범위를 가집니다. sigmoid가 0~100 사이의 값을 가지며 10개의 클래스에 대한 확률 값이라고 해석할 수 있습니다. 이 값은 클래스 간에 상대적으로 비교했을 때 어느 클래스가 더 가능성이 높은지를 나타내지만 독립적으로 의미를 부여하긴 어렵습니다. 스크립트에서 sigmoid 함수를 사용했기 때문에 클래스별 확률값을 모두 더하면 1 이상이 됩니다. 조금 더 확률스러운 수치를 얻으려면 주피터 노트북의 코드처럼 소프트맥스 함수를 쓰면 좋습니다. 🙂

      좋아요

      응답
  11. 이수현

    안녕하세요 선생님, 오랜만에 댓글 답니다. 다름이 아니라 선생님이 기존에 올려주신 주피터 노트북 코드를 보다가 주피터 노트북에 있는 두 코드인 urban_sound_classifier 코드와 urban_sound_classifier_train 코드의 차이점이 궁금하여 질문드리고 싶습니다.

    저는 맨 처음에는 train 코드만 수행하면 되는 것으로 생각하고 해당 주피터 노트북 코드를 수행한 후 urban_sound_classifier2를 수행했더니 해당 모델에서 ‘b’ 키워드를 찾을 수 없다는 에러가 떠서 그 후에 코드 분석을 진행하다가 urban_sound_classifier(주피터 노트북에 있는)에서 생성하는 텐서의 형태가 urban_sound_classifier2에서 restore하는 텐서의 형태와 같다는 것을 발견하고 해당 주피터 노트북의 코드를 수행하니 소리 분석이 진행되었거든요.

    하지만 제가 이해하기로는 urban_sound_classifier와 urban_sound_classifier_train이 서로 수행하는 역할이 다른 것 같은데 두 코드를 둘 다 실행해줘야 맞는 건지 아닌지를 잘 모르겠습니다.

    번거롭게 해 드려서 죄송합니다. ㅜㅜ 좋은 주말 되시기를 바랍니다.

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. Urban Sound Classification-Train.ipynb 노트북에서 훈련한 모델 파라미터가 model_adam.ckpt 파일에 들어 있습니다. 이 파일을 사용하는 파일이 urban_sound_classifier2.py입니다. 두 노트북이 다른 모델을 만들기 때문에 urban_sound_classifier2.py만 사용한다면 두 개를 모두 실행할 필요는 없습니다.

      좋아요

      응답
      1. 이수현

        앗 감사합니다 선생님! 번거롭게 해 드려 죄송합니다ㅠㅠ 좋은 저녁 되시길 바랍니다

        좋아요

  12. 명한민

    선생님 지금 8개의 카테고리가 있는 소리들을 classification 하려고 하는데 선생님께서 만들어놓으신 데이터와 제가 수집한 데이터를 합치려고 합니다. 하지만 파일의 시간대는 4초로 동일하나 파일의 크기가 다릅니다. 이런경우는 어떻게 해야 되는지 알려주실 수 있으신지요?

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. 이 예에서는 librosa 를 이용하여 고정 크기의 특성을 추출했습니다. 자세한 내요은 깃허브의 feature_extraction.py를 참고하세요.

      좋아요

      응답
  13. 김여진

    안녕하세요, 본 포스팅으로 feature extraction 부분부터 공부하고 있는 한 학생입니다.
    혹시 extract_feature 함수에서 왜 librosa.feature.mfcc 값을 바로 output하지 않고 mean값을 취해서 출력하는지 알 수 있을까요?

    좋아요

    응답
  14. Haneul

    안녕하세요! 본 포스팅 참고하면서 classification 공부하고 있는 학생입니다. 우선 좋은 글 감사드립니다.
    UrbanSound8K 데이터셋에는 10개의 레이블이 존재하는데, 혹시 특정 레이블(예: ‘gun_shot’)만 제외하고 9개 레이블로만 분류 모델를 만드는 방법이 있을까요?

    좋아요

    응답
  15. dae kyeon

    안녕하세요! 본 포스팅과 깃허브 참조하면서 여러모로 공부하고 있는 학생입니다 그런데 아무리 어반사운드8k를 다운받고 feature.py와 합쳐서meray py를 파이참에서 구동시키는건가요? 제가 잘 못하는건지 test.npz, train.npz를 만들수가 없고 이걸 또 다시 컨벌루션으로 응용도 해보고 음원 탐지에도 쓰고 싶은데 잘 안되어서 글 남겨봅니다 감사합니다

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. 이 글은 작성한지 오래되었습니다. 현재 텐서플로 버전과 맞지 않기 때문에 제대로 동작하지 않습니다. 코드를 사용하는 것은 자유이지만 제가 문제 해결을 도와드리기는 어렵습니다. 양해 부탁드립니다. 감사합니다.

      좋아요

      응답

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.