python脚本——图片重命名、图片合成视频、faster-rcnn画P-R曲线
調試faster rcnn算法實用的python腳本
目錄
調試faster rcnn算法實用的python腳本
一、前言
二、常用python腳本
三、后記
一、前言
最近在做關于目標檢測算法的研究,調試的第一個算法就是faster-rcnn,今天要說的時筆者在跑通這個算法,也就是訓練、評估、數據制作等過程中用到的一些簡單實用的python腳本,在這里分享出來,寫的不好希望大家多多指正。
二、常用python腳本
1.python圖片重命名
在調通了代碼確保能夠訓練官方的Pascal_voc數據集之后,我們就自己標注數據集,希望訓練自己的模型,采用的方法是實用labelimg工具一張一張的標,標注完之后圖片名不統一,所以這個腳本就是統一命名全部圖片,代碼如下:
# -*- coding:utf8 -*-
import os
class BatchRename():'''批量重命名文件夾中的圖片文件
?'''def __init__(self):self.path = 'F:\\Desktop\\data\\video_cut\\1' ?#表示需要命名處理的文件夾# self.path = '這邊寫上你需要重命名的圖片的路徑'def rename(self):filelist = os.listdir(self.path) #獲取文件路徑total_num = len(filelist) #獲取文件長度(個數)i = 1 ?#表示文件的命名是從1開始的for item in filelist:if item.endswith('.jpg'): ?#初始的圖片的格式為jpg格式的(或者源文件是png格式及其他格式,后面的轉換格式就可以調整為自己需要的格式即可)src = os.path.join(os.path.abspath(self.path), item)#dst = os.path.join(os.path.abspath(self.path), ''+str(i) + '.jpg')#處理后的格式也為jpg格式的,當然這里可以改成png格式dst = os.path.join(os.path.abspath(self.path), '000' + format(str(i), '0>3s') + '.jpg')#這種情況下的命名格式為0000000.jpg形式,可以自主定義想要的格式try:os.rename(src, dst)print ('converting %s to %s ...' % (src, dst))i = i + 1except:continueprint ('total %d to rename & converted %d jpgs' % (total_num, i))
?
if __name__ == '__main__':demo = BatchRename()demo.rename()
2.多張圖片合成視頻的python腳本
faster-rcnn算法可以測出單張的效果,在我修改了tf-faster-rcnn-master\tools下的demo.py之后,就能夠測試多張,所以我想看到測試結果時,通常是一張張的圖片放置在指定的路徑下,然后,就能夠跑很多demo,如下圖所示:
每一張都是檢測后的結果,這樣看起來沒有連續性,不夠直觀,所以此時利用這個腳本將所有的圖片合成視頻,就能夠直觀的看到效果,代碼如下:
# -*- coding: UTF-8 -*-
import os
import cv2
import time
# 圖片合成視頻
def image2video(path,size):filelist = os.listdir(path) #獲取該目錄下的所有文件名'''fps:幀率:1秒鐘有n張圖片寫進去[控制一張圖片停留5秒鐘,那就是幀率為1,重復播放這張圖片5次] 如果文件夾下有50張 534*300的圖片,這里設置1秒鐘播放5張,那么這個視頻的時長就是10秒'''fps = 3#size = (1920,1080) #圖片的分辨率片# 導出的視頻的存放目錄file_path = "F:\\Desktop\\data\\test_video\\2\\" + str(int(time.time())) + ".avi"#合成視頻導出路徑fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')#不同視頻編碼對應不同視頻格式(例:'I','4','2','0' 對應avi格式)video = cv2.VideoWriter( file_path, fourcc, fps, size )for item in filelist:if item.endswith('.jpg'): ? #判斷圖片后綴是否是.jpgitem = path + '/' + item img = cv2.imread(item) ?#使用opencv讀取圖像,直接返回numpy.ndarray 對象,通道順序為BGR ,注意是BGR,通道值默認范圍0-255。video.write(img) ? ? ? ? ?#把圖片寫進視頻print (item)video.release() #釋放
?#調用函數,給定所有圖片的路徑
image2video(r'F:\\Desktop\\data\\test_result\\2\\',(1280,720))
3.遍歷XML文件,進行數據分析
這個過程實際上就是對自己標注的數據集進行分析,因為我是把自己標注的數據集制作成Pascal_voc的樣子,Pascal_voc共三個目錄:
其中Annotations中對應的就是XML文件,每一個XML對應每一張圖,也就是每一張原圖生成一個XML,每個XML里保存的都是這個圖片的重要信息,如:
<annotation> ?<folder>VOC2012</folder> ? ? ? ? ? ? ? ? ? ? ? ? ? ? <filename>2007_000392.jpg</filename> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //文件名 ?<source> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //圖像來源(不重要) ?<database>The VOC2007 Database</database> ?<annotation>PASCAL VOC2007</annotation> ?<image>flickr</image> ?</source> ?<size> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //圖像尺寸(長寬以及通道數) ? ? ? ? ? ? ? ? ? ? ? ?<width>500</width> ?<height>332</height> ?<depth>3</depth> ?</size> ?<segmented>1</segmented> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //是否用于分割(在圖像物體識別中01無所謂) ?<object> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //檢測到的物體 ?<name>horse</name> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //物體類別 ?<pose>Right</pose> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //拍攝角度 ?<truncated>0</truncated> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //是否被截斷(0表示完整) ?<difficult>0</difficult> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //目標是否難以識別(0表示容易識別) ?<bndbox> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //bounding-box(包含左下角和右上角xy坐標) ?<xmin>100</xmin> ?<ymin>96</ymin> ?<xmax>355</xmax> ?<ymax>324</ymax> ?</bndbox> ?</object> ?<object> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //檢測到多個物體,內容同上 ?<name>person</name> ?<pose>Unspecified</pose> ?<truncated>0</truncated> ?<difficult>0</difficult> ?<bndbox> ?<xmin>198</xmin> ?<ymin>58</ymin> ?<xmax>286</xmax> ?<ymax>197</ymax> ?</bndbox> ?</object> ?
</annotation>
所以我們對所有的XML進行遍歷,就可以分析下總共有幾個object,每一類的object有多少,代碼如下:同樣,一些路徑需要根據你們自身情況改動
#coding=utf-8
import xml.dom.minidom
import os
import sys
rootdir='F:/VOC2007/Annotations/'#存有xml文件的文件夾的絕對路徑
list=os.listdir(rootdir)#列出文件夾下所有的目錄與文件
classes_list=[]
classes_count_imag=[1,1,1,1,1,1,1]#統計含有各個目標的圖片數
classes_count_object=[1,1,1,1,1,1,1]#統計各個目標的總數
for i in range(0,len(list)):path=os.path.join(rootdir,list[i])if os.path.isfile(path):#用于區分imag和objectflag=[0,0,0,0,0,0,0]#打開xml文檔dom=xml.dom.minidom.parse(path)#得到文檔元素對象root=dom.documentElementcc=dom.getElementsByTagName('name')for i in range(len(cc)):c1=cc[i]#如果是新的目標則將其加入classes_list數組中if classes_list.count(c1.firstChild.data)==0:classes_list.append(c1.firstChild.data)#統計imag和object的個數else:for j in range(0,len(classes_list)):if(classes_list[j]==c1.firstChild.data):if(flag[j]==0):classes_count_imag[j]+=1flag[j]=1classes_count_object[j]+=1
print(classes_list)
print("Classes: "+str(len(classes_list)))
for i in range(len(classes_list)):print("Class:%20s ? image:%10d張 object:%10d個"%(classes_list[i],classes_count_imag[i],classes_count_object[i]))
4.畫p-r曲線
這個代碼是評估用的,關于什么是p-r曲線,詳情請看我之前的一篇博客。
因為做目標檢測,最后看這個模型的好壞,就是利用p-r曲線和mAP來評估,mAP和各類的AP在跑算法跑到最后的時候,會自動幫你算出來,但是p-r曲線要自己畫,畫p-r曲線,最重要的是要有你測試結束后生成的pkl文件,生成在這個路徑下:
tf-fastercnn/output/vgg16/voc_2007_test/default/vgg16_faster_rcnn_iter_70000
這里的pkl文件就是用來給我們畫p-r曲線的,代碼如下:
#! -*- coding=utf-8 -*-
import matplotlib.pyplot as plt
import pickle
import os
?
list = ['pedestrian', 'person', 'motorbike', 'bike', 'hat', 'motorbike1', 'person_trunc']
?
for i in list:tmp = i + '_pr.pkl'fp = open(tmp,'rb')a = pickle.load(fp)plt.ylim([0.0, 1.1])plt.xlim([0.0, 1.1])tmp = 'Faster R-CNN Precision-Recall Curve (' + i + ')'plt.plot(a['rec'],a['prec'])plt.xlabel('Recall')plt.ylabel('Precision')plt.title(tmp)plt.show()
當然,如果你不明白這個pkl文件長啥樣,里面是啥內容,你可以把pkl轉成txt文本進行閱讀(因為不能直接打開pkl文件,所以需要轉化),代碼如下:
#-*-coding:utf-8-*-
import pickle
import numpy as np
?
np.set_printoptions(threshold=np.NaN)
fr = open('./motorbike1_pr.pkl','rb') ? ?
inf = pickle.load(fr) ? ? ?
print (inf)
fo = open("motorbike_pr.txt", "wb")
fo.write(str(inf))
fo.close()
fr.close() ? ?
三、后記
以上是在我調faster-rcnn時用到的腳本,希望可以提供幫助,接下來筆者將繼續閱讀faster-rcnn的源碼,爭取發出關于源碼的解讀,大家互相學習啦。
總結
以上是生活随笔為你收集整理的python脚本——图片重命名、图片合成视频、faster-rcnn画P-R曲线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode刷题记录15——21.
- 下一篇: 目标检测——Faster R-CNN论文