常德市网站建设_网站建设公司_改版升级_seo优化
2026/1/16 9:06:21 网站建设 项目流程

前言

由于目前全网大都是水平框检测的教程,本博客使用YOLOv11_OBB检测,从打标签,到训练自己的数据集,显示目标的旋转框检测教程。
目标检测框和目标旋转框的区别:
旋转边界框(OBB)包含一个额外的角度,以提高图像中物体定位的准确性。与轴对齐的矩形边界框不同,OBB可以旋转以更好地适应物体的方向。这对于需要精确定位物体的应用尤其有用,例如航空或卫星图像。

OBB源码下载

官方源码:https://github.com/ultralytics/ultralytics

标签工具下载及使用

X-AnyLabeling下载:https://github.com/CVHub520/X-AnyLabeling/releases/tag/v3.3.5

打开X-AnyLabeling,选择需要标注图像所在的文件夹,打开图像后,右键,选择创建旋转框。(快捷键O)

选择需要标注的物体,设置标签后,鼠标放在旋转框上,可以按Z X C V四个键进行旋转。

标记好的json文件格式如下:points的数据表示旋转框的四个顶点位置。

所有的物体标注完成后。先创建一个类别名的txt文件(在),在转YOLO的训练格式




默认路径即可。完成后该路径下生成label文件夹,里面包含YOLO格式的txt文件

txt文件中数字分别代表,类别名,x1,y1,x2,y2,x3,y3,x4,y4,也就是四个顶点坐标点归一化的值。

数据集划分

使用数据划分的python脚本,程序很简单,在代码中更改成自己需要划分数据的输入和输出就行了,直接上代码:

importos, shutil, random from tqdmimporttqdm""" 标注文件是yolo格式(txt文件) 训练集:验证集:测试集 (7:2:1)""" def split_img(img_path, label_path, split_list): try:# 这个是你划分结果输出的路径Data='./data/laser_display_obb'# Data是你要将要创建的文件夹路径(路径一定是相对于你当前的这个脚本而言的)# os.mkdir(Data)train_img_dir=Data +'/images/train'val_img_dir=Data +'/images/val'test_img_dir=Data +'/images/test'train_label_dir=Data +'/labels/train'val_label_dir=Data +'/labels/val'test_label_dir=Data +'/labels/test'# 创建文件夹os.makedirs(train_img_dir)os.makedirs(train_label_dir)os.makedirs(val_img_dir)os.makedirs(val_label_dir)os.makedirs(test_img_dir)os.makedirs(test_label_dir)except: print('文件目录已存在')train, val,test=split_list all_img=os.listdir(img_path)all_img_path=[os.path.join(img_path, img)forimginall_img]# all_label = os.listdir(label_path)# all_label_path = [os.path.join(label_path, label) for label in all_label]train_img=random.sample(all_img_path, int(train * len(all_img_path)))train_img_copy=[os.path.join(train_img_dir, img.split('\\')[-1])forimgintrain_img]train_label=[toLabelPath(img, label_path)forimgintrain_img]train_label_copy=[os.path.join(train_label_dir, label.split('\\')[-1])forlabelintrain_label]foriintqdm(range(len(train_img)),desc='train ',ncols=80,unit='img'): _copy(train_img[i], train_img_dir)_copy(train_label[i], train_label_dir)all_img_path.remove(train_img[i])val_img=random.sample(all_img_path, int(val /(val +test)* len(all_img_path)))val_label=[toLabelPath(img, label_path)forimginval_img]foriintqdm(range(len(val_img)),desc='val ',ncols=80,unit='img'): _copy(val_img[i], val_img_dir)_copy(val_label[i], val_label_dir)all_img_path.remove(val_img[i])test_img=all_img_path test_label=[toLabelPath(img, label_path)forimgintest_img]foriintqdm(range(len(test_img)),desc='test ',ncols=80,unit='img'): _copy(test_img[i], test_img_dir)_copy(test_label[i], test_label_dir)def _copy(from_path, to_path): shutil.copy(from_path, to_path)def toLabelPath(img_path, label_path): img=img_path.split('\\')[-1]# 修正:使用os.path.splitext分离文件名和扩展名,适用于任何图片格式img_name=os.path.splitext(img)[0]# 获取不带扩展名的文件名label=img_name +'.txt'# 生成对应的标注文件名returnos.path.join(label_path, label)if__name__=='__main__':# 更改成你自己的需要划分图像和标签的路径img_path='C:/Users/ASUS/Desktop/Laser_rangefinder2_obb/images/train'# 你的图片存放的路径(路径一定是相对于你当前的这个脚本文件而言的)label_path='C:/Users/ASUS/Desktop/Laser_rangefinder2_obb/labels/train'# 你的txt文件存放的路径(路径一定是相对于你当前的这个脚本文件而言的)split_list=[0.7,0.2,0.1]# 数据集划分比例[train:val:test]split_img(img_path, label_path, split_list)

OBB训练配置

配置训练数据文件(自己数据集.yaml)

yaml文件路径为:E:\Tensor_YOLO\yolov11\ultralytics\ultralytics\cfg\datasets

配置网络文件(yolov11_obb.yaml)

yolo_obb文件路径:\ultralytics\ultralytics\cfg\models\11

修改类别数,改为自己训练的类别数

权重文件下载(yolov11_obb.pt)

地址:https://github.com/ultralytics/ultralytics/tree/v8.3.242?tab=readme-ov-file

点击自己需要的model进行下载。还需要下载yolo11n.pt

训练及推理

训练脚本

from ultralyticsimportYOLO# Load a modelmodel=YOLO("yolo11n-obb.yaml")# build a new model from YAMLmodel=YOLO("yolo11n-obb.pt")# load a pretrained model (recommended for training)model=YOLO("yolo11n-obb.yaml").load("yolo11n.pt")# build from YAML and transfer weights# Train the modelresults=model.train(data="dota8.yaml",epochs=100,imgsz=640,workers=0,device="0")

检测单张图像脚本

from ultralyticsimportYOLO# Load a modelmodel=YOLO("yolo11-obb.pt")# load an official modelmodel=YOLO("path/to/best.pt")# load a custom model# Predict with the modelresults=model("/images/boats.jpg")# predict on an image# Access the resultsforresultinresults: xywhr=result.obb.xywhr# center-x, center-y, width, height, angle (radians)xyxyxyxy=result.obb.xyxyxyxy# polygon format with 4-pointsnames=[result.names[cls.item()]forclsinresult.obb.cls.int()]# class name of each boxconfs=result.obb.conf# confidence score of each box

总结

YOLOv11_OBB从标签制作到训练推理到此结束,全程没有出现任何错误,还是很顺利的。。。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询