UIE与ERNIE-Layout:智能视频问答任务初探

内容来自百度飞桨ai社区UIE与ERNIE-Layout:智能视频问答任务初探:

如有侵权,请联系删除

1 环境准备

In [2]

# 安装依赖库
!pip install paddlenlp --upgrade
!pip install paddleocr --upgrade
!pip install paddlespeech --upgrade

In [82]

import os
import cv2
import numpy as np
from tqdm import tqdm
from pprint import pprint
from paddlenlp import Taskflow
from IPython.display import Video
from paddleocr import PaddleOCR, draw_ocr

2 信息抽取方法

在PaddleNLP为我们提供的各类解决方案中,面对领域多变、任务多样、数据稀缺的挑战,UIE具有较强的适应性。其中,uie-x-base模型面向纯文本文档场景的抽取式模型,支持中英文的文档/图片/表格的端到端信息抽取。

比如下面这个视频,如果我们将其内容进行抽帧,得到的一系列的图片直接送入**uie-x-base** 模型中进行信息抽取,由于视频中传输的知识结构清晰,模型对 某一步具体是什么内容这里的问题,能较为准确地给出反馈结果。

In [17]

Video('video01-clip.mp4')
<IPython.core.display.Video object>

In [13]

# 定义实体关系抽取的schema——也就是视频问答的问题
schema = ['what is the 3rd step']
ie = Taskflow("information_extraction", schema=schema, model="uie-x-base", ocr_lang="en", schema_lang="en")
[2023-02-05 19:22:16,119] [    INFO] - We are using <class 'paddlenlp.transformers.ernie_layout.tokenizer.ErnieLayoutTokenizer'> to load '/home/aistudio/.paddlenlp/taskflow/information_extraction/uie-x-base'.

In [19]

src_video = cv2.VideoCapture('video01-clip.mp4')
fps = int(src_video.get(cv2.CAP_PROP_FPS))
total_frame = int(src_video.get(cv2.CAP_PROP_FRAME_COUNT)) # 计算视频总帧数

prob = 0
output = ''
for i in tqdm(range(total_frame)):    
    success, frame = src_video.read()
    # 对传入视频抽帧
    if i % (fps) == 10:
        if success:
            # 保存图片
            cv2.imwrite(str(i) + '.jpg', frame)
            # 送入UIE模型进行文档信息抽取
            result = ie({"doc": str(i) + '.jpg'})
            if len(result[0]) > 0:
                # 只保留识别结果中,置信度最高的那个
                if result[0][schema[0]][0]['probability'] >  prob:
                    prob = result[0][schema[0]][0]['probability']
                    output = result[0][schema[0]][0]['text']
                    # 输出结果
                    pprint(result[0][schema[0]][0])
 34%|███▎      | 172/510 [00:01<00:01, 183.01it/s]
{'bbox': [[594, 30, 724, 80]],
 'end': 8,
 'probability': 0.8937306903884945,
 'start': 2,
 'text': 'UNPACK'}
 74%|███████▍  | 379/510 [00:02<00:00, 169.88it/s]
{'bbox': [[603, 138, 810, 183]],
 'end': 32,
 'probability': 0.9051069707893973,
 'start': 20,
 'text': 'SAFETy CHECK'}
100%|██████████| 510/510 [00:02<00:00, 175.77it/s]

上面视频问答的标准答案为:

Q: What is the third step?

A: safety check

In [ ]

# 删除多余图片
!rm *.jpg

我们把上面这个过程简单梳理下,主要包括下面几个步骤:

  1. 定义要抽取的schema——直接把问题作为信息抽取的内容
  2. 视频抽帧,保存图片到本地
  3. 送入UIE模型进行信息抽取
  4. 逐帧比较抽取结果,剔除重复、不正确结果
  5. 保存并输出正确结果以及对应图片(便于用户进行核对确认)

下面,我们就将这个思路写成一个视频问答处理函数,并验证效果。

In [50]

def get_video_info(video_path, question):
    # 定义实体关系抽取的schema
    schema = [question]
    ie = Taskflow("information_extraction", schema=schema, model="uie-x-base", ocr_lang="en", schema_lang="en")
    src_video = cv2.VideoCapture(video_path)
    fps = int(src_video.get(cv2.CAP_PROP_FPS))
    total_frame = int(src_video.get(cv2.CAP_PROP_FRAME_COUNT)) # 计算视频总帧数

    prob = 0
    output = ''
    pre_frame = 10
    for i in tqdm(range(total_frame)):    
        success, frame = src_video.read()
        # 记录保存的前一个最优结果图片
        if i % (fps) == 10:
            if success:
                cv2.imwrite(str(i) + '.jpg', frame)
                result = ie({"doc": str(i) + '.jpg'})
                if len(result[0]) > 0:
                    if result[0][schema[0]][0]['probability'] >  prob:
                        if os.path.exists(str(pre_frame) + '.jpg'):
                            os.remove(str(pre_frame) + '.jpg')
                        prob = result[0][schema[0]][0]['probability']
                        output = result[0][schema[0]][0]['text']
                        pprint(result[0][schema[0]][0])
                        pre_frame = i
                    else: 
                        os.remove(str(i) + '.jpg')
                elif i!=10:
                    os.remove(str(i) + '.jpg')
    return output

In [ ]

# 显示要进行问答的视频
Video('video03-clip.mp4')

问答的标准答案:

Q: What is the purpose of the red laser sights?

A: Help you accurately aim at the target

In [71]

get_video_info('video03-clip.mp4', 'What is the purpose of the red laser sights?')
[2023-02-05 22:00:07,586] [    INFO] - We are using <class 'paddlenlp.transformers.ernie_layout.tokenizer.ErnieLayoutTokenizer'> to load '/home/aistudio/.paddlenlp/taskflow/information_extraction/uie-x-base'.
 28%|██▊       | 126/450 [00:03<00:04, 72.93it/s]
{'bbox': [[528, 21, 649, 44], [274, 55, 695, 77]],
 'end': 53,
 'probability': 0.9742606425060707,
 'start': 17,
 'text': 'HELP YOUACCURATELY AIM AT THE TARGET'}
 38%|███▊      | 172/450 [00:03<00:02, 101.23it/s]
{'bbox': [[528, 21, 649, 44], [274, 55, 695, 77]],
 'end': 53,
 'probability': 0.974278300524599,
 'start': 17,
 'text': 'HELP YOUACCURATELY AIM AT THE TARGET'}
 43%|████▎     | 195/450 [00:04<00:02, 112.72it/s]
{'bbox': [[528, 21, 649, 44], [274, 54, 694, 75]],
 'end': 52,
 'probability': 0.9762005052161093,
 'start': 17,
 'text': 'HELP YOUACCURATELY AIMAT THE TARGET'}
100%|██████████| 450/450 [00:05<00:00, 83.42it/s] 
'HELP YOUACCURATELY AIMAT THE TARGET'

我们观察video03-clip.mp4这个视频的问答抽取结果,可以发现虽然识别结果是正确的,但是直接输出的OCR识别结果后续还需要进行文本矫正。

3 ERNIE-Layout方法

ERNIE-Layout是依托PaddleNLP对外开源业界最强的多语言跨模态文档预训练模型。ERNIE-Layout以文心文本大模型ERNIE为底座,融合了文本、图像、布局等信息进行跨模态联合建模,创新性引入布局知识增强,提出阅读顺序预测、细粒度图文匹配等自监督预训练任务,升级空间解偶注意力机制,在各数据集上效果取得大幅度提升。

参考资料:ERNIE-Layout: Layout-Knowledge Enhanced Multi-modal Pre-training for Document Understanding

ERNIE-Layout同样可以使用Taskflow一键调用。

In [56]

from pprint import pprint
from paddlenlp import Taskflow

docprompt = Taskflow("document_intelligence", lang='en')
pprint(docprompt([{"doc": "217.jpg", "prompt": ["What is the purpose of the red laser sights?"]}]))
[2023-02-05 21:49:22,279] [    INFO] - We are using <class 'paddlenlp.transformers.ernie_layout.tokenizer.ErnieLayoutTokenizer'> to load 'ernie-layoutx-base-uncased'.
[2023-02-05 21:49:22,283] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/vocab.txt
[2023-02-05 21:49:22,285] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/sentencepiece.bpe.model
[2023-02-05 21:49:22,932] [    INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/tokenizer_config.json
[2023-02-05 21:49:23,014] [    INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/special_tokens_map.json
[{'prompt': 'What is the purpose of the red laser sights?',
  'result': [{'end': 17,
              'prob': 0.97,
              'start': 9,
              'value': 'ACCURATELY AIM AT THE TARGET'}]}]

In [67]

def get_docprompt(video_path, question):
    # 定义实体关系抽取的schema
    schema = [question]
    ie = Taskflow("document_intelligence", lang='en')
    src_video = cv2.VideoCapture(video_path)
    fps = int(src_video.get(cv2.CAP_PROP_FPS))
    total_frame = int(src_video.get(cv2.CAP_PROP_FRAME_COUNT)) # 计算视频总帧数

    prob = 0
    output = ''
    pre_frame = 10
    for i in tqdm(range(total_frame)):    
        success, frame = src_video.read()
        # 记录保存的前一个最优结果图片
        if i % (fps) == 10:
            if success:
                cv2.imwrite(str(i) + '.jpg', frame)
                result = ie([{"doc": str(i)+".jpg", "prompt": schema}])
                if len(result[0]) > 0:
                    if result[0]['result'][0]['prob'] >  prob:
                        if os.path.exists(str(pre_frame) + '.jpg'):
                            os.remove(str(pre_frame) + '.jpg')
                        prob = result[0]['result'][0]['prob']
                        output = result[0]['result'][0]['value']
                        pprint(result[0]['result'][0])
                        pre_frame = i
                    else: 
                        os.remove(str(i) + '.jpg')
                elif i!=10:
                    os.remove(str(i) + '.jpg')
    return output

In [70]

get_docprompt('video01-clip.mp4', 'What is the third step?')
[2023-02-05 21:59:20,521] [    INFO] - We are using <class 'paddlenlp.transformers.ernie_layout.tokenizer.ErnieLayoutTokenizer'> to load 'ernie-layoutx-base-uncased'.
[2023-02-05 21:59:20,525] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/vocab.txt
[2023-02-05 21:59:20,527] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/sentencepiece.bpe.model
[2023-02-05 21:59:21,160] [    INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/tokenizer_config.json
[2023-02-05 21:59:21,163] [    INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/special_tokens_map.json
 45%|████▌     | 231/510 [00:00<00:00, 347.51it/s]
{'end': 11, 'prob': 1.0, 'start': 9, 'value': 'SAFETy CHECK'}
100%|██████████| 510/510 [00:01<00:00, 270.32it/s]
'SAFETy CHECK'

In [68]

get_docprompt('video03-clip.mp4', "What is the purpose of the red laser sights?")
[2023-02-05 21:57:12,703] [    INFO] - We are using <class 'paddlenlp.transformers.ernie_layout.tokenizer.ErnieLayoutTokenizer'> to load 'ernie-layoutx-base-uncased'.
[2023-02-05 21:57:12,707] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/vocab.txt
[2023-02-05 21:57:12,709] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/sentencepiece.bpe.model
[2023-02-05 21:57:13,338] [    INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/tokenizer_config.json
[2023-02-05 21:57:13,341] [    INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/special_tokens_map.json
  0%|          | 1/450 [00:00<01:04,  6.91it/s]
{'end': 7, 'prob': 0.86, 'start': 5, 'value': 'RANGEFINDER RETICLE'}
  2%|▏         | 11/450 [00:00<00:10, 42.43it/s]
{'end': 7, 'prob': 0.87, 'start': 7, 'value': 'RANGEFINDER'}
  8%|▊         | 34/450 [00:00<00:03, 106.16it/s]
{'end': 7, 'prob': 0.88, 'start': 7, 'value': 'RANGEFINDER'}
 13%|█▎        | 57/450 [00:00<00:02, 141.83it/s]
{'end': 7, 'prob': 0.89, 'start': 7, 'value': 'RANGEFINDER'}
 28%|██▊       | 126/450 [00:00<00:01, 191.73it/s]
{'end': 17, 'prob': 0.96, 'start': 9, 'value': 'ACCURATELY AIM AT THE TARGET'}
 33%|███▎      | 149/450 [00:00<00:01, 194.31it/s]
{'end': 17, 'prob': 0.97, 'start': 9, 'value': 'ACCURATELY AIM AT THE TARGET'}
100%|██████████| 450/450 [00:02<00:00, 212.87it/s]
'ACCURATELY AIM AT THE TARGET'

虽然在video01-clip.mp4video03-clip.mp4两个视频的问答结果上,ERNIE-Layout和信息抽取结果大同小于,甚至video03-clip.mp4的问答结果离标准答案还有一点点缺漏,但是读者可以比较下面video02-clip.mp4video07-clip.mp4的问答结果,会发现ERNIE-Layout在真正的上下文理解上,明显要更强一些。

In [ ]

# 显示要进行问答的视频
Video('video02-clip.mp4')

Q1: How many bolts are there?

A1: 8

In [72]

get_docprompt('video02-clip.mp4', "How many bolts are there?")
[2023-02-05 22:08:41,260] [    INFO] - We are using <class 'paddlenlp.transformers.ernie_layout.tokenizer.ErnieLayoutTokenizer'> to load 'ernie-layoutx-base-uncased'.
[2023-02-05 22:08:41,265] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/vocab.txt
[2023-02-05 22:08:41,267] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/sentencepiece.bpe.model
[2023-02-05 22:08:41,890] [    INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/tokenizer_config.json
[2023-02-05 22:08:41,893] [    INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/special_tokens_map.json
  2%|▏         | 11/537 [00:00<00:10, 49.61it/s]
{'end': 0, 'prob': 0.98, 'start': 0, 'value': '8SOLIDSTEELLOCKINGBOLTS'}
 23%|██▎       | 126/537 [00:00<00:02, 192.12it/s]
{'end': 0, 'prob': 0.99, 'start': 0, 'value': '8SOLIDSTEELLOCKING'}
100%|██████████| 537/537 [00:02<00:00, 201.76it/s]
'8SOLIDSTEELLOCKING'

4 字幕抽取的特殊处理

有的视频是带字幕的,而且问答内容只在字幕中,视频其它位置的文字反而会形成严重干扰,这时候在读取图片的时候限定字幕范围,可以很好地提升问答结果的准确程度。

In [79]

def get_docprompt_v2(video_path, question):
    # 定义实体关系抽取的schema
    schema = [question]
    ie = Taskflow("document_intelligence", lang='en')
    src_video = cv2.VideoCapture(video_path)
    fps = int(src_video.get(cv2.CAP_PROP_FPS))
    total_frame = int(src_video.get(cv2.CAP_PROP_FRAME_COUNT)) # 计算视频总帧数

    prob = 0
    output = ''
    pre_frame = 10
    for i in tqdm(range(total_frame)):    
        success, frame = src_video.read()
        # 记录保存的前一个最优结果图片
        if i % (fps) == 10:
            if success:
                # 限定范围只抽取字幕
                cv2.imwrite(str(i) + '.jpg', frame[-180:-30:])
                result = ie([{"doc": str(i)+".jpg", "prompt": schema}])
                if len(result[0]) > 0:
                    if result[0]['result'][0]['prob'] >  prob:
                        if os.path.exists(str(pre_frame) + '.jpg'):
                            os.remove(str(pre_frame) + '.jpg')
                        prob = result[0]['result'][0]['prob']
                        output = result[0]['result'][0]['value']
                        pprint(result[0]['result'][0])
                        pre_frame = i
                    else: 
                        os.remove(str(i) + '.jpg')
                elif i!=10:
                    os.remove(str(i) + '.jpg')
    return output

In [76]

# 显示要进行问答的视频
Video('video07-clip.mp4')
<IPython.core.display.Video object>

Q: What does Treasure Race mean?

A: The hunt for the treasure of Gold Roger.

In [80]

get_docprompt_v2('video07-clip.mp4', "What does Treasure Race mean?")
[2023-02-05 22:23:35,360] [    INFO] - We are using <class 'paddlenlp.transformers.ernie_layout.tokenizer.ErnieLayoutTokenizer'> to load 'ernie-layoutx-base-uncased'.
[2023-02-05 22:23:35,364] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/vocab.txt
[2023-02-05 22:23:35,366] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/sentencepiece.bpe.model
[2023-02-05 22:23:36,011] [    INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/tokenizer_config.json
[2023-02-05 22:23:36,013] [    INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/ernie-layoutx-base-uncased/special_tokens_map.json
 22%|██▏       | 133/597 [00:00<00:01, 255.63it/s]
{'end': 13,
 'prob': 0.95,
 'start': 0,
 'value': 'The hunt for the treasureof Gold Roger!'}
100%|██████████| 597/597 [00:01<00:00, 305.63it/s]
'The hunt for the treasureof Gold Roger!'

5 需要结合时序的视频问答

还有一种更加复杂的情况,就是要结合出现文字/字幕的时序信息进行问答。

In [ ]

# 显示要进行问答的视频
Video('video05-clip.mp4')

Q: What is the first step to do a fast healing?

A: Clean the cut or scrape.

比如上面这个视频,问答内容与是fast healing的处理步骤,但是视频帧里,步骤只有文字,而不像第一个视频一样有1、2、3、4……,这时候用文档抽取或ERNIE-Layout就傻眼了,因为对着一张图片怎么也回答不出来。此时,就需要把读取到的文字都拼接起来,得到时序相关的文字信息。

In [ ]

ocr = PaddleOCR(use_angle_cls=False, lang="en")
similarity = Taskflow(task="text_similarity", mode="fast", max_seq_len=16, lang="en")

In [182]

src_video = cv2.VideoCapture('video05-clip.mp4')
fps = int(src_video.get(cv2.CAP_PROP_FPS))
total_frame = int(src_video.get(cv2.CAP_PROP_FRAME_COUNT)) # 计算视频总帧数

save_text0 = []
for i in tqdm(range(total_frame)):    
    success, frame = src_video.read()
    if i % (fps) == 10:
        line_text = []
        if success:
            # 排除干扰信息,只抽取部分画面
            result = ocr.ocr(frame[30:180:], cls=True)
            for idx in range(len(result)):
                res = result[idx]
                for line in res:
                    if len(line[1][0]) > 1:
                        line_text.append(line[1][0])
                line_res = ' '.join(line_text)
            save_text0.append(line_res)

In [177]

save_text = []
for i in save_text0:
    if i != '':
        save_text.append(i)

In [178]

# 结果去重
final_text =list(set(save_text))
final_text.sort(key=save_text.index)

In [179]

final_text = ','.join(final_text)

In [180]

final_text
'3 Steps to Fast Healing,Clean the cut or scrape,Treat the Wound with a topical antibiotic,Cover the cut or scrape'

完成上述工作后,看着final_text这段文字,总算可以进行问答了。不过,直接用信息抽取的预训练模型还是得不到结果,我们可以稍微调整下,增加关键词。等到后面赛题后续训练集公布后,重新微调训练模型,识别效果必然会提升不少。

In [172]

# 定义实体关系抽取的schema
schema = ['What is the first step to do a healing?']
ie = Taskflow("information_extraction", schema=schema, model="uie-x-base")
ie('3 Steps to Fast Healing, first Clean the cut or scrape,second Treat the Wound with a topical antibiotic,then Cover the cut or scrape')
[2023-02-05 23:13:12,541] [    INFO] - We are using <class 'paddlenlp.transformers.ernie_layout.tokenizer.ErnieLayoutTokenizer'> to load '/home/aistudio/.paddlenlp/taskflow/information_extraction/uie-x-base'.
[{'What is the first step to do a healing?': [{'text': 'Clean the cut or scrape',
    'start': 31,
    'end': 54,
    'probability': 0.9410384130303413}]}]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VUE前端实现天爱滑块验证码--详细教程

第一步&#xff1a; Git地址&#xff1a;tianai-captcha-demo: 滑块验证码demo 找到目录 src/main/resources/static,拷贝 static 并改名为 tac 即可。 第二步&#xff1a; 将改为 tac 的文件&#xff0c;放进项目根目录中&#xff0c;如下图&#xff1a; 第三步&#xff1…

【CSS】一篇掌握CSS

不是因为有了希望才去坚持,而是坚持了才有了希望 目录 一.导入方式 1.行内样式 2.内部样式 3.外部样式(常用) 二.选择器 1.基本选择器(常用) 1.1标签选择器 1.2类选择器 1.3id选择器 2.层次选择器 2.1后代选择器 2.2子选择器 2.3相邻兄弟选择器 2.4通用兄弟选择器…

书生浦语·第四期作业合集

目录 1. Linux基础知识 1.1-Linux基础知识 1.在终端通过ssh 端口映射连接开发机 2. 创建helloworld.py 3.安装相关包并运行 4.端口映射并访问相关网页

vue.js学习(day 18)

实例&#xff1a;面经基础版

初窥 HTTP 缓存

引言 对于前端来说, 你肯定听说过 HTTP 缓存。 当然不管你知不知道它, 对于提高网站性能和用户体验, 它都扮演着重要的角色! 它通过在客户端和服务器之间存储和重用先前获取的资源副本, 来减少网络流量和降低资源加载时间, 从而提升用户体验! 以下是 HTTP 缓存的重要性: 减少…

Ubuntu在NVME硬盘使用Systemback安装记录

问题 使用Systemback重装系统找不到NVME硬盘。 0.使用Systemback制作iso后&#xff0c;制作启动盘 1.插入启动盘进入live mode模式 2.安装gparted sudo apt-get update sudo apt-get install gparted3.使用gparted对待分区硬盘进行分区 gparted按照你希望的分区方式分区即…

机器学习8-决策树CART原理与GBDT原理

Gini 系数 和Gini 系数增益 CART决策树算法流程举例 该篇文章对于CART的算法举例讲解&#xff0c;一看就懂。 决策树(Decision Tree)—CART算法 同时也可以观看视频 分类树 GBDT原理举例 可以看如下示例可以理解GBDT的计算原理 用通俗易懂的方式讲解&#xff1a; GBDT算法及…

编译器优化技术

方法内联 逃逸分析 公共子表达式消除 数据边界检查消除

VSCode中“Run Code”运行程序时,终端出现中文乱码解决方法

问题描述 在VSCode中“Run Code”运行程序时&#xff0c;终端输出结果出现中文乱码现象&#xff1a; 解决方法 1. 检查系统cmd的默认编码 查看Windows终端当前编码方式的命令&#xff1a; chcp输出结果是一段数字代码&#xff0c;如936&#xff0c;这说明当前的cmd编码方式…

运维工作常用Shell脚本(Commonly Used Shell Scripts for Operation and Maintenance Work)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

数据分析流程中的Lambda架构,以及数据湖基于Hadoop、Spark的实现

文章目录 一、Lambda架构1、Lambda的三层架构2、简单解释&#xff1a;3、Lambda架构的优缺点 二、数据湖基于Hadoop、Spark的实现1、架构2、数据管理&#xff08;存储层的辅助功能&#xff09; 一、Lambda架构 1、Lambda的三层架构 Batch View&#xff08;批处理视图层&#…

ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本)

ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本) code review! 参考笔记 1.ROS基本框架1——编写简单的发布者和订阅者(C++和Python版本) 2.ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本) 文章目录 ROS基本框架2——在ROS开发中创建并使用自定义…

【Linux 篇】Docker 容器星河与镜像灯塔:Linux 系统下解锁应用部署奇幻征程

文章目录 【Linux 篇】Docker 容器星河与镜像灯塔&#xff1a;Linux 系统下解锁应用部署奇幻征程前言一 、docker上部署mysql1. 拉取mysql镜像2. 创建容器3. 远程登录mysql 二 、docker上部署nginx1. 拉取nginx镜像2. 在dockerTar目录下 上传nginx.tar rz命令3. 创建nginx容器4…

Matlab模块From Workspace使用数据类型说明

Matlab原文连接&#xff1a;Load Data Using the From Workspace Block 模型&#xff1a; 从信号来源的数据&#xff1a; timeseries 数据&#xff1a; sampleTime 0.01; numSteps 1001;time sampleTime*[0:(numSteps-1)]; time time;data sin(2*pi/3*time);simin time…

【计算机网络】实验7:默认路由和特定主机路由以及路由环路问题

实验 7&#xff1a;默认路由和特定主机路由以及路由环路问题 一、 实验目的 了解默认路由以及特定主机路由。 了解静态路由配置错误导致的路由环路问题。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、默认路由以及特定主机路由 (1) 第一步&#xff…

kube-proxy的iptables工作模式分析

系列文章目录 iptables基础知识 文章目录 系列文章目录前言一、kube-proxy介绍1、kube-proxy三种工作模式2、iptables中k8s相关的链 二、kube-proxy的iptables模式剖析1.集群内部通过clusterIP访问到pod的流程1.1.流程分析 2.从外部访问内部service clusterIP后端pod的流程2.1…

学习ASP.NET Core的身份认证(基于Session的身份认证3)

开源博客项目Blog中提供了另一种访问控制方式&#xff0c;其基于自定义类及函数的特性类控制访问权限。本文学习并测试开源博客项目Blog的访问控制方式&#xff0c;测试程序中直接复用开源博客项目Blog中的相关类及接口定义&#xff0c;并在其上调整判断逻辑。   首先是接口A…

HTML前端开发-- Flex布局详解及实战

引言 Flex布局&#xff0c;全称为Flexible Box Layout&#xff0c;是一种现代CSS布局技术&#xff0c;它提供了一种更有效的方式来设计响应式布局和复杂页面布局。本文将详细介绍Flex布局的基本概念、属性以及实战应用。 一、基本概念 Flex布局的核心是Flex容器&#xff08;…

ESG研究报告白皮书与ESG治理报告合集(2020-2023年)

一.资料范围&#xff1a;&#xff08;1&#xff09;ESG白皮书及指南;&#xff08;2&#xff09;ESG研究报告,&#xff08;3&#xff09;ESG治理报告分析&#xff08;4&#xff09;上市公司ESG报告&#xff08;知名企业&#xff09; 二、资料用途&#xff1a;可以分析研究企业E…

C/C++每日一练:合并K个有序链表

本篇博客将探讨如何 “合并K个有序链表” 这一经典问题。本文将从题目要求、解题思路、过程解析和相关知识点逐步展开&#xff0c;同时提供详细注释的代码示例。 链表&#xff08;Linked List&#xff09; 链表是一种线性数据结构&#xff0c;由一系列节点&#xff08;Node&…