目录
介绍
足够的数据集
收集图像
调整图像大小
下一步
在这里,我们简要说明了数据集的要求。然后,我们提出了收集数据的方法:在Internet上搜索图像,搜索视频并从中上传帧。然后,我们提供一些找到的视频的参考。然后,我们说明使用可用工具进行数据收集的基本步骤。然后,我们提供用于数据预处理的Python代码。最后,我们演示收集的图像示例。
- 下载源34.8 KB
- 下载模型-26 MB(外部链接)
野蛮的野生生物可能给企业和房主带来痛苦。鹿、驼鹿甚至猫等动物都会对花园、庄稼和财产造成破坏。
在本系列文章中,我们将演示如何在Raspberry Pi上实时(或近实时)检测有害生物(例如驼鹿),然后采取措施消除有害生物。由于我们不想造成任何伤害,我们将通过播放巨大的噪音来吓跑害虫。
欢迎您下载该项目的源代码。我们假设您熟悉Python并且对神经网络的工作原理有基本的了解。
在上一篇文章中,我们讨论了检测“外来”有害生物的方法——大多数经过预先训练的DNN模型中都没有考虑的那些生物。我们决定开发和训练我们自己的分类器DNN模型,并将其与运动检测算法结合使用。在本文中,我们将看到如何为DNN分类器准备足够的数据集。
足够的数据集某一特定数据集是否适合某一特定的DNN模型取决于该模型希望解决的问题。我们将要检测到的害虫是驼鹿,我们希望在现实生活中检测到这种动物。显然,我们的数据集必须包含许多具有驼鹿特征的图像。
图像中的动物应从各种角度和各种姿势进行拍摄。可接受的最小图像数量取决于DNN模型和所需的精度。通常,深度学习研究人员建议每个对象类别1000至5000张图像。
为了在现实生活中检测驼鹿,我们应该能够将驼鹿与任何在给定帧中可能存在的所有其他物体区分开。因此,我们需要两个对象类别:驼鹿和背景(不是驼鹿)。
收集图像第一步是收集相关图像。最简单的方法是搜索互联网并保存找到的图像。这是一个漫长而无聊的过程,但是我们需要大量图像来训练我们自己的DNN模型。
这也是重要的一课。数据采集和准备通常是AI项目中最困难的部分。除非您从事前沿研究,否则您可能不会设计新的神经网络体系结构。如果您尚未准备好要解决的大型、干净的数据集,则可以期望在这里花费70%(或更多!)的AI项目时间。
在这种情况下,我们可以通过搜索视频而不是单独的图像来简化和加快流程。首先,我们搜索并下载带有驼鹿的视频。然后,我们从视频文件中提取帧。让我们走这条路。
快速搜索会产生令人惊讶的驼鹿视频列表。这里有些例子:
- https://www.youtube.com/watch?v=6U7RR2IEWXo
- https://www.youtube.com/watch?v=X47mhFzSmjw
- https://www.youtube.com/watch?v=ea46t7QaHqw
接下来,我们下载视频文件,并使用VLC播放器提取相关的帧。VLC使您可以逐帧观看视频并将帧从任何时间标记上载到磁盘。在我们的案例中,这导致174张包含驼鹿的图像。以下是一些示例帧:
其中带有驼鹿的帧不包含用于DNN训练的完整数据集。要训练分类器,数据集中的所有图像必须具有相同的大小,并且每个分类对象都必须作为一个整体,例如使用Cascade Trainer GUI。不要忘记,我们也需要背景类的样本。我们可以通过剪掉驼鹿而从相同的框架中获得它们。
调整图像大小由于裁剪后的图像可能具有不同的尺寸,因此让我们使用一些自定义的Python代码自动调整其尺寸:
import os
class FileUtils:
@staticmethod
def get_files(folder):
files = []
filenames = os.listdir(folder)
for (i, fname) in enumerate(filenames):
fullpath = os.path.join(folder, fname)
files.append(fullpath)
return files
import cv2
class Resizer:
def __init__(self, size):
self.size = size
def process(self, source, dest):
files = FileUtils.get_files(source)
if not os.path.isdir(dest):
os.mkdir(dest)
for (i, fname) in enumerate(files):
img = cv2.imread(fname)
(h, w, c) = img.shape
if w>h :
dx = int((w-h)/2)
img = img[0:h, dx:dx+h]
else:
if h>w :
dy = int((h-w)/2)
img = img[dy:dy+w, 0:w]
resized = cv2.resize(img, (self.size, self.size), cv2.INTER_AREA)
f = os.path.basename(fname)
dfname = os.path.join(dest, f)
cv2.imwrite(dfname, resized)
该代码使用OpenCV软件包中的函数从源文件夹加载示例图像,调整其大小并将其保存到目标目录。请注意,图像缩放器仅接收一个初始化参数:size。
大多数用于图像处理的卷积网络都使用正方形输入图像,因此我们将使我们的调整程序将原始图像转换为正方形。调整大小算法考虑到初始图像可能不是正方形的事实。为避免对象变形,该算法首先从图像中裁剪出居中的正方形片段,然后调整其大小。
现在,让我们运行代码并处理图像:
source = r"C:\PI_PEST\moose_cropped"
dest = r"C:\PI_PEST\moose_resized"
resizer = Resizer(128)
resizer.process(source, dest)
这为我们的数据集提供了正确大小的样本。
现在,我们总共获得了484个样本:驼鹿类别为200个项目,背景(非驼鹿)对象为284个项目。
下一步484张图像不足以训练我们的DNN以获得高精度。我们可以找到更多视频文件并提取更多帧以增加数据集的大小,但是有更好的方法。在接下来的文章中,我们将看到同样的结果可以通过数据扩张来实现。
https://www.codeproject.com/Articles/5289750/Preparing-Dataset