一.实验原理
1.概念
Bag of Feature 是一种图像特征提取方法,它借鉴了文本分类的思路(Bag of Words),从图像抽象出很多具有代表性的关键词,形成一个字典,再统计每张图片中出现的关键词数量,得到图片的特征向量。
2.Bag of Words 模型
Bag of Words 是文本分类中一种通俗易懂的策略。一般来讲,如果我们要了解一段文本的主要内容,最行之有效的策略是抓取文本中的关键词,根据关键词出现的频率确定这段文本的中心思想。比如:如果一则新闻中经常出现「iraq」、「terrorists」,那么,我们可以认为这则新闻应该跟伊拉克的恐怖主义有关。而如果一则新闻中出现较多的关键词是「soviet」、「cuba」,我们又可以猜测这则新闻是关于冷战的。
这里所说的关键词,就是「Bag of words」中的 words ,它们是区分度较高的单词。根据这些 words ,我们可以很快地识别出文章的内容,并快速地对文章进行分类。
而 Bag of Feature 也是借鉴了这种思路,只不过在图像中,我们抽出的不再是一个个「word」,而是图像的关键特征「Feature」,所以研究人员将它更名为「Bag of Feature」。
3.Bag of Feature
当数据集的图片很多时,图像识别如果用Sift特征匹配,一对一的匹配效率是很低的。所以借鉴文本分类的思路,从一张图片中提取具有代表性的特征,将所有图片的特征放在一起形成一个“纹理基元”字典,将这个字典里的特征聚类(K-means聚类)成K个词袋。
特征提取:
有了特征之后,我们会将这些特征通过聚类算法得出很多聚类中心。这些聚类中心通常具有较高的代表性,比如对于人脸来说,虽然不同人的眼睛、鼻子等特征都不尽相同,但它们往往具有共性,而这些聚类中心就代表了这类共性。我们将这些聚类中心组合在一起,形成一部字典(CodeBook)。
K-means聚类(学习出一个词典)
输入图像的n个Sift特征点,聚合得到k个集合,每个集合的聚类质心就构成了视觉词典。
第一步:任意选择k个sift特征点作为初始聚类质心。
第二步:对于每个sift特征点,计算它们与k个聚类质心的欧式距离,找到最小的那个聚类质心,将该特征点放入此聚类质心集合中。
第三步:对于每个聚类质心集合,用所有元素均值来更新质心。
第四步:比较更新前后聚类质心集合是否相近(距离小于某阈值),相近则完成聚类,否则返回步骤2,如果迭代次数太多聚类失败。
4.TF-IDF权值
投票值与“视觉单词”权重相乘,得到频率直方图。
二.实验内容
爬虫代码:
import requests
import os
import urllib
class Spider_baidu_image():
def __init__(self):
self.url = 'http://image.baidu.com/search/acjson?'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.\
3497.81 Safari/537.36'}
self.headers_image = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.\
3497.81 Safari/537.36',
'Referer': 'http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1557124645631_R&pv=&ic=&nc=1&z=&hd=1&latest=0©right=0&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%E8%83%A1%E6%AD%8C'}
self.keyword = input("请输入搜索图片关键字:")
self.paginator = int(input("请输入搜索页数,每页30张图片:"))
# self.paginator = 50
# print(type(self.keyword),self.paginator)
# exit()
def get_param(self):
"""
获取url请求的参数,存入列表并返回
:return:
"""
keyword = urllib.parse.quote(self.keyword)
params =![ \[](https://img-blog.csdnimg.cn/5130338346dd4dcabd5311a39a52e9ae.png