voc2007數據集_【目標檢測數據集】PASCAL VOC制作

【VOC2007+2012】

數據集地址:https://pjreddie.com/projects/pascal-voc-dataset-mirror/

PASCAL VOC為圖像識別和分類提供了一整套標準化的優秀的數據集,用于構建和評估用于圖像分類(Classification)檢測(Object Detection)和分割(Segmentation)的算法,從2005年到2012年每年都會舉行一場圖像識別challenge。

數據集類別(20類):

Person: person;Animal: bird, cat, cow, dog, horse, sheep;Vehicle: aeroplane, bicycle, boat, bus, car, motorbike, train;Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor;

數據集目錄(VOC2007為例,只列出目標檢測所用到的):

-VOCdevkit-VOC2007-Annotations         #存放xml標注文件,每個xml文件都對應于JPEGImages文件夾的一張圖片,文件命名格式為:<圖片編號.xml>-JPEGImages          #存放訓練圖片和測試圖片,文件命名格式為:<圖片編號.jpg>-ImageSets           #存放的是challenge對應的圖像數據-Main              #存放的是圖像物體識別的數據,包含下列4個文件,文件內容格式均為:<圖片編號>-train.txt       #記錄訓練集所包含的圖片編號-test.txt        #記錄測試集所包含的圖片編號-val.txt         #記錄驗證集所包含的圖片編號-trainval.txt    #記錄驗證集和訓練集所包含的圖片編號

把上述目錄所列的文件夾建好,接下來制作自己的VOC格式數據集。

【標注工具labelImg】

labelImg軟件是一款免費的圖像標注工具,常用來為目標檢測任務標注數據集。labelImg的安裝和使用參考GitHub項目:

https://github.com/tzutalin/labelImg?github.com

記錄下自己Mac版本的安裝過程:

conda activate 環境名稱         #可選
pip install pyqt5
pip install libxml2
pip install labelImg
labelImg                      #運行

【制作自己的數據集】

1.JPEGImages文件夾

搜集并刪選出自定類別的圖片數據,將所有的.jpg圖像文件放入JPEGImages文件夾,命名格式統一為“%6d.jpg”,(000001.jpg)

# -*- coding:utf8 -*-'''批量重命名文件夾中的圖片文件'''
import os
class BatchRename():def __init__(self):self.path = './JPEGImages'  # 修改成自己JPEGImages文件夾路徑def rename(self):filelist = os.listdir(self.path)total_num = len(filelist)i = 1n = 6for item in filelist:if item.endswith('.jpg'):n = 6 - len(str(i))src = os.path.join(os.path.abspath(self.path), item)dst = os.path.join(os.path.abspath(self.path), str(0) * n + str(i) + '.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.Annotations文件夾

使用labelImg工具標注圖片中的目標,選擇好圖片存放文件夾(JPEGImages)和標注文件夾(Annotations),接下來就是無止盡的標注。。。

3.ImageSets文件夾

在ImageSets文件夾下新建Main文件夾,執行下面代碼生成test.txt , train.txt , trainval.txt , val.txt。

# -*- coding:utf-8 -*-import os  
import random  trainval_percent = 0.7    # 自己設定(訓練集+驗證集)所占(訓練集+驗證集+測試集)的比重  
train_percent = 0.8       # 自己設定(訓練集)所占(訓練集+驗證集)的比重
xmlfilepath = 'Annotations/'     #注意自己地址是否正確
txtsavepath = 'ImageSets/Main'   #注意自己地址是否正確
total_xml = os.listdir(xmlfilepath)  num = len(total_xml)  
list = range(num)  
tv = int(num*trainval_percent)  
tr = int(tv*train_percent)  
trainval = random.sample(list,tv)  
train = random.sample(trainval,tr)  ftrainval = open(txtsavepath+'/trainval.txt', 'w')  
ftest = open(txtsavepath+'/test.txt', 'w')  
ftrain = open(txtsavepath+'/train.txt', 'w')  
fval = open(txtsavepath+'/val.txt', 'w')  for i in list:  name = total_xml[i][:-4]+'n'  if i in trainval:  ftrainval.write(name)  if i in train:  ftrain.write(name)  else:  fval.write(name)  else:  ftest.write(name)  ftrainval.close()  
ftrain.close()  
fval.close()  
ftest .close()
print('Done')

【數據集常用代碼】

1.批量修改xml標簽

import os
import xml.etree.ElementTree as ET#程序功能:批量修改VOC數據集中xml標簽文件的標簽名稱
def changelabelname(inputpath):listdir = os.listdir(inputpath)for file in listdir:if file.endswith('xml'):file = os.path.join(inputpath,file)tree = ET.parse(file)root = tree.getroot()for object1 in root.findall('object'):for sku in object1.findall('name'):           #查找需要修改的名稱if (sku.text == 'type2_03'):               #‘preName’為修改前的名稱sku.text = 'type2_02'                 #‘TESTNAME’為修改后的名稱tree.write(file,encoding='utf-8')     #寫進原始的xml文件并避免原始xml中文字符亂碼else:passelse:passif __name__ == '__main__':inputpath = 'anno/'  #此處替換為自己的路徑changelabelname(inputpath)

2.批量統計每個類別的圖片數量及目標數量

import re
import os
import xml.etree.ElementTree as ETclass1 = 'type1_01'    #根據自己的類別修改(以下要均修改)
class2 = 'type2_02'
class3 = 'type2_03'
class4 = 'type1_02'
'''
class20 = 'tvmonitor'
'''
annotation_folder = './Annotations/'  # 改為自己標簽文件夾的路徑
# annotation_folder = '/home/.../VOC2007/Annotations/'
list = os.listdir(annotation_folder)def file_name(file_dir):L = []for root, dirs, files in os.walk(file_dir):for file in files:if os.path.splitext(file)[1] == '.xml':L.append(os.path.join(root, file))return Ltotal_number1 = 0    
total_number2 = 0
total_number3 = 0
total_number4 = 0
'''
total_number20 = 0
'''
total = 0
total_pic = 0pic_num1 = 0
pic_num2 = 0
pic_num3 = 0
pic_num4 = 0
'''
pic_num20 = 0
'''flag1 = 0
flag2 = 0
flag3 = 0
flag4 = 0
'''
flag20 = 0
'''xml_dirs = file_name(annotation_folder)for i in range(0, len(xml_dirs)):print(xml_dirs[i])annotation_file = open(xml_dirs[i]).read()root = ET.fromstring(annotation_file)total_pic = total_pic + 1for obj in root.findall('object'):label = obj.find('name').textif label == class1:total_number1 = total_number1 + 1flag1 = 1total = total + 1if label == class2:total_number2 = total_number2 + 1flag2 = 1total = total + 1if label == class3:total_number3 = total_number3 + 1flag3 = 1total = total + 1if label == class4:total_number4 = total_number4 + 1flag4 = 1total = total + 1'''if label == class20:total_number20=total_number20+1flag20=1total = total + 1'''if flag1 == 1:pic_num1 = pic_num1 + 1# print("pic number:", pic_num1)flag1 = 0if flag2 == 1:pic_num2 = pic_num2 + 1flag2 = 0if flag3 == 1:pic_num3 = pic_num3 + 1flag3 = 0if flag4 == 1:pic_num4 = pic_num4 + 1flag4 = 0'''if flag20==1:pic_num20=pic_num20+1flag20=0'''print(class1, pic_num1, total_number1)
print(class2, pic_num2, total_number2)
print(class3, pic_num3, total_number3)
print(class4, pic_num4, total_number4)
'''
print(class20,pic_num20, total_number20)
'''print("total", total_pic, total)

3.圖片批量增廣(水平、上下翻轉等)

"""
圖片批量翻轉
"""
from PIL import Image
import os
import os.path# 指明被遍歷的文件夾
rootdir = r'Rust_01/'
for parent, dirnames, filenames in os.walk(rootdir):  # 遍歷圖片for filename in filenames:print('parent is :' + parent)print('filename is :' + filename)currentPath = os.path.join(parent, filename)print('the fulll name of the file is :' + currentPath)im = Image.open(currentPath)# Image.FLIP_LEFT_RIGHT,表示將圖像左右翻轉out = im.transpose(Image.FLIP_LEFT_RIGHT)# Image.FLIP_TOP_BOTTOM,表示將圖像上下翻轉# out = im.transpose(Image.FLIP_TOP_BOTTOM)# Image.ROTATE_90,表示將圖像逆時針旋轉90°# out = im.transpose(Image.ROTATE_90)# Image.ROTATE_180,表示將圖像逆時針旋轉180°# out = im.transpose(Image.ROTATE_180)# Image.ROTATE_270,表示將圖像逆時針旋轉270°# out = im.transpose(Image.ROTATE_270)# Image.TRANSPOSE,表示將圖像進行轉置(相當于順時針旋轉90°)# out = im.transpose(Image.TRANSPOSE)# Image.TRANSVERSE,表示將圖像進行轉置,再水平翻轉# out = im.transpose(Image.TRANSVERSE)# 新建文件夾保存翻轉后圖片newname = r"Rust_01/" + '' + filenameout.save(newname)  # 保存結束

說明:研一初學目標檢測,本文記錄自己制作數據集的過程,以上參考、摘抄于以下文章,推薦閱讀。有些代碼忘記在哪里借鑒的了,如有讀者見到,聯系,加入參考鏈接。

參考:

轉載:VOC2007數據集制作 - _harvey - 博客園?www.cnblogs.comCSDN-專業IT技術社區-登錄?blog.csdn.netCSDN-專業IT技術社區-登錄?blog.csdn.net

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535064.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JDK和JRE的區別?main方法的注意點?強制和自動類型轉換?

&#x1f4a1;涉及的知識點速通&#x1f6eb; JDK和JRE傻傻分不清?&#x1f6eb; HelloWorld的輸出都經歷了啥&#xff1f;&#x1f6eb; Java的三個版本都是啥&#xff1f;&#x1f6eb; 關于main方法你都知道啥&#xff1f;&#x1f6eb; 強制and自動類型轉換都是啥?各位小…

java將date類型轉成yyyymmdd_java中的Date怎么轉換成YYYYMMDD形式?

展開全部SimpleDateFormat inSdf new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);創建SimpleDateFormat對象的時候使用帶Locale的構e69da5e6ba9062616964757a686964616f31333365633938造參數因為你的星期和月份是用E文寫的 所以parse回來的時候自…

安卓10不支持qmc解碼_Root神器支持安卓10 面具Magisk v20.4+Magisk Manager v7.5.1

Magisk的功能和xposed框架的功能差不多&#xff0c;也有很多插件可安裝&#xff0c;而且自帶root&#xff0c;刷入這個Magisk后你的rom同時也就有root了(支持安卓7.0&#xff0c;7.1&#xff0c;8.0&#xff0c;8.1,9,10)這也是目前安裝8.1root的普遍方法&#xff0c;因為目前s…

centos7配置br0_Docker CentOS7 修改網絡配置與宿主機橋接

Docker CentOS7 修改網絡配置與宿主機橋接1、創建橋接物理網絡(1)新建br0橋接網絡&#xff0c;brctl show可以查看(需安裝bridge-utils)(2)將宿主機物理網卡IP、掩碼、網關、dns(或者dhcp)配置到br0上(3)刪除宿主機物理網卡IP、掩碼、網關、dns(或者dhcp)配置(4)將宿主機物理網…

==和equals判等、空串和null串、字符串常用API

&#x1f4a1;涉及的知識點速通&#x1f6eb; 關于變量和常量你都知道啥?&#x1f6eb; &和&&#xff06;、|和||有什么區別&#xff1f;&#x1f6eb; 關于字符串的問題你能答對幾道&#xff1f;&#x1fa82; 可以修改一個字符串中的值嗎?&#x1fa82; 字符串使用…

倆臺電腦怎么設置同一局域網_方法 | 把手機上的照片傳到電腦上

我想把手機上的照片/視頻傳到電腦上怎么辦? 什么云盤&#xff0c;手機助手等等全扔到一邊去&#xff0c;不用。請讓我慢慢道來&#xff1a;現在&#xff0c;人們手機用的越來越多&#xff0c;即使在大街上&#xff0c;到處都是“低頭族”。但是&#xff0c;有好多小伙伴問&…

數據持化技術的發展演變(SQL、JDBC、mybatis)

文章目錄1 簡單SQL語句1.1 查詢1.2 新增1.3 修改1.4 刪除1.5 多表查詢2 JDBC2.1 什么是JDBC2.2 什么是jar和maven2.3 JDBC的使用2.4 JDBC總結3 mybatis3.1 什么是ORM?為什么是ORM不是JDBC&#xff1f;3.2 mybatis的使用3.3 mybatis總結4 mybatis與jdbc的邏輯相同處環境配置 j…

傳統蒙文字體_蒙古要改回使用傳統回鶻蒙文,這是種什么文字,蒙古為什么要改回...

喜歡就點關注吧!文字是一個國家的文化象征&#xff0c;也是其書面交流的主要工具&#xff0c;世界上的大多數國家都有自己獨特的文字&#xff0c;我們的鄰國蒙古也是如此&#xff0c;近日蒙古國實行了一場意義重大的文字改革&#xff0c;據新華社烏蘭巴托3月18日報道&#xff0…

三態輸出門實驗報告注意事項_數電基礎知識:各種IO輸出的類型

集電極開路(OC)集電極開路輸出的結構如圖1所示&#xff0c;右邊的那個三極管集電極什么都不接&#xff0c;所以叫做集電極開路&#xff1b;左邊的三極管為反相之用&#xff0c;使輸入為“0”時&#xff0c;輸出也為“0”。對于圖 1&#xff0c;當左端的輸入為“0”時&#xff0…

數據持久化技術——MP

文章目錄1 環境搭建1.1 創建一個maven的project1.2 pom.xml文件導入web開發依賴1.3 創建SpringBoot項目的主程序入口2 代碼生成器3 配置數據庫4 導入前端頁面5 開始前端控制器的編碼5.1 wrapper構造器mybatis-plus(簡稱 MP)是一個 MyBatis的增強工具&#xff0c;在 MyBatis 的基…

win7無法連接打印機拒絕訪問_如何解決局域網無法訪問SQL Server 2008 無法連接到(local)...

初次安裝使用SQL server 2008時&#xff0c;可能會遇到無法連接到(local)的情況。那么&#xff0c;如何解決此問題&#xff1f;工具/原料: SQL server 2008方法/步驟1. 打開SQL server 配置管理器-->SQL server 網絡配置-->實例名的協議(我的實例名為SQLEXPRESS)。2. 將S…

windows進程管理器_任務管理器就能搞定9成的電腦問題?方法在這里!

90% 對于電腦的不滿&#xff0c;都逃不出這幾個方面&#xff1a;電腦狀態無法隨時監測、運行卡頓、開機時間長、莫名黑屏、電池關鍵時刻不扛使(筆記本電池怎么保養&#xff1f;能不能一直插電源充電&#xff1f;可以戳這里→)&#xff0c;很多小伙伴就選擇安裝第三方軟件來解決…

三維網格精簡算法java版_ISMAR 2020 | 商湯提出手機端實時單目三維重建系統

導讀&#xff1a;商湯研究院和浙江大學CAD&CG國家重點實驗室合作研發了一個手機端實時單目三維重建系統Mobile3DRecon。與現有的基于RGBD的在線三維重建或離線生成表面網格的系統不同&#xff0c;該系統結合前端位姿跟蹤結果&#xff0c;允許用戶使用單目攝像頭在線重建場景…

【分類匯總】idea快捷鍵、idea配置、常用插件

寫在前面 千萬別看目錄很長就感覺本篇博客很絮叨繁瑣&#xff0c;里面多是配置的講解貼了很多的圖片方便大家了解&#xff0c;配置成功一次之后就可以一直使用了。 快捷鍵的使用建議大家先看&#xff0c;后續敲代碼的時候刻意的使用快捷鍵&#xff0c;相信經過兩三天的使用就可…

win10設置默認輸入法_個性化設置技巧

個性化設置技巧子墨居士前言本次內容主要是win10系統自帶的功能&#xff0c;不是用第三方軟件優化桌面的情況下&#xff0c;讓自己的電腦桌面能更美觀、更舒服。系統自身的個性化設置主要是下圖中的幾個。鼠標右擊->個性化設置。 第三方軟件的效果會更好&#xff0c;畢竟是專…

什么叫組網_家庭wifi,如何組網最合適

wifi信號通過電磁波在空中傳播的&#xff0c;屬于微波通信的一種&#xff0c;因為微波本身及發射功率的限制&#xff0c;導致wifi的穿透能力比較差&#xff0c;北方比較厚的承重強&#xff0c;鐵門、家具等對都會對wifi信號有較強的削弱作用。穿過的障礙物越多&#xff0c;這種…

java輸入輸出、數組初始化

&#x1f4a1;涉及的知識點速通&#x1f6eb; 關于輸入輸出你都知道啥?&#x1f6eb; 關于控制路程都需要注意啥?&#x1f6eb; 關于數組的問題你能答對幾道&#xff1f;&#x1fa82; 數組初始化的小細節你都知道嗎?&#x1fa82; 這些Arrays的常見API你都掌握了嗎?&#…

linux rm 命令刪除文件恢復_Linux之恢復誤刪除文件

前言每當我們在生產環境服務器上執行rm命令時&#xff0c;總是提心吊膽的&#xff0c;因為一不小心執行了誤刪&#xff0c;然后就要準備跑路了&#xff0c;畢竟人不是機器&#xff0c;更何況機器也有 bug。那么如果真的刪除了不該刪除的文件&#xff0c;比如數據庫、日志或執行…

ac2100 反彈shell無法粘貼_記一次突破反彈shell

背景某天閑著無聊&#xff0c;小伙伴發來一個某網站&#xff0c;說只能執行命令&#xff0c;不能反彈shell。測試對著目標站點一頓測試。發現確實存在shiro反序列化&#xff0c;并且存在可以利用的gadget。利用發現確實可以執行命令&#xff0c;但是我們執行反彈的時候。反彈不…

java三大特征 重載與重寫的區別

&#x1f4a1;涉及的知識點速通&#x1f6eb; OOP的三大特征都是什么?&#x1fa82; 什么是封裝?&#x1fa82; 什么是繼承?&#x1fa82; 什么是多態?&#x1f6eb; 關于構造器你都知道什么?&#x1f6eb; 關于類的源文件都需要知道什么?&#x1f6eb; 重載和重寫都是什…