參考:https://blog.csdn.net/dz4543/article/details/88075408,https://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')