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

计算机设计大赛 深度学习花卉识别 - python 机器视觉 opencv

文章目录

  • 0 前言
  • 1 项目背景
  • 2 花卉识别的基本原理
  • 3 算法实现
    • 3.1 预处理
    • 3.2 特征提取和选择
    • 3.3 分类器设计和决策
    • 3.4 卷积神经网络基本原理
  • 4 算法实现
    • 4.1 花卉图像数据
    • 4.2 模块组成
  • 5 项目执行结果
  • 6 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 深度学习花卉识别 - python 机器视觉 opencv

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 项目背景

在我国有着成千上万种花卉, 但如何能方便快捷的识别辨识出这些花卉的种类成为了植物学领域的重要研究课题。 我国的花卉研究历史悠久,
是世界上研究较早的国家之一。 花卉是我国重要的物产资源, 除美化了环境, 调养身心外, 它还具有药用价值, 并且在医学领域为保障人们的健康起着重要作用。

花卉识别是植物学领域的一个重要课题, 多年来已经形成一定体系化分类系统,但需要植物学家耗费大量的精力人工分析。 这种方法要求我们首先去了解花卉的生长环境,
近而去研究花卉的整体形态特征。 在观察植株形态特征时尤其是重点观察花卉的花蕊特征、 花卉的纹理颜色和形状及其相关信息等。 然后在和现有的样本进行比对,
最终确定花卉的所属类别。

2 花卉识别的基本原理

花卉种类识别功能实现的主要途径是利用计算机对样本进行分类。 通过对样本的精准分类达到得出图像识别结果的目的。 经典的花卉识别设计如下图 所示,
这几个过程相互关联而又有明显区别。

在这里插入图片描述

3 算法实现

3.1 预处理

预处理是对处于最低抽象级别的图像进行操作的通用名称, 输入和输出均为强度图像。 为了使实验结果更精准, 需要对图像数据进行预处理, 比如,
根据需要增强图像质量、 将图像裁剪成大小一致的形状、 避免不必要的失真等等。

3.2 特征提取和选择

要想获取花卉图像中的最具代表性的隐含信息, 就必须对花卉图像数据集进行相应的变换。

特征提取旨在通过从现有特征中创建新特征(然后丢弃原始特征) 来减少数据集中的特征数量。 然后, 这些新的简化功能集应该能够汇总原始功能集中包含的大多数信息。
这样, 可以从原始集合的组合中创建原始特征的摘要版本。 对所获取的信息实现从测量空间到特征空间的转换。

3.3 分类器设计和决策

构建完整系统的适当分类器组件的任务是使用特征提取器提供的特征向量将对象分配给类别。 由于完美的分类性能通常是不可能实现的,
因此一般的任务是确定每种可能类别的概率。 输入数据的特征向量表示所提供的抽象使得能够开发出在尽可能大程度上与领域无关的分类理论。

在这里插入图片描述
在这里插入图片描述

在设计阶段, 决策功能必须重复多次, 直到错误达到特定条件为止。 分类决策是在分类器设计阶段基于预处理、 特征提取与选择及判决函数建立的模型,
对接收到的样本数据进行归类, 然后输出分类结果。

3.4 卷积神经网络基本原理

卷积神经网络是受到生物学启发的深度学习经典的多层前馈神经网络结构。 是一种在图像分类中广泛使用的机器学习算法。

CNN 的灵感来自我们人类实际看到并识别物体的方式。 这是基于一种方法,即我们眼睛中的神经元细胞只接收到整个对象的一小部分,而这些小块(称为接受场)
被组合在一起以形成整个对象。与其他的人工视觉算法不一样的是 CNN 可以处理特定任务的多个阶段的不变特征。
卷积神经网络使用的并不像经典的人工神经网络那样的全连接层, 而是通过采取局部连接和权值共享的方法, 来使训练的参数量减少, 降低模型的训练复杂度。

CNN 在图像分类和其他识别任务方面已经使传统技术的识别效果得到显著的改善。 由于在过去的几年中卷积网络的快速发展, 对象分类和目标检测能力取得喜人的成绩。

典型的 CNN 含有多个卷积层和池化层, 并具有全连接层以产生任务的最终结果。 在图像分类中, 最后一层的每个单元表示分类概率。

在这里插入图片描述

4 算法实现

4.1 花卉图像数据

花卉图像的获取除了通过用拍摄设备手工收集或是通过网络下载已经整理好的现有数据集, 还可以通过网络爬虫技术收集整理自己的数据集。

在这里插入图片描述

以roses种类的训练数据为例,文件夹内部均为该种类花的图像文件

在这里插入图片描述

4.2 模块组成

示例代码主要由四个模块组成:

  • input_data.py——图像特征提取模块,模块生成四种花的品类图片路径及对应标签的List
  • model.py——模型模块,构建完整的CNN模型
  • train.py——训练模块,训练模型,并保存训练模型结果
  • test.py——测试模块,测试模型对图片识别的准确度

项目模块执行顺序

运行train.py开始训练。
训练完成后- 运行test.py,查看实际测试结果
input_data.py——图像特征提取模块,模块生成四种花的品类图片路径及对应标签的List

import os
import math
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt# -----------------生成图片路径和标签的List------------------------------------
train_dir = 'D:/ML/flower/input_data'roses = []
label_roses = []
tulips = []
label_tulips = []
dandelion = []
label_dandelion = []
sunflowers = []
label_sunflowers = []

定义函数get_files,获取图片列表及标签列表

# step1:获取所有的图片路径名,存放到# 对应的列表中,同时贴上标签,存放到label列表中。def get_files(file_dir, ratio):for file in os.listdir(file_dir + '/roses'):roses.append(file_dir + '/roses' + '/' + file)label_roses.append(0)for file in os.listdir(file_dir + '/tulips'):tulips.append(file_dir + '/tulips' + '/' + file)label_tulips.append(1)for file in os.listdir(file_dir + '/dandelion'):dandelion.append(file_dir + '/dandelion' + '/' + file)label_dandelion.append(2)for file in os.listdir(file_dir + '/sunflowers'):sunflowers.append(file_dir + '/sunflowers' + '/' + file)label_sunflowers.append(3)# step2:对生成的图片路径和标签List做打乱处理image_list = np.hstack((roses, tulips, dandelion, sunflowers))label_list = np.hstack((label_roses, label_tulips, label_dandelion, label_sunflowers))# 利用shuffle打乱顺序temp = np.array([image_list, label_list])temp = temp.transpose()np.random.shuffle(temp)# 将所有的img和lab转换成listall_image_list = list(temp[:, 0])all_label_list = list(temp[:, 1])# 将所得List分为两部分,一部分用来训练tra,一部分用来测试val# ratio是测试集的比例n_sample = len(all_label_list)n_val = int(math.ceil(n_sample * ratio))  # 测试样本数n_train = n_sample - n_val  # 训练样本数tra_images = all_image_list[0:n_train]tra_labels = all_label_list[0:n_train]tra_labels = [int(float(i)) for i in tra_labels]val_images = all_image_list[n_train:-1]val_labels = all_label_list[n_train:-1]val_labels = [int(float(i)) for i in val_labels]return tra_images, tra_labels, val_images, val_labels**定义函数get_batch,生成训练批次数据**# --------------------生成Batch----------------------------------------------# step1:将上面生成的List传入get_batch() ,转换类型,产生一个输入队列queue,因为img和lab# 是分开的,所以使用tf.train.slice_input_producer(),然后用tf.read_file()从队列中读取图像#   image_W, image_H, :设置好固定的图像高度和宽度#   设置batch_size:每个batch要放多少张图片#   capacity:一个队列最大多少定义函数get_batch,生成训练批次数据def get_batch(image, label, image_W, image_H, batch_size, capacity):# 转换类型image = tf.cast(image, tf.string)label = tf.cast(label, tf.int32)# make an input queueinput_queue = tf.train.slice_input_producer([image, label])label = input_queue[1]image_contents = tf.read_file(input_queue[0])  # read img from a queue# step2:将图像解码,不同类型的图像不能混在一起,要么只用jpeg,要么只用png等。image = tf.image.decode_jpeg(image_contents, channels=3)# step3:数据预处理,对图像进行旋转、缩放、裁剪、归一化等操作,让计算出的模型更健壮。image = tf.image.resize_image_with_crop_or_pad(image, image_W, image_H)image = tf.image.per_image_standardization(image)# step4:生成batch# image_batch: 4D tensor [batch_size, width, height, 3],dtype=tf.float32# label_batch: 1D tensor [batch_size], dtype=tf.int32image_batch, label_batch = tf.train.batch([image, label],batch_size=batch_size,num_threads=32,capacity=capacity)# 重新排列label,行数为[batch_size]label_batch = tf.reshape(label_batch, [batch_size])image_batch = tf.cast(image_batch, tf.float32)return image_batch, label_batch**model.py——CN模型构建**import tensorflow as tf#定义函数infence,定义CNN网络结构#卷积神经网络,卷积加池化*2,全连接*2,softmax分类#卷积层1def inference(images, batch_size, n_classes):with tf.variable_scope('conv1') as scope:weights = tf.Variable(tf.truncated_normal(shape=[3,3,3,64],stddev=1.0,dtype=tf.float32),name = 'weights',dtype=tf.float32)biases = tf.Variable(tf.constant(value=0.1, dtype=tf.float32, shape=[64]),name='biases', dtype=tf.float32)conv = tf.nn.conv2d(images, weights, strides=[1, 1, 1, 1], padding='SAME')pre_activation = tf.nn.bias_add(conv, biases)conv1 = tf.nn.relu(pre_activation, name=scope.name)# 池化层1# 3x3最大池化,步长strides为2,池化后执行lrn()操作,局部响应归一化,对训练有利。with tf.variable_scope('pooling1_lrn') as scope:pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME', name='pooling1')norm1 = tf.nn.lrn(pool1, depth_radius=4, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name='norm1')# 卷积层2# 16个3x3的卷积核(16通道),padding=’SAME’,表示padding后卷积的图与原图尺寸一致,激活函数relu()with tf.variable_scope('conv2') as scope:weights = tf.Variable(tf.truncated_normal(shape=[3, 3, 64, 16], stddev=0.1, dtype=tf.float32),name='weights', dtype=tf.float32)biases = tf.Variable(tf.constant(value=0.1, dtype=tf.float32, shape=[16]),name='biases', dtype=tf.float32)conv = tf.nn.conv2d(norm1, weights, strides=[1, 1, 1, 1], padding='SAME')pre_activation = tf.nn.bias_add(conv, biases)conv2 = tf.nn.relu(pre_activation, name='conv2')# 池化层2# 3x3最大池化,步长strides为2,池化后执行lrn()操作,# pool2 and norm2with tf.variable_scope('pooling2_lrn') as scope:norm2 = tf.nn.lrn(conv2, depth_radius=4, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name='norm2')pool2 = tf.nn.max_pool(norm2, ksize=[1, 3, 3, 1], strides=[1, 1, 1, 1], padding='SAME', name='pooling2')# 全连接层3# 128个神经元,将之前pool层的输出reshape成一行,激活函数relu()with tf.variable_scope('local3') as scope:reshape = tf.reshape(pool2, shape=[batch_size, -1])dim = reshape.get_shape()[1].valueweights = tf.Variable(tf.truncated_normal(shape=[dim, 128], stddev=0.005, dtype=tf.float32),name='weights', dtype=tf.float32)biases = tf.Variable(tf.constant(value=0.1, dtype=tf.float32, shape=[128]),name='biases', dtype=tf.float32)local3 = tf.nn.relu(tf.matmul(reshape, weights) + biases, name=scope.name)# 全连接层4# 128个神经元,激活函数relu()with tf.variable_scope('local4') as scope:weights = tf.Variable(tf.truncated_normal(shape=[128, 128], stddev=0.005, dtype=tf.float32),name='weights', dtype=tf.float32)biases = tf.Variable(tf.constant(value=0.1, dtype=tf.float32, shape=[128]),name='biases', dtype=tf.float32)local4 = tf.nn.relu(tf.matmul(local3, weights) + biases, name='local4')# dropout层#    with tf.variable_scope('dropout') as scope:#        drop_out = tf.nn.dropout(local4, 0.8)# Softmax回归层# 将前面的FC层输出,做一个线性回归,计算出每一类的得分with tf.variable_scope('softmax_linear') as scope:weights = tf.Variable(tf.truncated_normal(shape=[128, n_classes], stddev=0.005, dtype=tf.float32),name='softmax_linear', dtype=tf.float32)biases = tf.Variable(tf.constant(value=0.1, dtype=tf.float32, shape=[n_classes]),name='biases', dtype=tf.float32)softmax_linear = tf.add(tf.matmul(local4, weights), biases, name='softmax_linear')return softmax_linear# -----------------------------------------------------------------------------# loss计算# 传入参数:logits,网络计算输出值。labels,真实值,在这里是0或者1# 返回参数:loss,损失值def losses(logits, labels):with tf.variable_scope('loss') as scope:cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels,name='xentropy_per_example')loss = tf.reduce_mean(cross_entropy, name='loss')tf.summary.scalar(scope.name + '/loss', loss)return loss# --------------------------------------------------------------------------# loss损失值优化# 输入参数:loss。learning_rate,学习速率。# 返回参数:train_op,训练op,这个参数要输入sess.run中让模型去训练。def trainning(loss, learning_rate):with tf.name_scope('optimizer'):optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)global_step = tf.Variable(0, name='global_step', trainable=False)train_op = optimizer.minimize(loss, global_step=global_step)return train_op# -----------------------------------------------------------------------# 评价/准确率计算# 输入参数:logits,网络计算值。labels,标签,也就是真实值,在这里是0或者1。# 返回参数:accuracy,当前step的平均准确率,也就是在这些batch中多少张图片被正确分类了。def evaluation(logits, labels):with tf.variable_scope('accuracy') as scope:correct = tf.nn.in_top_k(logits, labels, 1)correct = tf.cast(correct, tf.float16)accuracy = tf.reduce_mean(correct)tf.summary.scalar(scope.name + '/accuracy', accuracy)return accuracy**train.py——利用D:/ML/flower/input_data/路径下的训练数据,对CNN模型进行训练**import input_dataimport model# 变量声明N_CLASSES = 4  # 四种花类型IMG_W = 64  # resize图像,太大的话训练时间久IMG_H = 64BATCH_SIZE = 20CAPACITY = 200MAX_STEP = 2000  # 一般大于10Klearning_rate = 0.0001  # 一般小于0.0001# 获取批次batchtrain_dir = 'F:/input_data'  # 训练样本的读入路径logs_train_dir = 'F:/save'  # logs存储路径# train, train_label = input_data.get_files(train_dir)train, train_label, val, val_label = input_data.get_files(train_dir, 0.3)# 训练数据及标签train_batch, train_label_batch = input_data.get_batch(train, train_label, IMG_W, IMG_H, BATCH_SIZE, CAPACITY)# 测试数据及标签val_batch, val_label_batch = input_data.get_batch(val, val_label, IMG_W, IMG_H, BATCH_SIZE, CAPACITY)# 训练操作定义train_logits = model.inference(train_batch, BATCH_SIZE, N_CLASSES)train_loss = model.losses(train_logits, train_label_batch)train_op = model.trainning(train_loss, learning_rate)train_acc = model.evaluation(train_logits, train_label_batch)# 测试操作定义test_logits = model.inference(val_batch, BATCH_SIZE, N_CLASSES)test_loss = model.losses(test_logits, val_label_batch)test_acc = model.evaluation(test_logits, val_label_batch)# 这个是log汇总记录summary_op = tf.summary.merge_all()# 产生一个会话sess = tf.Session()# 产生一个writer来写log文件train_writer = tf.summary.FileWriter(logs_train_dir, sess.graph)# val_writer = tf.summary.FileWriter(logs_test_dir, sess.graph)# 产生一个saver来存储训练好的模型saver = tf.train.Saver()# 所有节点初始化sess.run(tf.global_variables_initializer())# 队列监控coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess, coord=coord)# 进行batch的训练try:# 执行MAX_STEP步的训练,一步一个batchfor step in np.arange(MAX_STEP):if coord.should_stop():break_, tra_loss, tra_acc = sess.run([train_op, train_loss, train_acc])# 每隔50步打印一次当前的loss以及acc,同时记录log,写入writerif step % 10 == 0:print('Step %d, train loss = %.2f, train accuracy = %.2f%%' % (step, tra_loss, tra_acc * 100.0))summary_str = sess.run(summary_op)train_writer.add_summary(summary_str, step)# 每隔100步,保存一次训练好的模型if (step + 1) == MAX_STEP:checkpoint_path = os.path.join(logs_train_dir, 'model.ckpt')saver.save(sess, checkpoint_path, global_step=step)except tf.errors.OutOfRangeError:print('Done training -- epoch limit reached')finally:coord.request_stop()**test.py——利用D:/ML/flower/flower_photos/roses路径下的测试数据,查看识别效果**import matplotlib.pyplot as pltimport modelfrom input_data import get_files# 获取一张图片def get_one_image(train):# 输入参数:train,训练图片的路径# 返回参数:image,从训练图片中随机抽取一张图片n = len(train)ind = np.random.randint(0, n)img_dir = train[ind]  # 随机选择测试的图片img = Image.open(img_dir)plt.imshow(img)plt.show()image = np.array(img)return image# 测试图片def evaluate_one_image(image_array):with tf.Graph().as_default():BATCH_SIZE = 1N_CLASSES = 4image = tf.cast(image_array, tf.float32)image = tf.image.per_image_standardization(image)image = tf.reshape(image, [1, 64, 64, 3])logit = model.inference(image, BATCH_SIZE, N_CLASSES)logit = tf.nn.softmax(logit)x = tf.placeholder(tf.float32, shape=[64, 64, 3])# you need to change the directories to yours.logs_train_dir = 'F:/save/'saver = tf.train.Saver()with tf.Session() as sess:print("Reading checkpoints...")ckpt = tf.train.get_checkpoint_state(logs_train_dir)if ckpt and ckpt.model_checkpoint_path:global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]saver.restore(sess, ckpt.model_checkpoint_path)print('Loading success, global_step is %s' % global_step)else:print('No checkpoint file found')prediction = sess.run(logit, feed_dict={x: image_array})max_index = np.argmax(prediction)if max_index == 0:result = ('这是玫瑰花的可能性为: %.6f' % prediction[:, 0])elif max_index == 1:result = ('这是郁金香的可能性为: %.6f' % prediction[:, 1])elif max_index == 2:result = ('这是蒲公英的可能性为: %.6f' % prediction[:, 2])else:result = ('这是这是向日葵的可能性为: %.6f' % prediction[:, 3])return result# ------------------------------------------------------------------------if __name__ == '__main__':img = Image.open('F:/input_data/dandelion/1451samples2.jpg')plt.imshow(img)plt.show()imag = img.resize([64, 64])image = np.array(imag)print(evaluate_one_image(image))

5 项目执行结果

执行train模块,结果如下:
在这里插入图片描述
同时,训练结束后,在电脑指定的训练模型存储路径可看到保存的训练好的模型数据。
在这里插入图片描述

执行test模块,结果如下:

在这里插入图片描述
关闭显示的测试图片后,console查看测试结果如下:
在这里插入图片描述

做一个GUI交互界面

在这里插入图片描述

6 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

相关文章:

计算机设计大赛 深度学习花卉识别 - python 机器视觉 opencv

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &a…...

ping多个IP的工具

Ping Tool 项目地址 python开发的IP搜索小工具 ping一个网段所有IP,显示结果查看某个ip地址开放监听的端口配置可保存...

Rust 的 Error 如何使用?

在 Rust 中,错误处理是一个重要且核心的概念。Rust 提供了一种强大的类型系统,允许你明确地处理可能出现的错误。std::error::Error trait 是 Rust 标准库中用于表示错误的基础 trait。实现这个 trait 的类型可以被用作错误类型,并且可以使用…...

Hack The Box-Crafty

目录 信息收集 rustscan whatweb WEB 漏洞利用 漏洞说明 漏洞验证 提权 get user.txt get Administrator 总结 信息收集 rustscan ┌──(root㉿ru)-[~/kali/hackthebox] └─# rustscan -a 10.10.11.249 --range0-65535 --ulimit5000 -- -A -sC [~] Automatically…...

高电平复位电路工作原理详解

单片机复位电路的作用是:使单片机恢复到起始状态,让单片机的程序从头开始执行,运行时钟处于稳定状态、各种寄存器、端口处于初始化状态等等。目的是让单片机能够稳定、正确的从头开始执行程序。一共分为:高电平复位,低…...

了AI而强行AI的做法,构成了人与AI对抗的宿命论

从 ChatGPT到文生图的 Stable Diffusion,再到文生视频的 Sora ,每次大语言模型的迭代,以及由此衍生的新产品,都让各行各业的企业主、从业者们,感到无所适从。 普通人可以借助AI的力量“逆天改命”吗? 10多…...

【性能测试】Jmeter+InfluxDB+Grafana 搭建性能监控平台

一、背景 为什么要搭建性能监控平台? 在用 Jmeter 获取性能测试结果的时候,Jmeter自带的测试报告如下: 这个报告有几个很明显的缺点: 只能自己看,无法实时共享;报告信息的展示比较简陋单一,不…...

【YOLOv8模型网络结构图理解】

YOLOv8模型网络结构图理解 1 YOLOv8的yaml配置文件2 YOLOv8网络结构2.1 Conv2.2 C3与C2f2.3 SPPF2.4 Upsample2.5 Detect层 1 YOLOv8的yaml配置文件 YOLOv8的配置文件定义了模型的关键参数和结构,包括类别数、模型尺寸、骨干(backbone)和头部…...

付强:基于注意力机制的听觉前端处理 | 嘉宾公布

一、智能家居与会议系统专题论坛 智能家居与会议系统专题论坛将于3月28日同期举办! 智能会议系统它通过先进的技术手段,提高了会议效率,降低了沟通成本,提升了参会者的会议体验。对于现代企业、政府机构和学术界是不可或缺的。在这…...

C++_包装器

目录 1、包装器的用法 2、包装器的类型 3、包装器的作用 4、包装成员函数 5、bind(绑定) 5.1 bind的用法 5.2 bind减少参数个数 结语 前言: C11的包装器,总称为function包装器,而包装器又称适配器…...

3588板子部署yoloV5

一 :准备 ubuntu linux X86_64系统 a.安装anaconda b.创建虚拟环境 python3.8 二: 下载rknn-toolkit2 传送门 unzip 解压文件夹 三:pt转onnx模型 四:onnx转rknn模型 a:cd到rknn-toolkit2-master/rknn-toolkit2/packag…...

解决GitHub提交时不显示自己的头像 显示另一个账号(其实也是自己)

git show 看看是否是自己的githup 账号的邮箱 如果不是进行下列操作 git config user.email “你的邮箱地址”,修改邮箱 修改完以后输入git config user.email 检查是否修改成了你的邮箱 如果你想其他项目提交时,也避免此类情况,把上面的两条命令改成 (1&#…...

VUE_vue2/3点击区域外触发方法,点击除某个元素触发监听

Vue2 1、自定义指令 // 自定义指令,用于处理点击外部区域的事件 const clickOutside {bind(el, binding) {// 在元素上绑定一个点击事件监听器el.clickOutsideEvent function (event) {// 检查点击事件是否发生在元素的内部if (!(el event.target || el.contai…...

SpringCloud(20)之Skywalking Agent原理剖析

一、Agent原理剖析 使用Skywalking的时候,并没有修改程序中任何一行 Java 代码,这里便使用到了 Java Agent 技术,我 们接下来展开对Java Agent 技术的学习。 1.1 Java Agent Java Agent 是从 JDK1.5 开始引入的,算是一个比较老的…...

容器(0)-DOCKERFILE-安装-常用命令-部署-迁移备份-仓库

1.安装 启动 systemclt start docker //启动 systemctl status docker //状态 docker info systemclt stop docker systemctl status docker systemctl enable docker //开机启动 2.常用命令 镜像查看 docker images 镜像查看 docker status 镜像拉取 docker pull centos:…...

低功耗DC-DC电压调整器IU5528D

IU5528D是一款超微小型,超低功耗,高效率,升降压一体DC-DC调整器。适用于双节,三节干电池或者单节锂电池的应用场景。可以有效的延长电池的使用时间。IU5528D由电流模PWM控制环路,误差放大器,比较器和功率开关等模块组成。该芯片可在较宽负载范围内高效稳…...

【备战蓝桥杯系列】单源最短路径Dijkstra算法模板

Dijkstra算法模板 蓝桥杯中也是会考到图论最短路的,一旦考到,基本是不会太难的,只要知道板子就基本能拿分了。 两个板子如下 朴素Dijkstra算法 适应情况:稠密图,正权边 时间复杂度 O(n^2 m) int dijkst(){memse…...

嵌入式系统中端口号的理解与分析

每当看到有人的简历上写着熟悉 tcp/ip, http 等协议时, 我就忍不住问问他们: 你给我说说, 端口是啥吧! 可惜, 很少有人能说得让人满意... 所以这次就来谈谈端口(port), 这个熟悉的陌生人. 在此过程中, 还会谈谈间接层, naming service 等概念, IoC, 依赖倒置等原则以及 TCP 协议…...

3.自定义工程目录配置CMakeLists

问题背景 熟悉stm32keil开发的都知道,我们在编写不同的外设时,通常都会单独编写一个app文件夹或者是user文件夹之类的来存放不同外设功能的源文件和头文件。 在前面一节2.构建第一个工程并烧录到ESP32开发板-CSDN博客中,我们是使用了一个乐鑫…...

Vue3.0里为什么要用 Proxy API 替代 defineProperty API

一、Object.defineProperty 定义:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象 为什么能实现响应式 通过defineProperty 两个属性,get及set get 属性的 getter 函…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【2025年】解决Burpsuite抓不到https包的问题

环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如&#xff1a…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&#x1f…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...