YOLOv4訓練過程顯示loss和iou圖,win10

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

 

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