yolov3 批量处理图片获得检测框坐标

2023-05-16

 

转载自:yolov3 批量处理图片获得检测框坐标_what_it_mean的博客-CSDN博客

yolov3 批量处理图片获得检测框坐标

HaLiXieDun 2021-02-24 13:59:03

799  正在上传…重新上传取消​ 收藏 10 

分类专栏: yolov3 文章标签: 神经网络

版权

​ yolov3  专栏收录该内容

2 篇文章 0 订阅

订阅专栏


前言

yolov3实现检测,需要所有检测框的坐标实现定位。

在darknet-master项目下实现检测框坐标的获取


前提

系统:Windows
语言:C
项目:darknet-master
开发环境:VS 2019
脚本执行:Git

首先,我们要熟悉几个函数,这样可以更好地理解修改代码的原理
示例:

FILE* box_coordinate = fopen(output, "a+");
fprintf(box_coordinate, "Class:%s, Box: %d %d %d %d\n", names[class], left, right, top, bot);
fclose(box_coordinate);

解析:
FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能:
fopen() 打开流
fclose() 关闭流
fprintf() 按格式输出到流

1.fopen() fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能

为使用而打开一个流 把一个文件和此流相连接 给此流
返回一个FILR指针
参数filename指向要打开的文件名,mode表示打开状态的字符串。

2.fclose() fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。

3.fprintf() 按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, …]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了。


一、找到函数

我们需要找到源码中画框的函数,这个函数中包含left, right, top, bot坐标信息,我们需要获取这些信息并写入到文本文件中。考虑到原函数有被多次调用,我们选择重构一个新的函数。进行画框的函数在darknet.sln里的image.c中,函数为draw_detections_v3。

我们真正需要修改的文件只有detector.c,image.c,image.h这三个文件。
在这里插入图片描述


二、重构函数

重构函数加入到image.c文件中,这里主要参考了文章1
因为要获取所有检测框坐标,所以对代码进行了如下修改。可以放心复制粘贴。

void draw_detections_in_txt(image im, char* filename, detection* dets, int num, float thresh, char** names, image** alphabet, int classes)
{
    int i, j;

    char* output = filename;
    //output = strcat(output, ".txt");
    //output = strcat("./", output); 
    //printf("PATH:%s", output); 
    int namecount = 0;
    for (namecount = strlen(filename) - 1; namecount >= 0; namecount--)
    {
        if ((filename[namecount] != 'j') && (filename[namecount] != 'p') && (filename[namecount] != 'g') && (filename[namecount] != '.'))
        {
            break;
        }
        else {
            output[namecount] = '\0';
        }
    }
    output = strcat(filename, ".txt");//将文件价里的.JPG文件名替换成.txt
    FILE* box_coordinate = fopen(output, "w+"); //在循环前打开流

    for (i = 0; i < num; ++i) {
        char labelstr[4096] = { 0 };
        int class = -1;
        for (j = 0; j < classes; ++j) {
            if (dets[i].prob[j] > thresh) {
                if (class < 0) {
                    strcat(labelstr, names[j]);
                    class = j;
                }
                else {
                    strcat(labelstr, ", ");
                    strcat(labelstr, names[j]);
                }
                printf("%s: %.0f%%\n", names[j], dets[i].prob[j] * 100);
            }
        }
        if (class >= 0) {
            int width = im.h * .006;

            /*
               if(0){
               width = pow(prob, 1./2.)*10+1;
               alphabet = 0;
               }
             */

             //printf("%d %s: %.0f%%\n", i, names[class], prob*100);
            int offset = class * 123457 % classes;
            float red = get_color(2, offset, classes);
            float green = get_color(1, offset, classes);
            float blue = get_color(0, offset, classes);
            float rgb[3];

            //width = prob*20+2;

            rgb[0] = red;
            rgb[1] = green;
            rgb[2] = blue;
            box b = dets[i].bbox;
            //printf("%f %f %f %f\n", b.x, b.y, b.w, b.h);

            int left = (b.x - b.w / 2.) * im.w;
            int right = (b.x + b.w / 2.) * im.w;
            int top = (b.y - b.h / 2.) * im.h;
            int bot = (b.y + b.h / 2.) * im.h;

            if (left < 0) left = 0;
            if (right > im.w - 1) right = im.w - 1;
            if (top < 0) top = 0;
            if (bot > im.h - 1) bot = im.h - 1;
            ///JiaXuejian asdded//
                //printf("%d %d %d %d\n", left, right, top, bot);
            ///

            //JiaXuejian added
            //FILE* fp;
            //if ((fp = fopen(output, "w+")) == NULL) {
            //    printf("wrong:\n");
            //}
            fprintf(box_coordinate, "Class:%s, Box: %d %d %d %d\n", names[class], left, right, top, bot);// 循环里将框坐标写入文件//"左部边框的位置:%d 顶部边框的位置:%d 右部边框的位置:%d 底部边框的位置:%d\n"
            ///

            draw_box_width(im, left, top, right, bot, width, red, green, blue);
            if (alphabet) {
                image label = get_label(alphabet, labelstr, (im.h * .03));
                draw_label(im, top + width, left, label, rgb);
                free_image(label);
            }
            if (dets[i].mask) {
                image mask = float_to_image(14, 14, 1, dets[i].mask);
                image resized_mask = resize_image(mask, b.w * im.w, b.h * im.h);
                image tmask = threshold_image(resized_mask, .5);
                embed_image(tmask, im, left, top);
                free_image(mask);
                free_image(resized_mask);
                free_image(tmask);
            }
            ///JiaXuejian added//
        // printf("%s:", label)
            printf("%d %d %d %d\n", left, right, top, bot);

        }
    }
    fclose(box_coordinate);//关闭流
}

由于是C代码,所以需要在头文件中声明一下新增的函数,darknet-master中大部分的函数声明在image.h 文件中,打开该文件,在34行可以看到 draw_detections 的函数声明,所以我们要输入以下代码:

void draw_detections_in_txt(image im, char* filename, detection* dets, int num, float thresh, char** names, image** alphabet, int classes);


三、引用

我们需要找到引用draw_detections的地方,在detector.c中1690行,将其注释,增加新的重构函数的引用。

draw_detections_in_txt(im, input, dets, nboxes, thresh, names, alphabet, l.classes);


四、创建脚本文件

这里主要参考了文章2
在任意位置创建文本文件,另存为任意格式,文件名的后缀为.sh
打开git-bash
cd到脚本文件的路径下,执行以下命令

chmod +x script.sh
./script.sh

您可以将chmod更改为所需的可执行权限。

注意:chmod只需运行一次。如果要运行脚本,请运行./script.sh。script.sh为脚本文件的名字。

#在文件中写入
#! /bin/bash
sum=0
save_path="D:/darknet-master/build/darknet/x64/results_str/" #保存的地址
for file in D:/darknet-master/build/darknet/VOCdevkit2021/VOC2021/JPEGImages/*.jpg #图片所在的地址
do
    if test -f $file
    then
        let sum += 1
        #echo $file if file
        name=${file%.*}  #去掉.jpg的后缀
        #echo $name
        txtname=$name.txt #加上.txt的后缀
        #echo $txtname
        onlyname=${name##*/} #图片的名字a.jpg
        #echo $onlyname
        savename=$save_path$onlyname #图片保存的路径和名字
        #echo $savename
        ./darknet detect -i 0 yolov3-voc.cfg results_mine/yolov3-voc_last.weights $file -out $savename  #运行检测代码
        mv $txtname $save_path 
    fi
echo sum=$sum
done


五、成功截图

在这里插入图片描述

在这里插入图片描述


参考:

文章1
文章2



补充:

坐标是按照MFC:pic控件的矩形的left、right、top、bottom 坐标位置
left,top为左上角的点坐标

right,bottom为右下角的点坐标

转换一下为opencv常用的:

x=left

y=top

width=right-left

height=bottom-top


参考:

文章3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

yolov3 批量处理图片获得检测框坐标 的相关文章

  • Giou YOLOv3 | CVPR2019,通用,更优的检测框损失函数

    这篇论文提出的GIou损失函数 xff0c 是一种目标检测领域用于回归目标框损失函数 该Trick适用于任何目标检测算法 本文以YOLOv3为例进行阐述 论文 xff1a Generalized Intersection over Unio
  • Win10上yolov3的配置及使用教程(VS2019)

    yolo论文翻译 或https zhuanlan zhihu com p 35023499 yolo官网 目录 硬件环境 安装教程 安装CUDA和cuDNN 下载darknet 修改darknet vcxproj 修改darknet sln
  • 【Darknet-53】YOLOv3 backbone Darknet-53 详解

    文章目录 1 模型计算量与参数量2 Darknet 53网络3 感谢链接 1 模型计算量与参数量 模型计算量与参数量的计算方式主要有两种 xff0c 一种是使用thop库 xff0c 一种是使用torchsummaryX 使用pip ins
  • 【darknet】【yolov3】训练踩坑

    本文已解决问题概述 xff1a 测试准确率时 xff0c 没有results 文件夹的访问权限 xff1a Segmentation fault 执行darknet 相关命令是 xff0c 无法找到 libcudart so 10 0 文件
  • 基于Darknet和Darknet-ROS在Jetson Nano部署yolov3 tiny,进行口罩佩戴检测

    单独运行yolov3 tiy进行目标检测 下载Darknet源码并编译 https gitee com bingda robot darknet git 或者上传本地的darknet源码至Jetson Nano span class tok
  • Google Colab的详细使用教程—YOLOv3为例

    一 先哔哔几句热下身 相信疫情隔离在家而且还要使用深度学习的小伙伴们或多或少都会面临么的钱买高性能显卡又么的钱租服务器的窘境 下面我就来给小伙伴们介绍以下如何使用Google Colab免费服务器的故事吧 xff08 至于怎么上Google
  • yolov3 批量处理图片获得检测框坐标

    前言 yolov3实现检测 xff0c 需要所有检测框的坐标实现定位 在darknet master项目下实现检测框坐标的获取 前提 系统 xff1a Windows 语言 xff1a C 项目 xff1a darknet master 开
  • yolov3的训练(一)下载与训练

    darknet框架简介 https blog csdn net mao hui fei article details 113820303 AlexeyAB大佬的关于darknet的详细文档信息 https github com Alexe
  • yolov3的训练(七)使用darknet_ros框架进行识别与模型导入

    同学们 xff0c 这个系列的文件不要直接就跟着我操作了 xff0c 因为这个是踩坑的记录 xff0c 不是教程 xff0c 我只是将整个流程记录下来 xff0c 让后面的同学操作的时候能够避开这些坑 xff0c 希望你能将整个系列的操作流
  • Yolov3模型没有框的解决方案之——提高训练模型的置信度

    前言 在之前的文章中我说过 xff0c 如果你的Yolov3模型没有锚框出现 xff0c 最直接的解决发方案是降低阈值 xff08 产生框的门槛 xff09 xff0c 但是这个方法治标不治本 xff08 Yolov3训练模型没有框 xff
  • 自然场景OCR检测(YOLOv3+CRNN)

    自然场景OCR检测 YOLOv3 43 CRNN xff08 中文 43 英文模型 xff09 前言 最近对于自然场景下的OCR比较有兴趣 xff0c 所以总结了一些目前OCR现状 xff0c 并且找了一个自然场景OCR的项目练练手 本人新
  • 【视觉检测C++接口实现】vs2019使用动态链接库yolo_cpp_dll调用yolov3

    目录 0 前言 1 准备工作 1 1 yolo cpp dll dll和yolo cpp dll lib的获取 1 2 pthreadGC2 dll和pthreadVC2 dll的获取 1 3 yolo v2 class hpp的获取 1
  • KERAS-YOLOV3的代码走读

    KERAS YOLOV3的代码走读 GITHUB地址 xff1a https github com qqwweee keras yolo3 YOLOV3的论文中文翻译 xff1a https zhuanlan zhihu com p 349
  • Yolov3+C+++opencv+VS2015成功检测

    nbsp 前言 nbsp nbsp nbsp 最近在用yolov3进行目标检测 也有一个多星期了 想把最近做出的一些成果记录下来 供大家参考下 我的运行环境是C opencv VS2015 yolov3 下面将简单介绍下yolo的一些思想
  • 基于YOLOv3算法的交通标志识别系统实现流程(个人学习笔记,仅当参考!!)

    总流程 安装darknet 本文利用linux操作系统上安装的Darknet开源轻型深度学习框架 为了提高训练速度利用CUDA和OPENCV 进行编译 完成对YOLO v3算法LISA数据集中四类不同的交通标志的训练及测试 实现对视频中运动
  • YOLOv3 从入门到部署(四)YOLOv3模型导出onnx(基于pytorch)

    YOLOv3 从入门到部署 四 YOLOv3模型导出onnx 基于pytorch 文章目录 YOLOv3 从入门到部署 四 YOLOv3模型导出onnx 基于pytorch 目录 概述 pytorch导出onnx采坑 转onnx代码 使用D
  • 【darknet yolo】could not open file xx.cfg

    错误图如上 原因 data文件的编码不对 用notepad 打开发现 错误的 正确的 发现错误的比正确的每行换行的时候多了一个cr 解决 ubuntu下安装dos2unix 然后转换下 dos2unix 52 data
  • YOLO v3基于ROS应用记录

    有时候 就要敢于背上超出自己预料的包袱 真的努力后 你会发现自己要比想象的优秀很多 愿在别人眼里算不上梦想的梦想 成真 言归正传 记录下之前在ROS下跑yolov3的历程吧 感觉现在视觉感知领域用yolo的比faster RCNN多很多了
  • YOLOv3计算模型的mAP

    一 先测试一下大神的数据 在这里下载 https github com Cartucho mAP 1 解压之后如下图所示 input文件夹里面放的是测试集的ground truth 模型的测试结果 和测试集 scripts文件夹里面放的是一
  • Yolox_s可视化网络结构图

    Yolox共有七种网络结构 包含2种轻量级网络 和5种标准网络 轻量级网络 1 Yolox Nano可视化网络结构图 点击查看 2 Yolox Tiniy可视化网络结构图 点击查看 标准网络 1 Yolox s可视化网络结构图 点击查看 2

随机推荐