Datawhale AI 夏令營 第五期 CV方向 01

程序员shaun發表於2024-08-26

yolo方案baseline

step1:賽事報名

Datawhale (linklearner.com) 飛書文件

step2:跑通baseline

  1. 首先在伺服器下載程式碼
apt install git-lfs
git lfs install
git clone https://www.modelscope.cn/datasets/Datawhale/AI_Camp5_baseline_CV.git
  1. 學習下baseline的程式碼
# 讀取訓練集影片
for anno_path, video_path in zip(train_annos[:5], train_videos[:5]):
    print(video_path)
    anno_df = pd.read_json(anno_path)
    cap = cv2.VideoCapture(video_path)
    frame_idx = 0 
    # 讀取影片所有畫面
    while True:
        ret, frame = cap.read()
        if not ret:
            break

        img_height, img_width = frame.shape[:2]
        
        # 將畫面寫為圖
        frame_anno = anno_df[anno_df['frame_id'] == frame_idx]
        cv2.imwrite('./yolo-dataset/train/' + anno_path.split('/')[-1][:-5] + '_' + str(frame_idx) + '.jpg', frame)

        # 如果存在標註
        if len(frame_anno) != 0:
            with open('./yolo-dataset/train/' + anno_path.split('/')[-1][:-5] + '_' + str(frame_idx) + '.txt', 'w') as up:
                for category, bbox in zip(frame_anno['category'].values, frame_anno['bbox'].values):
                    category_idx = category_labels.index(category)
                    
                    # 計算yolo標註格式
                    x_min, y_min, x_max, y_max = bbox
                    x_center = (x_min + x_max) / 2 / img_width
                    y_center = (y_min + y_max) / 2 / img_height
                    width = (x_max - x_min) / img_width
                    height = (y_max - y_min) / img_height

                    if x_center > 1:
                        print(bbox)
                    up.write(f'{category_idx} {x_center} {y_center} {width} {height}\n')
        
        frame_idx += 1

瞭解一下YOLO

這裡用到了YOLO(You Only Look Once),這是一種流行的實時目標檢測系統,YOLO模型的核心思想是將目標檢測任務視為一個單一的迴歸問題,透過一個卷積神經網路(CNN)直接從影像畫素到邊界框座標和類別機率的對映。YOLO模型經過了多次迭代,包括YOLOv2(YOLO9000)、YOLOv3和YOLOv4等版本,每個版本都在效能和速度上有所提升,同時也引入了一些新的技術,如更深的網路結構、更好的錨框機制、多尺度特徵融合等。

理解程式碼

這段程式碼是用於處理影片資料並將其轉換為YOLO格式的標註檔案的Python指令碼。YOLO需要特定的標註格式來訓練模型。以下是程式碼的主要功能和步驟:

  1. 使用zip函式將訓練集的標註檔案路徑(train_annos)和影片檔案路徑(train_videos)配對。

  2. 迭代前 5 對標註檔案和影片檔案路徑。

  3. 讀取每個標註檔案(anno_path)為Pandas DataFrame(anno_df)。

  4. 使用OpenCV(cv2)開啟影片檔案(video_path)。

  5. 初始化frame_idx為0,用於記錄當前處理的影片幀索引。

  6. 使用while迴圈讀取影片中的所有幀。如果讀取失敗(retFalse),則跳出迴圈。

  7. 獲取當前幀的高度和寬度。

  8. 將當前幀儲存為圖片檔案,檔名基於標註檔名和幀索引。

  9. 檢查當前幀是否有標註資訊(frame_anno)。

  10. 如果有標註資訊,開啟一個文字檔案用於寫入YOLO格式的標註資料。

  11. 對於每個標註,計算類別索引(category_idx)和YOLO格式的座標(x_center, y_center, width, height)。

  12. 檢查x_center是否大於1,如果是,則列印出邊界框(bbox)的值。這可能是一個錯誤檢查,以確保座標值在正確的範圍內。

  13. 將YOLO格式的標註資料寫入文字檔案。

  14. 增加frame_idx以處理下一幀。

step3:如何訓練YOLO模型

Ultraalytics 是一個提供多種計算機視覺模型的庫,包括 YOLO 系列。這段程式碼是一個簡單的訓練啟動示例

from ultralytics import YOLO

# 設定模型版本
model = YOLO("yolov8n.pt") 

# 設定資料集和訓練引數
results = model.train(data="yolo-dataset/yolo.yaml", epochs=2, imgsz=1080, batch=16)
  1. 載入模型:使用 YOLO("yolov8n.pt") 建立一個 YOLO 模型例項。這裡的 "yolov8n.pt" 是預訓練模型的檔案路徑,yolov8n 表示 YOLOv8 的一個較小的模型版本,.pt 是 PyTorch 模型檔案的副檔名。

  2. 訓練模型:透過呼叫模型例項的 train 方法來訓練模型。方法的引數如下:

  • data:指定資料集配置檔案的路徑,這裡是 "yolo-dataset/yolo.yaml"。這個 YAML 檔案應該包含了訓練和驗證資料集的路徑、類別名稱、錨框尺寸等資訊。
  • epochs:訓練的輪數,這裡設定為 2 輪。
  • imgsz:輸入影像的尺寸,這裡設定為 1080 畫素。這個尺寸應該與你的標註資料匹配。
  • batch:每個批次的影像數量,這裡設定為 16。
  1. 訓練結果train 方法將返回一個包含訓練結果的物件。這個物件可能包含訓練過程中的各種統計資訊,如損失值、精確度等。
    訓練日誌:
  • box_loss 是邊界框迴歸損失,用於評估預測的邊界框與真實邊界框之間的差異。

  • cls_loss 是分類損失,用於評估類別預測的準確性。

  • dfl_loss 是防禦性損失,用於提高模型的泛化能力。

這是baseline方案程式碼的學習,後面進階方案會繼續!

相關文章