精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻

💖🔥作者主页:计算机毕设木哥🔥 💖

一、项目介绍

水下拍摄常有浑浊、光照不均和目标尺度变化,人工逐帧标注鱼类位置成本高、也难持续复用。很多课题停在离线训练,缺少可演示的识别入口和结果汇总,答辩与验收都不方便。本文通过开发一个基于深度学习的水下复杂场景鱼类目标检测系统,用以帮助解决水下鱼类目标的自动定位、类别识别与结果留存统计问题。
本系统采用 PyTorch 与 Ultralytics 训练 YOLOv8s 检测模型,并与 Faster R-CNN、SSD 对比后导出 ONNX,后端用 Django 与 ONNX Runtime 完成推理,前端用 Vue 与 ECharts 呈现。功能上覆盖用户管理、图片识别、视频识别、摄像头识别、识别历史查询,以及检出排行、把握程度、使用趋势等可视化大屏。
经过系统测试,本系统能够满足水下渔业观测、实验演示和计算机毕设答辩等场景对鱼类目标检测与结果回溯的需求,也方便师生围绕检测效果与使用数据展开讨论。

二、视频展示

基于深度学习的水下复杂场景鱼类目标检测方法研究

三、开发环境

任务:目标检测(13 类鱼类)
主模型:YOLOv8s(Ultralytics);对比模型:Faster R-CNN、SSD
训练:PyTorch + torchvision
部署推理:ONNX / ONNX Runtime
后端:Django + PyMySQL
前端:Vue + Element UI+ ECharts
数据库:MySQL
其他:OpenCV、NumPy、Pandas、scikit-learn

四、系统展示

系统页面模块展示:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、代码展示

# UnderwaterFishDetection/views_ai.py
def _letterbox(im_rgb, new_size, pad_value=114):
    h, w = im_rgb.shape[:2]
    if isinstance(new_size, (list, tuple)):
        if len(new_size) == 3:
            nh, nw = int(new_size[1]), int(new_size[2])
        else:
            nh, nw = int(new_size[0]), int(new_size[1])
    else:
        nh = nw = int(new_size)
    r = min(nh / float(h), nw / float(w))
    new_unpad_w = int(round(w * r))
    new_unpad_h = int(round(h * r))
    dw = (nw - new_unpad_w) / 2.0
    dh = (nh - new_unpad_h) / 2.0
    resized = np.array(
        Image.fromarray(im_rgb).resize((new_unpad_w, new_unpad_h), Image.BILINEAR)
    )
    out = np.full((nh, nw, 3), pad_value, dtype=np.uint8)
    top = int(round(dh - 0.1))
    left = int(round(dw - 0.1))
    out[top:top + new_unpad_h, left:left + new_unpad_w] = resized
    return out, r, (dw, dh), (h, w)


def preprocess_image(pil_img):
    cfg = _preprocess
    rgb = np.asarray(pil_img.convert('RGB'), dtype=np.uint8)
    pad_value = int(cfg.get('pad_value', 114))
    input_size = cfg.get('input_size', [3, 640, 640])
    imgsz = cfg.get('imgsz', input_size[1] if len(input_size) > 1 else 640)
    resize_mode = cfg.get('resize', 'letterbox')
    if resize_mode == 'letterbox':
        padded, ratio, (dw, dh), orig_hw = _letterbox(rgb, [3, imgsz, imgsz], pad_value)
    else:
        padded = np.array(Image.fromarray(rgb).resize((imgsz, imgsz), Image.BILINEAR))
        ratio, dw, dh = 1.0, 0.0, 0.0
        orig_hw = rgb.shape[:2]
    arr = padded.astype(np.float32)
    scale = float(cfg.get('scale', 1.0 / 255.0))
    arr = arr * scale
    mean = np.array(cfg.get('mean', [0.0, 0.0, 0.0]), dtype=np.float32)
    std = np.array(cfg.get('std', [1.0, 1.0, 1.0]), dtype=np.float32)
    arr = (arr - mean) / std
    if cfg.get('rgb_order', 'RGB') == 'BGR':
        arr = arr[:, :, ::-1]
    arr = arr.transpose(2, 0, 1)[np.newaxis]  # NCHW
    meta = {'ratio': ratio, 'dw': dw, 'dh': dh, 'orig_hw': orig_hw, 'imgsz': imgsz}
    return arr, meta


def _blank_check(rgb):
    if float(rgb.std()) < 3:
        return True
    flat = rgb.reshape(-1, 3)
    if flat.shape[0] > 50000:
        idx = np.linspace(0, flat.shape[0] - 1, 50000, dtype=np.int64)
        flat = flat[idx]
    uniq = np.unique(flat, axis=0)
    return len(uniq) < 8

六、项目文档展示

在这里插入图片描述

七、项目总结

本课题围绕水下复杂场景下的鱼类目标检测展开。针对水体浑浊、光照不均、目标尺度变化大等问题,系统以深度学习目标检测为主线,完成从模型训练到 Web 应用落地的闭环。主模型采用 YOLOv8s,并与 Faster R-CNN、SSD 进行对比选优;训练基于 PyTorch,权重导出为 end2end ONNX,由 Django 后端通过 ONNX Runtime 完成在线推理。前端使用 Vue 与 ECharts,提供图片识别、视频识别与摄像头识别三种入口,识别结果写入历史记录,并可在可视化大屏中查看检出排行、置信度分布、使用趋势与活跃时段等统计信息。系统同时支持用户管理与识别历史管理,便于演示、验收与结果回溯。整体上,本工作将水下鱼类检测从离线实验推进到可交互、可统计的应用形态,对相关毕设实践与观测演示具有参考价值。

大家可以帮忙点赞、收藏、关注、评论啦 👇🏻

💖🔥作者主页:计算机毕设木哥🔥 💖

更多推荐