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 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] # クラスタリングした結果の最頻値をラベル付けする print(tmp) 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(savePath + '/kmeans_class1_' + videoName[:-4] + '.jpg') return label