您现在的位置是:首页 > 正文

基于darknet的目标检测开发说明书

2024-01-30 22:24:58阅读 0

1. 测试darknet

1) 利用python版本的darknet清楚YOLO V3的输出.

其中要修改一下加载meta数据集, 即*.data中的*.names文件路径. 在测试过程中, 我们将用到meta.classes, meta.names. 这些信息都在*.data中定义了. 经过测试, 对于一张头像而言, YOLO V3的输出格式为:

[('car', 0.9995980858802795, (944.3706665039062, 470.93316650390625, 332.6497802734375, 180.39739990234375)), ('car', 0.9973964691162109, (60.67174530029297, 443.29925537109375, 112.2964553
8330078, 69.57225036621094)), ('traffic light', 0.9912506341934204, (845.8016357421875, 249.35389709472656, 14.662422180175781, 32.508026123046875)), ('car', 0.9833781123161316, (154.60037231445312, 427.7644348144531, 124.64006042480469, 62.710933685302734)), ('traffic light', 0.9458598494529724, (471.6688537597656, 37.09953308105469, 35.19504165649414, 71.88548278808594)), ('traffic light', 0.9146334528923035, (178.1991424560547, 57.963218688964844, 44.318084716796875, 74.83644104003906)), ('traffic light', 0.8367633819580078, (666.54296875, 238.9544677734375, 14.19233226776123, 33.048221588134766)), ('car', 0.8113696575164795, (521.5132446289062, 419.3601989746094, 303.445556640625, 244.7392120361328)), ('traffic light', 0.765159547328949, (1141.6649169921875, 327.1693420410156, 15.563911437988281, 39.063541412353516))]

具体的输出语句为:
(meta.names[i], dets[j].prob[i], (b.x, b.y, b.w, b.h)). 其中, (x, y)是bbox的中点, w是bbox的宽, h是bbox的高.
但是图像显示上会很麻烦, 因为源码是C++写的, 只是提供了Python接口. 显示图像可以采用./darknet detect ./cfg/yolov3.cfg ./model/yolov3.weights …/test_images/20180710182329.png操作.

YOLO V3利用COCO数据集进行训练, 因此我们需要使用coco.data meta, 即再使用yolov3.weights时, 我们要注意使用的meta.

2) 计算评价指标, 判断YOLO V3的预训练好的模型性能

  1. 先计算Precession和Recall

  2. 计算IoU值
    先利用VOC2007计算一下IoU值. 目标检测的顺序和标注的顺序貌似是相反的, 但不完全是.
    详情可见darknet_cal_eval.py.

  3. 先批量跑一下数据堂图像数据, 然后将结果bbox输出到图像中. 详情可见darknet_save_res.py. 需要的数据集位于/media/anjiang/E2E4848AE48462A1/DATA/智能化测试/53万张街景标框数据下, 中文数据也是可以读出来的.
    plt在添加plt.gca().add_patch(rect)时, 每次必须清楚plt才可以!

  4. 保存模型检测结果到JSON文件. 根据coco.names, 判断是行人, 还是汽车, 还是信号灯, 还是标志牌.

  5. 使用GPU, 修改Makefile文件.
    果然是以前版本冲突的问题! 以前linux安装安装了cuda7.5和cuda8.0, 导致编译GPU版本的darknet出错! 但是darknet需要CUDA7.5!! 目前的解决方法是先安装CUDA7.5到自己的目录下, 然后编译源码时, 指定cuda的lib路径和include路径即可. 如将cuda7.5安装在./cuda-7.5下.
    修改Makefile并且结合下面使用
    export LD_LIBRARY_PATH=/home/ly/git/darknet/cuda-7.5/lib64:$LD_LIBRARY_PATH

2. 训练

利用darknet源码进行训练, 只需要修改好图像路径及相应的标注信息文件即可.

  1. get_coco_dataset.sh中的5k.txt和trainvalno5k.part是图像的路径, 一个是训练图像, 一个是验证图像.

  2. labels.tgz解压出来是图像的标注信息. 是相应图像的标注信息, 标注信息为:

    一行是一张图像中的一个目标的标注信息, 其中x, y, w, h的值得设置可以参考scripts/voc_label.py中对xmin, ymin, xmax, ymax的设置.

  3. 首先生成train.txt和val.txt, 每一行是一个图像字符串. 比例设为9:1. 代码见scripts/generate_trainval.py.

  4. 生成标注文件. 标注文件单独保存, 每一个标注文件表示一张图像的标注信息, 每一行格式为:
    . 代码见scripts/generate_labels.py.

  5. 利用scripts/generate_classes_name.py得到53万街景标注图像12万子集的所有类别, 存放在./datasets/Street_View_classes.txt下, 一共65类.

  6. 添加Street_View.data到./cfg下, 依据coco.data进行修改即可. Street_View.names即Street_View_classes.txt.

  7. 修改cfg文件, 主要修改classes等. 修改cfg/yolov3.cfg.
    batch=64
    subdivisions=8
    width=1024
    height=1024
    filters=210 # 3x(classes数目+5),和聚类数目分布有关,论文中有说明
    classes=65
    random=0 # 如果显存很小,将random设置为0,关闭多尺度训练.

  8. 另外一个人的实现是如将图像放在images文件夹下, 将标注文件放在labels文件夹下! images和labels在同一个目录下. cp -R */. *, 可以直接替换!
    在自己的实验中, 需要将所有的label文件拷贝到和图像同一个目录下! 这个根据程序的运行提示即可看见!
    另外, *.data文件不是随便创建就可以的! 拷贝其他人的吧!

  9. 训练
    多GPU训练
    ./darknet detector train ./cfg/Street_View.data ./cfg/yolov3.cfg ./model/yolov3.weights -gpus 0,1
    restart training from a checkpoint:
    ./darknet detector train ./cfg/Street_View.data ./cfg/yolov3.cfg ./backup/yolov3.backup -gpus 0,1 # 倒数第二个参数是用来初始化参数的! 0,1必须这样使用!
    测试:
    export LD_LIBRARY_PATH=/home/ly/git/darknet/cuda-7.5/lib64:$LD_LIBRARY_PATH
    ./darknet detect ./cfg/yolov3_1000.cfg ./backup/Street_View_1000/yolov3_1000_800.weights /mnt/dataresource/53万张街景标框数据_12万/data/day/cloudy/city/CD20161103_DAYTIME_CITYROAD_M_016_f012.png
    ./darknet detector test ./cfg/Street_View_12thousand.data ./cfg/yolov3_12thousand.cfg ./backup/Street_View_12thousand/yolov3_12thousand.backup -gpus 0,1 /mnt/dataresource/53万张街景标框数据_12万/data/day/cloudy/city/CD20161103_DAYTIME_CITYROAD_M_016_f012.png
    如果不输入图像路径, 可以在终端输入, 且可以连续输入:
    Enter Image Path:

  10. 一个小测试样例, 在tmp下!
    ./darknet detector train ./tmp/cfg/myv3_det.data ./tmp/cfg/my_yolov3.cfg -gpus 0,1
    训练完测试一下:
    ./darknet detect ./tmp/cfg/my_yolov3.cfg ./tmp/backup/my_yolov3.backup ./tmp/data/images/jam1_0003.jpg
    ./darknet detector test ./tmp/cfg/myv3_det.data ./tmp/cfg/my_yolov3.cfg ./tmp/backup/my_yolov3.backup ./tmp/data/images/jam1_0003.jpg

  11. YOLOV3作者模型
    ./darknet detector test ./cfg/coco.data ./cfg/yolov3.cfg ./model/yolov3.weights /mnt/dataresource/53万张街景标框数据_12万/data/day/cloudy/city/2014-09-01155050.jpg

屏幕输出:
Region 82 Avg IOU: 0.279212, Class: 0.628174, Obj: 0.012643, No Obj: 0.012784, .5R: 0.125000, .75R: 0.000000, count: 8
Region xx: cfg文件中yolo-layer的索引;
Avg IOU:当前迭代中,预测的box与标注的box的平均交并比,越大越好,期望数值为1.
Class: 标注物体的分类准确率,越大越好,期望数值为1.
obj: 越大越好,期望数值为1.
No obj: 越小越好.
.5R: 以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本.
0.75R: 以IOU=0.75为阈值时候的recall;
count:正样本数目.
267: 56.276154, 60.178181 avg, 0.000010 rate, 4.367059 seconds, 34176 images
迭代次数, loss, average loss,

3. 技巧

  1. 修改*.cfg文件, 将Testing都注释后, 结果就好很多了!! 暂时不知道是什么问题. 先这样训练!
  2. 修改detector.c源码, 修改函数train_detector(), 修改保存模型的频率. 再重新编译即可!
  3. 训练时的学习率调整修改一下看看!

4. 将模型输出结果保存为txt file, 再计算mAP. 利用python代码提取模型输出, 并保存为txt files.

  1. ctypes.ArgumentError: argument 1: <class ‘TypeError’>: wrong type
    网上有的原因说, 作者的源码是基于python2写的, 如果采用python3解释器, 会出现这个结果. 建立一个python虚拟环境:
    conda create -n py2.7 python=2.7 果然是这个问题!!
  2. 利用YOLO V3的模型和自己训练的模型分别进行预测, 将模型的输出保存为txt files, 每一个txt代表一张图像的输出. 每一行格式为:
    <class_name>
    预测txt file, 需要添加confidence. 即:
    <class_name>
    采用./datasets/val_12thousand.txt下的文件进行模型的输出评价指标计算. 代码见./python/darknet_save_to_txt.py.
  3. 建立Ground Truth文件, 即txt files, txt file的格式和predicted的格式是相同的, 每一行格式为:
    <class_name>
    采用./datasets/val_12thousand.txt下的文件进行模型的输出评价指标计算. 代码见./python/extract_json_to.py.
  4. 利用mAP项目代码计算AP, mAP, Recall, IoU等目标检测评价指标. 将源码修改一下即可, 将GT, pred, images这三个参数设置为三个可以更改的值即可!
    python main.py --ground_truth /home/ly/git/darknet/results/ground_truth --predicted /home/ly/git/darknet/results/Street_View_12thousand --images /mnt/dataresource/53万张街景标框数据_12万/data/day/cloudy/city
  5. 修改一下class name, 将写入txt file的class name修改一下, 如果class name中出现了" “, 替换为”_", 这和txt file的格式是有关的.

5. person检测和car检测

单独做person检测和car检测, 过程如下:

  1. person检测, 将所有和人相关的class name, 统一标注为person. 然后利用my_YOLOV3和YOLOV3进行预测输出. 写入txt files时, class name只有person. 先这样处理!
    python main.py --ground_truth /home/ly/git/darknet/results/car/ground_truth --predicted /home/ly/git/darknet/results/car/authors --images /mnt/dataresource/53万张街景标框数据_12万/data/day/cloudy/city

网站文章

  • paxos算法java实现_基于python的Paxos算法实现

    paxos算法java实现_基于python的Paxos算法实现

    理解一个算法最快,最深刻的做法,我觉着可能是自己手动实现,虽然项目中不用自己实现,有已经封装好的算法库,供我们调用,我觉着还是有必要自己亲自实践一下。这里首先说明一下,python这种动态语言,对不熟...

    2024-01-30 22:24:41
  • android studio 集成ffmpeg_android下vulkan与opengles纹理互通

    android studio 集成ffmpeg_android下vulkan与opengles纹理互通

    先放demo源码地址:https://github.com/xxxzhou/aoce 06_mediaplayer效果图:主要几个点:用ffmpeg打开rtmp流。使用vulkan Compute s...

    2024-01-30 22:24:11
  • Babel转码器入门

    Babel转码器入门

    Babel转码

    2024-01-30 22:24:05
  • 谈谈代码中的this

      js中我们常常会遇到this,this的具体指向问题对于很多同学来说是很懵懂的;就想lz刚开始接触时候就是一脸的懵逼,经常被一些题目转的眼花缭乱。那么今天lz就跟大家一起交流一下这个this的指向问题!  背景:不久前有个同事给我们发了一道有关this的题目,于是便有了今天的故事。如下题:class D0XX { constructor () { this...

    2024-01-30 22:23:58
  • vue3 开启 https

    vue3 开启 https

    会在当前目录生成,cert.crt 和 cert.key 两个文件。会在当前目录生成,ca.crt 和 ca.key 两个文件。

    2024-01-30 22:23:29
  • 软件工程≠计算机科学 之 思考

    软件工程≠计算机科学首先,这篇文章的英文比上次阅读作业的英文好懂多了可能是因为上次的多是讲技术的,可以归类为科技英语吧,好多的词都不认识这次更偏向于议论文吧We need software that can be put together in a reasonable amount of time, for a reasonable cost, that works som...

    2024-01-30 22:23:21
  • 用电脑开热点启用电脑无线配置

    用电脑开热点启用电脑无线配置

    电脑系统打开热点,不用安装360也能用电脑给手机开热点,给多电脑开热点无线。

    2024-01-30 22:23:16
  • 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task3特征工程

    智慧海洋建设-Task3 特征工程此部分为智慧海洋建设竞赛的特征工程模块,通过特征工程,可以最大限度地从原始数据中提取特征以供算法和模型使用。通俗而言,就是通过X,创造新的X’以获得更好的训练、预测效...

    2024-01-30 22:22:46
  • 进阶面向对象

    进阶面向对象

    对象是具体的事物,拥有所属类中描述的一切属性和行为。类是一种模型,这种模型可以创建出不同的对象实体。一个类可以有很多对象,而一个对象必然属于某个类。类用于抽象的描述一类事物所特有的属性和行为。将日常生...

    2024-01-30 22:22:39
  • 沈阳师范大学大一上册C语言PTA题目集以及答案(第六章 指针 编程题篇)

    沈阳师范大学大一上册C语言PTA题目集以及答案(第六章 指针 编程题篇)7-1 输出学生成绩 (20分)本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态...

    2024-01-30 22:22:32