目录
本文的核心是使用深度神经网络对采集到的图片进行识别,采集的图片包括天牛(害虫)、非害虫,通过深度学习网络的训练,最终实现对于害虫的识别。
1.绪论
1.1 研究背景
害虫与农业的发展始终伴随,随着人类耕种文化的起始,害虫就已经出现,在重农时代,可以通过自然界食物链自身的约束去整治害虫,在农耕文化中也有使用一些人类独创的手段去防治害虫的,但是这些手段相对简单,不能起到很好作用。随着现代农业技术的发展,采用生物手段防治害虫是近几年农业防治害虫中发展较为快速的一条道路,已经有很多成熟案例。
在农业害虫中,有很多常见的害虫,比如蝗虫,在几年全球的蝗灾中,可以看到蝗虫对整个农业生产会造成毁灭性打击,比如非洲蝗灾,造成了下相当大的农业损失,被全球的粮食安全造成了极大威胁,给粮食产量也造成了不良影响。在我国,最为常见的害虫是天牛,天牛对农业生产有巨大反作用,天牛繁殖速度很快,而且天牛使用农作物的速度也很快,如果发生了天牛啃食农作物的情况,而没有及时发现和制止,就很可能造成大片面积的农作物的损失,因此,及时预测及时发现就可以更早处理天牛灾害,挽救农业损失。
1.2 研究意义
近些年,随着硬件和算力的持续发展,机器学习和人工智能等学科有了新的起色,并在一些领域取得了成功应用。基于神经网络的图像识别以及应用取得了一些进展。为促使神经网络的进一步落地,基于神经网络的图像识别以及其应用有一定研究价值和应用价值,在农业害虫防止方面,可以应用神经网络技术对含有某种害处的图像进行打标,然后基于已有数据进行有师学习,在模型训练完成之后,可以基于模型对采集到的农业图像进行识别,从而对害虫防止起到一定作用。可以尽早识别害虫,从而提升农作物产量。
2 相关技术介绍
2.1 计算机视觉
计算机视觉在模型识别中的应用是分类,基于原始数据,然后经过一定算法和程序进行计算,计算之后的结果是具有离散特性的数据。计算机视觉是一个典型的交叉学科,需要集合计算机、图像图形学、数学、统计学、概率学等等学科,基于神经网络的计算机视觉是这样一种逻辑,基于图像的原始数据,也就是含有具体像素的点,这些点都有一个数值,这个数值就是灰度值,如果一个图像含有很多像素,就会含有很多灰度值,这些灰度值都是输入,每一个输入在神经网络中都是输入点,每个输入点可以和内部的隐层节点之间有关系,通过算法可以不断训练这些内部点的权重,最终调整一个合理的模型,这些模型可以对图像的正例和反例进行识别,并达到一定准确率。
在本文中,基于原始图像,将图像统一处理成大小统一的,并采用黑白图进行训练。
2.2 深度学习
神经网络就是形成若干个节点来模拟人类的神经元,神经元之间的关系,可以通过神经网络前后的计算关系来模型,每一个神经元之间的计算关系都有一定权值,采用神经网络的迭代算法就可以持续迭代和更新神经网络中的节点,是的这些节点不断变化其权值,最终可以准确预测图像中的模式,达到预测和训练的效果。训练完成之后,可以利用测试集对模型的效果进行评估。如果神经网络在训练集和测试集上的表现都较好,说明模型训练比较成功,否则就需要思考和处理过拟合和欠拟合的问题。
3 需求分析
3.1 可行性分析
略
3.2 需求分析
构建过程如下:
图像采集->图像预处理->图像识别建模(识别害虫)->调参(可略,论文中已提供)->评估结果
4 模型设计
图像作为输入,输出为二维,是害虫,或者不是害虫。
5 模型实现
5.1 图像说明
上图中的左侧是天牛(害虫),后侧是蜜蜂、蜻蜓等(非害虫)
图像是从百度图片中获取的
核心代码如下
urlstr = buildUrls(keyWords)
for url in urlstr :
html = requests.get(url, timeout=10).content.decode('utf-8')
imgUrls = resolveImgUrl(html)
if len(imgUrls) == 0:
break
for url in imgUrls:
if downImg(url, dirpath, str(index) + ".jpg"):
index += 1
if index >= 100:
break
if index >= 100:
break
5.2 数据预处理
将原始图像转成128*128的灰度图像
图像转换的代码如下
def loadImage(dirr,copyDir,num):
# 读取图片
image =dirr+num+".jpg"
im = Image.open(image)im1=im.convert("L")
im2 = im1.resize((SIZE,SIZE))
imageCopy =copyDir+num+".jpg"
im2.save(imageCopy)
下面将预处理完成的图像进行分割,分割训练集和测试集。代码如下
def splitTrainAndTest(data1,data2,ratio):
indices = np.random.permutation(len(data1))
testSize = int(len(data1)*ratio)
testIndices = indices[:testSize]
trainIndices = indices[testSize:]
return data1[trainIndices],data2[trainIndices],data1[testIndices],data2[testIndices]
5.3 模型训练
最后进行模型训练,识别出来天牛(害虫)
代码如下:
from tensorflow import keras
model = keras.Sequential([
keras.layers.Flatten(input_shape=(128, 128)),
keras.layers.Dense(1000, activation='relu'),
keras.layers.Dense(500, activation='relu'),
keras.layers.Dense(300, activation='relu'),
keras.layers.Dense(200, activation='relu'),
keras.layers.Dense(2)
])
model.compile(optimizer='adam',
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=20)
6.模型测试
调用训练好的模型,测试图像,结果正确。
对测试集的所有图像进行测试,生产混淆矩阵。