导 读
本文主要介绍如何使用YoloV8实例分割识别猪的姿态(含数据集)。
背景介绍
在本文中,我将介绍如何使用YoloV8在猪的自定义数据集上进行实例分割,以识别和跟踪它们的不同姿态。
数据集
使用的数据集来源于Kokkenborg Aps,下载地址:
https://365ucl.sharepoint.com/:f:/s/dataset-oft/Eicf36oizq1DvISOjGEHuwABFA6z1Z22zewM2rPWJzFBWg?e=y88D5Y
样本图片:
标注好的json文件:
注意:数据集是使用LabelMe标注的,是json格式
https://github.com/wkentaro/labelme
YoloV8使用的是txt格式,这里可以借助labelme2yolo来转换:
https://pypi.org/project/labelme2yolo/
项目搭建
数据集准备好后,打开终端并创建一个项目目录,您要在其中放置数据和我们要编写的脚本。请注意,本教程假定您正在 Linux 平台上工作。
mkdir Pigs_Yolov8
进入你创建的目录:
cd Pigs_Yolov8
从现在开始我们将其作为项目根目录,所有终端调用都将从这里进行。
将包含图像和json文件的文件夹添加到项目根目录文件夹中,并将该文件夹命名为:PigsCam1ImagesAndJson。
就我而言,我在两个单独的文件夹中有图像和 json 文件,我只是将它们合并到一个名为PigsCam1ImagesAndJson的新文件夹中。这是您需要的三个文件夹中唯一的一个。
接下来创建一个虚拟环境,我们可以在其中安装项目所需的所有依赖项。
这是创建虚拟环境的命令。最后一个词是环境的名称。
python3 -m venv PigYolov8Venv
虚拟环境将在您当前所在的目录中创建。
接下来激活环境:
source PigYolov8Venv/bin/activate
现在您应该在项目的根目录中看到您的虚拟环境。如果您不熟悉虚拟环境,虚拟环境的目的是将当前项目中安装的包与计算机上的其他项目分开,这样您就可以避免项目之间的版本不匹配。
接下来,将以下软件包安装到您的虚拟环境中。确保位于项目文件夹的根目录中,并激活虚拟环境。
pip install numpy==1.21.2 scipy==1.7.0 scikit-learn==1.0 matplotlib==3.4.3 pandas==1.3.2
pip install labelme2yolo
pip install ultralytics
现在我们要将数据集格式转换为 Yolov8 的格式。
运行以下命令创建yolov8dataset(将目录更改为指向您自己的目录)
labelme2yolo - json_dir /home/simonadmin/Documents/Pigs_Yolov8/PigsCam1ImagesAndJson - val_size 0.15 - test_size 0.15
参数 –val_size 和 –test_size 指定用于验证和测试的数据集的大小。
您现在应该有一个名为 YoloDataset 的文件夹,其中包含一个图像文件夹、一个标签文件夹和一个 dataset.yaml 文件。
图像和标签都分为 train、test 和 val 文件夹(见下文并检查它是否与您自己的文件夹结构匹配)。
训练
为了训练模型,您需要确保安装了 torch,并且最好在 GPU 上运行。
您可以通过以下命令检查 torch 是否已安装并正在运行:
如果未安装 torch,请转到https://pytorch.org/并按照安装程序进行操作。
现在我们将微调现有模型,以便能够学习我们的自定义类别。
用于训练的模型可以在以下链接中找到:
https://github.com/ultralytics/ultralytics#models
(进入分割部分),其中显示了下表。从这个表中,我们只需要名称和大小作为训练算法的参数。
实际的文件名是蓝色的名称,后跟扩展名.pt。例如。如果我们想使用 YOLOv8m-seg模型,我们需要名称YOLOv8m-seg.pt
我们需要的其他参数是:
-
-
size参数,为 640。
-
我们还需要定义 epoch 的数量(即训练时间),在我们的例子中,我们将其设置为 100 个 epoch。epoch 的数量主要取决于您愿意等待多长时间,epoch 越多,结果越好,但是,总有一个点是无法实现任何改进的,因此从 100 个 epoch 开始似乎是个好主意。
-
batch size大小。这取决于你的 GPU,我使用 8 作为批次大小。
-
什么类型的任务task,在本例中是分割segmentation 。
-
哪种模式mode,也就是训练training。
-
以及 dataset.yaml 文件的路径,它指向我们的数据、标签和要识别的类的数量。在我们的例子中,这是四个类(见下图)。确保路径与您在计算机上的期望相符。
下面是完整指令:
yolo task=segment mode=train epochs=100 data=/home/simonadmin/Documents/Pigs_Yolov8/PigsCam1ImagesAndJson/YOLODataset/dataset.yaml model=yolov8m-seg.pt imgsz=640 batch=8
结果应该是这样的:
训练完成后,您会注意到项目文件夹的根目录中已创建一些文件和文件夹。
这两个 .pt 文件是脚本下载以完成其工作的模型。文件夹“runs”包含我们执行的不同训练运行。
在运行文件夹中,您可以图形化地查看训练的进展情况或是否应该进行更长时间的训练。
以下是验证进展顺利的一些示例。
推理
现在到了真正有趣的部分。我们要试驾一下我们的新模型。
为了测试模型,您需要猪的图像和/或视频,最好是从与训练数据相同的位置拍摄。
接下来,在运行文件夹内,进入权重文件夹(下面的路径层次结构)
复制文件 best.pt 并将其放置在项目的根文件夹中(其他 .pt 文件所在的位置)。
将猪的视频和/或图像也添加到根中。
创建测试脚本
在您最喜欢的编辑器中创建一个名为 predict.py 的小脚本,并添加以下内容:
from ultralytics import YOLO
model = YOLO("/home/simonadmin/Documents/Pigs_Yolov8/best.pt")
model.predict(source= "/home/simonadmin/Documents/Pigs_Yolov8/PigMovieNew.mov", show=True, save=True, conf=0.5, save_txt=False, save_crop=False, show_labels=True)
视频格式不一定是.mov,也可以是.mp4或.avi
如果你想在图像上进行测试,那么只需将源参数更改为指向你机器上的图像即可。
将脚本放置在项目的根目录中并使用以下命令运行它:
python predict.py
测试结果:
非常好!模型似乎已经正确识别了猪。
这是我们视频的结果(请注意:该视频是由多个图像创建的,这就是为什么它看起来像是滞后的原因)。
视频效果可能会更好,但这可能需要更大的数据集,尤其是姿势更均匀表示的数据集。
使用 Yolov8 时,可以记录某一类别的猪的数量(例如正在进食的猪),这样您就可以随时统计猪的数量。还可以跟踪猪,从而可以选择创建图表来显示特定猪活跃或不活跃的时间。
—THE END—