iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
AI & Data

Object Detection and Image Processing with Python系列 第 28

《第28天》鋼胚序號辨識:YOLOv4與Scaled YOLOv4

  • 分享至 

  • xImage
  •  

資料集抽樣與標記

  1. 鑒於手動標記費時,故先隨機抽樣300張鋼胚序號圖片。

    1.1 程式碼

    import os
    import shutil
    import random
    
    def sampling(source, num):
        # 讀取images資料夾內圖片檔名
        indexes = os.listdir(source)
        # 檔案順序隨機
        random.shuffle(indexes)
        # 創建訓練或驗證集(依比例分配)
        target_list = indexes[:num]
    
        return target_list
    
    # 移動圖片到資料夾
    def copy_sample(sample_path, target_list):
        if not os.path.exists(sample_path):
            os.makedirs(sample_path)
        # 移動圖片到資料夾
        for move_it in target_list:
            shutil.copy(move_it, move_it.replace('data_go', 'final_data'))
        print('移動圖片到資料夾 Done')
    
    if __name__ == '__main__':
        source = './data_go/'
        sample_path = '/final_data/'
    
        target_list = sampling(source, 300)
        target_list = [source+i for i in target_list]
    
        copy_sample(sample_path, target_list)
    

    1.2 執行結果

  2. 計算letter出現次數,考量樣本均衡程度,手動篩選180張作為此次資料集。

    2.1 程式碼

    import os
    
    def count_letter(classes, sentence):
        for i in classes:
            print('字母{}:出現{}次'.format(i, sentence.count(i)))
        print('※ 程式執行完畢')
    
    if __name__ == '__main__':
        source_path = './final_data/'
        images = os.listdir(source_path)
        images = [i[:-4] for i in images]
        sentence = "".join(images)
        classes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
                'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T',
                'U', 'V', 'W', 'X', 'Y', 'Z']
    
        count_letter(classes, sentence)
    

    2.2 執行結果

  3. 使用LabelImg標記180圖片,獲得的PascalVOC xml。

  1. PascalVOC(xml)轉YOLO(txt)格式與分配資料集

    4.1 轉換方式:參考《第25天》YOLO訓練流程與資料集YOLO txt格式,修改資料夾路徑後,執行xml_to_voc_labelpy。

    4.2 執行結果

    • train

    • val


YOLOv4

  1. 參數修改

    1.1 修改coco.yaml參數檔檔

    1.2 修改coco.names:0-9、A-Z(扣掉I、O),共34個類別。

    1.3 修改cfg/yolov4.cfg

    • classes:第968、1055、1142行需為34。

    • filters:(34+5)*3=117。第961、1048、1135行需為117

  2. 訓練模型

    2.1 訓練參數:batch size=1、image size=640、epochs=50

    2.2 GPU占用:5.1G

  3. 訓練結果

    3.1 mAP@0.5:0.0536

    3.2 訓練50epochs花費:0.332小時


Scaled YOLOv4

  1. 參數修改

    1.1 修改coco.yaml參數檔檔(同YOLOv4)

    1.2 修改coco.names:0-9、A-Z(扣掉I、O),共34個類別。(同YOLOv4)

    1.3 修改models/yolov4-csp.cfg

    • classes:第1029、1138、1247行需為34。

    • filters:(34+5)*3=117。第1022、1131、1240行需為117

  2. 訓練模型

    2.1 訓練參數:batch size=1、image size=640、epochs=50

    2.2 GPU占用:3.06G

  3. 訓練結果

    3.1 mAP@0.5:0.0679

    3.2 訓練50epochs花費:0.316小時


小結

  1. 下一站,我們接續「YOLOR與YOLOv7」模型訓練。

讓我們繼續看下去...


參考資料

  1. 中鋼人工智慧挑戰賽-字元辨識

上一篇
《第27天》鋼胚序號辨識:資料集前處理
下一篇
《第29天》鋼胚序號辨識:YOLOR與YOLOv7
系列文
Object Detection and Image Processing with Python30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言