基于Yolov5與LabelMe訓練自己數據的圖像分割完整流程

基于Yolov5與LabelMe訓練自己數據的實例分割完整流程

    • 1. Yolov5配置
    • 2. 創建labelme虛擬環境
    • 4. 接下來開始使用labelme繪制分割數據集
      • 4.1 json to txt
      • 4.2 劃分數據集(可分可不分)
    • 5. 訓練

1. Yolov5配置

參照這邊文章:

https://blog.csdn.net/ruotianxia/article/details/132262747?spm=1001.2014.3001.5502

yolov5 各模型的百度網盤鏈接:

鏈接:https://pan.baidu.com/s/1ryXteXqMXCDy4V9dWqCmzw 提取碼:ca3x

2. 創建labelme虛擬環境

conda create -n labelme python=3.9
# 激活labelme 環境,后續的安裝都在里面進行
conda activate labelme
# 下載label代碼
git clone https://github.com/wkentaro/labelme.git
cd labelme
conda install -c conda-forge pyside2   # 這條一定要安裝
pip install .
pip install pyinstaller
pyinstaller labelme.spec
# 編譯完成后,再cmd中輸入
labelme
即可打卡# 不從源碼安裝的話,直接按照官網上給的提示安裝就行,不用這么麻煩
# 安裝完成

在這里插入圖片描述
在這里插入圖片描述

如果有些因為網絡差下不下來,可以一個一個的安裝

# 網絡不好的情況下,安裝會出現中斷,將中斷處的依賴庫單獨使用清華鏡像下載,然后再繼續執行上一句
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyQt5-Qt5
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple networkx
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyWavelets
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple onnxruntime
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit_image

4. 接下來開始使用labelme繪制分割數據集

操作比較簡單,這里就不多說了,其保存的是json格式,需要轉換成yolo需要的txt.
在這里插入圖片描述

4.1 json to txt

https://blog.csdn.net/m0_51530640/article/details/129975257 參考文章

# -*- coding: utf-8 -*-
import json
import os
import argparse
from tqdm import tqdmdef convert_label_json(json_dir, save_dir, classes):json_paths = os.listdir(json_dir)classes = classes.split(',')for json_path in tqdm(json_paths):# for json_path in json_paths:path = os.path.join(json_dir, json_path)with open(path, 'r') as load_f:json_dict = json.load(load_f)h, w = json_dict['imageHeight'], json_dict['imageWidth']# save txt pathtxt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))txt_file = open(txt_path, 'w')for shape_dict in json_dict['shapes']:label = shape_dict['label']label_index = classes.index(label)points = shape_dict['points']points_nor_list = []for point in points:points_nor_list.append(point[0] / w)points_nor_list.append(point[1] / h)points_nor_list = list(map(lambda x: str(x), points_nor_list))points_nor_str = ' '.join(points_nor_list)label_str = str(label_index) + ' ' + points_nor_str + '\n'txt_file.writelines(label_str)if __name__ == "__main__":"""python json2txt_nomalize.py --json-dir my_datasets/color_rings/jsons --save-dir my_datasets/color_rings/txts --classes "cat,dogs""""classes_name = 'scratch,dirty'  # 中間不能帶空格parser = argparse.ArgumentParser(description='json convert to txt params')parser.add_argument('--json-dir', type=str, default='voc_dataset/seg_labels_json', help='json path dir')parser.add_argument('--save-dir', type=str, default='voc_dataset/seg_labels_txt', help='txt save dir')parser.add_argument('--classes', type=str, default=classes_name, help='classes')args = parser.parse_args()json_dir = args.json_dirsave_dir = args.save_dirclasses = args.classesconvert_label_json(json_dir, save_dir, classes)

在這里插入圖片描述

4.2 劃分數據集(可分可不分)

https://blog.csdn.net/m0_51530640/article/details/129975257 參考文章

# 將圖片和標注數據按比例切分為 訓練集和測試集
import shutil
import random
import os
import argparse# 檢查文件夾是否存在
def mkdir(path):if not os.path.exists(path):os.makedirs(path)def main(image_dir, txt_dir, save_dir):# 創建文件夾mkdir(save_dir)images_dir = os.path.join(save_dir, 'images')labels_dir = os.path.join(save_dir, 'labels')img_train_path = os.path.join(images_dir, 'train')img_test_path = os.path.join(images_dir, 'test')img_val_path = os.path.join(images_dir, 'val')label_train_path = os.path.join(labels_dir, 'train')label_test_path = os.path.join(labels_dir, 'test')label_val_path = os.path.join(labels_dir, 'val')mkdir(images_dir);mkdir(labels_dir);mkdir(img_train_path);mkdir(img_test_path);mkdir(img_val_path);mkdir(label_train_path);mkdir(label_test_path);mkdir(label_val_path);# 數據集劃分比例,訓練集75%,驗證集15%,測試集15%,按需修改train_percent = 0.8val_percent = 0.1test_percent = 0.1total_txt = os.listdir(txt_dir)num_txt = len(total_txt)list_all_txt = range(num_txt)  # 范圍 range(0, num)num_train = int(num_txt * train_percent)num_val = int(num_txt * val_percent)num_test = num_txt - num_train - num_valtrain = random.sample(list_all_txt, num_train)# 在全部數據集中取出trainval_test = [i for i in list_all_txt if not i in train]# 再從val_test取出num_val個元素,val_test剩下的元素就是testval = random.sample(val_test, num_val)print("訓練集數目:{}, 驗證集數目:{},測試集數目:{}".format(len(train), len(val), len(val_test) - len(val)))for i in list_all_txt:name = total_txt[i][:-4]srcImage = os.path.join(image_dir, name + '.bmp')srcLabel = os.path.join(txt_dir, name + '.txt')if i in train:dst_train_Image = os.path.join(img_train_path, name + '.bmp')dst_train_Label = os.path.join(label_train_path, name + '.txt')shutil.copyfile(srcImage, dst_train_Image)shutil.copyfile(srcLabel, dst_train_Label)elif i in val:dst_val_Image = os.path.join(img_val_path, name + '.bmp')dst_val_Label = os.path.join(label_val_path, name + '.txt')shutil.copyfile(srcImage, dst_val_Image)shutil.copyfile(srcLabel, dst_val_Label)else:dst_test_Image = os.path.join(img_test_path, name + '.bmp')dst_test_Label = os.path.join(label_test_path, name + '.txt')shutil.copyfile(srcImage, dst_test_Image)shutil.copyfile(srcLabel, dst_test_Label)if __name__ == '__main__':"""python split_datasets.py --image-dir my_datasets/color_rings/imgs --txt-dir my_datasets/color_rings/txts --save-dir my_datasets/color_rings/train_data"""parser = argparse.ArgumentParser(description='split datasets to train,val,test params')parser.add_argument('--image-dir', type=str, default='voc_dataset/seg_images', help='image path dir')parser.add_argument('--txt-dir', type=str, default='voc_dataset/seg_labels_txt', help='txt path dir')parser.add_argument('--save-dir', default='voc_dataset/split', type=str, help='save dir')args = parser.parse_args()image_dir = args.image_dirtxt_dir = args.txt_dirsave_dir = args.save_dirmain(image_dir, txt_dir, save_dir)

在這里插入圖片描述

5. 訓練

訓練可以直接運行segment中的train,需要修改下文件的路徑,根據自己的需要進行修改。
注意需要再train.py的目錄下放置一個detection 訓練模型。
如果沒有分割好的數據集,代碼會自動下載coco128-seg。可以先熟悉下各文件的分布和訓練流程。

my-yolov5x-seg.yaml 修改類別數量
my-coco128-seg.yaml   修改數據路徑,類別名稱
hyp.scratch-low.yaml   修改訓練參數
    parser.add_argument('--weights', type=str, default=ROOT / 'weights/best.pt', help='initial weights path')parser.add_argument('--cfg', type=str, default=ROOT / 'models/segment/my-yolov5x-seg.yaml', help='model.yaml path')parser.add_argument('--data', type=str, default=ROOT / 'data/my-coco128-seg.yaml', help='dataset.yaml path')parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')

在這里插入圖片描述
配置好后,直接運行trainpy就可以了。預測的話在predict中,同樣修改下文件路徑就可以預測圖片的結果。

在這里插入圖片描述
predict.py 需要修改的內容如下:
在這里插入圖片描述
預測時可以修改以下兩個參數,一個是置信度閾值,一個是iou閾值:

parser.add_argument('--conf-thres', type=float, default=0.006, help='confidence threshold')
parser.add_argument('--iou-thres', type=float, default=0.1, help='NMS IoU threshold')

下面的是coco128訓練出的結果:
在這里插入圖片描述

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

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

相關文章

okcc對接ASR平臺,okcc客戶投訴的安全問題

客戶投訴: 客戶為什么要投訴?實際上分為兩種情況,一是客戶被冒犯到不能容忍導致的投訴,二是惡意投訴。降低客戶被冒犯投訴的概率,無非就是選擇客戶、規范用語、降低頻度;減少惡意投訴,回避是實踐證明最有效…

前端= 結構(HTML)+ 樣式(CSS)+ 行為(JavaScript)

前端開發確實涵蓋了行為(JavaScript)、樣式(CSS)和結構(HTML)這三個主要方面。這三個方面在前端開發中密切協作,共同構建用戶界面和用戶體驗。 結構(Structure)&#xff…

java # Servlet

一、什么是Servlet? Servlet是javaEE規范之一。規范就是接口。JavaWeb三大組件分別是:Servlet程序、Filter過濾器、Listener監聽器。Servlet是運行在服務器上的一個Java小程序,它可以接收客戶端發送來的請求,并響應數據給客戶端。…

Django筆記之中間件介紹

這一節介紹一下 Django 的中間件。 關于中間件,官方文檔的解釋為:中間件是一個嵌入 Django 系統的 request 和 response 的鉤子框架,是一個能夠全局改變 Django 輸入/輸出的系統。 我們可以這樣理解,一個 request 請求發送到 Dj…

《C語言深度解剖》.pdf

🐇 🔥博客主頁: 云曦 📋系列專欄:深入理解C語言 💨吾生也有涯,而知也無涯 💛 感謝大家👍點贊 😋關注📝評論 C語言深度解剖.pdf 提取碼:yunx

KCC@深圳開源讀書會即將舉辦,來與行業大咖面對面交流

KCC,全稱 KAIYUANSHE City Community(中文:開源社城市社區)是由開源社發起,旨在讓開源社區在每個城市落地生根的地域性開源組織。 自2023年2月份發起以來,我們已經在南京、上海、深圳、北京、硅谷、新加坡、…

iTOP-3568開發板使用OpenCV處理圖像-顏色轉換

本小節代碼在配套資料“iTOP-3568 開發板\03_【iTOP-RK3568 開發板】指南教程 \04_OpenCV 開發配套資料\05”目錄下,如下圖所示: cv2.cvtColor()函數功能: 將一幅圖像從一個色彩空間轉換到另一個色彩空間。 函數原型: cv2.cvt…

日常BUG—— maven編譯報錯

&#x1f61c;作 者&#xff1a;是江迪呀??本文關鍵詞&#xff1a;日常BUG、BUG、問題分析??每日 一言 &#xff1a;存在錯誤說明你在進步&#xff01; 一、問題描述 一個maven項目在由于在代碼中書寫了如下代碼&#xff1a; public static ConcurrentMap<…

DatenLord X Segmentfault直播預告 l CURP協議的工業化實踐

CURP協議 傳統單數據中心解決方案無法滿足跨數據中心的場景對性能和一致性的需求。DatenLord推出開源的分布式KV存儲Xline&#xff0c;針對多數據中心場景&#xff0c;實現數據的高性能跨云、跨數據中心共享訪問&#xff0c;并且保證數據的一致性&#xff0c;方便業務系統實現…

Nginx之lnmp架構

目錄 一.什么是LNMP二.LNMP環境搭建1.Nginx的搭建2.安裝php3.安裝數據庫4.測試Nginx與PHP的連接5.測試PHP連接數據庫 一.什么是LNMP LNMP是一套技術的組合&#xff0c;Llinux&#xff0c;Nnginx&#xff0c;Mmysql&#xff0c;Pphp 首先Nginx服務是不能處理動態資源請求&…

Android app專項測試之耗電量測試

前言 耗電量指標 待機時間成關注目標 提升用戶體驗 通過不同的測試場景&#xff0c;找出app高耗電的場景并解決 01、需要的環境準備 1、python2.7(必須是2.7&#xff0c;3.X版本是不支持的) 2、golang語言的開發環境 3、Android SDK 此三個的環境搭建這里就不詳細說了&am…

如何使用CSS實現一個純CSS的滾動條樣式?

聚沙成塔每天進步一點點 ? 專欄簡介? 使用CSS實現自定義滾動條樣式? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&#xff01;這個專欄是為那些對Web開發感興趣…

【數理知識】三維空間旋轉矩陣的歐拉角表示法,四元數表示法,兩者之間的轉換,Matlab 代碼實現

序號內容1【數理知識】自由度 degree of freedom 及自由度的計算方法2【數理知識】剛體 rigid body 及剛體的運動3【數理知識】剛體基本運動&#xff0c;平動&#xff0c;轉動4【數理知識】向量數乘&#xff0c;內積&#xff0c;外積&#xff0c;matlab代碼實現5【數理知識】最…

用Node.js吭哧吭哧擼一個運動主頁

簡單嘮嘮 某乎問題&#xff1a;人這一生&#xff0c;應該養成哪些好習慣&#xff1f; 問題鏈接&#xff1a;https://www.zhihu.com/question/460674063 如果我來回答肯定會有定期運動的字眼。 平日里也有煅練的習慣&#xff0c;時間久了后一直想把運動數據公開&#xff0c;…

火山引擎DataLeap的Data Catalog系統公有云實踐

更多技術交流、求職機會&#xff0c;歡迎關注字節跳動數據平臺微信公眾號&#xff0c;回復【1】進入官方交流群 Data Catalog是一種元數據管理的服務&#xff0c;會收集技術元數據&#xff0c;并在其基礎上提供更豐富的業務上下文與語義&#xff0c;通常支持元數據編目、查找、…

自然數的拆分問題

題目描述 任何一個大于 11 的自然數 n&#xff0c;總可以拆分成若干個小于 n 的自然數之和。現在給你一個自n&#xff0c;要求你求出 n 的拆分成一些數字的和。每個拆分后的序列中的數字從小到大排序。然后你需要輸出這些序列&#xff0c;其中字典序小的序列需要優先輸出。 輸…

搭建openGauss 5.0 一主一從復制集群

openGauss是一款支持SQL2003標準語法&#xff0c;支持主備部署的高可用關系型國產數據庫。 多種存儲模式支持復合業務場景&#xff0c;新引入提供原地更新存儲引擎。NUMA化數據結構支持高性能。Paxos一致性日志復制協議&#xff0c;主備模式&#xff0c;CRC校驗支持高可用。支…

設置返回列表元素上限

我正在「拾陸樓」和朋友們討論有趣的話題&#xff0c;你?起來吧&#xff1f;拾陸樓知識星球入口 在get_cell &#xff0c;get_nets&#xff0c;get_xx等操作時返回的值上限是100&#xff0c;后面的就用...省略了&#xff0c;如果要修改這個上限&#xff0c;需要用下面命令: s…

設計模式之七大原則

&#x1f451;單一職責原則 單一職責原則告訴我們一個類應該只有一個責任或者只負責一件事情。 想象一下&#xff0c;如果一個類承擔了太多的責任&#xff0c;就像一個人同時負責做飯、洗衣服和打掃衛生一樣&#xff0c;那么這個類會變得非常復雜&#xff0c;難以理解和維護。而…

一些Git Repo

文章目錄 Fake-TcpWow Fishing Script模擬券商柜臺 Fake-Tcp Fake-Tcp 自己寫的一個偽裝包測試。 嘗試把UDP的包偽裝成TCP包&#xff0c;再發送到Internet Wow Fishing Script 魔獸世界釣魚腳本 自己寫的魔獸世界釣魚腳本&#xff0c;10.0初期釣魚成功率90%以上。現在關服了…