订阅
纠错
加入自媒体

如何构建一个 CNN 模型,以从图像中对幼苗的种类进行分类?

2021-06-03 17:05
磐创AI
关注

介绍本文将学习和构建一个 CNN 模型,以从图像中对幼苗的种类进行分类。该数据集有12组图像,我们的最终目的是从图像中对植物物种进行分类。

我们将执行多个步骤,例如导入库和模块、读取图像并调整它们的大小、图像清理、图像预处理、模型构建、模型训练、减少过度拟合,最后对测试数据集进行预测。

目录

问题陈述

导入库

获取数据并调整图像大小

清理图像并去除背景

将标签转换为数字

定义我们的模型并拆分数据集

防止过拟合

定义卷积神经网络

将 CNN 拟合到数据上

混淆矩阵

获得预测

问题陈述

该数据集由奥尔胡斯大学信号处理小组提供。这是一个典型的图像识别问题陈述。我们提供了一个图像数据集,其中包含处于不同生长阶段的植物照片。每张照片都有其唯一的 ID 和文件名。

该数据集包含来自 12 个植物物种的 960 种独特植物。最终目标是构建一个能够从照片中确定植物种类的分类器。

物种列表

Black-grass

Charlock

Cleavers

Common Chickweed

Common wheat

Fat Hen

Loose Silky-bent

Maize

Scentless Mayweed

Shepherds Purse

Small-flowered Cranesbill

Sugar beet

导入库

首先导入所有必要的库以供我们进一步分析。我们将使用 NumPy、Pandas、matplotlib、OpenCV、Keras 和 sci-kit-learn。

检查以下命令以导入所有必需的库

import numpy as np # MATRIX OPERATIONS

import pandas as pd # EFFICIENT DATA STRUCTURES
import matplotlib.pyplot as plt # GRAPHING AND VISUALIZATIONS
import math # MATHEMATICAL OPERATIONS
import cv2 # IMAGE PROCESSING - OPENCV
from glob import glob # FILE OPERATIONS
import itertools
# KERAS AND SKLEARN MODULES
from keras.utils import np_utils
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers import BatchNormalization
from keras.callbacks import ModelCheckpoint,ReduceLROnPlateau,CSVLogger
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
# GLOBAL VARIABLES
scale = 70
seed = 7

获取数据并调整图像大小

为了训练我们的模型,我们需要先读取数据。我们的数据集有不同大小的图像,因此我们将调整图像的大小。读取数据并调整其大小只需一步即可完成。查看以下代码以获取有关如何执行不同操作的完整信息。path_to_images = 'plant-seedlings-classification/train/png'
images = glob(path_to_images)
trainingset = []
traininglabels = []
num = len(images)
count = 1
#READING IMAGES AND RESIZING THEM
for i in images:
   print(str(count)+'/'+str(num),end='r')
   trainingset.append(cv2.resize(cv2.imread(i),(scale,scale)))
   traininglabels.append(i.split('/')[-2])
   count=count+1
trainingset = np.asarray(trainingset)
traininglabels = pd.DataFrame(traininglabels)

清理图像并去除背景

这是执行清理的一个非常重要的步骤。清理图像是一项艰巨的任务。我们将执行以下步骤以清理图像

将 RGB 图像转换为 HSV

为了去除噪声,我们将不得不模糊图像

为了删除背景,我们将不得不创建一个遮罩。new_train = []
sets = []; getEx = True
for i in trainingset:
   blurr = cv2.GaussianBlur(i,(5,5),0)
   hsv = cv2.cvtColor(blurr,cv2.COLOR_BGR2HSV)
   #GREEN PARAMETERS
   lower = (25,40,50)
   upper = (75,255,255)
   mask = cv2.inRange(hsv,lower,upper)
   struc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))
   mask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,struc)
   boolean = mask>0
   new = np.zeros_like(i,np.uint8)
   new[boolean] = i[boolean]
   new_train.append(new)
   if getEx:
       plt.subplot(2,3,1);plt.imshow(i) # ORIGINAL
       plt.subplot(2,3,2);plt.imshow(blurr) # BLURRED
       plt.subplot(2,3,3);plt.imshow(hsv) # HSV CONVERTED
       plt.subplot(2,3,4);plt.imshow(mask) # MASKED
       plt.subplot(2,3,5);plt.imshow(boolean) # BOOLEAN MASKED
       plt.subplot(2,3,6);plt.imshow(new) # NEW PROCESSED IMAGE
       plt.show()
       getEx = False

1  2  3  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

人工智能 猎头职位 更多
扫码关注公众号
OFweek人工智能网
获取更多精彩内容
文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号