yolo訓練自己的模型

 

一、將標註好的圖片生成可識別的格式:
    1.創建文件夾,結構按照voc的結構
    2.將原始照片放在JPEGImages裏面,將xml文件放在Annotations裏面。
    3.運行create_list.py將圖片分成test,val,train三個部分,同時在ImageSets的Main裏面生產對應的三個.txt文件。
    4.運行my_voc_label.py生產圖片對應的labels的信息
    5.運行:cat 2017_train.txt 2017_val.txt > train.txt這個命令,將train,val合併到一個文件夾。
二、修改配置配置文件
    1.voc.data文件的修改
         1 classes= 20  (修改成對應的類的個數)
         2 train  = <path-to-voc>/train.txt  (訓練文件的絕對路徑)
         3 valid  = <path-to-voc>2007_test.txt (測試文件的絕對路徑)
         4 names = data/voc.names   (對應的類名稱的文件)
         5 backup = backup  (訓練備份的文件夾)
    2.voc.names
        將類的名稱按行寫在文件中
    3.yolo-voc.cfg
        修改batch、subdivisions、learning_rate、max_batches等參數
        在文件的最後修改[convolutional]裏面的filters需要修改(修改最後一層卷積層核參數個數,
            計算公式是依舊自己數據的類別數filter=num×(classes + coords + 1)=5×(1+4+1)=30)
        classes改成對應的個數


運行結果可視化
    1.先運行extract_log.py,將保存的日誌文件進行處理,對應生成loss和iou的文件
    2.運行對應的train_iou_visualization.py或者train_loss_visualization.py文件,生成iou和loss的圖表。
# coding=utf-8
# 該文件用來提取訓練log,去除不可解析的log後使log文件格式化,生成新的log文件供可視化工具繪圖
def extract_log(log_file,new_log_file,key_word):
    f = open(log_file)
    train_log = open(new_log_file, 'w')
    for line in f:
    # 去除多gpu的同步log
        if 'Syncing' in line:
            continue
    # 去除除零錯誤的log
        if 'nan' in line:
            continue
        if key_word in line:
            train_log.write(line)

    f.close()
    train_log.close()

extract_log('/home/darknet/log/yolo-voc.txt','person_train_log_loss.txt','images')   #voc_train_log.txt 用於繪製loss曲線
extract_log('/home/darknet/log/yolo-voc.txt','person_train_log_iou.txt','IOU')

 

train_iou_visualization.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inline

lines =143785
result = pd.read_csv('person_train_log_iou.txt', skiprows=[x for x in range(lines) if (x%10==0 or x%10==9) ] ,error_bad_lines=False, names=['Region Avg IOU', 'Class', 'Obj', 'No Obj', 'Avg Recall','count'])
result.head()

result['Region Avg IOU']=result['Region Avg IOU'].str.split(': ').str.get(1)
result['Class']=result['Class'].str.split(': ').str.get(1)
result['Obj']=result['Obj'].str.split(': ').str.get(1)
result['No Obj']=result['No Obj'].str.split(': ').str.get(1)
result['Avg Recall']=result['Avg Recall'].str.split(': ').str.get(1)
result['count']=result['count'].str.split(': ').str.get(1)
result.head()
result.tail()

#print(result.head())
# print(result.tail())
# print(result.dtypes)
print(result['Region Avg IOU'])

result['Region Avg IOU']=pd.to_numeric(result['Region Avg IOU'])
result['Class']=pd.to_numeric(result['Class'])
result['Obj']=pd.to_numeric(result['Obj'])
result['No Obj']=pd.to_numeric(result['No Obj'])
result['Avg Recall']=pd.to_numeric(result['Avg Recall'])
result['count']=pd.to_numeric(result['count'])
result.dtypes

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(result['Region Avg IOU'].values,label='Region Avg IOU')
#ax.plot(result['Class'].values,label='Class')
#ax.plot(result['Obj'].values,label='Obj')
#ax.plot(result['No Obj'].values,label='No Obj')
#ax.plot(result['Avg Recall'].values,label='Avg Recall')
#ax.plot(result['count'].values,label='count')
ax.legend(loc='best')
#ax.set_title('The Region Avg IOU curves')
ax.set_title('The Region Avg IOU curves')
ax.set_xlabel('batches')
#fig.savefig('Avg IOU')
fig.savefig('Region Avg IOU')

 train_loss_visualization

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inline

lines =11744
# result = pd.read_csv('person_train_log_loss.txt', skiprows=[x for x in range(lines) if ((x%10!=9) |(x<1000))] ,error_bad_lines=False, names=['loss', 'avg', 'rate', 'seconds', 'images'])
result = pd.read_csv('person_train_log_loss.txt',error_bad_lines=False, names=['loss', 'avg', 'rate', 'seconds', 'images'])

result.head()

result['loss']=result['loss'].str.split(' ').str.get(1)
result['avg']=result['avg'].str.split(' ').str.get(1)
result['rate']=result['rate'].str.split(' ').str.get(1)
result['seconds']=result['seconds'].str.split(' ').str.get(1)
result['images']=result['images'].str.split(' ').str.get(1)
result.head()
result.tail()

#print(result.head())
# print(result.tail())
# print(result.dtypes)

print('[1]',result['loss'].values.shape)
print('[2]',result['avg'].values.shape)
print('[3]',result['rate'].values.shape)
print('[4]',result['seconds'].values.shape)
print('[5]',result['images'].values.shape)

result['loss']=pd.to_numeric(result['loss'])
result['avg']=pd.to_numeric(result['avg'])
result['rate']=pd.to_numeric(result['rate'])
result['seconds']=pd.to_numeric(result['seconds'])
result['images']=pd.to_numeric(result['images'])
result.dtypes



fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(result['avg'].values,label='avg_loss')
#ax.plot(result['loss'].values,label='loss')
ax.legend(loc='best')
ax.set_title('The loss curves')
ax.set_xlabel('batches')
fig.savefig('avg_loss')
#fig.savefig('loss')

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章