鑒於手動標記費時,故先隨機抽樣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 執行結果
計算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 執行結果
使用LabelImg標記180圖片,獲得的PascalVOC xml。
PascalVOC(xml)轉YOLO(txt)格式與分配資料集
4.1 轉換方式:參考《第25天》YOLO訓練流程與資料集YOLO txt格式,修改資料夾路徑後,執行xml_to_voc_labelpy。
4.2 執行結果
train
val
參數修改
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.1 訓練參數:batch size=1、image size=640、epochs=50
2.2 GPU占用:5.1G
訓練結果
3.1 mAP@0.5:0.0536
3.2 訓練50epochs花費:0.332小時
參數修改
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.1 訓練參數:batch size=1、image size=640、epochs=50
2.2 GPU占用:3.06G
訓練結果
3.1 mAP@0.5:0.0679
3.2 訓練50epochs花費:0.316小時
讓我們繼續看下去...