KNN实现魔方颜色识别
1.颜色识别
-
该程序利用KNN实现魔方颜色识别,特征采用RGB的颜色直方图,它可以区分白、黑、红、绿、蓝、橙色、黄色和紫色,如果你想分类更多颜色或者提高分类准确率,可以通过调整训练集数据或者考虑使用其他的特征如颜色矩)或者颜色相关图。
-
你可以使用color_recognition_api实现实时的颜色识别,作者提供了两种识别方式,一种是摄像头实时识别颜色(color_classification_webcam.py),
另一种实现对单张图片的颜色识别(color_classification_image.py )
-
该程序实现的功能:
- 特征提取:对训练集图像提取RGB颜色直方图特征。
- 训练KNN分类器:通过RGB颜色直方图值训练KNN分类器
- 通过训练好的KNN分类器分类:逐帧读取摄像头,对每帧图像进行特征提取,最后通过训练好的KNN分类器判别物体的颜色。
-
TODS:
- 添加新颜色。
- 提取新特征。
- 添加新分类器。
2.理论介绍
- 在这个研究中,我们使用KNN分类器算法,分类器通过图像的RGB颜色直方图值进行训练,整体的工作流程如下图所示:
-
对于基于机器视觉和机器学习的目标检测或识别系统,应该了解两个核心点:1.特征提取(即在图片中如何表示感兴趣的特征,并与其他特征进行区分);2.分类(实现分类的算法,特别是在具体的实现中,我们称为分类器,这个分类器有时是指一个数学公式,由输入数据指向类别。)
-
对于该项目来讲:
- 特征提取=颜色直方图:颜色直方图是图像中一种颜色的分布表示,对于数字图像而言,颜色直方图表示一个固定的颜色范围列表中,每个颜色范围中有像素的数量,这些颜色范围跨越图像的颜色空间,即所有可能的颜色的集合。
- 分类器—KNN算法:KNN算法是一种简单的算法,他存储了所有可用的案例,并根据相似度距离来对新的案例进行分类(例如距离函数),KNN是一种1970年代的非参数技术,常被用于统计估计和模式识别。
3.代码实现
OpenCV库被用于颜色直方图计算和KNN分类器,Numpy用于矩阵或N维数组的计算,这个程序是在Linux环境下用Python开发的。
在“src”目录下,有两个Python类:
- color_classification_webcam.py:测试类从网络摄像头实现实时颜色识别。
- color_classification_image.py:测试类实现对单张图像的颜色识别。
在“color_recognition_api”目录下,有两个Python类:
- feature_extraction.py :特征提取操作类。
- knn_classifier.py:KNN分类器。
feature_extraction.py特征提取类的解释:
我们可以通过该Python类实现获取图像的RGB颜色直方图,例如绘制红色图像的RGB颜色直方图
- 我决定使用直方图的RGB通道像素数量最大的对应的Bin Number来作为特征,因为我可以得到占主导地位的RGB值来创建特征向量用于训练,例如这个红色图像的占主导地位的RGB值是[254,0,2]。
- 对于每个训练图像,使用颜色直方图我获得了占主导地位的RGB的值,然后给他们打上标签,这是因为KNN是有监督学习,然后我将这些特征向量部署到csv文件当中,因此,我创建了我的训练特征向量数据集,它保存在src目录下training.data。
这个类提供了这些主要的计算;
- 获取训练数据。
- 获取测试图像特征。
- 计算欧式距离。
- 找到K个最近邻点。
- 预测颜色。
- 返回预测是否正确。
color_classification_webcam.py注释:它是我们这个程序的主要类,它提供了一下功能:
- 调用 feature_extraction.py 创造训练数据。
- 调用knn_classifier.py)用于分类。
4结论
- 我认为训练数据对于分类准确率有重要的影响,我非常仔细的创建了我的训练数据集,但是如果有更合适的数据集,可能效果更好。
-
另一个重要的影响是闪光和阴影,在我的测试图像中,在光线较差或者阴影下拍摄的图片被分类错误,也许一些滤波算法可以提前处理一下测试图像,然后送给KNN分类器,以提高分类的准确性。
代码解读
检查训练数据是否准备好
PATH = './training.data' #1 if os.path.isfile(PATH) and os.access(PATH, os.R_OK): #2 #3 print ('training data is ready, classifier is loading...') else: print ('training data is being created...') open('training.data', 'w') #4 color_histogram_feature_extraction.training() print ('training data is ready, classifier is loading...')
代表当前运行的py文件所在的目录下training.data文件,其中的数据如下图所示,分别为RGB颜色值和对应的颜色标签。
注意:表目前所在的目录。
“ . ./“代表上一层目录。
“/“:代表根目录。def training(): # red color training images for f in os.listdir('./training_dataset/red'): color_histogram_of_training_image('./training_dataset/red/' + f) # yellow color training images for f in os.listdir('./training_dataset/yellow'): color_histogram_of_training_image('./training_dataset/yellow/' + f) # green color training images for f in os.listdir('./training_dataset/green'): color_histogram_of_training_image('./training_dataset/green/' + f) # orange color training images for f in os.listdir('./training_dataset/orange'): color_histogram_of_training_image('./training_dataset/orange/' + f) # white color training images for f in os.listdir('./training_dataset/white'): color_histogram_of_training_image('./training_dataset/white/' + f) # black color training images for f in os.listdir('./training_dataset/black'): color_histogram_of_training_image('./training_dataset/black/' + f) # blue color training images for f in os.listdir('./training_dataset/blue'): color_histogram_of_training_image('./training_dataset/blue/' + f)
代码解读:
输入:无参数
输出:将7种颜色对应的文件夹的所有图像,按照red、yellow、green、orange、white、black、blue的文件夹顺序,一个文件夹,一个文件夹进行特征和标签的提取,并存放到training.data文件中。
Color_classification_image.py文件代码段:
# get the prediction
color_histogram_feature_extraction.color_histogram_of_test_image(source_image)
prediction = knn_classifier.main('training.data', 'test.data')
print('Detected color is:', prediction)
cv2.putText(
source_image,
'Prediction: ' + prediction,
(15, 45),
cv2.FONT_HERSHEY_PLAIN,
3,
200,
)
# Display the resulting frame
cv2.imshow('color classifier', source_image)
cv2.waitKey(0)
L2:
color_histogram_feature_extraction.color_histogram_of_test_image(source_image)
color_histogram_feature_extraction是.py文件的名称
后面跟着是这个py文件中定义的特征提取函数。
L3: knn_classifier是定义KNN分类器的py函数,.main()函数是其中定义的分类方法,其中第一个参数是训练数据集,第二个参数是前面提取的测试图像的特征。
L4:之后就是显示分类的结果了。
评论(0)
您还未登录,请登录后发表或查看评论