2026/5/24 1:49:38
网站建设
项目流程
手机网站建设,晋江文创园网站建设,搜索热门关键词,wordpress主题giligili前言
由于目前全网大都是水平框检测的教程#xff0c;本博客使用YOLOv11_OBB检测#xff0c;从打标签#xff0c;到训练自己的数据集#xff0c;显示目标的旋转框检测教程。
目标检测框和目标旋转框的区别#xff1a;
旋转边界框#xff08;OBB#xff09;包含一个额外的…前言由于目前全网大都是水平框检测的教程本博客使用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文件 训练集验证集测试集 721 def split_img(img_path, label_path, split_list): try:# 这个是你划分结果输出的路径Data./data/laser_display_obb# Data是你要将要创建的文件夹路径路径一定是相对于你当前的这个脚本而言的# os.mkdir(Data)train_img_dirData /images/trainval_img_dirData /images/valtest_img_dirData /images/testtrain_label_dirData /labels/trainval_label_dirData /labels/valtest_label_dirData /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,testsplit_list all_imgos.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_imgrandom.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)),desctrain ,ncols80,unitimg): _copy(train_img[i], train_img_dir)_copy(train_label[i], train_label_dir)all_img_path.remove(train_img[i])val_imgrandom.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)),descval ,ncols80,unitimg): _copy(val_img[i], val_img_dir)_copy(val_label[i], val_label_dir)all_img_path.remove(val_img[i])test_imgall_img_path test_label[toLabelPath(img, label_path)forimgintest_img]foriintqdm(range(len(test_img)),desctest ,ncols80,unitimg): _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): imgimg_path.split(\\)[-1]# 修正使用os.path.splitext分离文件名和扩展名适用于任何图片格式img_nameos.path.splitext(img)[0]# 获取不带扩展名的文件名labelimg_name .txt# 生成对应的标注文件名returnos.path.join(label_path, label)if__name____main__:# 更改成你自己的需要划分图像和标签的路径img_pathC:/Users/ASUS/Desktop/Laser_rangefinder2_obb/images/train# 你的图片存放的路径路径一定是相对于你当前的这个脚本文件而言的label_pathC:/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训练配置配置训练数据文件自己数据集.yamlyaml文件路径为E:\Tensor_YOLO\yolov11\ultralytics\ultralytics\cfg\datasets配置网络文件yolov11_obb.yamlyolo_obb文件路径\ultralytics\ultralytics\cfg\models\11修改类别数改为自己训练的类别数权重文件下载yolov11_obb.pt地址https://github.com/ultralytics/ultralytics/tree/v8.3.242?tabreadme-ov-file点击自己需要的model进行下载。还需要下载yolo11n.pt训练及推理训练脚本from ultralyticsimportYOLO# Load a modelmodelYOLO(yolo11n-obb.yaml)# build a new model from YAMLmodelYOLO(yolo11n-obb.pt)# load a pretrained model (recommended for training)modelYOLO(yolo11n-obb.yaml).load(yolo11n.pt)# build from YAML and transfer weights# Train the modelresultsmodel.train(datadota8.yaml,epochs100,imgsz640,workers0,device0)检测单张图像脚本from ultralyticsimportYOLO# Load a modelmodelYOLO(yolo11-obb.pt)# load an official modelmodelYOLO(path/to/best.pt)# load a custom model# Predict with the modelresultsmodel(/images/boats.jpg)# predict on an image# Access the resultsforresultinresults: xywhrresult.obb.xywhr# center-x, center-y, width, height, angle (radians)xyxyxyxyresult.obb.xyxyxyxy# polygon format with 4-pointsnames[result.names[cls.item()]forclsinresult.obb.cls.int()]# class name of each boxconfsresult.obb.conf# confidence score of each box总结YOLOv11_OBB从标签制作到训练推理到此结束全程没有出现任何错误还是很顺利的。。。