计算机视觉在鱼类识别与尺寸测量中的应用

在本文中,将探讨如何利用计算机视觉技术来识别图像中的鱼类、对其进行分类,并测量其尺寸。准确测量鱼类的尺寸对于估算鱼类种群的数量和健康状况至关重要,有助于实现可持续的渔业管理。此外,自动化的尺寸测量能够持续监测鱼类的生长情况,优化投喂时间表,提高养殖场的整体生产力。

为了识别鱼类种类,将训练一个计算机视觉模型,使其能够在图像中定位鱼类。这需要收集鱼类的图像,并使用边界框或多边形工具对每条鱼进行标记,并将种类作为该边界框或多边形的类别标签。例如,使用边界框标记鱼类种类的示例如下:

在本项目中,将采用目标检测方法,这种方法几乎可以实时运行。将根据鱼类的视觉外观来确定其尺寸。首先识别鱼类种类,然后测量其尺寸。可以为每种鱼类定义多个尺寸类别。以下是一些常见的尺寸分类示例和考虑因素:

这些尺寸类别可以与实际的物理测量相关联。在示例中,将两种鱼类——鞍背鱼和粉红臭鲷——分为两个基本尺寸类别:小型和大型/巨型(如下所示的图像)。上面的图像展示了如何从物理外观上识别鱼类种类和尺寸(即,可以根据其物理外观对鞍背鱼小型和大型进行分类,类似地,对臭鲷小型和大型进行分类)。同样,可以收集不同鱼类种类且尺寸各异(即小型、中型、大型等)的数据集,用于标记和训练计算机视觉模型。

在项目中,将使用Roboflow多边形工具来标注图像中的鱼类(见下图),以训练目标检测模型。标注的鱼类带有种类和尺寸类别。将对每个种类和尺寸类别进行标注,以训练目标检测模型自动进行种类分类和鱼类尺寸分类。这在渔业管理和商业排序等领域具有重要应用。

创建鱼类尺寸测量系统的步骤如下。将按照以下三个简单步骤快速构建此项目。

步骤1:准备数据集。准备数据集是构建任何计算机视觉模型的关键步骤。对于此项目,使用了来自Roboflow Universe的“测量鱼类尺寸计算机视觉项目数据集”。已下载数据集图像,并创建了自己的目标检测项目(名为fish-size-detection),并将所有图像上传到此项目工作区。

注意,此数据集标记为识别特定种类的鱼类;它不能用于识别任何任意鱼类。要识别特定鱼类,建议收集自己的数据,然后按照本指南使用自己的数据训练自己的计算机视觉模型。

可以使用Roboflow的“数据集健康检查”选项来评估和提高数据集的质量。它提供了与项目相关的数据集的一系列统计信息。所有数据集中的图像都使用多边形工具进行了目标检测标记,如下所示的图像。请按照Roboflow多边形标注指南了解更多关于多边形标注的信息。

然后,生成了数据集版本。在训练之前必须生成数据集版本。可以使用Roboflow界面中的“生成”选项卡和“创建新版本”选项来生成数据集版本。

步骤2:训练目标检测模型。一旦生成了数据集版本,就可以使用Roboflow自动训练选项来训练最准确的计算机视觉模型。要进行训练,首先点击“使用Roboflow进行训练”按钮。然后选择Roboflow 3.0:选择模型架构,从公共检查点中选择Fast->Train,然后点击“开始训练”,Roboflow将训练模型。

当模型训练完成后,将看到模态指标,并且模型将在Roboflow平台上以及通过Roboflow推理API可供推理使用。可以从“可视化”选项卡测试模型。训练好的模型可在此处使用。可以使用以下示例使用模型,或训练自己的模型。

步骤3:构建推理应用程序。这是最后一步。在这一步中,将使用Gradio构建一个Web应用程序。该应用程序将允许上传图像或通过相机捕获图像。然后,应用程序与计算机视觉模型(在前一步中使用Roboflow训练)进行通信,以运行预测,然后显示结果图像。

from inference_sdk import InferenceHTTPClient, InferenceConfiguration import gradio as gr from PIL import Image, ImageDraw, ImageFont import os # 初始化客户端 CLIENT = InferenceHTTPClient( api_url="https://detect.roboflow.com", api_key="ROBOFLOW_API_KEY" ) # 定义一个预测函数来推理图像 def infer_image(image, confidence=0.5, iou_threshold=0.5): # 将上传或捕获的图像保存到文件 image_path = "uploaded_image.jpg" image.save(image_path) # 设置自定义配置 custom_configuration = InferenceConfiguration(confidence_threshold=confidence, iou_threshold=iou_threshold) # 使用客户端推理图像 with CLIENT.use_configuration(custom_configuration): result = CLIENT.infer(image_path, model_id="fish-size-detection/2") # 提取预测结果 predictions = result.get('predictions', []) # 为模型的不同类别定义颜色映射 class_colors = { "Skunk clownfish_small": "red", "Saddleback clownfish_big": "blue", "Saddleback clownfish_small": "yellow", "Skunk clownfish_big": "green" } # 在图像上绘制边界框 draw = ImageDraw.Draw(image) try: font = ImageFont.truetype("arial.ttf", 20) except IOError: font = ImageFont.load_default() for pred in predictions: x = pred['x'] y = pred['y'] width = pred['width'] height = pred['height'] left = x - width / 2 top = y - height / 2 right = x + width / 2 bottom = y + height / 2 # 获取类别的颜色 color = class_colors.get(pred['class'], "green") # 如果类别不在颜色映射中,默认为绿色 draw.rectangle([left, top, right, bottom], outline=color, width=3) # 绘制标签 label = f"{pred['class']} ({pred['confidence']:.2f})" text_size = draw.textbbox((0, 0), label, font=font) text_width = text_size[2] - text_size[0] text_height = text_size[3] - text_size[1] text_background = [(left, top - text_height - 4), (left + text_width + 4, top)] draw.rectangle(text_background, fill=color) draw.text((left + 2, top - text_height - 2), label, fill="white", font=font) return image # 创建Gradio界面 iface = gr.Interface( fn=infer_image, inputs=[ gr.Image(type="pil", label="上传或捕获图像"), gr.Slider(0.0, 1.0, value=0.5, step=0.1, label="置信度阈值"), gr.Slider(0.0, 1.0, value=0.5, step=0.1, label="IoU阈值") ], outputs=gr.Image(type="pil", label="带有边界框的图像"), title="鱼类尺寸检测", description="上传或捕获图像以使用Roboflow模型检测鱼类尺寸和类别。使用滑块调整置信度和IoU阈值。" ) # 启动应用程序 iface.launch()

这个Python脚本创建了一个Gradio应用程序,允许用户上传或捕获图像,并使用Roboflow的预训练模型检测鱼类尺寸。应用程序使用inference-sdk中的InferenceHTTPClient执行图像推理,在检测到的鱼类周围绘制边界框,并用相应的类别和置信度分数进行标记。用户可以使用滑块调整置信度阈值和交集比(IoU)阈值来控制检测灵敏度。输出是带有边界框和标签的原始图像,直接在Gradio界面中显示。运行应用程序将显示以下输出。

结论:使用计算机视觉进行鱼类尺寸检测提高了渔业、水产养殖和海洋研究中数据收集的效率,实现了实时监测和分析。它通过帮助执行尺寸限制和追踪鱼类种群,支持可持续的捕鱼实践,有助于更好的资源管理。

  • 如何使用Roboflow鱼类检测API
  • 使用计算机视觉统计鱼类种群(和监测环境健康)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485