1. 程式人生 > 程式設計 >python目標檢測給圖畫框,bbox畫到圖上並儲存案例

python目標檢測給圖畫框,bbox畫到圖上並儲存案例

我就廢話不多說了,還是直接上程式碼吧!

import os
import xml.dom.minidom
import cv2 as cv
 
ImgPath = 'C:/Users/49691/Desktop/gangjin/gangjin_test/JPEGImages/'
AnnoPath = 'C:/Users/49691/Desktop/gangjin/gangjin_test/Annotations/' #xml檔案地址
save_path = ''
def draw_anchor(ImgPath,AnnoPath,save_path):
  imagelist = os.listdir(ImgPath)
  for image in imagelist:
 
    image_pre,ext = os.path.splitext(image)
    imgfile = ImgPath + image
    xmlfile = AnnoPath + image_pre + '.xml'
    # print(image)
    # 開啟xml文件
    DOMTree = xml.dom.minidom.parse(xmlfile)
    # 得到文件元素物件
    collection = DOMTree.documentElement
    # 讀取圖片
    img = cv.imread(imgfile)
 
    filenamelist = collection.getElementsByTagName("filename")
    filename = filenamelist[0].childNodes[0].data
    print(filename)
    # 得到標籤名為object的資訊
    objectlist = collection.getElementsByTagName("object")
 
    for objects in objectlist:
      # 每個object中得到子標籤名為name的資訊
      namelist = objects.getElementsByTagName('name')
      # 通過此語句得到具體的某個name的值
      objectname = namelist[0].childNodes[0].data
 
      bndbox = objects.getElementsByTagName('bndbox')
      # print(bndbox)
      for box in bndbox:
        x1_list = box.getElementsByTagName('xmin')
        x1 = int(x1_list[0].childNodes[0].data)
        y1_list = box.getElementsByTagName('ymin')
        y1 = int(y1_list[0].childNodes[0].data)
        x2_list = box.getElementsByTagName('xmax')  #注意座標,看是否需要轉換
        x2 = int(x2_list[0].childNodes[0].data)
        y2_list = box.getElementsByTagName('ymax')
        y2 = int(y2_list[0].childNodes[0].data)
        cv.rectangle(img,(x1,y1),(x2,y2),(255,255,255),thickness=2)
        cv.putText(img,objectname,cv.FONT_HERSHEY_COMPLEX,0.7,(0,0),thickness=2)
        # cv.imshow('head',img)
        cv.imwrite(save_path+'/'+filename,img)  #save picture

補充知識:深度學習python之用Faster-rcnn 檢測結果(txt檔案) 在原圖畫出box

使用Faster-rcnn 的test_net.py 檢測網路的mAP等精度會生成一個檢測結果(txt檔案),格式如下:

000004 0.972 302.8 94.5 512.0 150.0
000004 0.950 348.1 166.1 512.0 242.9
000004 0.875 1.0 25.7 292.6 126.3
000004 0.730 1.0 138.5 488.3 230.0
000004 0.699 1.0 120.9 145.5 139.9
000004 0.592 54.4 227.4 431.9 343.4
000004 0.588 1.0 159.8 18.8 231.6
000004 0.126 1.0 247.1 342.3 270.0
000004 0.120 1.0 225.4 185.7 309.3

每行分別為 名稱 檢測概率 xmin ymin xmax ymax

問題在於每一行只顯示一個box資料,每幅影象可能包括多個box,需要判斷提取的多行資料是不是屬於同一圖片

下面使用python提取這些資料,在原圖上畫出box並且儲存起來

import os
import os.path
import numpy as np
import xml.etree.ElementTree as xmlET
from PIL import Image,ImageDraw
import cPickle as pickle 

txt_name = 'comp4_8a226fd7-753d-40fc-8013-f68d2a465579_det_test_ship.txt'
file_path_img = '/home/JPEGImages'
save_file_path = '/home/detect_results'


source_file = open(txt_name)

img_names = []
for line in source_file:
  staff = line.split()
  img_name = staff[0]
  img_names.append(img_name)

name_dict = {}
for i in img_names:
  if img_names.count(i)>0:
    name_dict[i] = img_names.count(i) 

source_file.close()

source_file = open(txt_name)
for idx in name_dict:
  img = Image.open(os.path.join(file_path_img,idx + '.jpg')) 
  draw = ImageDraw.Draw(img)
  for i in xrange(name_dict[idx]):
    line = source_file.readline()
    staff = line.split()
    score = staff[1]
    box = staff[2:6]
    draw.rectangle([int(np.round(float(box[0]))),int(np.round(float(box[1]))),int(np.round(float(box[2]))),int(np.round(float(box[3])))],outline=(255,0))
  img.save(os.path.join(save_file_path,idx + '.jpg')) 

source_file.close()

執行完即可在儲存資料夾中得到效果圖。

以上這篇python目標檢測給圖畫框,bbox畫到圖上並儲存案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。