在實(shí)際生產(chǎn)項(xiàng)目中,為了提升目標(biāo)識別的準(zhǔn)確性,我們往往需要3000-5000張圖片進(jìn)行標(biāo)注。而直接參與過標(biāo)注的人都有一個(gè)共同的感覺,就是標(biāo)注是一個(gè)簡單、枯燥、無聊且十分耗時(shí)費(fèi)力的差事。為此,我們可以在有了初步訓(xùn)練模型的基礎(chǔ)上,采用更加自動化的方式進(jìn)行標(biāo)注,屆時(shí),你講不用每個(gè)照片、每個(gè)目標(biāo)的重復(fù)標(biāo)注,而是直接在現(xiàn)有模型對圖片進(jìn)行識別后的結(jié)果上進(jìn)行調(diào)整標(biāo)注或者新增標(biāo)注。本章節(jié),筆者將重點(diǎn)圍繞使用labelIMG進(jìn)行自動化高效率的標(biāo)注進(jìn)行講解。
1、前期模型準(zhǔn)備
前期,筆者使用約1000張圖片對摩托車、電動自行車頭盔配搭和加裝雨棚進(jìn)行了訓(xùn)練,得到了一個(gè)已經(jīng)初步訓(xùn)練好的模型。暫且將其命名為“best_jx.pt”。下面我們將依托該pt文件模型,對新增的圖片進(jìn)行識別,并導(dǎo)入labelIMG進(jìn)行自動化標(biāo)準(zhǔn),從而非常明顯的提升我們的圖片標(biāo)注工作效率。
相信,當(dāng)你讀到本文時(shí),你也已經(jīng)有了自己的best.pt訓(xùn)練模型文件,大家可以直接套用本文檔的步驟。
2、編寫圖片識別腳本程序
當(dāng)你的圖片文件夾中已經(jīng)有了上千張最新的圖片后,我們現(xiàn)在要做的就是編寫代碼,調(diào)用前期你已經(jīng)生成的pt文件,將文件夾中的圖片逐一進(jìn)行識別。唯一不同的是,本次我們不光是要識別,還需要將識別的結(jié)果以標(biāo)簽的形式存為txt文檔。這個(gè)功能YOLO V8已經(jīng)在程序中實(shí)現(xiàn)了,我們只需要直接調(diào)用。
2.1 圖片標(biāo)簽生成程序
具體代碼示例如下:
from ultralytics import YOLO
import os
import glob
import threading
# 加載現(xiàn)有的xxx.pt模型
model = YOLO("E:/pyCharmProject/pythonProjectDetection/best_jx.pt")
# 指定圖片文件夾的路徑
image_folder = "E:/pyCharmProject/DetectionProjectHelmetRainshield/20230817pan1IMG/imgs/"
#本函數(shù)為調(diào)用YOLO V8的predict方法,進(jìn)行識別,并將其存為txt格式的標(biāo)簽文件
def auto_get_img_tag(image_path):
results = model.predict(source=image_path, save_txt=True)
print('done..........',image_path)
return results
# 對每張圖片進(jìn)行預(yù)測,并保存標(biāo)簽文件
for image_path in glob.glob(image_folder + "*.jpg"):
# 對圖片進(jìn)行預(yù)測,并保存標(biāo)簽文件
results = model.predict(source=image_path, save_txt=True)
print('done..........', image_path)
print('done.....................overall')
上述函數(shù)中使用了model.predict()方法,其與筆者之前直接使用的model()方法有所不同。
result = model(source) 是一個(gè)低級的 API,它直接調(diào)用了模型的 forward 方法,返回一個(gè) Results 對象,其中包含了模型的原始輸出,例如預(yù)測的類別、置信度、邊界框坐標(biāo)等。這個(gè) API 適合那些想要對模型的輸出進(jìn)行自定義處理的高級用戶,但是它不會執(zhí)行任何后處理或保存操作,也不會考慮任何預(yù)測參數(shù),例如圖像大小、置信度閾值等。
result=model.predict(source) 是一個(gè)高級的 API,它封裝了模型的 forward 方法,并且執(zhí)行了一些后處理和保存操作,例如非極大值抑制、標(biāo)簽文件生成、結(jié)果可視化等。這個(gè) API 適合那些想要快速得到預(yù)測結(jié)果的普通用戶,但是它需要指定一些預(yù)測參數(shù),例如圖像大小、置信度閾值、保存目錄等。這些參數(shù)可以在調(diào)用 predict 方法時(shí)傳入,也可以在配置文件中設(shè)置。
總之,result = model(source) 和 result=model.predict(source) 的區(qū)別在于前者返回的是模型的原始輸出,后者返回的是模型的后處理輸出。前者更靈活,但需要用戶自己處理結(jié)果;后者更方便,但需要用戶指定參數(shù)。你可以根據(jù)你的需求選擇合適的 API。
#2.2 并發(fā)實(shí)現(xiàn)圖片標(biāo)簽生成程序
當(dāng)我們圖片很多的時(shí)候,我們就需要使用高并發(fā)的形式實(shí)現(xiàn)。示例代碼如下。
from ultralytics import YOLO
import glob
from concurrent.futures import ThreadPoolExecutor
# 加載現(xiàn)有的xxx.pt模型
model = YOLO("E:/pyCharmProject/pythonProject1Chu/best_jiangxi.pt")
# 指定圖片文件夾的路徑
image_folder = "E:/pyCharmProject/DetectionProjectHelmetRainshield/20230817pan1IMG/imgs/"
# 本函數(shù)為調(diào)用YOLO V8的predict方法,進(jìn)行識別,并將其存為txt格式的標(biāo)簽文件
def auto_get_img_tag(image_path):
results = model.predict(source=image_path, save_txt=True)
print('done..........', image_path)
return results
# 創(chuàng)建一個(gè)線程池,指定最大線程數(shù)為4
pool = ThreadPoolExecutor(max_workers=4)
# 對每張圖片進(jìn)行預(yù)測,并保存標(biāo)簽文件
for image_path in glob.glob(image_folder + "*.jpg"):
# 使用map方法將函數(shù)和參數(shù)傳遞給線程池
pool.map(auto_get_img_tag, [image_path])
# 等待所有線程完成
pool.shutdown(wait=True)
print('done.....................overall')
為了讓代碼支持并發(fā),筆者創(chuàng)建一個(gè)線程池,使用ThreadPoolExecutor類來管理多個(gè)線程,并使用map方法來將您的函數(shù)應(yīng)用到每個(gè)圖片路徑上。這樣,就可以同時(shí)處理多張圖片,并保存標(biāo)簽文件。
3、生成所需打標(biāo)簽圖片的label文件
運(yùn)行上述代碼后,你該程序py腳本文件的根目錄看到一個(gè)新的文件夾,名稱為run,每張圖片生成的label文件就在這個(gè)文件夾中,具體的存儲路徑為:
\runs\detect\predict\labels
其生成的文件進(jìn)入下圖所示:
當(dāng)我們將生成的文本,與導(dǎo)入上述識別腳本程序的圖片比較,可以發(fā)現(xiàn),txt標(biāo)簽文件的名稱與圖片的名稱是一一對應(yīng)的。
至此,我們就已經(jīng)通過編寫的腳本程序,實(shí)現(xiàn)了對要逐個(gè)打標(biāo)簽的圖片進(jìn)行預(yù)處理的工作了,下部就可以將其導(dǎo)入labelIMG進(jìn)行自動化的打標(biāo)簽操作了。
4、準(zhǔn)備“class.txt”文件
我們知道,labelIMG工具在對圖片打標(biāo)簽后,會在輸出label的txt文檔目錄文件夾中,同步生成一個(gè)class.txt文件,按順序記錄所有標(biāo)簽內(nèi)容。為此,我們?yōu)榱藢?shí)現(xiàn)自動化的標(biāo)簽識別,也需要提前準(zhǔn)備好class.txt文件,并提前存放在標(biāo)簽輸出目錄內(nèi)。
正常來說,我們根據(jù)要打標(biāo)簽的內(nèi)容,肯定是知道class.txt中具體要寫什么標(biāo)簽的,如下圖所示:
但值得我們非常需要注意的一點(diǎn)是!按照labelIMG生成class.txt文件的邏輯,文件中各個(gè)標(biāo)簽的順序默認(rèn)是根據(jù)在所有圖片中,首次打上這個(gè)標(biāo)簽的順序來的。比如我們對這些圖片進(jìn)行打標(biāo)簽操作時(shí),第一個(gè)打的是nohelmet,那么nohelmet會出現(xiàn)在第一行。
由于圖片的量太大,我們很難由一個(gè)人一次打完,或者很難統(tǒng)籌每個(gè)人都是按同樣的標(biāo)簽順序進(jìn)行標(biāo)注。為此,在laeblIMG工具中,有一個(gè)預(yù)先設(shè)置標(biāo)簽的功能。也就是我們可以在以下目錄venv/Lib/site-packages/labelImg/data,找到predefined_classes.txt文件。在這個(gè)文件中,我們可以提前設(shè)置好所有的標(biāo)簽類型和標(biāo)簽順序,這樣labelIMG在進(jìn)行打標(biāo)簽的時(shí)候,就不需要每次出現(xiàn)新的標(biāo)簽就需要手動輸入的情況,而是可以在所有預(yù)先設(shè)置好的標(biāo)簽選項(xiàng)中進(jìn)行選擇。如下圖所示,筆者已經(jīng)預(yù)先設(shè)置了5個(gè)標(biāo)簽,并明確了其順序。
我們在實(shí)際項(xiàng)目中,可以直接將predefined_classes.txt中預(yù)先設(shè)定的標(biāo)簽內(nèi)容直接復(fù)制到class.txt文件中。從而確保我們?yōu)閘abelIMG工具提前準(zhǔn)備的class.txt文件沒有錯(cuò)誤,從而不會出現(xiàn)工具中途卡死、閃退,造成需要重新打標(biāo)簽的情況。
5、將需打標(biāo)簽的圖片、預(yù)先生成的label文本和class.txt文件存入指定文件夾目錄
我們知道,當(dāng)我們在pycharm的terminal命令行窗口輸入labelIMG命令后,程序?qū)⒆詣訂觢abelIMG工具,如下圖所示。
啟動labelIMG工具后,我們首先要指定“Open Dir”和"Change Save Dir",如下圖所示。也就是說,設(shè)定好我們讀取圖片的文件夾,和將生成的label文件存放的文件夾。
由于我們前期已經(jīng)通過腳本程序預(yù)先生成了label文件,我們就可以理解為是電腦用我們的前期訓(xùn)練的模型,幫我們使用這個(gè)工具對所有圖片進(jìn)行了標(biāo)注,并生成了對應(yīng)的label文件,我們現(xiàn)在需要做的只是逐一圖片的檢查其標(biāo)注情況是否準(zhǔn)確,如果發(fā)現(xiàn)不準(zhǔn)確或者遺漏的,我們可以在labelIMG工具中再進(jìn)行手動調(diào)整。
當(dāng)我們明確了上面的思路,便可清晰的知道我們需要做標(biāo)注的圖片和生成的label文件以及class.txt文件需要存放的路徑了。
6、開始高效圖片標(biāo)注工作
在本例子中,筆者將圖片存放于以下文件夾目錄:E:\測試\img,將label文件和class.txt文件存放于以下文件夾目錄:E:\測試\label。因此,我們在labelIMG工具中按照上圖所示,選擇完成后,便可發(fā)現(xiàn)我們打開的圖片已經(jīng)有了相關(guān)的標(biāo)注情況。只需要我們手動檢查或調(diào)整就可以了。如下圖所示:文章來源:http://www.zghlxwxcb.cn/news/detail-660481.html
在這里,我們便可以逐一對目標(biāo)進(jìn)行該檢查,對識別錯(cuò)誤的,我們可以點(diǎn)擊目標(biāo)右鍵,重新編輯標(biāo)簽屬性,重新編輯保存的label文檔,和直接生成的文檔,效果是一樣的。如下圖所示:
我們完成所有圖片的標(biāo)注審核和修改工作后,便可直接在E:\測試\label目錄下,獲取最新的label文件了。這些文件以及配套的圖片文件,還有我們提前生成的class.txt文件,都需要進(jìn)一步拷貝到用來做YOLO v8訓(xùn)練使用。這一點(diǎn)就和正常操作步驟沒有任何不同了。文章來源地址http://www.zghlxwxcb.cn/news/detail-660481.html
到了這里,關(guān)于標(biāo)簽準(zhǔn)備——labelIMG工具使用——自動化標(biāo)注的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!