ultralytics团队希望将这个项目设计和建成一个集合分类,检测,分割等视觉任务的集成训练推理框架,而不仅仅只是yolov
模型结构设计、Loss 计算、训练数据增强、训练策略和模型推理过程共 5 个部分
模型结构设计
backbone NeckHeadLoss 设计
Loss 计算过程包括 2 个部分: 正负样本分配策略和 Loss 计算
升级
同时支持目标检测、实例分割和图像分类三种任务+ 用户友好的API(命令行+Python)
YOLOv8的开发者脱离了标准YOLO项目的设计,将train.py、detect.py、val.py和export.py这四个脚本进行了分离
数据集
DOTA数据集全称:Dataset for Object deTection in Aerial images
https://captain-whu.github.io/DOTA/dataset.html
Microsoft COCO: Common Objects in Context
https://cocodataset.org/#home
https://cocodataset.org/#download
state-of-the-art (SOTA) model 应用最先进技术
yolo格式的标签和其目录结构格式
yolo官方的txt格式。
每行代表一个物体的类别和位置,第一列代表物体的类别,后面四列代表物体的位置信息,
分别为x,y,w,h。每张图片对应一个txt文件,
yolo标注格式保存在.txt文件中,一共5个数据,用空格隔开
一个文件中有多个类别的物体。x,y,w,h分别为相对大小,即相当于原图的比例大小
这四个值都是要做标准化处理,也就是除以原图的尺寸,它们的取值都是在0~1之
标签文件夹名称必须是labels 不是lables el和le
数据集转换
构建自定义数据集
1.Create Dataset
2.Create dataset.yaml
3.Create Labels
4. Organize Directories
https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
How to Train YOLOv8 Object Detection on a Custom Dataset
https://blog.roboflow.com/how-to-train-yolov8-on-a-custom-dataset/
转换后的数据集
YOLO_dir
└─ mydata
├─ images
│ ├─ test# 下面放测试集图片
│ ├─ train # 下面放训练集图片
│ └─ val # 下面放验证集图片
└─ labels
├─ test# 下面放测试集标签
├─ train # 下面放训练集标签
├─ val # 下面放验证集标签
原始标注的数据集 以及 注意事项
yolo格式的数据转coco格式
其中图片名和标签文件(.txt)名一一对应,且标签文件中保存的是对应图片中各个目标的类别和坐标
yolo的数据格式为 (x_center, y_center, w, h);
而coco里面的bbox格式为(x_left, y_top, w, h) 。这是不一样的
区分训练集和验证集
../datasets/
company/images
train/im0.jpg
train/im1.jpg
val/im2.jpg
company/labels
train/im0.txt
train/im1.txt
val/im2.txt
###labels 说明:
One row per object
Each row is class x_center y_center width height format.
Box coordinates must be in normalized xywh format (from 0 - 1).
If your boxes are in pixels, divide x_center and width by image width, and y_center and height by image height.
Class numbers are zero-indexed (start from 0).
03.dataset.yaml
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, # or 3) list: [path/to/imgs1, path/to/imgs2, ..]path:../datasets/company# dataset root dirtrain:images/train# train images (relative to 'path') 128 imagesval:images/train# val images (relative to 'path') 128 images val: images/valtest:# test images (optional)# Classes (80 COCO classes)names:0:person1:vehicle2:car
04.代码示例
# -*- coding: utf-8 -*-#import glob
import json
import os
import shutil
import numpy as np
defget_label_js(json_file_path):
stat_set= set()
extra_set=set(['ori', 'beidth', 'height'])
withopen(json_file_path,mode="r",encoding="utf8") as label_r:
for num,data inenumerate(label_r):
json_data = json.loads(data)
for item in json_data.items():
key = item[0]
value = item[1]
stat_set.add(key)
label_nm = stat_set - extra_set
return label_nm
defset_label_index(json_file_path):
label_set = get_label_js(json_file_path)
file_gt_label_index =dict()
for i,label inenumerate(label_set):
file_gt_label_index[label] = i
print(file_gt_label_index )
return file_gt_label_index
## 根据读出的标签 设置类别--可以根据标注文档,如果没有的话再采用这种方式
gt_label_index ={
'person': 0,
'vehicle': 1,
}
##没有重复的key
get_mark_index_label= {value:key for key,value in gt_label_index.items()}
# COCO的格式: [x1,y1,w,h] 对应COCO的bbox格式defget_box(points):
min_x = min_y = np.inf
max_x = max_y = 0for x, y in points:
min_x = min(min_x, x)
min_y = min(min_y, y)
max_x = max(max_x, x)
max_y = max(max_y, y)
return [min_x, min_y, max_x - min_x, max_y - min_y]
# [min_x, min_y, max_x, max_y] 对应的格式: [ x_center y_center width height] defget_yolo_points(points, img_w = 1600, img_h=1200):
min_x = points[0]
min_y = points[1]
max_x = points[2]
max_y = points[3]
###归一化的坐标
x_center = (min_x+max_x)/(2.0*img_w)
y_center = (min_y+max_y)/(2.0*img_h)
width = (max_x - min_x)/(1.0*img_w)
height= (max_y - min_y)/(1.0*img_h)
return [x_center, y_center, width, height]
defread_label_js(json_file_path,img_sub):
img_target_dir = os.path.join(img_sub,"images","train")
ifnot os.path.exists(img_target_dir):
os.makedirs(img_target_dir)
label_target_dir = os.path.join(img_sub,"labels","train")
ifnot os.path.exists(label_target_dir):
os.makedirs(label_target_dir)
img_file = sorted(glob.glob(img_sub+"/*.jpeg", recursive=True))
img_file_nm = [ os.path.split(img)[-1] for img in img_file]
withopen(json_file_path,mode="r",encoding="utf8") as label_r:
for num,data inenumerate(label_r):
json_data = json.loads(data)
if json_data["my_key"] isnotNone:
img_nm= os.path.split(json_data["my_key"])[-1]
if img_nm in img_file_nm:
print(img_nm)
shutil.copyfile( os.path.join(img_sub,img_nm), os.path.join(img_target_dir,img_nm))
withopen(os.path.join(label_target_dir,img_nm.replace("jpeg","txt")),mode="w",encoding="utf8") as label_w :
for item in json_data.items():
label_key = item[0]
label_value = item[1]
if label_key in gt_label_index.keys():
for locatioin in json_data[label_key]:
# row is class x_center y_center width height format.# Box coordinates must be in normalized xywh format (from 0 - 1)
label_location_data= get_yolo_points(locatioin["data"])
print(label_key,gt_label_index[label_key],label_location_data )
line = str(gt_label_index[label_key]) + " "+ " ".join(map(str,label_location_data))
label_w.write(line+"\n")
if __name__ == '__main__':
label_json= r"D:\train.json"
img_dir = r"D:\train"
read_label_js(label_json,img_dir)
#get_label_js(label_json)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)