Beispiel #1
0
    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
Beispiel #2
0
    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