Túi từ ngữ trực quan


7

Những gì tôi đang cố gắng làm:

Tôi đang cố gắng phân loại một số hình ảnh bằng cách sử dụng các tính năng địa phương và toàn cầu.

Những gì tôi đã làm cho đến nay:

Tôi đã trích xuất các mô tả sàng lọc cho mỗi hình ảnh và tôi đang sử dụng nó làm đầu vào cho phương tiện k để tạo từ vựng của tôi từ tất cả các tính năng của mỗi hình ảnh. Từ đây tôi tạo một biểu đồ từ các cụm của mình cho mỗi hình ảnh bằng cách chuyển các tính năng sàng lọc hình ảnh sang phương thức dự đoán theo phương tiện k cho tôi các nhãn của cụm. Từ đây tôi tạo biểu đồ bằng cách đếm số lượng nhãn cho mỗi thùng. Bây giờ tôi có một ma trận nxm trong đó n là số lượng hình ảnh và m là số cụm (tính năng / từ) của mỗi hình ảnh.

Tôi sẽ cung cấp ma trận này cho một bộ phân loại để có được phân loại hình ảnh của tôi.

Các bước trong một tóm tắt:

  1. Trích xuất các mô tả tính năng sàng lọc cung cấp cho chúng ta ma trận nx128 cho mỗi hình ảnh

  2. Xếp chồng tất cả các mô tả tính năng vào một danh sách lớn

  3. Lắp tất cả các tính năng này vào cài đặt thuật toán kmeans k = 100

  4. Đối với mọi hình ảnh, hãy sử dụng các tính năng sàng lọc của nó để dự đoán nhãn của các cụm sử dụng cùng một mô hình kmeans được đào tạo

  5. Tạo biểu đồ từ các cụm sử dụng k làm số thùng, thêm 1 vào thùng cho mỗi nhãn trong mô hình. (nếu một hình ảnh có 10 tính năng từ sàng lọc, nó sẽ cung cấp cho chúng tôi 10 nhãn, 10 nhãn này sẽ nằm trong phạm vi k, vì vậy với mỗi nhãn, chúng tôi sẽ thêm nó vào thùng tương ứng cho biểu đồ của chúng tôi).

  6. Bây giờ chúng ta có một ma trận nxk, trong đó n là số lượng hình ảnh và k là số lượng cụm.

  7. Bây giờ chúng tôi cung cấp các biểu đồ cho một bộ phân loại và yêu cầu nó dự đoán về dữ liệu thử nghiệm.

Vấn đề:

Tôi có thực hiện chính xác túi từ ngữ trực quan?

Đây là mã của tôi:

def extract_features(df):
    IF = imageFeatures()
    global_features = []
    sift_features = []
    labels = []
    for i, (index, sample) in enumerate(df.iterrows()):
        image = cv2.imread(sample["location"])
        image = cv2.resize(image, shape)
        hist = IF.fd_histogram(image)
        haralick = IF.fd_haralick(image)
        hu = IF.fd_hu_moments(image)
        lbp = IF.LocalBinaryPatterns(image, 24, 8)
        kp, des = IF.SIFT(image)
        if len(kp) == 0:
            #print (i)
            #print (index)
            #print (sample)
            #return 0
            des = np.zeros(128)
        sift_features.append(des)
        global_feature = np.hstack([hist, haralick, hu, lbp])
        global_features.append(global_feature)
        labels.append(sample["class_id"])
    scaler = MinMaxScaler(feature_range=(0, 1))
    rescaled = scaler.fit_transform(global_features)
    return sift_features, rescaled, labels

def BOVW(feature_descriptors, n_clusters = 100):
    print("Bag of visual words with {} clusters".format(n_clusters))
    #take all features and put it into a giant list
    combined_features = np.vstack(np.array(feature_descriptors))
    #train kmeans on giant list
    print("Starting K-means training")
    kmeans = MiniBatchKMeans(n_clusters=n_clusters, random_state=0).fit(combined_features)
    print("Finished K-means training, moving on to prediction")
    bovw_vector = np.zeros([len(feature_descriptors), n_clusters])#number of images x number of clusters. initiate matrix of histograms
    for index, features in enumerate(feature_descriptors):#sift descriptors in each image
        try:
            for i in kmeans.predict(features):#get label for each centroid
                bovw_vector[index, i] += 1#create individual histogram vector
        except:
            pass
    return bovw_vector#this should be our histogram

if __name__ == '__main__':
    n_clusters = 100
    #set model
    model = GaussianNB()
    image_list = pd.read_csv("image_list.csv")
    image_list_subset = image_list.groupby('class_id').head(80)#image_list.loc[(image_list["class_id"] == 0) | (image_list["class_id"] == 19)]
    shape = (330,230)
    train, test = train_test_split(image_list_subset, test_size=0.1, random_state=42)

    train_sift_features, train_global_features, y_train = extract_features(train)
    train_histogram = BOVW(train_sift_features, n_clusters)
    import matplotlib.pyplot as plt
    plt.plot(train_histogram[100], 'o')
    plt.ylabel('frequency');
    plt.xlabel('features');

    test_sift_features, test_global_features, y_test = extract_features(test)
    test_histogram = BOVW(test_sift_features, n_clusters)

    '''Naive Bays'''
    y_hat = model.fit(train_histogram, y_train).predict(test_histogram)
    print("Number of correctly labeled points out of a total {} points : {}. An accuracy of {}"
          .format(len(y_hat), sum(np.equal(y_hat,np.array(y_test))), 
                  sum(np.equal(y_hat,np.array(y_test)))/len(y_hat)))

4
Nếu bạn downvote, xin vui lòng giải thích tại sao.
Kevin

Tôi không downvote, nhưng sẽ rất hữu ích khi biết lý do tại sao bạn nghĩ rằng có gì đó không đúng với mã. Bạn đang yêu cầu đánh giá mã chung (có thể đánh vào đường biên ngoài chủ đề)? Bạn có thể cung cấp một số đầu vào mẫu cho BOVWchức năng, cho mục đích thử nghiệm không?
E_net4 the Rustacean

@ E_net4 Tôi đang cố gắng đảm bảo rằng tôi có khái niệm chính xác. Lý do là BOVW dường như không thực sự cải thiện kết quả nhiều. Có thể có nhiều lý do cho việc này, có thể dữ liệu không tốt hoặc tôi không có đủ cụm hoặc có thể các tính năng của tôi không tốt. Tôi chỉ muốn đảm bảo rằng cách tiếp cận của tôi là chính xác. Tôi có thể cung cấp một ví dụ ngắn gọn hơn, nhưng tôi cũng phải cung cấp dữ liệu. Có cách nào để tôi làm điều này? Có lẽ tôi có thể tạo ra một số dữ liệu bằng cách sử dụng numpy?
Kevin

Ông có thể cho chúng tôi biết những gì đang so sánh hiệu suất với? Và những dữ liệu bạn đang sử dụng?
Tony Knapp

Câu trả lời:


1

Cách tốt nhất để trả lời câu hỏi của bạn là đi đến bài báo gốc giới thiệu phương pháp:

"Phân loại trực quan với các túi điểm" (2004)

Bài viết không dài và được viết theo cách dễ hiểu. Đối với câu hỏi của bạn, bạn chỉ có thể đọc 6 trang đầu tiên.

Lấy từ bài viết "Phân loại trực quan với các túi điểm chính":

Các bước chính của phương pháp của chúng tôi là:

• Phát hiện và mô tả các bản vá hình ảnh

• Gán các mô tả bản vá cho một tập hợp các cụm được xác định trước (từ vựng) với thuật toán lượng tử hóa vectơ

• Xây dựng một túi các điểm chính, trong đó đếm số lượng các bản vá được gán cho mỗi cụm

• Áp dụng trình phân loại nhiều lớp, coi túi các điểm chính là vectơ đặc trưng và do đó xác định danh mục hoặc danh mục nào sẽ gán cho hình ảnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.