当前位置: 首页 > news >正文

ubuntu20.04 openvino的yolov8推理(nncf量化)

1.环境配置:

pip install openvino-dev(2023.0.1)

pip install nncf(2.5.0)

pip install ultralytics

2.模型转换及nncf量化:

1.pytorch->onnx:

# Pytorch模型转换为Onnx模型
python from ultralytics import YOLO model = YOLO('yolov8s.pt')
# yolov8原生转换  
result = model.export(format='onnx')

2.onnx->vino:

from openvino.tools import mo
from openvino.runtime import serialize#model_path为onnx模型路径
model = mo.convert_model(onnx_path)
#fp32_parh为vino模型保存出来的路径
serialize(model,fp32_path) #onnx2vino

3.nncf模型量化:

from openvino.tools import mo
from openvino.runtime import serialize
import nncf
from api import *#参数定义
model_name = 'yolov8n'
model_path = '/home/yy/yolov11-master/weights/yolov8n.onnx'
subset_size = 500
preset = nncf.QuantizationPreset.MIXEDfp16_path = f'/home/yy/yolov11-master/weights/fp16_{model_name}.xml'
model = mo.convert_model(model_path,compress_to_fp16=True)
serialize(model,fp16_path)fp32_path = "/home/yy/yolov11-master/weights/yolov8n_vino_fp32/yolov8n.xml"
#创造数据coco128
data_source = create_data_source('/home/yy/yolov11-master/Open_Vino-introductory-master/coco128.yaml')
pot_data_loader = YOLOv5POTDataLoader(data_source)
#nncf量化数据
nncf_calibration_dataset = nncf.Dataset(data_source, transform_fn)
#创造量化算子
core = Core()
ov_model = core.read_model(fp32_path)
q_model = nncf.quantize(ov_model,nncf_calibration_dataset,preset=preset,subset_size=subset_size
)#开始nncf量化模型
nncf_int8_path = f'/home/yy/yolov11-master/weights/{model_name}_nncf_int8/{model_name}_nncf_int8.xml'
serialize(q_model,nncf_int8_path)

3.使用int8量化后的模型推理:

1.detect.py

from api import *
from openvino.runtime import Core
import cv2
import time
from PIL import Image
import numpy as npdef predict(model,label_dict:dict,obj_path:str,cap=False):#使用xml进行预测core = Core()det_ov_model = core.read_model(model)device = 'CPU'det_compiled_model = core.compile_model(det_ov_model, device)cap = cv2.VideoCapture(obj_path)while True:ret,frame = cap.read()if ret:frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)t1 = time.time()detections = detect(frame, det_compiled_model,nc=80)[0]t2 = time.time()fps = 1/(t2-t1)print(fps)image_with_boxes = draw_results(detections, frame, label_dict)image_with_boxes = cv2.cvtColor(image_with_boxes, cv2.COLOR_BGR2RGB)cv2.imshow('vid',image_with_boxes)if cv2.waitKey(1) & 0xff==ord('q'):breakelse:continueif __name__ == '__main__':label_dict = {0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', 4: 'airplane', 5: 'bus', 6: 'train', 7: 'truck', 8: 'boat', 9: 'traffic light', 10: 'fire hydrant', 11: 'stop sign', 12: 'parking meter', 13: 'bench', 14: 'bird', 15: 'cat', 16: 'dog', 17: 'horse', 18: 'sheep', 19: 'cow', 20: 'elephant', 21: 'bear', 22: 'zebra', 23: 'giraffe', 24: 'backpack', 25: 'umbrella', 26: 'handbag', 27: 'tie', 28: 'suitcase', 29: 'frisbee', 30: 'skis', 31: 'snowboard', 32: 'sports ball', 33: 'kite', 34: 'baseball bat', 35: 'baseball glove', 36: 'skateboard', 37: 'surfboard', 38: 'tennis racket', 39: 'bottle', 40: 'wine glass', 41: 'cup', 42: 'fork', 43: 'knife', 44: 'spoon', 45: 'bowl', 46: 'banana', 47: 'apple', 48: 'sandwich', 49: 'orange', 50: 'broccoli', 51: 'carrot', 52: 'hot dog', 53: 'pizza', 54: 'donut', 55: 'cake', 56: 'chair', 57: 'couch', 58: 'potted plant', 59: 'bed', 60: 'dining table', 61: 'toilet', 62: 'tv', 63: 'laptop', 64: 'mouse', 65: 'remote', 66: 'keyboard', 67: 'cell phone', 68: 'microwave', 69: 'oven', 70: 'toaster', 71: 'sink', 72: 'refrigerator', 73: 'book', 74: 'clock', 75: 'vase', 76: 'scissors', 77: 'teddy bear', 78: 'hair drier', 79: 'toothbrush'}predict('/home/yy/yolov11-master/weights/yolov8n_nncf_int8/yolov8n_nncf_int8.xml',label_dict,'/home/yy/yolov11-master/source_video/card.mp4',cap=True)

2.api.py

import numpy as np
import torch
from ultralytics.yolo.utils import ops
from openvino.runtime import Core,Model
import random
from typing import Tuple, Dict
import cv2
from ultralytics.yolo.utils.plotting import colors
from yolov5.utils.dataloaders import create_dataloader
from tqdm.notebook import tqdm
from ultralytics.yolo.utils.metrics import ConfusionMatrix
from yolov5.utils.general import check_dataset
from openvino.tools.pot.api import DataLoaderdef test(model:Model, core:Core, data_loader:torch.utils.data.DataLoader,nc ,validator, num_samples:int = None):"""OpenVINO YOLOv8 model accuracy validation function. Runs model validation on dataset and returns metricsParameters:model (Model): OpenVINO modeldata_loader (torch.utils.data.DataLoader): dataset loadervalidato: instalce of validator classnum_samples (int, *optional*, None): validate model only on specified number samples, if providedReturns:stats: (Dict[str, float]) - dictionary with aggregated accuracy metrics statistics, key is metric name, value is metric value"""validator.seen = 0validator.jdict = []validator.stats = []validator.batch_i = 1validator.confusion_matrix = ConfusionMatrix(nc=nc)model.reshape({0: [1, 3, -1, -1]})num_outputs = len(model.outputs)compiled_model = core.compile_model(model)for batch_i, batch in enumerate(tqdm(data_loader, total=num_samples)):if num_samples is not None and batch_i == num_samples:breakbatch = validator.preprocess(batch)results = compiled_model(batch["img"])if num_outputs == 1:preds = torch.from_numpy(results[compiled_model.output(0)])else:preds = [torch.from_numpy(results[compiled_model.output(0)]), torch.from_numpy(results[compiled_model.output(1)])]preds = validator.postprocess(preds)validator.update_metrics(preds, batch)stats = validator.get_stats()return statsdef print_stats(stats:np.ndarray, total_images:int, total_objects:int):"""Helper function for printing accuracy statisticParameters:stats: (Dict[str, float]) - dictionary with aggregated accuracy metrics statistics, key is metric name, value is metric valuetotal_images (int) -  number of evaluated imagestotal objects (int)Returns:None"""print("Boxes:")mp, mr, map50, mean_ap = stats['metrics/precision(B)'], stats['metrics/recall(B)'], stats['metrics/mAP50(B)'], stats['metrics/mAP50-95(B)']# Print resultss = ('%20s' + '%12s' * 6) % ('Class', 'Images', 'Labels', 'Precision', 'Recall', 'mAP@.5', 'mAP@.5:.95')print(s)pf = '%20s' + '%12i' * 2 + '%12.3g' * 4  # print formatprint(pf % ('all', total_images, total_objects, mp, mr, map50, mean_ap))if 'metrics/precision(M)' in stats:s_mp, s_mr, s_map50, s_mean_ap = stats['metrics/precision(M)'], stats['metrics/recall(M)'], stats['metrics/mAP50(M)'], stats['metrics/mAP50-95(M)']# Print resultss = ('%20s' + '%12s' * 6) % ('Class', 'Images', 'Labels', 'Precision', 'Recall', 'mAP@.5', 'mAP@.5:.95')print(s)pf = '%20s' + '%12i' * 2 + '%12.3g' * 4  # print formatprint(pf % ('all', total_images, total_objects, s_mp, s_mr, s_map50, s_mean_ap))def plot_one_box(box: np.ndarray, img: np.ndarray, color: Tuple[int, int, int] = None, mask: np.ndarray = None,label: str = None, line_thickness: int = 5):"""Helper function for drawing single bounding box on imageParameters:x (np.ndarray): bounding box coordinates in format [x1, y1, x2, y2]img (no.ndarray): input imagecolor (Tuple[int, int, int], *optional*, None): color in BGR format for drawing box, if not specified will be selected randomlymask (np.ndarray, *optional*, None): instance segmentation mask polygon in format [N, 2], where N - number of points in contour, if not provided, only box will be drawnlabel (str, *optonal*, None): box label string, if not provided will not be provided as drowing resultline_thickness (int, *optional*, 5): thickness for box drawing lines"""# Plots one bounding box on image imgtl = line_thickness or round(0.002 * (img.shape[0] + img.shape[1]) / 2) + 1  # line/font thicknesscolor = color or [random.randint(0, 255) for _ in range(3)]c1, c2 = (int(box[0]), int(box[1])), (int(box[2]), int(box[3]))cv2.rectangle(img, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)if label:tf = max(tl - 1, 1)  # font thicknesst_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3cv2.rectangle(img, c1, c2, color, -1, cv2.LINE_AA)  # filledcv2.putText(img, label, (c1[0], c1[1] - 2), 0, tl / 3, [225, 255, 255], thickness=tf, lineType=cv2.LINE_AA)if mask is not None:image_with_mask = img.copy()maskcv2.fillPoly(image_with_mask, pts=[mask.astype(int)], color=color)img = cv2.addWeighted(img, 0.5, image_with_mask, 0.5, 1)return imgdef draw_results(results: Dict, source_image: np.ndarray, label_map: Dict):"""Helper function for drawing bounding boxes on imageParameters:image_res (np.ndarray): detection predictions in format [x1, y1, x2, y2, score, label_id]source_image (np.ndarray): input image for drawinglabel_map; (Dict[int, str]): label_id to class name mappingReturns:"""boxes = results["det"]masks = results.get("segment")h, w = source_image.shape[:2]for idx, (*xyxy, conf, lbl) in enumerate(boxes):label = f'{label_map[int(lbl)]} {conf:.2f}'mask = masks[idx] if masks is not None else Nonesource_image = plot_one_box(xyxy, source_image, mask=mask, label=label, color=colors(int(lbl)),line_thickness=1)return source_imagedef letterbox(img: np.ndarray, new_shape: Tuple[int, int] = (640, 640), color: Tuple[int, int, int] = (114, 114, 114),auto: bool = False, scale_fill: bool = False, scaleup: bool = False, stride: int = 32):"""Resize image and padding for detection. Takes image as input,resizes image to fit into new shape with saving original aspect ratio and pads it to meet stride-multiple constraintsParameters:img (np.ndarray): image for preprocessingnew_shape (Tuple(int, int)): image size after preprocessing in format [height, width]color (Tuple(int, int, int)): color for filling padded areaauto (bool): use dynamic input size, only padding for stride constrins appliedscale_fill (bool): scale image to fill new_shapescaleup (bool): allow scale image if it is lower then desired input size, can affect model accuracystride (int): input padding strideReturns:img (np.ndarray): image after preprocessingratio (Tuple(float, float)): hight and width scaling ratiopadding_size (Tuple(int, int)): height and width padding size"""# Resize and pad image while meeting stride-multiple constraintsshape = img.shape[:2]  # current shape [height, width]if isinstance(new_shape, int):new_shape = (new_shape, new_shape)# Scale ratio (new / old)r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])if not scaleup:  # only scale down, do not scale up (for better test mAP)r = min(r, 1.0)# Compute paddingratio = r, r  # width, height ratiosnew_unpad = int(round(shape[1] * r)), int(round(shape[0] * r))dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1]  # wh paddingif auto:  # minimum rectangledw, dh = np.mod(dw, stride), np.mod(dh, stride)  # wh paddingelif scale_fill:  # stretchdw, dh = 0.0, 0.0new_unpad = (new_shape[1], new_shape[0])ratio = new_shape[1] / shape[1], new_shape[0] / shape[0]  # width, height ratiosdw /= 2  # divide padding into 2 sidesdh /= 2if shape[::-1] != new_unpad:  # resizeimg = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR)top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1))left, right = int(round(dw - 0.1)), int(round(dw + 0.1))img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)  # add borderreturn img, ratio, (dw, dh)def preprocess_image(img0: np.ndarray):"""Preprocess image according to YOLOv8 input requirements.Takes image in np.array format, resizes it to specific size using letterbox resize and changes data layout from HWC to CHW.Parameters:img0 (np.ndarray): image for preprocessingReturns:img (np.ndarray): image after preprocessing"""# resizeimg = letterbox(img0)[0]# Convert HWC to CHWimg = img.transpose(2, 0, 1)img = np.ascontiguousarray(img)return imgdef image_to_tensor(image: np.ndarray):"""Preprocess image according to YOLOv8 input requirements.Takes image in np.array format, resizes it to specific size using letterbox resize and changes data layout from HWC to CHW.Parameters:img (np.ndarray): image for preprocessingReturns:input_tensor (np.ndarray): input tensor in NCHW format with float32 values in [0, 1] range"""input_tensor = image.astype(np.float32)  # uint8 to fp32input_tensor /= 255.0  # 0 - 255 to 0.0 - 1.0# add batch dimensionif input_tensor.ndim == 3:input_tensor = np.expand_dims(input_tensor, 0)return input_tensor
def postprocess(nc,pred_boxes:np.ndarray,input_hw:Tuple[int, int],orig_img:np.ndarray,min_conf_threshold:float = 0.25,nms_iou_threshold:float = 0.7,agnosting_nms:bool = False,max_detections:int = 300,pred_masks:np.ndarray = None,retina_mask:bool = False
):"""YOLOv8 model postprocessing function. Applied non maximum supression algorithm to detections and rescale boxes to original image sizeParameters:pred_boxes (np.ndarray): model output prediction boxesinput_hw (np.ndarray): preprocessed imageorig_image (np.ndarray): image before preprocessingmin_conf_threshold (float, *optional*, 0.25): minimal accepted confidence for object filteringnms_iou_threshold (float, *optional*, 0.45): minimal overlap score for removing objects duplicates in NMSagnostic_nms (bool, *optiona*, False): apply class agnostinc NMS approach or notmax_detections (int, *optional*, 300):  maximum detections after NMSpred_masks (np.ndarray, *optional*, None): model ooutput prediction masks, if not provided only boxes will be postprocessedretina_mask (bool, *optional*, False): retina mask postprocessing instead of native decodingReturns:pred (List[Dict[str, np.ndarray]]): list of dictionary with det - detected boxes in format [x1, y1, x2, y2, score, label] and segment - segmentation polygons for each element in batch"""nms_kwargs = {"agnostic": agnosting_nms, "max_det":max_detections}# if pred_masks is not None:#     nms_kwargs["nm"] = 32preds = ops.non_max_suppression(torch.from_numpy(pred_boxes),min_conf_threshold,nms_iou_threshold,nc=nc,**nms_kwargs)results = []proto = torch.from_numpy(pred_masks) if pred_masks is not None else Nonefor i, pred in enumerate(preds):shape = orig_img[i].shape if isinstance(orig_img, list) else orig_img.shapeif not len(pred):results.append({"det": [], "segment": []})continueif proto is None:pred[:, :4] = ops.scale_boxes(input_hw, pred[:, :4], shape).round()results.append({"det": pred})continueif retina_mask:pred[:, :4] = ops.scale_boxes(input_hw, pred[:, :4], shape).round()masks = ops.process_mask_native(proto[i], pred[:, 6:], pred[:, :4], shape[:2])  # HWCsegments = [ops.scale_segments(input_hw, x, shape, normalize=False) for x in ops.masks2segments(masks)]else:masks = ops.process_mask(proto[i], pred[:, 6:], pred[:, :4], input_hw, upsample=True)pred[:, :4] = ops.scale_boxes(input_hw, pred[:, :4], shape).round()segments = [ops.scale_segments(input_hw, x, shape, normalize=False) for x in ops.masks2segments(masks)]results.append({"det": pred[:, :6].numpy(), "segment": segments})return resultsdef detect(image:np.ndarray, model:Model,nc):"""OpenVINO YOLOv8 model inference function. Preprocess image, runs model inference and postprocess results using NMS.Parameters:image (np.ndarray): input image.model (Model): OpenVINO compiled model.Returns:detections (np.ndarray): detected boxes in format [x1, y1, x2, y2, score, label]"""num_outputs = len(model.outputs)preprocessed_image = preprocess_image(image)input_tensor = image_to_tensor(preprocessed_image)result = model(input_tensor)boxes = result[model.output(0)]masks = Noneif num_outputs > 1:masks = result[model.output(1)]input_hw = input_tensor.shape[2:]detections = postprocess(nc=nc,pred_boxes=boxes, input_hw=input_hw, orig_img=image, pred_masks=masks)return detectionsdef transform_fn(data_item):# unpack input images tensorimages = data_item[0]# convert input tensor into float formatimages = images.float()# scale inputimages = images / 255# convert torch tensor to numpy arrayimages = images.cpu().detach().numpy()return images
class YOLOv5POTDataLoader(DataLoader):"""Inherit from DataLoader function and implement for YOLOv5."""def __init__(self, data_source):super().__init__({})self._data_loader = data_sourceself._data_iter = iter(self._data_loader)def __len__(self):return len(self._data_loader.dataset)def __getitem__(self, item):try:batch_data = next(self._data_iter)except StopIteration:self._data_iter = iter(self._data_loader)batch_data = next(self._data_iter)im, target, path, shape = batch_dataim = im.float()im /= 255nb, _, height, width = im.shapeimg = im.cpu().detach().numpy()target = target.cpu().detach().numpy()annotation = dict()annotation["image_path"] = pathannotation["target"] = targetannotation["batch_size"] = nbannotation["shape"] = shapeannotation["width"] = widthannotation["height"] = heightannotation["img"] = imgreturn (item, annotation), imgdef create_data_source(dataset_yaml):data = check_dataset(dataset_yaml)val_dataloader = create_dataloader(data["val"], imgsz=640, batch_size=1, stride=32, pad=0.5, workers=1)[0]return val_dataloaderdef detect_without_preprocess(nc,image:np.ndarray, model:Model):"""OpenVINO YOLOv8 model with integrated preprocessing inference function. Preprocess image, runs model inference and postprocess results using NMS.Parameters:image (np.ndarray): input image.model (Model): OpenVINO compiled model.Returns:detections (np.ndarray): detected boxes in format [x1, y1, x2, y2, score, label]:param nc:"""output_layer = model.output(0)img = letterbox(image)[0]input_tensor = np.expand_dims(img, 0)input_hw = img.shape[:2]result = model(input_tensor)[output_layer]detections = postprocess(result, input_hw, image)return detections

相关文章:

ubuntu20.04 openvino的yolov8推理(nncf量化)

1.环境配置: pip install openvino-dev(2023.0.1) pip install nncf(2.5.0) pip install ultralytics 2.模型转换及nncf量化: 1.pytorch->onnx: # Pytorch模型转换为Onnx模型 python from ultralytics import YOLO model YOLO(yolov8s.pt) # yo…...

《Python星球日记》第26天:Matplotlib 可视化

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 订阅专栏:《Python星球日记》 目录 一、Matplotlib 简介1. 什么是 Matplo…...

2025蓝桥杯python A组题解

真捐款去了,好长时间没练了,感觉脑子和手都不转悠了。 B F BF BF 赛时都写假了, G G G 也只写了爆搜。 题解其实队友都写好了,我就粘一下自己的代码,稍微提点个人的理解水一篇题解 队友题解 B 思路: 我…...

OpenHarmony - 小型系统内核(LiteOS-A)(一)

OpenHarmony - 小型系统内核(LiteOS-A)(一) 一、小型系统内核概述 简介 OpenHarmony 轻量级内核是基于IoT领域轻量级物联网操作系统Huawei LiteOS内核演进发展的新一代内核,包含LiteOS-M和LiteOS-A两类内核。LiteOS-…...

Neo4j GDS-13-neo4j GDS 库中节点插入算法实现

neo4j GDS 系列 Neo4j APOC-01-图数据库 apoc 插件介绍 Neo4j GDS-01-graph-data-science 图数据科学插件库概览 Neo4j GDS-02-graph-data-science 插件库安装实战笔记 Neo4j GDS-03-graph-data-science 简单聊一聊图数据科学插件库 Neo4j GDS-04-图的中心性分析介绍 Neo…...

js中this的指向问题

前言: 在js中,this出现的位置多种多样,你会不会迷糊呢?this到底指代的是哪个对象?这篇文章带你搞懂不同场景下this的指向问题。 this出现场景: 从作用域的角度来讲,this出现的位置无非就是两…...

【3dSwap】3D-Aware Face Swapping

文章目录 3D-Aware Face Swapping背景points贡献方法从2D图像推断3D先验通过潜在代码操纵进行人脸交换联合枢轴调整目标函数实验与二维人脸交换方法比较进一步分析3D感知人脸交换消融实验局限性3D-Aware Face Swapping 会议/期刊:CVPR 2023 作者: code:https://lyx0208.gi…...

基于STM32的智能门禁系统

2.1系统方案设计 本课题为基于STM32的智能门禁系统的设计,其系统架构如图2.1所示,整个系统由STM32F103单片机和MaixBit开发板两部分构成,其中MaixBit是基于K210芯片的开发板,在此主要负责人脸的录入,识别,…...

用链表、信号,实现简易MP3项目

链表实现MP3 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <time.h> #include <dirent.h> #include <sys/stat.h> #include <sys/types.h> #include <glob.h> #inc…...

YOLO检测目标后实现距离测量

当我们使用YOLO检测器得到检测结果后&#xff0c;我们如何计算检测的物体距离相机的位置呢&#xff1f; 目前&#xff0c;有三种较为主流的距离计算方法&#xff0c;分别是单目测距、双目测距以及基于深度估计的测距方法。 单目测距 工作原理&#xff1a;单目测距使用一个摄像…...

js 效果展示 拿去练手

自学完整功能&#xff0c;拿去练手。 鼠标移动放大 通过网盘分享的文件&#xff1a;图片放大 链接: https://pan.baidu.com/s/1w8SjtKi4kUNDnZtRDfYMeQ?pwd95p6 提取码: 95p6 通过网盘分享的文件&#xff1a;图片动画效果 链接: https://pan.baidu.com/s/1Pjphx-Cc4HQQNNujr…...

【算法】 欧拉函数与欧拉降幂 python

欧拉函数 欧拉函数 ϕ ( n ) \phi(n) ϕ(n) 表示小于等于 n 的正整数中与 n 互质的数的个数。即&#xff1a; ϕ ( n ) ∣ { k ∈ Z ∣ 1 ≤ k ≤ n , gcd ⁡ ( k , n ) 1 } ∣ \phi(n) \left| \{ k \in \mathbb{Z}^ \mid 1 \leq k \leq n, \gcd(k, n) 1 \} \right| ϕ(n)…...

Qt触摸屏隐藏鼠标指针

Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 使用Qt开发的屏幕软件HMI不需要显示鼠标&#xff0c;qt设置&#xff0c;可以在只启动HMI的时候隐藏光标&#xff0c;退出时再显示。 1.如果只希望在某个 widget 中不显示鼠标指针&#xf…...

QT聊天项目DAY01

1.新建初始项目 2.修改UI格式 运行效果 3.创建登录界面 设计登录界面UI 设计布局 调整布局间距 往水平布局中拖入标签和文本输入框 更换控件名称并固定高度 添加窗口部件 往现有的资源文件中导入图片 添加水平布局 4.设置登陆界面为主窗口的核心组件 #pragma once#include &l…...

Stable Diffusion +双Contronet:从 ControlNet 边缘图到双条件融合:实现服装图像生成的技术演进——项目学习记录

前言 学习记录contronet优化&#xff1a;最近&#xff0c;我基于 diffusers 库的 ControlNet&#xff0c;探索了如何通过 Canny 边缘图控制服装图像生成&#xff0c;并逐步升级到融合颜色图的双条件模型。有不断的问题、解决和进步&#xff0c;从最初的边缘图生成到最终实现 2…...

【Hadoop入门】Hadoop生态之Spark简介

1 什么是Spark&#xff1f; Apache Spark 是一个开源的分布式计算框架&#xff0c;专为处理大规模数据而设计。它提供了高效、通用的集群计算能力&#xff0c;支持内存计算&#xff0c;能够显著提高数据处理和分析的速度。Spark 已经成为大数据处理领域的重要工具&#xff0c;广…...

深度学习学习笔记

目录 摘要 Abstracts 简介 Hourglass Module&#xff08;Hourglass 模块&#xff09; 网络结构 Intermediate Supervision&#xff08;中间监督&#xff09; 训练过程细节 评测结果 摘要 本周阅读了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…...

小米运维面试题及参考答案(80道面试题)

请讲解一下 linux top 后进程的状态 在 Linux 系统中,使用top命令可以查看系统中正在运行的进程的相关信息,进程通常有以下几种状态: 运行(R):表示进程正在 CPU 上运行或者正在运行队列中等待运行。处于运行状态的进程正在积极地使用 CPU 资源来执行其任务。睡眠(S):进…...

动态多目标优化:基于可学习预测的动态多目标进化算法(DIP-DMOEA)求解CEC2018(DF1-DF14),提供MATLAB代码

一、DIP-DMOEA介绍 基于可学习预测的动态多目标进化算法&#xff08;Learning-Based Directional Improvement Prediction for Dynamic Multiobjective Optimization&#xff0c;DIP-DMOEA&#xff09;是2024年提出的一种动态多目标进化算法&#xff0c;核心在于利用神经网络学…...

第十六届蓝桥杯大赛软件赛省赛 C/C++ 大学B组

由于官方没有公布题目的数据, 所以代码仅供参考 1. 移动距离 题目链接&#xff1a;P12130 [蓝桥杯 2025 省 B] 移动距离 - 洛谷 【问题描述】 小明初始在二维平面的原点&#xff0c;他想前往坐标 (233, 666)。在移动过程中&#xff0c;他 只能采用以下两种移动方式&#xf…...

《Nature Methods》新算法|MARBLE利用几何深度学习解释神经群体动力学

一、写在前面 本次分享的是2025年2月发布于《Nature Methods》的题为"MARBLE:interpretable representations of neural population dynamics using geometric deep learning"的文章。在神经科学和机器学习领域交汇的今天&#xff0c;我们不断探索如何从复杂的神经活…...

【力扣hot100题】(093)最长公共子序列

还算是挺简单的一题。 维护二维数组代表截至至两个字符串的某个位置&#xff0c;前面的最长公共子序列长度。 状态转移方程就是当两字符相等是&#xff0c;取俩位置前一个的值加一&#xff0c;否则就直接等于俩位置前一个值。 class Solution { public:int longestCommonSub…...

(打卡)794. 高精度除法

C&#xff1a; Python&#xff1a; aint(input()) bint(input()) print(a//b) print(a%b)...

网络5 TCP/IP 虚拟机桥接模式、NAT、仅主机模式

TCP/IP模型 用于局域网和广域网&#xff1b;多个协议&#xff1b;每一层呼叫下一层&#xff1b;四层&#xff1b;通用标准 TCP/IP模型 OSI七层模型 应用层 应用层 表示层 会话层 传输层 传输层 网络层 网络层 链路层 数据链路层 物理层 链路层&#xff1a;传数据帧&#xff0…...

GPU虚拟化技术在深度学习集群中的应用实践

一、深度学习集群的算力困境 某些985高校AI实验室曾面临典型算力管理难题&#xff1a;其配备的4台8卡A100服务器&#xff08;总价值超300万元&#xff09;实际利用率仅38%。学生提交的PyTorch任务常因GPU抢占导致训练中断&#xff0c;而部分研究组独占显卡却仅运行Jupyter Not…...

从零实现基于扩散模型的文本到视频生成系统:技术详解与Pytorch代码实现

本文详细介绍了基于扩散模型构建的文本到视频生成系统&#xff0c;展示了在MSRV-TT和Shutterstock视频标注数据集上训练的模型输出结果。以下是模型在不同提示词下的生成示例。 首先展示一些模型生成效果展示 提示词&#xff1a;“A person holding a camera”&#xff08;训练…...

每天学一个 Linux 命令(14):cat

Linux 文件查看与合并命令:cat cat(全称 concatenate)是 Linux 中用于查看文件内容、合并文件或创建简单文件的基础命令。它操作简单但功能灵活,是日常文件处理的常用工具。 1. 命令作用 查看文件内容:直接输出文件内容到终端。合并文件:将多个文件内容合并输出或保存到…...

05--MQTT物联网协议

一、MQTT的概念 MQTT 协议快速入门 2025&#xff1a;基础知识和实用教程 | EMQ 1.MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它…...

免费下载 | 2025天津大学:智能制造与数字孪生技术:面向可持续制造方向发展

一、新一代智能制造模式下的思考 当代智能制造的发展阶段 智能制造定义&#xff1a;智能制造是基于新一代信息通信技术与先进制造技术深度融合&#xff0c;贯穿于设计、生产、管理、服务等制造活动的各个环节&#xff0c;具有自感知、自学习、自决策、自执行、自适应等功能的新…...

考研单词笔记 2025.04.12

aware a知道的&#xff0c;意识到的&#xff0c;警觉的 awareness n意识&#xff0c;了解&#xff0c;觉察 conscious a有意识的&#xff0c;意识到的&#xff0c;有意的&#xff0c;刻意的&#xff0c;神志清醒的&#xff0c;慎重的&#xff0c;关注的 unconscious a无意识…...

八股总结(Java)持续更新!

八股总结&#xff08;java&#xff09; ArrayList和LinkedList有什么区别 ArrayList底层是动态数组&#xff0c;LinkedList底层是双向链表&#xff1b;前者利于随机访问&#xff0c;后者利于头尾插入&#xff1b;前者内存连续分配&#xff0c;后者通过指针连接多块不连续的内存…...

SpringBoot3快速入门笔记

springboot3简介 SpringBoot 帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用&#xff08;说明&#xff1a;SpringBoot底层是Spring&#xff09; 大多数 SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术 特性&#xff1a; ● 快速创建…...

vue3中,element-plus中el-input的v-model和value的用法示例

el-input的v-model&#xff0c;邦定响应式变量 <el-col :span"6"><el-form-item label"检验类别" prop"verifyType"><el-input v-model"applyAllInfo.applyBasicInfo.verifyTypeName" readonly /></el-form-item…...

python求π近似值

【问题描述】用公式π/4≈1-1/31/5-1/7..1/(2*N-1).求圆周率PI的近似值。 从键盘输入一个整数N值&#xff0c;利用上述公式计算出π的近似值&#xff0c;然后输出π值&#xff0c;保留小数后8位。 【样例输入】1000 【样例输出】3.14059265 def countpi(N):p0040nowid0for i i…...

Gerapy二次开发:搜索器组件设计开发与应用(Vue父子组件通信)

搜索器组件设计开发与应用 写在前面搜索器字段定义与样式设计具体实现components/Search.vuedeploy/Index.vue后端views.py运行效果总结欢迎加入Gerapy二次开发教程专栏! 本专栏专为新手开发者精心策划了一系列内容,旨在引领你深入探索Gerapy框架的二次迭代之旅。 本专栏将全…...

深入解析Python爬虫技术:从基础到实战的功能工具开发指南

一、引言:Python 爬虫技术的核心价值 在数据驱动的时代,网络爬虫作为获取公开数据的重要工具,正发挥着越来越关键的作用。Python 凭借其简洁的语法、丰富的生态工具以及强大的扩展性,成为爬虫开发的首选语言。根据 Stack Overflow 2024 年开发者调查,68% 的专业爬虫开发者…...

Python爬虫-爬取全球股市涨跌幅和涨跌额数据

前言 本文是该专栏的第52篇,后面会持续分享python爬虫干货知识,记得关注。 本文中,笔者将基于Python爬虫,实现批量采集全球股市行情(亚洲,美洲,欧非,其他等)的各股市“涨跌幅”以及“涨跌额”数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。…...

【NLP 59、大模型应用 —— BPE 算法】

你和生生不息的河流&#xff0c;生动了我人生中的美好瞬间 —— 25.4.11 一、词表的构造问题 为了nlp模型训练&#xff0c;词表&#xff08;字表&#xff09;是必要的 统计训练语料中的所有字符&#xff08;或词&#xff09;是一种做法&#xff0c;但是容易出现一些问题&…...

SQL基础入门:从CRUD到JOIN再到索引(通俗易懂版)

一、为什么需要SQL&#xff1f; 想象你在管理一个图书馆&#xff1a; 传统方法&#xff1a;手动记录每本书的位置、借阅者、归还日期SQL方法&#xff1a;用数据库系统自动管理&#xff0c;快速查询《Java编程思想》在哪个书架 SQL&#xff08;Structured Query Language&…...

系统编程1(进程的概念与原理)

进程的概念与原理 计算机组成部分一般遵循冯诺依曼结构&#xff0c;也就是由控制器、运算器、存储器、输入设备、输出设备五个部分组成。 ⦁ 程序的编译 一般在编写出程序之后&#xff0c;并不能直接运行&#xff0c;而是需要把程序通过编译器进行编译&#xff0c;生成可执行…...

Git基础知识

Git基础知识 目录 一、Git简介 1.1 什么是Git&#xff1f;1.2 基本概念1.3 Git与其他版本控制系统的区别 二、Git安装与配置 2.1 安装Git2.2 基础配置2.3 高级配置2.4 多账户配置 三、基本操作 3.1 创建仓库3.2 基本工作流3.3 分支操作3.4 查看历史 四、高级操作 4.1 撤销修改…...

【Flink运行时架构】核心组件

在Flink的运行架构中&#xff0c;有两大比较重要的组件&#xff1a;作业管理器&#xff08;JobManager&#xff09;和任务管理器&#xff08;TaskManager&#xff09;。 Flink的作业提交与任务处理时的系统如下图所示。 其中&#xff0c;客户端并不是处理系统的一部分&#xff…...

【区块链安全 | 第四十篇】合约审计之delegatecall(二)

文章目录 漏洞代码代码分析攻击流程攻击代码前文重现修复建议审计思路 在阅读本文之前&#xff0c;请确保已先行阅读&#xff1a;【区块链安全 | 第三十九篇】合约审计之delegatecall&#xff08;一&#xff09; 漏洞代码 存在一漏洞代码如下&#xff1a; // 库合约&#xf…...

Redis实现分布式定时任务

设计思路 任务表示&#xff1a;每个任务通过一个特定格式的键来表示。键名可以包含任务ID等信息&#xff0c;值可以是任务的具体内容或指向任务详情的引用。过期机制&#xff1a;利用Redis的EXPIRE命令为任务设置过期时间&#xff0c;当到达设定的时间点时&#xff0c;Redis会…...

ERC20合约的基本调用

文章目录 ERC20合约的基本调用合约功能compile.js 代码读取文件 进行合约编译获取二进制对象导出对象 index.js 代码编译合约读取私钥设置收款账户构造 web3 对象获取账户地址获取 abi 和 bin创建合约交易部署合约构造转账交易验证转账后余额 测试项目目录执行查询 ERC20合约的…...

『Kubernetes(K8S) 入门进阶实战』实战入门 - Pod 详解

『Kubernetes(K8S) 入门进阶实战』实战入门 - Pod 详解 Pod 结构 每个 Pod 中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类 用户程序所在的容器&#xff0c;数量可多可少Pause 容器&#xff0c;这是每个 Pod 都会有的一个根容器&#xff0c;它的作用有两个 可…...

【React框架】什么是 Vite?如何使用vite自动生成react的目录?

什么是 Vite&#xff1f; Vite 是一个基于原生 ES Modules 开发的前端构建工具&#xff0c;由 Evan You&#xff08;Vue 的作者&#xff09;开发。它最大的特点包括&#xff1a; 极速冷启动&#xff1a;因为利用了浏览器原生的 ES Modules&#xff0c;所以在开发时无需等待整…...

JS实现文件点击或者拖拽上传

B站看到了渡一大师课的切片&#xff0c;自己实现了一下&#xff0c;做下记录 效果展示 分为上传前、上传中和上传后 实现 分为两步 界面交互网络请求 源码如下 upload.html <!DOCTYPE html> <html lang"zh-CN"><head><meta charset&q…...

【Vue #3】指令补充样式绑定

一、指令修饰符 Vue 的指令修饰符&#xff08;Directive Modifiers&#xff09;是 Vue 模板语法中的重要特性&#xff0c;它们以半角句号 . 开头&#xff0c;用于对指令的绑定行为进行特殊处理 修饰符作用如下&#xff1a; 简化事件处理&#xff08;如阻止默认行为、停止冒泡…...

Vue.js组件安全工程化演进:从防御体系构建到安全性能融合

——百万级流量场景下的安全组件架构与源码级解决方案 文章目录 总起&#xff1a;安全工程化的组件革命 分论&#xff1a; 一、现存组件架构的七宗罪与安全改造路径   1.1 组件生态安全赤字现状   1.2 架构级安全缺陷深度剖析   1.3 性能与安全的死亡螺旋 二、百万级…...