使用labelImg標注數據的方法


收集完圖片記得逐個審查一遍把垃圾圖片刪掉,后續畫框時候盡量給每幅圖都至少畫上一個框。

一.安裝labelImg

1.下載

https://github.com/tzutalin/labelImg

去github下載zip,解壓之后根據下邊的不同系統使用方法安裝相應的依賴

比如我的是安裝了anaconda的windows系統,我可以按照如下圖片進行操作

 

2.運行方法

 

在cmd中切換到labelImg的安裝目錄下,我的是

f:                                 #切換到f盤
cd F:\software\labelImg-master     #切換到下載目錄
python labelImg.py          #運行labelImg

二、labelImg標注使用方法

https://blog.csdn.net/gaoyu1253401563/article/details/89512098

1、軟件圖標的使用  
(1)打開需要標記的圖片文件夾

               

(2)修改保存路徑(XML文件夾)   

        

(3)標注ROI區域,填寫標簽

      

(4)保存XML文件,有彈框提醒

                   

(5)點擊下一張圖進行標記

      

 

 2、軟件快捷鍵的使用

Ctrl +u :      打開圖片文件夾 
Ctrl +r :       更改結果保存位置 
w:                開始畫框 
Ctrl +s :       保存 
d:               下一張 
a:                上一張 
del:              刪除畫的框 
Ctrl++:         圖片放大 
Ctrl–:          圖片縮小 
↑→↓←:       對框進行移動 
Ctrl+d:      復制當前框的標簽和框

3.具體標注步驟

①運行labelImg(見步驟2)

②修改默認的XML文件保存路徑,使用快捷鍵“Ctrl+R”,改為自己想存儲的位置,一般是新建個Annotations文件來存儲XML文件。 

如果是yolo的模型可以直接點擊下圖位置,生成文件由xml變成txt,yolo模型可以直接使用

 xml模型轉換成yolo模型方法見最后 

 

注:路徑一定不能包含中文,否則無法保存

 

 

③在labelImg文件中,修改源碼文件data/predefined_classes.txt,來修改類別,將默認類別換成我們需要的類別信息,例如person、dog、cat等

 

 

使用python規范化圖片名稱

import os
 
class BatchRename():
 
#定義函數執行圖片的路徑
    def __init__(self):
        self.path = '/home/darknet/scripts/VOCdevkit/VOC2019/JPEGImages'#修改為自己的圖片路徑
 
#定義函數實現重命名操作
    def rename(self):
        filelist = os.listdir(self.path)
        total_num = len(filelist)
        i = 0
        for item in filelist:
            if item.endswith('.jpg'):
                src = os.path.join(os.path.abspath(self.path), item)
                dst = os.path.join(os.path.abspath(self.path), str(i).zfill(6) + '.jpg')
                try:
                    os.rename(src, dst)
                    print('converting %s to %s ...' % (src, dst))
                    i = i + 1
                except:
                    continue
        print ('total %d to rename & converted %d jpgs' % (total_num, i))
 
#主函數調用
if __name__ == '__main__':
    demo = BatchRename()
    demo.rename()

 使用Open Dir按鈕來打開我們索要標注的圖片文件夾JPEGImages,選擇choose,然后打開了第一張需要標注的圖片。

 

 

接下來使用Create\nRectBox按鈕或者“Ctrl+N”來對圖片中需要標注的軟件進行畫框,畫完框,松掉鼠標左鍵,會彈出選擇類別信息的框,選着我們所有標注的類別,然后點擊ok

 

 

以上標注成功,然后等一張圖片的所有目標都標注成功以后,點擊Save保存按鈕,此時就在Annotations文件下生成了一個對應圖片名的XML文件,里面保存了標注信息

 

 

 注:以上是標記過很多張之后生成的XML文件的結果

 對於單張標記好的圖片,打開XML文件,可看到標記信息如下 

 

 等待一張圖片標注完畢后點擊Next Image或者快捷鍵"d"進入下一張圖片進行標注

注意文件放到voc的子目錄下

參考:https://blog.csdn.net/qq_21578849/article/details/84980298

 

划分訓練數據和測試數據

import os
from os import listdir, getcwd
from os.path import join
if __name__ == '__main__':
    source_folder='F:/esint/smoking_Recognition/darknet-master/voc/VOCdevkit/VOC2019/JPEGImages'#地址是所有圖片的保存地點
    dest='F:/esint/smoking_Recognition/darknet-master/voc/VOCdevkit/VOC2019/ImageSets/Main/train.txt'  #保存train.txt的地址,對於train.txt(在ImageSets/Main/下)和2019_train.txt(在VOCdevkit下)是不同的路徑
    dest2='F:/esint/smoking_Recognition/darknet-master/voc/VOCdevkit/VOC2019/ImageSets/Main/val.txt'  #保存val.txt的地址,對於val.txt(在ImageSets/Main/下)和2019_val.txt(在VOCdevkit下)是不同的路徑
    file_list=os.listdir(source_folder)       #賦值圖片所在文件夾的文件列表
    train_file=open(dest,'a')                 #打開文件
    val_file=open(dest2,'a')                  #打開文件
    for file_obj in file_list:                #訪問文件列表中的每一個文件
        file_path=os.path.join(source_folder,file_obj) 
        #file_path保存每一個文件的完整路徑
        file_name,file_extend=os.path.splitext(file_obj)
        #file_name 保存文件的名字,file_extend保存文件擴展名
        file_num=int(file_name)  
        if(file_num<300):                     #保留300個文件用於訓練
            train_file.write(file_name+'\n')  #用於訓練前620個的圖片路徑保存在train.txt里面,結尾加回車換行/////////生成train.txt是file_name;生成2019_train.txt是file_path
        else :
            val_file.write(file_name+'\n')    #其余的文件保存在val.txt里面/////////生成val.txt是file_name;生成2019_val.txt是file_path
    train_file.close()#關閉文件
val_file.close()

 

執行該文件前需要先划分訓練數據和測試數據

將xml文件轉換成txt文件

執行時可能遇到報錯:ZeroDivisionError: float division by zero

原因:部分圖片質量問題,圖片本身大小不能被識別。

解決方法:去label文件夾下查看最后一個txt文件,他的大小是0kb

該文件對應的圖片就是問題圖片,直接查看圖片屬性,將寬高手動寫入文件對應的xml文件中。

 

 

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

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

classes = ["extinguisher"]

def convert(size, box):
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(year, image_id):
    in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
    out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    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 = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()

for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
        os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
    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\n'%(wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM