(1)機器學習小白入門YOLOv :從概念到實踐
(2)機器學習小白入門 YOLOv:從模塊優化到工程部署
(3)機器學習小白入門 YOLOv: 解鎖圖片分類新技能
(4)機器學習小白入門YOLOv :圖片標注實操手冊
(5)機器學習小白入門 YOLOv:數據需求與圖像不足應對策略
(6)機器學習小白入門 YOLOv:圖片的數據預處理
(7)機器學習小白入門 YOLOv:模型訓練詳解
對于熟悉 Python 和 YOLOv 的資深程序員而言,圖片標注是模型訓練前至關重要的環節,其質量直接影響模型的檢測精度。以下是詳細的標注過程、步驟及相關實例代碼:
一、標注前的準備工作
(一)數據集整理
首先要對收集到的圖片進行篩選和整理。去除模糊、光照異常、目標不清晰的圖片,保證數據集的有效性。同時,按照一定的比例劃分訓練集、驗證集和測試集,一般可采用 8:1:1 的比例,也可根據實際需求調整。另外,為了讓模型更好地學習,需要確保數據集中包含各種場景、角度、尺寸的目標對象。
以下是使用 Python 劃分數據集的示例代碼:
import os
import shutil
import randomdef split_dataset(image_dir, train_ratio=0.8, val_ratio=0.1, test_ratio=0.1):# 創建訓練集、驗證集、測試集文件夾train_dir = os.path.join(image_dir, 'train')val_dir = os.path.join(image_dir, 'val')test_dir = os.path.join(image_dir, 'test')for dir in [train_dir, val_dir, test_dir]:if not os.path.exists(dir):os.makedirs(dir)# 獲取所有圖片路徑image_files = [f for f in os.listdir(image_dir) if f.endswith(('.jpg', '.jpeg', '.png'))]random.shuffle(image_files)# 計算各數據集數量total = len(image_files)train_num = int(total * train_ratio)val_num = int(total * val_ratio)# 復制圖片到對應文件夾for i, file in enumerate(image_files):src = os.path.join(image_dir, file)if i < train_num:dst = os.path.join(train_dir, file)elif i < train_num + val_num:dst = os.path.join(val_dir, file)else:dst = os.path.join(test_dir, file)shutil.copy(src, dst)# 使用示例
image_directory = 'path/to/your/images'
split_dataset(image_directory)
(二)確定標注目標和類別
明確需要標注的目標對象,比如在目標檢測任務中,可能需要標注行人、車輛、交通信號燈等。然后對這些目標進行類別定義,每個類別給予唯一的標識符,方便后續的標注和模型訓練。
(三)選擇合適的標注工具
根據實際需求選擇標注工具,常用的標注工具有 LabelImg、LabelMe、VGG Image Annotator(VIA)等。對于 YOLOv 模型,通常需要輸出特定格式的標注文件(如 txt 格式),部分工具可以直接生成該格式,能減少后續格式轉換的工作。比如 LabelImg 就支持 YOLO 格式的標注,使用起來較為便捷。
二、標注實施步驟(以 LabelImg 為例)
(一)導入圖片到標注工具
-
打開 LabelImg 軟件,點擊左上角的 “Open Dir” 按鈕,在彈出的窗口中選擇整理好的圖片文件夾,即可將該文件夾下的所有圖片導入到工具中。
-
若需要批量處理圖片,可點擊 “Change Save Dir” 設置標注文件的保存路徑,確保標注文件與圖片對應存放。
(二)進行目標框標注
-
在工具欄中選擇 “Create RectBox” 工具。
-
對于當前顯示的圖片,找到目標對象,按住鼠標左鍵拖動,繪制一個能夠準確包圍目標的矩形邊界框。例如,標注一輛汽車時,邊界框應從汽車的左上角邊緣到右下角邊緣,盡量不包含過多背景,也不遺漏汽車的任何部分。
-
繪制完成后,松開鼠標,會彈出一個類別選擇窗口。
(三)填寫類別信息
-
在彈出的類別選擇窗口中,從預設的類別列表中選擇該目標對應的類別,如 “dog”。
-
若該類別未在列表中,可直接輸入類別名稱并點擊 “OK”,該類別會被添加到列表中供后續使用。
-
完成一個目標的標注后,可點擊 “Next Image”(快捷鍵 “D”)切換到下一張圖片,重復上述標注操作。
實例過程:假設要標注一批包含行人、自行車和摩托車的圖片。導入圖片文件夾后,第一張圖片中有一位行人和一輛自行車。使用 “Create RectBox” 工具分別為行人和自行車繪制邊界框,在類別選擇窗口中分別選擇 “person” 和 “bicycle”,完成標注后切換到下一張圖片繼續標注。
三、標注后的檢查與處理
(一)標注質量檢查
對標注好的圖片進行逐一檢查,查看邊界框是否準確、類別標注是否正確。可以通過隨機抽查、交叉檢查等方式提高檢查的準確性。對于發現的錯誤標注,要及時進行修正。
import osdef check_annotations(image_dir, label_dir, class_names):class_ids = {name: i for i, name in enumerate(class_names)}error_log = []for image_file in os.listdir(image_dir):if not image_file.endswith(('.jpg', '.jpeg', '.png')):continueimage_name = os.path.splitext(image_file)[0]label_file = os.path.join(label_dir, f'{image_name}.txt')# 檢查標注文件是否存在if not os.path.exists(label_file):error_log.append(f'標注文件不存在:{label_file}')continue# 檢查標注內容with open(label_file, 'r') as f:lines = f.readlines()for line_num, line in enumerate(lines, 1):parts = line.strip().split()if len(parts) != 5:error_log.append(f'{label_file} 第{line_num}行格式錯誤,應為5個字段')continueclass_id, x_center, y_center, width, height = partstry:class_id = int(class_id)x_center = float(x_center)y_center = float(y_center)width = float(width)height = float(height)except ValueError:error_log.append(f'{label_file} 第{line_num}行字段類型錯誤')continueif class_id not in class_ids.values():error_log.append(f'{label_file} 第{line_num}行類別ID無效:{class_id}')if not (0 <= x_center <= 1 and 0 <= y_center <= 1 and 0 <= width <= 1 and 0 <= height <= 1):error_log.append(f'{label_file} 第{line_num}行坐標值超出范圍')return error_log# 使用示例
class_names = ['person', 'car', 'traffic_light']
image_dir = 'path/to/train/images'
label_dir = 'path/to/train/labels'
errors = check_annotations(image_dir, label_dir, class_names)
if errors:with open('annotation_errors.txt', 'w') as f:f.write('\n'.join(errors))print(f'發現{len(errors)}個錯誤,已保存到annotation_errors.txt')
else:print('標注檢查通過')
(二)格式轉換(如需要)
雖然部分標注工具可以直接生成 YOLOv 所需的 txt 格式標注文件,但如果使用的工具生成的是其他格式(如 XML 格式),則需要進行格式轉換。可以利用 Python 編寫腳本實現格式轉換,將標注信息轉換為 YOLOv 要求的格式,即每個圖片對應一個 txt 文件,文件中每行包含類別索引、目標中心 x 坐標、目標中心 y 坐標、目標寬度、目標高度(均為相對于圖片寬度和高度的歸一化值)。
以下是將 XML 格式標注文件轉換為 YOLOv 所需 txt 格式的示例代碼:
<annotation><folder>img</folder><filename>1-0002.png</filename><path>E:\BaiduNetdiskDownload\data\img\1-0002.png</path><source><database>Unknown</database></source><size><width>386</width><height>386</height><depth>3</depth></size><segmented>0</segmented><object><name>dog</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>2</xmin><ymin>2</ymin><xmax>383</xmax><ymax>385</ymax></bndbox></object>
</annotation>
(三)數據集打包與存儲
將檢查和處理好的圖片和對應的標注文件按照訓練集、驗證集、測試集的劃分進行打包存儲。可以建立相應的文件夾結構,如 “train/images”“train/labels”“val/images”“val/labels”“test/images”“test/labels”,分別存放對應數據集的圖片和標注文件,方便后續模型訓練時調用。