使用树莓派进行实时野生动物检测与驱赶

无论是商业用户还是家庭主人,野生动物如鹿、驼鹿甚至猫都可能对花园、庄稼和财产造成损害。在本系列文章中,将展示如何在树莓派上实时(或近实时)检测害虫(例如驼鹿),然后采取措施将其驱赶。由于不想造成伤害,将专注于通过播放响亮的噪音来吓走害虫。

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

数据增强

数据增强提供了一种从现有图像中衍生新样本的方法,通过各种图像修改。最常见的包括几何变换、颜色空间变换、数据加噪和图像过滤。在应用数据增强算法时,应该确保图像修改适合数据集,并且不会损害样本。

对于图像数据增强,可以使用许多几何变换:翻转、旋转、缩放、裁剪、平移等。一个明显且非常有用的变换是水平翻转,它将图像相对于垂直轴镜像。

另一个流行的几何变换是旋转,它模拟从不同角度查看样本。注意,这种变换应该只应用适度的旋转角度以保持对象形状。

可以使用Python OpenCV包轻松实现几何变换:

class FlipProcessor: def name(self): return "flip" def process(self, image): return cv2.flip(image, 1) class RotateProcessor: def __init__(self, angle, scale): self.angle = angle self.scale = scale def name(self): if self.angle > 0: sa = str(self.angle) else: sa = "_" + str(-self.angle) return "rotate" + sa def process(self, image): (h, w, c) = image.shape center = (w / 2, h / 2) rmat = cv2.getRotationMatrix2D(center, self.angle, self.scale) rotated = cv2.warpAffine(image, rmat, (w, h)) return rotated

图像过滤是一种有用但直观性不强的数据增强类型。很难估计哪种过滤器将从现有图像中产生最有用的数据样本。

数据集由野生动物视频的帧组成,因此可以合理假设一些帧是清晰的,一些是模糊的。因此,锐化和平滑帧可以改善和多样化数据集。以下是Python代码示例:

class SmoothProcessor: def __init__(self, filter_size): self.filter_size = filter_size def name(self): return "smooth" + str(self.filter_size) def process(self, image): smoothed = cv2.GaussianBlur(image, (self.filter_size, self.filter_size), 0) return smoothed class SharpenProcessor: def __init__(self, filter_size): self.filter_size = filter_size def name(self): return "sharpen" + str(self.filter_size) def process(self, image): sharpen = cv2.bilateralFilter(image, self.filter_size, 150, 150) return sharpen

还需要一个变换来复制原始图像(稍后会解释为什么需要这个):

class OriginalProcessor: def name(self): return "" def process(self, image): return image

将所有技巧集成到一个算法中

现在有了要使用的所有变换。以下是将自动将所有的图像通过变换的算法:

class Augmentor: def __init__(self, processors): self.processors = processors def generate(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) for (j, proc) in enumerate(self.processors): p_img = proc.process(img) f = os.path.basename(fname) f = os.path.splitext(f)[0] f = f + proc.name() + ".png" dfname = os.path.join(dest, f) cv2.imwrite(dfname, p_img)

现在有多少样本?现在有18倍的样本!

有3600个样本用于驼鹿类,5112个样本用于背景类。对于目的,这个大小的数据集将提供可接受的驼鹿检测结果。

但是,如果正在开发商业害虫探测器,将需要一个更大的数据集。在AI项目中,将遇到的一个常见主题是获取良好的数据是最困难的任务。

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