一、前言介紹
在深度學習領域中,標注是一項非常重要的工作,因為許多深度學習模型都依賴于有標注的數據進行訓練。然而,標注數據是一個費時費力的工作,因此人們希望有一種方式來對標注過程進行自動化。這就是“半自動標注”的來源。半自動標注是一種折中的方式,它結合了人類的判斷能力和計算機的自動化能力。
在一個半自動標注的系統中,步驟如下:
1、初始的標注工作通常由人類來做;
2、這些被標注的數據被用來訓練一個深度學習模型,使模型能做出預測并自動標注新的數據。
3、但模型預測出的標注可能會有誤,所以仍然需要人類進行審核和校正。
二、功能實現
1.數據集拆分
考慮到初始標注的數據集能有效兼顧,需要對全部數據集隨機拆分,這樣有助于有助于確保初始的標注數據集能代表整體數據集的特性。
例如:如果有1萬個數據樣本,可以使用的一種策略是使用10-20%的數據作為初始標注數據,也就是1000-2000個樣本。這樣可以得到一個相當大的初始標注數據集,可以提供足夠的信息來訓練模型。
import os
import shutil
import random# 指定源文件夾路徑
source_folder = "your_source_folder" # 替換為你的源文件夾路徑# 指定目標文件夾路徑
dest_folders = ["your_dest_folder1", "your_dest_folder2", "your_dest_folder3", "your_dest_folder4", "your_dest_folder5"] # 替換為你的目標文件夾路徑列表# 如果目標文件夾不存在,創建它們
for folder in dest_folders:if not os.path.exists(folder):os.makedirs(folder)# 獲取源文件夾中的所有jpg文件
jpg_files = [f for f in os.listdir(source_folder) if f.endswith(".jpg")]# 隨機打亂jpg文件列表
random.shuffle(jpg_files)# 均分文件到五個文件夾
split_files = [jpg_files[i::5] for i in range(5)]# 將文件復制到對應的目標文件夾
for i in range(5):for file in split_files[i]:shutil.copy2(os.path.join(source_folder, file), dest_folders[i])
2.標注初始數據集
從第一部分拆分的五個子數據集中,選擇第一個進行數據集標注。
標注軟件labelImg
labelImg 圖像文件路徑 標注的類別txt文件路徑
label的文件夾要放classes.txt(存放標注的類別)
3.yolov8訓練,預測并自動標注新的數據
強調點:
- 要去掉無標簽值的image[初始數據集中要刪除無label的image,免得影響模型的效果(也會將無標簽的圖片作為訓練圖片)]
3.1 標注文件的整理
對第二部分標注的初始數據集,txt文件和image文件是放在一起,刪除內容為空的txt文件。再刪除無txt文件的image文件
import os# 指定目錄
directory = '/path/to/directory'txt_files = [f for f in os.listdir(directory) if f.endswith('.txt')]
jpg_files = [f for f in os.listdir(directory) if f.endswith('.jpg')]# 檢查文本文件,如果文件為空就刪除
for filename in txt_files:filepath = os.path.join(directory, filename)# 判斷文件是否為空if os.path.getsize(filepath) == 0:os.remove(filepath)print(f'{filename} is empty and has been removed.')txt_files.remove(filename) # 從文本文件列表中移除已刪除的文件# 基于存在的文本文件,如果對應的jpg文件存在,但txt文件不存在,則刪除jpg文件
for filename in jpg_files:txt_filename = filename.replace('.jpg', '.txt')if txt_filename not in txt_files: # 在此判斷txt文件是否存在jpg_filepath = os.path.join(directory, filename)os.remove(jpg_filepath)print(f'{filename} has been removed because its corresponding txt file does not exist.')
3.2 將原圖和標簽按照yolo的數據集路徑格式進行存放
dataset├─ images│ ├─ test # 存放測試集數據(可無)│ ├─ train # 存放訓練集數據│ └─ val # 存放驗證集數據└─ labels├─ test # 存放測試集標簽(可無)├─ train # 存放訓練集標簽├─ val # 存放驗證集標簽
3.3 訓練與預測的代碼
from ultralytics import YOLO
# 目標檢測
# # 加載模型
model = YOLO("yolov8n.pt") # 加載預訓練權重
# model = YOLO("ultralytics/cfg/models/v8/yolov8n.yaml") # 配置文件# 模型訓練
model.train(data="yolov8n/data_detect.yaml", epochs=100,imgsz = 640,batch=64) # 訓練模型# 預測標簽 source:是待標注的數據集文件夾
Model.predict(source="/home/sta/datasets/images1",save_txt=True)
3.校正預測的label
用labelImg標注軟件,微調第二個數據集的label
4.依次處理第二、第三、第四和第五數據集
完成第二個子數據集,將第一個和第二個合在一起,再重新訓練一個新的模型;預測第三個子數據集;依次處理