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

保姆级教程:RK3588部署yolo目标检测模型

本文用到的板卡设备为鲁班猫4(LubanCat-4),瑞芯微rk3588系列处理器。

官方文档写的挺详细了,但是版本太多不统一,而且涉及了多个代码仓库,稍显杂乱。本着最少代码原则,仅需下载一个代码仓库,将整个实践过程记录一下。

整体分为两大块:

  • PartA:在PC上,训练yolo目标检测模型(.pt格式);再转为.onnx格式;最后转为.rknn格式。
  • PartB:在板卡上,运行rknn格式的模型。

PartA 得到rknn格式的模型

1.数据集准备与模型训练

此类教程太多,此处省略,训练得到.pt格式的模型。(本文用的是yolov8版本)

2.pt转onnx

        虽然yolo的官方库ultralytics也提供了直接导出onnx模型的接口,但是转出来的模型格式有差异,与后续代码不匹配,因此采用下面的代码库(基于yolo的官方库ultralytics做了修改)。

克隆该仓库的代码:https://github.com/airockchip/ultralytics_yolov8

# 调整 ./ultralytics/cfg/default.yaml 中 model 文件路径为自己所训练的模型路径export PYTHONPATH=./
python ./ultralytics/engine/exporter.py# 执行完毕后,会生成 ONNX 模型. 假如原始模型为 yolov8n.pt,则生成 yolov8n.onnx 模型。

3.onnx转rknn

3.1环境准备 

根据你的python版本去https://github.com/airockchip/rknn-toolkit2/tree/master/rknn-toolkit2/packages/x86_64 下载requirements_xxx.txt 和 rknn_toolkit2-xxx.whl (不用下载整个代码库,太大了用不着)

# 以python3.9为例
pip install -r requirements_cp39-2.3.2.txt
pip install rknn_toolkit2-2.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

3.2 转换

代码convert.py(参考官方)

import sys 
from rknn.api import RKNNDATASET_PATH = './quant_dataset.txt'
DEFAULT_RKNN_PATH = './yolov8.rknn' #转换后的模型路径
DEFAULT_QUANT = True  # 是否需要量化def parse_arg():if len(sys.argv) < 3:print("Usage: python3 {} onnx_model_path [platform] [dtype(optional)] [output_rknn_path(optional)]".format(sys.argv[0]));print("       platform choose from [rk3562, rk3566, rk3568, rk3576, rk3588, rv1126b, rv1109, rv1126, rk1808]")print("       dtype choose from [i8, fp] for [rk3562, rk3566, rk3568, rk3576, rk3588, rv1126b]")print("       dtype choose from [u8, fp] for [rv1109, rv1126, rk1808]")exit(1)model_path = sys.argv[1]platform = sys.argv[2]do_quant = DEFAULT_QUANTif len(sys.argv) > 3:model_type = sys.argv[3]if model_type not in ['i8', 'u8', 'fp']:print("ERROR: Invalid model type: {}".format(model_type))exit(1)elif model_type in ['i8', 'u8']:do_quant = Trueelse:do_quant = Falseif len(sys.argv) > 4:output_path = sys.argv[4]else:output_path = DEFAULT_RKNN_PATHreturn model_path, platform, do_quant, output_pathdef gen_quant_dataset():import globimport random# 随机选择50张图片image_paths = glob.glob("./dataset/images/train/*.jpg")calib_paths = random.sample(image_paths, 50)with open(DATASET_PATH, "w") as f:for path in calib_paths:f.write(path + "\n")if __name__ == '__main__':model_path, platform, do_quant, output_path = parse_arg()if do_quant:gen_quant_dataset()# Create RKNN objectrknn = RKNN(verbose=False)# Pre-process configprint('--> Config model')rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform=platform)print('done')# Load modelprint('--> Loading model')ret = rknn.load_onnx(model=model_path)if ret != 0:print('Load model failed!')exit(ret)print('done')# Build modelprint('--> Building model')ret = rknn.build(do_quantization=do_quant, dataset=DATASET_PATH)if ret != 0:print('Build model failed!')exit(ret)print('done')# Export rknn modelprint('--> Export rknn model')ret = rknn.export_rknn(output_path)if ret != 0:print('Export rknn model failed!')exit(ret)print('done')# Releaserknn.release()

如果需要进行量化,需要准备一个有若干张图片地址的txt文件(暂时没搞懂原理),于是上述代码中加了个方法def gen_quant_dataset() 用于生成该文件。

python convert.py yolov8n.onnx rk3588
# 运行后会得到yolov8n.rknn

4.在PC端模拟仿真

需要用到以下3个python文件。

1. test.py

# test.py
import os
from rknn.api import RKNN
import cv2 
import numpy as np
from yolov8 import post_process,draw
from coco_utils import COCO_test_helperif __name__ == '__main__':IMG_SIZE = 640 ONNX_MODEL = './yolov8n.onnx'QUANTIZE_ON = FalseDATASET = './quant_dataset.txt'img_path = 'dataset/images/val/test_image.jpg'# 创建RKNN对象rknn = RKNN(verbose=True)# 设置模型转换参数,这里可以指定平台,添加target_platform='rk3588'配置,默认rk3566# mean_values是设置输入的均值,std_values是输入的归一化值print('--> Config model')rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform='rk3588')print('done')# 导入onnx模型,使用model指定onnx模型路径print('--> Loading model')ret = rknn.load_onnx(model=ONNX_MODEL)if ret != 0:print('Load model failed!')exit(ret)print('done')# 构建RKNN模型,这里设置do_quantization为true开启量化,dataset是指定用于量化校正的数据集print('--> Building model')ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET)if ret != 0:print('Build model failed!')exit(ret)print('done')# 调用init_runtime接口初始化运行时环境,默认是在PC上模拟仿真print('--> Init runtime environment')ret = rknn.init_runtime()if ret != 0:print('Init runtime environment failed!')exit(ret)print('done')# 设置输出,用于模型推理co_helper = COCO_test_helper(enable_letter_box=True)img_src = cv2.imread(img_path)pad_color = (0,0,0)img = co_helper.letter_box(im= img_src.copy(), new_shape=(IMG_SIZE, IMG_SIZE), pad_color=(0,0,0))img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 进行推理,没有设置target默认使用模拟器,之后对输出数据后处理并保存结果print('--> Running model')outputs = rknn.inference(inputs=[img])#print(outputs)print("len(outputs):", len(outputs))boxes, classes, scores = post_process(outputs)img_p = img_src.copy()if boxes is not None:draw(img_p, co_helper.get_real_box(boxes), scores, classes)img_name = os.path.basename(img_path)result_path = 'output_' + img_namecv2.imwrite(result_path, img_p)print('Detection result save to {}'.format(result_path))print('done')rknn.release()

2. yolov8.py,参考官方,仅保留了必要代码。

import os
import cv2
import sys
import argparse
from coco_utils import COCO_test_helper
import numpy as npOBJ_THRESH = 0.25
NMS_THRESH = 0.45# The follew two param is for map test
# OBJ_THRESH = 0.001
# NMS_THRESH = 0.65IMG_SIZE = (640, 640)  # (width, height), such as (1280, 736)CLASSES = ("person", "bicycle", "car")coco_id_list = [1, 2, 3]def filter_boxes(boxes, box_confidences, box_class_probs):"""Filter boxes with object threshold."""box_confidences = box_confidences.reshape(-1)candidate, class_num = box_class_probs.shapeclass_max_score = np.max(box_class_probs, axis=-1)classes = np.argmax(box_class_probs, axis=-1)_class_pos = np.where(class_max_score* box_confidences >= OBJ_THRESH)scores = (class_max_score* box_confidences)[_class_pos]boxes = boxes[_class_pos]classes = classes[_class_pos]return boxes, classes, scoresdef nms_boxes(boxes, scores):"""Suppress non-maximal boxes.# Returnskeep: ndarray, index of effective boxes."""x = boxes[:, 0]y = boxes[:, 1]w = boxes[:, 2] - boxes[:, 0]h = boxes[:, 3] - boxes[:, 1]areas = w * horder = scores.argsort()[::-1]keep = []while order.size > 0:i = order[0]keep.append(i)xx1 = np.maximum(x[i], x[order[1:]])yy1 = np.maximum(y[i], y[order[1:]])xx2 = np.minimum(x[i] + w[i], x[order[1:]] + w[order[1:]])yy2 = np.minimum(y[i] + h[i], y[order[1:]] + h[order[1:]])w1 = np.maximum(0.0, xx2 - xx1 + 0.00001)h1 = np.maximum(0.0, yy2 - yy1 + 0.00001)inter = w1 * h1ovr = inter / (areas[i] + areas[order[1:]] - inter)inds = np.where(ovr <= NMS_THRESH)[0]order = order[inds + 1]keep = np.array(keep)return keepdef dfl(position):# Distribution Focal Loss (DFL)import torchx = torch.tensor(position)n,c,h,w = x.shapep_num = 4mc = c//p_numy = x.reshape(n,p_num,mc,h,w)y = y.softmax(2)acc_metrix = torch.tensor(range(mc)).float().reshape(1,1,mc,1,1)y = (y*acc_metrix).sum(2)return y.numpy()def box_process(position):grid_h, grid_w = position.shape[2:4]col, row = np.meshgrid(np.arange(0, grid_w), np.arange(0, grid_h))col = col.reshape(1, 1, grid_h, grid_w)row = row.reshape(1, 1, grid_h, grid_w)grid = np.concatenate((col, row), axis=1)stride = np.array([IMG_SIZE[1]//grid_h, IMG_SIZE[0]//grid_w]).reshape(1,2,1,1)position = dfl(position)box_xy  = grid +0.5 -position[:,0:2,:,:]box_xy2 = grid +0.5 +position[:,2:4,:,:]xyxy = np.concatenate((box_xy*stride, box_xy2*stride), axis=1)return xyxydef post_process(input_data):boxes, scores, classes_conf = [], [], []defualt_branch=3pair_per_branch = len(input_data)//defualt_branch# Python 忽略 score_sum 输出for i in range(defualt_branch):boxes.append(box_process(input_data[pair_per_branch*i]))classes_conf.append(input_data[pair_per_branch*i+1])scores.append(np.ones_like(input_data[pair_per_branch*i+1][:,:1,:,:], dtype=np.float32))def sp_flatten(_in):ch = _in.shape[1]_in = _in.transpose(0,2,3,1)return _in.reshape(-1, ch)boxes = [sp_flatten(_v) for _v in boxes]classes_conf = [sp_flatten(_v) for _v in classes_conf]scores = [sp_flatten(_v) for _v in scores]boxes = np.concatenate(boxes)classes_conf = np.concatenate(classes_conf)scores = np.concatenate(scores)# filter according to thresholdboxes, classes, scores = filter_boxes(boxes, scores, classes_conf)# nmsnboxes, nclasses, nscores = [], [], []for c in set(classes):inds = np.where(classes == c)b = boxes[inds]c = classes[inds]s = scores[inds]keep = nms_boxes(b, s)if len(keep) != 0:nboxes.append(b[keep])nclasses.append(c[keep])nscores.append(s[keep])if not nclasses and not nscores:return None, None, Noneboxes = np.concatenate(nboxes)classes = np.concatenate(nclasses)scores = np.concatenate(nscores)return boxes, classes, scoresdef draw(image, boxes, scores, classes):for box, score, cl in zip(boxes, scores, classes):top, left, right, bottom = [int(_b) for _b in box]print("%s @ (%d %d %d %d) %.3f" % (CLASSES[cl], top, left, right, bottom, score))cv2.rectangle(image, (top, left), (right, bottom), (255, 0, 0), 2)cv2.putText(image, '{0} {1:.2f}'.format(CLASSES[cl], score),(top, left - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)

3. coco_utils.py,使用官方代码,未作修改。

说明:在PC端模拟仿真时,无法直接调用rknn.load_rknn, 只有先rknn.load_onnx,然后build,见test.py中的流程。

上述三个代码准备好后,在test.py中填模型和要测试的图片,运行即可看到检测结果。

Part B 板卡上部署推理

1.环境准备

电脑连接板卡,安装依赖:
pip3 install rknn-toolkit-lite2
pip3 install opencv-python  # 用于读写图片,也可用其他库代替

2.编写测试代码

测试代码run.py

from rknnlite.api import RKNNLite
import cv2
import os
import numpy as np
from yolov8 import post_process,draw
from coco_utils import COCO_test_helperdef test():img_path = 'test_image.jpg'IMG_SIZE = 640rknn_model = 'yolov8n.rknn'rknn_lite = RKNNLite()# load RKNN modelprint('--> Load RKNN model')ret = rknn_lite.load_rknn(rknn_model)if ret != 0:print('Load RKNN model failed')exit(ret)print('done')print('--> Init runtime environment')ret = rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0)if ret != 0:print('Init runtime environment failed!')exit(ret)print('done')co_helper = COCO_test_helper(enable_letter_box=True)img_src = cv2.imread(img_path)pad_color = (0,0,0)img = co_helper.letter_box(im= img_src.copy(), new_shape=(IMG_SIZE, IMG_SIZE), pad_color=(0,0,0))img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img_exp = np.expand_dims(img, axis=0)print('--> Running model')print(img_exp.shape)outputs = rknn_lite.inference(inputs=[img_exp])#print(outputs)print("len(outputs):", len(outputs))boxes, classes, scores = post_process(outputs)img_p = img_src.copy()if boxes is not None:draw(img_p, co_helper.get_real_box(boxes), scores, classes)img_name = os.path.basename(img_path)result_path = os.path.join('./result', img_name)cv2.imwrite(result_path, img_p)print('Detection result save to {}'.format(result_path))#cv2.imshow('i', img_p)#cv2.waitKey(3000)test()

将前面导出的.rknn模型要测试的图片、上面的yolov8.pycoco_utils.py传到板卡上,执行python3 run.py

注意:由于yolov8.py中的dfl方法用到了torch,如果你不想在设备上安装torch,可以用numpy进行替换:

ef dfl(position):"""Distribution Focal Loss (DFL) - NumPy 实现Args:position: 输入张量,形状 (n, c, h, w)Returns:y: 输出张量,形状 (n, p_num, h, w)"""x = np.array(position)n, c, h, w = x.shapep_num = 4  mc = c y = x.reshape(n, p_num, mc, h, w)y_exp = np.exp(y - np.max(y, axis=2, keepdims=True))y_softmax = y_exp / np.sum(y_exp, axis=2, keepdims=True)acc_metrix = np.arange(mc).reshape(1, 1, mc, 1, 1).astype(np.float32)y = np.sum(y_softmax * acc_metrix, axis=2)return y

相关文章:

保姆级教程:RK3588部署yolo目标检测模型

本文用到的板卡设备为鲁班猫4&#xff08;LubanCat-4&#xff09;&#xff0c;瑞芯微rk3588系列处理器。 官方文档写的挺详细了&#xff0c;但是版本太多不统一&#xff0c;而且涉及了多个代码仓库&#xff0c;稍显杂乱。本着最少代码原则&#xff0c;仅需下载一个代码仓库&am…...

【含文档+PPT+源码】物联网车辆GPS定位管理系统【

项目视频介绍&#xff1a; 毕业作品物联台云平台的设计与实现 课程简介&#xff1a; 本课程演示的是一款物联网车辆GPS定位管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚…...

热烈祝贺“中芯机械”选择使用订单日记

感谢潍坊中芯机械制造有限公司选择使用订单日记&#xff01; 潍坊中芯机械制造有限公司&#xff0c;成立于2023年&#xff0c;位于山东省潍坊市&#xff0c;是一家以从事生产、销售农业机械、汽车配件、机械电气设备等业务为主的企业。 在业务不断壮大的过程中&#xff0c;想…...

2025年保安员考试题库及答案

一、单选题 81、保安员张某和李某在火车站巡逻时&#xff0c;发现一男青年神色慌张&#xff0c;行为诡秘&#xff0c;这两名保安员识别这一可疑情况使用的方法是&#xff08;&#xff09;。 A.查问法 B.直接观察法 C.判断法 D.视觉判断法 答案&#xff1a;B 82、某天&…...

ADB的安装及抓取日志(1)

一、简介 ADB&#xff08;Android Debug Bridge&#xff09;是一个通用命令行工具&#xff0c;允许你与 Android 设备进行通信。它主要用于开发和调试目的&#xff0c;但也可用于其他多种功能&#xff0c;如安装应用、运行 shell 命令、查看日志等。ADB 是 Android SDK 的一部…...

用 Iris数据做决策树分析

文章目录 Iris数据的准备1.直接从sklearn.datasets 加载或转化成文件已备本地使用2.可以在https://archive.ics.uci.edu/dataset/53/iris下载 过程示例代码如下生成的决策树如下&#xff1a;生成的分析报告如下&#xff1a; 决策树模型分析报告1. 模型性能2. 特征重要性3. 决策…...

【Bluedroid】A2DP Sink播放流程源码分析(三)

AVCTP消息处理 avrc_msg_cback /packages/modules/Bluetooth/system/stack/avrc/avrc_api.cc /******************************************************************************** Function avrc_msg_cback** Description This is the callback function used…...

概念实践极速入门 - 常用的设计模式 - 简单生活例子

概念实践极速入门 - 常用的设计模式 - 简单生活例子 SOLID 五大设计原则的首字母缩写 单一职责原则 和 开闭原则 就省略啦, 这两个概念很简单, 为了写而写反而容易误导人~* 鼓励大家字面理解&#xff01; // 哎呀还是解释吧 单一(S): 单干一件事; 开闭(O): 拓展开放, 修改关…...

postgres 数据库信息解读 与 sqlshell常用指令介绍

数据库信息&#xff1a; sqlshell Server [localhost]: 192.168.30.101 Database [postgres]: Port [5432]: 5432 Username [postgres]: 用户 postgres 的口令&#xff1a; psql (15.12, 服务器 16.8 (Debian 16.8-1.pgdg1201)) 警告&#xff1a;psql 主版本15,服务器主版本为…...

映射网络路路径和ftp路径原理是什么,如何使用,有什么区别

文章目录 一、原理1. 映射网络路径2. FTP路径 二、使用方法1. 映射网络路径2. FTP路径 三、主要区别1. 协议与功能2. 安全性与权限3. 适用场景 四、如何选择&#xff1f;五、注意事项 映射网络路径&#xff08;如SMB/CIFS或NFS&#xff09;和FTP路径&#xff08;FTP/FTPS/SFTP&…...

微服务3--服务容错

前言&#xff1a;本篇主要介绍服务容错与Sentinel进行限流。 高并发带来的问题 在微服务架构中&#xff0c;我们将业务拆分为一个个的服务&#xff0c;服务与服务之间都可以相互调用&#xff0c;但是由于网络或者说服务器本身的问题&#xff0c;服务不能保证100%可用&#xff…...

4.15redis点评项目下

--->接redis点评项目上 Redis优化秒杀方案 下单流程为&#xff1a;用户请求nginx--->访问tomcat--->查询优惠券--->判断秒杀库存是否足够--->查询订单--->校验是否是一人一单--->扣减库存--->创建订单 以上流程如果要串行执行耗时会很多&#xff0c…...

Web开发-JavaEE应用原生和FastJson反序列化URLDNS链JDBC链Gadget手搓

知识点&#xff1a; 1、安全开发-JavaEE-原生序列化-URLDNS链分析 2、安全开发-JavaEE-FastJson-JdbcRowSetImpl链分析 利用链也叫"gadget chains"&#xff0c;我们通常称为gadget&#xff1a; 1、共同条件&#xff1a;实现Serializable或者Externalizable接口&…...

坚持每日Codeforces三题挑战:Day 3 - 题目详解(2024-04-16,难度:900, 1200, 1200)

每天坚持写三道题第三天 &#xff08;今天写点简单的&#xff0c;剩下去刷力扣了&#xff09; 今日题目: Problem - B - Codeforces 900 Problem - B - Codeforces 1300 Problem - D - Codeforces 1400 题目一: Problem - B - Codeforces 题目大意: 给你一个数组,每次操…...

MySQL5.7递归查询

向下递归查询 SELECT ID,NAME,PARENT_ID,LEVEL_FROM(SELECT ID AS _IDS,(SELECT ID : GROUP_CONCAT(ID)FROM TREE_TABLE WHERE FIND_IN_SET(PARENT_ID,ID) > 0AND REMOVE N) T1,L : L 1 AS LEVEL_FROM TREE_TABLE,(SELECT ID : start, L: 0) T2WHERE ID IS NOT NULL) T3,…...

半导体设备通信标准—secsgem v0.3.0版本使用说明文档(2)之GEM(SEMI 30)

文章目录 1、处理器1.1、事件 2、GEM 合规性2.1、状态模型2.2、 设备加工状态2.3、 文档2.4、 控制 &#xff08;作员启动&#xff09;2.5、 动态事件报告配置2.6、 跟踪数据收集2.7、 报警管理2.8、 远程控制2.9、 设备常量2.10、 工艺配方管理2.11、 物料移动2.12、 设备终端…...

C++异步编程从入门到精通实战:全面指南与实战案例

C异步编程从入门到精通实战&#xff1a;全面指南与实战案例 在当今多核处理器普及的时代&#xff0c;异步编程成为了提升程序性能和响应能力的关键技术。无论是在高频交易系统、实时游戏引擎&#xff0c;还是网络服务器和大型数据处理平台&#xff0c;异步编程都发挥着至关重要…...

驱动开发硬核特训 · Day 13:从 device_create 到 sysfs,设备文件是如何生成的?

&#x1f50d; B站相应的视屏教程&#xff1a; &#x1f4cc; 内核&#xff1a;博文视频 - 备树深度解析&#xff1a;理论 实践全指南&#xff08;含 of 函数与 i.MX8MP 实例&#xff09; 敬请关注&#xff0c;记得标为原始粉丝。 &#x1f527; &#x1f4cc; 本文目标&#…...

肾脏系统触发 “数据包泄漏“ (血尿)与 “元数据校验异常“(蛋白尿)

肾脏系统触发 "数据包泄漏" (血尿)与 "元数据校验异常"(蛋白尿) 用计算机术语来类比。在之前的对话中&#xff0c;肾小球被比作防火墙或过滤器&#xff0c;肾小管则是回收系统。红细胞泄漏通常是因为肾小球的过滤屏障受损&#xff0c;而蛋白尿则可能与肾小…...

密码学(二)流密码

2.1流密码的基本概念 流密码的基本思想是利用密钥 k 产生一个密钥流...&#xff0c;并使用如下规则对明文串 ... 加密&#xff1a;。密钥流由密钥流发生器产生&#xff1a; &#xff0c;这里是加密器中的记忆元件&#xff08;存储器&#xff09;在时刻 i 的状态&#xff0c…...

Python 趣味学习 -数据类型脱口秀速记公式 [特殊字符]

&#x1f3a4; Python数据类型脱口秀速记公式 &#x1f40d; 1️⃣ 四大金刚登场 "Set叔(无序洁癖)、Tuple爷(顽固老头)、List姐(百变女王)、Dict哥(万能钥匙)"2️⃣ 特性对比RAP &#x1f3b6; 内存/作用域&#xff1a; 全局变量 → 函数内修改 → 可变(mutable)会…...

嵌入式Linux设备使用Go语言快速构建Web服务,实现设备参数配置管理方案探究

本文探讨&#xff0c;利用Go语言及gin框架在嵌入式Linux设备上高效搭建Web服务器&#xff0c;以实现设备参数的网页配置。通过gin框架&#xff0c;我们可以在几分钟内创建一个功能完善的管理界面&#xff0c;方便对诸如集中器&#xff0c;集线器等没有界面的嵌入式设备的管理。…...

波束形成(BF)从算法仿真到工程源码实现-第十二节-总结

一、总结 &#xff08;1&#xff09;基于webrtc的非线性波束形成效果较好&#xff0c;复杂度较低&#xff0c;但是波束形成后引入了非线性&#xff0c;导致噪声估计不准确&#xff0c;降噪效果变差。 &#xff08;2&#xff09;MVDR使用噪声协方差矩阵对平稳噪声降噪效果比较…...

【AI】IDEA 集成 AI 工具的背景与意义

一、IDEA 集成 AI 工具的背景与意义 随着人工智能技术的迅猛发展&#xff0c;尤其是大语言模型的不断演进&#xff0c;软件开发行业也迎来了智能化变革的浪潮。对于开发者而言&#xff0c;日常工作中面临着诸多挑战&#xff0c;如代码编写的重复性劳动、复杂逻辑的实现、代码质…...

解释原型链的概念,并说明`Object.prototype.__proto__`的值是什么?

原型链是 JavaScript 中实现继承的核心机制。每个对象都有一个指向其原型对象的私有链接&#xff08;通过 [[Prototype]] 内部属性&#xff09;&#xff0c;而原型对象自身也可能拥有原型&#xff0c;这种链式结构被称为原型链。当访问对象的属性时&#xff0c;若对象自身不存在…...

prototype`和`__proto__`有什么区别?如何手动修改一个对象的原型?

在 JavaScript 中&#xff0c;prototype 和 __proto__ 都与原型链相关&#xff0c;但它们的角色和用途有本质区别&#xff1a; 1. prototype 和 __proto__ 的区别 特性prototype__proto__归属对象仅函数对象拥有&#xff08;如构造函数&#xff09;所有对象默认拥有&#xff0…...

数据挖掘案例-电力负荷预测

今日课程 时间序列预测介绍 电力负荷预测项目开发&#xff08;开发一个基于时间以及历史负荷信息&#xff0c;预测未来负荷的模型&#xff09; 一、时间序列预测简介 1.什么是时序预测 时间序列预测是一种根据历史时间序列数据来预测未来值的方法。 任务比较好理解&#…...

SQL Server中OPENJSON + WITH 来解析JSON

一、概念 OPENJSON 是 SQL Server&#xff08;2016 及更高版本&#xff09; 中引入的一个表值函数&#xff0c;它将 JSON 文本转换为行和列的关系型数据结构。通过添加 WITH 子句&#xff0c;可以明确指定返回数据的结构和类型&#xff0c;实现 JSON 数据到表格数据的精确映射…...

在 Linux 中判断当前网络类型与网卡类型的实用方法(内外网判断 + 网卡分类)

在日常使用 Linux&#xff08;例如 Jetson、树莓派、服务器&#xff09;过程中&#xff0c;我们经常会遇到以下几个问题&#xff1a; 如何知道系统当前是走 有线网络还是无线网络&#xff1f;如何判断是连接了 公网还是内网&#xff1f;169.254.x.x 是什么&#xff1f;为什么我…...

Docker compose入门

目录 Docker Compose简介安装docker compose局限一 适合单机部署&#xff0c;不适合生产环境1. 架构设计目标不同2. 关键功能对比3. 生产环境的核心需求4. 适用场景总结5. 为什么 Compose 不适合生产&#xff1f; Docker Compose 简介 Docker Compose 是一个用于简化多容器Do…...

Docker Search 和 Docker Pull 失效解决

目录 1. Docker Search 1.1 问题描述 1.2 解决方案 1.2.1 方案1 命令行方式 1.2.2 方案2 非命令行方式 2. Docker Pull 2.1 问题描述 2.2 解决方案 2.2.1 替换镜像源 2.2.1.1 编辑镜像源&#xff08;linux&#xff09;版 2.2.1.2 编辑镜像源&#xff08;windows版本…...

Langchain Agent封装的工具

LangChain Agent Tools 参考文档 本文档详细介绍了LangChain框架中可用的Agent工具及其使用方法。这些工具可以赋予AI智能体与外部系统和服务交互的能力&#xff0c;从而构建功能更强大的应用程序。 目录 工具加载方法基础工具文件和系统工具搜索和信息检索工具语言模型增强…...

Windows11删除文件时弹出提示“没有管理员权限”,怎么办?

Windows11删除文件时弹出提示“没有管理员权限”&#xff0c;怎么办&#xff1f; 原因&#xff1a;文件没有读取到完全控制的权限。 解决方法&#xff1a;点击开始-设置-账户&#xff0c;检查Windows是否登录管理员账户&#xff0c;必须登录管理员账户。然后回到电脑桌面&…...

使用HTML + CSS + JS,编写一个台球追分计分器

目录 一.代码 二.效果展示 三.该计分器的优点 一.代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

CS5346 - CHARTS: Chart with Point / Bar / Line / Box

文章目录 Chart with Point&#xff08;点图&#xff09;Scatter Chart&#xff08;散点图&#xff09;Pictogram&#xff08;图标&#xff09;Connected Scatter PlotConnected Dot plot&#xff08;连接点图&#xff09;Bubble Chart&#xff08;气泡图&#xff09; Chart wi…...

CNN实现简易教程

一、CNN基础回顾与设计原则 在开始实践之前,我们先快速回顾CNN的核心组件和设计原则,这将帮助你理解后续的代码和设计决策。 1. CNN的核心组件 卷积层(Convolutional Layer):通过卷积核提取局部特征(如边缘、纹理)。主要参数包括: 输入通道数(in_channels):输入数…...

Flask(1): 在windows系统上部署项目1

1 前言 学习python也有段时间了&#xff0c;最近一个小项目要部署&#xff0c;正好把过程写下来。 在程序的结构上我选择了w/s模式&#xff0c;相比于c/s模式&#xff0c;无需考虑客户端的升级&#xff1b;框架我选择了flask&#xff0c;就是冲着轻量级去的&#xff0c;就是插件…...

Zookeeper 可观测性最佳实践

Zookeeper 介绍 ZooKeeper 是一个开源的分布式协调服务&#xff0c;用于管理和协调分布式系统中的节点。它提供了一种高效、可靠的方式来解决分布式系统中的常见问题&#xff0c;如数据同步、配置管理、命名服务和集群管理等。本文介绍通过 DataKit 采集 Zookeeper 指标&#…...

vs2022使用git方法

1、创建git 2、在cmd下执行 git push -f origin master &#xff0c;会把本地代码全部推送到远程&#xff0c;同时会覆盖远程代码。 3、需要设置【Git全局设置】&#xff0c;修改的代码才会显示可以提交&#xff0c;否则是灰色的不能提交。 4、创建的分支&#xff0c;只要点击…...

【探商宝】跨境关税博弈下的技术破局:从头部平台现象看数字贸易体系重构

2025年4月&#xff0c;某头部跨境电商平台在北美市场上演了一场教科书级的技术突围战&#xff1a;其移动应用在72小时内从应用商店总榜300名开外飙升至第2位&#xff0c;单日下载量暴增近10倍。这场现象级爆发的背后&#xff0c;是关税政策与数字技术深度博弈的集中呈现。作为开…...

DeepSeek是否支持动态模态选择?揭秘多模态AI的智能切换能力

什么是动态模态选择&#xff1f; 想象一下你在和AI助手聊天&#xff1a; “帮我看看这张图片里有什么&#xff1f;”——AI切到视觉模式 “把图片内容写成300字总结”——切回文本模式 “再把它翻译成英文语音”——切到语音模式 这种根据任务需求自动切换处理模式的能力就是…...

Qwen2.5-Omni 部署框架选择指南:PyTorch vs. TensorFlow 深度对比

目录 一、核心结论&#xff1a;优先选择 PyTorch 方案 二、框架技术对比 1. 官方支持度 2. 性能基准测试&#xff08;RTX 4090&#xff09; 3. 关键功能支持 三、环境配置详解 1. PyTorch 推荐方案 系统配置 关键依赖 验证CUDA可用性 2. TensorFlow 替代方案&#x…...

全栈工程师角色介绍

全栈工程师&#xff08;Full Stack Engineer&#xff09;是一种综合型技术角色&#xff0c;具备从前端到后端、数据库、服务器运维等多领域的开发能力&#xff0c;并能独立完成产品全生命周期的构建与维护。其核心定义可从以下维度展开&#xff1a; 一、核心定义 技术广度与深…...

从零起步的Kaggle竞赛 - BirdCLEF2025

一个优秀的coder&#xff0c;先从CV工程开始...... 首先复制了 LB 0.804- EfficientNet B0 Pytorch Pipeline | Kaggle 这个notebook并尝试提交&#xff0c;ok&#xff0c;0.804 下载了大佬的代码试图在本地修改模型结构并训练。 以下是大佬的notebook中的代码&#xff0c;可…...

基于CNN+ViT的蔬果图像分类实验

本文只是做一个简单融合的实验&#xff0c;没有任何新颖&#xff0c;大家看看就行了。 1.数据集 本文所采用的数据集为Fruit-360 果蔬图像数据集&#xff0c;该数据集由 Horea Mureșan 等人整理并发布于 GitHub&#xff08;项目地址&#xff1a;Horea94/Fruit-Images-Datase…...

MySQL SQL 执行顺序(理论顺序)

示例 SQL&#xff1a; SELECT name, COUNT(*) FROM users WHERE age > 18 GROUP BY name HAVING COUNT(*) > 1 ORDER BY name ASC LIMIT 10;虽然语句是从 SELECT 写起的&#xff0c;但执行顺序其实是这样的&#xff1a; 执行顺序SQL 子句作用说明①FROM确定查询的…...

用Allan Deviation的方式估计长时间频率偏差

在电路设计中&#xff0c;若需要评估OSC长时间的偏差(秒级别)&#xff0c;观测的时间越多&#xff0c;低频噪声1/f上载的越厉害,如何通过PhaseNoise去有效估计长时间的偏差呢?...

无人机避障与目标识别技术分析!

一、无人机避障技术 1. 技术实现方式 传感器融合&#xff1a; 视觉传感&#xff08;RGB/双目/红外相机&#xff09;&#xff1a;基于SLAM&#xff08;同步定位与地图构建&#xff09;实现环境建模&#xff0c;但依赖光照条件。 激光雷达&#xff08;LiDAR&#xff09;&…...

2025年渗透测试面试题总结-拷打题库01(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库01 1. PHP爆绝对路径方法&#xff1f; 2. 渗透工具及最常用工具 3…...

大厂面试:六大排序

前言 本篇博客集中了冒泡&#xff0c;选择&#xff0c;二分插入&#xff0c;快排&#xff0c;归并&#xff0c;堆排&#xff0c;六大排序算法 如果觉得对你有帮助&#xff0c;可以点点关注&#xff0c;点点赞&#xff0c;谢谢你&#xff01; 1.冒泡排序 //冒泡排序&#xff…...