鱼类AI数量检测代码分享

简介: 本代码基于深度学习实现鱼类数量检测,使用预训练的 Faster R-CNN 模型识别图像中的鱼类,并用边界框标注位置。支持单张图片检测、文件夹批量检测、结果可视化及统计分析。需安装 PyTorch、OpenCV 等依赖库。可微调模型提升鱼类检测精度。

以下代码实现了基于深度学习的鱼类数量检测功能。它使用了预训练的 Faster R-CNN 模型来识别图像中的鱼类,并通过边界框标记出每条鱼的位置。代码包含了以下功能:

1.单张图片检测
2.文件夹批量检测
3.检测结果可视化
4.统计分析功能

使用时,你需要安装必要的依赖库,如 PyTorch、OpenCV、Matplotlib 等。如果需要更高精度的检测效果,可以考虑使用专门针对鱼类训练的模型,或者在自己的鱼类数据集上对现有模型进行微调。

import cv2
import numpy as np
import torch
from torchvision import models, transforms
from PIL import Image
import matplotlib.pyplot as plt
import os
from datetime import datetime

class FishDetector:
def init(self, model_path=None, device='cuda' if torch.cuda.is_available() else 'cpu'):
"""初始化鱼类检测模型和参数"""
self.device = device
self.transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

    # 使用预训练的Faster R-CNN模型
    self.model = models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
    self.model.to(device)
    self.model.eval()

    # 鱼类的类别ID (根据COCO数据集,鱼的ID为16)
    self.fish_class_id = 16

    # 检测参数
    self.confidence_threshold = 0.7
    self.nms_threshold = 0.3

    # 结果存储
    self.results = []

def detect_fish(self, image_path):
    """检测单张图片中的鱼类"""
    try:
        # 读取图像
        image = Image.open(image_path).convert('RGB')
        image_tensor = self.transform(image).unsqueeze(0).to(self.device)

        # 模型推理
        with torch.no_grad():
            predictions = self.model(image_tensor)

        # 处理预测结果
        boxes = predictions[0]['boxes'].cpu().numpy()
        scores = predictions[0]['scores'].cpu().numpy()
        labels = predictions[0]['labels'].cpu().numpy()

        # 筛选鱼类检测结果
        fish_indices = np.where(
            (labels == self.fish_class_id) & 
            (scores > self.confidence_threshold)
        )[0]

        fish_boxes = boxes[fish_indices]
        fish_scores = scores[fish_indices]

        # 应用非极大值抑制
        keep_indices = cv2.dnn.NMSBoxes(
            fish_boxes.tolist(), 
            fish_scores.tolist(), 
            self.confidence_threshold, 
            self.nms_threshold
        )

        final_boxes = fish_boxes[keep_indices] if len(keep_indices) > 0 else []
        fish_count = len(final_boxes)

        # 记录结果
        result = {
            'image_path': image_path,
            'fish_count': fish_count,
            'boxes': final_boxes,
            'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        }
        self.results.append(result)

        return result

    except Exception as e:
        print(f"Error processing image {image_path}: {str(e)}")
        return None

def detect_folder(self, folder_path):
    """检测文件夹中所有图片的鱼类"""
    all_results = []
    for filename in os.listdir(folder_path):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            file_path = os.path.join(folder_path, filename)
            result = self.detect_fish(file_path)
            if result:
                all_results.append(result)
    return all_results

def visualize_result(self, image_path, output_path=None):
    """可视化检测结果"""
    # 找到对应的结果
    result = next((r for r in self.results if r['image_path'] == image_path), None)
    if not result:
        print(f"No result found for {image_path}")
        return

    # 读取原图
    image = cv2.imread(image_path)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    # 绘制边界框
    for box in result['boxes']:
        x1, y1, x2, y2 = map(int, box)
        cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)

    # 添加鱼的数量文本
    cv2.putText(
        image, 
        f"Fish Count: {result['fish_count']}", 
        (10, 30), 
        cv2.FONT_HERSHEY_SIMPLEX, 
        1, 
        (0, 0, 255), 
        2
    )

    # 显示或保存结果
    if output_path:
        plt.imsave(output_path, image)
        print(f"Visualization saved to {output_path}")
    else:
        plt.figure(figsize=(10, 10))
        plt.imshow(image)
        plt.axis('off')
        plt.show()

def get_statistics(self):
    """获取检测统计信息"""
    if not self.results:
        return "No results available"

    total_images = len(self.results)
    total_fish = sum(r['fish_count'] for r in self.results)
    fish_per_image = [r['fish_count'] for r in self.results]

    stats = {
        'total_images': total_images,
        'total_fish': total_fish,
        'average_fish_per_image': total_fish / total_images if total_images > 0 else 0,
        'max_fish_in_single_image': max(fish_per_image) if fish_per_image else 0,
        'min_fish_in_single_image': min(fish_per_image) if fish_per_image else 0
    }

    return stats

def main():
"""主函数示例"""

# 创建检测器实例
detector = FishDetector()

# 检测单张图片
single_result = detector.detect_fish("path/to/your/fish_image.jpg")
if single_result:
    print(f"Detected {single_result['fish_count']} fish in the image.")
    detector.visualize_result("path/to/your/fish_image.jpg", "output.jpg")

# 检测文件夹中的所有图片
folder_results = detector.detect_folder("path/to/your/image/folder")
for result in folder_results:
    print(f"Image: {os.path.basename(result['image_path'])}, Fish Count: {result['fish_count']}")

# 获取统计信息
stats = detector.get_statistics()
print("\nDetection Statistics:")
for key, value in stats.items():
    print(f"{key}: {value}")

if name == "main":
main()

相关文章
|
8天前
|
人工智能 弹性计算 自然语言处理
从0到1部署大模型,计算巢模型市场让小白秒变专家
阿里云计算巢模型市场依托阿里云弹性计算资源,支持私有化部署,集成通义千问、通义万象、Stable Diffusion等领先AI模型,覆盖大语言模型、文生图、多模态、文生视频等场景。模型部署在用户云账号下,30分钟极速上线,保障数据安全与权限自主控制,适用于企业级私有部署及快速原型验证场景。
|
16天前
|
数据采集 人工智能 自然语言处理
🌼通义千问获信通院最高等级大模型安全认证
阿里巴巴通义千问荣获中国信通院“大规模预训练模型(文本生成功能)安全认证证书”,达最高等级——增强级。测评依据工信部CCSA行业标准,覆盖59种内容安全风险。通义千问在抵御指令注入和越狱攻击方面表现突出,得益于阿里云构建的全生命周期安全体系。同时,阿里云通过ISO/IEC 42001认证,成为全球首家获此殊荣的企业,彰显其AI管理水平与技术应用的国际领先性。通义千问已广泛应用于互联网、汽车、政务等领域,持续优化安全机制,推动行业智能化发展。
|
5月前
|
算法 API 数据格式
PromptScope: 一个灵活高效的In-Context Training框架
PromptScope 是一个同时支持中英文的 In-Context Training 框架,专为大型语言模型(LLM)性能调优设计。
110 6
|
4月前
|
设计模式 人工智能 API
Cursor 上线最新 AI 模型 Claude 3.7 Max:200k上下文+200次工具调用!史上最强代码助手硬核上线
Claude 3.7 Max 是 Cursor 推出的最新 AI 模型,支持 200k 上下文窗口和 200 次工具调用,专为复杂代码任务设计,适合硬核开发者和大型项目。
461 6
Cursor 上线最新 AI 模型 Claude 3.7 Max:200k上下文+200次工具调用!史上最强代码助手硬核上线
|
3月前
|
机器学习/深度学习 人工智能 算法
快瞳犬种识别效果图示,120种狗品种精准覆盖
犬种识别技术已从实验室走向大众,基于深度学习的卷积神经网络(CNN)和YOLO系列算法,可高效实现犬种分类与目标检测。本文介绍了快瞳犬种识别的技术原理、训练代码及应用场景,包括宠物管理、遗传疾病研究、公共安全、城市管理及遗失宠物寻找等。通过Python代码加载YOLOv8模型并进行训练,模型能在图像中标注犬种及其边界框,为智慧生活提供技术支持。
|
2月前
|
机器学习/深度学习 数据采集 人工智能
快瞳AI鱼类识别 —— AI赋能海洋生物智能监测
鱼类AI识别技术基于深度学习算法,通过大量鱼类图像训练,实现对鱼类的快速精准识别。该技术模仿人类视觉系统,利用卷积神经网络(CNN)提取鱼体特征,从浅层的鳞片纹理到深层的整体形态逐步分析。快瞳科技提出的MF-Net模型突破了鱼类种类繁多、数据不均衡等难点,通过多阶段特征融合、动态权重调整及三维特征建模,显著提升识别性能。这项技术不仅重塑水产科研方式,还为海洋生物多样性保护提供智能化解决方案,推动AI在生态保护领域的应用迈入新阶段。
|
2月前
|
机器学习/深度学习 人工智能 算法
深度解析:基于卷积神经网络的宠物识别
宠物识别技术随着饲养规模扩大而兴起,传统手段存在局限性,基于卷积神经网络的宠物识别技术应运而生。快瞳AI通过优化MobileNet-SSD架构、多尺度特征融合及动态网络剪枝等技术,实现高效精准识别。其在智能家居、宠物医疗和防走失领域展现广泛应用前景,为宠物管理带来智能化解决方案,推动行业迈向新高度。
|
2月前
|
机器学习/深度学习 PyTorch 算法框架/工具
犬鼻纹识别是如何做到的?附代码示例
犬鼻纹识别技术利用深度学习与图像处理,通过手机等设备采集犬鼻图像,定位鼻纹关键点并提取有效区域。经灰度化、降噪等预处理后,输入残差卷积神经网络提取深度特征,形成代表犬鼻独特性的数值向量。最终,将特征与数据库比对,计算相似度完成识别。示例代码基于 PyTorch,包含数据预处理、模型训练及预测流程,实现高效精准的犬只身份认证。
|
3月前
|
文字识别 算法 小程序
【项目总结】快瞳医疗化验单的OCR识别
快瞳科技通过图像识别技术,成功解决了医疗化验单OCR识别难题。项目要求精准识别表格内容,尤其是化验数值和名称,准确率达85%以上。针对化验单来源多样、干扰因素多的问题,团队采用智能文档抽取模型、opencv技术(如霍夫变换)进行图片扶正与裁剪,优化识别精度。最终,项目不仅达到药企要求,还实现超越,为医疗行业智能化转型提供了高性价比解决方案,助力快瞳科技在医疗信息化领域树立良好口碑。
|
2月前
|
文字识别 Python
python做ocr卡证识别很简单
本示例展示了如何使用 `potencent` 库调用腾讯云 OCR 服务识别银行卡和身份证信息。代码中分别通过本地图片路径 (`img_path`) 和配置文件 (`potencent-config.toml`) 实现了银行卡和身份证的 OCR 识别,并输出结果。测试图片及结果显示了识别效果,需提前配置腾讯云的 `SECRET_ID` 和 `SECRET_KEY`。