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:
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
Xếp chồng tất cả các mô tả tính năng vào một danh sách lớn
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
Đố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
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).
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.
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)))
BOVW
chức năng, cho mục đích thử nghiệm không?