既有darknet的目标检测开发说明书

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20965753/article/details/89224805

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

猜你喜欢

转载自blog.csdn.net/qq_20965753/article/details/89224805