记录一次mmpretrain训练数据并转onnx推理

news2024/11/26 20:31:38

目录

1.前言

2.代码

3.数据形态【分类用】

4.配置文件

5.训练

6.测试-分析-混淆矩阵等等,测试图片效果等

7.导出onnx

8.onnx推理

9.docker环境简单补充


1.前言

        好久没有做图像分类了,于是想用商汤的mmclassification快速搞一波,发现已经没有了。现在是mmpretrain集成。

2.代码

        截止到我写文章,我是下载的GITHUB中的mmpretrain,我是main分支,是1.2版本。https://github.com/open-mmlab/mmpretrainicon-default.png?t=O83Ahttps://github.com/open-mmlab/mmpretrain     安装环境:

     (1)跟着文档来就好

 1.2依赖环境 — MMPretrain 1.2.0 文档icon-default.png?t=O83Ahttps://mmpretrain.readthedocs.io/zh-cn/latest/get_started.html        主要是这两步: cd mmpretrain    -->  pip install -U openmim && mim install -e .

        open-mmlab喜欢用mim来装东西,又快,又对。包括mmcv、mmdeploy、mmdet等。

    (2)自己搞一个docker,我文章最后做补充文档~

3.数据形态【分类用】

 可以看出,data下是训练集和验证集,然后是类名,类名下是各自图片,就这样就行了。

4.配置文件

代码里有个config文件,下面的resnet下面的,resnet50_8xb32_in1k.py抄一个过来做自己的,它里边还有如下一些配置文件:

依次把所有内容抄过来,做一个自己的配置文件。我放在config_me下边,叫my_resnet50_8xb32_in1k.py,最终内容如下边代码:

这里有两点需要注意,一个是去模型库下载预训练权重【读readme找模型库,对应配置文件下载的对应预训练pth】,第二个是dataset_type = 'CustomDataset'这里用自定义就行了,数据形态上边那样就行,不用、不用去改dateset下的imagenet、 coco啥的标签......


CLASS_NUMS = 8  # 你要分类的数量,比如我是8类
BATCH_SIZE = 20
TRAIN_NUM_WORKERS = 8
VAL_NUM_WORKERS = 4
TR_DATA_ROOT = "/xx/data/train"  # 训练集
VAL_DATA_ROOT = "/xx/data/val"  # 验证集
MAX_EPOCH = 600
MultiStepLR_list = [100, 200, 300]  # 学习率递减epoch分批
VAL_INTERVAL = 20  # 多少迭代验证一次
SAVE_INTERVAL = 50  # 多少迭代保存一次模型
LOG_INTERVAL = 100  # 多少迭代/批次打印一次
PRE_CHECKPOINT = "/configs_me/resnet50_8xb32_in1k_20210831-ea4938fc.pth"  # 去模型库下载与config文件相对应的预训练模型权重

frozen_stagesss = 2  # -1不冻结层,这里选择冻结骨干2层

# model settings
model = dict(
    type='ImageClassifier',
    backbone=dict(
        type='ResNet',
        depth=50,
        num_stages=4,
        out_indices=(3, ),
        frozen_stages=frozen_stagesss,     # 冻结主干网的层数
        style='pytorch'),
    neck=dict(type='GlobalAveragePooling'),
    head=dict(
        type='LinearClsHead',
        num_classes=CLASS_NUMS,
        in_channels=2048,  # load_from后就该2048  512报错
        # in_channels=512,
        loss=dict(type='CrossEntropyLoss', loss_weight=1.0),
        topk=(1, 5),  # 二分类啥的或者不用top5准确率的,用topk=(1, ),
    ))


# dataset settings
dataset_type = 'CustomDataset'
data_preprocessor = dict(
    num_classes=CLASS_NUMS,
    # RGB format normalization parameters
    mean=[123.675, 116.28, 103.53],
    std=[58.395, 57.12, 57.375],
    # convert image from BGR to RGB
    to_rgb=True,
)

train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='RandomResizedCrop', scale=224),
    dict(type='RandomFlip', prob=0.5, direction='horizontal'),
    dict(type='PackInputs'),
]

test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='ResizeEdge', scale=256, edge='short'),  # 缩放短边尺寸至 256px
    dict(type='CenterCrop', crop_size=224),
    dict(type='PackInputs'),
]

train_dataloader = dict(
    batch_size=BATCH_SIZE,
    num_workers=TRAIN_NUM_WORKERS,
    dataset=dict(
        type=dataset_type,
        data_root=TR_DATA_ROOT,
        # ann_file='meta/train.txt',
        # split='train',
        pipeline=train_pipeline),
    sampler=dict(type='DefaultSampler', shuffle=True),  # 默认采样
    # persistent_workers=True,  # 保持进程,缩短每个epoch准备时间
)

val_dataloader = dict(
    batch_size=BATCH_SIZE,
    num_workers=VAL_NUM_WORKERS,
    dataset=dict(
        type=dataset_type,
        data_root=VAL_DATA_ROOT,
        # ann_file='meta/test.txt',
        # split='test',
        pipeline=test_pipeline),
    sampler=dict(type='DefaultSampler', shuffle=False),
    # persistent_workers=True,
)

val_evaluator = dict(type='Accuracy', topk=(1, 5))  # 二分类不能用top1和top5
# val_evaluator = dict(type='Accuracy', topk=(1, ))

# If you want standard test, please manually configure the test dataset
test_dataloader = val_dataloader
test_evaluator = val_evaluator

# optimizer
optim_wrapper = dict(
    optimizer=dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001))

# learning policy
param_scheduler = dict(
    type='MultiStepLR', by_epoch=True, milestones=MultiStepLR_list, gamma=0.5)

# train, val, test setting
train_cfg = dict(by_epoch=True, max_epochs=MAX_EPOCH, val_interval=VAL_INTERVAL)
val_cfg = dict()
test_cfg = dict()

# NOTE: `auto_scale_lr` is for automatically scaling LR,
# based on the actual training batch size.
# auto_scale_lr = dict(base_batch_size=256)
# 通过默认策略自动缩放学习率,此策略适用于总批次大小 256
# 如果你使用不同的总批量大小,比如 512 并启用自动学习率缩放
# 我们将学习率扩大到 2 倍

# defaults to use registries in mmpretrain
default_scope = 'mmpretrain'

# configure default hooks
default_hooks = dict(
    # record the time of every iteration.
    timer=dict(type='IterTimerHook'),
    # print log every 100 iterations.
    logger=dict(type='LoggerHook', interval=LOG_INTERVAL),
    # enable the parameter scheduler.
    param_scheduler=dict(type='ParamSchedulerHook'),
    # save checkpoint per epoch.
    checkpoint=dict(type='CheckpointHook', interval=SAVE_INTERVAL),
    # set sampler seed in distributed evrionment.
    sampler_seed=dict(type='DistSamplerSeedHook'),
    # validation results visualization, set True to enable it.
    visualization=dict(type='VisualizationHook', enable=False),
)

# configure environment
env_cfg = dict(
    # whether to enable cudnn benchmark
    cudnn_benchmark=False,
    # set multi process parameters
    mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),
    # set distributed parameters
    dist_cfg=dict(backend='nccl'),
)

# set visualizer
vis_backends = [dict(type='LocalVisBackend')]
visualizer = dict(type='UniversalVisualizer', vis_backends=vis_backends)

# set log level
log_level = 'INFO'

# load from which checkpoint
load_from = PRE_CHECKPOINT

# whether to resume training from the loaded checkpoint
resume = False

# Defaults to use random seed and disable `deterministic`
randomness = dict(seed=None, deterministic=False)

5.训练

    把tools文件夹下边的train.py,复制一份【PS.后边都指的复制到项目根目录下】,只改动如下代码,然后python train.py就可以训练了。【注意训练结果权重在你的work-dir指定目录下】

parser.add_argument('--config', default="config_me/my_resnet50_8xb32_in1k.py", help='train config file path')
parser.add_argument('--work-dir', default="my_train_result", help='the dir to save logs and models')
还可以加几句打印类别顺序:【还没试过,待定】
classes = runner.test_loop.dataloader.dataset.metainfo.get('classes')
print("=== 本次训练类别顺序: ======================")
print(classes)
print('=========================================')

6.测试-分析-混淆矩阵等等,测试图片效果等

   同理,把tools下的test.py复制,改动如下,可以评估验证集:

    parser.add_argument('--config', default="config_me/my_resnet50_8xb32_in1k.py", help='test config file path')
    parser.add_argument('--checkpoint', default="my_train_result/epoch_200.pth", help='checkpoint file')
    parser.add_argument('--work-dir', default="test_result", help='the directory to save the file containing evaluation metrics')
    # parser.add_argument('--out', default="test_result/res_epoch_20.pkl", help='the file to output results.')  # 这个是保存为pkl可以

同理, analyze_results.py复制一份出来,改动如下,可以分析模型对测试集的效果:

    parser.add_argument('--config', default=default="config_me/my_resnet50_8xb32_in1k.py", help='test config file path')
    parser.add_argument('--result', default="test_result/res_epoch_20.pkl", help='test result json/pkl file')
    parser.add_argument('--out-dir', default="test_result/analyze", help='dir to store output files')

同理, confusion_matrix.py复制一份出来,改动如下,可以计算验证集的混淆矩阵:

    parser.add_argument('--config',  default="config_me/my_resnet50_8xb32_in1k.py", help='test config file path')
    parser.add_argument(
        '--ckpt_or_result',   default="my_train_result/epoch_200.pth",
        type=str,
        help='The checkpoint file (.pth) or '
        'dumpped predictions pickle file (.pkl).')
运行的时候,加上 --show 和--include-values等,显示带数字的混淆矩阵
同理,把demo下边的image_demo.py复制一份,改动如下,可以测试图片推理:
    parser.add_argument('--img', default="data/val/3.jpg", help='Image file')
    parser.add_argument('--model', default="configs_me/my_resnet50_8xb32_in1k.py", help='Model name or config file path')
    parser.add_argument('--checkpoint', default="xxx/epoch_400.pth", help='Checkpoint file path.')
    parser.add_argument(
        '--show',
        action='store_true',
        help='Whether to show the prediction result in a window.')
    parser.add_argument(
        '--show-dir',
        default="test_111111111111111",
        type=str,
        help='The directory to save the visualization image.')

7.导出onnx

这里用到mmdeploy, 把mmdeploy,git clone一个到本项目文件夹下,再cd到mmdeploy里,同样运行mim install -e .来安装mmdeploy或者参考:Get Started — mmdeploy 1.3.1 文档

 目前我这里是:1.3.1版本

导出onnx脚本:export_onnx.py

# === mmdeploy方式导出onnx ====================================
from mmdeploy.apis import torch2onnx
from mmdeploy.backend.sdk.export_info import export2SDK

img = '随便一张测试图路径 xxx/xx。jpg'
work_dir = '另存onnx的目录'
save_file = 'epoch_500.onnx'
deploy_cfg = 'mmdeploy/configs/mmpretrain/classification_onnxruntime_static.py'
model_cfg = 'configs_me/my_resnet50_8xb32_in1k.py' # 训练的配置文件
model_checkpoint = 'train_res_1024/epoch_500.pth'  # 训练的pth结果
device = 'cpu'

# 1. convert model to onnx
torch2onnx(img, work_dir, save_file, deploy_cfg, model_cfg, model_checkpoint, device)

# 2. extract pipeline info for sdk use (dump-info)
export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint, device=device)

8.onnx推理

(1)mmdeploy推理方式

import os

# === 使用mmdeploy推理onnx ===============================
from mmdeploy.apis import inference_model

# 类别顺序:训练的时候,test时候,或者混淆矩阵那里可以打印出class顺序
classes = ["class1", "class2", "class3"]
data_paths = 'data/1 (1).png'


model_cfg = 'configs_me/my_resnet50_8xb32_in1k.py'
deploy_cfg = 'mmdeploy/configs/mmpretrain/classification_onnxruntime_static.py'
data_paths= 'xxx/1.jpg'
backend_files = ['xxx/rscd_c8_2w_epoch_500.onnx']  # 刚导出的
device = 'cpu'


# for img in os.listdir(data_paths):
img_path = data_paths
result = inference_model(model_cfg, deploy_cfg, backend_files, img_path, device)
socres = result[0].pred_score.cpu().numpy().tolist()
labels = result[0].pred_label.cpu().numpy().tolist()

label = labels[0]
score = socres[label]
print("图片名:", img_path, "预测类别:", classes[label], "预测分数:", round(score, 4))

(2)onnx-runtime推理方式, 脱离框架【very nice !!!!!!!!!】

         里边数据处理是参考 config文件里边图像,比如resize啥的要对。


import os
import onnxruntime
import cv2
import numpy as np

def resize_edge(image, scale=256, edge='short'):
    """将图像的短边缩放到指定尺寸,保持宽高比不变"""
    h, w = image.shape[:2]
    if edge == 'short':
        if h < w:
            scale_ratio = scale / h
        else:
            scale_ratio = scale / w
    else:
        if h > w:
            scale_ratio = scale / h
        else:
            scale_ratio = scale / w
    new_size = (int(w * scale_ratio), int(h * scale_ratio))
    resized_image = cv2.resize(image, new_size)
    return resized_image

def center_crop(image, crop_size=224):
    """从图像中心裁剪指定尺寸的区域"""
    h, w = image.shape[:2]
    center_x, center_y = w // 2, h // 2
    half_crop_size = crop_size // 2
    # 确定中心裁剪区域
    start_x = max(center_x - half_crop_size, 0)
    start_y = max(center_y - half_crop_size, 0)
    cropped_image = image[start_y:start_y + crop_size, start_x:start_x + crop_size]
    return cropped_image

def pack_inputs(image):
    """将图像转化为 3x224x224 格式并归一化"""
    # 调整通道顺序,变为3x224x224
    img_crop = image[:, :, ::-1].transpose(2, 0, 1).astype(np.float32)
    img_crop[0, :] = (img_crop[0, :] - 123.675) / 58.395
    img_crop[1, :] = (img_crop[1, :] - 116.28) / 57.12
    img_crop[2, :] = (img_crop[2, :] - 103.53) / 57.375
    return img_crop

def img_preprocess(image_path):
    """
    图像预处理,以resnet50配置文件为例:
    test_pipeline = [
        dict(type='LoadImageFromFile'),
        dict(type='ResizeEdge', scale=256, edge='short'),  # 缩放短边尺寸至 256px
        dict(type='CenterCrop', crop_size=224),
        dict(type='PackInputs'),
    ]
    """
    image = cv2.imread(image_path)
    resized_image = resize_edge(image, scale=256, edge='short')
    cropped_image = center_crop(resized_image, crop_size=224)
    final_image = pack_inputs(cropped_image)
    return final_image

def img_infer(onnx_model, img_path):

    img_crop = img_preprocess(img_path)
    input = np.expand_dims(img_crop, axis=0)

    onnx_session = onnxruntime.InferenceSession(onnx_model, providers=['CPUExecutionProvider'])

    input_name = []
    for node in onnx_session.get_inputs():
        input_name.append(node.name)

    output_name = []
    for node in onnx_session.get_outputs():
        output_name.append(node.name)

    input_feed = {}
    for name in input_name:
        input_feed[name] = input
    pred = onnx_session.run(None, input_feed)
    return pred  # 预测结果


if __name__ == '__main__':

    onnx_model = "onnx_model/epoch_500.onnx"
    classes = ["class1", "class2", "class3"]  # 混淆矩阵和测试时候可以打印出来
    classes_explain = ["第一类", "第二类", "第三类"]

    # 一张图推理
    img_path = "data/1 (1).png"
    res = img_infer(onnx_model, img_path)
    print("图片名:", img_path, "预测类别:", classes_explain[np.argmax(res)], "预测分数:", round(np.max(res), 4))

补充分类指标:在onnx批量推理后,也可用sklearn评估。如:

from sklearn.metrics import classification_report
import numpy as np

# 假设真实标签和模型预测结果
y_true = np.array([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2])
y_pred = np.array([0, 1, 2, 0, 0, 2, 2, 1, 2, 0, 1, 1, 0, 1, 2])

# 生成分类报告
report = classification_report(y_true, y_pred, target_names=['a', 'b', 'c'])
print(report)

# 计算混淆矩阵 cm = confusion_matrix(y_true, y_pred)

# 打印混淆矩阵 print("混淆矩阵:\n", cm)

9.docker环境简单补充

- dockerFile如下: 从阿里源拉一个torch的基础镜像.........

# https://www.modelscope.cn/docs/环境安装 # GPU环境镜像(python3.10)

FROM registry.cn-beijing.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.1.0-py310-torch2.3.0-tf2.16.1-1.15.0

# FROM registry.cn-hangzhou.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.1.0-py310-torch2.3.0-tf2.16.1-1.15.0

# FROM registry.us-west-1.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.1.0-py310-torch2.3.0-tf2.16.1-1.15.0

RUN mkdir /opt/code

WORKDIR /opt/code

- 构建镜像 docker build -t hezy_base_image .

- 创建容器 docker run --name  hezy_mmcls  -d  -p 9528:22  --shm-size=1g  hezy_base_image   tail -f /dev/null

【-d 表示后台, -p表示端口映射 --shm-size 表示共享内存分配  tail -f /dev/null表示啥也不干】

- docker run还有些参数,可以酌情添加。

- docker exec -it 容器id /bin/bash: 命令可以进到容器

- docker images, docker ps | grep hezy: 查看镜像和容器等等

针对本次mmpretrain环境里边继续操作:

- 容器里边删除所有关于mm的环境【重装】,包括mmcls、openmim、mmdet、mmseg、mmpretrain等;

- 安装mmpretrain:https://mmpretrain.readthedocs.io/zh-cn/latest/get_started.html

- 验证:python demo/image_demo.py demo/demo.JPEG resnet18_8xb32_in1k --device cpu

- 补充:映射ssh等以及如下:

vim /etc/ssh/sshd_config  下边这些设置放开:

Port 22

AddressFamily any

ListenAddress 0.0.0.0

PermitRootLogin yes

PermitEmptyPasswords yes

PasswordAuthentication  yes

#重启ssh

service ssh restart

# 设置root密码:passwd root

外边就root/root和IP:端口登录了。【其他shel或者pycharm等idea登录用】

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

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

相关文章

gb28181-sip注册流程

gb28181-sip注册流程 当客户端第一次接入时&#xff0c;客户端将持续向Server端发送REGISTER消息&#xff0c;直到Server端回复"200 OK"后结束 它的注册流程如下图&#xff1a; 注册流程&#xff1a; 1 . SIP代理向SIP服务器发送Register请求&#xff1a; 第1行表…

玄机-应急响应- Linux入侵排查

一、web目录存在木马&#xff0c;请找到木马的密码提交 到web目录进行搜索 find ./ type f -name "*.php" | xargs grep "eval(" 发现有三个可疑文件 1.php看到密码 1 flag{1} 二、服务器疑似存在不死马&#xff0c;请找到不死马的密码提交 被md5加密的…

如何有效提升MySQL大表分页查询效率(本文以一张900万条数据体量的表为例进行详细解读)

文章目录 1、提出问题1.1 问题测试 2、解决问题&#xff08;三种方案&#xff09;2.1、方案一&#xff1a;查询的时候&#xff0c;只返回主键 ID2.2、方案二&#xff1a;查询的时候&#xff0c;通过主键 ID 过滤2.3、方案三&#xff1a;采用 elasticSearch 作为搜索引擎 3、总结…

基于卷积神经网络的苹果病害识别与防治系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 苹果病害识别与防治系统&#xff0c;卷积神经网络&#xff0c;resnet50&#xff0c;mobilenet【pytorch框架&#xff0c;python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积…

Java多线程编程基础

目录 编写第一个多线程程序 1. 方式一 : 继承Thread类, 重写run方法 2. 方式二: 实现Runnable接口, 重写run方法 3. 方式三: 使用Lambda表达式 [匿名内部类] [Lambda表达式] 在上个文章中, 我们了解了进程和线程的相关概念. 那么, 在Java中, 我们如何进行多线程编程呢? …

ffmpeg视频滤镜:网格-drawgrid

滤镜介绍 drawgrid 官网链接 》 FFmpeg Filters Documentation drawgrid会在视频上画一个网格。 滤镜使用 参数 x <string> ..FV.....T. set horizontal offset (default "0")y <string> ..FV.....T. set…

【AIGC】2024-arXiv-Lumiere:视频生成的时空扩散模型

2024-arXiv-Lumiere: A Space-Time Diffusion Model for Video Generation Lumiere&#xff1a;视频生成的时空扩散模型摘要1. 引言2. 相关工作3. Lumiere3.1 时空 U-Net (STUnet)3.2 空间超分辨率的多重扩散 4. 应用4.1 风格化生成4.2 条件生成 5. 评估和比较5.1 定性评估5.2 …

没有对象来和我手撕红黑树吧

1. 红黑树的介绍 红黑树也是一种自平衡的二叉搜索树&#xff0c;在每一个节点增加了一个存储位来表示节点的颜色&#xff0c;可以是红色也可以是黑色&#xff0c;通过约束颜色来维持树的平衡&#xff0c;具有以下的性质&#xff1a; 每个节点不是红色就是黑色根节点为黑色如果…

【网络面试篇】TCP与UDP类

目录 一、综述 1. TCP与UDP的概念 2. 特点 3. 区别 4. 对应的使用场景 二、补充 1. 基础概念 &#xff08;1&#xff09;面向连接 &#xff08;2&#xff09;可靠的 &#xff08;3&#xff09;字节流 2. 相关问题 &#xff08;1&#xff09;TCP 和 UDP 可以同时绑定…

linux:回车换行+进度条+git理解与使用以及如何解决免密码push问题

目录 特殊符号 Linux小程序---进度条 1.\n和\r的理解 2.缓冲区 3.设计简单的倒计时 4.设计简单的进度条 git-版本控制器 1.理解什么是版本控制器? 2.git的使用 3.git的其他说明 总结上传过程 特殊符号 1.(取消显化) 的作用:执行指令,但指令本身不会显化; 举个例子:我…

智能家居10G雷达感应开关模块,飞睿智能uA级别低功耗、超高灵敏度,瞬间响应快

在当今科技飞速发展的时代&#xff0c;智能家居已经逐渐成为人们生活中不可或缺的一部分。从智能灯光控制到智能家电的联动&#xff0c;每一个细节都在为我们的生活带来便利和舒适。而在众多智能家居产品中&#xff0c;10G 雷达感应开关模块以其独特的优势&#xff0c;正逐渐成…

什么品牌的护眼台灯比较好?五款目前比较好用的护眼台灯

在当今社会&#xff0c;近视已成为一种普遍现象&#xff0c;其背后的原因复杂多样。除了部分由遗传因素导致外&#xff0c;不良的用眼习惯和不适宜的照明环境也是不可忽视的重要因素。长时间盯着电子屏幕、阅读时光线过强或过弱、坐姿不正等&#xff0c;都可能给眼睛带来额外的…

redis详细教程(4.GEO,bitfield,Stream)

GEO Redis GEO 是 Redis 数据库中的一个功能模块&#xff0c;自 Redis 3.2 版本开始引入&#xff0c;专门用于处理地理位置信息。这个模块使得 Redis 能够存储并查询地理坐标&#xff0c;非常适合用于需要地理位置数据的应用&#xff0c;如实时位置查询、地理围栏、距离计算等…

Kafka 基础入门

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 前言 1. 核心概念 1.1 Producer 1.2 broker 1.3 consumer 1.4 zookeeper 1.5 controller 1.6 Cluster 2. 逻辑组件 2.1 Topic 2.2 Partition 2.3 Replication 2.4 leader & follower 3. …

苹果生态的机器学习和同态加密

1. 引言 Apple认为隐私是一项基本人权。其保护用户隐私的工作遵循一系列隐私原则&#xff0c;其中一项原则是优先使用设备上的处理。通过在用户设备上本地执行计算&#xff0c;有助于最大限度地减少与 Apple 或其他实体共享的数据量。当然&#xff0c;用户可以请求由机器学习 …

甲骨文云免费20G对象存储挂载到VPS

准备条件 1.一个获取到免费vps的甲骨文账号Cloud Infrastructure | Oracle 2.一台需要挂载的VPS跳转中 - 有云短链接 3.用到的开源项目https://github.com/s3fs-fuse/s3fs-fuse 一、甲骨文账号端操作 1.1获取存储桶名称和名称空间 进入甲骨文账号,依次如图打开-存储-存储桶…

开源的GPT-4o模型使用指南,Mini-Omni2集视觉、语音和双工能力于一体的

1. Mini-Omni2 是什么&#xff1f; Mini-Omni2 是一个开源的多模态语言模型&#xff0c;旨在模拟 GPT-4o 的视觉、语音和文本处理能力。它能够理解和生成视觉、听觉和文本内容&#xff0c;并支持实时的语音输出和灵活的双工交互。 Mini-Omni2 由清华大学和 Inspirai 的研究人…

【C++】string 类深度解析:探秘字符串操作的核心

快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 &#x1f4af;前言 &#x1f4af;为什么要学习 string 类 &#xff08;一&#xff09;简化操作 &#xff08;二&#xff09;确保安全 &#xff08;三…

卷积神经网络实验三:模型优化(1)

作者有话说&#xff1a; 这篇文章写的还是比混乱的。因为本人也是第一次做这样的尝试&#xff0c;虽然接触深度学习有一年了&#xff0c;但是对于模型的优化仅仅是局限于理论上。通过这一次的实验&#xff0c;我对于模型的理解也更深了几分。我不期望这篇文章能帮你能解决多大问…

clickhouse运维篇(三):生产环境一键生成配置并快速部署ck集群

前提条件&#xff1a;先了解集群搭建流程是什么样&#xff0c;需要改哪些配置&#xff0c;有哪些环境&#xff0c;这个文章目的是简化部署。 clickhouse运维篇&#xff08;一&#xff09;&#xff1a;docker-compose 快速部署clickhouse集群 clickhouse运维篇&#xff08;二&am…