【數據集介紹】
數據集中有很多增強圖片,也有很多視頻連續截取圖片請查看圖片預覽
數據集格式:Pascal VOC格式+YOLO格式(不包含分割路徑的txt文件,僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件)
圖片數量(jpg文件個數):7295
標注數量(xml文件個數):7295
標注數量(txt文件個數):7295
標注類別數:34
所在倉庫:firc-dataset
標注類別名稱(注意yolo格式類別順序不和這個對應,而以labels文件夾classes.txt為準):["Lack_social_skill","Stimming","aligning_objects","avoid_eye_contact","awkward_posture","clapping","closing_eyes","continuous_moving","exaggerated_expression","face_rubbing","finger_biting","finger_flapping","finger_smelling","finger_tapping","hand_flapping","hand_leading","head_banging","holding_objects","jumping","lack_of_awareness","lack_of_response","moving_hand_upforth","normal","repetitive_action","rocking","rubbing_eyes","rubbing_hands","rubbing_nose","rubbing_objects","smelling","spinning","tapping_head","weird_expression","weird_laugh"]
finger_flapping-手指拍打
finger_biting-啃手指
clapping-拍手
rubbing_eyes-揉眼睛
smelling-嗅聞
rubbing_nose-揉鼻子
finger_smelling-嗅聞手指
face_rubbing-揉臉
closing_eyes-閉眼
normal-正常狀態
lack_of_response-反應遲鈍
moving_hand_upforth-手來回移動
holding_objects-握持物品
avoid_eye_contact-避免眼神接觸
exaggerated_expression-夸張的表情
weird_expression-奇怪的表情
awkward_posture-別扭的姿勢
lack_of_awareness-缺乏意識
Lack_social_skill-缺乏社交技能
jumping-跳躍
head_banging-撞頭
continuous_moving-持續移動
spinning-旋轉
repetitive_action-重復動作
weird_laugh-奇怪的笑聲
Stimming-自我刺激行為
aligning_objects-排列物品
hand_leading-用手引導
rubbing_hands-搓手
tapping_head-輕拍頭部
rubbing_objects-摩擦物品
finger_tapping-輕敲手指
rocking-搖晃
每個類別標注的框數:
Lack_social_skill 框數 = 213
Stimming 框數 = 217
aligning_objects 框數 = 179
avoid_eye_contact 框數 = 230
awkward_posture 框數 = 254
clapping 框數 = 111
closing_eyes 框數 = 145
continuous_moving 框數 = 215
exaggerated_expression 框數 = 263
face_rubbing 框數 = 237
finger_biting 框數 = 233
finger_flapping 框數 = 234
finger_smelling 框數 = 180
finger_tapping 框數 = 234
hand_flapping 框數 = 286
hand_leading 框數 = 213
head_banging 框數 = 231
holding_objects 框數 = 334
jumping 框數 = 224
lack_of_awareness 框數 = 221
lack_of_response 框數 = 170
moving_hand_upforth 框數 = 270
normal 框數 = 277
repetitive_action 框數 = 231
rocking 框數 = 237
rubbing_eyes 框數 = 72
rubbing_hands 框數 = 244
rubbing_nose 框數 = 207
rubbing_objects 框數 = 104
smelling 框數 = 253
spinning 框數 = 245
tapping_head 框數 = 232
weird_expression 框數 = 230
weird_laugh 框數 = 226
總框數:7452
使用標注工具:labelImg
標注規則:對類別進行畫矩形框
重要說明:暫無
圖片分辨率:640x640
特別聲明:本數據集不對訓練的模型或者權重文件精度作任何保證
圖片預覽:
標注例子:
【訓練步驟】
這里以yolo11訓練為例。首先我們獲取數據集壓縮包7z格式或者zip格式后解壓到一個非中文或者有空格路徑下面。比如解壓到C:\Users\Administrator\Downloads目錄,下面都是以這個目錄演示訓練流程。
然后我們在數據集data文件夾下面新建一個腳本split.py寫入下面代碼:
import os
import shutil
import randomclass VOCDataSplit(object):def __init__(self):passdef split(self, image_dir, label_dir, save_dir, trainval_radio=0.9, train_radio=0.9, copy_it=True,need_test_dataset=False, shuffle_file=True):train_images_dir = os.path.join(save_dir, 'train', 'images')train_labels_dir = os.path.join(save_dir, 'train', 'labels')val_images_dir = os.path.join(save_dir, 'val', 'images')val_labels_dir = os.path.join(save_dir, 'val', 'labels')test_images_dir = os.path.join(save_dir, 'test', 'images')test_labels_dir = os.path.join(save_dir, 'test', 'labels')os.makedirs(train_images_dir, exist_ok=True)os.makedirs(train_labels_dir, exist_ok=True)os.makedirs(val_images_dir, exist_ok=True)os.makedirs(val_labels_dir, exist_ok=True)if need_test_dataset:os.makedirs(test_images_dir, exist_ok=True)os.makedirs(test_labels_dir, exist_ok=True)files = []for file in os.listdir(image_dir):if file.endswith('.jpg'):files.append(file)total_count = len(files)print('find {} images'.format(total_count))if shuffle_file:random.shuffle(files)if need_test_dataset:test_count = int(total_count * (1 - trainval_radio))train_count = int((total_count - test_count) * train_radio)val_count = total_count - test_count - train_countelse:train_count = int(total_count * train_radio)val_count = total_count - train_counttest_count = 0print('train={},val={},test={}'.format(train_count, val_count, test_count))train_files = files[:train_count]val_files = files[train_count:train_count + val_count]test_files = files[train_count + val_count:]print('start copy or move train files...')for file in train_files:if copy_it:shutil.copy(os.path.join(image_dir, file), os.path.join(train_images_dir, file))label_file = os.path.join(label_dir, file[:-3] + 'txt')if os.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_file = os.path.join(label_dir, file[:-3] + 'txt')if os.path.exists(label_file):shutil.move(label_file, os.path.join(train_labels_dir, file[:-3] + 'txt'))print('start copy or move val files...')for file in val_files:if copy_it:shutil.copy(os.path.join(image_dir, file), os.path.join(val_images_dir, file))label_file = os.path.join(label_dir, file[:-3] + 'txt')if os.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_file = os.path.join(label_dir, file[:-3] + 'txt')if os.path.exists(label_file):shutil.move(label_file, os.path.join(val_labels_dir, file[:-3] + 'txt'))if need_test_dataset and test_count > 0:print('start copy or move test files...')for file in test_files:if copy_it:shutil.copy(os.path.join(image_dir, file), os.path.join(test_images_dir, file))label_file = os.path.join(label_dir, file[:-3] + 'txt')if os.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_file = os.path.join(label_dir, file[:-3] + 'txt')if os.path.exists(label_file):shutil.move(label_file, os.path.join(test_labels_dir, file[:-3] + 'txt'))class_file=os.path.join(label_dir, 'classes.txt')if os.path.exists(class_file):class_names=[]with open(class_file, 'r') as f:class_names=f.read().rstrip('\n').split('\n')nc = len(class_names)content='train: '+train_images_dir+'\n'content += 'val: '+val_images_dir+'\n'if need_test_dataset:content += 'test: '+test_images_dir+'\n'content += 'nc: '+str(nc)+'\n'content += 'names:\n'content += "\n".join([f" {i}: {name}" for i, name in enumerate(class_names)])with open(os.path.join(save_dir,'coco128.yaml'), 'w') as f:f.write(content)print('all done!')
if __name__ == '__main__':images_dir=r'C:\Users\Administrator\Downloads\data\JPEGImages'labels_dir=r'C:\Users\Administrator\Downloads\data\labels'save_dir=r'C:\Users\Administrator\Downloads\dataset'vs = VOCDataSplit()vs.split(images_dir,labels_dir,save_dir,trainval_radio=0.9, train_radio=0.9, copy_it=True,shuffle_file=True,need_test_dataset=False)
?注意?images_dir,labels_dir,save_dir根據自己實際情況進行調整。這個split.py腳本功能就是將JPEGImages和labels文件進行自動隨機分割成標準yolo訓練目錄格式。腳本放在data文件夾下面即可:
然后運行腳本:
然后在C:\Users\Administrator\Downloads看到有個dataset文件夾生成?
至此標準訓練格式完成了。打開coco128.yaml看到下面類似格式:
train: C:\Users\Administrator\Downloads\dataset\train\images
val: C:\Users\Administrator\Downloads\dataset\val\images
nc: 34
names:0: Lack_social_skill1: Stimming2: aligning_objects3: avoid_eye_contact4: awkward_posture5: clapping6: closing_eyes7: continuous_moving8: exaggerated_expression9: face_rubbing10: finger_biting11: finger_flapping12: finger_smelling13: finger_tapping14: hand_flapping15: hand_leading16: head_banging17: holding_objects18: jumping19: lack_of_awareness20: lack_of_response21: moving_hand_upforth22: normal23: repetitive_action24: rocking25: rubbing_eyes26: rubbing_hands27: rubbing_nose28: rubbing_objects29: smelling30: spinning31: tapping_head32: weird_expression33: weird_laugh
?這些都不用修改,我們只需要檢查一下是不是對的就行。
之后就是開始訓練了,注意訓練yolov8模型需要自己提前安裝好環境。
使用預訓練模型開始訓練
yolo task=detect mode=train model=yolo11n.pt data=coco128.yaml epochs=100 imgsz=640 batch=8 workers=2
參數說明:
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 import YOLO# 加載訓練好的模型
model = YOLO('runs/detect/train/weights/best.pt')# 圖像預測
results = model('path_to_your_image.jpg')
視頻或攝像頭預測
results = model('path_to_video.mp4') # 視頻
#results = model(0) # 攝像頭
?驗證集評估
yolo task=detect mode=val model=runs/detect/train/weights/best.pt data=data.yaml
輸出指標圖像,一般在模型訓練后生成,文件位置在runs/detect/train/results.png:
上面訓練結果圖片常用評估參數介紹
【常用評估參數介紹】
在目標檢測任務中,評估模型的性能是至關重要的。你提到的幾個術語是評估模型性能的常用指標。下面是對這些術語的詳細解釋:
- Class:
- 這通常指的是模型被設計用來檢測的目標類別。例如,一個模型可能被訓練來檢測車輛、行人或動物等不同類別的對象。
- Images:
- 表示驗證集中的圖片數量。驗證集是用來評估模型性能的數據集,與訓練集分開,以確保評估結果的公正性。
- Instances:
- 在所有圖片中目標對象的總數。這包括了所有類別對象的總和,例如,如果驗證集包含100張圖片,每張圖片平均有5個目標對象,則Instances為500。
- P(精確度Precision):
- 精確度是模型預測為正樣本的實例中,真正為正樣本的比例。計算公式為:Precision = TP / (TP + FP),其中TP表示真正例(True Positives),FP表示假正例(False Positives)。
- R(召回率Recall):
- 召回率是所有真正的正樣本中被模型正確預測為正樣本的比例。計算公式為:Recall = TP / (TP + FN),其中FN表示假負例(False Negatives)。
- mAP50:
- 表示在IoU(交并比)閾值為0.5時的平均精度(mean Average Precision)。IoU是衡量預測框和真實框重疊程度的指標。mAP是一個綜合指標,考慮了精確度和召回率,用于評估模型在不同召回率水平上的性能。在IoU=0.5時,如果預測框與真實框的重疊程度達到或超過50%,則認為該預測是正確的。
- mAP50-95:
- 表示在IoU從0.5到0.95(間隔0.05)的范圍內,模型的平均精度。這是一個更嚴格的評估標準,要求預測框與真實框的重疊程度更高。在目標檢測任務中,更高的IoU閾值意味著模型需要更準確地定位目標對象。mAP50-95的計算考慮了從寬松到嚴格的多個IoU閾值,因此能夠更全面地評估模型的性能。
這些指標共同構成了評估目標檢測模型性能的重要框架。通過比較不同模型在這些指標上的表現,可以判斷哪個模型在實際應用中可能更有效。
將模型導出為ONNX、TensorRT等格式以用于部署:
yolo export model=runs/detect/train/weights/best.pt format=onnx
支持格式包括:onnx, engine, tflite, pb, torchscript 等。
經過上面訓練可以使用模型做進一步部署,比如使用onnx模型在嵌入式部署,使用engine模型在jetson上deepstream部署,使用torchscript模型可以在C++上部署等等。