Fisher Vector چیست؟
Fisher Vector Encoding یک روش برای تبدیل داده های تصویری به بردارهای ویژگی است که برای طبقه بندی تصاویر و بازیابی تصویر به کار می رود. این روش بر اساس توزیع احتمال مشتق پارامترهای مدل آماری از داده های تصویری است. درست است که امروزه برای داده های تصویری دیپلرنینگ حرف اول را میزند، اما این روش برای داده های کم یا برای کارهای مثل بازیابی تصویر هنوز کارامد است.
مراحل Fisher Vector Encoding:
- استخراج ویژگی: ابتدا از الگوریتم های استخراج ویژگی مانند SIFT یا SURF برای استخراج ویژگی های محلی از تصویر استفاده می شود.
- تشکیل مدل آماری: سپس از یک مدل آماری مانند مخلوط گاوسی (GMM) برای تخمین توزیع احتمال ویژگی های محلی استفاده می شود.
- محاسبه مشتق پارامترها: مشتق پارامترهای مدل آماری نسبت به داده های تصویری محاسبه می شود.
- تشکیل بردار Fisher: مشتق پارامترها به عنوان بردار ویژگی برای تصویر استفاده می شود. این بردار به عنوان Fisher Vector شناخته می شود.
مزایای Fisher Vector Encoding:
قدرت تمایز بالا: Fisher Vector Encoding می تواند اطلاعات تمایز بالایی را از داده های تصویری استخراج کند.
مقاومت در برابر نویز: Fisher Vector Encoding نسبت به نویز و تغییرات روشنایی مقاوم است.
کارایی: Fisher Vector Encoding می تواند به طور کارآمد برای مجموعه داده های بزرگ تصاویر استفاده شود.
معایب Fisher Vector Encoding:
پیچیدگی: Fisher Vector Encoding از نظر محاسباتی پیچیده تر از برخی روش های دیگر مانند Bag of Words (BOW) است.
حساسیت به پارامترها: Fisher Vector Encoding می تواند به پارامترهای مدل آماری حساس باشد.
کاربردهای Fisher Vector Encoding:
طبقه بندی تصاویر: Fisher Vector Encoding می تواند برای طبقه بندی تصاویر به دسته های مختلف مانند حیوانات، اشیاء و مناظر استفاده شود.
بازیابی تصویر: Fisher Vector Encoding می تواند برای بازیابی تصاویر مشابه از یک پایگاه داده تصویر استفاده شود.
تشخیص اشیاء: Fisher Vector Encoding می تواند برای تشخیص اشیاء در تصاویر استفاده شود.
بردارهای فیشر (Fisher Vectors) در پایتون:
این پیاده سازی از Opencv استفاده نکرده است و با skimage است.
from matplotlib import pyplot as plt import numpy as np from sklearn.datasets import load_digits from sklearn.metrics import classification_report, ConfusionMatrixDisplay from sklearn.model_selection import train_test_split from sklearn.svm import LinearSVC from skimage.transform import resize from skimage.feature import fisher_vector, ORB, learn_gmm data = load_digits() images = data.images targets = data.target # Resize images so that ORB detects interest points for all images images = np.array([resize(image, (80, 80)) for image in images]) # Compute ORB descriptors for each image descriptors = [] for image in images: detector_extractor = ORB(n_keypoints=5, harris_k=0.01) detector_extractor.detect_and_extract(image) descriptors.append(detector_extractor.descriptors.astype('float32')) # Split the data into training and testing subsets train_descriptors, test_descriptors, train_targets, test_targets = \ train_test_split(descriptors, targets) # Train a K-mode GMM k = 16 gmm = learn_gmm(train_descriptors, n_modes=k) # Compute the Fisher vectors training_fvs = np.array([ fisher_vector(descriptor_mat, gmm) for descriptor_mat in train_descriptors ]) testing_fvs = np.array([ fisher_vector(descriptor_mat, gmm) for descriptor_mat in test_descriptors ]) svm = LinearSVC().fit(training_fvs, train_targets) predictions = svm.predict(testing_fvs) print(classification_report(test_targets, predictions)) ConfusionMatrixDisplay.from_estimator( svm, testing_fvs, test_targets, cmap=plt.cm.Blues, ) plt.show()
https://scikit-image.org/docs/stable/auto_examples/features_detection/plot_fisher_vector.html
دیدگاهتان را بنویسید