30分钟吃掉YOLOv8实例分割范例

news2024/12/22 22:16:46

本范例我们使用 torchkeras来实现对 ultralytics中的YOLOv8实例分割模型进行自定义的训练,从而对气球进行检测和分割。

尽管ultralytics提供了非常便捷且一致的训练API,再使用torchkeras实现自定义训练逻辑似乎有些多此一举。

但ultralytics的源码结构相对复杂,不便于用户做个性化的控制和修改。

并且,torchkeras在可视化上会比ultralytics的原生训练代码优雅许多。

不信的话,我们对比看看就明白啦。

d7c76d28d397006bfb2eb10a1ecf0a7a.png

此外,本文的内容对同学们熟悉ultralytics这个库的代码结构也会有帮助。

😋😋公众号算法美食屋后台回复关键词:torchkeras,获取本文notebook源代码和balloon数据集下载链接。

〇,预测过程

from ultralytics import YOLO 
model = YOLO('yolov8n-seg.pt')
import numpy as np 
from PIL import Image
img_path = 'park.jpg'
try:
    img = Image.open(img_path)
except Exception as err:
    from torchkeras.data import get_example_image 
    img = get_example_image(img_path)
    img.save(img_path)
#可以保存预测结果以及可视化图片
result = model.predict(source=img_path, save=True, 
                       save_txt=True, conf = 0.3)
from pathlib import Path 
import ultralytics
from ultralytics.data import utils 
yaml_path = str(Path(ultralytics.__file__).parent/'cfg/datasets/coco128-seg.yaml') 
class_names = utils.yaml_load(yaml_path)['names']
from torchkeras import plots 

boxes = result[0].boxes.data
masks = result[0].masks.data
plots.plot_instance_segmentation(img,boxes,masks,class_names)

843998bccc60c972dc1c27fbfdce5c1a.png

一,准备数据

训练yolo实例分割模型需要将数据集整理成yolo数据集格式。

yolo_dataset
├── images
│   ├── train
│   │   ├── train0.jpg
│   │   └── train1.jpg
│   ├── val
│   │   ├── val0.jpg
│   │   └── val1.jpg
│   └── test
│       ├── test0.jpg
│       └── test1.jpg
└── labels
    ├── train
    │   ├── train0.txt
    │   └── train1.txt
    ├── val
    │   ├── val0.txt
    │   └── val1.txt
    └── test
        ├── test0.txt
        └── test1.txt

对于实例分割模型,标签文件(如train0.txt)格式如下:

class_id point1(x,y) point2(x,y) point3(x,y) point4(x,y),...
8 0.417781 0.771355 0.440328 0.735397 0.467375 0.658995 0.440328 0.605047 0.387719 0.524159 0.378703 0.443248 0.333625 0.436519 0.371188 0.375841 0.335125 0.364603 0.350156 0.315164 0.320094 0.299439 0.320094 0.256752 0.327609 0.198318 0.357672 0.184836 0.39825 0.155607 0.498937 0.139883 0.470375 0.0724766 0.513953 0.117407 0.553031 0.083715 0.608641 0.115164 0.67175 0.173598 0.704812 0.184836 0.710828 0.211799 0.707828 0.232033 0.718344 0.263481 0.713828 0.308435 0.707828 0.348879 0.691297 0.398318 0.676266 0.416285 0.673266 0.476963 0.641703 0.420794 0.623672 0.510678 0.604125 0.566846 0.560547 0.623037 0.547016 0.676963 0.568063 0.730888 0.607141 0.771355 0.584594 0.811799 0.506453 0.829766 0.411766 0.793832 0.420781 0.769112

注意class_id从0开始, point坐标都是相对图片长宽的相对坐标。

1,转换成yolo格式

下面将原本是json格式的balloon数据集转换成yolo格式。

import os,json 
from pathlib import Path 
from shutil import copyfile 
from PIL import Image 
from tqdm import tqdm

root_path = './datasets/balloon-seg/'

# 1,构建目录
data_root = Path(root_path)
for tp in ('images','labels'):
    for part in ('train','val'):
        (data_root/tp/part).mkdir(parents=True, exist_ok=True)
        
# 2,复制图片文件
train_images = [str(x) for x in Path('balloon/train/').rglob('*.jpg')]
val_images = [str(x) for x in Path('balloon/val/').rglob('*.jpg')]

for src_file in tqdm(train_images):
    name = os.path.basename(src_file)
    dst_file = root_path+'images/train/'+name
    copyfile(src_file,dst_file)
    
for src_file in tqdm(val_images):
    name = os.path.basename(src_file)
    dst_file = root_path+'images/val/'+name
    copyfile(src_file,dst_file)
    
    
# 3,生成标签文件
train_dir = "balloon/train/"
val_dir = "balloon/val/"

train_json_file = train_dir + "via_region_data.json"
val_json_file = val_dir + "via_region_data.json"

def get_poly(anno):
    anno = anno["shape_attributes"]
    px = anno["all_points_x"]
    py = anno["all_points_y"]
    poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]
    poly = [p for x in poly for p in x]
    #box = [np.min(px), np.min(py), np.max(px), np.max(py)]
    return poly

def convert_yolo(size,poly):
    width,height = size 
    dh,dw = 1.0/height,1.0/width
    poly = [dw*x if i%2==0 else dh*x for i,x in enumerate(poly)]
    return poly

def write_yolo_txt(label_path,catids,yolo_polys):
    lines = [f"{cls} {' '.join(f'{x:.6f}' for x in poly)}\n" 
             for cls,poly in zip(catids,yolo_polys)]
    with open(label_path, 'w') as fl:
        fl.writelines(lines) 
    
def write_labels(data_dir,part): 
    with open(data_dir + "via_region_data.json") as f:
        info = json.load(f)
    info_values = list(info.values()) 
    for info_value in tqdm(info_values):
        img_path = data_dir + info_value['filename']
        anno_list = list(info_value['regions'].values())
        polys = [get_poly(anno) for anno in anno_list]
        catids = np.array([0 for x in polys])
        size = Image.open(img_path).size 
        yolo_polys = [convert_yolo(size,poly) for poly in polys]
        txt_path = data_root/'labels'/part/info_value['filename'].replace('.jpg','.txt')
        write_yolo_txt(txt_path,catids,yolo_polys)
        
write_labels(train_dir,'train')
write_labels(val_dir,'val')
100%|██████████| 63/63 [00:00<00:00, 2057.52it/s]
100%|██████████| 13/13 [00:00<00:00, 1704.63it/s]
100%|██████████| 61/61 [00:00<00:00, 2880.77it/s]
100%|██████████| 13/13 [00:00<00:00, 2820.50it/s]

2,样本可视化

from PIL import Image,ImageDraw 
import os
from pathlib import Path 
from shutil import copyfile 
from tqdm import tqdm
import numpy as np 

def get_labels_polys(img_path,gt_path):
    img = Image.open(img_path)
    w,h = img.size  
    with open(gt_path, 'r') as fl:
        lines = [x.rstrip() for x in fl.readlines()]
    str_data = [x.split(' ') for x in lines]
    relative_polys = [[float(x) for x in arr[1:]] for arr in str_data]
    labels = [int(arr[0]) for arr in str_data]
    polys = [ [x*w if i%2==0 else x*h  for i,x in enumerate(arr)]  for arr in relative_polys]
    return labels,polys

def plot_polys(image,polys):
    image_result = image.copy()
    draw = ImageDraw.Draw(image_result) 
    for poly in polys:
        draw.polygon(poly, fill ="cyan", outline ="red") 
    return image_result
from pathlib import Path

root_path = './datasets/balloon-seg/'

data_root = Path(root_path)
val_imgs = [str(x) for x in (data_root/'images'/'val').rglob("*.jpg") if 'checkpoint' not in str(x)]

img_path = val_imgs[2] 
gt_path = img_path.replace('images','labels').replace('.jpg','.txt')
labels,polys = get_labels_polys(img_path,gt_path)
plot_polys(Image.open(img_path),polys)

cca67287013c4d39db9cc6e58dd15480.png

3,数据集配置文件

仿照 ultralytics/data/yolo/data/datasets 中已有的一些yaml数据集配置文件,构建我们自己的数据集yaml文件。

import ultralytics 
print(ultralytics.__file__)
%%writefile balloon-seg.yaml
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: balloon-seg  # dataset root dir
train: images/train  # train images (relative to 'path') 128 images
val: images/val  # val images (relative to 'path') 128 images
test:  # test images (optional)

# Classes
names:
  0: ballon

# Download script/URL (optional)
# download: https://ultralytics.com/assets/coco128.zip

Overwriting balloon-seg.yaml

4,数据管道

import torch
from torch.utils.data import DataLoader
from ultralytics.cfg import get_cfg
from ultralytics.utils import DEFAULT_CFG,yaml_load 
from ultralytics.data.utils import check_cls_dataset, check_det_dataset
from ultralytics.data import build_yolo_dataset,build_dataloader
overrides = {'task':'segment',
             'data':'balloon-seg.yaml',
             'imgsz':640,
             'workers':4
            }
cfg = get_cfg(cfg = DEFAULT_CFG,overrides=overrides)
data_info = check_det_dataset(cfg.data)
ds_train = build_yolo_dataset(cfg,img_path=data_info['train'],batch=cfg.batch,
                              data = data_info,mode='train',rect=False,stride=32)

ds_val = build_yolo_dataset(cfg,img_path=data_info['val'],batch=cfg.batch,data = data_info,
    mode='val',rect=False,stride=32)
dl_train = DataLoader(ds_train,batch_size = cfg.batch, num_workers = cfg.workers,
                      collate_fn = ds_train.collate_fn)

dl_val = DataLoader(ds_val,batch_size = cfg.batch, num_workers = cfg.workers,
                      collate_fn = ds_val.collate_fn)

二,定义模型

可以选择 yolov8n-seg,yolov8s-seg,yolov8l-seg,等官方定义好的模型结构,

也可以通过修改yaml模型配置文件来实现用户自定义的模型结构。

from ultralytics.nn.tasks import SegmentationModel 
model = SegmentationModel(cfg = 'yolov8n-seg.yaml', ch=3, nc=1)
#weights = torch.hub.load_state_dict_from_url('https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt')
weights = torch.load('yolov8n-seg.pt')
model.load(weights['model'])
model.args = cfg
model.nc = data_info['nc']  # attach number of classes to model
model.names = data_info['names']

三,训练模型

我们分别演示使用ultralytics原生接口以及使用torchkeras的KerasModel两种接口训练模型的方法。

1, 使用ultralytics原生接口

from ultralytics import YOLO 
model = YOLO('yolov8n-seg.pt')  
results = model.train(data = 'balloon-seg.yaml', epochs = 50, workers=2)
#自动调参接口
#yolo_model = YOLO('yolov8n-seg.pt')
#yolo_model.tune(data='balloon-seg.yaml', epochs=10, 
#                iterations=300, optimizer='AdamW', 
#                plots=True, save=False, val=True)

cc8f97b0194cf9a139774bf6011ae0f6.png

2, torchkeras梦中情炉接口

#测试loss计算过程
for batch in dl_train:
    break
    
for key,value in batch.items():
    if isinstance(value,torch.Tensor):
        batch[key] = batch[key].cuda()
    
model = model.cuda()
model.train();
batch['img'] = batch['img'].float()/255.0
loss,_ = model.forward(batch)
loss

tensor(89.2061)

from torchkeras import KerasModel 

#我们需要修改StepRunner以适应Yolov8的数据集格式

class StepRunner:
    def __init__(self, net, loss_fn, accelerator, stage = "train", metrics_dict = None, 
                 optimizer = None, lr_scheduler = None
                 ):
        self.net,self.loss_fn,self.metrics_dict,self.stage = net,loss_fn,metrics_dict,stage
        self.optimizer,self.lr_scheduler = optimizer,lr_scheduler
        self.accelerator = accelerator
        self.net.train() 

    
    def __call__(self, batch):
        
        batch['img'] = batch['img'].float()/255
        
        #loss
        loss,_ = model.forward(batch)

        #backward()
        if self.optimizer is not None and self.stage=="train":
            self.accelerator.backward(loss)
            self.optimizer.step()
            if self.lr_scheduler is not None:
                self.lr_scheduler.step()
            self.optimizer.zero_grad()
            
        all_loss = self.accelerator.gather(loss).sum()
        
        #losses
        step_losses = {self.stage+"_loss":all_loss.item()}
        
        #metrics
        step_metrics = {}
        
        if self.stage=="train":
            if self.optimizer is not None:
                step_metrics['lr'] = self.optimizer.state_dict()['param_groups'][0]['lr']
            else:
                step_metrics['lr'] = 0.0
        return step_losses,step_metrics
    
KerasModel.StepRunner = StepRunner
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4) 
keras_model = KerasModel(net = model, 
                         loss_fn = None, 
                         optimizer = optimizer)
keras_model.fit(train_data=dl_train,
                val_data=dl_val,
                epochs = 200,
                ckpt_path='checkpoint',
                patience=20,
                monitor='val_loss',
                mode='min',
                mixed_precision='no',
                plot= True
               )

9548c7f841e787f9c3be0779971d2b9d.png

#关闭mosaic增强再训一次
ds_train.close_mosaic(cfg)
keras_model.from_scratch = False
keras_model.fit(train_data=dl_train,
                val_data=dl_val,
                epochs = 200,
                ckpt_path='checkpoint',
                patience=20,
                monitor='val_loss',
                mode='min',
                mixed_precision='no',
                plot= True
               )

9a33221a025685127f21510630772479.png

四,评估模型

为了便于评估 map等指标,我们将权重再次保存后,用ultralytics的原生YOLO接口进行加载后评估。

from ultralytics import YOLO 
keras_model.load_ckpt('checkpoint')
save_dic = dict(model = keras_model.net, train_args =dict(cfg))
torch.save(save_dic, 'best_yolo.pt')
from ultralytics import YOLO 
best_model = YOLO(model = 'best_yolo.pt')
metrics = best_model.val(data = cfg.data )
import pandas as pd 
df = pd.DataFrame()
df['metric'] = metrics.keys
for i,c in best_model.names.items():
    df[c] = metrics.class_result(i)
df

83b91c6fb4c630387997f2b7ee8c903b.png

五,使用模型

from pathlib import Path 
root_path = './datasets/balloon-seg/'
data_root = Path(root_path)
val_imgs = [str(x) for x in (data_root/'images'/'train').rglob("*.jpg") if 'checkpoint' not in str(x)]
img_path = val_imgs[10] 
Image.open(img_path)
result = best_model(img_path,conf=0.1)
from torchkeras import plots
masks = result[0].masks.data
boxes = result[0].boxes.data 
plots.plot_instance_segmentation(Image.open(img_path),boxes,masks,
    class_names = ['balloon'],min_score=0.0)

591de9fc101fe6c2308daf5330c8a924.png

六, 导出onnx格式

success = best_model.export(format='onnx',dynamic=True)
model = YOLO('best_yolo.onnx',task='segment')
img_path = val_imgs[5]
result = model.predict(img_path,save_txt=True);
from torchkeras import plots
masks = result[0].masks.data
boxes = result[0].boxes.data 
plots.plot_instance_segmentation(Image.open(img_path),boxes,masks,
    class_names = ['balloon'],min_score=0.0)
import torch 
from torch import nn 
import onnxruntime
from PIL import Image 
from ultralytics.models.yolo.segment.predict import SegmentationPredictor 
from ultralytics.yolo.utils.torch_utils import select_device

class OnnxModel(nn.Module):
    def __init__(self,weights,
                 device=torch.device('cpu'),
                 dnn=False,
                 data=None,
                 fp16=False,
                 fuse=True,
                 verbose=True):
        
        super().__init__()
        w = weights
        nn_module = False
        onnx = True
        pt, jit, xml, engine, coreml, saved_model, pb, tflite, edgetpu, tfjs, paddle, triton = [False]*12 
        nhwc = False
        stride = 32  
        model, metadata = None, None
        cuda = torch.cuda.is_available() and device.type != 'cpu'  
        names = ['circle']
        self.__dict__.update(locals())  # assign all variables to self
        

        providers = ['CUDAExecutionProvider', 'CPUExecutionProvider'] if cuda else [
            'CPUExecutionProvider']
        self.session = onnxruntime.InferenceSession(w, providers=providers)
        self.output_names = [x.name for x in self.session.get_outputs()]

    def forward(self, im, augment=False, visualize=False):
        im = im.cpu().numpy()  
        y = self.session.run(self.output_names, {self.session.get_inputs()[0].name: im})
        if isinstance(y, (list, tuple)):
            return self.from_numpy(y[0]) if len(y) == 1 else [self.from_numpy(x) for x in y]
        else:
            return self.from_numpy(y)
    
    def from_numpy(self, x):
        return torch.tensor(x).to(self.device) if isinstance(x, np.ndarray) else x
    
    def warmup(self,imgsz=(1, 3, 640, 640)):
        im = torch.empty(*imgsz, dtype=torch.half if self.fp16 else torch.float, 
                         device=self.device)  # input
        for _ in range(2 if self.jit else 1):  #
            self.forward(im)  # warmup
    
    
class Predictor(SegmentationPredictor):
    def setup_model(self, model, verbose=True):
        device = select_device(self.args.device, verbose=verbose)
        model = model or self.args.model
        self.args.half &= device.type != 'cpu' 
        self.model = OnnxModel(model,
                                 device=device,
                                 dnn=self.args.dnn,
                                 data=self.args.data,
                                 fp16=self.args.half,
                                 verbose=verbose)
        self.device = device
        self.model.eval()
        
args = dict(model='best_yolo.onnx')
predictor = Predictor(overrides=args)
result = predictor(source = Image.open(img_path) )
from torchkeras import plots
masks = result[0].masks.data
boxes = result[0].boxes.data 
plots.plot_instance_segmentation(Image.open(img_path),boxes,masks,
    class_names = ['balloon'],min_score=0.0)

5934d88587891821238e71efd951f951.png

公众号算法美食屋后台回复关键词:torchkeras,获取本文notebook代码和balloon数据集,以及更多有趣范例~

ce02eb0ea68f5945dad6ab4a88af427a.png738882d2790c0af802b9cc60ffcca5bd.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大众冰球运动水平等级评价规范

声明 本文是学习GB-T 42371-2023 大众冰球运动水平等级评价规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件确立了大众冰球运动水平的等级和评价程序&#xff0c;规定了等级评价的总体要求以及评价要素、评 价要求&#xff0c;描…

408数据结构算法题目

408数据结构算法题目 408数据结构算法题目一、2020-411.1 题目描述1.2 分析1.3 代码1.3.1 暴力美学1.3.2 贪心 408数据结构算法题目 一、2020-41 1.1 题目描述 2020-41 41.(13分&#xff09; 定义三元组&#xff08;a,b,c)(a,b,c均为正数&#xff09;的距离D|a-b||b-c||c-a…

C++学习笔记--项目知识点集合

一、同步IO、异步IO、阻塞IO、非阻塞IO 首先来看看两种I/O的定义&#xff1a;同步I/O和异步I/O 同步&#xff08;阻塞&#xff09;I/O&#xff1a;在一个线程中&#xff0c;CPU执行代码的速度极快&#xff0c;然而&#xff0c;一旦遇到IO操作&#xff0c;如读写文件、发送网络…

【LeetCode-简单题KMP】459. 重复的子字符串

文章目录 题目方法一&#xff1a;移动匹配方法二&#xff1a;KMP算法 题目 方法一&#xff1a;移动匹配 class Solution {//移动匹配public boolean repeatedSubstringPattern(String s) {StringBuffer str new StringBuffer(s);//ababstr.append(s);//拼接一份自己 abababab…

TCP/IP协议栈的心跳、丢包重传、连接超时机制实例详解

大家好&#xff0c;本文结合具体的问题实例&#xff0c;详细讲解一下TCP/IP协议栈的心跳机制、丢包重传机制等内容&#xff0c;给大家提供一个借鉴和参考。 1、问题概述 虽然软件底层模块在网络恢复后能自动重连上服务器&#xff0c;但会议因为网络问题已经退出&#xff0c;需…

代码随想录|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

121. 买卖股票的最佳时机 dp含义 dp[i][0] 表示第i天持有股票所得最多现金 ,dp[i][1] 表示第i天不持有股票所得最多现金 其实一开始现金是0&#xff0c;那么加入第i天买入股票现金就是 -prices[i]&#xff0c; 这是一个负数。 递推公式 第i天持有股票即dp[i][0],可以由两个…

Oracle数据库体系结构(三)_逻辑结构

Oracle逻辑存储结构,主要描述oracle 数据库内部数据的组织和管理方式&#xff0c;即在数据库管理系统的层面中如何组织和管理数据&#xff0c;与操作系统没有关系。逻辑存储结构时候物理存储机构的抽象体现&#xff0c;是不可见的&#xff0c;可以通过查询数据库数据字典了解逻…

RocketMq(一)安装部署

一、linux单机部署&#xff1a; 1、到apache官网下载 | RocketMQ (apache.org)下载binary zip包&#xff0c;如我下载的4.9.6版本。 上传到建好的/usr/local/rocketmq目录下。 2、解压zip包 unzip rocketmq-all-4.9.6-bin-release.zip 3、进入解压后的文件夹,启动 Name Serv…

TCP详解之流量控制

TCP详解之流量控制 发送方不能无脑的发数据给接收方&#xff0c;要考虑接收方处理能力。 如果一直无脑的发数据给对方&#xff0c;但对方处理不过来&#xff0c;那么就会导致触发重发机制&#xff0c;从而导致网络流量的无端的浪费。 为了解决这种现象发生&#xff0c;TCP 提…

关于QGC Landing Pattern规划的计算过程

固定翼飞机在规划航线时&#xff0c;QGC提供了自动生成降落阶段航线功能。在地图上选择降落点之后&#xff0c;根据默认的下滑坡度或下滑距离、盘旋点半径&#xff0c;自动生成航线。最后的降落航向实际由三个点组成&#xff0c;开始降落点&#xff08;MAV_CMD_DO_LAND_START&a…

SSM整合01

SSM01搭建SSM项目 1.创建maven的web工程 1.1pom.xml配置 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apac…

【每日一题】981. 基于时间的键值存储

981. 基于时间的键值存储 - 力扣&#xff08;LeetCode&#xff09; 设计一个基于时间的键值数据结构&#xff0c;该结构可以在不同时间戳存储对应同一个键的多个值&#xff0c;并针对特定时间戳检索键对应的值。 实现 TimeMap 类&#xff1a; TimeMap() 初始化数据结构对象void…

开始为 Android 开发 PWA 或混合 Web 应用

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 PWA 或混合 Web 应用的功能 Apache Cordova Ionic 通过安装所需工具开始使用 Ionic 使用 Ionic Cordova 和 Ang…

小白新手一文完成Git+Github/GITEE傻瓜式入门详解部署教程(内含TortoiseGit配置)

本文创作时版本为 Git-2.41.0&#xff0c;使用目标为笔记存储和代码库&#xff0c;部分公司向使用的设置可能不一样 一 Git 1.1 何为 Git Git是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理项目、项目版本管理。 原本是为了帮助管理 Linux 内核开发而开…

Docker 网络学习

docker的网络模式 当你开始大规模使用Docker时&#xff0c;你会发现需要了解很多关于网络的知识。Docker作为目前最火的轻量级容器技术&#xff0c;有很多令人称道的功能&#xff0c;如Docker的镜像管理。然而&#xff0c;Docker同样有着很多不完善的地方&#xff0c;网络方面…

ARM64汇编基础

ARM64汇编基础 主要内容 到目前为止&#xff0c;大部分的移动设备都是64位的arm架构&#xff0c;一直想抽个时间系统学习下&#xff0c;这个周末就专门来学习下。毕竟两天的时间&#xff0c;也只是简单的入门了解下&#xff0c;为后续工作和学习打下基础。 本次学习的主要内容…

Pytorch学习笔记(GPU训练)

GUP训练 配置pytorch的gup版本主要是在网络模型、输入和标记的数据、损失函数 方式一 直接.cuda()调用&#xff0c;在原有的模型训练代码中的网络模型、输入和标记的数据、损失函数部分直接调用即可 方式二 事先定义好设备device,然后直接.to(device)调用&#xff0c;在原…

基于SSM的学生宿舍管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

[vulntarget靶场] vulntarget-a

靶场地址&#xff1a;https://github.com/crow821/vulntarget 拓扑结构 信息收集 主机发现 netdiscover -r 192.168.127.0/24 -i eth0端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.127.130访问目标80&#xff0c;发现为通达oa WIN7漏洞利用 通达oa后台…

运行软件报错msvcr100.dll丢失的解决方法,全面分析msvcr100.dll丢失问题

随着科技的飞速发展&#xff0c;计算机已经成为人们生活和工作中不可或缺的重要工具。然而&#xff0c;在使用计算机的过程中&#xff0c;难免会遇到一些令人困扰的问题&#xff0c;如计算机丢失 msvcr100.dll 文件就是其中之一。本文将详细介绍计算机丢失 msvcr100.dll 的困扰…