2017-11-19 19 views
1

私はPython(Anaconda3、Ubuntu 16.04)で書かれた深い学習コードを持っています。基本的には、訓練されたモデルに基づいて特定の動画の広告を検出し、動画が広告かどうかを返す必要があります(単発撮影と仮定しています)。現在利用できない私の同僚はこれを書きました。Pythonの単純なTensorflowコードのエラー

元のファイルには、ショットのリストを繰り返し再生する(複数のショット用)ループがありました。この時点では、そのショットが1ショットであると仮定するとループが削除されます。しかし、いくつかの配列サイズが乱れているように見えるので、エラーです。どのように問題を解決する?

私はPythonと深い学習に精通していません。一般的なPythonプログラミングの問題ではなく、直前に正常に機能していたので、意味論ではありません。ここで

は誤りです:

File "/Ad_module_textfast_stream.py", line 36, in label_prediction 
    pred_labels= clf_trained.predict(mfcc_feat.reshape(-1, 200)) 
ValueError: cannot reshape array of size 8640 into shape (200) 

video_audio_extractor(video_name)を呼び出したときに、それが実行する必要があります。ここにコードがあります。今のところfinal_label_listには、ビデオまたは広告の場合に含める必要があります。そして、私はそれが単発的なショットなので、1つの要素だけを含んでいなければならないと思います。以下は

from __future__ import absolute_import 
from __future__ import division 
from __future__ import print_function 
import time, cv2, librosa 
import skvideo.io 
import numpy as np 
import tensorflow as tf 
import subprocess, os, glob 
from sklearn.externals import joblib 



#################################### Loading the Dataset 
def label_prediction(mfcc_list, num_frames= 3): 

    num_shots= len(mfcc_list) 
    pred_labels_list= list() 
    final_label_list= list() 


    if 2>1: 
     clf_trained = joblib.load('trainsvm_mfcc.pkl') 
     #predicted_train_labels= clf_trained.predict(mfcc_list) 

     for j in range(num_shots): 
      mfcc_feat = mfcc_list[j]  
      num_frames= 1 
      mfcc_feat= (mfcc_feat- np.mean(mfcc_feat))/(np.std(mfcc_feat)+ 1e-6) 
    #### now access operation you wanna run 

      #pred_labels= clf_trained.predict(mfcc_feat) 
      pred_labels= clf_trained.predict(mfcc_feat.reshape(-1, 200)) 

      final_label= 0 ## ads:1, and video:0 
      if pred_labels> 0: 
       final_label= 1 

      pred_labels_list.append(pred_labels) 
      final_label_list.append(final_label) 

    ################ post-processing 
    final_label_list[0]= 0 ### video starts with natural content 
    final_label_list[len(final_label_list)-1]= 0 ## last shot 
    for kk in range(2,len(final_label_list)-2): ### one video between many ads, most likely to be ads 
     if final_label_list[kk]==0 and final_label_list[kk-2]==1 and final_label_list[kk-1]==1 and final_label_list[kk+1]==1 and final_label_list[kk+2]==1: 
      final_label_list[kk]= 1 

    return final_label_list, pred_labels_list 


def video_audio_extractor(video_name): 
    cur_video= skvideo.io.vread(video_name) 
    metadata = skvideo.io.ffprobe(video_name) 
    vid_info= metadata["video"] 
    items = list(vid_info.items()) 
    avg_fps_info= items[22][1] 
    avg_fps= int(avg_fps_info[0:2]) 

    cur_num_frame= cur_video.shape[0] 
    cur_audio, cur_sr= librosa.load(video_name) 

    mfcc_list= list() 
    cur_audioshot_mfcc= librosa.feature.mfcc(y= cur_audio, sr= cur_sr, n_mfcc=20) 
    cur_audioshot_mfcc_1d= np.reshape(cur_audioshot_mfcc, [cur_audioshot_mfcc.shape[0]*cur_audioshot_mfcc.shape[1],]) 
    mfcc_list.append(cur_audioshot_mfcc_1d) 
    final_label_list, pred_labels_list= label_prediction(mfcc_list, num_frames= 3) 

    return mfcc_list, avg_fps, final_label_list 

ループのために含まれているため、元のvideo_audio_extractor機能です:

def video_audio_extractor(video_name): 
    cur_video= skvideo.io.vread(video_name) 
    metadata = skvideo.io.ffprobe(video_name) 
    vid_info= metadata["video"] 
    items = list(vid_info.items()) 
    avg_fps_info= items[22][1] 
    avg_fps= int(avg_fps_info[0:2]) 

    cur_num_frame= cur_video.shape[0] 
    cur_audio, cur_sr= librosa.load(video_name) 
    cur_shot_name= 'video_shots.txt' 

    #cur_shot_name= cur_video_name[0:-4]+'_shots.txt' 
    line = list(open(cur_shot_name, 'r')) 

    mfcc_list= list() 
    for shot_ind in range(len(line)): 

     cur_line= line[ shot_ind] 
     cur_line_list= cur_line.split() 
     first_frame= int(cur_line_list[0]) 
     last_frame = int(cur_line_list[1]) 

     cur_audioshot_first_ind= int(np.floor(first_frame*len(cur_audio)/cur_num_frame)) 
     cur_audioshot_last_ind = int(np.floor(last_frame *len(cur_audio)/cur_num_frame)) 
     cur_audioshot= cur_audio[cur_audioshot_first_ind:cur_audioshot_last_ind] 
     new_rate= 5000*cur_sr/len(cur_audioshot) 
     cur_audioshot_resampled = librosa.resample(cur_audioshot, cur_sr, new_rate) 
     cur_audioshot_mfcc= librosa.feature.mfcc(y=cur_audioshot_resampled, sr= new_rate, n_mfcc=20) 
     cur_audioshot_mfcc_1d= np.reshape(cur_audioshot_mfcc, [cur_audioshot_mfcc.shape[0]*cur_audioshot_mfcc.shape[1],]) 
     mfcc_list.append(cur_audioshot_mfcc_1d) 
    return mfcc_list, line, avg_fps 

答えて

1

私は問題が古いvideo_audio_extractorコードはサンプリングレートを変更し、オーディオを再サンプリングしていることだと思います。ここでは、コードです:

new_rate= 5000*cur_sr/len(cur_audioshot) 
cur_audioshot_resampled = librosa.resample(cur_audioshot, cur_sr, new_rate) 
cur_audioshot_mfcc= librosa.feature.mfcc(y=cur_audioshot_resampled, sr= new_rate, n_mfcc=20) 

新しいvideo_audio_extractorは、この新しいレートを使用するか、いずれかのリサンプリングを行いません。そのため、mfcc_featの新しい形状は、旧形状のmfcc_featとは異なります。そのため、おそらく

pred_labels= clf_trained.predict(mfcc_feat) 
+0

を私はそれらの3行をコピーバックする必要があります。この行で

pred_labels= clf_trained.predict(mfcc_feat.reshape(-1, 200)) 

:あなたは次の行を交換する場合はどうなりますか? '(mfcc_feat)'だけで別のエラーが出る:http://text-share.com/view/86fde0f4 – Ariana

+0

私はそれが簡単だとは思わない。 'cur_audioshot_resampled'を計算するには' cur_audioshot'が必要です。新しい関数はその変数を計算しません。私はlibrosaについて何も知らないので、あなたをさらに助けることはできません。 – MatthewScarpino

+0

そして、リサンプル線を追加すると、再びこのエラーが発生します: 'ValueError:2D配列が必要です。代わりに1D配列があります ' – Ariana

関連する問題