R-YOLOv4 icon indicating copy to clipboard operation
R-YOLOv4 copied to clipboard

請問我該怎麼沿著上次訓練完的麼型接續訓練模型

Open B1029038 opened this issue 1 year ago • 15 comments

由於每次在啟動train.py時都會問是否要覆蓋上一個模型,請問我該改哪裡讓他可以接著上一個訓練出的模型繼續訓練?

B1029038 avatar Jan 10 '24 07:01 B1029038

還有,我的.pth檔中為什麼只會出現last.pth,不會出現best.pth?

B1029038 avatar Jan 10 '24 09:01 B1029038

由於每次在啟動train.py時都會問是否要覆蓋上一個模型,請問我該改哪裡讓他可以接著上一個訓練出的模型繼續訓練?

目前我們的code沒有這個功能,可能要麻煩你自己implement! 如果要更改的話,建議可以更改load_model這個function

yingkunwu avatar Jan 10 '24 20:01 yingkunwu

還有,我的.pth檔中為什麼只會出現last.pth,不會出現best.pth?

由於best.pth只有在mAP值大於歷史最好的mAP值時才會存,而存第一個best.pth的條件是mAP至少大於0時才會存,所以有可能是因為你訓練出的model得到的mAP值永遠都是0,導致連第一個都沒有存。不過理論上來說應該也要存這樣子的weight的,不論model的效能有多差,這部分算是小bug已經修改好了,感謝你!

不過最主要的問題應該還是你訓練的model表現不佳,再麻煩你確認一下

yingkunwu avatar Jan 10 '24 20:01 yingkunwu

不好意思,我想請教在customdata的方面,我使用了自己的data下去跑,這次有best.pth了,但detect出來的東西依然都沒有框框,目前使用的配置都和教學中的相差無幾,但還是沒有結果,只有因為data的樣式長成以下這樣而改了UCASAOD_dataset.py data樣式: 429 938 828 439 931 521 533 1020 MED 0 dataset.py改成: import os import cv2 import numpy as np import torch import glob

from lib.general import xyxyxyxy2xywha from .base_dataset import BaseDataset

class UCASAODDataset(BaseDataset): def init(self, data_dir, class_names, hyp, augment, img_size, csl, normalized_labels=False): super().init(hyp, img_size, augment, csl, normalized_labels) self.img_files = sorted(glob.glob(os.path.join(data_dir, "*.png"))) self.label_files = [path.replace(".png", ".txt") for path in self.img_files] self.category = {} for i, name in enumerate(class_names): self.category[name.replace(" ", "-")] = i

def load_files(self, label_path):
    lines = open(label_path, 'r').readlines()

    x1, y1, x2, y2, x3, y3, x4, y4, labels = [], [], [], [], [], [], [], [], []
    for line in lines:
        line = line.split()
        x1.append(float(line[0]))
        y1.append(float(line[1]))
        x2.append(float(line[2]))
        y2.append(float(line[3]))
        x3.append(float(line[4]))
        y3.append(float(line[5]))
        x4.append(float(line[6]))
        y4.append(float(line[7]))
        labels.append(self.category[line[8]])

    if len(labels):
        x1 = torch.tensor(x1)
        y1 = torch.tensor(y1)
        x2 = torch.tensor(x2)
        y2 = torch.tensor(y2)
        x3 = torch.tensor(x3)
        y3 = torch.tensor(y3)
        x4 = torch.tensor(x4)
        y4 = torch.tensor(y4)
        labels = torch.tensor(labels)

        polys = torch.stack((x1, y1, x2, y2, x3, y3, x4, y4), -1).type(torch.float32)

    else:
        polys = torch.zeros((0, 8), dtype=torch.float32)

    return polys, labels
  

在display_input.py中的結果看起來有點不太正常,會是這裡出問題了嗎? 還有,目前在範例中的--img_size使用的是608,這個大小是怎麼判定的呢? 希望可以得到您的聯繫方式以方便詢問更多的細節,拜託了!!

B1029038 avatar Jan 22 '24 21:01 B1029038

--img_size的大小純粹是看你的需求而定,唯一的規定是必須為32的倍數,這是因為FPN的stride分別為8, 16, 32 你可以貼上你display_input.py的結果嗎?並且更詳細的描述一下你是改變了哪些地方,謝謝!

yingkunwu avatar Jan 23 '24 00:01 yingkunwu

只改了load_files中的這段,讓他符合我的input樣式:429 938 828 439 931 521 533 1020 MED 0 lines = open(label_path, 'r').readlines()

x1, y1, x2, y2, x3, y3, x4, y4, labels = [], [], [], [], [], [], [], [], []
for line in lines:
    line = line.split()
    x1.append(float(line[0]))
    y1.append(float(line[1]))
    x2.append(float(line[2]))
    y2.append(float(line[3]))
    x3.append(float(line[4]))
    y3.append(float(line[5]))
    x4.append(float(line[6]))
    y4.append(float(line[7]))
    labels.append(self.category[line[8]])

螢幕擷取畫面 2024-01-23 185020 這是display_input的結果,他每次只會顯示一張程式就會卡在那要我ctrl+z終止才會結束,照片好像都混在一起了,而且還都怪怪的,想請問是我有哪裡做錯了嗎? 整個model中我唯一有修改的部分只有這裡,剩下的都是我自己input的data,有按readme教學中的擺放方法,資料型態就跟上述提到的一樣。 螢幕擷取畫面 2024-01-23 191005 這是customdata的擺放方式class.names中只有MED這個類別。 感謝你的耐心回覆!!

B1029038 avatar Jan 23 '24 11:01 B1029038

你好 混再一起應該是因為有mosiac9 and mixup data augmentation的關係屬於正常的現象,如果要關掉的話可以去hyp.yaml 把mosaic, mixup 設成0,其他還有很多augmentation parameter也可以隨意調整

Eddie

eddie0509tw avatar Jan 23 '24 19:01 eddie0509tw

你好,謝謝你的糾正,更改後確實沒有混再一起了 image 那請問這種框框不在物品上的情況我該對哪個parameter或者function下手呢?

B1029038 avatar Jan 24 '24 05:01 B1029038

你好,謝謝你的糾正,更改後確實沒有混再一起了 image 那請問這種框框不在物品上的情況我該對哪個parameter或者function下手呢?

請問一下你做了哪些改動呢? 看起來上面原本是對的上label的

eddie0509tw avatar Jan 24 '24 19:01 eddie0509tw

我並沒有進行特別的更動,框選時是正確的,但display_input時就會產生偏移,相似的情況還有很多且佔了大多數,但還是有對的case,正確:錯誤大約3:7,但使用這樣的data,train出來的模型結果是什麼都沒有detect到 感謝你的耐心回覆!!

B1029038 avatar Jan 24 '24 19:01 B1029038

你的意思是你原圖片單純只做scale rotation translation data augmentation 有時候label準有時候不準嗎?還是你還有在原圖去做更動? 因為我剛才試了關掉mixup and mosaic並不會這樣

eddie0509tw avatar Jan 24 '24 20:01 eddie0509tw

我並沒有進行特別的更動,框選時是正確的,但display_input時就會產生偏移,相似的情況還有很多且佔了大多數,但還是有對的case,正確:錯誤大約3:7,但使用這樣的data,train出來的模型結果是什麼都沒有detect到 感謝你的耐心回覆!!

也許是圖片尺寸大小在縮放的時候不一致,請確保圖片跟label的尺度是一樣的

yingkunwu avatar Jan 25 '24 19:01 yingkunwu

我並沒有進行特別的更動,框選時是正確的,但display_input時就會產生偏移,相似的情況還有很多且佔了大多數,但還是有對的case,正確:錯誤大約3:7,但使用這樣的data,train出來的模型結果是什麼都沒有detect到 感謝你的耐心回覆!!

也許是圖片尺寸大小在縮放的時候不一致,請確保圖片跟label的尺度是一樣的

請問是要在哪確認呢?

B1029038 avatar Jan 30 '24 10:01 B1029038

你的意思是你原圖片單純只做scale rotation translation data augmentation 有時候label準有時候不準嗎?還是你還有在原圖去做更動? 因為我剛才試了關掉mixup and mosaic並不會這樣

我把所有的augmentation都設為0還是會有問題。我的data在匡時沒問題,但放入後display出來的inputs就會偏移 image 以上是display_inputs的一些結果,全部的陣列中第一和第二個都為0是正常的嗎?

B1029038 avatar Jan 30 '24 10:01 B1029038

你的意思是你原圖片單純只做scale rotation translation data augmentation 有時候label準有時候不準嗎?還是你還有在原圖去做更動? 因為我剛才試了關掉mixup and mosaic並不會這樣

我把所有的augmentation都設為0還是會有問題。我的data在匡時沒問題,但放入後display出來的inputs就會偏移 image 以上是display_inputs的一些結果,全部的陣列中第一和第二個都為0是正常的嗎?

第一列是batch_number, 第二列是object class, 取決於你的label有幾個class. 如果只有一個class那就是正常的。如果還是有bug的話,你可以試著create pull request我會盡量幫你看是哪裡出了問題。

yingkunwu avatar Feb 21 '24 19:02 yingkunwu