YOLOv5图像识别显示中文标签

采用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 img
    tl = line_thickness or round(0.002 * (img.shape[0] + img.shape[1]) / 2) + 1  # line/font thickness
    color = 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 thickness
        t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]
        c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3
        cv2.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 file
        xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywh
        with open(save_path[:save_path.rfind('.')] + '.txt', 'a') as file:
            file.write(('%g ' * 5 + '\n') % (cls, *xywh))  # label format

    if 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)

识别的结果如图所示,到底为止,就可以正确的显示中文标签啦!
在这里插入图片描述

  • 27
    点赞
  • 169
    收藏
    觉得还不错? 一键收藏
  • 41
    评论
yolov5是一种用于图像识别的模型。它有四种不同的预训练模型,分别是yolov5s、yolov5m、yolov5l和yolov5x。这些模型在效果和精度上有所不同。你可以根据自己的需求选择合适的模型进行训练。在进行图像检测时,你可以使用已经下载好的模型进行识别。例如,如果你选择了yolov5x模型,你可以使用--weights yolov5x.pt来进行图像识别。推荐使用yolov5s模型,除非你对准确度有非常高的要求,否则训练它需要花费很长时间和足够的硬件支持。你可以参考\[2\]和\[3\]中的链接获取更多关于yolov5模型训练和图像识别的信息。 #### 引用[.reference_title] - *1* [基于yolov5图像识别](https://blog.csdn.net/LateNight_LL/article/details/125615068)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [手把手教会你使用机器学习拥有YOLOV5自己的图像识别](https://blog.csdn.net/qq_42368762/article/details/122690675)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [使用yolov5实现图像识别](https://blog.csdn.net/qq_41974199/article/details/130975885)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值