YOLOV3实战6:显示中文标签(YOLOV3中文标签)

2023-10-27

一、番外说明

大家好,我是小P,今天在此给大家分享一下基于DarknetAB版本的YOLOV3如何生成和显示中文标签的方法,效果如下图所示,希望大家支持和喜欢。此外,对“目标检测/模型压缩/语义分割”感兴趣的小伙伴,欢迎加入QQ群 813221712 讨论交流,进群请看群公告!(可以点击如下连接直接加入!)
点击链接加入群聊【Object Detection】:https://jq.qq.com/?_wv=1027&k=5kXCXF8
在这里插入图片描述

二、资源下载

首先,本次教程所使用的模型为DarknetAB版本,其相对于官方原版作出了比较多的修改,最大的便利在于能方便地在Win10操作系统上运行,有兴趣地小伙伴可以研究研究,下载地址为:
https://github.com/AlexeyAB/darknet 在此,强烈推荐大家使用AB版本

三、详细操作

第一步:生成对应的标签图片

在此之前,先普及一点源码画标签的知识。假如,现在要往检测图片的某一位置绘制标签Person,则程序操作流程为:

首先,根据检测框的大小确定标签显示的大小(源码中为一组公式)
然后,根据标签中的字母拼接最终标签图,以Person为例讲解

在这里插入图片描述
如上图所示,源码的 darknet-master/data/labels 路径(有两个labels文件夹,Win10环境使用图中所示的labels文件夹,Ubuntu使用 darknet-master/data/labels 文件夹)下有对应大小不同的字母图片,其命名规则为:ASCII_大小 ,其中ASCII表示字母对应的ASCII值,这样处理是为了计算方便,大小是根据检测框大小计算得到的,假定现在Person标签的大小为5号,则程序会将Person标签分解为6个字母:‘P’ ‘e’ ‘r’ ‘s’ ‘o’ ‘n’ ,首先找到‘P’字母的5号图片,然后找到‘e’字母的5号图片将其拼接在’P’字母的右边…其它字母类似,如下图所示:
在这里插入图片描述

最后,将生成的标签图片覆盖到检测图片的正确位置,注意是覆盖,即像素值取代

?是不是很艰辛!明白了画标签的原理,要改就简单多了。现在,来生成中文标签所需的图片,这儿与原代码不同的是中文标签基于词语生成图片,如“行人”,则不拆分成“行”和“人”,主要是因为字母可以根据ASCII简便计算,但中文不行,当然,你也可以拆开来做,只是稍微复杂点,但这儿为了简单起见,就不拆开。生成标签的图片代码如下:

import os
import string
import pipes

font = 'futura-normal'
fileName=open("my.names",'r')
l=[label.lstrip().rstrip() for label in fileName.readlines()]

for i in range(8):
    index=0
    for word in l:
        os.system(
"convert -fill black -background white -bordercolor white -border 4  -font /usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf -pointsize %d label:\"%s\" \"%d_%s.png\"" % ((i+1)*12, word, i,index))
        index+=1

警告:本段代码只能在Ubuntu操作系统下运行,没有Ubuntu的小伙伴可以让别人替你生成好后拷贝过来
注意:你只需要将此段代码粘贴进任何一个.py文件,放到labels文件夹下面,在该文件夹下面运行即可。此外:你需要修改代码中的“my.names”为你的标签文件,运行的结果是:在labels文件夹下面生成了一系列标签图片,如下图所示(请确认你的结果正确):
在这里插入图片描述
此处:第一个数字表示大小,分为8个等级,0-7表示,第二个数字表示标签编号,和**.names文件对应。

第二步:修改部分代码
Step1 修改 src/image.c 中的部分代码

查找 get_label_v3函数的声明处,在其下面添加函数 get_label_v3_my ,采用添加不采用修改的方式主要是避免破坏源码,其它地方的修改类似,函数代码为:

image get_label_v3_my(image **characters, char *labelindex, int size)
{
    size = size / 10;
    if (size > 7) size = 7;
    image label = make_empty_image(0, 0, 0);
    int class,i=0,nlabels=1;
    int len=strlen(labelindex);
    for(i=0;i<len;i++)
    {
        if(labelindex[i]==',') ++nlabels;
    }
    for(i=0;i<nlabels;i++){
        class=atoi(labelindex);
        image l = characters[size][class];
        image n = tile_images(label, l, -size - 1 + (size + 1) / 2);
        free_image(label);
        label = n;
        labelindex=strchr(labelindex,',')+1;
    }
    image b = border_image(label, label.h*.25);
    free_image(label);
    return b;
}

添加代码过后,你的文件应该如下图所示,其中具体意义这里不进行讲解,感兴趣的小伙伴自行研究和修改
在这里插入图片描述

step2 修改对get_label_v3的调用为get_label_v3_my

找到 image.c 中的 draw_detections_v3函数。然后找到 if ( alphabet ) { … } 代码块,将其改为:

            if (alphabet) {
                char labelindex[100]= { 0 };
                char class[10]={0};
                sprintf(class,"%d",selected_detections[i].best_class);
                strcat(labelindex, class);
                int j;
                for (j = 0; j < classes; ++j) {
                    if (selected_detections[i].det.prob[j] > thresh && j != selected_detections[i].best_class) {                      
                        strcat(labelindex,", ");
                        sprintf(class,"%d",selected_detections[i].best_class);
                        strcat(labelindex, class);
                    }
                }
                image label = get_label_v3_my(alphabet, labelindex, (im.h*.03));
                draw_label(im, top + width, left, label, rgb);
                free_image(label);
            }

当然,这儿你也可以新建函数,然后改函数调用,从而避免破坏源码。此处修改是为了调用上面定义的函数

step3 在 image.c文件的 load_alphabet 函数下面添加如下函数:
image **load_labels(int classes)
{
    int i, j;
    const int nsize = 8;
    image** alphabets = (image**)calloc(nsize, sizeof(image*));
    for(j = 0; j < nsize; ++j){
        alphabets[j] = (image*)calloc(classes, sizeof(image));
        for(i = 0; i < classes; ++i){
            char buff[256];
            sprintf(buff, "data/labels/%d_%d.png", j, i);
            alphabets[j][i] = load_image_color(buff, 0, 0);
        }
    }
    return alphabets;
}

本函数的作用为将前面我们生成的标签图片加载进内存,保存在二维结构体数组中

step4 在src/image.h 的 image **load_alphabet();行下面添加下面行:
image **load_labels(int);

此行代码的作用为声明方法。

stpe5 修改 src/detector.c 中的函数调用,使之调用刚才添加的 load_labels

找到 test_detector 函数的定义,将 image **alphabet =load_alphabet(); 修改为:

image **alphabet = load_labels(names_size);
第三步:重新编译,直接回到根目录make即可

到此,教程完毕,其它诸如调节字体大小和框粗细的问题都可以在image.c函数中进行修改。本人对Darknet框架作了精细的研究,并进行了大量的注释,有感兴趣的小伙伴可以一起学习。
在这里插入图片描述

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

YOLOV3实战6:显示中文标签(YOLOV3中文标签) 的相关文章

  • 14:00面试,14:06就出来了,问的问题有点变态。。。

    从小厂出来 没想到在另一家公司又寄了 到这家公司开始上班 加班是每天必不可少的 看在钱给的比较多的份上 就不太计较了 没想到5月一纸通知 所有人不准加班 加班费不仅没有了 薪资还要降40 这下搞的饭都吃不起了 还在有个朋友内推我去了一家互联
  • eclipse环境问题-java版本不兼容

    https www cnblogs com hellowhy p 9651559 html
  • 离线地图显示连接服务器未打开,如何在uwp中使用OSM离线地图?没有可用的互联网连接时出现问题...

    在脱机映射运行良好的情况下 OSM的所有位图都来自同一台计算机上的localhost服务器 一切正常 可以看到我的所有地图 但是 如果wifi未连接到互联网 则该地图将完全停止工作 并显示黑屏 wifi关闭时 我已经测试了服务器 并且似乎在
  • 编程离软件工程有多远?

    原文地址 http kb cnblogs com page 160717 作者 周爱民 来源 VeDa原型 发布时间 2012 10 19 11 31 阅读 5135 次 原文链接 全屏阅读 收藏 语言只是工具 我曾经是非常执著的开发人员
  • vue-element-ui 中使用 el-form 报错 “TypeError: this.$refs[formName] is undefined“

    情况说明 使用了 element ui 里面
  • 【Java】 关于解决 错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException 的方法

    哭了 泪目 出现 java lang ClassNotFoundException 的原因 当Java的版本高于10的时候不需要配置CLASSPATH 环境变量 只需要配置JAVA HOME和PATH即可
  • Springboot集成logback

    一 logback的介绍 Logback是由log4j创始人设计的另一个开源日志组件 官方网站 http logback qos ch 它当前分为下面下个模块 logback core 其它两个模块的基础模块 logback classic
  • 朱自清《春》加薪版

    为什么80 的码农都做不了架构师 gt gt gt 盼望着 盼望着 文件来了 加薪的脚步近了 一切都像刚睡醒的样子 欣欣然张开了眼 物价涨起来了 房价涨起来了 职工的工资也要涨了 大家都高兴的欢呼起来了 标准悄悄地从官员口里漏出来 嫩嫩 的
  • 虚拟化技术及实时虚拟化概述

    版权声明 本文为本文为博主原创文章 未经本人同意 禁止转载 如有问题 欢迎指正 博客地址 https www cnblogs com wsg1100 文章目录 一 前言 二 分时系统 三 虚拟化介绍 四 虚拟化实现方式及分类 模拟器 Typ
  • linux下载安装jdk

    1 从官网下载jdk 如下是jdk下载地址 直接点击即可 Java Downloads Oracle 下载自己需要的jdk即可 建议下载jdk8 2 将jdk传入linux服务器 2 1 首先在linux中创建文件夹并且进入 mkdir o
  • jdbc autoReconnect=true 参数设置导致 slow log 爆表。

    1 过程 同事按照文档上配置了下面的jdbc url jdbc mysql ip port db autoReconnect true useUnicode true characterEncoding utf 8 结果导致了 mysql
  • Ansible介绍

    1 安装ansible 1 下载并安装ansible 所有节点安装依赖 yum install python y 添加源 yum y install epel release 查看可安装的版本 yum list grep ansible 下
  • 3.3 Makefile的嵌套包含

    一 Makefile包含子Makefile的示例 下面是一个示例Makefile和sub mk的内容 为了让主Makefile调用子Makefile 并分别输出一句打印 首先 主Makefile的内容如下 PHONY all all MAK
  • 4.2.5 预测分析法与预测分析表的构造

    4 2 5 预测分析法与预测分析表的构造 预测分析法也称为 LL 1 分析法 这种分析法是确定的自上而下分析的另一种方法 采用这种方法进行语法分析要求描述语言的文法是 LL 1 文法 一个预测分析器由一张预测分析表 也称为 LL 1 分析表
  • AES,SHA1,DES,RSA,MD5区别

    AES 更快 兼容设备 安全级别高 SHA1 公钥后处理回传 DES 本地数据 安全级别低 RSA 非对称加密 有公钥和私钥 MD5 防篡改 相关 公开密钥加密 英语 public key cryptography 又译为公开密钥加密 也称
  • python魔法方法

    什么是魔术方法 在Python中 所有以双下划线 包起来的方法 统称为Magic Method 魔术方法 它是一种的特殊方法 普通方法需要调用 而魔术方法不需要调用就可以自动执行 魔术方法在类或对象的某些事件出发后会自动执行 让类具有神奇的
  • Spring Cloud 服务追踪、Spring Boot Admin

    服务链路追踪 概述 这篇文章主要讲解服务追踪组件 ZipKin ZipKin 简介 ZipKin 是一个开放源代码的分布式跟踪系统 由 Twitter 公司开源 它致力于收集服务的定时数据 以解决微服务架构中的延迟问题 包括数据的收集 存储
  • vue3内对vue-router4的基本使用

    1 安装 vue router 默认安装的就是 4版本 yarn add vue router npm i vue router 2 在根路径上新建文件夹 router并在里面 新建 index js 文件 编码 import create
  • 预测时间序列(第 1 部分):经验分解模式(EMD)方法

    概述 任何交易者的成功主要取决于他或她 透视未来 的能力 即推测一段时间周期后价格如何变化的能力 为了解决这个问题 重要的是要拥有各种类的工具和功能 从基准市场特征的最新更新 到技术分析算法 运用时间序列预测的数学方法 价格本身亦或技术指标

随机推荐

  • 在 JavaScript 中监听 DOM 节点的变化

    要在 JavaScript 中监听 DOM 节点的变化 您可以使用 MutationObserver API MutationObserver 提供了一种监视对 DOM 树所做更改的能力 并在每次更改发生时触发回调函数 以下是一个示例 演示
  • R语言(创建矩阵,矩阵的运算,数据包的使用,读取文件)

    数据包使用 data 显示R语言自带的数据包 datasets library datasets 加载datasets数据包 data package mtcars 加载完成后才可以调用 调用mtcars数据包 mtcars 查看mtcar
  • 分段函数 python

    目录 题目描述 AC代码 题目描述 题目描述 有一个函数 y x x lt 1 2x 1 1 lt x lt 10 3x 11 x gt 10 写一段程序 输入x 输出y 输入 一个数x 输出 一个数y AC代码 x int input y
  • Java8 list.stream()操作使用心得

    文章目录 准备数据 1 把list中某个字段用逗号相连 2 根据某个字段分组 3 取出list中某个字段最大值的记录 4 根据某个字段倒序 5 根据某个字段求和 6 根据某个字段过滤 7 全字段去重 准备数据 实体类 Data public
  • 接入谷歌AdSense后浏览器控制台报错:Failed to load resource: the server responded with a status of 403的原因及解决办法、

    本篇文章主要讲解 接入谷歌AdSense后浏览器控制台报错 Failed to load resource the server responded with a status of 403 ads 的原因及解决办法 日期 2023年6月1
  • 掌优电子刷脸支付未来可期

    据 重庆商报 报道 近日 由广州某科技公司自主研发的两款比邻星系列红外活体相机以及核心算法 正式通过金融行业的国家级权威性检测机构 银行卡检测中心 以下简称BCTC 的严格技术检测 成为目前全国唯一过检BCTC的红外双目相机 其活体检测性能
  • 单例模式---Java实现

    单例模式涉及到一个单一的类 该类负责创建自己的对象 同时确保只有单个对象被创建 这个类提供了一种访问其唯一的对象的方式 可以直接访问 不需要实例化该类的对象 注意 1 单例类只能有一个实例 2 单例类必须自己创建自己的唯一实例 3 单例类必
  • Keil编辑和STM32cubemx配置STM32控制步进电机

    使用Keil ARM V5 IDE编程和STM32CUBEMX代码配置实现STM32F103和步进电机驱动器模块A4988控制步进电机 Keil和Stm32cubemx 安装 安装Keil IDE非常简单 下载包含Keil IDE的MDK
  • 基于UmiJs开发移动端的自适应配置方案

    在移动端开发过程中 响应式布局是必须要考虑的一个问题 基于UmiJs开发时 使用的组件库是antd mobile 通过在 umirc js中添加配置项 及可以通过对于的postCss插件postcss px to viewport解决响应式
  • 转载 十分钟理解Actor模式

    Actor模式是一种并发模型 与另一种模型共享内存完全相反 Actor模型share nothing 所有的线程 或进程 通过消息传递的方式进行合作 这些线程 或进程 称为Actor 共享内存更适合单机多核的并发编程 而且共享带来的问题很多
  • 【C++】哈希和unordered系列封装

    1 哈希 1 1 哈希概念 顺序结构以及平衡树中 元素关键码与其存储位置之间没有对应的关系 因此在查找一个元素时 必须要经过关键码的多次比较 顺序查找时间复杂度为O N 平衡树中为树的高度 即O l o g 2 N
  • XMind 各版本官网下载地址

    本博文为备份用 所有链接皆为官网地址 请勿无耻举报 本文仅为软件备份用 方便大家下载官方原装软件 以下版本皆非最新版本 仅备份未列于官网上的软件 其他软件自行去这里下载 http www xmind net download previou
  • 解决Error L6218E Undefined symbol XXX....问题

    分享一个keil的错误编译提示以及其问题解决方法 当我们碰到 Error L6218E Undefined symbol XXX 这个错误提示 其实出现这问题的原因就是我们调用了没有定义的函数 就比如你把一个函数定义注释了 然后却在程序调用
  • Arduino STM32F103C8T6(BluePill) 教程六 STM32 IO操作(LED灯蜂鸣器继电器ADC/PWM)

    Arduino STM32F103C8T6 BluePill 教程六 STM32 IO操作 LED灯蜂鸣器继电器ADC PWM 1 IO操作的 pinMode 函数 形式 void pinMode uint8 pin WiringPinMo
  • eNSP入门介绍(超级超级详细!!!)

    Ensp Enterprise Network Simulation Platform 是华为提供的一款网络仿真平台 主要用于学习 实践和测试企业网络场景 Ensp可以模拟各种网络设备 如交换机 路由器 防火墙等 创建以太网 无线网络等多种
  • COLMAP稀疏重建得图像内外参文件

    前言 一 DTU数据集 二 COLMAP操作步骤 1 安装COLMAP 2 COLMA稀疏重建 总结 前言 整个流程是 第一节用COLMAP求出DTU训练数据集内外参数 第二节处理COLMAP得到的images txt文件中外参 一 DTU
  • listview添加数据_ListView 使用详解

    和你一起终身学习 这里是程序员Android 经典好文推荐 通过阅读本文 您将收获以下知识点 一 ListView 简介二 ListView 常用属性三 ListView主要使用方法如下四 使用android entries 为ListVi
  • 用set_series_opts在PyEcharts中实现系列配置

    全局配置项可通过 set global opts 方法设置 笔记仅是个人的学习笔记总结 如有雷同请见谅 系列配置顶 用法 1 先创建数据 from pyecharts charts import Bar from pyecharts fak
  • 开启XP远程桌面的网络级身份验证(NLA)模式

    indows XP SP3下不支持网络级别身份验证 而Vista Windows 7则支持 那么 何谓网络级身份验证呢 网络级别身份验证 NLA Network Level Authentication 是一种新的身份验证方法 在你建立远程
  • YOLOV3实战6:显示中文标签(YOLOV3中文标签)

    一 番外说明 大家好 我是小P 今天在此给大家分享一下基于DarknetAB版本的YOLOV3如何生成和显示中文标签的方法 效果如下图所示 希望大家支持和喜欢 此外 对 目标检测 模型压缩 语义分割 感兴趣的小伙伴 欢迎加入QQ群 8132