本实验全部源码以及数据集以上架面包多(超便宜),点击购买,关注公众号[全都是码农]免费获得更多超值内容!


实验内容

某地区的多个罗非鱼池塘水样数据,包含水产专家按水色判断水质分类的数据,以及用数码相机按照标准进行水色采集的数据,如表1和图1所示。每个水质图片命名规则是“类别-编号.jpg”,如“1_1.jpg”是第一类样本的图片。请根据这些样本,利用数字图像处理技术,通过水色图像实现水质的自动评价。

水色 浅绿色(清水或浊水) 灰蓝色 黄褐色 茶褐色 (姜黄、茶褐、红褐、褐中带绿等) 绿色 (黄绿、油绿、蓝绿、墨绿、绿中带褐等)
水质类别 1 2 3 4 5

图1 水样图像

实验过程

观察样本图片,发现其几乎每张图片都有背景噪声,所以需要先对图像进行预处理,如下代码:

image-20201209112109499

输入fromdir为图片文件夹,todir为输出文件夹。

对处理过的图片进行HSV颜色矩提取并打上标签:

image-20201209112134955

image-20201209112149285

接下来编写神经网络相关代码:

分析csv数据:

image-20201209112310084

读取颜色矩:

image-20201209112329927

定义网络变量:

class NNetConfig():
    num_classes = 5  # 多分类的种类
    num_epochs = 500  # 训练总批次
    print_per_epoch = 100  # 每训练多少批次时打印训练损失函数值和预测准确率值
    # layersls = [9, 20, 30,60,120,60,30, 20, 5]  # 极其不稳定
    # layersls = [9, 20, 30, 60, 120, 60, 30, 20, 5]  # 【输入,隐藏各层节点数,输出】 500轮90%一般,2000轮100%完全拟合
    layersls = [9, 20, 60, 20, 5]  # 【输入,隐藏各层节点数,输出】 500轮 90%稳定 2000轮过拟合

    learning_rate = 0.01  # 网络学习率
    train_filename = './clour/xunshu.csv'  # 训练数据
    test_filename = './clour/ceshu.csv'  # 测试数据
    best_model_savepath = "./dnn/"  # 最好模型的存放文件夹

编写网络:

class NNet(object):
    def __init__(self, config):
        self.config = config
        self.layersls = config.layersls
        self.NNet()

    def NNet(self):  # 根据给出的输入输出及每层网络的节点数搭建深度学习网络
        """
        根据给出的输入输出及每层网络的节点数搭建深度学习网络
        :param layersls: 【输入,隐藏各层节点数,输出】
        :return:
        """
        model = tf.keras.Sequential()
        for i in range(len(config.layersls)):
            if (i == 0):  # 确定网络的输入和网络的第一层节点数
                model.add(tf.keras.layers.Dense(config.layersls[1],
                                                activation="relu",
                                                input_shape=(config.layersls[0],)))
                i += 1
            elif (i == len(config.layersls) - 1):  # 确定网络的输出
                model.add(tf.keras.layers.Dense(config.layersls[i]))
            else:  # 网络的各隐藏层节点数
                model.add(tf.keras.layers.Dense(config.layersls[i],
                                                activation="relu"))
        return model

剩下详细代码自行下载阅读


实验结果

运行zero_slip.py输出如下:

\1.  filename **is** :2_6.jpg 

\2.  the fulll name of the file **is** :.\xun\2_6.jpg 

\3.  parent **is** :.\xun 

\4.  filename **is** :2_7.jpg 

\5.  the fulll name of the file **is** :.\xun\2_7.jpg 

\6.  parent **is** :.\xun 

\7.  <......> 

\8.  the fulll name of the file **is** :.\xun\5_5.jpg 

\9.  parent **is** :.\xun 

\10. filename **is** :5_6.jpg 

\11. the fulll name of the file **is** :.\xun\5_6.jpg 

\12. 训练集集切割完毕 

切割图像部分如下:

img

如图所示切割完整,效果良好。

运行first_feature.py进行特征提取:

1.    以输出颜色矩到./clour/ceshu.csv  
2.    以输出颜色矩到./clour/xunshu.csv  

输出完整。

运行second_train.py:

输出loss值和准确率值:

img

\1.  <DatasetV1Adapter shapes: (), types: tf.string> 

\2.  当前最高准确率:0.455: 

\3.  Epoch 000: Loss: 6.768, Accuracy: 45.455%, isBest:* 

\4.  当前最高准确率:0.591: 

\5.  Epoch 100: Loss: 1.072, Accuracy: 59.091%, isBest:* 

\6.  当前最高准确率:0.636: 

\7.  Epoch 200: Loss: 0.787, Accuracy: 63.636%, isBest:* 

\8.  当前最高准确率:0.727: 

\9.  Epoch 300: Loss: 0.613, Accuracy: 72.727%, isBest:* 

\10. Epoch 400: Loss: 0.723, Accuracy: 68.182%, isBest: 

\11. 开始对已训练网络进行测试: 

\12. <DatasetV1Adapter shapes: (), types: tf.string> 

\13. 测试数据的测试结果为: 72.727% 

\14. tf.Tensor(0.7272727272727273, shape=(), dtype=float64) 

\15. 预测下面1个水质颜色矩的类别(正确答案为:三): 

\16. [[29.5469, 146.3947, 123.1732, 0.864407537, 5.590716583, 1.752484454, 1.029934609, 6.391303213, 2.040322913]] 

\17. ['三'] 

最后输出正确的验证结果。

运行th_app.py并输入图片地址 ./cep/1_50.jpg :

1.    输入图片地址:./cep/1_50.jpg  
2.    此图片为:['一']  

结果正确。


本实验全部源码以及数据集以上架面包多(超便宜),点击购买,关注公众号[全都是码农]免费获得更多超值内容!