无论是商业用户还是家庭主人,野生动物如鹿、驼鹿甚至猫都可能对花园、庄稼和财产造成损害。在本系列文章中,将展示如何在树莓派上实时(或近实时)检测害虫(例如驼鹿),然后采取措施将其驱赶。由于不想造成伤害,将专注于通过播放响亮的噪音来吓走害虫。
欢迎下载项目的源代码。假设熟悉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项目中,将遇到的一个常见主题是获取良好的数据是最困难的任务。