使用Raspberry Pi进行动物检测和驱赶

无论是企业还是房主,都可能面临动物如鹿、驼鹿甚至猫对花园、庄稼和财产造成损害的问题。在本系列文章中,将展示如何在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)

这为数据集提供了正确大小的样本。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485