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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

模型训练测试之三:yolov5 模型训练及windows部署(一)

發(fā)布時間:2023/12/31 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模型训练测试之三:yolov5 模型训练及windows部署(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、項目背景

本想寫項目,但被說了,所以,沒了。

本項目基于Pytorch版本的yolov5實現xxxx識別。

2、網絡結構介紹

? Pytorch版本的yolov5的模型介紹,估計網上一大堆,要想看源碼或者原始模型介紹,可自行百度。如果需要pdf版本(自己不想找),私信我即可。

3、模型訓練

? 源碼下載:https://github.com/ultralytics/yolov5.git

3.1 源碼目錄主要部分介紹:
  • 環(huán)境配置

    conda activate yolov5 pip install -r requirements.txt

    如果anaconda官方源安裝速度較慢,可指定源進行安裝,如

    pip install -r requirements.txt -i https://pypi.doubanio.com 豆瓣源
  • data文件夾(創(chuàng)建自己的訓練文件)

  • datasets文件夾(創(chuàng)建自己的訓練數據集)

3.2 數據集準備

? 舉例:

  • 準備10000張圖片,及對應的xml文件,存放于 images里面即可;

  • 使用convert_data.py,將其放在項目根目錄下,運行對數據集進行處理,生成滿足yolov5訓練的格式,

    # -*- coding: utf-8 -*- import xml.etree.ElementTree as ET from tqdm import tqdm import os from os import getcwd# 重點是下面這塊代碼,即將box = [xmin, ymin, xmax, ymax] -> [x_center, y_center, width, height] def convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1 # 求中心點坐標x, yy = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0] # 求寬度,高度h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn x, y, w, hdef convert_annotation(image_id, project_name):# 自己可選擇是否添加異常處理,此處注釋# try:# 打開對應圖片xml文件in_file = open('datasets/{}/images/{}.xml'.format(project_name, image_id), encoding='utf-8')# 創(chuàng)建對應圖片txt文件out_file = open('datasets/{}/labels/{}.txt'.format(project_name, image_id), 'w', encoding='utf-8')tree = ET.parse(in_file) # 解析xmlroot = tree.getroot()size = root.find('size')w = int(size.find('width').text) # 獲取高寬h = int(size.find('height').text)# 讀取xml中各個object的bbox信息for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_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))b1, b2, b3, b4 = b# 標注越界修正if b2 > w:b2 = wif b4 > h:b4 = hb = (b1, b2, b3, b4) # 得到某一個object的bbox信息bb = convert((w, h), b) # 進行轉換out_file.write(str(cls_id) + " " +" ".join([str(a) for a in bb]) + '\n')# except Exception as e:# print(e, image_id)if __name__ == '__main__':# 自定義修改project_names = {"coco_xxxx_ocr": ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' , 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],}project_name = 'coco_xxxx_ocr'sets = ['train', 'val']# 獲取images里的所有圖片的序號image_ids = [v.split('.')[0]for v in os.listdir('datasets/{}/images/'.format(project_name)) if v.endswith('.xml')]import randomrandom.shuffle(image_ids) # 打亂數據集split_num = int(0.95 * len(image_ids)) # 劃分數據集classes = project_names[project_name] # 獲取對應數據集的標簽列表# 創(chuàng)建轉換之后的txt文件存放路徑labelsif not os.path.exists('datasets/{}/labels/'.format(project_name)):os.makedirs('datasets/{}/labels/'.format(project_name))# 創(chuàng)建train2017.txtlist_file = open('datasets/{}/train2017.txt'.format(project_name), 'w')for image_id in tqdm(image_ids[:split_num]):# 此處是對所有類型圖片機型智能化區(qū)分,有bmp、jpgif os.path.exists('datasets/{}/images/{}.bmp'.format(project_name, image_id)):list_file.write('datasets/{}/images/{}.bmp\n'.format(project_name, image_id))elif os.path.exists('datasets/{}/images/{}.jpg'.format(project_name, image_id)):list_file.write('datasets/{}/images/{}.jpg\n'.format(project_name, image_id))# 轉換convert_annotation(image_id, project_name)list_file.close()# 創(chuàng)建val2017.txtlist_file = open('datasets/{}/val2017.txt'.format(project_name), 'w')for image_id in tqdm(image_ids[split_num:]):if os.path.exists('datasets/{}/images/{}.bmp'.format(project_name, image_id)):list_file.write('datasets/{}/images/{}.bmp\n'.format(project_name, image_id))elif os.path.exists('datasets/{}/images/{}.jpg'.format(project_name, image_id)):list_file.write('datasets/{}/images/{}.jpg\n'.format(project_name, image_id))convert_annotation(image_id, project_name)list_file.close()

    完成數據轉換,即在同名數據集下,

    1)自動生成labels文件夾,里面包含對應圖片的txt文件。如下:

2)train2017.txt、val2017.txt、test2017.txt

? 如下所示,每一行為每一張圖片的路徑,可絕對,可相對,建議絕對 該py文件,其實滿足所有yolo系列的數據集處理。

  • 開始訓練

    python train.py --img 640 --batch 4 --epoch 300 --data .\data\coco_xxxx_ocr.yaml --cfg .\models\yolov5m.yaml --weights .\weights\yolov5m.pt --workers 0

訓練報錯處理1:

OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hi.......在train.py文件開頭添加幾行代碼,如下,即可解決 import os os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
  • 模型測試1(單張圖片)
python detect.py --weights ..\runs\train_xxxx_ocr\exp6\weights\best.pt --source ..\test\xxxxxxxxxxx.jpg

  • 模型測試2(批量測試,生成對應txt)

    test.py 文件里

    --task 測試文件中的任務選項,有train、val、test,對應yaml文件中的三個有train2017.txt\val2017.txt\test2017.txt路徑,如果沒有txt文件,根據你的測試圖片路徑創(chuàng)建,然后在yaml文件中進行修改 --data 和訓練代碼中的類似,--data .\data\coco_xxxx_ocr.yaml --weights 訓練出來的模型路ing ..\runs\train_xxxx_ocr\exp6\weights\best.pt --batch_size 測試批次大小,取決于自己的電腦配置 --imgsz 測試圖片resize大小,和訓練時匹配一致即可 --device 0,1,2,3..... 或者cpu --save-txt 是否對應圖片結果保存txt文件python test.py --weights ..\runs\train_xxxx_ocr\exp6\weights\best.pt --data .\data\coco_xxxx_ocr.yaml

總結

以上是生活随笔為你收集整理的模型训练测试之三:yolov5 模型训练及windows部署(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

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