基于BOW和SVM的目标检测

数据集制作

参照博客基于PIL批量修改图片JPG格式为PGM格式制作数据集。

源程序

import cv2
import numpy as np

data_path = "train_data/"
SAMPLES = 10


def path(cls, i):
    return "%s/%s%d.pgm" % (data_path, cls, i + 1)  # pgm格式


pos, neg = "pos-", "neg-"   # 类别

detect = cv2.xfeatures2d.SIFT_create()      # 提取关键点
extract = cv2.xfeatures2d.SIFT_create()     # 提取特征

flann_params = dict(algorithm=1, tree=5)    # FLANN匹配器
flann = cv2.FlannBasedMatcher(flann_params, {})

bow_kmeans_trainer = cv2.BOWKMeansTrainer(40)       # BOW训练器/提取器
extract_bow = cv2.BOWImgDescriptorExtractor(extract, flann)


def extract_sift(fn):
    im = cv2.imread(fn, 0)
    return extract.compute(im, detect.detect(im))[1]


for i in range(1, SAMPLES):
    bow_kmeans_trainer.add(extract_sift(path(pos, i)))
    bow_kmeans_trainer.add(extract_sift(path(neg, i)))

voc = bow_kmeans_trainer.cluster()  # 执行k-means分类并返回词汇
extract_bow.setVocabulary(voc)      # 从测试图像中提取描述符


def bow_feature(fn):
    im = cv2.imread(fn, 0)
    return extract_bow.compute(im, detect.detect(im))       # 返回基于BOW的描述符提取器计算得到的描述符


train_data, train_labels = [], []

for i in range(1, SAMPLES):
    train_data.extend(bow_feature(path(pos, i)))
    train_labels.append(1)
    train_data.extend(bow_feature(path(neg, i)))
    train_labels.append(-1)

svm = cv2.ml.SVM_create()       # SVM实例
svm.train(np.array(train_data), cv2.ml.ROW_SAMPLE, np.array(train_labels))


def predict(fn):
    f = bow_feature(fn)
    p = svm.predict(f)
    print(fn, "\t", p[1][0][0])
    return p


bulldozer = "bulldozer.jpg"
image = cv2.imread(bulldozer)
image_predict = predict(bulldozer)

font = cv2.FONT_HERSHEY_COMPLEX

if (image_predict[1][0][0] == 1.0):
    cv2.putText(image, 'Bulldozer Detected', (10, 30), font, 1, (0, 255, 0), 2, cv2.LINE_AA)
else:
    cv2.putText(image, 'Bulldozer Not Detected', (10, 30), font, 1, (0, 0, 255), 2, cv2.LINE_AA)

cv2.imshow('Detect Success for %s' % bulldozer[:-4], image)
cv2.waitKey(0)
cv2.destroyAllWindows()

(最近更新:2020年01月10日)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: BoW(Bag of Words)模型是一种文本特征表示方法,可以通过将文本转换为词袋来描述文本的特征。对于基于BoW模型的异常检测算法,通常的思路是将异常数据与正常数据的词袋进行比较,从而判断数据是否异常。以下是一个简单的基于BoW模型的异常检测算法的Matlab代码实现: 1. 数据准备 首先,需要准备用于训练和测试的数据。可以使用一个包含多个文本文件的文件夹作为数据集。 2. 特征提取 使用Matlab自带的文本分析工具箱(Text Analytics Toolbox)提取每个文本文件的特征向量。可以使用函数bagOfWords创建每个文本文件的词袋,并使用函数tfidf计算TF-IDF权重,生成特征向量。 3. 模型训练 使用生成的特征向量训练一个分类器,比如支持向量机(SVM分类器。可以使用函数fitcecoc训练一个多分类SVM分类器。 4. 异常检测 使用训练好的分类器对新的数据进行异常检测。对于每个新的文本文件,提取其特征向量并使用训练好的分类器进行预测。如果预测结果为异常,则将该文本文件标记为异常数据。 下面是一个示例代码: ```matlab % 1. 数据准备 data_folder = 'path/to/data/folder'; % 2. 特征提取 bag = bagOfWords('folder', data_folder); tfidf_bag = tfidf(bag); features = full(tfidf_bag.Counts); % 3. 模型训练 labels = repmat({'normal'}, size(features, 1), 1); % 正常数据标签 labels(1:10) = {'anomaly'}; % 前10个数据标记为异常 svm = fitcecoc(features, labels); % 训练一个多分类SVM分类器 % 4. 异常检测 new_data_folder = 'path/to/new/data/folder'; new_bag = bagOfWords('folder', new_data_folder); new_tfidf_bag = tfidf(new_bag); new_features = full(new_tfidf_bag.Counts); predictions = predict(svm, new_features); % 使用训练好的分类器进行预测 anomaly_indices = find(strcmp(predictions, 'anomaly')); % 找到异常数据的索引 ``` 在上述代码中,我们首先从一个文件夹中提取特征并使用前10个数据标记为异常数据,然后训练一个多分类SVM分类器。接着,我们使用另一个文件夹的数据进行异常检测,并找到标记为异常的数据索引。 ### 回答2: 基于BoW(Bag-of-Words)模型的异常检测算法是一种常用的无监督学习方法,通过计算文本中词的频率分布来表示文本,进而检测异常。下面是用MATLAB实现基于BoW模型的异常检测算法的简要步骤。 1. 数据预处理:将原始文本数据进行清洗和分词处理,去除停用词(如“的、是、在”等常见词),保留有意义的词汇。 2. 特征提取:根据数据预处理后的文本,构建词汇表,统计每个词汇在文本中的出现次数。可以使用MATLAB的文本处理工具箱来完成这一步骤。 3. 构建向量表示:将每个文本转换为一个特征向量,向量的每个维度表示对应词汇在文本中的出现次数。这可以通过MATLAB的编程来实现,可以使用稀疏矩阵来表示向量。 4. 计算类似度:将异常样本与正常样本进行比较,计算它们之间的相似度。常用的相似度度量方法有余弦相似度和欧氏距离。可以使用MATLAB中的相似度计算函数来完成。 5. 设置阈值:根据异常样本与正常样本之间的相似度分布,设定一个阈值来判断样本是否属于异常。该阈值可以根据训练集的正常样本计算得出,也可以根据先验知识来设定。 6. 异常检测:对于新的样本,将其转换为特征向量后,与阈值进行比较,若小于阈值则认为是异常样本,否则是正常样本。 以上就是用MATLAB代码实现基于BoW模型的异常检测算法的步骤。实际实现时,还需根据具体问题进行调优和改进。 ### 回答3: 基于BoW模型的异常检测算法可以通过以下步骤在MATLAB中实现: 1. 数据预处理:将输入的数据集进行预处理,包括数据清洗、归一化等操作,以便后续的特征提取和建模。 2. 特征提取:使用Bag of Words(BoW)方法从数据集中提取特征。将数据集中的文本进行分词,去除停用词,并计算每个词的词频(TF-IDF)等特征。 3. 使用聚类算法:将提取的特征进行聚类,常用的聚类算法包括K-means、DBSCAN等。聚类的目的是将数据划分为若干个簇,以便更好地检测异常点。 4. 设置异常阈值:根据聚类的结果,将每个簇中样本的异常程度进行评估。可以通过计算样本到其所属簇中心的距离、密度等指标来评估异常程度,并设置异常阈值。 5. 异常检测:对于新来的数据点,计算其与已有簇中心的距离,如果距离超过设定的异常阈值,则将该点视为异常点。 6. 结果评估:根据实际数据集的标签,判断异常检测的结果是否准确,并计算准确率、召回率等指标来评估算法的性能。 以上步骤可以通过使用MATLAB中的文本处理工具、聚类算法函数和性能评估函数等来实现。需要注意的是,具体实施过程中可能需要根据具体场景进行一些算法参数的调整和优化,以获得更好的异常检测效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值