NVIDIA 7th SkyHackathon(八)使用 Flask 与 Vue 开发 Web

news2024/11/26 14:23:21

1.页面效果

Web 采用 flask+vue 开发,效果图如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.后端

import sys
import subprocess
import os
from PIL import Image
from datetime import datetime
from ASR_metrics import utils as metrics

from werkzeug.wrappers import Request, Response
from flask import Flask, render_template, request, jsonify

sys.path.append('/home/nvidia/7th_CV')
sys.path.append('/home/nvidia/7th_ASR')

# ASR 路径
pathASR = "/home/nvidia/7th_ASR"

# 项目路径
pathSky = '/home/nvidia'

app = Flask(__name__, static_folder='')

# 上传路径
uploadPath = 'uploads/'
try_model_1 = None

# 主页
@app.route('/')
def index():
    return render_template('sky7.html', template_folder='templates')

# ------------------ASR------------------
# ASR 模型加载
@app.route('/asr/load')
def asrLoad():
    global try_model_1
    if try_model_1 == None:
        import nemo.collections.asr as nemo_asr
        print('Loading Nemo')
        # 加载模型
        try_model_1 = nemo_asr.models.EncDecCTCModel.restore_from("/home/nvidia/7th_ASR/7th_asr_model.nemo")
        print('Done loading Nemo')
    return 'ok'

# POST 请求上传音频
@app.route('/asr/upload', methods=['POST'])
def asrUpload():
    if request.method == 'POST':
        f = request.files['file']
        if(f.headers.get('Content-Type') != 'audio/wav'):
            return '音频格式有错误', 400
        else:
            fileName = f'{uploadPath}audio.wav'
            f.save(fileName)
            dt = datetime.now()
            ts = str(int(datetime.timestamp(dt)))
            return jsonify(f'/{uploadPath}audio.wav?t={ts}')

# 识别上传的音频
@app.route('/asr/identify', methods=['GET', 'POST'])
def asrIdentify():
    global try_model_1
    if try_model_1 == None:
        return '模型无效,请重新加载', 500
    try:
        asr_result = try_model_1.transcribe(paths2audio_files=["uploads/audio.wav"])
        s1 = request.form.get('defaultText')
        s2 = " ".join(asr_result)#识别结果
        result = {
            "asr_result": asr_result,
            "word_error_rate": metrics.calculate_cer(s1,s2),
            "word_accuracy_rate":1-metrics.calculate_cer(s1,s2)
        }
        return jsonify(result)
    except Exception as e:
        return '无法识别', 400

# ------------------CV------------------

# POST 请求上传图片
@app.route("/cv/upload", methods=['POST'])
def cvUpload():
    if request.method == 'POST':
        f = request.files['file']
        print('image', f, f.filename)

        if not 'image' in f.headers.get('Content-Type'):
            return '图片有错误', 400

        original = f'{uploadPath}original.jpg'

        try:
            # Convert image to jpeg
            im = Image.open(f)
            rgb_im = im.convert('RGB')
            rgb_im.save(original)

            # Add timestamp
            dt = datetime.now()
            ts = str(int(datetime.timestamp(dt)))
            return jsonify(original+'?t='+ts)

        except Exception as e:
            return '有错误', 400

# 检测图片
@app.route("/api/detect/image")
def detectImage():
    cv_results = subprocess.Popen('python3 /home/nvidia/7th_CV/detection_image.py /home/nvidia/uploads/original.jpg', shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    print('code', cv_results.returncode)
    cv_results = str(cv_results.stdout.read()).split('\\n')[-2]
    dt = datetime.now()
    ts = str(int(datetime.timestamp(dt)))
    result = {
        "detection_result_image_path": f'/uploads/result.jpg?t={ts}'
    }
    return jsonify(result)

# 获取 FPS,以 Json 格式返回前端
@app.route("/api/detect/fps")
def detectFPS():
    # Code here
    fps_results = subprocess.Popen('python3 /home/nvidia/7th_CV/cv_fps.py', shell = True, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
    fps_results = str(fps_results.stdout.read()).split('\\n')[-2]
    fps_results = fps_results.split(" ")[-1]
    result = {
        "detection_FPS": fps_results,
    }
    return jsonify(result)

# 获取 mAP
@app.route("/api/detect/map")
def detectMAP():
    # Code here
    map_results = subprocess.Popen('python3 /home/nvidia/7th_CV/cv_map.py', shell = True, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
    map_results = str(map_results.stdout.read())
    bytes(map_results, encoding="utf-8").decode()
    map_results = map_results[-9:-3]
    result = {
        "detection_mAP": map_results,
    }
    return jsonify(result)

if __name__ == "__main__":
    app.run(debug=True)

3.前端

3.1 html

<html>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <head>
        <script src="https://unpkg.com/vue@3"></script>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <link rel="stylesheet" href="//unpkg.com/layui@2.6.8/dist/css/layui.css">
        <script src="//unpkg.com/layui@2.6.8/dist/layui.js"></script>
        <link rel="stylesheet" type="text/css" href="/style.css">
    </head>

    <body id="app">
        <!-- 模型加载中 -->
        <div class="loading" v-if="loading!=''">
            <div class="pad">%%loading%%</div>
        </div>
        <h1>7th Sky Hackathon</h1>
        <h5>team:早八睡不醒</h5>
        <div class="content">

            <div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">

                <ul class="layui-tab-title">
                    <li class="layui-this"><i class="layui-icon panel-title layui-icon">&#xe6dc;&nbsp;ASR</i></li>
                    <li><i class="layui-icon panel-title layui-icon">&#xe660;&nbsp;CV</i></li>
                </ul>
                <div class="layui-tab-content">
                    <!-- ASR 开始-->
                    <div class="layui-tab-item layui-show">
                        <div class="layui-anim layui-anim-up">
                            <fieldset class="asr">
                                <legend><span class="panel-title">ASR</span></legend>

                                <div class="layui-container">

                                    <!-- 1 开始 -->
                                    <div class="layui-row">
                                        <div class="layui-col-md4">
                                            1.请加载语音识别模型
                                        </div>
                                        <div class="layui-col-md4">
                                            <button class="layui-btn" @click="loadModel()" v-if="!modelLoaded"><i
                                                    class="layui-icon">&#xe601;&nbsp;加载</i></button>
                                            <div v-if="modelLoaded" class="modelLoaded">模型加载成功</div>
                                        </div>
                                    </div>
                                    <!-- 1 结束 -->

                                    <!-- 2、3 开始 -->
                                    <div class="field file">
                                        <div class="newFileUpload">
                                            <!-- 2 开始 -->
                                            <div class="layui-row">
                                                <div class="layui-col-md4">
                                                    <label for="file">2.请选择音频文件</label>
                                                    <div class="note">&nbsp;&nbsp;&nbsp;仅支持 .wav 和单声道格式</div>
                                                </div>
                                                <div class="layui-col-md4">
                                                    <div class="userdefined-file">
                                                        <input type="text" name="userdefinedFile"
                                                            id="userdefinedFileAudio" value="未选择任何文件" />
                                                        <button type="button">选择</button>
                                                    </div>
                                                    <input type="file" name="file" id="fileAudio"
                                                        @change="handleFileUploadAudio($event)" />
                                                </div>
                                            </div>
                                            <!-- 2 结束 -->
                                        </div>

                                        <!-- 3 开始 -->
                                        <div class="layui-row">
                                            <div class="layui-col-md4"> 3.请上传音频文件</div>
                                            <div class="layui-col-md4">
                                                <button class="layui-btn" @click="submitFile('asr')"><i
                                                        class="layui-icon">&#xe67c;&nbsp;上传</i></button>
                                            </div>
                                        </div>
                                        <!-- 3 结束 -->
                                    </div>
                                    <!-- 2、3 结束 -->

                                    <!-- 4 开始 -->
                                    <div class="layui-row">
                                        <div class="field">
                                            <div class="layui-col-md4">
                                                <label>4.请试听上传语音并输入正确答案</label>
                                            </div>
                                            <div class="layui-col-md4">
                                                <input id="answer" type="text" name="defaultText"
                                                    v-model="defaultText" />
                                            </div>
                                        </div>
                                    </div>
                                    <!-- 4 结束 -->


                                    <div class="field" v-if="asrStatus=='uploaded' || asrStatus=='identified'">
                                        <!-- 试听 开始 -->
                                        <div class="layui-row">
                                            <div class="audio">
                                                <div class="layui-col-md4">&nbsp;&nbsp;&nbsp; 试听 </div>
                                                <div class="layui-col-md4">
                                                    <audio controls :src="audioOriginal"></audio>
                                                </div>
                                            </div>
                                        </div>
                                        <!-- 试听 结束 -->

                                        <!-- 5 开始 -->
                                        <div class="layui-row">
                                            <div class="layui-col-md4">5.识别语音</div>
                                            <div class="layui-col-md4">
                                                <div class="action">
                                                    <button class="layui-btn" @click="identifyAudio()"><i
                                                            class="layui-icon">&#xe615;&nbsp;识别</i></button>
                                                </div>
                                            </div>
                                        </div>
                                        <!-- 5 结束 -->
                                    </div>

                                    <!-- 6 开始 -->
                                    <div class="layui-row">
                                        <div class="field result asr" v-if="asrStatus=='identified'">
                                            <div class="layui-col-md4">6.指标</div>
                                            <div class="layui-col-md4">
                                                <ul>
                                                    <li v-for="(value, key) in asrResult">%%key%%: %%value%%</li>
                                                </ul>
                                            </div>
                                        </div>
                                    </div>
                                    <!-- 6 结束 -->
                                </div>

                            </fieldset>
                        </div>
                    </div>
                    <!-- ASR 结束 -->

                    <!-- CV 开始 -->
                    <div class="layui-tab-item">
                        <div class="layui-anim layui-anim-up">
                            <fieldset class="cv">
                                <legend><span class="panel-title">CV</span></legend>

                                <div class="layui-container">

                                    <!-- 1 开始 -->
                                    <div class="field">
                                        <div class="layui-row">
                                            <div class="layui-col-md4">
                                                <p>1. 获取 FPS</p>
                                                <div class="item result">&nbsp;&nbsp;&nbsp; FPS: %%cvFps%%</div>
                                            </div>
                                            <div class="layui-col-md4">
                                                <div class="item action">
                                                    <button @click="getFps()" class="inline layui-btn"><i
                                                            class="layui-icon">&#xe601;&nbsp;获取</i></button>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                    <!-- 1 结束 -->

                                    <!-- 2 开始 -->
                                    <div class="field">
                                        <div class="layui-row">
                                            <div class="layui-col-md4">
                                                <p>2. 获取 mAP</p>
                                                <div class="item result">&nbsp;&nbsp;&nbsp; mAP: %%cvMap%%</div>
                                            </div>
                                            <div class="layui-col-md4">
                                                <div class="item">
                                                    <button @click="getMap()" class="inline layui-btn"><i
                                                            class="layui-icon">&#xe601;&nbsp;获取</i></button>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                    <!-- 2 结束 -->

                                    <!-- 3、4 开始 -->
                                    <div class="field file">
                                        <!-- 3 开始 -->
                                        <div class="newFileUpload">
                                            <div class="layui-row">
                                                <div class="layui-col-md4">
                                                    <label for="file">3.请选择图像文件 </label>
                                                    <div class="note">&nbsp;</div>
                                                </div>
                                                <div class="layui-col-md4">
                                                    <div class="userdefined-file">
                                                        <input type="text" name="userdefinedFile"
                                                            id="userdefinedFileImage" value="未选择任何文件" />
                                                        <button type="button">选择</button>
                                                    </div>

                                                    <input type="file" name="file" ref="file" id="fileImage"
                                                        @change="handleFileUploadImage($event)" />
                                                </div>
                                            </div>
                                        </div>
                                        <!-- 3 结束 -->

                                        <!-- 4 开始 -->
                                        <div class="layui-row">
                                            <div class="layui-col-md4">4.请上传图像文件 </div>
                                            <div class="layui-col-md4">
                                                <button @click="submitFile('cv')" class="layui-btn"><i
                                                        class="layui-icon">&#xe67c;&nbsp;上传</i></button>
                                            </div>
                                        </div>
                                        <!-- 4 结束 -->
                                    </div>
                                    <!-- 3、4 结束 -->

                                    <div class="action" v-if="imageOriginal!=''">
                                        <div class="layui-row">
                                            <div class="layui-col-md4">5.识别图片</div>
                                            <div class="layui-col-md4">
                                                <button class="layui-btn" @click="identifyImage()"><i
                                                        class="layui-icon">&#xe615;&nbsp;识别</i></button><br>
                                            </div>
                                        </div>
                                    </div>

                                    <div class="field">
                                        <div class="layui-row">
                                            <div class="image original" v-if="imageOriginal!=''">
                                                <div class="layui-col-md1">
                                                    <div class="label">原图</div>
                                                </div>
                                                <div class="layui-col-md3">
                                                    <image :src="imageOriginal" />
                                                </div>
                                            </div>

                                            <div class="image result cv" v-if="imageResult!=''">
                                                <div class="layui-col-md1">
                                                    <div class="label">结果图</div>
                                                </div>
                                                <div class="layui-col-md3">
                                                    <image :src="imageResult" />
                                                </div>
                                            </div>
                                        </div>
                                    </div>

                                </div>
                            </fieldset>
                        </div>
                    </div>
                    <!-- CV 结束 -->
                </div>
            </div>
        </div>
    </body>
    <script>
        const {
            createApp
        } = Vue
        createApp({
            data() {
                return {
                    file: '',
                    defaultText: '请检测出纸箱、瓶子和果皮',
                    modelLoaded: false,
                    imageOriginal: '',
                    imageResult: '',
                    audioOriginal: '',
                    error: '',
                    asrResult: {},
                    cvMap: '',
                    cvFps: '',
                    loading: '',
                    asrStatus: 'pending',
                    cvStatus: 'pending'
                }
            },
            // Avoid conflict with Flask delimiters
            compilerOptions: {
                delimiters: ["%%", "%%"]
            },
            methods: {
                async loadModel() {
                    if (this.loading != '') return showError('在运行中,无法执行')
                    this.loading = '加载模型中,请耐心等待...'
                    this.modelLoaded = false
                    try {
                        var {
                            data,
                            status
                        } = await axios.get('/asr/load')
                        if (status == 200) {
                            this.modelLoaded = true
                        }
                    } catch (err) {
                        showError(err.response.data)
                    }
                    this.loading = ''
                },
                async submitFile(fileType) {
                    let formData = new FormData()
                    formData.append('file', this.file)
                    if (this.file == "") {
                        showError("请选择文件");
                        return false;
                    }

                    statusType = fileType + 'Status'
                    this.loading = '上传中...'
                    try {
                        var {
                            data,
                            status
                        } = await axios.post('/' + fileType + '/upload', formData, {
                            headers: {
                                'Content-Type': 'multipart/form-data'
                            }
                        })
                        if (status == 200) {
                            this[statusType] = 'uploaded'
                            if (fileType == 'cv') {
                                this.imageOriginal = data
                            } else {
                                this.audioOriginal = data
                            }
                        }
                    } catch (err) {
                        showError(err.response.data)
                    }
                    this.loading = ''
                },
                handleFileUploadAudio(event) {
                    document.getElementById("userdefinedFileAudio").value = document.getElementById("fileAudio")
                        .value;
                    this.file = event.target.files[0];
                },
                handleFileUploadImage(event) {
                    document.getElementById("userdefinedFileImage").value = document.getElementById("fileImage")
                        .value;
                    this.file = event.target.files[0];
                },
                async identifyAudio(event) {
                    // if (this.loading != '') return showError('在运行中,无法执行')
                    this.loading = '识别中...'
                    try {
                        let formData = new FormData()
                        formData.append('defaultText', this.defaultText)
                        console.log('t', this.defaultText)
                        var result = await axios.post('/asr/identify', formData)
                        this['asrStatus'] = 'identified'
                        this.asrResult = result.data
                    } catch (err) {
                        if (err.response.status == 500) this.modelLoaded = false
                        showError(err.response.data)
                    }
                    this.loading = ''
                },
                async identifyImage(event) {
                    if (this.loading != '') return showError('在运行中,无法执行')
                    this.loading = '识别中...'
                    this.cvStatus = 'pending'
                    try {
                        var {
                            data
                        } = await axios.get('/api/detect/image')
                        this.imageResult = data['detection_result_image_path']
                    } catch (err) {
                        showError(err.response.data)
                    }
                    this.loading = ''
                },
                async getFps(event) {
                    if (this.loading != '') return showError('在运行中,无法执行')
                    this.loading = '获取 FPS...'
                    try {
                        var {
                            data
                        } = await axios.get('/api/detect/fps')
                        this.cvFps = data['detection_FPS']
                    } catch (err) {
                        showError(err.response.data)
                    }
                    this.loading = ''
                },
                async getMap(event) {
                    // 接口路径: /api/detect/map
                    // 方式: GET
                    if (this.loading != '') return showError('在运行中,无法执行')
                    this.loading = '获取 mAP...'
                    try {
                        var {
                            data
                        } = await axios.get('/api/detect/map')
                        this.cvMap = data['detection_mAP']
                    } catch (err) {
                        showError(err.response.data)
                    }
                    this.loading = ''
                }
            }
        }).mount('#app')

        function showError(msg) {
            layer.msg(msg || '错误')
        }
    </script>
</html>

3.2 CSS

body {
	font-size: 20px;
	margin: 0;
}

.content {
	padding: 10px;
	margin: 40px;
}

fieldset {
	border: 1px solid #ccc;
	padding: 10px;
}

.modelLoaded {
	color: green;
}

.note {
	color: #999;
	margin: 5px 0;
	font-size: 12px;
}

.field {
	margin: 10px 0;
}

.action {
	margin-top: 10px;
}

.loading {
	position: fixed;
	top: 0;
	background: #E8F9D9;
	text-align: center;
	width: 100%;
}

.pad {
	padding: 5px;
}

.inline {
	display: inline-block;
}

.field .item {
	margin: 5px 0;
}

.image {
	display: inline-block;
	margin-right: 10px;
}

.image img {
	max-height: 600px;
}

/* 标题 */
h1,
h5 {
	margin: 40px;
}

/* 队名 */
h5 {
	margin-left: 210px;
}

/* 面板title */
.panel-title {
	font-size: 25px;
}

/* 答案输入框 */
#answer {
	height: 40px;
	width: 200px;
	font-size: 14px;
	display: inline-block;
	vertical-align: middle;
	padding-right: 14px;
	padding-left: 14px;
}

/* 音频文件选择 */
.newFileUpload {
	position: relative;
	height: 40px;
	line-height: 40px;
}

.newFileUpload label {
	display: inline-block;
}

.userdefined-file {
	position: absolute;
	top: 0;
	/* left: 200px; */
	z-index: 2;
	width: 300px;
	height: 40px;
	line-height: 40px;
	font-size: 0;
	/*应对子元素为 inline-block 引起的外边距*/
}

.userdefined-file input[type="text"] {
	display: inline-block;
	vertical-align: middle;
	padding-right: 14px;
	padding-left: 14px;
	width: 220px;
	box-sizing: border-box;
	border: 1px solid #ccc;
	height: 40px;
	line-height: 40px;
	font-size: 14px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.userdefined-file button {
	display: inline-block;
	vertical-align: middle;
	width: 80px;
	text-align: center;
	height: 40px;
	line-height: 40px;
	font-size: 14px;
	background-color: #009688;
	/* background-color: #f54; */
	border: none;
	color: #fff;
	cursor: pointer;
}

.newFileUpload input[type="file"] {
	position: absolute;
	top: 0;
	/* left: 200px; */
	z-index: 3;
	opacity: 0;
	width: 300px;
	height: 40px;
	line-height: 40px;
	cursor: pointer;
}

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

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

相关文章

卡尔曼滤波:过滤随机游走

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 我们知道&#xff0c;随机游走序列是到当前时间为止白噪声实现(white noise realization)的简单求和。换句话说&#xff0c;随机游走序列中的对下一个时间点值的估计&#xff08;预测&#xff09;是通…

为什么程序员买不起房子?

很多人都说程序员的收入那么高&#xff0c;为什么程序员还是买不起房呢&#xff1f;其实不是程序员不想买&#xff0c;是真的买不起…… 拿北京为例。北京的房价可谓是越来越奇葩&#xff0c;不仅仅是因为银行政策导致贷款越来越难审批下来&#xff0c;更重要的是进入地产市场…

音频3A算法详解

一、音频3A技术背景 手机电脑等智能设备的普及,AI智能、5G等技术的不断发展,语音通信成为了最方便快捷的远程交流方式,会议全向麦克风、会议一体化终端等会议系统逐渐成为企业经营中的重要工具。语音质量决定了企业远程沟通协作效果,其中噪音和回声能够严重影响到语音预处理…

图扑软件获评 2022 年“火炬瞪羚企业”

厦门火炬高新区 2022 年“火炬瞪羚企业”名单公布&#xff0c;图扑软件经过层层遴选&#xff0c;成功入围&#xff0c;获评 2022 年“火炬瞪羚企业”称号。 在 2021 年&#xff0c;图扑软件已经凭借领先的技术实力和发展潜力&#xff0c;入选福建省数字经济领域“瞪羚”创新企业…

连续学习入门(二):连续学习的三种类型

说明&#xff1a;本系列文章若无特别说明&#xff0c;则在技术上将 Continual Learning&#xff08;连续学习&#xff09;等同于 Incremental Learning&#xff08;增量学习&#xff09;、Lifelong Learning&#xff08;终身学习&#xff09;&#xff0c;关于 Continual Learni…

Express操作MongoDB【一.Express框架通过Mongoose模块操作MongoDB数据库;二.在接口中间件中使用Mongoose模块】

目录 一.Express框架通过Mongoose模块操作MongoDB数据库 1.MongoDB数据库&#xff1a; &#xff08;1&#xff09;存放数据的格式&#xff1a;key:value &#xff08;2&#xff09;数据库&#xff08;database&#xff09;---集合&#xff08;collection&#xff09;---文档…

使用vite 搭建vue 3的项目

一、目标&#xff1a; 使用vite搭建一个Vue 3 的项目&#xff0c;并启动成功。 二、准备工作 首先你要有Node.js、VSCode编辑器、Chrome浏览器 关于下载的问题Node.js可以去官网下载 链接&#xff1a;http://nodejs.cn/download/ 下载左边的长期支持版本就好&#xff0c;最新版…

基于Haar-Like特征的人脸检测算法研究-附Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、Haar-Like 特征✳️ 三、人脸检测实验验证✳️ 四、参考文献✳️ 五、Matlab代码获取✳️ 一、引言 脸是每个人最重要的外貌特征&#xff0c;随着科技推动社会不断向前发展&#xff0c;人脸识别也逐渐融入人们的生活中&#xff0c;例如在…

活动预告丨EMNLP 2022半监督和强化对话系统研讨会12月7日线上召开!

由清华大学和中国移动联合承办的EMNLP 2022 SereTOD Workshop “Towards Semi-Supervised and Reinforced Task-Oriented Dialog Systems&#xff08;迈向半监督和强化的任务型对话系统&#xff09;”&#xff0c;即将与EMNLP 2022主会同步举办。因受疫情影响&#xff0c;研讨会…

【蓝桥备战】前缀和+差分+高精度

文章目录前缀和差分大整数加减乘除前缀和 前缀和&#xff0c;即preSum[i] nums[i-1] nums[i-2] nums[0]。一般地&#xff0c;我们会让preSum[0] 0。 图&#xff1a;preSum[3] nums[2] nums[1] nums[0]。 构造前缀和数组对我们来说是简单的&#xff0c;只需要会用以下…

c++中的内存分区模型

内存分区模型 c程序在执行时&#xff0c;将内存大方向划分为4个区域1、代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理2、全局区&#xff1a;存放全局变量和静态变量以及常量3、栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&…

手把手教你使用Vue3指定状态管理库--Pinia

什么是 Pinia Pinia 与 Vuex 一样&#xff0c;是作为 Vue 的“状态存储库”&#xff0c;用来实现 跨页面/组件 形式的数据状态共享。 在平时的开发过程中&#xff0c;Vue 组件之间可以通过 Props 和 Events 实现组件之间的消息传递&#xff0c;对于跨层级的组件也可以通过 Ev…

Java并发编程实战读书笔记三

第七章 取消和关闭 Java没有提供任何机制来安全的终止线程&#xff0c;虽然 Thread.stop 和 suspend 等方法提供了这样的机制&#xff0c;但由于存在着一些严重的陷&#xff0c;因此应该避免使用 7.1任务取消 7.1.1 中断 取消任务中生产者使用了队列的put操作导致阻塞后任务…

day14_类中成员之构造器

由来 我们发现我们new完对象时&#xff0c;所有成员变量都是默认值&#xff0c;如果我们需要赋别的值&#xff0c;需要挨个为它们再赋值&#xff0c;太麻烦了。我们能不能在new对象时&#xff0c;直接为当前对象的某个或所有成员变量直接赋值呢。可以&#xff0c;Java给我们提…

工作两年,没想到靠Python搞副业让我实现了财务自由

前言 国庆假期和好友聚会&#xff0c;聊了各自近两年的变化&#xff0c;朋友的经历让我大吃一惊&#xff01; 2年前他还是月薪5千的小编&#xff0c;现在轻松实现月入5万的小目标。 &#xff08;文末送读者福利&#xff09; 原来是利用空余时间学会了Python编程&#xff0c…

TPM零知识学习二—— 相关链接和页面

TPM2社区的主页地址为&#xff1a;https://tpm2-software.github.io/ 页面如下&#xff1a; 主页中提供了很多有用的链接&#xff0c;包括&#xff1a; Software | tpm2-software community 页面如下&#xff1a; External | tpm2-software community 页面如下&#xff1a;…

《计算机体系结构量化研究方法》1.8 性能的测量、报告和汇总

引入 1、一些概念 响应时间&#xff1a;手机用户所关注的“速度”&#xff0c;也就是一个事件从启动到完成的时间&#xff0c;又称为执行时间。 吞吐量&#xff1a;给定时间内完成的总工作量&#xff0c;WSC的操作人员关注这个。 执行时间是性能的倒数&#xff08;即执行时间…

DSP之Controlsuit和C2000Ware下载安装

DSP之Controlsuit和C2000Ware下载安装 Controlsuit 用于 C2000TM 微处理器的 controlSUITETM 是一套全面的软件基础设施和软件工具集&#xff0c;旨在最大程度地缩短软件开发时间。从特定于器件的驱动程序和支持软件到复杂系统应用中的完整系统示例&#xff0c;controlSUITET…

Redis击穿、穿透、雪崩

Redis 的基本概念 在没有添加 Redis 的时候&#xff0c;后端的查询流程是&#xff1a; 用户访问页面-请求后端服务-经过逻辑处理后&#xff0c;去数据库查询信息。 在添加 Redis 的之后&#xff0c;后端的查询流程是&#xff1a; 用户访问页面-请求后端服务-经过逻辑处理后&a…

超强AI绘图-文生图

一、前言 前面汇总了四种AI绘图的方法&#xff0c;详情可以点击下图跳转到文章《AI绘画合集&#xff08;11月汇总&#xff09;》。主要内容是&#xff1a;具象意象派AI作图、AI绘制专属动漫头像、基于ViLG模型AI 作画。点击下面文章跳转&#xff01; 《AI绘图—对中文拟合度…