日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Yolov5 使用精灵标注助手制作数据集

發布時間:2025/5/22 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Yolov5 使用精灵标注助手制作数据集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

精靈標記助手下載:http://www.jinglingbiaozhu.com/

首先點擊菜單文件->新建,然后選擇位置標注,選擇圖片文件夾,點擊創建按鈕,軟件會自動加載文件夾下的圖片(png,jpg,gif)并創建一個項目。

  • 項目名稱:根據自己的需求命名

  • 圖片文件夾:圖片文件所在電腦磁盤的路徑

  • 分類值:根據對圖片劃分的類別,對不同類的框命名

    可以選擇 曲線框,多邊形框,矩形框等對圖片進行標注。

    注:所選框不能超出圖片大小,如圖下

    為了有更好的識別效果,上面的圖片應該進行如下標記:

注意:每次標記完一張圖后,要對圖片進行保存,通過快捷鍵 ctrl + s 或者點擊圖片下方的 ?,

當左下角彈出 √保存成功,則證明該張圖片的標記已經保存,如果標記的圖片沒有進行保存,在切換圖片的過程中,前一張的圖片標記框會自動消失,此時需要對圖片重新標記。

快捷鍵

  • R:矩形框
  • ←:前一張圖片
  • →:后一張圖片
  • 空格:移動
  • 放大縮小圖片:ctrl + 鼠標滾輪
  • 保存標記:ctrl + s

所有的數據集標注完成后,將標注的信息導出。

注:選擇導出格式時候必須選擇pascal—voc導出XML直接選擇XML會在后面無法讀取到標注
的信息


導出后,會在目錄中生成一個 outputs 文件夾,導出的文件就是pascal-voc的xml,效果如下:

輸出的標注文件XML保存在Annotations中

數據集標記好后,將原始圖片數據集放到images文件夾中,如圖所示

以下操作是對導出的XML文件和原圖片進行解析。

makeTxt.py

創建 makeTxt.py 文件
makeTxt.py主要是將數據集分類成訓練數據集和測試數據集,默認train,val,test按照8:1:1
的比例進行隨機分類。

import os import randomtrainval_percent = 0.9 train_percent = 0.9 xmlfilepath = './datasets/Annotations' # 數據集位置 txtsavepath = './datasets/images' # 圖片位置 tmage_sets_path = './datasets/ImageSets' # 將數據集分為 訓練數據集和測試數據集進行存放的位置 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)# 先找ImageSets文件夾如果不存在則創建 if not os.path.exists(tmage_sets_path):os.makedirs(tmage_sets_path)ftrainval = open('datasets/ImageSets/trainval.txt', 'w') # 以只寫方式打開文件。如果文件存在會被覆蓋。如果文件不存在,創建新文件 ftest = open('datasets/ImageSets/test.txt', 'w') ftrain = open('datasets/ImageSets/train.txt', 'w') fval = open('datasets/ImageSets/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()

voc_label.py

創建 voc_label.py 文件
代碼如下:
classes=[……] 中填入的一定要是自己在數據集中所標注的類別名稱,標記了幾個類別就填寫幾個類別名,填寫錯誤的話會造成讀取不出xml文件里的標注信息。

# xml解析包 import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import joinsets = ['train', 'test', 'val'] classes = ['杯子', '鍵盤', '鼠標', '手機'] #填入剛剛標記數據集的類別名稱# 進行歸一化操作 def convert(size, box): # size:(原圖w,原圖h) , box:(xmin,xmax,ymin,ymax)dw = 1. / size[0] # 1/wdh = 1. / size[1] # 1/hx = (box[0] + box[1]) / 2.0 # 物體在圖中的中心點x坐標y = (box[2] + box[3]) / 2.0 # 物體在圖中的中心點y坐標w = box[1] - box[0] # 物體實際像素寬度h = box[3] - box[2] # 物體實際像素高度x = x * dw # 物體中心點x的坐標比(相當于 x/原圖w)w = w * dw # 物體寬度的寬度比(相當于 w/原圖w)y = y * dh # 物體中心點y的坐標比(相當于 y/原圖h)h = h * dh # 物體寬度的寬度比(相當于 h/原圖h)return (x, y, w, h) # 返回 相對于原圖的物體中心點的x坐標比,y坐標比,寬度比,高度比,取值范圍[0-1]# year ='2012', 對應圖片的id(文件名) def convert_annotation(image_id):'''將對應文件名的xml文件轉化為label文件,xml文件包含了對應的bunding框以及圖片長款大小等信息,通過對其解析,然后進行歸一化最終讀到label文件中去,也就是說一張圖片文件對應一個xml文件,然后通過解析和歸一化,能夠將對應的信息保存到唯一一個label文件中去labal文件中的格式:calss x y w h 同時,一張圖片對應的類別有多個,所以對應的bunding的信息也有多個'''# 對應的通過year 找到相應的文件夾,并且打開相應image_id的xml文件,其對應bund文件in_file = open('datasets/Annotations/%s.xml' % (image_id), encoding='utf-8')# 準備在對應的image_id 中寫入對應的label,分別為# <object-class> <x> <y> <width> <height>out_file = open('datasets/labels/%s.txt' % (image_id), 'w', encoding='utf-8')# 解析xml文件tree = ET.parse(in_file)# 獲得對應的鍵值對root = tree.getroot()# 獲得圖片的尺寸大小size = root.find('size')# 如果xml內的標記為空,增加判斷條件if size != None:# 獲得寬w = int(size.find('width').text)# 獲得高h = int(size.find('height').text)# 遍歷目標objfor obj in root.iter('object'):# 獲得difficult ??difficult = obj.find('difficult').text# 獲得類別 =string 類型cls = obj.find('name').text# 如果類別不是對應在我們預定好的class文件中,或difficult==1則跳過if cls not in classes or int(difficult) == 1:continue# 通過類別名稱找到idcls_id = classes.index(cls)# 找到bndbox 對象xmlbox = obj.find('bndbox')# 獲取對應的bndbox的數組 = ['xmin','xmax','ymin','ymax']b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text),float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))print(image_id, cls, b)# 帶入進行歸一化操作# w = 寬, h = 高, b= bndbox的數組 = ['xmin','xmax','ymin','ymax']bb = convert((w, h), b)# bb 對應的是歸一化后的(x,y,w,h)# 生成 calss x y w h 在label文件中out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') # 返回當前工作目錄 wd = getcwd() print(wd)for image_set in sets:'''對所有的文件數據集進行遍歷做了兩個工作:1.將所有圖片文件都遍歷一遍,并且將其所有的全路徑都寫在對應的txt文件中去,方便定位2.同時對所有的圖片文件進行解析和轉化,將其對應的bundingbox 以及類別的信息全部解析寫到label 文件中去最后再通過直接讀取文件,就能找到對應的label 信息'''# 先找labels文件夾如果不存在則創建if not os.path.exists('datasets/labels/'):os.makedirs('datasets/labels/')# 讀取在ImageSets/Main 中的train、test..等文件的內容# 包含對應的文件名稱image_ids = open('datasets/ImageSets/%s.txt' % (image_set)).read().strip().split()# 打開對應的2012_train.txt 文件對其進行寫入準備list_file = open('datasets/%s.txt' % (image_set), 'w')# 將對應的文件_id以及全路徑寫進去并換行for image_id in image_ids:list_file.write('datasets/images/%s.jpg\n' % (image_id))# 調用 year = 年份 image_id = 對應的文件名_idconvert_annotation(image_id)# 關閉文件list_file.close()
  • 分別運行makeTxt.py和voc_label.py。
  • makeTxt.py主要是將數據集分類成訓練數據集和測試數據集,默認train,val,test按照8:1:1
    的比例進行隨機分類,運行后ImagesSets文件夾中會出現四個文件,主要是生成的訓練數據集和測
    試數據集的圖片名稱,同時data目錄下也會出現這四個文件,內容是訓練數據集和測試數據集的圖
    片路徑。


    labels文件夾下 txt文件的內容如下:

根據數據集會寫一些對圖片文件和txt文件處理的腳本,
例如:以下是在標記數據集的過程中并沒有對一些數據集進行標記然后,將已經標記的數據集進行分開
存放在另一個文件夾中。

import os, shutil'''匹配訓練的圖片 和 標記 文件名字是否對應 把對應的名字復制到其它文件中 ''' def mycopyfile(srcfile, dstfile): # 復制文件函數if not os.path.isfile(srcfile):print("%s not exist!" % (srcfile))else:fpath = os.path.dirname(dstfile) # 獲取文件路徑if not os.path.exists(fpath): # 如果沒有復制的文件目錄就創建復制到那里的文件目錄os.makedirs(fpath) # 沒有就創建路徑shutil.copyfile(srcfile, dstfile) # 復制文件到默認路徑print("copy %s -> %s" % (srcfile, os.path.join(fpath, dstfile)))def operation(images_path, txt_path, copy_images_path, copy_txt_path):os.chdir(images_path) # 用于改變當前工作目錄到指定的路徑。 相當于 cd #當操作的文件不在當前目錄時必須先進入目錄print("開始復制....")cout = 0for images_file in os.listdir(images_path):images_name = os.path.splitext(images_file)[0] # 獲取文件名images_suffix = os.path.splitext(images_file)[1] # 獲取后綴for txt_file in os.listdir(txt_path):txt_name = os.path.splitext(txt_file)[0] #獲取文件名txt_suffix = os.path.splitext(txt_file)[1] # 獲取后綴if images_name == txt_name:mycopyfile(images_path + images_name + images_suffix, copy_images_path + images_name + images_suffix)mycopyfile(txt_path + images_name + txt_suffix, copy_txt_path + images_name + txt_suffix)print("images文件復制%s個,txt文件復制%s個,總共復制%s個文件" % (len(os.listdir(copy_images_path)), len(os.listdir(copy_txt_path)), len(os.listdir(copy_images_path)) + len(os.listdir(copy_txt_path))))if __name__ == '__main__':# 圖片路徑 #文件名不能包含冒號images_path = 'C:\\Users\\vvcat\\Desktop\\yolov5\\total\\images\\'# txt文件路徑txt_path = 'C:\\Users\\vvcat\\Desktop\\yolov5\\total\\labels\\'# 圖片復制路徑copy_images_path = 'C:\\Users\\vvcat\\Desktop\\yolov5\\neaten\\images\\'# txt文件復制路徑copy_txt_path = 'C:\\Users\\vvcat\\Desktop\\yolov5\\neaten\\labels\\'operation(images_path, txt_path, copy_images_path, copy_txt_path)

總結

以上是生活随笔為你收集整理的Yolov5 使用精灵标注助手制作数据集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。