采用YOLOv5进行图像识别时,通常识别结果中的标签都是英文显示的,如下图所示:
当然,无论是YOLO还是opencv,都是老外开发的,开发的过程中肯定不会考虑中文显示了,所以一直以来,在opencv-python中显示中文都有一些麻烦。那如何才能在YOLOv5图像识别中让标签变为中文呢?这里提供了一种修改YOLOv5源码方法可以参考。

YOLOv5的使用在这里就不再阐述了,我们直接在YOLOv5程序中utils/utils.py(新版的是utils/general.py)文件下找到这一行代码:

def plot_one_box(x, img, color=None, label=None, line_thickness=None):

这个函数主要是将我们识别出的目标在图片上框出来并标记上文字标签。opencv-python不能直接显示中文信息,因此我们需要进行以下3个步骤

  1. 将opencv图片格式转换成PIL的图片格式;
  2. 使用PIL绘制文字;
  3. PIL图片格式转换成oepncv的图片格式;

将这个函数稍微修改,如下所示:

def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=30):# 图像从OpenCV格式转换成PIL格式if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img)fontText = ImageFont.truetype("../Font/simhei.ttf", textSize, encoding="utf-8")draw.text((left, top), text, textColor, font=fontText)return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)def plot_one_box(x, img, color=None, label=None, ch_text=None, line_thickness=None):# Plots one bounding box on image imgtl = line_thickness or round(0.002 * (img.shape[0] + img.shape[1]) / 2) + 1  # line/font thicknesscolor = color or [random.randint(0, 255) for _ in range(3)]c1, c2 = (int(x[0]), int(x[1])), (int(x[2]), int(x[3]))cv2.rectangle(img, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)if label:tf = max(tl - 1, 1)  # font thicknesst_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3cv2.rectangle(img, c1, c2, color, -1, cv2.LINE_AA)  # filled# cv2.putText(img, label, (c1[0], c1[1] - 2), 0, tl / 3, [225, 255, 255], thickness=tf, lineType=cv2.LINE_AA)img_text = cv2ImgAddText(img, ch_text, c1[0], c2[1], (255, 255, 255), 25)  # todo: 文字以左上点坐标为准,即:c1[0], c2[1]return img_text

此时,底层代码部分我们已经修改好了,但是到这里还没有结束,我们还需修改detect.py中的代码。找到如下位置:

# Write results
for *xyxy, conf, cls in det:

对此处代码进行修改,将识别出的标签用中文显示出来,我这里的标签一共有4类,分别为trash,sewage_well_cover,road_cracks,pavement_pit,对应的中文信息依次为垃圾桶完好,污水井盖完好,道路裂缝,路面坑槽。现在将英文标签用中文显示出来。

# Write results
for *xyxy, conf, cls in det:if save_txt:  # Write to filexywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywhwith open(save_path[:save_path.rfind('.')] + '.txt', 'a') as file:file.write(('%g ' * 5 + '\n') % (cls, *xywh))  # label formatif save_img or view_img:  # Add bbox to image# ch_text = '%s,长:200cm,面积:2.3m2,%.2f' % ('物体', conf)# print(names[int(cls)])# 根据像素确定长宽和对角线像素长度c1, c2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3]))weight = abs(c2[1]-c1[1])length = abs(c2[0]-c1[0])diagonal = round(((c2[0]-c1[0])**2 + (c2[1]-c1[1])**2)**0.5, 2)areas = round(abs(c2[1]-c1[1]) * abs(c2[0]-c1[0]), 2)label = '%s %.2f x=%.2f,y=%.2f' % (names[int(cls)], conf, int(xyxy[0]), int(xyxy[1]))  # 可以不用# 设置固定颜色color_dict = {'1': [220,20,60], '2': [75,195,185], '3': [255,165,0], '4': [60,20,220]}# 中文输出if names[int(cls)] == 'trash':ch_text = '%s,%.2f' % ('垃圾桶完好', conf)color_single = color_dict['1']elif names[int(cls)] == 'sewage_well_cover':ch_text = '%s,%.2f' % ('污水井盖完好', conf)color_single = color_dict['2']elif names[int(cls)] == 'road_cracks':ch_text = '%s,裂缝长度:%s,%.2f' % ('道路裂缝', diagonal, conf)color_single = color_dict['3']elif names[int(cls)] == 'pavement_pit':ch_text = '%s,坑槽面积:%s,%.2f' % ('路面坑槽', areas, conf)color_single = color_dict['4']# im0 = plot_one_box(xyxy, im0, label=label, ch_text=ch_text, color=colors[int(cls)], line_thickness=3)im0 = plot_one_box(xyxy, im0, label=label, ch_text=ch_text, color=color_single, line_thickness=3)

识别的结果如图所示,到底为止,就可以正确的显示中文标签啦!

YOLOv5图像识别显示中文标签相关推荐

  1. yolov5检测框显示中文标签

    目录 前言 1.有中文标签的数据集 2.yolov5代码修改为支持中文标签 前言 很多人在训练yolov5目标检测的时候,标签只能显示英文的.怎么样才可以训练一个可以检测物体并且显示中文标签的模型呢. ...

  2. pandas 做图显示中文标签

    pandas 做图显示中文标签 对于数据集,直接做图时, #coding:utf-8 from pandas import DataFrame df = DataFrame({"score& ...

  3. YOLOv3 物体识别显示中文标签

    问题 最近在做yolov3识别物体,想着把coco.name修改为中文,从而实现显示中文标签,结果发现,emmmm,显示出来是????????就是下面这个鬼样子 之前的代码是这样子的: import ...

  4. plt正常显示中文标签

    plt正常显示中文标签 import matplotlib.pyplot as plt 加入下面两句话 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常 ...

  5. yolov5显示中文标签

    本文章的方法采用的是在检测时识别完成之后替换标签渲染打印到图片的方法. 首先下载支持中文的字体,我采用的是simhei字体,链接如下,是自己使用的字体打包上传,亲测可用. 字体链接 将字体下载后放在v ...

  6. 【Pyecharts50例】Calendar/日历图显示中文标签/月份显示中文/星期显示中文/name_map

    前言 在日历中日期标签默认显示的都是英文,如下 通过如下代码可将标签设置为英文: # 星期显示中文 daylabel_opts=opts.CalendarDayLabelOpts(name_map=' ...

  7. Yolov5图像识别教程

    参考教程: https://blog.csdn.net/qq_45701791/article/details/113992622 https://zhuanlan.zhihu.com/p/50179 ...

  8. 解决YOLOv5算法中的中文标签显示问题

    在前面的文章中已经详细介绍了在本机上安装YOLOv5的教程,安装YOLOv5可参考前面的文章 YOLOv5训练自己的数据集(超详细) 本人使用的是YOLOv5-5.0版本 一. 训练YOLOv5时ma ...

  9. VGG-16图像识别

    VGG net VGG net是 Karen simonyan 等人在2015年的CLR会议中公开的神经网络模型.这个模型在2014年的Imagenet比赛中获得了定位第一名和分类第二名的好成绩,它的 ...

  10. [Python从零到壹] 六十一.图像识别及经典案例篇之基于纹理背景和聚类算法的图像分割

    祝大家新年快乐,阖家幸福,健康快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所 ...

最新文章

  1. 通过一个实际案例,彻底搞懂 HashMap!
  2. 银行现在都很缺钱吗,为什么给的利息比以前高了?
  3. iphone的生命周期
  4. bind1st bind2nd的使用
  5. RocketMQ实战(一)
  6. 数据中心网络架构的问题与演进 — 传统路由交换技术与三层网络架构
  7. char varchar nchar nvarchar 四者的区别是什么(为何SQL Server自动给字符串末尾加空格)...
  8. java扫描所有用户信息_监听器实现案例----自定义session扫描器和统计在线用户人数及用户信息...
  9. Win7中的clr_optimization服务
  10. xp系统启动sql服务器,XP系统,sqlserver服务启动了又自己停止,服务管理器点了启动随后马上就已停止!...
  11. MYSQL 的配置文件
  12. Ubuntu 16.04安装Matlab R2016b
  13. linux电子数码相册实验报告,Linux实验报告.doc
  14. YOLOv5/v7 引入 RepVGG 重参数化模块
  15. 利用selenium与etree抓取必应图片
  16. windows script host是什么意思,windows based script host
  17. MUR10060CT-ASEMI快恢复模块MUR10060CT
  18. 【云原生】Prometheus+Grafana on K8s 环境部署
  19. 小熊个人资料_小熊了个人资料照片 WT-没有小熊了原名叫什么
  20. 2021百度之星初赛二(1001 -- 1003)

热门文章

  1. JanusGraph基础知识
  2. NPDP国际产品经理认证是什么?看完你就懂了
  3. 用计算机用图解法求理论塔板数,简洁法计算理论板数工具
  4. 200plc与施耐德ATV610变频器modbus通讯
  5. 智能家居中控屏(二):产品设计
  6. Android HPSocket SE_SOCKET_CREATE (3)
  7. ansys2017安装教程_abaqus2017安装教程 - 仿真模拟 - 小木虫 - 学术 科研 互动社区
  8. 常见的USB接口类型
  9. DWG转PDF在线转换怎么转?这个方法线上线下都能用
  10. 开源微信小程序源码新版及教程