스마트 인재개발원/3차프로젝트

(광주인공지능학원) 3차프로젝트 파이썬 멀티쓰레드 & CNN 신생아 울음소리 분석(2)

광주인공지능학원 스마트인재개발원에서의 3차프로젝트를... 밤을 새가며 하고있다.

그 와중에 광주인공지능학원과 별개로 스스로 면접지원하여 3군데에 합격도 했고 최종면접만 남았다.

광주인공지능학원 스마트인재개발원에서 기업도 추천해주셨지만 개인적으로 인공지능 개발자로 가고 싶기에 개인적으로 서류를 냈는데 모두 합격했다.

아마 광주인공지능 스마트인재개발원에서 받은 상장과 프로젝트가 한몫 한것 같다. 

CNN 모델링을 좀 더 해볼까 한다. 

기존 MLP와 달리 CNN 2D 사용하려면 4차원데이터의 피쳐추출이 이루어져야한다

다음 소스는 3차원데이터로 피쳐가 추출 된다

max_ped_len = 271
test_num = 0

def extract_features2(file_name):
    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_ped_len - mfccs.shape[1]
    mfccs = np.pad(mfccs, pad_width=((0, 0), (0, pad_width)), mode='constant')

    return mfccs
# 데이터셋 path 지정
audio_dataset_path ='room_data'
matadata=pd.read_csv('room_data/result.csv')

# 각 소리에 대해 feature를 추출
features = []
for index, row in metadata.iterrows():
    
    file_name = os.path.join(os.path.abspath(audio_dataset_path), 'fold' + str(row["fold"])+'\\', str(row["slice_file_name"]))
    
    class_label = row["class"]
    data = extract_features2(file_name)
    
    features.append([data, class_label])

featuresdf = pd.DataFrame(features, columns = ['feature', 'class_label'])

print("Finished feature extraction from ", len(featuresdf), 'files')

featuresdf

X = np.array(featuresdf.feature.tolist())
y = np.array(featuresdf.class_label.tolist())

le = LabelEncoder()
yy = to_categorical(le.fit_transform(y))
x_train, x_test, y_train, y_test = train_test_split(X, yy, test_size = 0.2, random_state = 42)
num_rows = 40
num_columns = 271
num_channels = 1

print("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)

3차원 데이터를 4차원으로 변환해준다.

모델설계는 이렇게 진행하였고

광주인공지능학원 스마트인재개발원 강성관 실장님이 CNN에 대한 조언을 주셨다.

과적합 없이 데이터가 깔끔하게 나왔다, 그런데 문제점은 데이터가 너무 작아 아마 잘 나왔을 수도 있겠다.

predict도 거의.. 99%로 잘나온다. 실제 실시간 레코드 했을때 어느정도의 정확도가 나올지 한번 테스팅이 필요하다.

라즈베리파이로 연동을 해야한다.

광주인공지능학원 스마트인재개발원에서는 라즈베리파이를 지원해주기 때문에 필요한 모듈만 추가 구매하면 될 것 같다.

스레드

  • 프로세스 내에 실행 흐름 단위입니다.
  • 쓰레드는 프로세스에 할당된 메모리, CPU 등의 자원을 사용합니다.
  • Stack만 별도의 메모리를 할당하며 Code, Data, Heap은 쓰레드간 공유합니다.
  • 한 스레드의 결과가 다른 스레드에 영향 끼칩니다. 크롬 하나의 탭에 문제가 생기면 없으면 크롬 자체를 다시 실행해야 하는 경우가 있습니다.
  • 스레드의 경우 디버깅이 어렵기에 동기화 문제는 주의해서 구현해야합니다.

멀티 스레드

  • 한 개의 단일 어플리케이션(응용프로그램)은 여러 스레드로 구성 후 작업 처리해야합니다.
    • 한글에서 싱글 스레드를 사용한다면 프린트를 하는 경우 문서 수정은 불가능할 것입니다.
  • 프로세스를 생성하는 것은 고비용입니다. 스레드를 사용한다면 시스템 자원 소모 감소 및 처리량 증가시킬 수 있습니다.
  • 쓰레드는 이미 공유하고 있기에 프로세스를 사용했다면 생길 통신 부담이 감소합니다.
  • 멀티 스레드를 사용할 경우 디버깅이 어렵습니다. 자원 공유 문제(일명 교착상태)가 생깁니다.
  • logging.basicConfig는 log 형식을 지정하기 위해서 정의한 코드입니다.
  • threading.Thread 란?
    • Target: 스레드가 실행할 함수(일명 callable object)를 지정해줍니다. 여기서는 work 함수를 실행합니다.
    • args: 함수에 넘길 인자입니다. work함수의 name에 인자 값으로 "A"를 줍니다.
  • .start() 호출할 경우 스레드 활동을 시작합니다.

 

  • [1] a.start()가 실행되면 스레드 활동이 시작됩니다.
  • [2] Sub Thread A는 sleep(3)이 실행되면 3초 실행을 멈춥니다.
  • [3] Sub Thread가 멈춘 사이 Main Thread는 종료됩니다.
  • [4] Sub Thread가 종료됩니다.

 

  • 2. 쓰레드 + join()
    Main이 종로되지 않고 실행하는 스레드가 종료 될 때까지 기다리게 하는 방법이 있습니다. 바로 join()을 사용하는 것입니다. join() 메서드가 호출된 스레드가 종료될 때까지 호출하는 스레드를 블록 합니다. 즉 Main Thread에서 Sub Thread를 join한다면 Sub Thread가 종료될때까지 기다립니다.

3. 데몬스레드

3-1. 데몬쓰레드란?

데몬스레드는 카카오 첫 공채 블라인드 2차 필기 시험에 나온 주제입니다. 지금까지 Sub Thread는 Main Thread가 종료되더라도 끝까지 실행되거나 심지어 Main Thread가 Sub Thread가 종료되기를 기다리게 할 수 있었습니다. 그러나 데몬쓰레드는 Main Thread가 종료되면 즉시 종료되는 스레드입니다.

 

  • 백그라운드에서 실행하는 스레드입니다.
  • 메인스레드 종료시 즉시 종료됩니다.
  • 워드에서 자동저장 기능을 데몬 스레드로 만들 수 있습니다. 워드를 종료하면 자동저장 데몬 스레드는 바로 소멸됩니다.
  • 데몬 스레드가 아닌 일반 스레드는 작업 종료시 까지 실행됩니다.

현재 구현한 쓰레드는 다음과 같다

구현에는 광주인공지능학원 이상준연구원님이 도움을 주셨다,

광주인공지능학원에서의 프로젝트는 1차 2차프로젝트를 거치면서 뭔가 3차가 준비가 조금씩 자연스러워졌다.

다음 포스팅에서는 멀티쓰레딩 완성본과 플라스크 관련 기술이 될 것 같다

"스마트인재개발원에서 진행된 수업내용입니다"

https://www.smhrd.or.kr/

 

스마트인재개발원

4차산업혁명시대를 선도하는 빅데이터, 인공지능, 사물인터넷 전문 '0원' 취업연계교육기관

www.smhrd.or.kr