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

举报
技术火炬手 发表于 2019/07/29 14:51:28 2019/07/29
【摘要】 yolo是非常强大的模型,在物体定位领域应用非常普遍。今天我们不聊yolo的原理和网络结构,我们聊聊对yolo输出结果进行可视化。yolo在对图片进行分析后,会输出r, r是一个list,大致如下[('印章', 0.9983074069023132, (912.6295776367188, 395.174072265625, 213.7032928466797, 206.8572082519...

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

image.png

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

看一下标注的效果吧!

image.png

-------------

作者:机器在学习

原文链接:http://www.siyuanblog.com/?p=88366


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。