最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pytorch版本PSEnet訓(xùn)練并部署方式

 更新時(shí)間:2023年05月10日 08:36:39   作者:__JDM__  
這篇文章主要介紹了pytorch版本PSEnet訓(xùn)練并部署方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

概述

源碼地址

torch版本

訓(xùn)練環(huán)境沒有按照torch的readme一樣的環(huán)境,自己部署環(huán)境為:

torch==1.9.1
torchvision==0.10.1
python==3.8.0
cuda==10.2
mmcv==0.2.12
editdistance==0.5.3
Polygon3==3.0.9.1
pyclipper==1.3.0
opencv-python==3.4.2.17
Cython==0.29.24
./compile.sh

制作數(shù)據(jù)集

1、訓(xùn)練的數(shù)據(jù)集

采用的是rolabelimg進(jìn)行標(biāo)注,需要轉(zhuǎn)換為ic2015格式的數(shù)據(jù)。

轉(zhuǎn)換代碼:

import os
from lxml import etree
import numpy as np
import math
src_xml = "ANN"
txt_dir = "gt"
xml_listdir = os.listdir(src_xml)
xml_listpath = [os.path.join(src_xml,xml_listdir1) for xml_listdir1 in xml_listdir]
def xml_out(xml_path):
    gt_lines = []
    ET = etree.parse(xml_path)
    objs = ET.findall("object")
    for ix,obj in enumerate(objs):
        name = obj.find("name").text
        robox = obj.find("robndbox")
        cx = int(float(robox.find("cx").text))
        cy = int(float(robox.find("cy").text))
        w = int(float(robox.find("w").text))
        h = int(float(robox.find("h").text))
        angle = float(robox.find("angle").text)
        # angle = math.degrees(angle1)
        wx1 = cx - int(0.5 * w)
        wy1 = cy - int(0.5 * h)
        wx2 = cx + int(0.5 * w)
        wy2 = cy - int(0.5 * h)
        wx3 = cx - int(0.5 * w)
        wy3 = cy + int(0.5 * h)
        wx4 = cx + int(0.5 * w)
        wy4 = cy + int(0.5 * h)
        x1 = int((wx1 - cx) * np.cos(angle) - (wy1 - cy) * np.sin(angle) + cx)
        y1 = int((wx1 - cx) * np.sin(angle) - (wy1 - cy) * np.cos(angle) + cy)
        x2 = int((wx2 - cx) * np.cos(angle) - (wy2 - cy) * np.sin(angle) + cx)
        y2 = int((wx2 - cx) * np.sin(angle) - (wy2 - cy) * np.cos(angle) + cy)
        x3 = int((wx3 - cx) * np.cos(angle) - (wy3 - cy) * np.sin(angle) + cx)
        y3 = int((wx3 - cx) * np.sin(angle) - (wy3 - cy) * np.cos(angle) + cy)
        x4 = int((wx4 - cx) * np.cos(angle) - (wy4 - cy) * np.sin(angle) + cx)
        y4 = int((wx4 - cx) * np.sin(angle) - (wy4 - cy) * np.cos(angle) + cy)
        lines = str(x1)+","+str(y1)+","+str(x2)+","+str(y2)+","+\
                str(x3)+","+str(y3)+","+str(x4)+","+str(y4)+","+str(name)+"\n"
        gt_lines.append(lines)
        return gt_lines
def main():
    count = 0
    for xml_dir in xml_listdir:
        gt_lines = xml_out(os.path.join(src_xml,xml_dir))
        txt_path = "gt_" + xml_dir[:-4] + ".txt"
        with open(os.path.join(txt_dir,txt_path),"a+") as fd:
            fd.writelines(gt_lines)
        count +=1
        print("Write file %s" % str(count))
if __name__ == "__main__":
    main()

rolabelimg標(biāo)注后的xml文件和labelimg的xml有些區(qū)別,根據(jù)不同的標(biāo)注軟件,轉(zhuǎn)換代碼略有區(qū)別。

轉(zhuǎn)換后的格式為x1,y1,x2,y2,x3,y3,x4,y4,"classes",此處classes為檢測的類別,如果是模糊訓(xùn)練的話,classes為“###”。

但是重點(diǎn),這個(gè)源代碼對于模糊訓(xùn)練,loss一直為1。

2、將數(shù)據(jù)集分成訓(xùn)練集和測試集

數(shù)據(jù)集

這里可以按照源碼路徑存放數(shù)據(jù)集,也可以修改源碼存放位置。

PSENet-python3\dataset\psenet\psenet_ic15.py

修改下述代碼為自己文件夾

3、訓(xùn)練

CUDA_VISIBLE_DEVICES=0,1,2,3 python train.py config/psenet/psenet_r50_ic15_736.py

其中根據(jù)源碼中的readme,

可以根據(jù)自己的需要,自行選擇配置文件。

4、部署測試

import torch
import numpy as np
import argparse
import os
import os.path as osp
import sys
import time
import json
from mmcv import Config
import cv2
from torchvision import transforms
from dataset import build_data_loader
from models import build_model
from models.utils import fuse_module
from utils import ResultFormat, AverageMeter
def prepare_image(image, target_size):
    """Do image preprocessing before prediction on any data.
    :param image:       original image
    :param target_size: target image size
    :return:
                        preprocessed image
    """
    #assert os.path.exists(img), 'file is not exists'
    #img = cv2.imread(img)
    img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    # h, w = image.shape[:2]
    # scale = long_size / max(h, w)
    img = cv2.resize(img, target_size)
    # 將圖片由(w,h)變?yōu)?1,img_channel,h,w)
    tensor = transforms.ToTensor()(img)
    tensor = tensor.unsqueeze_(0)
    tensor = tensor.to(torch.device("cuda:0"))
    return tensor
def report_speed(outputs, speed_meters):
    total_time = 0
    for key in outputs:
        if 'time' in key:
            total_time += outputs[key]
            speed_meters[key].update(outputs[key])
            print('%s: %.4f' % (key, speed_meters[key].avg))
    speed_meters['total_time'].update(total_time)
    print('FPS: %.1f' % (1.0 / speed_meters['total_time'].avg))
def load_model(cfg):
    model = build_model(cfg.model)
    model = model.cuda()
    model.eval()
    checkpoint = "psenet_r50_ic15_1024_finetune/checkpoint_580ep.pth.tar"
    if checkpoint is not None:
        if os.path.isfile(checkpoint):
            print("Loading model and optimizer from checkpoint '{}'".format(checkpoint))
            sys.stdout.flush()
            checkpoint = torch.load(checkpoint)
            d = dict()
            for key, value in checkpoint['state_dict'].items():
                tmp = key[7:]
                d[tmp] = value
            model.load_state_dict(d)
        else:
            print("No checkpoint found at")
            raise
        # fuse conv and bn
    model = fuse_module(model)
    return model
if __name__ == '__main__':
    src_dir = "testimg/"
    save_dir = "test_save/"
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    cfg = Config.fromfile("PSENet/config/psenet/psenet_r50_ic15_1024_finetune.py")
    for d in [cfg, cfg.data.test]:
        d.update(dict(
            report_speed=False
        ))
    if cfg.report_speed:
        speed_meters = dict(
            backbone_time=AverageMeter(500),
            neck_time=AverageMeter(500),
            det_head_time=AverageMeter(500),
            det_pse_time=AverageMeter(500),
            rec_time=AverageMeter(500),
            total_time=AverageMeter(500)
        )
    model = load_model(cfg)
    model.eval()
    count = 0
    for img_name in os.listdir(src_dir):
        img = cv2.imread(src_dir + img_name)
        tensor = prepare_image(img, target_size=(1376, 1024))
        data = dict()
        img_metas = dict()
        data['imgs'] = tensor
        img_metas['org_img_size'] = torch.tensor([[img.shape[0], img.shape[1]]])
        img_metas['img_size'] = torch.tensor([[1376, 1024]])
        data['img_metas'] = img_metas
        data.update(dict(
            cfg=cfg
        ))
        with torch.no_grad():
            outputs = model(**data)
        if cfg.report_speed:
            report_speed(outputs, speed_meters)
        for bboxes in outputs['bboxes']:
            x1 = bboxes[0]
            y1 = bboxes[1]
            x2 = bboxes[4]
            y2 = bboxes[5]
            cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 3)
        count = count + 1
        cv2.imwrite(save_dir + img_name, img)
        print("img test:", count)
from dataset import build_data_loader
from models import build_model
from models.utils import fuse_module
from utils import ResultFormat, AverageMeter

訓(xùn)練代碼里含有。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • Python實(shí)現(xiàn)的基于優(yōu)先等級分配糖果問題算法示例

    Python實(shí)現(xiàn)的基于優(yōu)先等級分配糖果問題算法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的基于優(yōu)先等級分配糖果問題算法,涉及Python針對列表的遍歷、判斷、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • Python如何建立多個(gè)值和單個(gè)鍵的映射

    Python如何建立多個(gè)值和單個(gè)鍵的映射

    在Python中,常見的字典只能映射單個(gè)鍵到單個(gè)值,若需映射單個(gè)鍵到多值,可以通過將值存儲于列表或集合中實(shí)現(xiàn),使用列表可以保持元素插入順序,而使用集合則可以去重,collections模塊的defaultdict類簡化了此類多值字典的創(chuàng)建過程
    2024-09-09
  • 詳解Pytorch中的tensor數(shù)據(jù)結(jié)構(gòu)

    詳解Pytorch中的tensor數(shù)據(jù)結(jié)構(gòu)

    torch.Tensor 是一種包含單一數(shù)據(jù)類型元素的多維矩陣,類似于 numpy 的 array,這篇文章主要介紹了Pytorch中的tensor數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下
    2022-09-09
  • python tkinter 做個(gè)簡單的計(jì)算器的方法

    python tkinter 做個(gè)簡單的計(jì)算器的方法

    這篇文章主要介紹了python tkinter 做個(gè)簡單的計(jì)算器的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python使用PDFMiner解析PDF代碼實(shí)例

    Python使用PDFMiner解析PDF代碼實(shí)例

    本篇文章主要介紹了Python使用PDFMiner解析PDF代碼實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • python 自動(dòng)化辦公之批量修改文件名實(shí)操

    python 自動(dòng)化辦公之批量修改文件名實(shí)操

    這篇文章主要介紹了python 自動(dòng)化辦公之批量修改文件名實(shí)操,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • keras得到每層的系數(shù)方式

    keras得到每層的系數(shù)方式

    這篇文章主要介紹了keras得到每層的系數(shù)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python解決報(bào)錯(cuò)ImportError: Bad git executable.問題

    python解決報(bào)錯(cuò)ImportError: Bad git executable.問題

    這篇文章主要介紹了python解決報(bào)錯(cuò)ImportError: Bad git executable.問題。具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • python爬蟲爬取圖片的簡單代碼

    python爬蟲爬取圖片的簡單代碼

    在本篇文章里小編給大家整理的是一篇關(guān)于python爬蟲爬取圖片的簡單代碼內(nèi)容,有興趣的朋友們可以測試下。
    2021-01-01
  • Python自動(dòng)化完成tb喵幣任務(wù)的操作方法

    Python自動(dòng)化完成tb喵幣任務(wù)的操作方法

    2019雙十一,tb推出了新的活動(dòng),商店喵幣,看了一下每天都有幾個(gè)任務(wù)來領(lǐng)取喵幣,從而升級店鋪賺錢,然而我既想賺紅包又不想干苦力,遂使用python來進(jìn)行手機(jī)自動(dòng)化操作,需要的朋友跟隨小編一起看看吧
    2019-10-10

最新評論

观塘区| 韩城市| 咸阳市| 五常市| 绩溪县| 行唐县| 枝江市| 兰坪| 都江堰市| 朔州市| 南华县| 固始县| 印江| 枣庄市| 依安县| 江门市| 故城县| 南宁市| 安康市| 额济纳旗| 天气| 涞水县| 临泉县| 十堰市| 长武县| 紫金县| 三亚市| 南江县| 长汀县| 北宁市| 房山区| 崇义县| 华宁县| 赤壁市| 呼和浩特市| 通渭县| 兴仁县| 古蔺县| 镇安县| 吉木萨尔县| 济源市|