在计算机视觉领域,YOLO(You Only Look Once)系列模型因其高效和准确性而广受欢迎。YOLOv11作为该系列的最新成员,不仅继承了前辈的优势,还在精度、内存和运行时间上进行了优化。本文将探讨如何将YOLOv11模型应用于医学图像分割,特别是骨盆X光图像的分割任务。通过在Roboflow Universe上的Pelvis X-ray数据集上进行模型的再训练,可以使模型能够识别并分割出图像中特定区域的物体。
YOLOv11模型的微调可以计算出与图像中物体出现区域相对应的分割掩码。这种微调后的模型可以在多个领域得到应用,包括但不限于:
要开始训练模型,首先需要安装ultralytics包。此外,将使用roboflow来获取数据集,并使用supervision来可视化最终结果。在Colab或Jupyter Notebook中运行以下命令来安装必要的包:
%pip install ultralytics supervision roboflow
ultralytics包包含了YOLO的命令行界面(CLI),简化了训练、验证和推理等任务,无需修改代码。CLI支持多种模式,包括检测、分类、姿态跟踪和分割,是开始训练的理想选择。
将使用来自Roboflow Universe的标记好的Pelvis X-ray数据集。如果有一组未标记的图像,可以参考相关文档进行数据标记。如果已经有了正确格式的标记数据集,可以直接使用。如果上传图像到仪表板,可以进行标记、形成数据集、应用后处理和增强,然后下载所需格式的数据集。
以下是从Universe获取数据集的步骤:
确保在datasets文件夹中工作,然后运行数据集下载代码。
!mkdir {HOME}/datasets
%cd {HOME}/datasets
from roboflow import Roboflow
rf = Roboflow(api_key="<YOUR_API_KEY>")
project = rf.workspace("ks-fsm9o").project("pelvis-ap-x-ray")
version = project.version(3)
dataset = version.download("yolov11")
可以安全地将API密钥存储在Colab Secrets中。有关如何存储密钥的参考,请查看相关图片。在这样做之前,不要公开分享Colab!
现在有了自定义数据集,可以开始训练YOLO11实例分割模型了。让回到主文件夹并开始训练。
%cd {HOME}
!yolo task=detect mode=train model=yolo11s-seg.pt data={dataset.location}/data.yaml epochs=10 imgsz=640 plots=True
训练完成后,可以通过执行以下代码来检查结果,包括混淆矩阵、预测和验证批次:
from IPython.display import Image as IPyImage
IPyImage(filename=f'{HOME}/runs/segment/train/confusion_matrix.png', width=600)
IPyImage(filename=f'{HOME}/runs/segment/train/results.png', width=600)
IPyImage(filename=f'{HOME}/runs/segment/train/val_batch0_pred.jpg', width=600)
完成模型训练后,将有一组训练好的权重可供使用。这些权重将位于项目中的/runs/detect/train/weights/best.pt文件夹中。可以将模型权重上传到Roboflow Deploy,以使用无限可扩展基础设施。也可以在自己的硬件上使用Roboflow Inference运行模型。
要上传模型权重,请使用以下代码:
project.version(dataset.version).deploy(model_type="yolov11", model_path=f"{HOME}/runs/detect/train/")
处理模型权重可能需要几分钟时间。然后,将提供一个API,可以使用它来运行模型。然后,可以使用Roboflow Python包来查询模型:
import os, random, cv2
import supervision as sv
import IPython
# load model
model = project.version(dataset.version).model
# choose random test set image
test_set_loc = dataset.location + "/test/images/"
random_test_image = random.choice(os.listdir(test_set_loc))
print("running inference on " + random_test_image)
pred = model.predict(test_set_loc + random_test_image, confidence=40, overlap=30)
detections = sv.Detections.from_inference(pred)
image = cv2.imread(test_set_loc + random_test_image)
注意,一些类别名称是拉丁语,一些是土耳其语。让将其更改为拉丁语和英语。
name_dictionary = {
"SUORCIL": "SOURCIL",
"SAKRO-ILIAK-EKLEM": "SACROILIAC-JOINT",
"ILIAK": "ILIUM"
}
detections.data["class_name"] = [
name_dictionary.get(class_name, class_name) for class_name in detections.data["class_name"]
]
现在,可以可视化模型预测:
mask_annotator = sv.MaskAnnotator()
label_annotator = sv.LabelAnnotator(text_color=sv.Color.BLACK, text_position=sv.Position.CENTER)
annotated_image = image.copy()
mask_annotator.annotate(annotated_image, detections=detections)
label_annotator.annotate(annotated_image, detections=detections)
sv.plot_image(annotated_image, size=(10, 10))
恭喜!已经成功训练了YOLO11模型。让通过将其部署到Roboflow并使用推理来完成这个过程。注意:API密钥应该是针对项目的!如果迄今为止使用了工作区,那么在创建自己的项目之前,部署将无法工作。
project.version(dataset.version).deploy(model_type="yolov11-seg", model_path=f"{HOME}/runs/segment/train/")
这可能需要几分钟时间来完成。完成后,将能够从任何设备访问模型:
pip install inference
import cv2
import supervision as sv
from inference import get_model
model_id = project.id.split("/")[1] + "/" + dataset.version
model = get_model(model_id, "<ROBOFLOW_API_KEY>")
image = cv2.imread("<PATH_TO_IMAGE>")
result = model.infer(image)
detections = sv.Detections.from_inference(result)
在本文中,展示了如何训练YOLO11模型进行实例分割。模型最初对80个COCO类别有所了解,但通过在Roboflow Universe上找到的数据集,将其带入了医学领域,教会了它在骨盆X光图像中分割物体。然后将其部署到Roboflow,允许从其他机器上查询它!完整的代码可在Notebook中找到。