from __future__ import division
import time
import torch
import torch.nn as nn
from torch.autograd import Variable
import numpy as np
import cv2
from util import *
import argparse
import os
import os.path as osp
from darknet import Darknet
import pickle as pkl
import pandas as pd
import random
def arg_parse():
"""检测模块的参数转换"""
#创建一个ArgumentParser对象,格式: 参数名, 目标参数(dest是字典的key),帮助信息,默认值,类型
parser = argparse.ArgumentParser(description='YOLO v3 检测模型')
parser.add_argument("--images", dest = 'images', help =
"待检测图像目录",
default = "imgs", type = str) # images是所有测试图片所在的文件夹
parser.add_argument("--det", dest = 'det', help = #det保存检测结果的目录
"检测结果保存目录",
default = "det", type = str)
parser.add_argument("--bs", dest = "bs", help = "Batch size,默认为 1", default = 1)
parser.add_argument("--confidence", dest = "confidence", help = "目标检测结果置信度阈值", default = 0.5)
parser.add_argument("--nms_thresh", dest = "nms_thresh", help = "NMS非极大值抑制阈值", default = 0.4)
parser.add_argument("--cfg", dest = 'cfgfile', help =
"配置文件",
default = "cfg/yolov3.cfg", type = str)
parser.add_argument("--weights", dest = 'weightsfile', help =
"模型权重",
default = "yolov3.weights", type = str)
parser.add_argument("--reso", dest = 'reso', help =
"网络输入分辨率. 分辨率越高,则准确率越高; 反之亦然.",
default = "416", type = str)#reso输入图像的分辨率,可用于在速度与准确度之间的权衡
parser.add_argument("--scales", dest="scales", help="缩放尺度用于检测", default="1,2,3", type=str)
return parser.parse_args()# 返回转换好的结果
args = arg_parse()# args是一个namespace类型的变量,即argparse.Namespace, 可以像easydict一样使用,就像一个字典,key来索引变量的值
# Namespace(bs=1, cfgfile='cfg/yolov3.cfg', confidence=0.5,det='det', images='imgs', nms_thresh=0.4, reso='416', weightsfile='yolov3.weights')
images = args.images
batch_size = int(args.bs)
confidence = float(args.confidence)
nms_thesh = float(args.nms_thresh)
start = 0
CUDA = torch.cuda.is_available()# GPU环境是否可用
num_classes = 80# coco 数据集有80类
classes = load_classes("data/coco.names") #将类别文件载入到我们的程序中,coco.names文件中保存的是所有类别的名字,load_classes()返回一个列表classes,每个元素是一个类别的名字
#初始化网络并载入权重
print("载入神经网络...")
model = Darknet(args.cfgfile)# Darknet类中初始化时得到了网络结构和网络的参数信息,保存在net_info,module_list中
model.load_weights(args.weightsfile)# 将权重文件载入,并复制给对应的网络结构model中
print("模型加载成功.")
# 网络输入数据大小
model.net_info["height"] = args.reso # model类中net_info是一个字典。’’height’’是图片的宽高,因为图片缩放到416x416,所以宽高一样大
inp_dim = int(model.net_info["height"]) #inp_dim是网络输入图片尺寸(如