在本文中,将探讨如何利用计算机视觉技术来识别图像中的鱼类、对其进行分类,并测量其尺寸。准确测量鱼类的尺寸对于估算鱼类种群的数量和健康状况至关重要,有助于实现可持续的渔业管理。此外,自动化的尺寸测量能够持续监测鱼类的生长情况,优化投喂时间表,提高养殖场的整体生产力。
为了识别鱼类种类,将训练一个计算机视觉模型,使其能够在图像中定位鱼类。这需要收集鱼类的图像,并使用边界框或多边形工具对每条鱼进行标记,并将种类作为该边界框或多边形的类别标签。例如,使用边界框标记鱼类种类的示例如下:
在本项目中,将采用目标检测方法,这种方法几乎可以实时运行。将根据鱼类的视觉外观来确定其尺寸。首先识别鱼类种类,然后测量其尺寸。可以为每种鱼类定义多个尺寸类别。以下是一些常见的尺寸分类示例和考虑因素:
这些尺寸类别可以与实际的物理测量相关联。在示例中,将两种鱼类——鞍背鱼和粉红臭鲷——分为两个基本尺寸类别:小型和大型/巨型(如下所示的图像)。上面的图像展示了如何从物理外观上识别鱼类种类和尺寸(即,可以根据其物理外观对鞍背鱼小型和大型进行分类,类似地,对臭鲷小型和大型进行分类)。同样,可以收集不同鱼类种类且尺寸各异(即小型、中型、大型等)的数据集,用于标记和训练计算机视觉模型。
在项目中,将使用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界面中显示。运行应用程序将显示以下输出。
结论:使用计算机视觉进行鱼类尺寸检测提高了渔业、水产养殖和海洋研究中数据收集的效率,实现了实时监测和分析。它通过帮助执行尺寸限制和追踪鱼类种群,支持可持续的捕鱼实践,有助于更好的资源管理。