您当前的位置: 首页 > 

寒冰屋

暂无认证

  • 4浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

训练DNN

寒冰屋 发布时间:2021-01-31 22:25:02 ,浏览量:4

目录

开发DNN

下一步

在这里,我们将建议一种DNN模型,用于检测图像上的驼鹿。然后,我们将提供Python代码来生成输入数据,以使用Caffe训练DNN。然后我们解释如何启动Caffe。最后,我们展示了训练日志并解释了结果。

  • 下载源34.8 KB
  • 下载模型-26 MB(外部链接)

野蛮的野生生物可能给企业和房主带来痛苦。鹿、驼鹿甚至猫等动物都会对花园、庄稼和财产造成破坏。

在本系列文章中,我们将演示如何在Raspberry Pi上实时(或近实时)检测有害生物(例如驼鹿),然后采取措施消除有害生物。由于我们不想造成任何伤害,我们将通过播放巨大的噪音来吓跑害虫。

欢迎您下载该项目的源代码。我们假设您熟悉Python并且对神经网络的工作原理有基本的了解。

在上一篇文章中,我们组装了用于驼鹿检测的数据集,其中包含带有驼鹿类和背景类对象的图像。在本文中,我们将开发一个分类器DNN模型并将其训练在我们的数据集上。我们将使用Caffe创建和训练DNN。请在您的PC上安装此框架以进行后续操作。

开发DNN

DNN的开发从创建模型结构开始。由于我们将在Raspberry P上使用我们的神经网络,因此该模型应该是轻量级的,以便可以足够的速度运行。

从头开始设计优化的DNN模型是一项相当复杂的任务,在此不再赘述。我们建议使用以下网络架构:

这是一个Caffe DNN模型,可以使用免费的在线编辑器进行可视化。它可能不是绝对最佳的模型,但对于我们的目的而言绝对足够好。

这是从AlexNet体系结构派生而来的,该体系结构是成功应用于图像分类的第一个(也是最简单的)网络。我们已经修剪和优化了原始体系结构,以对少量对象类别进行分类。结果模型具有四个带64-128-128-64内核(卷积过滤器)的卷积层。

还有两个池化层,用于将输入图片的尺寸减小到128 x 128像素。中间的完全连接(FC)层具有256个神经元,最后一个FC层具有两个神经元(每个对象类别进行分类:背景和驼鹿)。

我们需要的另一个组件是训练模型,它是一种改进的分类模型,用于替换输入和输出层。

训练模型的输入层必须指定用于训练和测试的标记数据的来源。输出层必须指定损失函数,以使训练期间的输出最小化。

为了提供标记数据的来源,我们创建了文本文件,该文本文件包含带有标签(图像对象类别的标识符)的所有示例图像的路径。让我们将示例图像组织到以下文件夹中:

PI_PEST

  • 学习
    • 0
    • 1
  • 测试
    • 0
    • 1

如您所见,我们有两个主要文件夹,学习和测试,分别用于训练和测试。0子文件夹用于背景样品,而1子文件夹用于驼鹿样品。

首先将每个类的500个样本图像移动到Testing目录,然后将其余所有图像移动到Learning目录。现在,让我们编写一些Python代码来生成源文件:

import os
import numpy as np
import cv2

class TrainFiler:
    def get_labels(self, folder):
        subfolders = os.scandir(folder)
        labels = []
        for classfolder in subfolders:
            class_name = os.path.basename(classfolder)
            files = FileUtils.get_files(classfolder)
            for (i, fname) in enumerate(files):
                label = fname + " " + class_name
                labels.append(label)
        return labels
    
    def save_labels(self, labels, filename):
        with open(filename, 'w') as f:
            for label in labels:
                f.write('%s\n' % label)
        
    def gen_train_files(self, learn_folder, test_folder, learn_file, test_file):
        labels = self.get_labels(learn_folder)
        self.save_labels(labels, learn_file)
        labels = self.get_labels(test_folder)
        self.save_labels(labels, test_file)

我们可以这样运行它:

learn_folder = r"C:\PI_PEST\Learning"
test_folder = r"C:\PI_PEST\Testing"
learn_file = r"C:\PI_PEST\classeslearn.txt"
test_file = r"C:\PI_PEST\classestest.txt"

filer = TrainFiler()
filer.gen_train_files(learn_folder, test_folder, learn_file, test_file)

这将导致两个具有以下数据的源文件:

…
C:\PI_PEST\Learning\0\vlcsnap-2020-10-26-16h13m39s332(x253,y219,w342,h342)fliprotate15.png 0
C:\PI_PEST\Learning\0\vlcsnap-2020-10-26-16h13m39s332(x253,y219,w342,h342)fliprotate_15.png 0
C:\PI_PEST\Learning\1\vlcsnap-2020-10-21-13h46m55s365(x106,y28,w633,h633).png 1
C:\PI_PEST\Learning\1\vlcsnap-2020-10-21-13h46m55s365(x106,y28,w633,h633)flip.png 1
…
…
C:\PI_PEST\Testing\0\vlcsnap-2020-10-26-16h16m22s719(x39,y36,w300,h300)smooth5rotate15.png 0
C:\PI_PEST\Testing\0\vlcsnap-2020-10-26-16h16m22s719(x39,y36,w300,h300)smooth5rotate_15.png 0
C:\PI_PEST\Testing\1\vlcsnap-2020-10-26-16h08m31s421(x276,y0,w566,h566)flipsharpen5.png 1
C:\PI_PEST\Testing\1\vlcsnap-2020-10-26-16h08m31s421(x276,y0,w566,h566)flipsharpen5rotate15.png 1
…

在开始训练过程之前,最后要做的就是准备所谓的求解器规范。对于Caffe框架,这是一个包含训练过程参数的文本文件。

net: "classes_learn_test.prototxt"
test_iter: 1000
max_iter: 100000
base_lr: 0.001
solver_mode: CPU

该net参数指定路径到“训练”的模式,test_iter是准确的测试期间,max_iter是迭代运行的最大数目,base_lr是学习速率的初始值,而solver_mode参数定义是否在CPU或GPU训练过程执行。

要启动Caffe进行模型训练,我们需要将以下数据文件复制到Caffe可执行文件夹中:classes_learn_test.prototxt(训练文件),classeslearn.txt和classestest.txt(生成的训练和测试数据文件),以及classes_solver.prototxt(求解器规范文件)。

使用以下命令启动训练过程:

caffe.exe train -solver=classes_solver.prototxt

在打开的控制台窗口中,您可以看到训练过程的进度:

I1028 09:10:24.546773 32860 solver.cpp:330] Iteration 3000, Testing net (#0)
I1028 09:13:12.228042 32860 solver.cpp:397] 	Test net output #0: accuracy = 0.95
I1028 09:13:12.229039 32860 solver.cpp:397] 	Test net output #1: loss = 0.209061 (* 1 = 0.209061 loss)
I1028 09:13:12.605070 32860 solver.cpp:218] Iteration 3000 (1.83848 iter/s, 543.929s/1000 iters), loss = 0.0429298
I1028 09:13:12.605070 32860 solver.cpp:237] 	Train net output #0: loss = 0.00469132 (* 1 = 0.00469132 loss)
I1028 09:13:12.608062 32860 sgd_solver.cpp:105] Iteration 3000, lr = 0.000800107
I1028 09:19:11.598755 32860 solver.cpp:447] Snapshotting to binary proto file classes_iter_4000.caffemodel
I1028 09:19:11.641045 32860 sgd_solver.cpp:273] Snapshotting solver state to binary proto file classes_iter_4000.solverstate
I1028 09:19:11.661990 32860 solver.cpp:330] Iteration 4000, Testing net (#0)
I1028 09:21:51.567586 32860 solver.cpp:397] 	Test net output #0: accuracy = 0.971
I1028 09:21:51.568584 32860 solver.cpp:397] 	Test net output #1: loss = 0.0755974 (* 1 = 0.0755974 loss)
I1028 09:21:51.942620 32860 solver.cpp:218] Iteration 4000 (1.92553 iter/s, 519.337s/1000 iters), loss = 0.0283988
I1028 09:21:51.942620 32860 solver.cpp:237] 	Train net output #0: loss = 0.0119124 (* 1 = 0.0119124 loss)
I1028 09:21:51.942620 32860 sgd_solver.cpp:105] Iteration 4000, lr = 0.000751262
I1028 09:29:05.931291 32860 solver.cpp:447] Snapshotting to binary proto file classes_iter_5000.caffemodel
I1028 09:29:06.011082 32860 sgd_solver.cpp:273] Snapshotting solver state to binary proto file classes_iter_5000.solverstate
I1028 09:29:06.042008 32860 solver.cpp:330] Iteration 5000, Testing net (#0)
I1028 09:32:13.374222 32860 solver.cpp:397] 	Test net output #0: accuracy = 0.877
I1028 09:32:13.374222 32860 solver.cpp:397] 	Test net output #1: loss = 0.861016 (* 1 = 0.861016 loss)
I1028 09:32:13.743319 32860 solver.cpp:218] Iteration 5000 (1.60823 iter/s, 621.8s/1000 iters), loss = 0.000519958
I1028 09:32:13.743319 32860 solver.cpp:237] 	Train net output #0: loss = 0.000306881 (* 1 = 0.000306881 loss)
I1028 09:32:13.745313 32860 sgd_solver.cpp:105] Iteration 5000, lr = 0.000708472

我们应该监视的值为accuracy。在迭代4000中增加到97.1%,然后开始减少。这可能是由于训练模型的过度拟合。因此,我们应该停止该过程,并从第4000次迭代中获取模型文件。

下一步

在接下来的文章中,我们将向您展示如何开发一个简单的运动检测器,并与训练的DNN模型结合起来,以检测视频驼鹿。

https://www.codeproject.com/Articles/5289752/Training-a-DNN

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0835s