需求

在物联网和智能家居的制作方面,物体的识别是一个很重要的方面。我们都知道,物联网主要分为感知识别、网络传输、综合运用等方面。而感知识别最重要的就是识别出是什么物体。我们平时主要是根据各种电子标签提前标识出物体的序号,从而让中央处理单元以前知道是什么物体。而我们在生活中,还常常利用图像识别技术进行识别,感测出是什么物体。

1.jPG

技术



本文中制作的图像识别软件是由python和pyqt5制作而成,使用LBP+SVM技术,训练识别给定的测试图像,从而进行物体识别。

  • LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出,用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征;
  • SVM也称支持向量机(Support Vector Machine, SVM),它的基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大。SVM是用来解决二分类问题的有监督学习算法,在引入了核方法之后SVM也可以用来解决非线性问题。

一般SVM有下面三种:

  • 硬间隔支持向量机(线性可分支持向量机):当训练数据线性可分时,可通过硬间隔最大化学得一个线性可分支持向量机。
  • 软间隔支持向量机:当训练数据近似线性可分时,可通过软间隔最大化学得一个线性支持向量机。
  • 非线性支持向量机:当训练数据线性不可分时,可通过核方法以及软间隔最大化学得一个非线性支持向量机。


实现


2.jpg

训练文件

在项目中建立training文件夹,在其中存放你想要训练的图像,其中的小文件夹就是你训练生成的图像名称,可自行更改。
20201210121536918.jpg

识别图像

建立testing文件夹,在其中存放你想要识别的图像。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI5MTA5,size_16,color_FFFFFF,t_70#pic_center.jpg

LocalBinrayPatterns
  1. class LocalBinrayPatterns:
  2.     def __init__(self,numPoints,radius):
  3.         self.numPoints = numPoints
  4.         self.radius = radius
  5.     def describle(self,image,esp=1e-7):
  6.         lbp = feature.local_binary_pattern(image,self.numPoints,self.radius,method="uniform")
  7.         (hist,_) = np.histogram(lbp.ravel(),bins=np.arange(0,self.numPoints + 3),range=(0,self.numPoints + 2))
  8.         hist = hist.astype("float")
  9.         hist /= (hist.sum() + esp)
  10.         return hist
recognize
  1. ap = argparse.ArgumentParser()
  2. ap.add_argument("-t","--training",default="./training",help="path to the training images")
  3. ap.add_argument("-e","--testing",default="./testing",help="path to the testing images")
  4. args = vars(ap.parse_args())
  5. desc = LocalBinrayPatterns(24,8)
  6. data = []
  7. labels = []
  8. for imagePath in paths.list_images(args["training"]):
  9.     image = cv2.imread(imagePath)
  10.     gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
  11.     hist = desc.describle(gray)
  12.     labels.append(imagePath.split(os.path.sep)[-2])
  13.     data.append(hist)
  14. model = LinearSVC(C=100.0,random_state=42)
  15. model.fit(data, labels)
  16. for imagePath in paths.list_images(args["testing"]):
  17.    
运行结果展示

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI5MTA5,size_16,color_FFFFFF,t_70#pic_center.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI5MTA5,size_16,color_FFFFFF,t_70#pic_center.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI5MTA5,size_16,color_FFFFFF,t_70#pic_center.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI5MTA5,size_16,color_FFFFFF,t_70#pic_center.jpg
可以很明显的看出,提前存放的文件夹的图像训练成了相关文件夹名字的素材,而当检测到相关图片时,显示相关的名称。