0

画像データがあり、SIFT を使用して機械学習をトレーニングするために使用していますが、データに問題があり、一部の画像には画像記述子が含まれていません。そのため、トレーニングとテストを終えたときの結果は 56% しかありません (もちろん、期待した結果ではありません)。この問題を解決するために、イメージ ディスクリプタが含まれていないイメージをいくつか削除することにしました。ただし、画像記述子を含む images_descriptor 配列からのみ削除できます。ここでの問題は、どの画像を削除する必要があるかわからないため、「ターゲット」を削除できることです。
私のデータには形があります:(15000, 64, 64, 3)

これまでの私のコード:

X = data['data']
y = data['targets']

#Extract image descriptor using sift from X(Which is the data of your images)
images_descriptor = extract_sift_feature(X)

index_list = []
filter_images_descriptor = []
for i in range(len(images_descriptor)):
    if images_descriptor[i] is not None:
        filter_images_descriptor.append(images_descriptor[i])
        
    if images_descriptor[i] is None:
        index = np.where(images_descriptor == images_descriptor[i]) 
        index_list.append(index[0])     
filter_images_descriptor = np.array(filter_images_descriptor)

images_descriptor からインデックスを取得するためのインデックスを作成しようとしていますnp.whereimages_descriptor次に、で削除した画像を削除できyます。しかし、これに対して受け取る結果は次のとおり(array([], dtype=int64)です。

4

1 に答える 1

0

この問題のために、データにある画像の一部に機能が含まれていません。だから、機能のないデータを削除するソリューションを提供します

def extract_sift_feature(X, y):
    images_descriptor = []
    filter_images_descriptor = []
    NoneType_index_list = []
    sift = cv2.SIFT_create()

    for i in range(len(X)):
        _kp, des = sift.detectAndCompute(X[i], None)
        images_descriptor.append(des)
        #Check if there any image has 0 feature descriptor 
        if des is None:
          NoneType_index_list.append(i)
    images_descriptor = np.array(images_descriptor)

    #Filter image any image has 0 feature descriptor 
    for i in range(len(images_descriptor)):
        if images_descriptor[i] is not None:
            filter_images_descriptor.append(images_descriptor[i])
    filter_images_descriptor = np.array(filter_images_descriptor)

    new_y = np.delete(y, NoneType_index_list)
    return filter_images_descriptor, new_y
于 2021-01-15T04:46:09.503 に答える