Darknet框架复现Yolo v3 & coco API评估 & coco 官网提交评估
【写在前面】
本博客详述率darknet训练yolo v3的全过程并采用cocoAPI对结果进行评估。
满满干货,不容错过~
文章目录
一、前期准备
1 安装Darknet环境
1.1 下载源码
1.2 编译源码
1.3 测试是否安装成功
2 下载COCO数据集
2.1 使用官方shell脚本下载
2.2 使用一步一步命令下载
2.2.1 创建images文件夹
2.2.2 开始下载并解压
2.2.3 创建 Image Lists
3 文件夹布局
3.1 images文件夹布局
3.2 数据集部署Darknet
二、开始训练
1 确认配置路径
1.1 检查文件:cfg/coco.data
1.2 检查文件:cfg/yolo.cfg
1.2 下载darknet53预训练权重
2 开始训练
三、评估
1.1 安装COCO API
1.2 进行评估
1.2.1 修改配置文件cfg/yolo.cfg
1.2.2 运行评估代码
1.2 创建评估文件:val.py一、前期准备
1 安装Darknet环境
1.1 下载源码
git clone https://github.com/pjreddie/darknet.git
cd darknet
需要注意的地方:
【1】Compiling With CUDA: 使用 GPU,需要在Makefile文件中将GPU设置为1,如下修改:
GPU=1
【2】 Compiling With OpenCV:使用OpenCV,需要在Makefile文件中将OPENCV设置为1,如下修改:
OPENCV=1
1.2 编译源码
make
此时将会看到一系列编译信息如:
mkdir -p obj
gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast....
gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast....
gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast....
.....
gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast -lm....
!需要注意的地方:
如果报错一般是环境变量的问题,可以检查cuda、nvcc等路径。(欢迎留言交流)
1.3 测试是否安装成功
./darknet
1
此时将会看到信息如:
usage: ./darknet <function>
2 下载COCO数据集
论文使用的是COCO2014_train、COCO2014_validation。
2.1 使用官方shell脚本下载
在darknet目录下执行:bash ./scripts/get_coco_dataset.sh;就会自动下载。
但是这个数据集太大,如果中途中断或者特殊原因没有全部下载完成的盆友们请看 2.2 使用一步一步命令下载,如果顺利完成请跳过。
2.2 使用一步一步命令下载
2.2.1 创建images文件夹
mkdir images
cd images
2.2.2 开始下载并解压
# Download Images
wget -c https://pjreddie.com/media/files/train2014.zip
wget -c https://pjreddie.com/media/files/val2014.zip
# Download COCO Metadata
wget -c https://pjreddie.com/media/files/instances_train-val2014.zip
wget -c https://pjreddie.com/media/files/coco/5k.part
wget -c https://pjreddie.com/media/files/coco/trainvalno5k.part
wget -c https://pjreddie.com/media/files/coco/labels.tgz
#Unzip
unzip -q train2014.zip
unzip -q val2014.zip
tar xzf labels.tgz
unzip -q instances_train-val2014.zip
2.2.3 创建 Image Lists
在images路径下运行命令:
paste <(awk "{print \"$PWD\"}" <5k.part) 5k.part | tr -d '\t' > 5k.txt
paste <(awk "{print \"$PWD\"}" <trainvalno5k.part) trainvalno5k.part | tr -d '\t' > trainvalno5k.txt
此时会在该路径下生成两个文件:5k.txt 和 trainvalno5k.txt。
!需要注意的地方:
生成完这两个文件后请务必检查一下文件内容,每一行表示的是图片的路径。(欢迎留言交流)
3 文件夹布局
3.1 images文件夹布局
各位盆友参照如下保存路径设置存放。
在这里插入图片描述
!需要注意的地方:
【1】细心的盆友应该发现了我路径有COCO_train2014_000000167126.jpg这样子的两张图片,由于有我在训练的时候报错 “Syncing… Cannot load image xxxxxxxxxx…STB Reason: expected marker”. 这张图片损坏了(你可以下载下来打开看看的确是损坏的图片),如果有需要的可以到这里下载:https://msvocds.blob.core.windows.net/images/262993_z.jpg。对应的github的issue是:https://github.com/pjreddie/darknet/issues/312。
==============>所以,报错之前请各位忽略上图那两张“COCO_train”的图片信息。
3.2 数据集部署Darknet上一步后数据就整理好了,现在需要制作软连接或者将数据移动到该有的地方啦!!
制作软连接:
ln -s /path/images /path/darknet-master/data/coco
二、开始训练
1 确认配置路径
1.1 检查文件:cfg/coco.data
在这里插入图片描述
需要检查 train和valid的路径。
1.2 检查文件:cfg/yolo.cfg在这里插入图片描述
红框上面的配置是测试时候用的,确认已经注释。
1.2 下载darknet53预训练权重
wget https://pjreddie.com/darknet/imagenet/#darknet53
2 开始训练
【1】 创建**_log**文件夹用来保存日志文件
【2】运行命令:
./darknet detector train cfg/coco.data cfg/yolov3.cfg model/darknet53.conv.74 -gpus 0,1,2,3 2>&1 | tee _log/train_yolov3_201910242151.log
可选参数:-clear 1(默认0)进行ft时不考虑模型原本的迭代次数。
在这里插入图片描述
一大堆日志,这里就不说明了,有不清楚的也欢迎各位留言交流。
训练结束后:
在这里插入图片描述
82,94,106为一组,一共有16(subdivision)组,每组又包含了4(batch/subdivision)张图片;
Region Avg IOU: 表示在当前subdivision内的图片的平均IOU,代表预测的矩形框和真实目标的交集与并集之比;
Class: 标注物体分类的正确率,期望该值趋近于1;
Obj: 越接近1越好,与No Obj相对;
count:所有的当前subdivision图片中包含正样本的图片的数量;
1:第1个batch;
578.041992:总损失;
578.041992 avg:平均损失;
0.000000 rate:当前学习率;
1.394934 seconds:当前batch训练所花的时间;
256 images:目前为止参与训练的图片总数;
在这里插入图片描述
三、评估
1.1 安装COCO API
git clone https://github.com/cocodataset/cocoapi.git
cd coco/PythonAPI
make
!需要注意的地方:
添加环境变量:
export PYTHONPATH=/home/tencent/Documents/cocoapi/PythonAPI:$PYTHONPATH
测试一下:
在这里插入图片描述
1.2 进行评估
1.2.1 修改配置文件cfg/yolo.cfg
在这里插入图片描述
这个Testing的配置要是未注释的,下面的Training的配置注释一下哈。
1.2.2 运行评估代码【0】运行需要检查一下该目录下是否有results文件夹,如果没有需要创建一下。
测试集一共有20288张图片,在官网下载的测试集包含了test-dev和test- challenge两部分,根据官网下载页面的Testing Image info 文件进行选择。
./darknet detector valid cfg/coco.data cfg/yolov3.cfg backup/yolov3_final.weights
运行之后,在results文件夹会生成coco_results.json文件。
可选参数:-out a/b(结果默认保存在results文件夹里coco_results.json)此例修改为结果保存在a文件夹里b.json。
提交官网在线测试
test-dev 2015 – 至今的测试集均一致,只是官网每年更新入口,如今年的是2019-test。
将json文件重新命名,命名规则为:[type][testset][alg]_results.json
[type]challenge type: "detections", "person_keypoints", or "stuff"
[testset]test split: "val2017", "test-dev2017", or "test-challenge2017"
[alg]your algorithm name
直接将结果json文件压缩为zip文件,提交官网测试即可。
以下为本地采用coco api对val数据集进行评估:
1.2 创建评估文件:val.py
import matplotlib.pyplot as plt
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
import numpy as np
import skimage.io as io
import pylab,json
pylab.rcParams['figure.figsize'] = (10.0, 8.0)
def get_img_id(file_name):
ls = []
myset = []
annos = json.load(open(file_name, 'r'))
for anno in annos:
ls.append(anno['image_id'])
myset = {}.fromkeys(ls).keys()
return myset
if __name__ == '__main__':
annType = ['segm', 'bbox', 'keypoints']#set iouType to 'segm', 'bbox' or 'keypoints'
annType = annType[1] # specify type here
cocoGt_file = '/home/tentcent/Documents/valuation_yolo/json/instances_val2014.json'
cocoGt = COCO(cocoGt_file)#取得标注集中coco json对象
#cocoDt_file = '/home/tentcent/Documents/valuation_yolo/json/coco_results_origin.json'
#cocoDt_file = '/home/tentcent/Documents/valuation_yolo/json/coco_results_ourtrain.json'
cocoDt_file = '/home/tentcent/Documents/valuation_yolo/json/coco_results_pretrain.json'
print("Valuation: {}".format(cocoDt_file.split('/')[-1]))
imgIds = get_img_id(cocoDt_file)
print(len(imgIds))
cocoDt = cocoGt.loadRes(cocoDt_file)#取得结果集中image json对象
imgIds = sorted(imgIds)#按顺序排列coco标注集image_id
imgIds = imgIds[0:5000]#标注集中的image数据
cocoEval = COCOeval(cocoGt, cocoDt, annType)
cocoEval.params.imgIds = imgIds#参数设置
cocoEval.evaluate()#评价
cocoEval.accumulate()#积累
cocoEval.summarize()#总结
!需要注意的地方:
【1】 cocoGt_file 和 cocoDt_file 两个变量需要自行修改一下哈。
【2】 cocoGt_file:instances_val2014.json文件路径(之前下载coco数据集的时候就有,不清楚可以回去看看); cocoDt_file :上一步评估操作生成的coco_results.json文件路径。
代码运行结果:
原文链接:https://blog.csdn.net/zw__chen/article/details/102808144