文章目录

0. darknet介绍

1. 框架结构

2. 安装

2.1 下载

2.2 修改Makefile配置文件

2.3 编译

2.4 下载yolov3的预训练模型权重

2.5  测试是否安装成功

3. voc数据集训练,测试

3.1 准备voc数据集

3.2 将数据转换成darknet支持的格式

3.3 修改darknet/cfg下的voc.data,yolov3-voc.cfg和data/voc.names文件

3.4 下载darknet-53的预训练权重文件

3.5 开始训练

4. mAP测试

4.1 通过detector valid命令生成测试数据

4.2 使用darknet_voc_mAP测试mAP

4.3 分析compute_mAP.py文件内容

参考链接



0. darknet介绍

Darknet是一个用C和CUDA编写的开源神经网络框架。它快速,易于安装,并支持CPU和GPU计算。

链接:https://github.com/pjreddie/darknet

1. 框架结构

2. 安装

2.1 下载

git clone https://github.com/pjreddie/darknet
cd darknet

2.2 修改Makefile配置文件

GPU=1 #如果使用GPU设置为1,CPU设置为0
CUDNN=1  #如果使用CUDNN设置为1,否则为0
OPENCV=0 #如果调用摄像头,还需要设置OPENCV为1,否则为0
OPENMP=0  #如果使用OPENMP设置为1,否则为0
DEBUG=0  #如果使用DEBUG设置为1,否则为0
# 指定nvcc路径
NVCC = /usr/local/cuda-9.0/bin/nvcc

2.3 编译

make

 可能存在的错误

./darknet: error while loading shared libraries: libcudart.so.10.0: cannot

解决方案:

sudo ldconfig /usr/local/cuda-9.0/lib64

2.4 下载yolov3的预训练模型权重

mkdir weights        # 将预训练权重保存到该目录下
wget https://pjreddie.com/media/files/yolov3.weights

2.5  测试是否安装成功

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

其中参数含义如下:

1. 网络配置文件

2. 预训练模型权重

3. 测试图像

测试完成后会打印如下信息以及在根目录下生成一个prediciton.jpg文件为输出结果。

Loading weights from weights/yolov3.weights...Done!
data/dog.jpg: Predicted in 0.031283 seconds.
dog: 100%
truck: 92%
bicycle: 99%


3. voc数据集训练,测试

3.1 准备voc数据集

数据集的结构如下,我把数据集Vocdevkit目录放到了scripts文件夹下

VOC2007

Annotaitons # 标记xml文件

ImageSets/Main # 训练,测试数据集txt文件

JPEGImages # 图像文件

3.2 将数据转换成darknet支持的格式

yolov3提供了将voc数据集转为yolo训练所需要的格式脚本

python scripts/voc_label.py

经过上述脚本,在scripts文件夹下会生成几个txt文件,其中包含的是图像的路径

  • 2007_test.txt          # voc2007测试集
  • 2007_train.txt        # voc2007训练集
  • 2007_val.txt          # voc2007验证集
  • 2012_train.txt       # voc2012训练集
  • 2012_val.txt         # voc2012测试集
  • train.txt               # voc2007+voc2012的训练集
  • train.all.txt          # 所有样本集

3.3 修改darknet/cfg下的voc.data,yolov3-voc.cfg和data/voc.names文件

如下是voc.data文件的内容,根据自己实际情况修改即可

classes= 20 # 类别总数

train = /home/xxx/darknet/scripts/train.txt # 训练集样本txt文件

valid = /home/xxx/darknet/scripts/2007_test.txt # 验证集样本txt文件

names = data/voc.names # 类别名称

backup = backup # 权重保存路径

yolov3-voc.cfg的文件默认不修改,如需修改请参考其他

voc.names文件中包含的是数据集的类别,对于voc数据集的类别如下,总共20类:

aeroplane
bicycle
bird
boat
bottle
bus
car
cat
chair
cow
diningtable
dog
horse
motorbike
person
pottedplant
sheep
sofa
train
tvmonitor

3.4 下载darknet-53的预训练权重文件

wget https://pjreddie.com/media/files/darknet53.conv.74

3.5 开始训练

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gups 0,1,2,3

4. mAP测试

4.1 通过detector valid命令生成测试数据

mkdir results   # 测试结果保存路径
./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights -out "" -gpu 0 -thresh .5

其中:-thresh为IOU阈值可以根据实际情况调节

通过上面命令在results文件夹下就可以得到不同类别的测试结果文件

4.2 使用darknet_voc_mAP测试mAP

darknet_voc_mAP是我自己写的一个用于测试基于darknet训练voc格式数据集mAP的项目。项目结构如下:

上述文件夹中重点是input文件夹,里面包含了如下一些文件夹:

  • detection-results                  # 来源4.1的测试数据
  • ground-truth                         # voc的测试集xml文件
  • images-optional                   # 如果gt的bounding box的坐标存在归一化需要测试集的images
  • test.txt                                 # 测试集的文件序号

使用方法,即将4.1得到的预测数据放到detection-results路径下,voc的测试集的xml文件放到ground-truth文件夹下,将数据集中ImageSets/Main文件夹下的test.txt放到input文件夹下,然后运行如下命令,即可得到mAP.

python3 compute_mAP.py

输出结果大致如下:

aeroplane :      0.8878980127914309 
bicycle :        0.8618205446114344 
bird :   0.7480539480998687 
boat :   0.7048997455770187 
bottle :         0.6794095545317449 
bus :    0.8635922538078116 
car :    0.8899740616851775 
cat :    0.8743744101970683
chair :  0.5987828351364424
cow :    0.866211540175532
diningtable :    0.7244442845069334
dog :    0.8581894889390733
horse :  0.8902089938157063
motorbike :      0.8571526878469593
person :         0.8404120889508571
pottedplant :    0.5042149724691987
sheep :  0.8150808201092643
sofa :   0.7711258567989381
train :  0.8566713335712046
tvmonitor :      0.7672438110465113
***************************
mAP :    0.7929880622334087

4.3 分析compute_mAP.py文件内容

该代码里面提供了两个额外的功能:

# 针对coco数据集训练测试mAP
# 1. coco数据集提供的gt数据中bounding box是经过归一化的所以需要反归一化,这里需要测试集的images数据          # scripts/coco2voc.py
# 2. 就是生成xml格式的文件                                                                                                                                                 # scripts/xml_maker.py

# 在detector valid生成测试数据时,没有指定-out参数会生成comp4_det_类别.txt的文件所以需要重命名一下测试数据

from voc_eval import voc_eval
import os# 获取当前文件的路径
current_path = os.getcwd()
# 下面这块代码主要是针对coco数据集训练测试mAP
# 1. coco数据集提供的gt数据中bounding box是经过归一化的所以需要反归一化,这里需要测试集的images数据
# 2. 就是生成xml格式的文件# --------------- 处理coco格式的ground-truth文件 ------------------
# 0. ground-truth的绝对路径
gt_path = os.path.join(current_path, "input", "ground-truth")
# image文件夹绝对路径
images_path = os.path.join(current_path, "input", "images-optional")
# 1. 判断文件格式
gt_files = os.listdir(gt_path)
if gt_files[0].endswith("txt"):print("the ground truth is in coco format, need to convert to voc format!\n")# coco转voc需要保证image文件存在try:# 2. 将coco格式的gt转换成voc格式from scripts.coco2voc import convert2vocimport shutilgt_coco = os.path.join(current_path, "input", "ground-truth-coco")gt_voc = os.path.join(current_path,  "input", "ground-truth-voc")# 新建文件夹os.mkdir(gt_coco)os.mkdir(gt_voc)for file in gt_files:# 将coco的数据移动coco的文件夹中shutil.move(os.path.join(gt_path, file), os.path.join(gt_coco, file))prefix_fileName = file.split(".")[0]img_path = os.path.join(images_path, prefix_fileName+".jpg")coco_path = os.path.join(gt_coco, file)voc_path = os.path.join(gt_voc, prefix_fileName+".txt")# convertconvert2voc(img_path=img_path, txt_path=coco_path, out_path=voc_path)except Exception:print("please confirm image file !!\n")# 3. 将voc格式的gt转换成xml的表现形式from scripts.xml_maker import makermaker(img_dir=images_path, label_dir=gt_voc, out_dir=gt_path)# ----------------------------------------------------------------------
# 生成测试集文件
test_path = os.path.join(current_path, "input", "test.txt")
with open(test_path, "w", encoding="utf-8") as f:for file in os.listdir(gt_path):raw = file.strip().split(".")[0]f.write(raw + "\n")# -----------------------------------------------------------------# 预测结果绝对路径
results_path = os.path.join(current_path, "input", "detection-results")
sub_files = os.listdir(results_path)# ------------------- 处理darknet的预测文件 ----------------
# 判断是否存在字符“_”从而修改文件的命名
for idx, fileName in enumerate(sub_files):if "_" in fileName:print("change the ground-truth filename ...")replaceName = fileName.strip().split("_")[-1]# 重命名sub_files[idx] = replaceNameos.rename(os.path.join(results_path, fileName), os.path.join(results_path, replaceName))# ---------------------------------------------------------# --------------------- mAP测试 -------------------------
mAP = []
for i in range(len(sub_files)):class_name = sub_files[i].split(".txt")[0]rec, prec, ap = voc_eval('./input/detection-results/{}.txt','./input/ground-truth/{}.xml','./input/test.txt',class_name,'./input/cache')print("{} :\t {} ".format(class_name, ap))mAP.append(ap)mAP = tuple(mAP)print("***************************")
print("mAP :\t {}".format(float(sum(mAP) / len(mAP))))# ----------------------------------------------------------------

项目分享链接:链接:https://pan.baidu.com/s/1PcaPBwQz3cpLQs2I7EYEYQ 
提取码:8ych 
请记得解压input文件夹下的ground-truth压缩包,因为百度云上传有文件个数限制!!!

参考链接

  • YOLOv3 mAP计算教程

  • darknet整体框架

基于darknet的voc数据集训练和mAP测试相关推荐

  1. 基于Keras搭建cifar10数据集训练预测Pipeline

    基于Keras搭建cifar10数据集训练预测Pipeline 钢笔先生关注 0.5412019.01.17 22:52:05字数 227阅读 500 Pipeline 本次训练模型的数据直接使用Ke ...

  2. TF之pix2pix:基于TF利用Facades数据集训练pix2pix模型、测试并进行生成过程全记录

    TF之pix2pix:基于TF利用Facades数据集训练pix2pix模型.测试并进行生成过程全记录 目录 TB监控 1.SCALARS 2.IMAGES 3.GRAPHS 4.DISTRIBUTI ...

  3. MSCOCO数据集转VOC数据集训练目标检测模型

    MSCOCO数据集转VOC数据集训练目标检测模型 Images 2014 Train images [83K/13GB] 2014 Val images [41K/6GB] 2014 Test ima ...

  4. tensorflow精进之路(二十五)——Object Detection API目标检测(下)(VOC数据集训练自己的模型进行目标检测)

    1.概述 上一讲,我们使用了别人根据COCO数据集训练好的模型来做目标检测,这一讲,我们就来训练自己的模型. 2.下载数据集 为了方便学习,我们先使用别人整理好的数据集来训练---VOC 2012数据 ...

  5. 基于Darknet中的YOLO-v3训练自己的数据

    目录 1.安装darknet 2.整理数据集 3.修改配置文件 4.训练自己的数据集 5.测试训练出的网络模型 6.性能统计--计算mAP.画出PR曲线 7.先验框聚类与修改 8.YOLO-v3原理简 ...

  6. 【小白学习PyTorch教程】十、基于大型电影评论数据集训练第一个LSTM模型

    「@Author:Runsen」 本博客对原始IMDB数据集进行预处理,建立一个简单的深层神经网络模型,对给定数据进行情感分析. 数据集下载 here. 原始数据集,没有进行处理here. impor ...

  7. 开源项目|基于darknet实现量化感知训练,已实现yolov3-tiny所有算子

    ◎本文为极市开发者「ArtyZe」原创投稿,转载请注明来源. ◎极市「项目推荐」专栏,帮助开发者们推广分享自己的最新工作,欢迎大家投稿.联系极市小编(fengcall19)即可投稿~ 量化简介 在实际 ...

  8. 基于Keras搭建mnist数据集训练识别的Pipeline

    搭建模型 import tensorflow as tf from tensorflow import keras# get data (train_images, train_labels), (t ...

  9. PASCAL VOC数据集训练集、验证集、测试集的划分和提取,得到test.txt、train.txt、trainval.txt、val.txt文件代码

    训练集.验证集.测试集按比例精确划分 创建py文件,将下属代码放入所创建的文件里,VOC2007数据集与py文件在同一目录下 # 数据集划分 import os import randomroot_d ...

  10. 【DDRNet】DDRNet项目使用单GPU、自己的数据集训练、得到测试图像

    最近需要对一些细胞图像进行分割,需要比较几个模型之间的优劣,于是找到了DDRNet. DDRNet项目来源:https://github.com/chenjun2hao/DDRNet.pytorch ...

最新文章

  1. nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
  2. Windows Server 2008 配置IE使用代理
  3. AJAX, callback,promise and generator
  4. Flash 插件又被曝出新漏洞,让攻击者可以控制 Mac
  5. python标点符号全是英文吗_python 过滤中文、英文标点特殊符号
  6. 利用TCP协议进行ping
  7. 计算机网络(自顶向下方法)-网络层
  8. linux MySQL .sock_Linux 下找不到 mysql.sock 的解决方法
  9. 解决VS报表.rdl 显示乱码“小方块”问题
  10. MonthCalendar的mousedown方法选择日期
  11. 面试 | HR面可能遇到的问题
  12. 有关“夜壶冲”的由来
  13. P2P TELNET
  14. 7005-艺赛旗RPA8.0产品介绍(2019.01)
  15. 软件测试学习心得-6
  16. super extend
  17. HPUNIX环境常用查看硬件设备信息命令小结
  18. U23国足出征名单已定
  19. Mac使用技巧:如何解决键盘被锁的问题?
  20. php 当前时间转换成农历,php如何实现公、农历日期的想互转换的实例

热门文章

  1. 技术人应该如何提升影响力
  2. Devc++- 源文件未编译”
  3. 五一,我们来欣赏一篇宋词
  4. 数据分析:某地PM2.5数据分析
  5. 一个投标经理的标书检查笔记,拿来就用!
  6. :last-of-type , :last-child 无效的问题
  7. python乘法口诀表
  8. 通信笑笑点(2010.08.14)
  9. 树莓派: oled屏幕字体制作
  10. Linux安装rabbitMQ