使用ImageDraw.Draw.text()函数在YOLOv4检测图片中添加检测物体的数量

文章目录

  • 前言
  • 一、介绍
    • 1、修改问题
    • 2、涉及的函数
      • 1、ImageDraw.Draw.text()函数
      • 2、Python format 函数
    • 二、修改
  • 一、检测效果


前言

本文主要记录我在使用YOLOv4检测图片时,想在图片中添加检测物体的数量显示。
本文使用别其他博主YOLOv4的代码:github链接


一、介绍

1、修改问题

代码中原作者已经介绍很详细,是仅对图片预测时
其中代码介绍如下(复制过来的):

    if mode == "predict":
        '''
        1、如果想要进行检测完的图片的保存,利用r_image.save("img.jpg")即可保存,直接在predict.py里进行修改即可。 
        2、如果想要获得预测框的坐标,可以进入yolo.detect_image函数,在绘图部分读取top,left,bottom,right这四个值。
        3、如果想要利用预测框截取下目标,可以进入yolo.detect_image函数,在绘图部分利用获取到的top,left,bottom,right这四个值
        在原图上利用矩阵的方式进行截取。
        4、如果想要在预测图上写额外的字,比如检测到的特定目标的数量,可以进入yolo.detect_image函数,在绘图部分对predicted_class进行判断,
        比如判断if predicted_class == 'car': 即可判断当前目标是否为车,然后记录数量即可。利用draw.text即可写字。
        '''

2、涉及的函数

1、ImageDraw.Draw.text()函数

Draw.text()函数介绍:
ImageDraw.Draw.text(xy, text, fill=None, font=None, anchor=None, spacing=0, align=”left”)
参数:
xy-文字的位置。
text-要绘制的文本。如果包含任何换行符,则文本将传递到multiline_text()
fill-用于文本的颜色。
font-一个ImageFont实例。
spacing-如果文本传递到multiline_text(),则行之间的像素数。
align-如果文本已传递到multiline_text(),“left”,“center”或“right”

案例: 
draw = ImageDraw.Draw(image)  
font = ImageFont.truetype(r'C:\Users\System-Pc\Desktop\arial.ttf', 20)  
text = '文本'
draw.text((50, 50), text, fill,font = font)  

2、Python format 函数

format函数常用以下这个形式:
('{}  {} '.format(变量1,变量2))  
# 1、变量12分别对应两个花括号,变量可更换为字符串。
# 2、format前面的花括号前后均可添加文字、转换符。
# 3、花括号里面可以添加:来填充长度,如数字可以使用:.2f,即保留两位小数。

二、修改

在图像绘制的for循环中添加,添加在第一个if语句之后,添加位置处的代码如下:

            if top - label_size[1] >= 0:
                text_origin = np.array([left, top - label_size[1]])
            else:
                text_origin = np.array([left, top + 1])

            if predicted_class == 'strain clamp':
                print('strain clamp num:',num)
            text='图片中的{} 数量为:{}'.format(predicted_class, +num)
            draw.text((100, 100), text ,(255, 0, 0), font=font)

            for i in range(thickness):
                draw.rectangle([left + i, top + i, right - i, bottom - i], outline=self.colors[c])
            draw.rectangle([tuple(text_origin), tuple(text_origin + label_size)], fill=self.colors[c])
            draw.text(text_origin, str(label,'UTF-8'), fill=(0, 0, 0), font=font)
            del draw

一、检测效果

运行预测:

你可能感兴趣的:(pytorch,深度学习,python,人工智能,目标检测)