lableimg閃退_CV學習筆記(二十五):數據集標注與制作

最近在做一些數據標注的工作,雖然標注數據比較枯燥,但這也是每個做算法的工程師升級打怪的必由之路。使用一些合適的工具往往可以事半功倍,效率UP。

一:數據標注流程

a8bea0cf078ef2b111a6559e16b53dbb.png

二:數據處理的一些小代碼

1:重命名

當得到這樣格式命名不一致的數據的時候,重命名是最好的方法。

53bd6ceb6d912183855ae9cf7ee6c69a.png

代碼:

#coding=UTF-8

'''

重命名工具

'''

import os

import sys

def rename():

path=input(r"請輸入路徑(例如D:\picture):")

name=input("請輸入開頭名:")

startNumber=input("請輸入開始數:")

fileType=input("請輸入后綴名(如 .jpg、.txt等等):")

print("正在生成以"+name+startNumber+fileType+"迭代的文件名")

count=0

filelist=os.listdir(path)

for files in filelist:

Olddir=os.path.join(path,files)

if os.path.isdir(Olddir):

continue

Newdir=os.path.join(path,name+str(count+int(startNumber))+fileType)

os.rename(Olddir,Newdir)

count+=1

print("一共修改了"+str(count)+"個文件")

if __name__ == '__main__':

rename()

重命名后的文件會覆蓋之前的文件,記得操作之前備份原始數據(如有需要的話)

2:數據標注工具:

對于VOC數據集,使用labelimgs很方便,安裝過程也很簡單:

開源地址如下:https://github.com/tzutalin/labelImg

1acb5de28865cb672dd55fbc4bc9499e.png

如上圖所示,框選完口罩后,點擊OK會生成一個跟你文件名一致的XML文件,XML中包括有文件路徑,文件名稱,以及你給的標簽等等信息,如下圖:

70664edb210fa88c501f4671f3032a12.png

3:劃分數據集

因為要符合VOC數據集格式,這里簡單說一下VOC數據集格式類型。做深度學習目標檢測方面的同學怎么都會接觸到PASCAL VOC這個數據集。也許很少用到整個數據集,但是一般都會按照它的格式準備自己的數據集。所以這里就來記錄一下PASCAL VOC的格式,包括目錄構成以及各個文件夾的內容格式,方便以后自己按照VOC的標準格式制作自己的數據集。

96509af23c3c4d21771299d657ae94c7.png

但是我們一般情況下,自己制作數據集不需要Segment開頭的,著重關注這三個文件夾:

Annotation文件夾存放的是xml文件,該文件是對圖片的解釋,每張圖片都對于一個同名的xml文件。

ImageSets文件夾存放的是txt文件,這些txt將數據集的圖片分成了各種集合。

JPEGImages文件夾存放的是數據集的原圖片

31eb78fe429b33119066773bb835c319.png

轉換代碼:

import os

import random

xmlfilepath = r'D:/object_find/voc_title/VOCdevkit/VOC2007/Annotations'

saveBasePath = r"D:/object_find/voc_title/VOCdevkit/VOC2007/ImageSets/Main/"

#訓練集和驗證集所占的比例

trainval_percent = 0.8

train_percent = 0.8

temp_xml = os.listdir(xmlfilepath)

total_xml = []

for xml in temp_xml:

if xml.endswith(".xml"):

total_xml.append(xml)

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)

print("train and val size", tv)

print("traub suze", tr)

#trainval,訓練集測試集文件名,train,訓練集,test,測試集,val驗證集的文件名

ftrainval = open(os.path.join(saveBasePath, 'trainval.txt'), 'w')

ftest = open(os.path.join(saveBasePath, 'test.txt'), 'w')

ftrain = open(os.path.join(saveBasePath, 'train.txt'), 'w')

fval = open(os.path.join(saveBasePath, '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()

運行結果:

383e28d9c3cd7615565e911982c775c9.png

4:XML轉TXT

這里要用到XML工具包來匹配一下:

代碼:

import xml.etree.ElementTree as ET

from os import getcwd

sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

classes = ["nomask","rightmask","wrongmask"]

def convert_annotation(year, image_id, list_file):

in_file = open('D:/object_find/voc_title/VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))

tree=ET.parse(in_file)

root = tree.getroot()

for obj in root.iter('object'):

difficult = obj.find('difficult').text

cls = obj.find('name').text

if cls not in classes or int(difficult)==1:

continue

cls_id = classes.index(cls)

xmlbox = obj.find('bndbox')

b = (int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text), int(xmlbox.find('ymax').text))

list_file.write(" " + ",".join([str(a) for a in b]) + ',' + str(cls_id))

wd = getcwd()

for year, image_set in sets:

image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()

list_file = open('%s_%s.txt'%(year, image_set), 'w')

for image_id in image_ids:

list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg'%(wd, year, image_id))

convert_annotation(year, image_id, list_file)

list_file.write('\n')

list_file.close()

生成結果:

018ba36005ee1dbc4a9dd2367bcb7230.png

生成txt文件,包括:圖片位置信息,目標位置,類別

2b55aae04cea447ce532dec09f7a28e8.png

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

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

相關文章

mysql show profile詳解_SQL 性能分析利器 show profile

本文首發個人公眾號《andyqian》, 期待你的關注~前言在之前的文章中,我們提到過一些慢SQL優化的步驟。其中就包括:使用 explain 關鍵字來查看執行計劃,是否命中索引。通過計算某列的區分度,來判斷該列是否適合新建索引…

php判斷給定的整數是否是2的冪_C++_C語言判斷一個數是否是2的冪次方或4的冪次方,快速判斷一個數是否是2的冪次 - phpStudy...

C語言判斷一個數是否是2的冪次方或4的冪次方快速判斷一個數是否是2的冪次方,若是,并判斷出來是多少次方!將2的冪次方寫成二進制形式后,很容易就會發現有一個特點:二進制中只有一個1,并且1后面跟了n個0&…

python 包編譯安裝mysql_CentOS7編譯安裝MySQL8.0.23和Python3.1.9

卸載mariadbrpm -qa | grep mariadbmariadb-libs-5.5.64-1.el7.x86_64yum remove mariadb-libs.x86_64 -y安裝高版本GCC,解決編譯中會遇到的GCC 5.3 or newer is required (-dumpversion says 4.8.5)cd /optyum install centos-release-scl -yyum install devtoolse…

python3.0下載用什么瀏覽器_無法讓Python下載網頁源代碼:“不支持瀏覽器版本”...

查看您列出的url,我執行了以下操作:使用wget下載了頁面將urllib與ipython一起使用并下載了頁面使用chrome,只保存了url所有3個都給了我相同的結果文件(相同的大小,相同的內容)。在這可能是因為我沒有登錄,但我確實看到…

java線程堆棧_深入JVM剖析Java的線程堆棧

在這篇文章里我將教會你如何分析JVM的線程堆棧以及如何從堆棧信息中找出問題的根因。在我看來線程堆棧分析技術是Java EE產品支持工程師所必須掌握的一門技術。在線程堆棧中存儲的信息,通常遠超出你的想象,我們可以在工作中善加利用這些信息。我的目標是…

java 文件下載方法_【工具類】Java后臺上傳下載文件的幾種方式

/*** 將本地照片上傳至騰訊云服務上*/public void uploadImage(String localImagePath) throws Exception {// 1.將訂單照片上傳至騰訊地圖眾包側提供的云服務上try {File imageFile new File(localImagePath);if (imageFile.exists()) {String url "http://" map…

java io流讀取txt文件_Java使用IO流讀取TXT文件

通過BufferedReader讀取TXT文件window系統默認的編碼是GBK,而IDE的編碼多數為UTF-8,如果沒有規定new InputStreamReader(new FileInputStream(file),“GBK”)為GBK會出現讀取內容亂碼。//文件路徑String filePath"C:/Users/Admin/Desktop/products.…

c 調用java程序_C ++可以調用Java代碼嗎?

小編典典是的,您當然可以。這是一個例子:這是java文件:public class InvocationHelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");System.out.println("Arguments sent to this pro…

java 大數類_Java大數類介紹

java能處理大數的類有兩個高精度大整數BigInteger和高精度浮點數BigDecimal,這兩個類位于java.math包內,要使用它們必須在類前面引用該包:importjava.math.BigInteger;和importjava.math.BigDecimal;或者importjava.math.*;以下從幾個方面對B…

java 畫樹_java – 如何繪制代表連接節點圖的樹?

我想在Java GUI中顯示樹,但我不知道如何.樹代表連接節點的圖形,如下所示:我應該說我有自己的樹類:public class BinaryTree{private BinaryNode root;public BinaryTree( ){root null;}public BinaryTree( Object rootItem ){root new BinaryNode( roo…

mysql 優化代碼_MySQL Order by 語句優化代碼詳解

Order by語句是用來排序的,經常我們會使用到Order by來進行排序,下面我給大家來講講Order by用法與優化排序,有需要的同學可參考MySQL Order By keyword是用來給記錄中的數據進行分類的。MySQL Order By Keyword根據關鍵詞分類ORDER BY keywo…

java.lang.class_關于Java.lang.Class的一些疑問

User.class可以在編譯時就確定下來Class的泛型,而new User().getClass()實際上是運行時才能確定下來實際是什么泛型。舉個例子:public class User{}public class Student extends User{public static void main(String[] args) {User user1 new User();…

java文件 linux_Linux執行Java文件

最近學習shell腳本,寫個簡單java類讓linux去執行java類沒別的東西,就引了一個fastjson的jar,寫了個main方法 序列化一個User對象 打印package com.lws.demo;import java.util.Date;import com.alibaba.fastjson.JSONObject;import com.lws.mo…

java 劊子手游戲_java基礎(九):容器

集合的引入List (ArrayList LinkedList)Set (HashSet LinkedHashSet TreeSet )Map (HashMap LinkedHashMap TreeMap)CollectionsIterator使用泛型1.為什么使用集合而不是數組?集合和數組相似點都可以存儲多個對象,對外作為一個整體存在數組的缺點長度必須…

java面試手寫單鏈表_(轉)面試大總結之一:Java搞定面試中的鏈表題目

packageLinkedListSummary;importjava.util.HashMap;importjava.util.Stack;/*** http://blog.csdn.net/luckyxiaoqiang/article/details/7393134 輕松搞定面試中的鏈表題目* http://www.cnblogs.com/jax/archive/2009/12/11/1621504.html 算法大全(1)單鏈表** 目錄&#xff1a…

ccf認證俄羅斯方塊java_CCF認證歷年試題 - osc_h3robkrt的個人空間 - OSCHINA - 中文開源技術交流社區...

CCF認證歷年試題不加索引整理會死星人orz第一題:CCF201712-1 最小差值(100分)CCF201703-1 分蛋糕(100分)CCF201612-1 中間數(100分)CCF201609-1 最大波動(100分)CCF201604-1 折點計數(100分)CCF201509-1 數列分段(100分)CCF201503-1 圖像旋轉(100分)CCF201412-1 門禁…

mysql 變量作表名查詢_使用MySQL函數變量作為表名查詢

我需要有一個表中增加一定的ID(如AUTO_INCREMENT)函數使用MySQL函數變量作為表名查詢我有水木清華這樣DELIMITER $$DROP FUNCTION IF EXISTS GetNextID$$CREATE FUNCTION GetNextID(tblName TEXT, increment INT)RETURNS INTDETERMINISTICBEGINDECLARE NextID INT;SELECT MAX(c…

java 簽名 ecdsa_Java實現ECDSA簽名算法

ECDSA簽名算法package com.albedo.security;/*** DSA 加解密實現*/public class ECDSAUtils extends Base {//字符編碼public static final String ALGORITHM "EC";public static final String SIGN_ALGORITHM "SHA1withECDSA";/*** ECDSA 驗簽** param …

java異常處理方式推薦做法_談談Java異常處理這件事兒

此文已由作者謝蕾授權網易云社區發布。歡迎訪問網易云社區,了解更多網易技術產品運營經驗。前言我們對于“異常處理”這個詞并不陌生,眾多框架和庫在異常處理方面都提供了便利,但是對于何種處理才是最佳實踐,也是眾說紛紜。異常處…

as400和java的區別_文件傳輸協議和AS400

我目前收到以下錯誤:遠程服務器返回錯誤:(501)參數或參數中的語法錯誤 .我已經檢查了服務器并且文件確實存在,如果我打開命令提示符并鍵入以下代碼它可以工作:ftpopen 192.168.1.2cd /Imagesget S12345.jpeg這是正常的&#xff0c…