目标识别项目:基于Yolov7-LPRNet的动态车牌目标识别算法模型(一)

前言

目标识别如今以及迭代了这么多年,普遍受大家认可和欢迎的目标识别框架就是YOLO了。按照官方描述,YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。从基本的YOLOv1版本到如今v8版本,完成了多次蜕变,现在已经相当成熟并且十分的亲民。我见过很多初学目标识别的同学基本上只花一周时间就可以参照案例实现一个目标检测的项目,这全靠YOLO强大的解耦性和部署简易性。初学者甚至只需要修改部分超参数接口,调整数据集就可以实现目标检测了。但是我想表达的并不是YOLO的原理有多么难理解,原理有多难推理。一般工作中要求我们能够运行并且能够完成目标检测出来就可以了,更重要的是数据集的标注。我们不需要完成几乎难以单人完成的造目标检测算法轮子的过程,我们需要理解YOLO算法中每个超参数的作用以及影响。就算我们能够训练出一定准确度的目标检测模型,我们还需要根据实际情况对生成结果进行一定的改写:例如对于图片来说一共出现了几种目标;对于一个视频来说,定位到具体时间出现了识别的目标。这都是需要我们反复学习再练习的本领。

完成目标检测后,我们应该输出定位出来的信息,YOLO是提供输出设定的超参数的,我们需要根据输出的信息对目标进行裁剪得到我们想要的目标之后再做上层处理。如果是车牌目标识别的项目,我们裁剪出来的车牌就可以进行OCR技术识别出车牌字符了,如果是安全帽识别项目,那么我们可以统计一张图片或者一帧中出现检测目标的个数做出判断,一切都需要根据实际业务需求为主。本篇文章主要是OCR模型对车牌进行字符识别,结合YOLO算法直接定位目标进行裁剪,裁剪后生成OCR训练数据集即可。

每篇文章我都会尽可能将简化涉及到垂直领域的专业知识,转化为大众小白可以读懂易于理解的知识,将繁杂的程序创建步骤逐个拆解,以逐步递进的方式由难转易逐渐掌握并实践,欢迎各位学习者关注博主,博主将不断创作技术实用前沿文章。其中数据集的质量是尤为重要的,决定了模型的上限,因此想要搭建一个效果较好的目标识别算法模型,就需要处理流程较为完善的开源数据集。本篇文章采用的是CCPD数据集,那么不再过多描述,让我们直接开始项目搭建。

数据集收集

CCPD:github.com/Fanstuck/CC…

一般来说目前常用来训练车牌目标识别项目的数据集都采用了CCPD数据集,CCPD是一个大型的、多样化的、经过仔细标注的中国城市车牌开源数据集。CCPD数据集主要分为CCPD2019数据集和CCPD2020(CCPD-Green)数据集。CCPD2019数据集车牌类型仅有普通车牌(蓝色车牌),CCPD2020数据集车牌类型仅有新能源车牌(绿色车牌)。

CCPD2019数据集

CCPD2019数据集主要采集于合肥市停车场,采集时间为上午7:30到晚上10:00,停车场采集人员手持Android POS机对停车场的车辆拍照进行数据采集。所拍摄的车牌照片涉及多种复杂环境,包括模糊、倾斜、雨天、雪天等。CCPD2019数据集包含了25万多幅中国城市车牌图像和车牌检测与识别信息的标注。主要介绍如下:

图片.png

类别描述图片数
CCPD-Base通用车牌图片200k
CCPD-FN车牌离摄像头拍摄位置相对较近或较远20k
CCPD-DB车牌区域亮度较亮、较暗或者不均匀20k
CCPD-Rotate车牌水平倾斜20到50度,竖直倾斜-10到10度10k
CCPD-Tilt车牌水平倾斜15到45度,竖直倾斜15到45度10k
CCPD-Weather车牌在雨雪雾天气拍摄得到10k
CCPD-Challenge在车牌检测识别任务中较有挑战性的图片10k
CCPD-Blur由于摄像机镜头抖动导致的模糊车牌图片5k
CCPD-NP没有安装车牌的新车图片5k

CCPD2019/CCPD-Base中的图像被拆分为train/val数据集。使用CCPD2019中的子数据集(CCPD-DB、CCPD-Blur、CCPD-FN、CCPD-Rotate、CCPD-Tilt、CCPD-Challenge)进行测试。

图片.png

CCPD2020数据集

CCPD2020数据集采集方法应该和CCPD2019数据集类似。CCPD2020仅仅有新能源车牌图片,包含不同亮度,不同倾斜角度,不同天气环境下的车牌。CCPD2020中的图像被拆分为train/val/test数据集,train/val/test数据集中图片数分别为5769/1001/5006。

图片.png

车牌号码说明

车牌第一位是汉字:代表该车户口所在的省级行政区,为各(省、直辖市、自治区)的简称,比如:北京是京,上海是沪,湖南就是湘…

车牌第二位是英文字母:代表该车户口所在的地级行政区,一般为各地级市、地区、自治州字母代码,一般按省级车管所以各地级行政区状况分划排名:(字母“A”为省会、首府或直辖市中心城区的代码,其字母排名不分先后)

另在编排地级行政区英文字母代码时,跳过I和O,O往往被用作警车或者机关单位。

  • 省份:[“皖”, “沪”, “津”, “渝”, “冀”, “晋”, “蒙”, “辽”, “吉”, “黑”, “苏”, “浙”, “京”, “闽”, “赣”, “鲁”, “豫”, “鄂”, “湘”, “粤”, “桂”, “琼”, “川”, “贵”, “云”, “藏”, “陕”, “甘”, “青”, “宁”, “新”]
  • 地市:[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’,‘X’, ‘Y’, ‘Z’]
  • 车牌字典:[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’,‘Y’, ‘Z’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’] 绿牌和蓝牌区别如下:
  • 颜色区别:小型新能源车牌采用“渐变绿”的配色,大型新能源车牌采用“黄绿双拼色”,绿牌的字体颜色为黑色;而传统燃油车蓝牌则采用“纯蓝色”设计,字体颜色为白色;
  • 号码编排:普通蓝牌共有7位字符;新能源车牌有8位字符;新能源绿牌的号码共有6位数,其中小型新能源汽车牌照的字母设计在第一位,大型新能源汽车牌照的字母设计在最后一位。其中车牌首字母为“D/A/B/C/E”的,代表“纯电动车”;首字母为“F/G/H/J/K”的,代表“非纯电动汽车”。而普通燃油车蓝牌的号码只有5位数,首字母或数字一般不代表任何含义,只有部分地区会给营运类车型划分特定字母。

图片.png

目标识别模型具体搭建框架

图片.png

数据预处理

CCPD数据集没有专门的标注文件,每张图像的文件名就是该图像对应的数据标注。【025-95_113-154&383_386&473-386&473_177&454_154&383_363&402-0_0_22_27_27_33_16-37-15.jpg】,其文件名的含义如下:

  • 025:车牌区域占整个画面的比例;
  • 95_113: 车牌水平和垂直角度, 水平95°, 竖直113°
  • 154&383_386&473:标注框左上、右下坐标,左上(154, 383), 右下(386, 473)
  • 386&473_177&454_154&383_363&402:标注框四个角点坐标,顺序为右下、左下、左上、右上
  • 0_0_22_27_27_33_16:车牌号码映射关系如下: 第一个0为省份 对应省份字典provinces中的’皖’,;第二个0是该车所在地的地市一级代码,对应地市一级代码字典alphabets的’A’;后5位为字母和文字, 查看车牌号ads字典,如22为Y,27为3,33为9,16为S,最终车牌号码为皖AY339S

因此我们需要根据图片文件的目录名称来拆分信息:

python
复制代码
def getinfo_annotations(image_file):
    '''
    细节看文档
    :param image_file:
    :return:
    '''
    try:
        annotations = image_file.split('-')
        rate = annotations[0]# 车牌区域占整个画面的比例;
        angles = annotations[1].split('-')# 车牌水平和垂直角度, 水平95°, 竖直113°
        box = annotations[2].split('_')# 标注框左上、右下坐标,左上(154, 383), 右下(386, 473)
        boxes = [list(map(int, i.split('&'))) for i in box]
        point = annotations[3].split('_')  # 标注框四个角点坐标,顺序为右下、左下、左上、右上
        points  = [list(map(int, i.split('&'))) for i in point]
        plate = annotations[4].split("_")  # licenses 标注框四个角点坐标,顺序为右下、左下、左上、右上
        plates = plate_analysis_licenses(plate)
    except Exception as e:
        boxes = []
        points = []
        plates = []
        angles = []
    info = {"filename": image_file, "boxes": boxes, "points": points,
            "plates": plates, "angles": angles}
    return info

此外我们还需要编写出解析代表识别车牌字符的数字编码:

python
复制代码
def plate_analysis_licenses(plate):
    '''
    细节看文档
    :param plate:
    :return:车牌info
    '''
    provinces = ["皖", "沪", "津", "渝",
                 "冀", "晋", "蒙", "辽",
                 "吉", "黑", "苏", "浙",
                 "京", "闽", "赣", "鲁",
                 "豫", "鄂", "湘", "粤",
                 "桂", "琼", "川", "贵",
                 "云", "藏", "陕", "甘",
                 "青", "宁", "新", "警", "学", "O"]
    alphabets=['A', 'B', 'C', 'D', 'E',
               'F', 'G', 'H', 'J', 'K',
               'L', 'M', 'N', 'P', 'Q',
               'R', 'S', 'T', 'U', 'V',
               'W', 'X', 'Y', 'Z', 'O']
    ads = ['A', 'B', 'C', 'D', 'E',
           'F', 'G', 'H', 'J', 'K',
           'L', 'M', 'N', 'P', 'Q',
           'R', 'S', 'T', 'U', 'V',
           'W', 'X','Y', 'Z', '0',
           '1', '2', '3', '4', '5',
           '6', '7', '8', '9', 'O']
    result = [provinces[int(plate[0])], alphabets[int(plate[1])]]
    result += [ads[int(p)] for p in plate[2:]]
    result = "".join(result)
    #print(plate,result)
    return result

这样以来我们可以获取所有文件名称解析出的内容,包括检测框的坐标以及车牌的信息,具体解析情况可以绘制展示代码:

python
复制代码
def draw_box(image, box):
    """

    :param image:
    :param box:
    :return: 边界框
    """
    draw = ImageDraw.Draw(image)
    draw.rectangle([tuple(box[0]), tuple(box[1])],  outline="#00FF00", width=3)

def draw_point(image,point):
    '''
    绘制四个关键点
    :param image:
    :param point:
    :return:
    '''
    draw = ImageDraw.Draw(image)
    for p in point:
        center = (p[0],p[1])
        radius = 5
        right = (center[0]+radius,center[1]+radius)
        left = (center[0] - radius, center[1] - radius)
        draw.ellipse((left, right), fill="#FF0000")

def draw_label(image,label):
    '''
    绘制车牌
    :param image:
    :param label:
    :return:
    '''
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype('simsun.ttc',64)
    draw.text((30,30),label,font=font,fill="#FF0000")

def image_show(imagepath,box,points,label):
    '''
    图片展示
    :param imagepath:
    :param box:
    :param points:
    :param label:
    :return:
    '''
    image=Image.open(imagepath)
    draw_label(image,label)
    draw_point(image,points)
    draw_box(image,box)
    image.show()

效果如下:

图片.png

那么能够获取图片的关键信息之后,我们就可以开始建立我们模型的训练数据集和测试数据集了。首先我们需要明确,该项目我们需要完成对车牌的检测,也就是能够在图片或者视频帧中定位到车牌的坐标。定位之后还要能够识别出车牌上面的字符信息。拆解这两部分我们需要建立两种模型,一种是目标检测的算法模型,例如YOLO、R-CNN、SSD等,另一种是OCR文字识别模型,例如CRNN、PlateNet、LPRNet等。那么第一步我们需要搭建能够定位车牌信息的目标检测模型。

数据集准备

我们现在需要将CCPD数据集转换YOLO格式标注数据集,YOLO文本标注数据集样例如:

图片.png txt每个数值分别代表:检测框中心点坐标x,检查框中心点坐标y,检查框宽w,检测框高h。

通过解析每个图片得到的信息很容易完成:

python
复制代码
def create_txt_file(file_path,image_name,image_width, image_height, bbox_coords_list, class_index):
    yolo_lines = []
    bbox_coords_lists=[]
    bbox_coords_lists.append(bbox_coords_list)
    for bbox_coords in bbox_coords_lists:
        print(bbox_coords)
        x_center = (bbox_coords[0][0] + bbox_coords[1][0]) / (2 * image_width)
        y_center = (bbox_coords[0][1] + bbox_coords[1][1]) / (2 * image_height)
        width = (bbox_coords[1][0] - bbox_coords[0][0]) / image_width
        height = (bbox_coords[1][1] - bbox_coords[0][1]) / image_height
        yolo_lines.append(f"{class_index} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}")
    save_path = os.path.join(file_path, "label", f"{image_name}.txt")
    for i, line in enumerate(yolo_lines):
        txt_filename = f"{image_name}.txt"
        txt_path = save_path
        with open(txt_path, "w") as txt_file:
            txt_file.write(line)

上述代码将生成对应的YOLO目标标注文本文件,一些具体功能参数不清楚的可以去看本人github开源代码,有详细说明。

随后就是划分训练和测试数据集了,CCPD有9类性质不同的车牌图片,这里统一使用CCPD-Base数据集,主要是方便处理和展示,如果大家想要追求更好的效果可以依次提取其他数据集的图片,我们的目的是构建轻量级数据不用那么多数据量增加本地计算机负担,故从原本数据集抽取3W张图片进行训练,仅抽取CCPD-base数据集的图片。

python
复制代码
# -*- coding:utf-8 -*-
# @Author: fanstuck
# @Time: 2023/8/24 17:02
# @File: Sampling_of_CCPD_files.py

import os
import random
import shutil

def Random_sampling_of_documents(source_directory,target_directory,num):
    '''
    目录文件下随机抽样
    :param :source_directory
    :param :target_directory
    :return:
    '''
    # 选择抽取的图片数量
    num_images_to_extract = num

    # 获取目录中所有图片文件
    all_image_files = [file for file in os.listdir(source_directory) if file.lower().endswith(('.png', '.jpg', '.jpeg'))]

    # 随机抽取指定数量的图片文件
    selected_image_files = random.sample(all_image_files, num_images_to_extract)

    # 将选中的图片文件复制到目标目录
    for image_file in selected_image_files:
        source_path = os.path.join(source_directory, image_file)
        target_path = os.path.join(target_directory, image_file)
        shutil.copy(source_path, target_path)

准备工作还差一步,我们需要切割数据集分为训练数据集,测试数据集和真值数据集。这里划分已经随机抽样的3W车牌数据进,进行训练:测试:真值=7:2:1的划分:

python
复制代码
def split_dataset(source_dir,train_dir,test_dir,val_dir,train_ratio,test_ratio,val_ratio):

    # 获取目录中的所有图片文件名
    image_files = [f for f in os.listdir(source_dir) if f.endswith(".jpg") or f.endswith(".txt")]
    # 计算划分数量
    total_count = len(image_files)
    train_count = int(total_count * train_ratio)
    test_count = int(total_count * test_ratio)
    val_count = total_count - train_count - test_count

    # 划分图片并移动到对应目录
    for i, image_file in enumerate(image_files):
        if i < train_count:
            dest_dir = train_dir
        elif i < train_count + test_count:
            dest_dir = test_dir
        else:
            dest_dir = val_dir

        source_path = os.path.join(source_dir, image_file)
        dest_path = os.path.join(dest_dir, image_file)

        shutil.copy(source_path, dest_path)

这样一来我们就处理好了整个YOLO模型目标检测数据集,可以开始进行模型训练了。本项目文章量和代码量偏多,文章将分好几部分依次记录完,有想要入门目标检测技术的朋友十分推荐关注博主和我一起完成整个项目的搭建,整个项目将在Github上面开源且完全可部署。

最后

为了帮助大家更好的学习人工智能,这里给大家准备了一份人工智能入门/进阶学习资料,里面的内容都是适合学习的笔记和资料,不懂编程也能听懂、看懂,所有资料朋友们如果有需要全套人工智能入门+进阶学习资源包,可以在评论区或扫.码领取哦)~

在线教程

  • 麻省理工学院人工智能视频教程 – 麻省理工人工智能课程
  • 人工智能入门 – 人工智能基础学习。Peter Norvig举办的课程
  • EdX 人工智能 – 此课程讲授人工智能计算机系统设计的基本概念和技术。
  • 人工智能中的计划 – 计划是人工智能系统的基础部分之一。在这个课程中,你将会学习到让机器人执行一系列动作所需要的基本算法。
  • 机器人人工智能 – 这个课程将会教授你实现人工智能的基本方法,包括:概率推算,计划和搜索,本地化,跟踪和控制,全部都是围绕有关机器人设计。
  • 机器学习 – 有指导和无指导情况下的基本机器学习算法
  • 机器学习中的神经网络 – 智能神经网络上的算法和实践经验
  • 斯坦福统计学习

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

请添加图片描述

人工智能书籍

  • OpenCV(中文版).(布拉德斯基等)
  • OpenCV+3计算机视觉++Python语言实现+第二版
  • OpenCV3编程入门 毛星云编著
  • 数字图像处理_第三版
  • 人工智能:一种现代的方法
  • 深度学习面试宝典
  • 深度学习之PyTorch物体检测实战
  • 吴恩达DeepLearning.ai中文版笔记
  • 计算机视觉中的多视图几何
  • PyTorch-官方推荐教程-英文版
  • 《神经网络与深度学习》(邱锡鹏-20191121)

  • 在这里插入图片描述
    😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

第一阶段:零基础入门(3-6个月)

新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。

第二阶段:基础进阶(3-6个月)

熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。

第三阶段:工作应用

这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。

在这里插入图片描述
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

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

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

相关文章

【springboot】乡镇卫生院、二甲医院云HIS运维平台源码

目录 云HIS运营管理 ​编辑电子病历主模块&#xff1a;包括门诊电子病历、住院电子病历等子模块 &#xff08;1&#xff09;门诊电子病历功能简介 &#xff08;2&#xff09;住院电子病历功能简介 ▶患者列表主模块&#xff1a;包括患者信息子模块 &#xff08;1&#xf…

【应用多元统计分析】--多元数据的直观表示(R语言作图)

例1.2 为了研究全国31个省、市、自治区2018年城镇居民生活消费的分布规律&#xff0c;根据调查资料做区域消费类型划分。 指标&#xff1a; 食品x1&#xff1a;人均食品支出(元/人) 衣着x2&#xff1a;人均衣着商品支出(元/人) 居住x3&#xff1a;人均居住支出(元/人) 生活x4…

基于ARIMA+SARIMA的航空公司 RPM 时间序列预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

快速幂模板

#include<bits/stdc.h> using namespace std;typedef long long ll;ll n; ll Mi[40];ll quick_M(ll a, ll b, ll p) {// 初始化答案为1ll res 1;// 将b用二进制表示while(b){// 如果二进制位为1&#xff0c;则相乘&#xff08;如上图右半边&#xff09;if(b & 1) re…

STM32(6)中断

1.中断 1.1 中断的概念 STM32的中断&#xff1a; 1.2 中断优先级 用数字的大小表示中断优先级的高低&#xff0c;数字的范围&#xff1a;0000--1111&#xff08;二进制&#xff09;&#xff0c;即0-15&#xff0c;共16级优先级。 进一步对这4位二进制数进行划分&#xff0c;可…

芯片ERP:应用广泛的领域及其影响

在现代科技快速发展的时代&#xff0c;芯片ERP(企业资源规划)已成为许多行业不可或缺的工具。这种集成了先进技术和先进管理理念的系统&#xff0c;极大地提高了企业的运营效率和竞争力。那么&#xff0c;芯片ERP主要应用在哪些领域呢?本文将为您一一揭晓。 一、电子制造行业 …

STM32(11)按键产生中断

1.初始化IO引脚&#xff0c;设置模式&#xff0c;速度等 2.设置AFIO&#xff08;配置EXTI的引脚映射&#xff09;&#xff0c;记得开启时钟 3.配置EXTI的通道&#xff08;EXTI0和EXTI1&#xff09; 4.配置NVIC 4.1 中断优先级分组 4.2 配置中断 5.编写中断响应函数 在中断向量…

《一》在Vue中搭建Three.js环境(超详细、保姆级),创建场景、相机、渲染器

目录 Three.js简介创建vue项目引入Three.js实际操作环节文件目录创建初始化场景、相机 Three.js简介 Three.js 是一款基于 WebGL的 JavaScript 3D 库&#xff0c;它封装了 WebGL API&#xff0c;为开发者提供了简单易用的 API 来在 Web 浏览器中展示 3D 图形。Three.js 提供了…

uniapp问卷调查(单选)

前言 该代码片段只支持问卷调查的单选功能 使用组件库 配置 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 (uviewui.com) 代码 <template> <view> <view v-for"(item, index) in radiolist1" :key"index"> …

6 款顶级的 iPhone 数据恢复软件解决方案值得您花时间!

尽管iOS为您的数据提供了很多安全网&#xff08;例如iCloud&#xff09;&#xff0c;但由于事故、病毒等原因&#xff0c;仍然可能会发生“不可逆转”的数据丢失。在这种情况下&#xff0c;最好的DIY解决方案是使用iPhone数据恢复软件&#xff0c;这是一种利用先进算法直接从设…

中国电子学会2020年12月份青少年软件编程Sc ratch图形化等级考试试卷四级真题

【 单选题 】 1.陶朱家开了一间小卖部&#xff0c;学了编程的他想编写一个程序帮助分析小卖部各种商品的售卖情况。如下图所示&#xff0c;目前各个商品的名称和销售量分别存在了两张列表里&#xff0c;一一对应&#xff0c;并且每一样商品的销售量都不同。陶朱要先找出销售量…

selenuim【1】($x(‘xpath语法’)、WebDriverWait())

文章目录 初学selenuim记录1、执行driver webdriver.Chrome()后很久才打开浏览器2、浏览器多元素定位 $x(‘xpath语法’)3、打开浏览器driver.get("网址")执行了很久才开始定位元素&#xff1a;等待&#xff08;1&#xff09;driver.set_page_load_timeout(t)&#…

在Python中使用多线程(通俗版本)

一、多线程的介绍&#xff1a; 1.进程 通常一个进程包含一个或者多个线程&#xff0c;每个进程有自己独立的一块内存空间&#xff0c;所有的线程共享这一块空间&#xff0c;例如&#xff1a;在Windows操作系统中&#xff0c;一个运行的xx.exe就是一个进程。 2.线程 一个进程…

低代码流程引擎实战:让表单字段成为流程节点审批人的得力助手!

在现代企业的日常运营中&#xff0c;流程审批是保障工作高效、规范进行的关键环节。随着企业对于灵活性和高效性的需求不断增长&#xff0c;传统的固定审批人设置已无法满足多变的业务场景。在JVS低代码中“设置流程节点审批人为表单字段”这一功能&#xff0c;旨在通过动态配置…

leetcode第 387 场周赛总结

很久没打周赛了&#xff0c;这周开始恢复 这次周赛&#xff0c;题目比较简单&#xff0c;第三道题有点浪费了时间&#xff0c;思路是对的&#xff0c;但是被我把问题复杂化了。 给你一个下标从 1 开始、包含 不同 整数的数组 nums &#xff0c;数组长度为 n 。 你需要通过 n 次…

大模型总结

抛开大模型基座训练&#xff0c;我们还可以关注什么&#xff1f; - 知乎 大模型LLM领域&#xff0c;有哪些可以作为学术研究方向&#xff1f; 方向一&#xff1a;大模型的基础理论问题 大力出奇迹&#xff0c;涌现&#xff0c;目前还需要科学家继续研究理论基础 也就是先有…

曲线生成 | 图解Dubins曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是Dubins曲线&#xff1f;2 Dubins曲线原理2.1 坐标变换2.2 单步运动公式2.3 曲线模式 3 Dubins曲线生成算法4 仿真实现4.1 ROS C实现4.2 Python实现4.3 Matlab实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、…

Windows10 安装Neo4j流程

1、下载并安装ava运行环境 官网链接&#xff08;需要注册Oracle账号&#xff09;&#xff1a;https://www.oracle.com/java/technologies/downloads/ 根据自己Neo4j版本确认需要的JDK版本 百度网盘链接&#xff1a; 链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/…

怎么倒放视频?3个倒放方法分享给你

怎么倒放视频&#xff1f;倒放视频不仅有趣且充满创意&#xff0c;而且还能创造出一种令人惊叹的视觉效果&#xff0c;将观众带入一个全新的时空维度。通过将动作和事件倒放&#xff0c;我们可以观察到平时难以察觉的细节&#xff0c;理解事物运行的逆向逻辑。这种独特的编辑手…

Pycharm无法粘贴外部文本问题

Pycharm无法粘贴外部文本问题 百度找了好多是因为安装了vim&#xff0c;最后发现是因为pycharm粘贴框存在了很多内容导致 操作方法&#xff1a; 1、清理所有缓存的复制内容 ctrlshiftV 可以看到编译器所有缓存下来的复制文本 2、ctrlA然后delete 解决&#xff1a;此时再复…