Python构建图像分类识别器的方法
机器学习用在图像识别是非常有趣的话题。
我们可以利用OpenCV强大的功能结合机器学习算法实现图像识别系统。
首先,输入若干图像,加入分类标记。利用向量量化方法将特征点进行聚类,并得出中心点,这些中心点就是视觉码本的元素。
其次,利用图像分类器将图像分到已知的类别中,ERF(极端随机森林)算法非常流行,因为ERF具有较快的速度和比较精确的准确度。我们利用决策树进行正确决策。
最后,利用训练好的ERF模型后,创建目标识别器,可以识别未知图像的内容。
当然,这只是雏形,存在很多问题:
界面不友好。
准确率如何保证,如何调整超参数,只有认真研究算法机理,才能真正清除内部实现机制后给予改进。
下面,上代码:
importos
importsys
importargparse
importjson
importcv2
importnumpyasnp
fromsklearn.clusterimportKMeans
#fromstar_detectorimportStarFeatureDetector
fromsklearn.ensembleimportExtraTreesClassifier
fromsklearnimportpreprocessing
try:
importcPickleaspickle#python2
exceptImportErrorase:
importpickle#python3
defload_training_data(input_folder):
training_data=[]
ifnotos.path.isdir(input_folder):
raiseIOError("Thefolder"+input_folder+"doesn'texist")
forroot,dirs,filesinos.walk(input_folder):
forfilenamein(xforxinfilesifx.endswith('.jpg')):
filepath=os.path.join(root,filename)
print(filepath)
object_class=filepath.split('\\')[-2]
print("object_class",object_class)
training_data.append({'object_class':object_class,'image_path':filepath})
returntraining_data
classStarFeatureDetector(object):
def__init__(self):
self.detector=cv2.xfeatures2d.StarDetector_create()
defdetect(self,img):
returnself.detector.detect(img)
classFeatureBuilder(object):
defextract_features(self,img):
keypoints=StarFeatureDetector().detect(img)
keypoints,feature_vectors=compute_sift_features(img,keypoints)
returnfeature_vectors
defget_codewords(self,input_map,scaling_size,max_samples=12):
keypoints_all=[]
count=0
cur_class=''
foritemininput_map:
ifcount>=max_samples:
ifcur_class!=item['object_class']:
count=0
else:
continue
count+=1
ifcount==max_samples:
print("Builtcentroidsfor",item['object_class'])
cur_class=item['object_class']
img=cv2.imread(item['image_path'])
img=resize_image(img,scaling_size)
num_dims=128
feature_vectors=self.extract_features(img)
keypoints_all.extend(feature_vectors)
kmeans,centroids=BagOfWords().cluster(keypoints_all)
returnkmeans,centroids
classBagOfWords(object):
def__init__(self,num_clusters=32):
self.num_dims=128
self.num_clusters=num_clusters
self.num_retries=10
defcluster(self,datapoints):
kmeans=KMeans(self.num_clusters,
n_init=max(self.num_retries,1),
max_iter=10,tol=1.0)
res=kmeans.fit(datapoints)
centroids=res.cluster_centers_
returnkmeans,centroids
defnormalize(self,input_data):
sum_input=np.sum(input_data)
ifsum_input>0:
returninput_data/sum_input
else:
returninput_data
defconstruct_feature(self,img,kmeans,centroids):
keypoints=StarFeatureDetector().detect(img)
keypoints,feature_vectors=compute_sift_features(img,keypoints)
labels=kmeans.predict(feature_vectors)
feature_vector=np.zeros(self.num_clusters)
fori,iteminenumerate(feature_vectors):
feature_vector[labels[i]]+=1
feature_vector_img=np.reshape(feature_vector,((1,feature_vector.shape[0])))
returnself.normalize(feature_vector_img)
#Extractfeaturesfromtheinputimagesand
#mapthemtothecorrespondingobjectclasses
defget_feature_map(input_map,kmeans,centroids,scaling_size):
feature_map=[]
foritemininput_map:
temp_dict={}
temp_dict['object_class']=item['object_class']
print("Extractingfeaturesfor",item['image_path'])
img=cv2.imread(item['image_path'])
img=resize_image(img,scaling_size)
temp_dict['feature_vector']=BagOfWords().construct_feature(img,kmeans,centroids)
iftemp_dict['feature_vector']isnotNone:
feature_map.append(temp_dict)
returnfeature_map
#ExtractSIFTfeatures
defcompute_sift_features(img,keypoints):
ifimgisNone:
raiseTypeError('Invalidinputimage')
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
keypoints,descriptors=cv2.xfeatures2d.SIFT_create().compute(img_gray,keypoints)
returnkeypoints,descriptors
#Resizetheshorterdimensionto'new_size'
#whilemaintainingtheaspectratio
defresize_image(input_img,new_size):
h,w=input_img.shape[:2]
scaling_factor=new_size/float(h)
ifw
以上这篇Python构建图像分类识别器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。