參考:https://blog.csdn.net/dz4543/article/details/88075408,https://blog.csdn.net/qq_34806812/article/details/81459982
用darknet訓練的時候會顯示一個動態loss圖,但這個圖不適合作爲論文中使用。
在win10中做loss圖和iou圖,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變量改爲行數,其他不變)
visualization_loss.py:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inline
lines =500
result = pd.read_csv('log_loss.txt',error_bad_lines=False, names=['loss', 'avg', 'rate', 'seconds', 'images','hours'])
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['loss']=pd.to_numeric(result['loss'],errors='ignore')
result['avg']=pd.to_numeric(result['avg'],errors='ignore')
result['rate']=pd.to_numeric(result['rate'],errors='ignore')
result['seconds']=pd.to_numeric(result['seconds'],errors='ignore')
result['images']=pd.to_numeric(result['images'],errors='ignore')
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(result['avg'].values,label='avg_loss')
ax.legend(loc='best')
ax.set_title('The loss curves')
ax.set_xlabel('batches')
fig.savefig('avg_loss')
visualization_iou.py:(同樣,要修改lines變量)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inline
lines = 5000
result = pd.read_csv('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')