Yolo3物体定位输出结果可视化

yolo是非常强大的模型,在物体定位领域应用非常普遍。今天我们不聊yolo的原理和网络结构,我们聊聊对yolo输出结果进行可视化。

yolo在对图片进行分析后,会输出r, r是一个list,大致如下

[('印章', 0.9983074069023132, (912.6295776367188, 395.174072265625, 213.7032928466797, 206.85720825195312)), ('国徽', 0.9921208024024963, (297.0399475097656, 1426.3948974609375, 222.11207580566406, 225.3359832763672)), ('印章', 0.9893943667411804, (740.3536376953125, 1396.102783203125, 212.9912109375, 202.95053100585938))]

可以看出来,在r里面,每个元素对应的应该是一个框。

r[0]=('狗', 0.9983074069023132, (912.6295776367188, 395.174072265625, 213.7032928466797, 206.85720825195312))

其中:

  • 第1个元素是yolo预测的类别
  • 第1个元素是yolo预测类别的分值
  • 第3个元素是yolo预测类别对应的坐标

第3个元素中,4个元素为(x1, y1, w, h),其中(x1, y1)对应的是预测目标框的几何中心坐标, (w, h)对应的是预测目标框的宽度与高度。

搞清楚了这些,我们就来对yolo输出的结果r进行可视化吧。废话不多说,直接贴代码。

def picResultVisualization(imageName, r):
img = cv2.imread(imageName) out_img = os.path.join(outImagePath, os.path.split(imageName)[-1]) cv2.imwrite(out_img, img) img_OpenCV = cv2.imread(out_img) for i in range(len(r)): x1=r[i][2][0]-r[i][2][2]/2 y1=r[i][2][1]-r[i][2][3]/2 x2=r[i][2][0]+r[i][2][2]/2 y2=r[i][2][1]+r[i][2][3]/2 label = r[i][0] seore = r[i][1] # 画框 if label == '印章': cv2.rectangle(img_OpenCV,(int(x1),int(y1)),(int(x2),int(y2)),(0,255,0),1) # 画一个矩形填充区域 cv2.rectangle(img_OpenCV, (int(x1), int(y1-0.20*r[i][2][3])-2), (int(x2), int(y1)), (20, 147, 255), -1) elif label == '国徽': # 画一个矩形填充区域 cv2.rectangle(img_OpenCV, (int(x1), int(y1-0.20*r[i][2][3])-2), (int(x2), int(y1)), (150, 0, 180), -1) cv2.rectangle(img_OpenCV,(int(x1),int(y1)),(int(x2),int(y2)),(255,0,0),1) # 图像从OpenCV格式转换成PIL格式 img_PIL = Image.fromarray(cv2.cvtColor(img_OpenCV, cv2.COLOR_BGR2RGB)) # 字体 ubuntu系统字体*.ttc的存放路径一般是: /usr/share/fonts/opentype/noto/ 查找指令locate *.ttc font = ImageFont.truetype('/home/monk/snap/notepad-plus-plus/common/.wine/drive_c/windows/Fonts/NotoSerifCJK-ExtraLight.ttc', int(0.13*r[i][2][2])) # 字体颜色 fillColor = (255,255,255) # 文字输出位置 position = (x1+3, y1-0.20*r[i][2][3]) # 输出内容 info = label + '_'+ str(round(seore,6)) # 需要先把输出的中文字符转换成Unicode编码形式 if not isinstance(info, unicode): info = info.decode('utf8') draw = ImageDraw.Draw(img_PIL) draw.text(position, info, font=font, fill=fillColor) # 转换回OpenCV格式 img_OpenCV = cv2.cvtColor(np.asarray(img_PIL),cv2.COLOR_RGB2BGR) # 输出图片 cv2.imwrite(out_img, img_OpenCV)

我的这个yolo模型预测了两个类别:国徽&印章,你可以根据你的情况,进行自己的颜色管理,RGB颜色可以参考这个地址:http://tool.oschina.net/commons?type=3

看一下标注的效果吧!

The End


已发布

分类

标签:

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注