果实采摘智能辅助系统tensorflow.keras开发

果实采摘智能辅助系统tensorflow开发,进行开溜结缘,减少人工,达到智能化

数据预处理

在网络上爬去图片

import tkinter as tk
import tkinter.messagebox
import requests
import os
import traceback
from selenium import webdriver
import time
from tkinter import ttk
from tkinter import filedialog



win = tk.Tk()
win.title("图片搜索下载")    # 添加标题

# 进行网格布局
ttk.Label(text='').grid(row=0,padx=10)
ttk.Label(text='').grid(row=1,padx=60)
ttk.Label(text='').grid(row=2,padx=60)
ttk.Label(text='').grid(row=3,padx=60)
ttk.Label(text='').grid(row=4,padx=60)
ttk.Label(text='').grid(row=5,padx=60)
ttk.Label(text='').grid(row=6,padx=60)
ttk.Label(text='').grid(row=7,padx=60)
ttk.Label(text='').grid(row=9,padx=60)
ttk.Label(text='').grid(row=11,padx=60)
ttk.Label(text='').grid(row=13,padx=60)

ttk.Label(text='').grid(column=6,padx=35)
ttk.Label(text='').grid(column=7,padx=35)
'''
ttk.Label(text='').grid(column=8,padx=20)
ttk.Label(text='').grid(column=4,padx=20)
'''
ttk.Label(win, text="关键字:").grid(column=3, row=8)    # 添加一个标签,并将其列设置为3,行设置为8
ttk.Label(win, text="下载页数:").grid(column=3, row=10)      # 设置其在界面中出现的位置  column代表列   row 代表行
ttk.Label(win, text="下载路径:").grid(column=3, row=12)

# 定义下载函数
def download(url, filename):
    # 检查下载目录是否存在
    if os.path.exists(filename):
        print('file exists!')
        return
    try:
        # 保存下载图片
        r = requests.get(url, stream=True, timeout=60)
        r.raise_for_status()
        with open(filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024):
                if chunk:  # filter out keep-alive new chunks
                    f.write(chunk)
                    f.flush()
        return filename
    except KeyboardInterrupt:
        if os.path.exists(filename):
            os.remove(filename)
        raise KeyboardInterrupt
    except Exception:
        traceback.print_exc()
        if os.path.exists(filename):
            os.remove(filename)
            
# 定义获取路径函数
def selectDir():
    global file_path
    file_path.set(filedialog.askdirectory())

# 定义爬虫函数
def pa():
    try:
        #对输入的量进行控制,预防程序的奇怪错误
        start = 1
        end = int(float(name1.get()))
        # 创建下载目录,可以修改Imgs4成其它的,也可以下载到现有目录
    #    if os.path.exists(name.get()) is False:
    #        os.makedirs(name.get())
    #    if os.path.exists(r'C:\Users\Mercer\Pictures\library') is False:
    #        os.makedirs(r'C:\Users\Mercer\Pictures\library')
        if os.path.exists(file_path.get()) is False:
            os.makedirs(file_path.get())
        
        # 打开谷歌浏览器Chrome
    
        
        browser = webdriver.Chrome()
        
        browser.get("http://image.baidu.com")
        #print(browser.page_source)
        find_1=browser.find_element_by_id("kw")
        print('----------------------------')
        print(find_1)
        find_1.send_keys(keyWord.get())
        
        btn=browser.find_element_by_class_name("s_search")
        print('----------------------------')
        print(btn)
        btn.click()
    #    
    #    imgs=browser.find_elements_by_class_name("imgitem")
    #    print('----------------------------')
    #    print(imgs[0])
    #    imgs[0].click()
    #    print('----------------------------')
    #    
        url=browser.find_element_by_name("pn0").get_attribute('href')
        browser.get(url)
        
        


        # 设置下载的图片数量及进行下载
        for i in range(start,end + 1):
        #     # 获取图片位置
            img = browser.find_elements_by_xpath("//img[@class='currentImg']")
            for ele in img:
                #   获取图片链接
                target_url = ele.get_attribute("src")
                #   设置图片名称。以图片链接中的名字为基础选取最后25个字节为图片名称。
                img_name = target_url.split('/')[-1]
    #            filename = os.path.join(r'C:\Users\Mercer\Pictures\library', "3_"+str(i)+".jpeg")
    #            filename = os.path.join(name.get(), "3_"+str(i)+".jpeg")
                filename = os.path.join(file_path.get(), keyWord.get()+"_"+str(i)+".jpeg")
                download(target_url, filename)
        #     # 下一页
            next_page = browser.find_element_by_class_name("img-next")
            next_page.click()
            time.sleep(3)
        #     # 显示进度
            print('%d / %d' % (i, end))
        
        # 关闭浏览器
        browser.quit()
    except ValueError:
        tkinter.messagebox.askokcancel("错误提示","你输入的应该是整数")
        
        

# 按钮
action = ttk.Button(win, text="点击搜索", command=pa)     # 创建一个按钮, text:显示按钮上面显示的文字, command:当这个按钮被点击之后会调用command函数
action.grid(column=5, row=14)    # 设置其在界面中出现的位置  column代表列   row 代表行

select=ttk.Button(win,text="选择目录",command=selectDir)
select.grid(column=6,row=12)

# 爬取关键词
keyWord = tk.StringVar()
keyWordEntered = ttk.Entry(win, width=34, textvariable=keyWord)
keyWordEntered.grid(column=4, columnspan=2, row=8)      # 设置其在界面中出现的位置  column代表列   row 代表行
keyWordEntered.focus()     # 当程序运行时,光标默认会出现在该文本框中

# 下载数量
name1 = tk.StringVar()     # StringVar是Tk库内部定义的字符串变量类型,在这里用于管理部件上面的字符;不过一般用在按钮button上。改变StringVar,按钮上的文字也随之改变。
name1Entered = ttk.Entry(win, width=34, textvariable=name1)   # 创建一个文本框,定义长度为12个字符长度,并且将文本框中的内容绑定到上一句定义的name变量上,方便clickMe调用
name1Entered.grid(column=4,columnspan=2,  row=10)       # 设置其在界面中出现的位置  column代表列   row 代表行

#目标文件夹名
file_path = tk.StringVar()     # StringVar是Tk库内部定义的字符串变量类型,在这里用于管理部件上面的字符;不过一般用在按钮button上。改变StringVar,按钮上的文字也随之改变。
nameEntered = ttk.Entry(win, width=34, textvariable=file_path)   # 创建一个文本框,定义长度为12个字符长度,并且将文本框中的内容绑定到上一句定义的name变量上,方便clickMe调用
nameEntered.grid(column=5, row=12)       # 设置其在界面中出现的位置  column代表列   row 代表行

#标题图片
photo = tk.PhotoImage(file="spyder.gif")#file:t图片路径
imgLabel = tk.Label(win,image=photo)#把图片整合到标签类中
imgLabel.grid(row=3,column=5)

win.mainloop()      # 当调用mainloop()时,窗口才会显示出来

模型搭建和创建

 

# coding: utf-8

from __future__ import print_function

import glob
import math
import os
from PIL import Image
from IPython import display
import xmldict
from matplotlib import cm
from matplotlib import gridspec
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import metrics
import tensorflow as tf
from tensorflow.python.data import Dataset
from keras.models import load_model
tf.logging.set_verbosity(tf.logging.ERROR)
pd.options.display.max_rows = 2
pd.options.display.float_format = '{:.1f}'.format
import xml.dom.minidom as xmldom
from random import shuffle


IMG_W = 128
IMG_H = 80
_shape=IMG_H*IMG_W*3#高*宽*通道RGB


import numpy as np
from sklearn import preprocessing
from keras import layers
from keras.layers import Input, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D
from keras.layers import AveragePooling2D, MaxPooling2D, Dropout, GlobalMaxPooling2D, GlobalAveragePooling2D
from keras.models import Model
from keras.preprocessing import image
from keras.utils import layer_utils
from keras.utils.data_utils import get_file
from keras.applications.imagenet_utils import preprocess_input
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
from keras.utils import plot_model
import keras.backend as K
K.set_image_data_format('channels_last')
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
from keras import regularizers
import keras
get_ipython().run_line_magic('matplotlib', 'inline')



#对彩色图片进行预处理并和标签一起存入数组
def get_files(address,_data,color):
    if color=='g':
        flag=0
    elif color=='y':
        flag=1
    elif color=='r':
        flag=2
    for file in os.listdir(address):
        image=Image.open(address+'/'+file)
        image=image.resize([IMG_W, IMG_H])#调整大小
        R=image.getchannel('R')
        G=image.getchannel('G')
        B=image.getchannel('B')
        image=Image.merge("RGB", (R, G, B))#把RGB通道读出来后(去除图片中的alpha等其他可能存在的通道
        image=np.asarray(image)#转成数组
        _data.append([image,flag])#把[image,flag]添到数组最后
    return _data


initialTrainData=[]

#图片预处理后和flag一起存入数组
address='C:/Users/SeverusSnape/Desktop/myProject/pre/train/g'
initialTrainData=get_files(address,initialTrainData,'g')
address='C:/Users/SeverusSnape/Desktop/myProject/pre/train/r'
initialTrainData=get_files(address,initialTrainData,'r')
address='C:/Users/SeverusSnape/Desktop/myProject/pre/train/y'
initialTrainData=get_files(address,initialTrainData,'y')

initialTestData=[]

#图片预处理后和flag一起存入数组
address='C:/Users/SeverusSnape/Desktop/myProject/pre/test/g'
initialTestData=get_files(address,initialTestData,'g')
address='C:/Users/SeverusSnape/Desktop/myProject/pre/test/r'
initialTestData=get_files(address,initialTestData,'r')
address='C:/Users/SeverusSnape/Desktop/myProject/pre/test/y'
initialTestData=get_files(address,initialTestData,'y')

def data_process(data,label,initialData):
    #把initialData里image和flag取出按序放入data和label中
    for item in initialData:
        data.append(item[0])
        label.append([item[1]])
    data=np.array(data)#转为np数组
    
    #one_hot encoding对label独热编码
    #对分类型特征值进行编码,最终对于每条数据m个特征中仅有一个特征值为1,其他的都为0
    encoder = preprocessing.OneHotEncoder()
    ont_hot=encoder.fit(label)#学习编码
    label=ont_hot.transform(label).toarray()#进行编码
    return data, label

train_data=[]
train_label=[]
test_data=[]
test_label=[]

train_data,train_label=data_process(train_data,train_label,initialTrainData)
test_data,test_label=data_process(test_data,test_label,initialTestData)



def HappyModel(input_shape):
    """
    Implementation of the HappyModel.

    Arguments:
    input_shape -- shape of the images of the dataset

    Returns:
    model -- a Model() instance in Keras
    """

    X_input = Input(input_shape)#实例化keras张量
    
    ##第一层##    
    #使用L2正则化,正则化系数0.01
    X = Conv2D(32, (3, 3), strides = (3, 3), name = 'conv0',kernel_regularizer=regularizers.l2(0.01))(X_input)    
    X = Dropout(rate=0.05)(X)#梯度下降,rate=5%
    
    #归一化层
    #BN方法,将该层特征值分布重新拉回标准正态分布
    X = BatchNormalization(axis = 3, name = 'bn0')(X)#axis要规范化的轴,通常为特征轴
    #非线性激活函数ReLu
    X = Activation('relu')(X)
    
    # MAXPOOL最大池化层,用来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性
    X = MaxPooling2D((2, 2), name='max_pool_1')(X)

    ##第二层##
    X = Conv2D(4, (3, 3), strides = (3, 3), name = 'conv1',kernel_regularizer=regularizers.l2(0.01))(X)
    X = Dropout(rate=0.15)(X)
    X = BatchNormalization(axis = 3, name = 'bn1')(X)
    X = Activation('relu')(X)
    
    # MAXPOOL
    X = MaxPooling2D((2, 2), name='max_pool_2')(X)
 

    X = Flatten()(X)#降维
    X = Dense(3, activation='softmax', name='dense')(X)#全连接神经网络层
    
    
    model = Model(inputs = X_input, outputs = X)

    return model


model=HappyModel((IMG_H,IMG_W,3))
model.summary()#打印model


#优化器,损失函数(交叉熵损失函数),评估模型在训练和测试时的性能的指标
model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])


#用from livelossplot.keras import PlotLossesKeras要装tensorflow环境,然而我没有。
# .fit()里加callbacks=[PlotLossesKeras()],
#fit函数返回一个History的对象
#其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况
hist =model.fit(x = train_data, y = train_label,
                validation_data=[test_data, test_label], 
                epochs = 500, batch_size = 64)


hist.history['val_acc'][0]#记录运行输出
acc = hist.history['acc']
loss = hist.history['loss']

preds = model.evaluate(test_data, test_label)
print ("Loss = " + str(preds[0]))
print ("Test Accuracy = " + str(preds[1]))


model.save('C:/Users/SeverusSnape/Desktop/myProject/classifier_3.h5')
del model

绘制模型训练曲线

#绘制曲线
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
lns1 = ax1.plot(np.arange(500), loss, label="Loss")
# 按一定间隔显示实现方法
# ax2.plot(200 * np.arange(len(fig_accuracy)), fig_accuracy, 'r')
lns2 = ax2.plot(np.arange(500), acc, 'r', label="Accuracy")
ax1.set_xlabel('训练轮次')
ax1.set_ylabel('训练损失值')
ax2.set_ylabel('训练准确率')
# 合并图例
lns = lns1 + lns2
labels = ["损失", "准确率"]
# labels = [l.get_label() for l in lns]
plt.legend(lns, labels, loc=7)
plt.show()

图片拍摄

from __future__ import print_function

import glob
import math
import os
from PIL import Image
from IPython import display
import xmldict
from matplotlib import cm
from matplotlib import gridspec
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import metrics
import tensorflow as tf
from tensorflow.python.data import Dataset
from keras.models import load_model
tf.logging.set_verbosity(tf.logging.ERROR)
pd.options.display.max_rows = 2
pd.options.display.float_format = '{:.1f}'.format
import xml.dom.minidom as xmldom
from random import shuffle


IMG_W = 128
IMG_H = 80
#_shape=IMG_H*IMG_W*3


import numpy as np
from sklearn import preprocessing
from keras import layers
from keras.layers import Input, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D
from keras.layers import AveragePooling2D, MaxPooling2D, Dropout, GlobalMaxPooling2D, GlobalAveragePooling2D
from keras.models import Model
from keras.preprocessing import image
from keras.utils import layer_utils
from keras.utils.data_utils import get_file
from keras.applications.imagenet_utils import preprocess_input
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
from keras.utils import plot_model
import keras.backend as K
K.set_image_data_format('channels_last')
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
from keras import regularizers
import keras
get_ipython().run_line_magic('matplotlib', 'inline')

from keras.models import load_model

import matplotlib
matplotlib.use('Agg')
import os
from keras.models import load_model
import numpy as np
from PIL import Image
import cv2
    
#调用笔记本内置摄像头,参数为0,如果有其他的摄像头可以调整参数为1,2
cap=cv2.VideoCapture(0)
while True:
    #从摄像头读取图片
    sucess,img=cap.read()
    #显示摄像头
    cv2.imshow("img",img)
    #等待时延为1ms,用保持画面的持续。
    k=cv2.waitKey(1)
    if k == 27:
        #通过esc键退出摄像
        cv2.destroyAllWindows()
        break
    elif k == 13:
        #通过回车保存图片,并退出。
        cv2.imwrite('C:/Users/SeverusSnape/Desktop/myProject/images/try.png',img)
        cv2.destroyAllWindows()
        break
#关闭摄像头
cap.release()

模型加载和调用

from __future__ import print_function

import glob
import math
import os
from PIL import Image
from IPython import display
import xmldict
from matplotlib import cm
from matplotlib import gridspec
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import metrics
import tensorflow as tf
from tensorflow.python.data import Dataset
from keras.models import load_model
tf.logging.set_verbosity(tf.logging.ERROR)
pd.options.display.max_rows = 2
pd.options.display.float_format = '{:.1f}'.format
import xml.dom.minidom as xmldom
from random import shuffle

import numpy as np
from sklearn import preprocessing
from keras import layers
from keras.layers import Input, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D
from keras.layers import AveragePooling2D, MaxPooling2D, Dropout, GlobalMaxPooling2D, GlobalAveragePooling2D
from keras.models import Model
from keras.preprocessing import image
from keras.utils import layer_utils
from keras.utils.data_utils import get_file
from keras.applications.imagenet_utils import preprocess_input
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
from keras.utils import plot_model
import keras.backend as K
K.set_image_data_format('channels_last')
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
from keras import regularizers
import keras
get_ipython().run_line_magic('matplotlib', 'inline')

from keras.models import load_model

import matplotlib
matplotlib.use('Agg')
import os
from keras.models import load_model
import numpy as np
from PIL import Image 
from IPython.display import Image as IMG
import cv2

import urllib.request
import json
import time
import requests
from time import sleep

#shape=IMG_H*IMG_W*3
IMG_W = 128
IMG_H = 80

#加载模型h5文件
model = load_model('C:/Users/SeverusSnape/Desktop/myProject/classifier_3.h5')
#model.summary()#打印模型参数

#规范化图片大小和像素值
def get_inputs(src=[]):
    rsltData = []
    for s in src:
        input = cv2.imread(s)#读入图像,BGR
        input = cv2.resize(input, (IMG_W, IMG_H))#缩放
        input = cv2.cvtColor(input, cv2.COLOR_BGR2RGB)#将BGR图片转成RGB
        pre_y = model.predict(np.reshape(input,[1,IMG_H,IMG_W,3]),batch_size=1)        
        a = np.argmax(pre_y, axis=1)#必须通过遍历否则格式不对,不止包含数还包括btypy
        for i in a:
            rsltData.append(i)#将最大概率对应的标签加入rsltData列表尾部
    return rsltData

predict_dir = 'C:/Users/SeverusSnape/Desktop/myProject/images/'#要预测的图片所在文件夹
picName = os.listdir(predict_dir)#获得文件夹内的文件名

images = []
for testpath in picName:
    fn = os.path.join(predict_dir, testpath)
    if fn.endswith('png'):#后缀是png的文件会被存入images列表
        picData = fn
        print(picData)#打印被存入的图片地址
        images.append(picData)#地址存入images列表
        
rsltData = get_inputs(images)#调用规范化图片函数得到最大概率对应标签
print(rsltData)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值