def class3_output(hz_fft3, num_fft3): max_sum = 0 max_index = -1 min_sum = 0 min_index = -1 fft = [] # 最大周波数とピーク数のリストを一つのリストにまとめる for i in range(len(hz_fft3)): fft.append([hz_fft3[i], num_fft3[i]]) fft = np.array(fft) # 最小-1,最大1にリストを正規化 normal_fft = scipy.stats.zscore(fft).tolist() # 正規化されたリストから最小の和と最大の和のリストを抽出 for i in range(len(normal_fft)): sum_fft = normal_fft[i][0] + normal_fft[i][1] if max_sum < sum_fft: max_sum = sum_fft max_index = [normal_fft[i][0], normal_fft[i][1]] if min_sum > sum_fft: min_sum = sum_fft min_index = [normal_fft[i][0], normal_fft[i][1]] #分類対象のデータのリスト。各要素はfloatのリスト vectors = normal_fft #分類対象のデータをクラスタ数3でクラスタリング centers = k_means.clustering_class3(vectors, 3, max_index, min_index) plot_label = [] label = [] for i in normal_fft: label_input = (k_means.near(i, centers)) plot_label.append(label_input) # ノイズではない2分類をまとめる if label_input == 0 or label_input == 1: label.append(0) else: label.append(1) # 各特徴点の平均値をラベルに従いプロットする fft_0x = [] fft_0y = [] fft_1x = [] fft_1y = [] fft_2x = [] fft_2y = [] print(label) for i in range(len(normal_fft)): if label[i] == 0: fft_0x.append(normal_fft[i][0]) fft_0y.append(normal_fft[i][1]) elif label[i] == 1: fft_1x.append(normal_fft[i][0]) fft_1y.append(normal_fft[i][1]) else: fft_2x.append(normal_fft[i][0]) fft_2y.append(normal_fft[i][1]) # figure fig = plt.figure(figsize=(14, 10)) ax = fig.add_subplot(1, 1, 1) # plot ax.scatter(fft_0x, fft_0y, color='g', s=36) ax.scatter(fft_1x, fft_1y, color='b', s=36) ax.scatter(fft_2x, fft_2y, color='r', s=36) plt.title('Method-3', fontsize=36) plt.xlabel('vector in x', fontsize=36) plt.ylabel('vector in y', fontsize=36) plt.tick_params(labelsize=36) plt.savefig('D:/opticalflow/evaluation/plt/class3/' + videoName[:-4] + '_figure.png') return label
def class2_output(hz_fft2, num_fft2): max_sum = 0 max_index = -1 min_sum = 0 min_index = -1 fft = [] # 最大周波数とピーク数のリストを一つのリストにまとめる for i in range(len(hz_fft2)): fft.append([hz_fft2[i], num_fft2[i]]) # numpy配列に変換 fft = np.array(fft) # 最小-1,最大1にリストを正規化 normal_fft = scipy.stats.zscore(fft).tolist() # 正規化されたリストから最小の和と最大の和のリストを抽出 for i in range(len(normal_fft)): sum_fft = normal_fft[i][0] + normal_fft[i][1] if max_sum < sum_fft: max_sum = sum_fft max_index = [normal_fft[i][0], normal_fft[i][1]] if min_sum > sum_fft: min_sum = sum_fft min_index = [normal_fft[i][0], normal_fft[i][1]] #分類対象のデータのリスト。各要素はfloatのリスト vectors = normal_fft #分類対象のデータをクラスタ数3でクラスタリング centers = k_means.clustering_class2(vectors, 3, max_index, min_index) label = [] plot_label = [] for i in normal_fft: label_input = (k_means.near(i, centers)) plot_label.append(label_input) # 0,1:noise→0 2:feature→1 #if label_input==0 or label_input==1: # label.append(0) #else: # label.append(1) label.append(label_input) # 各特徴点をラベルに従いプロットする fft_0x = [] fft_0y = [] fft_1x = [] fft_1y = [] fft_2x = [] fft_2y = [] print(label) for i in range(len(normal_fft)): if label[i] == 0: fft_0x.append(normal_fft[i][0]) fft_0y.append(normal_fft[i][1]) elif label[i] == 1: fft_1x.append(normal_fft[i][0]) fft_1y.append(normal_fft[i][1]) else: fft_2x.append(normal_fft[i][0]) fft_2y.append(normal_fft[i][1]) # figure bairitu = 10 spines = 3 * bairitu fig = plt.figure(figsize=(14 * bairitu, 10 * bairitu)) ax = fig.add_subplot(1, 1, 1) # plot ax.scatter(fft_0x, fft_0y, color='r', s=(360 * bairitu)) ax.scatter(fft_1x, fft_1y, color='g', s=(360 * bairitu)) ax.scatter(fft_2x, fft_2y, color='b', s=(360 * bairitu)) #軸の太さの調整。方向を辞書のキーとして渡し、set_linewidthで大きさを微調整できる ax.spines["top"].set_linewidth(spines) ax.spines["left"].set_linewidth(spines) ax.spines["bottom"].set_linewidth(spines) ax.spines["right"].set_linewidth(spines) #plt.title('Method-2', fontsize=36) plt.xlabel('ベクトル x', fontsize=36 * bairitu, fontname='MS Gothic') plt.ylabel('ベクトル y', fontsize=36 * bairitu, fontname='MS Gothic') plt.tick_params(labelsize=36 * bairitu) plt.savefig('D:/opticalflow/evaluation/plt/class2/' + videoName[:-4] + '_figure.png') return label
def class1_output(k_err, zahyou): x_err = [] y_err = [] err = [] max_err = 0 min_err = 0 max_index = -1 min_index = -1 # 特徴点ごとのx,y座標の絶対誤差をそれぞれ一つの配列にまとめる for i in range(len(k_err)): for j in range(len(k_err[0])): x_err.append(k_err[i][j][0]) y_err.append(k_err[i][j][1]) # 最小-1,最大1で正規化する x_err_normal = scipy.stats.zscore(x_err).tolist() y_err_normal = scipy.stats.zscore(y_err).tolist() # 正規化したx,y座標の絶対誤差のリストを一つのリストにまとめる for i in range(len(x_err)): err.append([x_err_normal[i], y_err_normal[i]]) # リストのx,y座標の和が最大のものを抽出する if max_err < x_err_normal[i] + y_err_normal[i]: max_index = [x_err_normal[i], y_err_normal[i]] # リストのx,y座標の和が最小のものを抽出する elif min_err > x_err_normal[i] + y_err_normal[i]: min_index = [x_err_normal[i], y_err_normal[i]] #分類対象のデータのリスト。各要素はfloatのリスト vectors = err #分類対象のデータをクラスタ数3でクラスタリング centers = cmeans(vectors.T, 3, 2, 0.003, 10000) u = centers[1].T label = u plot_label = u ''' for i in normal_fft: label_input = (k_means.near(i, centers)) plot_label.append(label_input) # 0,1:noise→0 2:feature→1 #if label_input==0 or label_input==1: # label.append(0) #else: # label.append(1) label.append(label_input) ''' # 特徴点ごと実行:フレーム数分k-meansで分類して一番多い分類を採用する label = [] k_err = scipy.stats.zscore(k_err).tolist() zahyou_ave = [] # 分類したデータで各特徴点をクラスタリングする for frame in k_err: tmp = [] sum_x = 0 sum_y = 0 # フレームごとにクラスタリングする for i in frame: tmp.append(k_means.near(i, centers)) sum_x += i[0] sum_y += i[1] # クラスタリングした結果の最頻値をラベル付けする label_input = mode(tmp) # 絶対誤差の平均を計算する zahyou_ave.append([sum_x / len(frame), sum_y / len(frame)]) # 0:noise→0 1,2:feature→1 #if label_input == 2 or label_input == 1: # label_input = 1 #else: # label_input = 0 label.append(label_input) # 一番多い数字をlabelに追加 x0 = [] y0 = [] x1 = [] y1 = [] x2 = [] y2 = [] #print(label) # 各特徴点の平均値をラベルに従いプロットする for index, zahyou_data in enumerate(zahyou_ave): if label[index] == 0: x0.append(zahyou_data[0]) y0.append(zahyou_data[1]) elif label[index] == 1: x1.append(zahyou_data[0]) y1.append(zahyou_data[1]) else: x2.append(zahyou_data[0]) y2.append(zahyou_data[1]) # figure fig = plt.figure(figsize=(14, 10)) ax = fig.add_subplot(1, 1, 1) # plot ax.scatter(x0, y0, color='r') ax.scatter(x1, y1, color='b') ax.scatter(x2, y2, color='g') #plt.title('Method-1', fontsize=36) plt.xlabel('victor in x', fontsize=36) plt.ylabel('victor in y', fontsize=36) plt.tick_params(labelsize=36) # プロットした画像を保存する plt.savefig('D:/opticalflow/cmeans2/plt/class1/' + videoName[:-4] + '_figure.png') return label
def class1_output(k_err, zahyou): x_err = [] y_err = [] err = [] max_err = 0 min_err = 0 max_index = -1 min_index = -1 # 特徴点ごとのx,y座標の絶対誤差をそれぞれ一つの配列にまとめる for i in range(len(k_err)): for j in range(len(k_err[0])): x_err.append(k_err[i][j][0]) y_err.append(k_err[i][j][1]) # 最小-1,最大1で正規化する x_err_normal = scipy.stats.zscore(x_err).tolist() y_err_normal = scipy.stats.zscore(y_err).tolist() # 正規化したx,y座標の絶対誤差のリストを一つのリストにまとめる for i in range(len(x_err)): err.append([x_err_normal[i], y_err_normal[i]]) # リストのx,y座標の和が最大のものを抽出する if max_err < x_err_normal[i] + y_err_normal[i]: max_index = [x_err_normal[i], y_err_normal[i]] # リストのx,y座標の和が最小のものを抽出する elif min_err > x_err_normal[i] + y_err_normal[i]: min_index = [x_err_normal[i], y_err_normal[i]] #分類対象のデータのリスト。各要素はfloatのリスト vectors = err #分類対象のデータをクラスタ数3でクラスタリング centers = k_means.clustering_class1(vectors, 3, max_index, min_index) # 特徴点ごと実行:フレーム数分k-meansで分類して一番多い分類を採用する label = [] k_err = scipy.stats.zscore(k_err).tolist() zahyou_ave = [] # 分類したデータで各特徴点をクラスタリングする for frame in k_err: tmp = [] sum_x = 0 sum_y = 0 # フレームごとにクラスタリングする for i in frame: tmp.append(k_means.near(i, centers)) sum_x += i[0] sum_y += i[1] # クラスタリングした結果の最頻値をラベル付けする label_input = mode(tmp) # 絶対誤差の平均を計算する zahyou_ave.append([sum_x / len(frame), sum_y / len(frame)]) # 0:noise→0 1,2:feature→1 #if label_input == 2 or label_input == 1: # label_input = 1 #else: # label_input = 0 label.append(label_input) # 一番多い数字をlabelに追加 x0 = [] y0 = [] x1 = [] y1 = [] x2 = [] y2 = [] print(label) # 各特徴点の平均値をラベルに従いプロットする for index, zahyou_data in enumerate(zahyou_ave): if label[index] == 0: x0.append(zahyou_data[0]) y0.append(zahyou_data[1]) elif label[index] == 1: x1.append(zahyou_data[0]) y1.append(zahyou_data[1]) else: x2.append(zahyou_data[0]) y2.append(zahyou_data[1]) # figure bairutu = 10 spines = 3 * bairutu fig = plt.figure(figsize=(14 * bairutu, 10 * bairutu)) ax = fig.add_subplot(1, 1, 1) # plot ax.scatter(x0, y0, color='r', s=(360 * bairutu)) ax.scatter(x1, y1, color='g', s=(360 * bairutu)) ax.scatter(x2, y2, color='b', s=(360 * bairutu)) #軸の太さの調整。方向を辞書のキーとして渡し、set_linewidthで大きさを微調整できる ax.spines["top"].set_linewidth(spines) ax.spines["left"].set_linewidth(spines) ax.spines["bottom"].set_linewidth(spines) ax.spines["right"].set_linewidth(spines) #plt.title('Method-1', fontsize=36) plt.xlabel('ベクトル x', fontsize=36 * bairutu, fontname='MS Gothic') plt.ylabel('ベクトル y', fontsize=36 * bairutu, fontname='MS Gothic') plt.tick_params(labelsize=36 * bairutu) # プロットした画像を保存する plt.savefig('D:/opticalflow/evaluation/plt/class1/' + videoName[:-4] + '_figure.png') return label
def class2_output(hz_fft2, num_fft2): max_sum = 0 max_index = -1 min_sum = 0 min_index = -1 fft = [] # 最大周波数とピーク数のリストを一つのリストにまとめる for i in range(len(hz_fft2)): fft.append([hz_fft2[i], num_fft2[i]]) # numpy配列に変換 fft = np.array(fft) # 最小-1,最大1にリストを正規化 normal_fft = scipy.stats.zscore(fft).tolist() # 正規化されたリストから最小の和と最大の和のリストを抽出 for i in range(len(normal_fft)): sum_fft = normal_fft[i][0]+normal_fft[i][1] if max_sum < sum_fft: max_sum = sum_fft max_index = [normal_fft[i][0], normal_fft[i][1]] if min_sum > sum_fft: min_sum = sum_fft min_index = [normal_fft[i][0], normal_fft[i][1]] #分類対象のデータのリスト。各要素はfloatのリスト vectors = normal_fft #分類対象のデータをクラスタ数3でクラスタリング centers = k_means.clustering_class2(vectors, 3, max_index, min_index) label = [] plot_label = [] for i in normal_fft: label_input = (k_means.near(i, centers)) plot_label.append(label_input) # 0,1:noise→0 2:feature→1 #if label_input==0 or label_input==1: # label.append(0) #else: # label.append(1) label.append(label_input) # 各特徴点をラベルに従いプロットする fft_0x = [] fft_0y = [] fft_1x = [] fft_1y = [] fft_2x = [] fft_2y = [] print(label) for i in range(len(normal_fft)): if label[i]==0: fft_0x.append(normal_fft[i][0]) fft_0y.append(normal_fft[i][1]) elif label[i]==1: fft_1x.append(normal_fft[i][0]) fft_1y.append(normal_fft[i][1]) else: fft_2x.append(normal_fft[i][0]) fft_2y.append(normal_fft[i][1]) # figure fig = plt.figure(figsize=(14,10)) ax = fig.add_subplot(1, 1, 1) # plot ax.scatter(fft_0x, fft_0y, color='b', s=36) ax.scatter(fft_1x, fft_1y, color='r', s=36) ax.scatter(fft_2x, fft_2y, color='g', s=36) #plt.title('Method-2', fontsize=36) plt.xlabel('vector in x', fontsize=36) plt.ylabel('vector in y', fontsize=36) plt.tick_params(labelsize=36) plt.savefig(savePath + '/kmeans_class2_' + videoName[:-4] + '.jpg') return label