前言
本文主要记录我在使用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、变量1和2分别对应两个花括号,变量可更换为字符串。
# 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
一、检测效果
运行预测: