예제 #1
0
    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
예제 #2
0
    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
예제 #3
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 = 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
예제 #4
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
예제 #5
0
    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