【数据集介绍】注意数据集中存在增强图片主要是旋转增强占据数据量大约一半注意查看图片数据集格式Pascal VOC格式YOLO格式(不包含分割路径的txt文件仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)3648标注数量(xml文件个数)3648标注数量(txt文件个数)3648标注类别数1所在github仓库firc-dataset标注类别名称:[“yingsu”]每个类别标注的框数yingsu 框数 6066总框数6066每个类别占有图片数yingsu 占有图片数 3648图片分辨率多分辨率图片,如988x988,1280x1280等使用标注工具labelImg标注规则对类别进行画矩形框重要说明数据集没有划分训练验证测试集需自行划分特别声明本数据集不对训练的模型或者权重文件精度作任何保证图片预览标注例子【训练步骤】这里以yolo11训练为例。首先我们获取数据集压缩包7z格式或者zip格式后解压到一个非中文或者有空格路径下面。比如解压到C:\Users\Administrator\Downloads目录下面都是以这个目录演示训练流程。然后我们在数据集data文件夹下面新建一个脚本split.py写入下面代码importosimportshutilimportrandomclassVOCDataSplit(object):def__init__(self):pass defsplit(self,image_dir,label_dir,save_dir,trainval_radio0.9,train_radio0.9,copy_itTrue,need_test_datasetFalse,shuffle_fileTrue):train_images_diros.path.join(save_dir,train,images)train_labels_diros.path.join(save_dir,train,labels)val_images_diros.path.join(save_dir,val,images)val_labels_diros.path.join(save_dir,val,labels)test_images_diros.path.join(save_dir,test,images)test_labels_diros.path.join(save_dir,test,labels)os.makedirs(train_images_dir,exist_okTrue)os.makedirs(train_labels_dir,exist_okTrue)os.makedirs(val_images_dir,exist_okTrue)os.makedirs(val_labels_dir,exist_okTrue)ifneed_test_dataset:os.makedirs(test_images_dir,exist_okTrue)os.makedirs(test_labels_dir,exist_okTrue)files[]forfileinos.listdir(image_dir):iffile.endswith(.jpg):files.append(file)total_countlen(files)print(find {} images.format(total_count))ifshuffle_file:random.shuffle(files)ifneed_test_dataset:test_countint(total_count*(1-trainval_radio))train_countint((total_count-test_count)*train_radio)val_counttotal_count-test_count-train_countelse:train_countint(total_count*train_radio)val_counttotal_count-train_count test_count0print(train{},val{},test{}.format(train_count,val_count,test_count))train_filesfiles[:train_count]val_filesfiles[train_count:train_countval_count]test_filesfiles[train_countval_count:]print(start copy or move train files...)forfileintrain_files:ifcopy_it:shutil.copy(os.path.join(image_dir,file),os.path.join(train_images_dir,file))label_fileos.path.join(label_dir,file[:-3]txt)ifos.path.exists(label_file):shutil.copy(label_file,os.path.join(train_labels_dir,file[:-3]txt))else:shutil.move(os.path.join(image_dir,file),os.path.join(train_images_dir,file))label_fileos.path.join(label_dir,file[:-3]txt)ifos.path.exists(label_file):shutil.move(label_file,os.path.join(train_labels_dir,file[:-3]txt))print(start copy or move val files...)forfileinval_files:ifcopy_it:shutil.copy(os.path.join(image_dir,file),os.path.join(val_images_dir,file))label_fileos.path.join(label_dir,file[:-3]txt)ifos.path.exists(label_file):shutil.copy(label_file,os.path.join(val_labels_dir,file[:-3]txt))else:shutil.move(os.path.join(image_dir,file),os.path.join(val_images_dir,file))label_fileos.path.join(label_dir,file[:-3]txt)ifos.path.exists(label_file):shutil.move(label_file,os.path.join(val_labels_dir,file[:-3]txt))ifneed_test_dataset and test_count0:print(start copy or move test files...)forfileintest_files:ifcopy_it:shutil.copy(os.path.join(image_dir,file),os.path.join(test_images_dir,file))label_fileos.path.join(label_dir,file[:-3]txt)ifos.path.exists(label_file):shutil.copy(label_file,os.path.join(test_labels_dir,file[:-3]txt))else:shutil.move(os.path.join(image_dir,file),os.path.join(test_images_dir,file))label_fileos.path.join(label_dir,file[:-3]txt)ifos.path.exists(label_file):shutil.move(label_file,os.path.join(test_labels_dir,file[:-3]txt))class_fileos.path.join(label_dir,classes.txt)ifos.path.exists(class_file):class_names[]withopen(class_file,r)asf:class_namesf.read().rstrip(\n).split(\n)nclen(class_names)contenttrain: train_images_dir\ncontentval: val_images_dir\nifneed_test_dataset:contenttest: test_images_dir\ncontentnc: str(nc)\ncontentnames:\ncontent\n.join([f {i}: {name}fori,nameinenumerate(class_names)])withopen(os.path.join(save_dir,coco128.yaml),w)asf:f.write(content)print(all done!)if__name____main__:images_dirrC:\Users\Administrator\Downloads\data\JPEGImageslabels_dirrC:\Users\Administrator\Downloads\data\labelssave_dirrC:\Users\Administrator\Downloads\datasetvsVOCDataSplit()vs.split(images_dir,labels_dir,save_dir,trainval_radio0.9,train_radio0.9,copy_itTrue,shuffle_fileTrue,need_test_datasetFalse)注意 images_dirlabels_dirsave_dir根据自己实际情况进行调整。这个split.py脚本功能就是将JPEGImages和labels文件进行自动随机分割成标准yolo训练目录格式。脚本放在data文件夹下面即可然后运行脚本然后在C:\Users\Administrator\Downloads看到有个dataset文件夹生成至此标准训练格式完成了。打开coco128.yaml看到下面类似格式train:C:\Users\Administrator\Downloads\dataset\train\imagesval:C:\Users\Administrator\Downloads\dataset\val\imagesnc:1names:0:yingsu这些都不用修改我们只需要检查一下是不是对的就行。之后就是开始训练了注意训练yolov8模型需要自己提前安装好环境。使用预训练模型开始训练yolo taskdetect modetrainmodelyolo11n.pt datacoco128.yaml epochs100 imgsz640 batch8 workers2参数说明model: 使用的模型类型如 yolo11s.pt小模型、yolo11m.pt中、yolo11l.pt大data: 指定数据配置文件epochs: 训练轮数imgsz: 输入图像尺寸batch: 批量大小根据显存调整workers:指定进程数(windows最好设置0或者1或2,linux可以设置8)训练完成后最佳权重保存路径为runs/detect/train/weights/best.pt如果多次运行命令runs/detect/train2,runs/detect/train3文件夹生成只需要到数字最大文件夹查看就可以找到模型图片预测from ultralytics importYOLO# 加载训练好的模型modelYOLO(runs/detect/train/weights/best.pt)# 图像预测resultsmodel(path_to_your_image.jpg)视频或摄像头预测resultsmodel(path_to_video.mp4)# 视频 #resultsmodel(0)# 摄像头验证集评估yolo taskdetect modeval modelruns/detect/train/weights/best.pt datadata.yaml输出指标图像一般在模型训练后生成文件位置在runs/detect/train/results.png(以下仅仅是示例图并非这个数据集训练真实日志图)上面训练结果图片常用评估参数介绍【常用评估参数介绍】在目标检测任务中评估模型的性能是至关重要的。你提到的几个术语是评估模型性能的常用指标。下面是对这些术语的详细解释Class这通常指的是模型被设计用来检测的目标类别。例如一个模型可能被训练来检测车辆、行人或动物等不同类别的对象。Images表示验证集中的图片数量。验证集是用来评估模型性能的数据集与训练集分开以确保评估结果的公正性。Instances在所有图片中目标对象的总数。这包括了所有类别对象的总和例如如果验证集包含100张图片每张图片平均有5个目标对象则Instances为500。P精确度Precision精确度是模型预测为正样本的实例中真正为正样本的比例。计算公式为Precision TP / (TP FP)其中TP表示真正例True PositivesFP表示假正例False Positives。R召回率Recall召回率是所有真正的正样本中被模型正确预测为正样本的比例。计算公式为Recall TP / (TP FN)其中FN表示假负例False Negatives。mAP50表示在IoU交并比阈值为0.5时的平均精度mean Average Precision。IoU是衡量预测框和真实框重叠程度的指标。mAP是一个综合指标考虑了精确度和召回率用于评估模型在不同召回率水平上的性能。在IoU0.5时如果预测框与真实框的重叠程度达到或超过50%则认为该预测是正确的。mAP50-95表示在IoU从0.5到0.95间隔0.05的范围内模型的平均精度。这是一个更严格的评估标准要求预测框与真实框的重叠程度更高。在目标检测任务中更高的IoU阈值意味着模型需要更准确地定位目标对象。mAP50-95的计算考虑了从宽松到严格的多个IoU阈值因此能够更全面地评估模型的性能。这些指标共同构成了评估目标检测模型性能的重要框架。通过比较不同模型在这些指标上的表现可以判断哪个模型在实际应用中可能更有效。将模型导出为ONNX、TensorRT等格式以用于部署yolo export modelruns/detect/train/weights/best.pt formatonnx支持格式包括onnx, engine, tflite, pb, torchscript 等。经过上面训练可以使用模型做一步部署比如使用onnx模型在嵌入式部署使用engine模型在jetson上deepstream部署使用torchscript模型可以在C上部署等等。