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

2023-05-16

前言

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 批量处理图片获得检测框坐标 的相关文章

  • 关于YOLOv3的一些细节

    原文链接 xff1a https www jianshu com p 86b8208f634f 本文是我对YOLO算法的细节理解总结 xff0c 本文的阅读前提是已读过YOLO相关论文 xff0c 文中不会谈及YOLO的发展过程 xff0c
  • 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
  • 【YOLOv3 decode】YOLOv3中解码理解decode_box

    文章目录 1 解码是什么意思2 代码解读3 生成网格中心 代码详解4 按照网格格式生成先验框的宽高 代码详解5 感谢链接 1 解码是什么意思 在利用YOLOv3网络结构提取到out0 out1 out2之后 xff0c 不同尺度下每个网格点
  • jetson nano 部署yoloV3,yoloV4,yoloV3-tiny,yoloV4-tiny

    转载自 xff1a jetson nano 部署yoloV3 yoloV4 yoloV3 tiny yoloV4 tiny dingding的专栏 CSDN博客 jetson nano 部署yoloV3 yoloV4 yoloV3 tiny
  • yolov3 批量处理图片获得检测框坐标

    转载自 xff1a yolov3 批量处理图片获得检测框坐标 what it mean的博客 CSDN博客 yolov3 批量处理图片获得检测框坐标 HaLiXieDun 2021 02 24 13 59 03 799 正在上传 重新上传取
  • 【深度学习】Yolov3详解笔记及Pytorch代码

    Yolov3详解笔记及Pytorch代码 预测部分网络结构backbone xff1a Darknet 53output预测结果的解码 训练部分计算loss所需参数pred是什么target是什么loss的计算过程 预测部分 网络结构 DB
  • 修改代码,使得 yolov3输出选中框的坐标信息

    1 修改darknet image c中的draw detections v3函数 主要修改三段代码 xff1a 第一段 xff1a 第二段 xff1a 第三段 xff1a 修改完的draw detections v3函数如下 xff1a
  • keras--yolov3源码注释

    注意box的左上角 xff08 xmin xff0c ymin xff09 和右下角坐标 xff08 xmax xff0c ymax xff09 的坐标原点是左上角 xff0c 如下图 model py span class token t
  • 使用VSCode配置Anaconda(3.7)-python3.6(yolov3)环境

    最近因为毕设需要用到目标检测的功能 xff0c 所以在完全小白的前提下学习了下YOLOv3 xff08 Windows10 43 Keras 43 VSCode 43 Tensorflow xff09 xff0c 在使用VSCode时遇到了
  • Google Colab的详细使用教程—YOLOv3为例

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

    YOLOv3 论文信息论文标题 xff1a 论文作者 xff1a 收录期刊 会议及年份 xff1a 论文学习YOLOv3 网络架构 xff1a YOLO 输出特征图解码 xff08 前向过程 xff09 xff1a 训练策略与损失函数 xf
  • ubuntu18中yolov3检测图片显示进程已杀死

    病因 xff1a 设备带不动YOLO的进程 解决方法 xff1a 此前本人ubuntu的内存设置为2g xff0c 将内存改为4g后再次检测凸显显示检测成功
  • jetson nano 部署yoloV3,yoloV4,yoloV3-tiny,yoloV4-tiny

    系统 ubuntu nbsp nbsp 自带cuda10 0 nbsp 1 下载与安装darknet git clone https github com AlexeyAB darknet cd darknet 2 以下步骤我都在直接进入c
  • 【Darknet-53】YOLOv3 backbone Darknet-53 详解

    文章目录 1 模型计算量与参数量2 Darknet 53网络3 感谢链接 1 模型计算量与参数量 模型计算量与参数量的计算方式主要有两种 xff0c 一种是使用thop库 xff0c 一种是使用torchsummaryX 使用pip ins
  • 【YOLOv3 decode】YOLOv3中解码理解decode_box

    文章目录 1 解码是什么意思2 代码解读3 生成网格中心 代码详解4 按照网格格式生成先验框的宽高 代码详解5 感谢链接 1 解码是什么意思 在利用YOLOv3网络结构提取到out0 out1 out2之后 xff0c 不同尺度下每个网格点
  • C++调用Yolov3模型实现目标检测

    C 43 43 调用Yolov3模型实现目标检测 使用开源权重文件 xff0c 此训练模型包含80种物体 文件下载地址 xff1a 预训练权重文件 xff1a https pjreddie com media files yolov3 we
  • 【jetson nano】在ubuntu18.04下,c++调用链接库实现yolov3

    目录 0 前言 1 下载安装opencv 3 4 0 1 1 配置相应的以来库 1 2 下载opencv 3 4 0 xff08 源码 xff09 1 3 编译 xff08 时间较长 xff09 1 4 安装 1 5 配置opencv路径
  • 睿智的目标检测51——Tensorflow2搭建yolo3目标检测平台

    睿智的目标检测51 Tensorflow2搭建yolo3目标检测平台 学习前言 源码下载 YoloV3实现思路 一 整体结构解析 二 网络结构解析 1 主干网络Darknet53介绍 2 构建FPN特征金字塔进行加强特征提取 3 利用Yol

随机推荐

  • 小猿助你freeRTOS驱动开发

    主要介绍在移植好的基于NXP之kinetis K64 43 freeRTOS平台上添加Modbus驱动 对freeRTOS不懂或者移植不懂的可以看看之前公众号的文章 准备工作 xff1a 1 xff0c 基于之前移植好的K64 43 fre
  • 告诉过你PID很重要,你不听

    曾经在公众号 xff0c 多次提到在控制系统中经常用到的PID控制 xff0c 也在培训中讲过PID的应用和在软件中的实现以及调试 xff0c 但是现实中还是有很多工程师对PID很陌生 xff0c 如果你是搞电力电子 xff0c 电力变换
  • Windows 使用 VNC 远程连接 Ubuntu 桌面版

    前言 工作需要使用 Windows 远程桌面版的 Ubuntu xff0c 原来使用的 TeamViewer 现在经常被检测为商业用途 xff0c 就很麻烦 因此 xff0c 现在转战使用 VNC 进行远程 使用步骤参考地址 xff1a 法
  • IP第十天笔记 - - - BGP

    BGP 边界网关协议 AS 自治系统 由单一机构或组织管理的一系列IP网络及其设备的集合 1 网络范围太大 xff0c 协议跑不过来 xff0c 需要进行划分 xff1b 2 自治管理 为了方便区分和标定不同的AS xff0c 我们给每一个
  • Makefile(1)

    1 前言 有幸拜读了http blog csdn net haoel article details 2888 http www cnblogs com Anker p 3242207 html http www groad net bbs
  • 解决vnc客户端不能拷贝粘贴

    在vnc窗口里输入如下命令 vncconfig nowin amp 在一个node的vnc里发现vncconfig nowin amp 不工作 xff0c 但是vncconfig amp 工作 https blog csdn net qq
  • shell的等号两边不能有空格

    shell的等号在赋值的时候两边不能有空格 xff0c 在比较的时候两边必须有空格
  • uCOS上下文切换,PendSV中断函数

    摘自 xff1a http www stmcu org module forum thread 384142 1 1 html 介绍一 xff1a 移植详解1和2中主要讲了移植需要用到的基础知识 xff0c 本文则对具体的移植过程进行介绍
  • Eigen稀疏线性求解

    在 Eigen 中 xff0c 当系数矩阵稀疏时 xff0c 有多种方法可用于求解线性系统 由于此类矩阵的特殊表示 xff0c 应特别注意以获得良好的性能 有关 Eigen 中稀疏矩阵的详细介绍 xff0c 请参阅稀疏矩阵操作 此页面列出了
  • Eigen关于稀疏矩阵

    处理和解决稀疏问题涉及各种模块 xff0c 总结如下 xff1a 模块 头文件 内容 SparseCore include lt Eigen SparseCore gt SparseMatrix 和 SparseVector 类 矩阵组装
  • Eigen构造稀疏矩阵

    Eigen构造稀疏矩阵 xff0c 这里我们对稀疏矩阵采用三元组的存储方式 xff0c 即用 i j value i j 这样的组合把非零元的位置和值表示出来 废话不多说 xff0c 我们直接上例子 include 34 iostream
  • cmake CMakeLists.txt 命令 add_compile_options、add_definitions、target_compile_definitions、build_command

    add compile options 增加源文件的编译选项 add compile options lt option gt 为当前路径和下层路径的目标增加编译器命令行选项 xff0c 选项在此命令被调用后添加 查看文档中关于路径和目标的
  • linux curl编译 arm交叉编译

    虚拟机环境 ubuntu12 04 开发板 EasyARM i MX280A xff1a 64m sdram 128M nandflash 运行官方提供的Linux 2 6 35 3内核linux 首先 xff0c 如果需要使用curl解析
  • c++中 双冒号作用

    1 作用域符号 的前面一般是类名称 xff0c 后面一般是该类的成员名称 xff0c C 43 43 为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 如 xff1a A B表示两个类 xff0c 在A B中都有成员member
  • 解决:CUDA安装程序不成功

    解决 xff1a CUDA安装程序不成功 报错如下分析原因解决方法 报错如下 分析原因 由于电脑里的原版本是11 2 xff0c 可能降到11 0会出现错误 xff0c 因此安装不成功 xff01 解决方法 在 Driver compone
  • linux shell awk BEGIN END 处理文本之前之后执行操作 简介

    目录 简介 1 最简单的action 既没有pattern 有没有options 2 awk是逐行处理 2 1 输出整行 2 2 输出最后一列 2 3 输出倒数第二列 3 pattern 3 1 begin 简单语法 3 2 不添加输入文件
  • ROS使用自定义的msg发送topic

    1 新建工作空间 span class token function mkdir span p catkin ws src span class token function cd span catkin ws catkin make 2
  • snorkel提取关系实验一——英文新闻里面提取配偶

    参考https github com HazyResearch snorkel 代码地址 xff1a https github com HazyResearch snorkel blob master tutorials intro Int
  • 搭建飞控开发环境:ubuntu下pixhawk开发环境搭建(PX4开发)

    搭建飞控开发环境 xff1a ubuntu下pixhawk开发环境搭建 xff08 PX4开发 xff09 关于开发环境 xff0c 可以选择Windows Linux或者Mac xff0c 若选择Linux xff0c 建议安装Ubunt
  • yolov3 批量处理图片获得检测框坐标

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