본문 바로가기

회고록(TIL&WIL)

TIL 2022.05.20 머신러닝 팀프로젝트(object detection) - 3 (동영상 detect, classification 분류 학습 모델 로드 및 사용법)

동영상 업로드 후 detecting 과정을 거쳐 생성된 동영상 mp4파일이 직접 실행했을 때는 정상적으로 작동하나 웹에서는 전혀 실행되지 않는 현상이 발생되어 영상을 불러오는 경로 값이나 태그에는 전혀 문제가 없었고 오류도 발생되지는 않고 단지 실행이 되지않는 문제가 있었고 원본 영상들이나 해당 원본영상이 업로드되면서 새로 생기는 영상들도 다 정상적으로 작동되나 detecting 된 영상만 웹에서 실행 되지 않아 detecting 과정에서 영상 인코딩 방식 자체가 문제 인 것같아 튜터님에게 여쭤보았다.

detect.py 안의 run()함수 마지막에 결과를 저장하는 코드 중

기존에 mp4v로 설정되어있어 mp4파일로 만들어지는 것은 동일하나 웹상에서 작동되지않아 mp4파일의 또다른 형식인 x264형태로 만들어지도록 설정하니 웹에서도 실행이 잘되는 것을 확인 할수 있었다!

 

동영상이나, 이미지등 여러가지 확장자가 있는 만큼 인코딩과정 때 지정해줄 수 있는 여러가지 확장자 혹은 다른 형식들을 알아두면 좋을 것 같다는 생각이 들었다.

 

object detection 이후 전체적인 함수 호출 코드나, 해석한 것은 추후에 정리해서 저장해둬야겠다

 

 

오늘의 timeattack! - classification 분류 학습 모델 로드 및 사용법

import tensorflow as tf
import numpy as np

# 학습시킨 모델 불러오기 (0이면 고양이, 1이면 강아지)
model = tf.keras.models.load_model('static/model/model.h5')

tensorflow 클래스의 load_model 함수를 이용해서 모델을 간단하게 불러올 수 있다. 최상단에서 임포트 해오고 전역변수로 저장해두는 것이 좋다.

@app.route('/search', methods=['POST'])
def search():
    title = request.form['title_give']
    filenames = os.listdir('static/img/catdog')
    matched_files = ['static/img/catdog/' + filename for filename in filenames if title in filename]
    result_dict = []
    for index, matched_file in enumerate(matched_files):
        image = tf.keras.preprocessing.image.load_img(matched_file, target_size=(256, 256))
        input_arr = tf.keras.preprocessing.image.img_to_array(image)
        input_arr = np.array([input_arr])
        predictions = model.predict(input_arr)
        if predictions[0][0] > 0.5:
            result = '강아지'
        else:
            result = '고양이'
        result_dict.append({'index': index, 'path': matched_file, 'result': result})
    return jsonify({'predictions': result_dict})

저장된 모든 이미지들을 classification하기 위해서 사전작업으로

앞서 filenames변수에 os.listdir()함수를 사용해서 해당 경로에 있는 모든 파일들을 리스트화 시키는 작업이고

filenames에서 한개씩 꺼내서(filename) 각각의 이름이 title이랑 같은지 판별해서 같은 애들만 matched_files에 리스트로 저장되고 enumerate()함수를 이용해서 인덱스 값과 함께 리턴

 

핵심은 tf.keras.preprocessin.image.load_img(matched_file, target_size=256, 256)) > predict할 이미지를 변수에 저장하는 과정인데 받아온 tensorflow의 모델에 맞춰서 이미지를 로드하는 것 target_size도 모델을 학습시킬 때 지정한 크기로 맞춰줘야 한다.

 

그리고 해당 이미지를 배열로 바꿔줘야하는데 input_arr=tf.keras.preprocessing.image.img_to_arry(image) 

해줌으로써 배열로 만들고 또 해당 배열을 tensorflow에서 인식할 수있게 numpy로 변환해줘야한다.

 

그래서 np.array([input_arr])을 작성해서 다시 저장하도록하고 최종적으로 가져온 model에 predcit()함수에 인자로 해당 값을 주면 predict가 끝난 후 값을 리턴하는데 predictions[0][0]의 값을 확인한 것을 보아 여러가지 정보가 리턴이 되는데

 

내일 한번 복습해보면서 직접 값을 한번 찍어보면 어떤 값이 리턴되고 리턴되는 값을 통해 어떤 데이터를 수집할 수 있는지 확인해 볼 수 있겠다.