使用Claude 3.5 Sonnet和Stable Diffusion XL:如何通过Amazon Bedrock不断优化图像生成直到满足需求

news2024/11/16 15:25:55

在Amazon Bedrock的AI模型中,Anthropic Claude 3系列现在新增了图像识别功能。特别是最新的Anthropic Claude 3.5 Sonnet,图像识别能力得到了显著提升。我进行了一些简单的试验和比较,深入探索了这些Claude模型在OCR(光学字符识别)方面的表现。


 

本文将展示如何充分利用Anthropic Claude 3.5 Sonnet的图像识别功能,通过Amazon Bedrock对Stability AI的Stable Diffusion XL (SDXL) 生成的图像进行验证和再生成。我们的目标是通过自动判定生成图像是否符合要求,从而减少人工目视确认的工作量。

注意事项:

  • 本文及其他文章中提供的源代码是作为自主研究活动的一部分创建的。使用时请自行负责,并注意可能会有未经通知的修改。
  • 本文在个人注册的AWS账户上使用AWS服务进行编写。
  • 本文所用的Amazon Bedrock模型版本为2024年7月20日(JST)执行的,并依据当时的最终用户许可协议(EULA)使用。
    • Anthropic Claude 3.5 Sonnet(anthropic.claude-3-5-sonnet-20240620-v1:0):Anthropic on Bedrock - 商业服务条款(生效日期:2024年1月2日)
    • Stability AI Stable Diffusion XL(stability.stable-diffusion-xl-v1):STABILITY AMAZON BEDROCK 终端用户许可协议(最后更新日期:2024年4月29日)

架构图和处理流程

实现本次主题的架构图如下所示。

Using Amazon Bedrock to repeatedly generate images with Stable Diffusion XL via Claude 3.5 Sonnet until requirements are met

以下是对该处理流程的详细解释:

  1. 输入包含提示词和参数的事件。

2-1. 使用输入的提示词在Amazon Bedrock上运行SDXL模型以生成图像。

2-2. 将生成的图像保存到Amazon S3中。

2-3. 对保存到Amazon S3中的图像,使用Amazon Bedrock上的Claude 3.5 Sonnet模型进行验证,检查图像是否符合生成图像时的提示词要求。

  • 如果图像未满足提示词要求,则从2-1开始,按照指定的提示词执行次数重复处理2-1和2-2。

  • 如果图像符合提示词要求,则将该图像作为输出结果。

  • 3.如果未超过修正提示词的执行次数,并且图像未满足提示词要求的次数超过了指定的执行次数,则使用Amazon Bedrock上的Claude 3.5 Sonnet模型对生成图像的提示词进行修正,使其更可能满足要求,并重新开始2-1的处理。

    • 如果修正提示词的执行次数超过了规定次数,则将处理视为错误并终止。

在这个处理流程中,关键点是使用Claude 3.5 Sonnet模型对图像生成提示词的修正。

如果图像生成提示词对AI来说易于理解,那么通过几次执行,满足要求的图像很可能会被输出。然而,如果提示词对AI来说难以理解,可能会导致无法生成满足要求的图像。

因此,当超过指定的相同提示词执行次数后,我们会使用Amazon Bedrock上的Claude 3.5 Sonnet模型对图像生成提示词进行优化和修正,以提高生成满足要求图像的可能性。

实现示例

输入事件的格式

{
    "prompt": "<用于生成图像的初始提示>",
    "max_retry_attempts": <每个提示尝试生成图像的最大次数>,
    "max_prompt_revisions": <修正提示的最大次数>,
    "output_s3_bucket_name": "<保存生成图像的S3桶的名称>",
    "output_s3_key_prefix": "<生成图像的S3键前缀>",
    "claude_validate_temperature": <图像验证时Claude模型的temperature参数(0.0〜1.0)>,
    "claude_validate_top_p": <图像验证时Claude模型的top-p参数(0.0〜1.0)>,
    "claude_validate_top_k": <图像验证时Claude模型的top-k参数>,
    "claude_validate_max_tokens": <图像验证时Claude模型生成的最大token数>,
    "claude_revise_temperature": <修正提示时Claude模型的temperature参数(0.0〜1.0)>,
    "claude_revise_top_p": <修正提示时Claude模型的top-p参数(0.0〜1.0)>,
    "claude_revise_top_k": <修正提示时Claude模型的top-k参数>,
    "claude_revise_max_tokens": <修正提示时Claude模型生成的最大token数>,
    "sdxl_cfg_scale": <SDXL模型的CFG比例>,
    "sdxl_steps": <SDXL模型的步骤数>,
    "sdxl_width": <SDXL模型生成图像的宽度>,
    "sdxl_height": <SDXL模型生成图像的高度>,
    "sdxl_seed": <SDXL模型的随机种子>
}

输入事件示例

{
    "prompt": "A serene landscape with mountains and a lake",
    "max_retry_attempts": 5,
    "max_prompt_revisions": 3,
    "output_s3_bucket_name": "your-output-bucket-name",
    "output_s3_key_prefix": "generated-images",
    "claude_validate_temperature": 1.0,
    "claude_validate_top_p": 0.999,
    "claude_validate_top_k": 250,
    "claude_validate_max_tokens": 4096,
    "claude_revise_temperature": 1.0,
    "claude_revise_top_p": 0.999,
    "claude_revise_top_k": 250,
    "claude_revise_max_tokens": 4096,
    "sdxl_cfg_scale": 30,
    "sdxl_steps": 150,
    "sdxl_width": 1024,
    "sdxl_height": 1024,
    "sdxl_seed": 0
}

SOURCECODE

本次的实现的示例代码如下:

# #Event Sample
# {
#     "prompt": "A serene landscape with mountains and a lake",
#     "max_retry_attempts": 5,
#     "max_prompt_revisions": 3,
#     "output_s3_bucket_name": "your-output-bucket-name",
#     "output_s3_key_prefix": "generated-images",
#     "claude_validate_temperature": 1.0,
#     "claude_validate_top_p": 0.999,
#     "claude_validate_top_k": 250,
#     "claude_validate_max_tokens": 4096,
#     "claude_revise_temperature": 1.0,
#     "claude_revise_top_p": 0.999,
#     "claude_revise_top_k": 250,
#     "claude_revise_max_tokens": 4096,
#     "sdxl_cfg_scale": 30,
#     "sdxl_steps": 150,
#     "sdxl_width": 1024,
#     "sdxl_height": 1024,
#     "sdxl_seed": 0
# }
import boto3
import json
import base64
import os
import sys
from io import BytesIO
import datetime
import random
region = os.environ.get('AWS_REGION')
bedrock_runtime_client = boto3.client('bedrock-runtime', region_name=region)
s3_client = boto3.client('s3', region_name=region)
def claude3_5_invoke_model(input_prompt, image_media_type=None, image_data_base64=None, model_params={}):
    messages = [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": input_prompt
                }
            ]
        }
    ]
    
    if image_media_type and image_data_base64:
        messages[0]["content"].insert(0, {
            "type": "image",
            "source": {
                "type": "base64",
                "media_type": image_media_type,
                "data": image_data_base64
            }
        })
    body = {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": model_params.get('max_tokens', 4096),
        "messages": messages,
        "temperature": model_params.get('temperature', 1.0),
        "top_p": model_params.get('top_p', 0.999),
        "top_k": model_params.get('top_k', 250),
        "stop_sequences": ["\n\nHuman:"]
    }
    response = bedrock_runtime_client.invoke_model(
        modelId='anthropic.claude-3-5-sonnet-20240620-v1:0',
        contentType='application/json',
        accept='application/json',
        body=json.dumps(body)
    )
    response_body = json.loads(response.get('body').read())
    response_text = response_body["content"][0]["text"]
    return response_text
def sdxl_invoke_model(prompt, model_params={}):
    seed = model_params.get('sdxl_seed', 0)
    if seed == 0:
        seed = random.randint(0, 4294967295)
    
    body = {
        "text_prompts": [{"text": prompt}],
        "cfg_scale": model_params.get('cfg_scale', 10),
        "steps": model_params.get('steps', 50),
        "width": model_params.get('sdxl_width', 1024),
        "height": model_params.get('sdxl_height', 1024),
        "seed": seed
    }
    
    print(f"SDXL model parameters: {body}")
    
    response = bedrock_runtime_client.invoke_model(
        body=json.dumps(body),
        modelId="stability.stable-diffusion-xl-v1",
        contentType="application/json",
        accept="application/json"
    )
    
    response_body = json.loads(response['body'].read())
    image_data = base64.b64decode(response_body['artifacts'][0]['base64'])
    print(f"Image generated successfully with seed: {seed}")
    return image_data
def save_image_to_s3(image_data, bucket, key):
    s3_client.put_object(
        Bucket=bucket,
        Key=key,
        Body=image_data
    )
    print(f"Image saved to S3: s3://{bucket}/{key}")
def validate_image(image_data, prompt, claude_validate_params):
    image_base64 = base64.b64encode(image_data).decode('utf-8')
    
    input_prompt = f"""Does this image match the following prompt? Prompt: {prompt}. 
    Please answer in the following JSON format:
    {{"result":"", "reason":""}}
    Ensure your response can be parsed as valid JSON. Do not include any explanations, comments, or additional text outside of the JSON structure."""
    validation_result = claude3_5_invoke_model(input_prompt, "image/png", image_base64, claude_validate_params)
    
    try:
        print(f"validation Result: {validation_result}")
        parsed_result = json.loads(validation_result)
        is_valid = parsed_result['result'].upper() == 'YES'
        print(f"Image validation result: {is_valid}")
        print(f"Validation reason: {parsed_result['reason']}")
        return is_valid
    except json.JSONDecodeError:
        print(f"Error parsing validation result: {validation_result}")
        return False
def revise_prompt(original_prompt, claude_revise_params):
    input_prompt = f"""Revise the following image generation prompt to optimize it for Stable Diffusion, incorporating best practices:
    {original_prompt}
    Please consider the following guidelines in your revision:
    1. Be specific and descriptive, using vivid adjectives and clear nouns.
    2. Include details about composition, lighting, style, and mood.
    3. Mention specific artists or art styles if relevant.
    4. Use keywords like "highly detailed", "4k", "8k", or "photorealistic" if appropriate.
    5. Separate different concepts with commas.
    6. Place more important elements at the beginning of the prompt.
    7. Use weights (e.g., (keyword:1.2)) for emphasizing certain elements if necessary.
    8. If the original prompt is not in English, translate it to English.
    Your goal is to create a clear, detailed prompt that will result in a high-quality image generation with Stable Diffusion.
    Please provide your response in the following JSON format:
    {{"revised_prompt":""}}
    Ensure your response can be parsed as valid JSON. Do not include any explanations, comments, or additional text outside of the JSON structure."""
    revised_prompt_json = claude3_5_invoke_model(input_prompt, model_params=claude_revise_params)
    print(f"Original prompt: {original_prompt}")
    print(f"Revised prompt JSON: {revised_prompt_json.strip()}")
    
    try:
        parsed_result = json.loads(revised_prompt_json)
        revised_prompt = parsed_result['revised_prompt']
        print(f"Parsed revised prompt: {revised_prompt}")
        return revised_prompt
    except json.JSONDecodeError:
        print(f"Error parsing revised prompt result: {revised_prompt_json}")
        return original_prompt
def lambda_handler(event, context):
    try:
        initial_prompt = event['prompt']
        prompt = initial_prompt
        max_retry_attempts = max(0, event.get('max_retry_attempts', 5) - 1)
        max_prompt_revisions = max(0, event.get('max_prompt_revisions', 3) - 1)
        output_s3_bucket_name = event['output_s3_bucket_name']
        output_s3_key_prefix = event.get('output_s3_key_prefix', 'generated-images')
        print(f"Initial prompt: {initial_prompt}")
        print(f"Max retry attempts: {max_retry_attempts}")
        print(f"Max prompt revisions: {max_prompt_revisions}")
        # Model parameters
        claude_validate_params = {
            'temperature': event.get('claude_validate_temperature', 1.0),
            'top_p': event.get('claude_validate_top_p', 0.999),
            'top_k': event.get('claude_validate_top_k', 250),
            'max_tokens': event.get('claude_validate_max_tokens', 4096)
        }
        claude_revise_params = {
            'temperature': event.get('claude_revise_temperature', 1.0),
            'top_p': event.get('claude_revise_top_p', 0.999),
            'top_k': event.get('claude_revise_top_k', 250),
            'max_tokens': event.get('claude_revise_max_tokens', 4096)
        }
        sdxl_params = {
            'cfg_scale': event.get('sdxl_cfg_scale', 7),
            'steps': event.get('sdxl_steps', 50),
            "width": event.get('sdxl_width', 1024),
            "height": event.get('sdxl_height', 1024),
            "seed": event.get('sdxl_seed', 0)
        }
        print(f"Claude validate params: {claude_validate_params}")
        print(f"Claude revise params: {claude_revise_params}")
        print(f"SDXL params: {sdxl_params}")
        # Generate start timestamp and S3 key
        start_timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
        for revision in range(max_prompt_revisions + 1):
            print(f"Starting revision {revision}")
            for attempt in range(max_retry_attempts + 1):
                print(f"Attempt {attempt} for generating image")
                
                # Generate image with SDXL
                image_data = sdxl_invoke_model(prompt, sdxl_params)
                image_key = f"{output_s3_key_prefix}-{start_timestamp}-{revision:03d}-{attempt:03d}.png"
                # Save image to S3
                save_image_to_s3(image_data, output_s3_bucket_name, image_key)
                # Validate image with Claude
                is_valid = validate_image(image_data, initial_prompt, claude_validate_params)
                if is_valid:
                    print("Valid image generated successfully")
                    return {
                        'statusCode': 200,
                        'body': json.dumps({
                            'status': 'SUCCESS',
                            'message': 'Image generated successfully',
                            'output_s3_bucket_url': f'https://s3.console.aws.amazon.com/s3/buckets/{output_s3_bucket_name}',
                            'output_s3_object_url': f'https://s3.console.aws.amazon.com/s3/object/{output_s3_bucket_name}?region={region}&prefix={image_key}'
                        })
                    }
            # If max retry attempts reached and not the last revision, revise prompt
            if revision < max_prompt_revisions:
                print("Revising prompt")
                prompt = revise_prompt(initial_prompt, claude_revise_params)
        print("Failed to generate a valid image after all attempts and revisions")
        return {
            'statusCode': 400,
            'body': json.dumps({
                'status': 'FAIL',
                'error': 'Failed to generate a valid image after all attempts and revisions'
            })
        }
    except Exception as ex:
        print(f'Exception: {ex}')
        tb = sys.exc_info()[2]
        err_message = f'Exception: {str(ex.with_traceback(tb))}'
        print(err_message)
        return {
            'statusCode': 500,
            'body': json.dumps({
                'status': 'FAIL',
                'error': err_message
            })
        }

在这段源代码中,进行了以下巧妙的设计:

  • 实现了图像生成和验证的自动化循环,直到满足要求为止
  • 使用Claude 3.5 Sonnet对生成的图像进行验证并修正提示
  • 使用Stable Diffusion XL进行高质量的图像生成
  • 在提示修正指示中包含具体的图像生成最佳实践
  • 使图像生成参数(cfg_scale、steps、width、height、seed)可以自定义
  • 调整Claude 3.5 Sonnet的调用参数(temperature、top_p、top_k、max_tokens)
  • 自动将生成的图像保存到S3桶中,并返回结果的URL
  • 适当实现错误处理和日志输出,以便于故障排除
  • 使用JSON格式与Claude进行结构化对话,简化结果解析
  • 设置最大重试次数和最大提示修正次数,以防止无限循环

执行内容与结果

执行示例:输入参数

{
    "prompt": "从大自然中看到的夜景,天空中有极光、月亮和流星雨,地面上是广阔的海洋,漂浮着流冰,地平线上升起太阳的无人照片。",
    "max_retry_attempts": 5,
    "max_prompt_revisions": 5,
    "output_s3_bucket_name": "ho2k.com",
    "output_s3_key_prefix": "generated-images",
    "claude_validate_temperature": 1,
    "claude_validate_top_p": 0.999,
    "claude_validate_top_k": 250,
    "claude_validate_max_tokens": 4096,
    "claude_revise_temperature": 1,
    "claude_revise_top_p": 0.999,
    "claude_revise_top_k": 250,
    "claude_revise_max_tokens": 4096,
    "sdxl_cfg_scale": 30,
    "sdxl_steps": 150,
    "sdxl_width": 1024,
    "sdxl_height": 1024,
    "sdxl_seed": 0
}
本次执行示例的输入参数包含以下优化:
  • 将max_retry_attempts设置为5,以提高图像生成的成功率。
  • 将max_prompt_revisions设置为5,增加了必要时改进提示词的机会。
  • 细致设置了用于图像验证和修正的Claude模型参数(temperature, top_p, top_k, max_tokens)。
  • 将sdxl_cfg_scale设置为30,提高了对提示词的忠实度。
  • 将sdxl_steps设置为150,提高了图像生成的质量。
  • 使用随机seed进行图像生成,每次生成不同的图像。

执行示例:结果

生成的图像

在此次试验中,最终生成并通过验证的图像如下:

该图像基本满足提示词要求:“从大自然中看到的夜景,天空中有极光、月亮和流星雨,地面上是广阔的海洋,漂浮着流冰,地平线上升起太阳的无人照片。”尽管流星群和流冰的表现稍弱,但月亮和地平线上的太阳这一矛盾的场景得到了很好地呈现。

此外,通过与之前生成的图像(参见下文的“生成的图像列表”)对比可以确认,最终通过验证的图像比之前生成的其他图像更能满足指示的要求。

满足提示要求并通过验证的图像

以下是本次试验生成的图像列表。这些图像的每一行都是由不同的修正提示生成的。

在最初输入的日文提示生成的图像中,生成的图像与要求相差较大。而从第一次提示修正之后,生成的图像逐渐接近要求。

修正后的提示变化

以上“生成的图像列表”中的每一行图像都是由不同的修正提示生成的。具体而言,“生成的图像列表”中的第一行图像是由以下“修正0次”的提示生成的,而“生成的图像列表”中的最后一行图像是由以下“修正3次”的提示生成的。

让我们来看一下每次修正后的图像生成提示内容。

第0次修正
从大自然中看到的夜景,天空中有极光、月亮和流星雨,地面上是广阔的海洋,漂浮着流冰,地平线上升起太阳的无人照片。
 第1次修正
Breathtaking night landscape, vibrant aurora borealis (aurora:1.2) dancing across the starry sky, crescent moon illuminating the scene, meteor shower streaking through the atmosphere, vast arctic ocean with floating ice floes, midnight sun peeking over the horizon, ethereal glow, long exposure photography, ultra high resolution 8k, photorealistic, highly detailed, dramatic lighting, panoramic composition, inspired by Aurora Borealis paintings of Frederic Edwin Church
第2次修正
Breathtaking Arctic night landscape, vibrant green aurora borealis dancing across the starry sky, full moon illuminating the scene, meteor shower streaking through the atmosphere, vast icy ocean with floating ice floes, midnight sun peeking over the horizon, ultra-high resolution 8K, photorealistic, highly detailed, dramatic lighting, panoramic composition, inspired by Albert Bierstadt and Frederic Edwin Church, (aurora borealis:1.3), (meteor shower:1.2), serene and majestic atmosphere
 第3次修正
Breathtaking nightscape from nature's perspective, vibrant aurora borealis (aurora:1.2) dancing across the starry sky, crescent moon illuminating the scene, meteor shower streaking through the atmosphere, vast ocean with floating ice floes, sun peeking over the horizon creating a golden glow, no human presence, photorealistic, highly detailed, 8k resolution, dramatic lighting, wide-angle composition, inspired by Thomas Kinkade and Aurora HDR style, serene and awe-inspiring mood

特别是与上述“生成的图像列表”对比来看,最初输入的日文提示词并未针对图像生成进行优化,因此输出的图像与要求相差较大。而从修正第一次开始,通过Claude 3.5 Sonnet模型进行优化后的提示词生成的图像更接近要求。

通过每次提示词的修正和图像生成的执行,最终生成的图像满足了提示词的要求并通过了验证。

参考资料:

  • AWS Documentation (Amazon Bedrock)
  • 相关文章的技术博客

总结

这次我们介绍了使用Anthropic Claude 3.5 Sonnet的图像识别功能,通过Amazon Bedrock对Stability AI的Stable Diffusion XL (SDXL)生成的图像进行验证,并在满足要求前不断重新生成的实际应用。

本次试验的结果表明,Claude 3.5 Sonnet不仅具备OCR功能,还能够识别图像中的内容及其表达的含义,从而用于验证图像是否满足要求。此外,我们还确认了Claude 3.5 Sonnet能够优化和修正提示词内容。

最重要的是,通过这些功能可以自动判定生成图像是否满足要求,从而大幅减少人工目视检查的工作量。这些图像识别功能和高级文本编辑功能不仅可以用于控制其他图像生成AI模型,还可以应用于以前难以自动化的处理任务。

未来,我们将继续关注包括Anthropic Claude模型在内的Amazon Bedrock支持的AI模型的更新、实现方法及其与其他服务的组合应用。

同时亚马逊云科技也准备了大量活动,方家学习AI相关内容,欢迎大家参与学习。

 前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

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

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

相关文章

边界网关IPSEC VPN实验

拓扑&#xff1a; 实验要求&#xff1a;通过IPSEC VPN能够使PC2通过网络访问PC3 将整个路线分为三段 IPSEC配置在FW1和FW2上&#xff0c;在FW1与FW2之间建立隧道&#xff0c;能够传递IKE&#xff08;UDP500&#xff09;和ESP数据包&#xff0c;然后在FW1与PC2之间能够流通数据…

C# Nmodbus,EasyModbusTCP读写操作

Nmodbus读写 两个Button控件分别为 读取和写入 分别使用控件的点击方法 ①引用第三方《NModbus4》2.1.0版本 全局 public SerialPort port new SerialPort("COM2", 9600, Parity.None, 8, (StopBits)1); ModbusSerialMaster master; public Form1() port.Open();…

河道高效治理新策略:视频AI智能监控如何助力河污防治

一、背景与现状 随着城市化进程的加快&#xff0c;河道污染问题日益严重&#xff0c;对生态环境和居民生活造成了严重影响。为了有效治理河道污染&#xff0c;提高河道管理的智能化水平&#xff0c;TSINGSEE青犀提出了一套河污治理视频智能分析及管理方案。方案依托先进的视频…

LeetCode三道模式匹配算法题(同构字符串 一串三~)

模式匹配 好像回到小学语文课堂~ &#x1f923; 老师&#xff1a;ABB式 大家能想出哪些呀~&#x1f60a; 我&#xff1a;绿油油~&#x1f601; 金灿灿~&#x1f601; 哈哈哈哈哈 好啦&#xff0c;来看算法题~ LeetCode 205 同构字符串 哈哈哈哈 怎么判断 绿油油 和 金灿灿 是…

从0到1:理发店预约剪发小程序开发笔记(上)

背景 理发师可以在小程序上设置自己的可预约时间&#xff0c;价格&#xff0c;自我介绍&#xff0c;顾客可以根据理发师的日程安排选择合适的时间进行预约和支付。这样可以提高预约的效率&#xff0c;减少沟通成本&#xff0c;方便双方的安排。 功能规划 首页展示&#xff1…

UART编程框架详解

1. UART介绍 UART&#xff1a;通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;简称串口。 调试&#xff1a;移植u-boot、内核时&#xff0c;主要使用串口查看打印信息 外接各种模块 1.1 硬件知识_UART硬件介绍 UART的全称是Unive…

OrangePi Zero2 全志H616 开发初探

目录&#xff1a; 一、刷机和系统启动1、TF 卡格式化&#xff1a;2、镜像烧录&#xff1a;3、登录系统&#xff1a; 二、基于官方外设开发1、wiringPi 外设 SDK 安装&#xff1a;2、C 文件编译&#xff1a;3、基于官方外设的应用开发&#xff1a;① GPIO 输入输出&#xff1a;②…

ROS2入门到精通—— 2-11 ROS2实战:实现基于voronoi_planner的全局规划(一)!!!保姆级教程

实现基于voronoi_planner的全局规划将分为两篇博文进行讲解 本文参考该大佬代码: https://github.com/nkuwenjian/voronoi_planner.githttps://github.com/nkuwenjian/voronoi_layer.git将上面的ROS1代码移植到ROS2,移植不易,中间遇到很多坑 0 前言 针对一些狭窄区域,可能…

PostgreSQL的pg-collector工具

PostgreSQL的pg-collector工具 pg-collector 是一个用于 PostgreSQL 数据库的监控和数据收集工具。它主要用于收集 PostgreSQL 实例的性能指标、查询统计和日志信息&#xff0c;以便进行数据库性能分析和故障排查。通过收集这些数据&#xff0c;管理员可以更好地了解数据库的运…

『 Linux 』用户态与内核态的转换机制及信号检测时机

文章目录 用户态与内核态进程地址空间操作系统的本质 信号的处理时机 用户态与内核态 进程在执行代码的过程中代码必定涉及用户代码,库函数代码及操作系统内核代码; 以简单的printf()函数为例,该函数必定为先执行用户的代码即知道需要调用printf()函数,再执行库(如libc)中的代码…

InsCode GPU服务器快速使用

文章目录 1. 背景介绍2. 环境配置 1. 背景介绍 InsCode服务器地址&#xff1a;https://inscode.csdn.net/workbench?tabcomputed。 2. 环境配置 新建环境后&#xff0c;按照如下步骤快速配置&#xff0c;以便后续执行深度学习模型训练。 数据 openlane 环境依赖 Copy Mini…

切换数据失败0x1671分析

1、问题背景 切换双卡数据开关&#xff0c;无法切换成功&#xff0c;且单机必现该问题 2、问题分析 搜索Log发现相关拨号无法建立成功&#xff0c;返回0x1671&#xff0c;无法建立PDN连接。 相关拨号上层未下发相关AT命令&#xff0c;属于上层报错&#xff0c;并非网络问题&…

《系统架构设计师教程(第2版)》第12章-信息系统架构设计理论与实践-05-信息系统架构案例分析

文章目录 1. 价值驱动的体系结构——连接产品策略与体系结构1.1 价值模型1&#xff09;概述2&#xff09;价值驱动因素3&#xff09;传统方法识别价值模型的缺陷&#xff08;了解即可&#xff09; 1.2 体系结构策略&#xff08;挑战&#xff09;1&#xff09; 优先级的确定2&am…

厚积薄发,详解 IoTeX 2.0 如何推动 DePIN 赛道迈向新台阶

背 景 DePIN 是加密货币行业的一个新兴垂直领域&#xff0c;也是本轮牛市最重要的叙事之一。DePIN 通常通过发行和分配代币来激励参与者&#xff0c;用户可以通过提供资源、维护网络、参与治理等方式获得代币奖励并产生直接的经济收益&#xff0c;从而重新洗牌财富分配方…

友思特应用 | 硅片上的光影贴合:UV-LED曝光系统在晶圆边缘曝光中的高效应用

导读 晶圆边缘曝光是帮助减少晶圆涂布过程中多余的光刻胶对电子器件影响的重要步骤。友思特 ALE/1 和 ALE/3 UV-LED 高性能点光源&#xff0c;作为唯一可用于宽带晶圆边缘曝光的 i、h 和 g 线的 LED 解决方案&#xff0c;可高效实现WEE系统设计和曝光需求。 晶圆边缘曝光及处…

GRE VPN和MGRE VPN综合练习

GRE VPN和MGRE VPN综合练习 实验拓扑 实验要求 1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方; R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方; R3与R5之间使用HDLC封装;…

【leetcode】两数相加【中等】(C++递归解法)

总体来说&#xff0c;链表类问题往往是蛮适合用递归的方式求解的 要写出有效的递归&#xff0c;关键是要考虑清楚&#xff1a; 0. return的条件 1. 每步递归的操作&#xff0c;以及何时调用下一步递归 2. 鲁棒性&#xff08;头&#xff0c;尾结点等特殊情况是否依旧成立&am…

Hadoop学习笔记1

hadoop节点规划 服务器集群规划&#xff0c;6台服务器&#xff1a; 一个主节点 两个从节点 三个工作节点 集群服务器用的都是centos7.9.2009的镜像 一、基础环境 1.1配置阿里云yum源 1.下载repo文件 wget http://mirrors.aliyun.com/repo/Centos-7.repo 2.备份并替换系…

Tensorflow深度学习总结

1.正态分布和高斯分布 正态分布&#xff08;Normal Distribution&#xff09;和高斯分布&#xff08;Gaussian Distribution&#xff09;实际上指的是同一个概率分布&#xff0c;在统计学和概率论中是最常见和最重要的连续概率分布之一。这两个术语可以互换使用&#xff0c;但…

【Linux】网络通信基础:应用层协议、HTTP、序列化与会话管理

文章目录 前言1. 应用层自定义协议与序列化1.1 什么是应用层&#xff1f;1.2 再谈 "协议"1.3 序列化 和 反序列化 2. HTTP 协议3. 认识 URL(统一资源定位符)4. urlencode和urldecode5. HTTP 协议请求与响应格式5.1 HTTP 请求5.2 HTTP 响应 6. HTTP 的方法6.1 GET 方法…