精华内容
下载资源
问答
  • 数据集为牛津大学库里的17类花卉图像提取码c4s4,该程序的思路是参考手势识别的项目所修改。 1. 提取所有花卉图像的SIFT特征 opencv里有直接调用sift特征提取的函数,下列操作是将所有类别图像文件夹遍历,批量提取...

    数据集为牛津大学库里的17类花卉图像提取码c4s4,该程序的思路是参考手势识别的项目所修改。

    1. 提取所有花卉图像的SIFT特征

    opencv里有直接调用sift特征提取的函数,下列操作是将所有类别图像文件夹遍历,批量提取sift特征,并将特征量化到一个文本文件中方便后续操作。

    path = './' + 'feature' + '/' #保存特征的路径
    path_img = './' + 'image' + '/' #数据集路径
    
    def calcSURFFeature(img):
    	gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    	sift = cv2.xfeatures2d.SURF_create(200) #特征点数量限制自行设置 
    	kps, des = sift.detectAndCompute(gray, None)
    	return des
    	
    if __name__ == "__main__":
        for i in range(1, 18): #读取17类图像的文件夹
            for j in range(1, 21): #读取每类文件夹的图像数量
                #文件夹路径+命名形式
                #数据集内图像名称未按顺序命名,建议先改名后提取特征
                roi = cv2.imread(path_img + str(i) + '_' + str(j) + '.jpg') 
                descirptor_in_use = fd.calcSURFFeature(roi)
                fd_name = path + str(i) + '_' + str(j) + '.txt' #形成特征
                with open(fd_name, 'w', encoding='utf-8') as f:
                    for k in range(1, len(descirptor_in_use)):
                        x_record = descirptor_in_use[k]
                        f.write(str(x_record))
                        f.write(' ')
                    f.write('\n')
                print(i, '_', j, '完成')
    

    2. 将文本文件中特征形式统一

    由于上一步得出的文本中的surf特征都是矩阵形式,为了后续方便分类,将文本中不必要的字符都删除掉。

    path = './' + 'feature' + '/'
    xmls = glob.glob(path+'*.txt')
    
    for one_xml in xmls:
        print(one_xml)
        f = open(one_xml, 'r+', encoding='utf-8')
        all_the_lines = f.readlines()
        f.seek(0)
        f.truncate()
        for line in all_the_lines:
            line = line.replace('[', '')
            line = line.replace(']', '')
            line = line.replace(' ', '')
            line = line.replace('  ', '')
            line = line.replace('   ', '')
            line = line.replace('\n', '')
            line = line.replace('.', ' ')
            f.write(line)
        f.close()
    

    3. 用SVM分类

    先将文本文件中数据归一化

    #路径设置
    path = './' + 'feature' + '/'
    model_path = "./model/"
    test_path = "./test_feature/"
    
    test_accuracy = []
    
    def txtToVector(filename, N):
    	returnVec = np.zeros((1, N))
    	fr = open(filename)
    	lineStr = fr.readline()
    	lineStr = lineStr.split(' ')
    	for i in range(N):
    		returnVec[0, i] = int(lineStr[i])
    	return returnVec
    

    再到SVM分类器的训练过程,SVM参数设定很重要,参数设置要求越高时间越长,网上有很多SVM参数设定的文章。训练过程中有很多数据用不了,可以直接删除。数据能否使用,与后面设定的N值有关,可以进行debug形式查看哪些数据不能用,但过程比较繁琐。

    def tran_SVM(N):
    	svc = SVC()
    	parameters = {'kernel': ('linear', 'rbf'),
    				  'C': [1, 3, 5, 7, 9],
    				  'gamma': [0.0001, 0.001, 0.1, 1, 10, 100]}  
    	hwLabels = []  # 存放类别标签
    	trainingFileList = listdir(path)
    	m = len(trainingFileList)
    	trainingMat = np.zeros((m, N))
    	for i in range(m):
    		fileNameStr = trainingFileList[i]
    		classNumber = int(fileNameStr.split('_')[0])
    		hwLabels.append(classNumber)
    		trainingMat[i, :] = txtToVector(path + fileNameStr, N)  
    	print("完成")
    	clf = GridSearchCV(svc, parameters, cv=5, n_jobs=4) #此处参数设定也很重要
    	clf.fit(trainingMat, hwLabels)
    	best_model = clf.best_estimator_
    	print("SVM模型保存中...")
    	save_path = model_path + "svm_efd_" + "train_model.m"
    	joblib.dump(best_model, save_path)  # 保存最好的模型
    
    def test_SVM(clf, N):
    	testFileList = listdir(test_path)
    	errorCount = 0  # 记录错误个数
    	mTest = len(testFileList)
    	for i in range(mTest):
    		fileNameStr = testFileList[i]
    		classNum = int(fileNameStr.split('_')[0])
    		vectorTest = txtToVector(test_path + fileNameStr, N)
    		valTest = clf.predict(vectorTest)
    		if valTest != classNum:
    			errorCount += 1
    	print("总共错了%d个数据\n错误率为%f%%" % (errorCount, errorCount / mTest * 100))
    
    if __name__ == "__main__": #此处N值设定影响训练结果
    	tran_SVM(50000)
    	clf = joblib.load(model_path + "svm_efd_" + "train_model.m")
    	test_SVM(clf,50000)
    

    4. 总结

    关于N值的设定我调了很久,N值越大结果的精确度越高,但也对数据有很多限制,因此也删除了许多数据,我用AMD训练时间花了一个多小时。大家可以尝试其他特征提取后再做SVM分类,我用SURF特征提取精确度并不高,不知道有哪些位置可以改正以提高识别率,欢迎交流。

    展开全文
  • 官网虽然可以下载,但是是1360张图片堆在一个文件夹里,没有分类。要是自己手动分成17个文件夹,然后再复制图片进去,一来效率低,二是容易出错。以下代码是把1360张图片按照80个一类分别放入17个文件夹中: # ...

    牛津花卉数据集下载链接:http://www.robots.ox.ac.uk/~vgg/data/flowers/17/
    官网虽然可以下载,但是是1360张图片堆在一个文件夹里,没有分类。要是自己手动分成17个文件夹,然后再复制图片进去,一来效率低,二是容易出错。以下代码是把1360张图片按照80个一类分别放入17个文件夹中:

    # coding:utf-8
    
    from imutils import paths   # 把dir路径下的所有图片名称变成一个列表
    import os
    import shutil
    
    dataset_dir = os.path.abspath(r"C:/迅雷下载/17flowers")
    
    picture_list = list(paths.list_images(dataset_dir))  # 存放1360张图片的文件夹
    
    pic_num = 0  # 用来计数1360,便于接下来遍历存储图片
    
    for i in range(1, 18):
        value = 0
        file_path = os.path.abspath(str(i))    # 创建17个类别文件夹
        while value < 80:
            shutil.copy(picture_list[pic_num], file_path)  # 这个是复制语句,将picture_list的图片复制到file文件夹里
    
            pic_num += 1
            value += 1
    

    转自https://blog.csdn.net/einstellung/article/details/90181177

    展开全文
  • 分类器要完成的任务是,给定一种鸢尾花卉的测量数据,为这种花卉分类。最简单的分类器是近邻分类器。近邻算法搜索训练集,寻找与用作测试的新个体最相似的观测记录。讲到这里,弄清楚训练集和测试集这两个概念很重要...

    KNN

    现在,如果我们有一个分类任务。需要用到scikit-learn库的分类器对象。

    分类器要完成的任务是,给定一种鸢尾花卉的测量数据,为这种花卉分类。最简单的分类器是近邻分类器。近邻算法搜索训练集,寻找与用作测试的新个体最相似的观测记录。

    讲到这里,弄清楚训练集和测试集这两个概念很重要。如果确实只有一个数据集,也没关系,重要的是不要使用同一份数据同时用于训练和测试。鉴于此,把数据集分为两部分:一部分专门用于训练算法,另一部分用于验证算法。

    因此,在讲解后面的内容之前,我们先把Iris数据集分为两部分。最好是先打乱数组各元素的顺序,然后再切分,因为数据往往是按特定顺序采集的,比如Iris数据集就是按照种类进行排序的。我们用NumPy的random.permutation( )函数打乱数据集的所有元素。打乱后的数据集依旧包含150条不同的观测数据,其中前140条用作训练集,剩余10条用于测试集。

    在我们将数据集划分为两部分之后,我们就可以使用KNN算法了。导入KneighborsClassifier,调用分类器的构造函数,然后使用fit( )函数对其进行训练。

    我们用140条观测数据训练knn分类器,得到了预测模型。我们随后将验证它的效果。分类器应该能够正确预测测试集中10条观测数据所对应的类别。要获取预测结果,可直接在预测模型knn上调用predict( )函数。最后,将预测结果与y_test中的实际值进行比较。

    我们可以看到,只有一个数据预测错误了,错误率仅为10%。我们可以在用萼片测量数据绘制的2D散点图中,画出决策边界。

    我们可以看到散点图中,有小块区域伸入到其他决策边界之中。我们再使用花瓣数据绘制的散点图中,一样可以画出决策边界。

    如图所示,我们使用花瓣数据描述鸢尾花卉的特征,也一样能够得到相应的决策边界。

    Diabetes数据集

    scikit-learn库提供了多个数据集,其中就有Diabetes(糖尿病)数据集。人们首次使用它是在2004年。从那时起,人们拿它作为例子,广泛应用于各种预测模型的研究和评估中。

    从这个数据集加载数据前,先要从scikit-learn库中导入datasets模块。然后调用load_diabetes( )函数加载数据集,我们也可以将它存储在一个变量diabetes中。该数据集包含了442位病人的生理数据以及一年之后的病情发展情况,后者即为目标值。前10列数据表示生理数据,分别表示以下特征:1.年龄 2.性别 3.体质指数 4.血压 5.S1~S6(六种血清的化验数据)。

    我们调用data属性就可以获取到测量数据。查看数据集,就会发现这些数据和我们想象中的数据差别很大。例如我们来看一下第一位病人的10个数据。

    这些数据是经过特殊处理得到的。10个数据中的每一个都做了均值中心化处理,然后又用标准差乘以个数数量调整了数值范围。验证就会发现任何一列的所有数值之和为1,比如对年龄这一列求和,我们会发现它的总和近似为1。

    即使这些数据因为经过规范化处理,所以难以读懂,但是我们只需要知道它们表示10个生理特征就可以了,这些数据照样对我们很有帮助。

    表明疾病进展的数据,用target属性就可以得到啦!我们接下来预测得到的结果必须也要与之相符。

    这样我们就得到了442个介于25到346之间的整数数据。下面我们将要用这些数据进行我们的实验环节。

    展开全文
  • 提前说明一下,本文的CNN神经网络模型是参考网上诸多相关CNN图像分类大牛的博客修改的,在模型的基础上,用python的Flask框架搭载了一个web页面用来可视化展示。 第一步,爬取图片数据集 用python实现了一个非常简单...
  • 卷积神经网络训练花卉识别分类

    千次阅读 2020-03-27 12:24:52
      花卉分类器使用语言:Python,使用深度学习框架:PyTorch,方法:训练卷积神经网络   关于PyTorch的基本用法可以参考博客:PyTorch笔记   Gitee仓库:花卉识别   Github仓库:花卉识别   Git相关用法...

    介绍

      本部分是花卉分类器,后续会有更为详细的更新。

      花卉分类器使用语言:Python,使用深度学习框架:PyTorch,方法:训练卷积神经网络

      关于PyTorch的基本用法可以参考博客:PyTorch笔记

      Gitee仓库:花卉识别

      Github仓库:花卉识别

      Git相关用法可以参考博客:Git使用笔记

    数据集

      目前选用了20种花卉数据用于分类

      data文件夹内存放了我使用的20种花卉数据集。日后会继续扩增。

      数据来源主要取决于3个方面:

    • 5种花卉数据集,每类花卉包含600张到900张不等的图片
    • 来源于Oxford 102 Flowers数据集,该数据集包含102类英国花卉数据,每个类别包含 40 到 258 张图像
    • 最后一部分来源于百度图片,使用python程序批量采集花卉图像数据

      有些花卉的name是我自己写的,采用的是花卉的学名,通常是拉丁文。

      我选用的20种花卉数据如下所示:

    编号 name 名称 数量
    1 daisy 雏菊 633
    2 dandelion 蒲公英 898
    3 roses 玫瑰花 641
    4 sunflowers 向日葵 699
    5 tulips 郁金香 799
    6 Nymphaea 睡莲 226
    7 Tropaeolum_majus 旱金莲 196
    8 Digitalis_purpurea 毛地黄 190
    9 peach_blossom 桃花 55
    10 Jasminum 茉莉花 60
    11 Matthiola 紫罗兰 54
    12 Rosa 月季 54
    13 Rhododendron 杜鹃花 57
    14 Dianthus 康乃馨 48
    15 Cerasus 樱花 50
    16 Narcissus 水仙花 52
    17 Pharbitis 牵牛花 46
    18 Gazania 勋章菊 108
    19 Eschscholtzia 花菱草 82
    20 Tithonia 肿柄菊 47

      花卉样式:

    image-20200323134803440

    数据扩展

      收集到的每种花卉数量不是很多,而像樱花、水仙花等都是每类50张左右,数据量过少,若直接拿去训练模型的话,正确率不会太高,且会发生严重的过拟合。

      目前使用的数据扩展方法分为三种:镜像翻转、上下翻转和椒盐噪声。

      镜像翻转:将图片左右翻转,生成新的数据

    image-20200323161939465

      上下翻转:将图片上下翻转,生成新的数据

    image-20200323162157922

      椒盐噪声:为图片增加噪声,生成新的数据

    image-20200323162309627

      扩展后的花卉数量如下所示:

    编号 name 名称 数量 增量后数量
    1 daisy 雏菊 633 2496
    2 dandelion 蒲公英 898 3588
    3 roses 玫瑰花 641 2400
    4 sunflowers 向日葵 699 2796
    5 tulips 郁金香 799 3196
    6 Nymphaea 睡莲 226 1808
    7 Tropaeolum_majus 旱金莲 196 1568
    8 Digitalis_purpurea 毛地黄 190 1360
    9 peach_blossom 桃花 55 440
    10 Jasminum 茉莉花 60 480
    11 Matthiola 紫罗兰 54 432
    12 Rosa 月季 54 432
    13 Rhododendron 杜鹃花 57 456
    14 Dianthus 康乃馨 48 384
    15 Cerasus 樱花 50 400
    16 Narcissus 水仙花 52 416
    17 Pharbitis 牵牛花 46 368
    18 Gazania 勋章菊 108 464
    19 Eschscholtzia 花菱草 82 656
    20 Tithonia 肿柄菊 47 376

    数据切分

      数据集准备好了,要切分为训练集、验证集和测试集。

      在PyTorch的torchvision包内有一个关于计算机视觉的数据读取类ImageFolder,它的调用方式是torchvision.datasets.ImageFolder,主要功能是读取图片数据,且要求图片是下图这种存放方式。

    image-20200321104936098

      然后这样来调用类:

    train_dataset = ImageFolder(root='./data/train/',transform=data_transform)
    

      root表示根目录,transform表示数据预处理方式。

      这种方式将train目录下的cat和dog文件夹内的所有图片作为训练集,而文件夹名cat和dog作为标签数据进行训练。

      因此我们就要像ImageFolder要求的那样切分数据集。

    image-20200323184552442

      我切分的比例是3:1:1。实际上,如果不想切分出验证集的话,可以将验证集的代码部分注掉,直接使用训练集和测试集也是可以的。

    #比例
    scale = [0.6, 0.2, 0.2]
    

      至此,数据部分准备完成了。

    模型训练

      目前采用的是AlexNet和VGG16两种网络,其实两种网络比较相似,不同的是VGG16较于AlexNet更“深”

      AlexNet网络结构如下:

    img

      VGG16网络结构如下:

    在这里插入图片描述

      二者相比较,VGG16准确率更高一些,可见更深的网络对于提高准确率有一定的帮助。

      AlexNet训练过程中的准确率变化如下:

    image-20200323225509766

      VGG16经历200个epoch训练的准确率变化如下:

    image-20200323230153110

      AlexNet经历了500个epoch训练后最终能达到83%的准确率

      VGG16经历了200个epoch训练后最终能达到90%的正确率

      以上两种训练的模型参数我都保存到了仓库内

    在这里插入图片描述

    模型验证

      除了验证测试集以外,还可以用图片去验证模型的训练效果。

      选用的是验证效果比较好的VGG16网络,读取的参数是200个epoch训练后的参数

    image-20200323231914637

    image-20200323231935143

      可以看到,测试的效果还是非常好的,模型可以非常准确的判断花卉的种类。

    一个补充

      如果你恰好有个云服务器,又想做一个web服务器的话,可以尝试flask框架(当然在本地也可以使用flask,不过这个就没有多大意义了)

      按照flask文件夹中的程序,在服务器上运行之后,然后打开一个新网页,输入IP:端口?图片地址就可以做识别了。

    image-20200423135159846

      其中sjcup.cn是我的一个域名,这里可以替换为自己服务器的公网IP

      另外还有一个坑就是图片名称不可为中文名称,否则会检测不到

      公网IP无法访问的问题可以根据博客做一些修改

    下一步计划

    • 扩增数据集,可以识别更多类别的花卉
    • 采用新的网络训练,如Inception V3
    展开全文
  • tensorflow升级到1.0...任务:花卉分类版本:tensorflow 1.0花总共有五类,分别放在5个文件夹下。闲话不多说,直接上代码,希望大家能看懂:)复制代码# -*- coding: utf-8 -*-from skimage import io,transformim...
  • BP算法实例—鸢尾花的分类Python

    万次阅读 2018-08-06 15:29:13
    首先了解下Iris鸢尾花数据集: ...Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度...
  • Iris数据集(鸢尾花数据集下载,密码:ae1e)是常用的分类实验数据集,由Fisher,1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4...
  • 一、 数据集Iris(鸢尾花)数据集是多重变量分析的数据集。数据集包含150行数据,分为3类,每类50行数据。...可通过这4个属性预测鸢尾花卉属于三个种类(Setosa,Versicolour,Virginica)中的哪一类。样本数据...
  • 这个时候测试集就要用到了,为了便于观察,我们这里先给测试集重命名,这样子,哪张图片分类错了,我们也比较好找。 重命名代码: #!/usr/bin/python # -*- coding:utf-8 -*- import os outer_path = 'D:/flowers/...
  • 我们使用了102种花卉类别的数据集( )。 •解决方案:使用火炬视觉加载数据。 数据集分为三个部分:训练,验证和测试。 对于训练,应用了变换,例如随机缩放,裁剪和翻转。 这将有助于网络泛化,从而带来更好的...
  • 初识分类(鸢尾花卉数据集)

    千次阅读 2018-04-11 17:31:09
    注:本文用到的模块如Numpy,Scipy,matplotlib等都可以在 pythonlibs 里下载并使用pip安装,如果没有安装过这里有安装教程。本文提供的代码基于windows的python2.x,数据和代码都可以在github上打包下载。机器...
  • 来自花卉数据集的图像和相应标签的示例Pytorch是机器学习和Python上的免费软件包,非常易于使用。语法模拟numpy,因此,如果你在python中有一些科学计算经验,那么会相当有用的。只需几行代码,就可以下载预先训练的...
  • 原文链接:Python数据可视化-seaborn Iris鸢尾花数据​tecdat.cn首先介绍一下Iris鸢尾花数据集,内容摘自百度百科:Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。“Iris也称鸢尾花卉数据集,是一类...
  • python的pca实例记录

    2020-12-24 20:31:32
    仅作为保存,大佬请跳过 感谢大佬博主 原理+代码|Python 基于主成分分析的客户信贷评级实战(附源数据)——传送门 Iris鸢尾花卉数据集算法练习——PCA和K近邻分类器——传送门
  • windows系统下利用tensorflow+python实现花朵识别本文主要通过CNN进行花卉分类,训练结束保存模型,最后通过调用模型,输入花卉的图片通过模型来进行类别的预测。目的:识别不同的花朵环境:win10 +Tenso...
  • 首先介绍一下Iris鸢尾花数据集,内容摘自百度百科:Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。“Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个...
  • 首先介绍一下Iris鸢尾花数据集,内容摘自百度百科:Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。“Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个...
  • 之前数篇博客我们比较了几种具有...而本文便要介绍分类算法中比较古老的线性判别分析:线性判别最早提出合理的判别分析法者是R.A.Fisher(1936),Fisher提出将线性判别函数用于花卉分类上,将花卉的各种特征利用线性...
  • 学习性分类根据生物,于(三色。兰常栽培蝴蝶采用基质。保留苗圃包括统不灌系的排园林。下列中属花卉花的于冬季开是(。透气性增加,下n语土壤料分蒸发作方的耕防止法以促解和使肥水分,壤疏是为使土...
  • 鸢尾花卉数据集介绍 3.决策树实现鸢尾数据集分析 决策树算法根据数据的属性采用树状结构建立决策模型, 决策树模型常用来解决分类和回归问题。常见的算法包括:分类及回归树, ID3, C4 等 希望这篇文章对你有所...
  • 1、引入数据2、训练模型3、预测1、引入数据,采用经典的iris数据Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
热门标签
关键字:

花卉分类python

python 订阅