无论是企业还是房主,都可能面临动物如鹿、驼鹿甚至猫对花园、庄稼和财产造成损害的问题。在本系列文章中,将展示如何在Raspberry Pi上实时(或近实时)检测害虫(如驼鹿),然后采取措施将其驱赶。由于不想造成伤害,将专注于通过播放响亮的噪音来吓跑害虫。
欢迎下载项目的源代码。假设熟悉Python并且对神经网络的工作原理有基本的了解。
一个特定的数据集是否适合特定的DNN模型取决于模型预期要解决的问题。要检测的害虫是驼鹿,希望在真实情况下检测到这种动物。显然,数据集必须包含许多展示驼鹿的图像。
图像中的动物应该从不同角度和不同姿势拍摄。可接受的最小图像数量取决于DNN模型和所需的准确性。一般来说,深度学习研究人员推荐每个对象类别有1000到5000张图像。
为了在真实环境中检测驼鹿,应该能够将驼鹿与任何给定帧中可能存在的所有其他对象区分开来。所以需要两个对象类别:驼鹿和背景(不是驼鹿)。
第一步是收集相关图像。最简单的方法是通过互联网搜索并保存找到的图像。这是一个漫长而乏味的过程,但需要大量的图像来训练自己的DNN模型。
这也是一个重要的教训。数据获取和准备通常是AI项目中最困难的部分。除非正在进行尖端研究,可能不会设计新的神经网络架构。如果没有为要解决的问题准备一个大型、干净的数据集,可以预期在这里花费70%(或更多!)的AI项目时间。
在这种情况下,可以通过搜索视频而不是单独的图像来简化和加速过程。首先,搜索并下载有驼鹿的视频。然后从视频文件中提取帧。让走这条路。
快速搜索产生了一个令人惊讶的大量有驼鹿的视频列表。以下是一些示例:
接下来,下载视频文件并使用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)
这为数据集提供了正确大小的样本。