SE5 - BM1684 人工智能边缘开发板入门指南 -- 模型转换、交叉编译、yolov5、目标追踪

news2024/11/25 4:43:52

介绍

我们属于SoC模式,即我们在x86主机上基于tpu-nntc和libsophon完成模型的编译量化与程序的交叉编译,部署时将编译好的程序拷贝至SoC平台(1684开发板/SE微服务器/SM模组)中执行。

注:以下都是在Ubuntu20.04系统上操作的,当然Ubuntu18和22也是可以的,因为我们主要是用的官方 docker 环境进行配置。

准备工作

安装docker

首先安装docker

# 更新一下库 
sudo apt-get update
sudo apt-gefat upgrade
# 安装 docker 
sudo apt-get install docker.io
# docker命令免root权限执行 
# 创建docker用户组,若已有docker组会报错,没关系可忽略
sudo groupadd docker  
# 将当前用户加入docker组
sudo gpasswd -a ${USER} docker 
# 重启docker服务 
sudo service docker restart  
# 切换当前会话到新group或重新登录重启X会话 
newgrp docker  

我已经装docker了,这一步没有测试,若有问题请问百度。

下载SDK

在算能官网上,资料下载里下载相关sdk:https://developer.sophgo.com/site/index/material/all/all.html

基础工具包包括:

  • tpu-nntc 负责对第三方深度学习框架下训练得到的神经网络模型进行离线编译和优化,生成最终运行时需要的BModel。目前支持Caffe、Darknet、MXNet、ONNX、PyTorch、PaddlePaddle、TensorFlow等。
  • libsophon 提供BMCV、BMRuntime、BMLib等库,用来驱动VPP、TPU等硬件,完成图像处理、张量运算、模型推理等操作,供用户进行深度学习应用开发。
  • sophon-mw 封装了BM-OpenCV、BM-FFmpeg等库,用来驱动VPU、JPU等硬件,支持RTSP流、GB28181流的解析,视频图像编解码加速等,供用户进行深度学习应用开发。
  • sophon-sail 提供了支持Python/C++的高级接口,是对BMRuntime、BMCV、BMDecoder、BMLib等底层库接口的封装,供用户进行深度学习应用开发。

可以下载这个SDK

image-20230419114430498

这里面包含了models里的所有代码,当然里面很多包是用不到的。

image-20230419114506989

也可以只下载我们需要的sdk

主要是这几个:

tpu-nntc

libsophon

sophon-mw

sophon-demo

sophon-img

sophon-sail

sophon-demo

分别wget 到本地就行,

# 先建个存放的路径
mkdir fugui
# 分别wget 到本地就行
wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/22/11/28/10/libsophon_20221027_214818.zip   https://sophon-file.sophon.cn/sophon-prod-s3/drive/22/11/28/11/sophon-mw_20221027_183429.zip https://sophon-file.sophon.cn/sophon-prod-s3/drive/22/11/28/15/sophon-demo_20221027_181652.zip https://sophon-file.sophon.cn/sophon-prod-s3/drive/22/11/28/15/sophon-img_20221027_215835.zip https://sophon-file.sophon.cn/sophon-prod-s3/drive/22/11/28/15/sophon-sail_20221026_200216.zip https://sophon-file.sophon.cn/sophon-prod-s3/drive/22/11/28/15/sophon-demo_20221027_181652.zip

配置环境

装上解压缩工具

sudo apt-get install unzip

先把这几个压缩文件解压了

unzip \*.zip

创建docker容器:

#如果当前系统没有对应的镜像,会自动从docker hub上下载;此处将tpu-nntc的上一级目录映射到docker内的/workspace目录;这里用了8001到8001端口的映射(使用ufw可视化工具会用到端口号)。如果端口已被占用,请根据实际情况更换为其他未占用的端口。
:~/fugui# docker run -v $PWD/:/workspace  -it sophgo/tpuc_dev:latest

进入 tpu-nntc,解压缩包

root@39d67fa4c7bb:/workspace/fugui/tpu-nntc_20221028_200521# tar -zxvf  tpu-nntc_v3.1.3-242ef2f9-221028.tar.gz

进入tpu-nntc_v3.1.3-242ef2f9-221028 运行一下命令初始化软件环境

source scripts/envsetup.sh

image-20230419153738140

在下载tensorflow时比较慢,我们都是用pytorch,直接ctrl c跳过,不装他了。

yolov5

这里就不演示官方模型了,直接用我们自己训练的模型进行量化推理。

注意:这里必须用yolov5 v6.1版本

如何训练就不说了,参考:这篇文章

最好使用yolov5s训练,然后对训练后的模型进行转换。比如我训练的是安全帽检测,现在生成了best.pt这个权重文件,为了好区分我改名为anquanmao.pt

将他放在了yolov5的根目录下,然后修改了models文件下的yolo.py中的forward函数。将return x if self.training else (torch.cat(z, 1), x) 修改为:

return x if self.training else x

image-20230419155833459

然后运行

 python export.py --weight anquanmao.pt --include torchscript

这样生成了 anquanmao.torchscript 文件

image-20230419160201616

image-20230419160211412

打开这个权重文件看看是不是和我的一样,只要是yolov5 6.1就肯定一样。

修改 anquanmao.torchscriptanquanmao.torchscript.pt (就是在最后加个.pt)

然后将这个文件拷贝到你的x86服务器里,路径为:

/root/fugui/sophon-demo_20221027_181652/sophon-demo_v0.1.0_b909566_20221027/sample/YOLOv5/data

然后找些你训练的图片,也就是安全帽,200张左右就行

同样上传到那个文件夹里

image-20230419161259835

然后就可以进行模型转换了

# 先备份一下
root@39d67fa4c7bb:/workspace/fugui/sophon-demo_20221027_181652/sophon-demo_v0.1.0_b909566_20221027/sample/YOLOv5/scripts# cp 2_2_gen_int8bmodel.sh 3_2_gen_int8bmodel.sh 
vi cp 2_2_gen_int8bmodel.sh

然后修改里面内容,200太多了,转换起来太慢了,50就够了

image-20230419161524150

修改model_info.sh

root@39d67fa4c7bb:/workspace/fugui/sophon-demo_20221027_181652/sophon-demo_v0.1.0_b909566_20221027/sample/YOLOv5/scripts# vi model_info.sh 
echo "start fp32bmodel transform, platform: ${platform} ......"

root_dir=$(cd `dirname $BASH_SOURCE[0]`/../ && pwd)
build_dir=$root_dir/build
# 将这里修改为我们刚才存放的.torchscript.pt文件地址
src_model_file=${root_dir}/data/anquanmao.1_3output.torchscript.pt
src_model_name=`basename ${src_model_file}`
# 这里也修改下吧 yolov5s ——> anquanmao
dst_model_prefix="anquanmao"
dst_model_postfix="coco_v6.1_3output"
fp32model_dir="${root_dir}/data/models/${platform}/fp32model"
int8model_dir="${root_dir}/data/models/${platform}/int8model"
lmdb_src_dir="${root_dir}/data/images"
# 这里修改为我们上传的图片地址
image_src_dir="${root_dir}/data/anquanmao"
# lmdb_src_dir="${build_dir}/coco2017val/coco/images/"
#lmdb_dst_dir="${build_dir}/lmdb/"
img_size=${2:-640}
batch_size=${3:-1}
iteration=${4:-2}
img_width=640
img_height=640

运行转换命令前需要加上权限,否则不能执行

root@39d67fa4c7bb:/workspace/fugui/sophon-demo_20221027_181652/sophon-demo_v0.1.0_b909566_20221027/sample/YOLOv5/scripts# sudo chmod 777 *

然后执行转int8bmodel模型,转FP32也一样

root@39d67fa4c7bb:/workspace/fugui/sophon-demo_20221027_181652/sophon-demo_v0.1.0_b909566_20221027/sample/YOLOv5/scripts# ./ 2_2_gen_int8bmodel.sh

性能不好的机器会非常慢,等待完成即可

编译yolov5 c++程序

/workspace/sophon-demo/sample/YOLOv5/cpp/yolov5_bmcv/build# 
cd cpp/deepsort_bmcv 
mkdir build && cd build	
# 请根据实际情况修改-DSDK的路径,需使用绝对路径 
cmake -DTARGET_ARCH=soc -DSDK=/workspace/soc-sdk .. 
make

复制到开发板

scp ../yolov5_bmcv.soc linaro@192.168.17.153:/data/sophon-demo/sample/YOLOv5/cpp/yolov5_bmcv

开发板运行

linaro@bm1684:/data/sophon-demo/sample/YOLOv5/cpp/yolov5_bmcv$ ./yolov5_bmcv_drawr.soc --input=rtsp://admin:sangfor@123@192.168.17.253 --bmodel=BM1684/yolov5s_v6.1_3output_int8_1b.bmodel

目标追踪

注:所有模型转换都是在docker环境中的

先进入docker

这里我们是要在docker环境里编译的,所以先进入docker

:~/tpu-nntc# docker run -v $PWD/:/workspace  -it sophgo/tpuc_dev:latest

初始化环境

root@2bb02a2e27d5:/workspace/tpu-nntc# source ./scripts/envsetup.sh

docker里安装编译器

root@2bb02a2e27d5:/workspace/sophon-demo/sample/YOLOv5/cpp/yolov5_bmcv/build# sudo apt-get install  gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libeigen3-dev

本C++例程依赖Eigen,您需要在编译c++程序的机器上运行如下命令安装:

sudo apt install libeigen3-dev

先下载相关文件,主要是追踪的测试视频,测试图片,目标追踪的权重,目标检测的权重

# 安装unzip,若已安装请跳过
sudo apt install unzip
chmod -R +x scripts/
./scripts/download.sh

然后编译c++代码

/workspace/sophon-demo/sample/DeepSORT/cpp/deepsort_bmcv/build# 
cd cpp/deepsort_bmcv
mkdir build && cd build
# 请根据实际情况修改-DSDK的路径,需使用绝对路径。
cmake -DTARGET_ARCH=soc -DSDK=/workspace/soc-sdk ..  
make

这时会生成deepsort_bmcv.soc文件,复制到盒子里

:/workspace/sophon-demo/sample/DeepSORT/cpp/deepsort_bmcv# scp -r  deepsort_bmcv.soc linaro@192.168.17.125:/data/yolo/sophon-demo/sample/DeepSORT/cpp

测试视频

./deepsort_bmcv.soc --input=rtsp://admin:sangfor@123@192.168.17.253 --bmodel_detector=../../BM1684/yolov5s_v6.1_3output_int8_1b.bmodel --bmodel_extractor=../../BM1684/extractor_fp32_1b.bmodel --dev_id=0

运行相关代码,这个是检测图片的

cd python
python3 deepsort_opencv.py --input ../datasets/mot15_trainset/ADL-Rundle-6/img1 --bmodel_detector ../models/BM1684/yolov5s_v6.1_3output_int8_1b.bmodel --bmodel_extractor ../models/BM1684/extractor_fp32_1b.bmodel --dev_id=0

对视频追踪

python3 deepsort_opencv.py --input ../datasets/test_car_person_1080P.mp4 --bmodel_detector ../models/BM1684/yolov5s_v6.1_3output_int8_1b.bmodel --bmodel_extractor ../models/BM1684/extractor_fp32_1b.bmodel --dev_id=0

对本地摄像头视频追踪

python3 deepsort_opencv.py --input rtsp://admin:sangfor@123@192.168.17.253 --bmodel_detector ../models/BM1684/yolov5s_v6.1_3output_int8_1b.bmodel --bmodel_extractor ../models/BM1684/extractor_fp32_1b.bmodel --dev_id=0

人体姿态估计

python3 python/openpose_opencv.py --input rtsp://admin:sangfor@123@192.168.17.253 --bmodel models/BM1684/pose_coco_fp32_1b.bmodel --dev_id 0

生成的文件会放在sample/YOLOv5/data/models/BM1684/int8model/anquanmao_batch1

:~/fugui/sophon-demo_20221027_181652/sophon-demo_v0.1.0_b909566_20221027/sample/YOLOv5/data/models/BM1684/int8model/anquanmao_batch1# ls
compilation.bmodel  input_ref_data.dat  io_info.dat  output_ref_data.dat

然后将转换好的模型推送到开发板

scp compilation.bmodel linaro@{开发板ip地址}:/data/{你的yolov5存放路径}

开发板环境配置

搭建 libsophon 环境

cd libsophon_<date>_<hash>
# 安装依赖库,只需要执行一次
sudo apt install dkms libncurses5
sudo dpkg -i sophon-*.deb
# 在终端执行如下命令,或者log out再log in当前用户后即可使用bm-smi等命令
source /etc/profile

python3 yolov5_new_1.py --input rtsp://admin:1111111a@192.168.16.223 --bmodel yolov5s_v6.1_3output_fp32_1b.bmodel

c++编译环境

安装libsophon

进入sophon-img_20221027_215835这个路径

解压里面的tar包

:~/fugui/sophon-img_20221027_215835# tar -zxvf libsophon_soc_0.4.2_aarch64.tar.gz

将相关库目录和头文件目录拷贝到soc-sdk文件夹中

:~/fugui/sophon-img_20221027_215835/libsophon_soc_0.4.2_aarch64/opt/sophon/libsophon-0.4.2# sudo cp -rf include lib ~/fugui/soc-sdk

安装sophon-opencv 和sophon-ffmpeg

先进入sophon-mw,解压sophon-mw-soc_0.4.0_aarch64.tar.gz这个tar包

:~/fugui/sophon-mw_20221027_183429# tar -zxvf sophon-mw-soc_0.4.0_aarch64.tar.gz

复制相关文件到soc-sdk

:~/fugui/sophon-mw_20221027_183429/sophon-mw-soc_0.4.0_aarch64/opt/sophon# cp -rf sophon-ffmpeg_0.4.0//lib sophon-ffmpeg_0.4.0/include/ ~/fugui/soc-sdk

:~/fugui/sophon-mw_20221027_183429/sophon-mw-soc_0.4.0_aarch64/opt/sophon# cp -rf sophon-opencv_0.4.0//lib sophon-opencv_0.4.0/include/ ~/fugui/soc-sdk

很简单,复制过去,交叉编译的环境就搭建好了

TPU-NNTC环境

这里我们是要在docker环境里编译的,所以先进入docker

:~/fugui# docker run -v $PWD/:/workspace  -it sophgo/tpuc_dev:latest

然后进入tpu-nntc,初始化环境

root@2bb02a2e27d5:/workspace/tpu-nntc# source ./scripts/envsetup.sh

docker里安装编译器

root@2bb02a2e27d5:/workspace/sophon-demo/sample/YOLOv5/cpp/yolov5_bmcv/build# sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

进入sophon-demo路径

下载相关文件

:~/fugui/sophon-demo/sample/YOLOv5# chmod -R +x scripts/
:~/fugui/sophon-demo/sample/YOLOv5# ./scripts/download.sh

编译yolov5

我们这里只是交叉编译,不能在x86设备上运行,要复制到我们1684平台

先cmake

root@2bb02a2e27d5:/workspace/sophon-demo/sample/YOLOv5/cpp/yolov5_bmcv/build# cmake -DTARGET_ARCH=soc -DSDK=/workspace/soc-sdk ..

在make

root@2bb02a2e27d5:/workspace/sophon-demo/sample/YOLOv5/cpp/yolov5_bmcv/build# make

此时会出现.soc文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eWPar5Yp-1692844732110)(https://gitee.com/lizheng0219/picgo_img/raw/master/img202325/image-20230421134631891.png)]

把输出的文件传导我们开发板上运行下

scp -r yolov5_bmcv linaro@192.168.17.125:/data/sophon-demo/sample/YOLOv5/cpp/

运行推理图片

./yolov5_bmcv.soc --input=../../coco128 --bmodel=../../python/yolov5s_v6.1_3output_fp32_1b.bmodel --dev_id=0 --conf_thresh=0.5 --nms_thresh=0.5 --classnames=../../coco.names 

推理视频

./yolov5_bmcv.soc --input=../../test.avi --bmodel=../../python/yolov5s_v6.1_3output_fp32_1b.bmodel --dev_id=0 --conf_thresh=0.5 --nms_thresh=0.5 --classnames=../../coco.names 

c++推理网络摄像头

./yolov5_bmcv.soc --input=rtsp://admin:sangfor@123@192.168.17.253 --bmodel=/data/ai_box/yolov5s_640_coco_v6.1_3output_int8_1b_BM1684.bmodel --dev_id=0 --conf_thresh=0.5 --nms_thresh=0.5 --classnames=../../coco.names
./yolov5_bmcv.soc --input=rtsp://admin:sangfor@123@192.168.17.253 --bmodel=/data/models/all16_v6.1_3output_int8_4b.bmodel --dev_id=0 --conf_thresh=0.5 --nms_thresh=0.5 --classnames=/data/models/all16.names

网络摄像头:安全帽

 ./yolov5_bmcv.soc  --bmodel=anquanmao.bmodel --dev_id=0 --conf_thresh=0.5 --nms_thresh=0.5 --classnames=../../coco.names 

Python推理

python3 yolov5_opencv.py --input rtsp://admin:1111111a@192.168.16.222  --bmodel ../yolov5s_v6.1_3output_int8_4b.bmodel

前端只展示一路摄像头,我们只需要做一路摄像头使用多个算法推理。

不展示的摄像头也要实时在后台推理,有出现问题时要及时报警。

这样我们需做出单路摄像头推理多算法(单摄像头单算法也行,把所有检测都放到一个模型里,输出时只输出他选择的那个)

把所有模型统一训练比较简单,后台一块推理

sophon-pipeline

本地编译

docker run -v $PWD/:/workspace -p 8001:8001 -it sophgo/tpuc_dev:latest
source scripts/envsetup.sh
sudo apt-get install -y  gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libeigen3-dev
./tools/compile.sh soc /workspace/soc-sdk

开发板运行

linaro@bm1684:/data/sophon-pipeline/release/video_stitch_demo$ ./soc/video_stitch_demo --config=cameras_video_stitch1.json

英码

export PYTHONPATH=$PYTHONPATH:/system/libexport
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/system/lib/

python

pip3 install sophon_arm-master-py3-none-any.whl --force-reinstall 
pip3 install opencv-python-headless<4.3

开发板执行命令

python3 python/yolov5_opencv.py --input ../data/images/coco200/000000009772.jpg  --model  ../compilation.bmodel --dev_id 0 --conf_thresh 0.5 --nms_thresh 0.5 
python3 python/yolov5_opencv.py --input ../data/xiyanimg/000017.jpg  --model  ../compilation.bmodel --dev_id 0 --conf_thresh 0.5 --nms_thresh 0.5
python3 python/yolov5_video.py --input rtsp://admin:sangfor@123@192.168.17.253 --model  ../compilation.bmodel

image-20230418164224531

python3 python/yolov5_video.py --input rtsp://admin:1111111a@192.168.16.222  --model  ../compilation.bmodel --dev_id 0 --conf_thresh 0.5 --nms_thresh 0.5 
tar -zxf ~/Release_221201-public/sophon-mw_20221227_040823/sophon-mw-soc_*_aarch64.tar.gz

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

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

相关文章

element-plus指定el-date-picker的弹出框位置

此处记录一下,通过popper-options指定popper出现的位置

Presto之Driver个数

一. 前言 在Presto的Stage Performace中&#xff0c;每个Operator中都会有Driver个数的显示&#xff0c;如下图所示。本文主要介绍Presto中是如何决定Driver的个数的。 二. Driver个数 在Presto中&#xff0c;一个pipeline中启动多少个Driver&#xff0c;是由此Pipeline处理的S…

tidb数据库5.4.3和6.5.3版本性能测试对比

作者&#xff1a; qizhining 原文来源&#xff1a; https://tidb.net/blog/5454621f 一、测试需求&#xff1a; 基于历史原因&#xff0c;我们的业务数据库一直使用5.4.3&#xff0c;最近由于研发提出需求&#xff1a;需要升级到6.5.3版本&#xff0c;基于版本不同&#x…

sql:SQL优化知识点记录(四)

&#xff08;1&#xff09;explain之ref介绍 type下的ref是非唯一性索引扫描具体的一个值 ref属性 例如&#xff1a;ti表先加载&#xff0c;const是常量 t1.other_column是个t1表常量 test.t1.ID&#xff1a;test库t1表的ID字段 t1表引用了shared库的t2表的col1字段&#x…

基于黑寡妇算法优化的BP神经网络(预测应用) - 附代码

基于黑寡妇算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于黑寡妇算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.黑寡妇优化BP神经网络2.1 BP神经网络参数设置2.2 黑寡妇算法应用 4.测试结果&#xff1a;5.Matlab代…

JUC常用并发工具类

JUC常用并发工具类 1、什么是JUC? JUC 就是 java.util.concurrent 包&#xff0c;这个包俗称 JUC&#xff0c;里面都是解决并发问题的一些东西&#xff0c;该包的位置位于 java 下 面的 rt.jar 包下面。 2、4大常用并发工具类 2.1 CountDownLatch CountDownLatch&#x…

设计模式之九:迭代器与组合模式

有许多方法可以把对象堆起来成为一个集合&#xff08;Collection&#xff09;&#xff0c;比如放入数组、堆栈或散列表中。若用户直接从这些数据结构中取出对象&#xff0c;则需要知道具体是存在什么数据结构中&#xff08;如栈就用peek&#xff0c;数组[]&#xff09;。迭代器…

WebGL矩阵变换

目录 变换矩阵&#xff1a;旋转 变换矩阵&#xff1a;平移 44的旋转矩阵 示例代码&#xff1a; gl.uniformMatrix4fv&#xff08;&#xff09;规范 平移&#xff1a;相同的策略 变换矩阵&#xff1a;缩放 变换矩阵&#xff1a;旋转 对于简单的变换&#xff0c;你可以使用…

【坑】Vue中带有__ob__: Observer的数组无法遍历的问题

控制台可以打印出数据但是渲染不出结构 解决办法&#xff1a; setTimeout(() > {Bus.$emit(shareRes, this.result.filter(item > item.id id)) }, 500)替换 Bus.$emit(shareRes, this.result.filter(item > item.id id))总结 解决和总结 好像和__ob__.Observe无…

电路原理分析2:应急照明灯电路

k是线圈&#xff0c;1-2&#xff08;常开&#xff09;和2-3&#xff08;常闭&#xff09;是2个触点。 1、220v交流电正常供电时&#xff0c;变压器触头位置提供12v的电压&#xff0c;这个时候&#xff0c;v2二极管是导通状态&#xff0c;所以线圈k吸合&#xff0c;这个时候1-2…

基于Java+SpringBoot+Vue前后端分离社区医院管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

利用 IDEA IDE 的轻量编辑模式快速查看和编辑工程外的文本文件

作为程序员, 我们都知道 IDE 的很好用的, 它的文本编辑器功能也非常的强大, 用起来非常便捷. 在长年累月的使用中, 我们也变得对其非常熟悉, 以致于使用起其它简单地轻量级的文本编辑器来, 比如什么记事本, Notepad, UltraEdit 等等呀, 觉得既不方便又不熟悉. 关键是很多的操作…

探索Java的ReentrantLock:实现并发锁的强大力量

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;java系列 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;…

单例模式:保证一个类仅有一个实例

单例模式&#xff1a;保证一个类仅有一个实例 欢迎来到设计模式系列的第二篇文章&#xff01;在上一篇中&#xff0c;我们已经对设计模式有了初步的了解&#xff0c;今天让我们深入研究第一个模式——单例模式。 什么是单例模式&#xff1f; 在软件开发中&#xff0c;我们经…

pyinstaller打包openvino 2021.4.2

打包准备 1. 测试环境准备 conda create -n opinstall python3.7 -y conda activate opinstall pip install openvino2021.4.2 pip install pyinstaller PyCharm新建openvino_install&#xff0c;选择虚拟环境opinstall&#xff0c;编写测试代码 app.py import numpy as n…

mysql基础下

文章目录 1.创建表和管理表1. 一条数据存储的过程2.MySQL中的数据类型3.创建表4.修改表5.重命名表6.删除表7.清空表 2.数据处理1. 插入数据2.更新数据3. 删除数据4. 将查询结果插入到表中 3. 约束1.约束概述2.非空约束3.唯一性约束4. 主键&#xff08;PRIMARY KEY&#xff09;约…

山西电力市场日前价格预测【2023-08-28】

日前价格预测 预测明日&#xff08;2023-08-28&#xff09;山西电力市场全天平均日前电价为319.70元/MWh。其中&#xff0c;最高日前电价为371.80元/MWh&#xff0c;预计出现在19: 15。最低日前电价为278.59元/MWh&#xff0c;预计出现在13: 00。 价差方向预测 1&#xff1a; …

秋招打卡016(0827)

文章目录 前言一、今天学习了什么&#xff1f;二、关于问题的答案1.牛客网面经2.美团后端一面3.动态规划 总结 前言 提示&#xff1a;这里为每天自己的学习内容心情总结&#xff1b; Learn By Doing&#xff0c;Now or Never&#xff0c;Writing is organized thinking. 先多…

基于海洋捕食者算法优化的BP神经网络(预测应用) - 附代码

基于海洋捕食者算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于海洋捕食者算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.海洋捕食者优化BP神经网络2.1 BP神经网络参数设置2.2 海洋捕食者算法应用 4.测试结果&…

企业使用CRM如何统一销售流程管理?

销售流程我们可以理解为&#xff0c;销售人员从寻找潜在客户到最终达成交易的一系列步骤。很多企业通过CRM系统来进行销售流程管理&#xff0c;提高销售效率&#xff0c;实现销售目标。下面我们就来说说&#xff0c;CRM如何进行销售流程管理。 制定统一的销售流程&#xff1a;…