YOLOv4訓練過程顯示loss,win10

參考:https://blog.csdn.net/dz4543/article/details/88075408https://blog.csdn.net/qq_34806812/article/details/81459982

用darknet訓練的時候會顯示一個動態loss圖,但這個圖不適合作爲論文中使用。

在win10中做loss圖,yolov4和yolov3有區別,用別的博主的針對yolov3的方法在yolov4中行不通!  用的別的博主的在linux中的方法在win10中也行不通!步驟如下:

(1)訓練的時候輸出重定向到log文件:(先新建一個visualization文件夾,然後在裏面創建一個train_yolov4.log文本文件)

yolov3:(用yolov4的忽略這個)

./darknet detector train D:/software_engineer/darknet/darknet/cfg/voc.data D:/software_engineer/darknet/darknet/cfg/yolov3.cfg 2>1 | tee visualization/train_yolov3.log

yolov4:

./darknet detector train D:/software_engineer/yolov4/darknet-master/cfg/voc.data D:/software_engineer/yolov4/darknet-master/cfg/yolov4.cfg >> visualization/train_yolov4.log 2>&1

(意思是把標準輸出1和錯誤輸出2都重定向到指定的log文件。用tee語句不知道爲什麼不行,在yolov3中可以)

(2)上步做完已經得到train_yolov4.log文件,下面會運行兩個python腳本:
第一個extract_loss.py, 是提取log文件中的有用信息:(這個不用修改)


#!/usr/bin/python

#coding=utf-8

import inspect

import os

import random

import sys

def extract_log(log_file, new_log_file, key_word):

    with open(log_file, 'r') as f:

        with open(new_log_file, 'w') as train_log:

            for line in f:

  

                if ('Syncing' in line) or ('nan' in line):

                    continue

                if key_word in line:

                    train_log.write(line)

    f.close()

    train_log.close()

 

extract_log('train_yolov4.log', 'log_loss.txt', 'images')

extract_log('train_yolov4.log', 'log_iou.txt', 'IOU')

運行完得到log_loss.txt和iou_loss.txt, 記住他們的行數。裏面可能有提取錯的行,比別的行短,這種行要自己手動刪除

第二個py文件visualization_loss.py和第三個visualization_iou.py, 一個是畫loss圖,一個是畫iou圖。(需要修改行數,把lines變量改爲行數),畫iou的程序我沒寫好。。

visualization_loss.py:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
 
lines = 6579   #總行數
start_ite = 300 #x軸起始位置
end_ite = 10000 #x軸截止位置
step = 10
igore = 0 

y_ticks = [0.5, 1.0, 1.5, 2.0, 2.5, 3.0,3.5]
data_path =  'log_loss1.txt' 
result_path = 'avg_loss' 
names = ['loss', 'avg', 'rate', 'seconds', 'images','hours']
result = pd.read_csv(data_path,  error_bad_lines=False, names=names)
result.head()

for name in names:
    result[name] = result[name].str.split(' ').str.get(1)
result.head()
result.tail()
for name in names:
    result[name] = pd.to_numeric(result[name],errors='ignore')
result.dtypes
print(result['avg'].values)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

x_num = len(result['avg'].values)
tmp = (end_ite-start_ite - igore)/(x_num*1.0)
x = []
for i in range(x_num):
	x.append(i*tmp + start_ite + igore)
print('total = %d\n' %x_num)
print('start = %d, end = %d\n' %(x[0], x[-1]))

ax.plot(x, result['avg'].values, label='avg_loss')
#ax.plot(result['loss'].values, label='loss')
#plt.yticks(y_ticks)
plt.grid()
ax.legend(loc = 'best')
ax.set_title('The loss curves')
ax.set_xlabel('batches')
fig.savefig(result_path)
#fig.savefig('loss')

 

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