1.研究背景与意义
项目参考AAAI Association for the Advancement of Artificial Intelligence
研究背景与意义
近年来,随着人工智能技术的迅速发展,物体检测与识别技术在各个领域得到了广泛应用。其中,基于深度学习的目标检测算法YOLO(You Only Look Once)因其高效的实时性能和准确的检测结果而备受关注。然而,YOLO算法在处理小目标和密集目标时存在一定的局限性,导致其在一些特定场景下的应用效果不佳。
青蛙活动量监测预警系统是一种用于监测和预警青蛙活动情况的系统。青蛙作为一种重要的生态指示物种,其活动量的监测对于生态环境的评估和保护具有重要意义。传统的青蛙活动量监测方法主要依赖于人工观察和手动记录,这种方法存在着工作量大、效率低、容易出现误差等问题。因此,开发一种基于计算机视觉技术的青蛙活动量监测预警系统具有重要的实际意义。
然而,目前的青蛙活动量监测预警系统存在一些问题。首先,传统的物体检测算法在处理青蛙这种小目标时效果不佳,容易出现漏检和误检的情况。其次,青蛙活动量的监测需要实时性,而传统的算法往往无法满足实时性的要求。此外,青蛙活动量的监测需要对青蛙的行为进行分析和识别,而传统的物体检测算法只能提供目标的位置信息,无法提供更加详细的行为信息。
为了解决上述问题,本研究提出了一种基于RCS-OSA改进YOLOv7的青蛙活动量监测预警系统。该系统结合了目标检测算法和行为识别算法,通过对青蛙的活动进行实时监测和分析,提供更加准确和详细的活动量信息。具体来说,本研究将使用改进的YOLOv7算法作为目标检测算法,通过引入RCS-OSA(Region Convolutional Sparse-Overlapping Attention)机制来提高算法对小目标和密集目标的检测能力。同时,本研究将使用行为识别算法对青蛙的行为进行分析和识别,从而提供更加详细的活动量信息。
本研究的意义主要体现在以下几个方面。首先,通过改进YOLOv7算法,提高了青蛙活动量监测预警系统对小目标和密集目标的检测能力,提高了系统的准确性和可靠性。其次,通过引入行为识别算法,提供了更加详细的活动量信息,为生态环境的评估和保护提供了更加全面的数据支持。此外,本研究还为其他类似的生态监测系统提供了一种改进的思路和方法,具有一定的推广价值。
总之,基于RCS-OSA改进YOLOv7的青蛙活动量监测预警系统具有重要的实际意义和研究价值。通过提高目标检测算法的性能和引入行为识别算法,该系统能够提供更加准确和详细的活动量信息,为青蛙活动量的监测和生态环境的评估提供了有效的工具和方法。
2.图片演示
3.视频演示
基于RCS-OSA改进YOLOv7的青蛙活动量监测预警系统_哔哩哔哩_bilibili
4.Deepsort青蛙追踪
DeepSORT算法的处理流程如图所示。该算法主要包含以下4个步骤:
(1)对输入的视频信息进行预处理,然后使用YOLOv5s[2]网络提取图像的特征信息后得到候选框,再通过非极大抑制(Non-Maximum Suppression,NMS)算法去除重叠框,最后得到目标检测框和相应特征。
(2)通过递推的卡尔曼滤波对目标下一帧的位置信息和运动状态进行预测,并将结果与检测器获取的检测框进行对比,最终选取置信度更高的检测框为预测结果。
(3)使用基于运动信息的马氏距离和外观特征的余弦相似度的线性加权函数进行数据关联,并通过级联分配进行跟踪轨迹匹配。
(4)结果输出,同时更新跟踪器的参数,重新开始目标检测。
DeepSORT算法使用一个残差卷积神经网络提取目标的外观特征,输人的图像被缩放到64×128像素,这与目标鱼类的宽高比不符。为使模型适用于青蛙特征提取,调整网络的输入图像大小为256×128像素。同时考虑到算法的效率和准确率的因素,对该算法检测部分做出改进:将DeepSORT检测部分的算法由Faster R-CNN替换为YOLOv5s,封装成一个模块,通过调用的方法,得到预测信息,再进行跟踪预测、匹配和更新。
5.核心代码讲解
5.1 deep_sort_tracking_id.py
下面是封装的类:
class ObjectDetection:
def __init__(self, opt):
self.opt = opt
self.names = opt.names
self.source = opt.source
self.weights = opt.weights
self.view_img = opt.view_img
self.save_txt = opt.save_txt
self.imgsz = opt.img_size
self.trace = not opt.no_trace
self.save_img = not opt.nosave and not source.endswith('.txt')
self.webcam = source.isnumeric() or source.endswith('.txt') or source.lower().startswith(
('rtsp://', 'rtmp://', 'http://', 'https://'))
# Directories
self.save_dir = Path(increment_path(Path(opt.project) / opt.name, exist_ok=opt.exist_ok)) # increment run
(self.save_dir / 'labels' if save_txt else save_dir).mkdir(parents=True, exist_ok=True) # make dir
# initialize deepsort
cfg_deep = get_config()
cfg_deep.merge_from_file("deep_sort_pytorch/configs/deep_sort.yaml")
self.deepsort = DeepSort(cfg_deep.DEEPSORT.REID_CKPT,
max_dist=cfg_deep.DEEPSORT.MAX_DIST, min_confidence=cfg_deep.DEEPSORT.MIN_CONFIDENCE,
nms_max_overlap=cfg_deep.DEEPSORT.NMS_MAX_OVERLAP, max_iou_distance=cfg_deep.DEEPSORT.MAX_IOU_DISTANCE,
max_age=cfg_deep.DEEPSORT.MAX_AGE, n_init=cfg_deep.DEEPSORT.N_INIT, nn_budget=cfg_deep.DEEPSORT.NN_BUDGET,
use_cuda=True)
self.point_list = []
# Initialize
set_logging()
self.device = select_device(opt.device)
self.half = device.type != 'cpu' # half precision only supported on CUDA
# Load model
self.model = attempt_load(weights, map_location=device) # load FP32 model
self.stride = int(model.stride.max()) # model stride
self.imgsz = check_img_size(imgsz, s=stride) # check img_size
if trace:
self.model = TracedModel(model, device, opt.img_size)
if half:
self.model.half() # to FP16
# Second-stage classifier
self.classify = False
if classify:
self.modelc = load_classifier(name='resnet101', n=2) # initialize
self.modelc.load_state_dict(torch.load('weights/resnet101.pt', map_location=device)['model']).to(device).eval()
# Set Dataloader
self.vid_path, self.vid_writer = None, None
if webcam:
self.view_img = check_imshow()
cudnn.benchmark = True # set True to speed up constant image size inference
self.dataset = LoadStreams(source, img_size=imgsz, stride=stride)
else:
self.dataset = LoadImages(source, img_size=imgsz, stride=stride)
# Get names and colors
self.names = load_classes(names)
#colors = [[random.randint(0, 255) for _ in range(3)] for _ in names]
# Run inference
if device.type != 'cpu':
self