深度学习车道线检测之 LaneNet (使用tensorflow2.4.0跑通)

2023-10-28

本文用来整理回顾所学知识,也能使视觉领域初学者的同伴们少走些弯路。

参考链接:无人驾驶汽车系统入门(三十)——基于深度神经网络LaneNet的车道线检测及ROS实现_AdamShan的博客-CSDN博客

论文原文地址:Towards End-to-End Lane Detection: an Instance Segmentation Approach

Tensorflow代码地址:lanenet-lane-detection

 现在作者维护的版本更新到了2021.4.29。我上传到了百度网盘里:

链接:https://pan.baidu.com/s/1XydBVV-niTo9GybRDhquww 
提取码:yos4 

 文件夹结构为:

```
lanenet-lane-detection-master
├─ .idea
│  └─ vcs.xml
├─ config
│  └─ tusimple_lanenet.yaml
├─ data
│  ├─ source_image
│  │  ├─ accuracy.png
│  │  ├─ binary_seg_loss.png
│  │  ├─ instance_seg_loss.png
│  │  ├─ lanenet_batch_test.gif
│  │  ├─ lanenet_binary_seg.png
│  │  ├─ lanenet_embedding.png
│  │  ├─ lanenet_instance_seg.png
│  │  ├─ lanenet_mask_result.png
│  │  ├─ network_architecture.png
│  │  ├─ qr.jpg
│  │  └─ total_loss.png
│  ├─ training_data_example
│  │  ├─ gt_binary_image
│  │  │  ├─ 0000.png
│  │  │  ├─ 0001.png
│  │  │  ├─ 0002.png
│  │  │  ├─ 0003.png
│  │  │  ├─ 0004.png
│  │  │  └─ 0005.png
│  │  ├─ gt_instance_image
│  │  │  ├─ 0000.png
│  │  │  ├─ 0001.png
│  │  │  ├─ 0002.png
│  │  │  ├─ 0003.png
│  │  │  ├─ 0004.png
│  │  │  └─ 0005.png
│  │  ├─ image
│  │  │  ├─ 0000.png
│  │  │  ├─ 0001.png
│  │  │  ├─ 0002.png
│  │  │  ├─ 0003.png
│  │  │  ├─ 0004.png
│  │  │  └─ 0005.png
│  │  ├─ train.txt
│  │  └─ val.txt
│  ├─ tusimple_ipm_remap.yml
│  └─ tusimple_test_image
│     ├─ 0.jpg
│     ├─ 1.jpg
│     ├─ 2.jpg
│     └─ 3.jpg
├─ data_provider
│  ├─ lanenet_data_feed_pipline.py
│  └─ tf_io_pipline_tools.py
├─ lanenet_model
│  ├─ lanenet.py
│  ├─ lanenet_back_end.py
│  ├─ lanenet_discriminative_loss.py
│  ├─ lanenet_front_end.py
│  ├─ lanenet_postprocess.py
│  └─ __init__.py
├─ LICENSE
├─ local_utils
│  ├─ config_utils
│  │  ├─ parse_config_utils.py
│  │  └─ __init__.py
│  └─ log_util
│     ├─ init_logger.py
│     └─ __init__.py
├─ mnn_project
│  ├─ config.ini
│  ├─ config_parser.cpp
│  ├─ config_parser.h
│  ├─ convert_lanenet_model_into_mnn_model.sh
│  ├─ dbscan.hpp
│  ├─ freeze_lanenet_model.py
│  ├─ kdtree.cpp
│  ├─ kdtree.h
│  ├─ lanenet_model.cpp
│  ├─ lanenet_model.h
│  └─ __init__.py
├─ README.md
├─ requirements.txt
├─ semantic_segmentation_zoo
│  ├─ bisenet_v2.py
│  ├─ cnn_basenet.py
│  ├─ vgg16_based_fcn.py
│  └─ __init__.py
├─ tools
│  ├─ evaluate_lanenet_on_tusimple.py
│  ├─ evaluate_model_utils.py
│  ├─ generate_tusimple_dataset.py
│  ├─ make_tusimple_tfrecords.py
│  ├─ test_lanenet.py
│  └─ train_lanenet_tusimple.py
├─ trainner
│  ├─ tusimple_lanenet_multi_gpu_trainner.py
│  ├─ tusimple_lanenet_single_gpu_trainner.py
│  └─ __init__.py
└─ _config.yml

```

一、使用TensorFlow2.4.0实现及基于tuSimple数据集的模型训练

1. tuSimple数据集准备

下载地址:tusimple数据集

我也将它上传到了百度网盘:

链接:https://pan.baidu.com/s/1ZyH4_tV7Nxphrb4MBt7Lcw 
提取码:9ioq 

下载完成后解压缩到一个目录下,目录内容如下:

tuSimple/
├── clips
│   ├── 0313-1
│   ├── 0313-2
│   ├── 0530
│   ├── 0531
│   └── 0601
├── label_data_0313.json
├── label_data_0531.json
├── label_data_0601.json
├── readme.md
└── test_tasks_0627.json

将解压好的tuSimple文件夹放置于data目录下。

2. 如何将代码在 TensorFlow 2.4.0上使用

只需在每个需要导入 TensorFlow 模块的.py文档中加入下述语句:

import tensorflow
tensorflow.compat.v1.disable_eager_execution()
tf = tensorflow.compat.v1

这样就可以在TensorFlow 2.4.0运行 TensorFlow 1.0 版本的代码。

使用以下命令安装一下运行代码所需的包。注意这里的requirements.txt文件中的包可能版本比较老,如果和TensorFlow 2.4.0不兼容,升级一下即可。

pip install -r requirements.txt

3. 生成用于训练的数据

使用项目lanenet-lane-detection中的脚本generate_tusimple_dataset.py产生用于训练的binary mask和instance mask;

3.1 生成文件夹training和testing

根据.json文件转换训练集,生成图片文件夹gt_image、gt_binary_image、gt_instance_image 以及文本文件 train.txt。

在终端输入以下命令:

cd ./tools
python generate_tusimple_dataset.py --src_dir=D:\DOCS\deepl_lane_detection\lanenet-lane-detection-master\data\tuSimple

此处需要等待几分钟:

在tuSimple目录下自动生成了trainingtesting两个目录,如下所示:

tuSimple/
|
├──training/
|   ├── gt_binary_image
|   ├── gt_image
|   ├── gt_instance_image
|   ├── label_data_0313.json
|   ├── label_data_0531.json
|   ├── label_data_0601.json
|   └── train.txt
└──testing/
    └── test_tasks_0627.json

 可见该脚本仅生成了train.txt,我们可以手动分割一下train set和val set,也就是剪切train.txt中的一部分到一个新建的val.txt和test.txt文件中。

打开train.txt,可以看到共有3626行数据,此处我粘贴了400行到val.txt中,200行粘贴到test.txt中。这里可以在合理范围内自己设置。

之后运行代码可能遇到的问题:

ModuleNotFoundError: No module named 'data_provider'  

只需在代码前加上以下语句:

import sys
import os
sys.path.append(os.getcwd())

3.2 将标注格式转换成TFRecord

3.2.1 更改config目录下的tusimple_lanenet.yaml文件。

更改数据集的路径,如下所示。

DATASET:
    DATA_DIR: 'D:\DOCS\deepl_lane_detection\lanenet-lane-detection-master\data\tuSimple\training'
    IMAGE_TYPE: 'rgb'  # choice rgb or rgba
    NUM_CLASSES: 2
    TEST_FILE_LIST: 'D:\DOCS\deepl_lane_detection\lanenet-lane-detection-master\data\tuSimple\training\test.txt'
    TRAIN_FILE_LIST: 'D:\DOCS\deepl_lane_detection\lanenet-lane-detection-master\data\tuSimple\training\train.txt'
    VAL_FILE_LIST: 'D:\DOCS\deepl_lane_detection\lanenet-lane-detection-master\data\tuSimple\training\val.txt'
    IGNORE_INDEX: 255
    PADDING_VALUE: [127.5, 127.5, 127.5]
    MEAN_VALUE: [0.5, 0.5, 0.5]
    STD_VALUE: [0.5, 0.5, 0.5]
    CPU_MULTI_PROCESS_NUMS: 8

3.2.2 使用脚本生成tfrecord文件

命令如下:

cd ..
python tools/make_tusimple_tfrecords.py --dataset_dir D:\DOCS\deepl_lane_detection\lanenet-lane-detection-master\data\tuSimple\training --tfrecords_dir D:\DOCS\deepl_lane_detection\lanenet-lane-detection-master\data\tuSimple\training\tfrecords

等待几分钟,脚本会在项目的data/training/tfrecords目录下生成相应的tfrecord文件,如下所示:

4. 训练自己的数据集

4.1更改代码:

 更改data_provider\lanenet_data_feed_pipline.py第799行

def get_next(self,name=None):
    return self._next_internal()
# def get_next(self):
#    return self._next_internal()

4.2 开始训练

运行 tools/train_lanenet_tusimple.py,开始训练:

也可以在终端中输入:

python tools/train_lanenet.py --dataset_dir D:\DOCS\deepl_lane_detection\lanenet-lane-detection-master\data\tuSimple\training --multi_gpus False

使用tensorboard查看训练过程

cd tboard/tusimple/bisenetv2_lanenet
tensorboard --logdir=.

在训练过程中,可以通过tensorboard查看模型在验证集上的总损失(val_cost)、分割损失(val_binary_seg_loss)、嵌入损失(val_instance_seg_loss)以及分割精度(val_accuracy)变化曲线,如下所示:

在这里插入图片描述

 还可以查看模型在训练过程中的分割分支和嵌入分支输出到预测图,如下图所示:

在这里插入图片描述

若出现以下问题:

2021-11-15 21:43:06.595835: I tensorflow/stream_executor/cuda/cuda_driver.cc:789] failed to allocate 2.20G (2363280384 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY: out of memory

更改config目录下的tusimple_lanenet.yaml文件中的 batch_num (从32改为8)

TRAIN:
    MODEL_SAVE_DIR: 'model/tusimple/'
    TBOARD_SAVE_DIR: 'tboard/tusimple/'
    MODEL_PARAMS_CONFIG_FILE_NAME: "model_train_config.json"
    RESTORE_FROM_SNAPSHOT:
        ENABLE: False
        SNAPSHOT_PATH: ''
    SNAPSHOT_EPOCH: 8
    BATCH_SIZE: 8
    VAL_BATCH_SIZE: 4
    EPOCH_NUMS: 905
    WARM_UP:
        ENABLE: True
        EPOCH_NUMS: 8
    FREEZE_BN:
        ENABLE: False
    COMPUTE_MIOU:
        ENABLE: True
        EPOCH: 1
    MULTI_GPU:
        ENABLE: True
        GPU_DEVICES: ['0', '1']
        CHIEF_DEVICE_INDEX: 0
SOLVER:
    LR: 0.001
    LR_POLICY: 'poly'
    LR_POLYNOMIAL_POWER: 0.9
    OPTIMIZER: 'sgd'
    MOMENTUM: 0.9
    WEIGHT_DECAY: 0.0005
    MOVING_AVE_DECAY: 0.9995
    LOSS_TYPE: 'cross_entropy'
    OHEM:
        ENABLE: False
        SCORE_THRESH: 0.65
        MIN_SAMPLE_NUMS: 65536
GPU:
    GPU_MEMORY_FRACTION: 0.9
    TF_ALLOW_GROWTH: True
POSTPROCESS:
    MIN_AREA_THRESHOLD: 100
    DBSCAN_EPS: 0.35
    DBSCAN_MIN_SAMPLES: 1000
LOG:
    SAVE_DIR: './log'
    LEVEL: INFO

这里我们仍然是训练的tuSimple数据集,也可以制作自己的数据集。

训练好的权重 百度网盘链接:

链接:https://pan.baidu.com/s/1iNvf6IfU9Fg718xIhze4rg 
提取码:9b0a 
复制这段内容后打开百度网盘手机App,操作更方便哦

将权重文件放在model目录下,然后就可以测试结果了。

5. 测试结果

 终端输入:

python tools/test_lanenet.py --weights_path D:\DOCS\deepl_lane_detection\lanenet-lane-detection-master\model\tusimple_lanenet.ckpt --image_path ./data/tusimple_test_image/0.jpg

结果: 

二、代码及原理知识梳理(未完待续)

整体架构总览图

上图为LaneNet车道线检测的网络结构。这是一种端到端的车道线检测算法,包括LaneNet和H-Net两个网络模型。

其中,LaneNet是一种将语义分割和对像素进行向量表示结合起来的多任务模型,目的是将不同车道线实例化(通过用车道 id 标记每个车道像素来输出车道实例图);

H-Net是由卷积层和全连接层组成的网络模型,负责预测转换矩阵H,目的是对属于同一车道线的像素点进行回归(该矩阵学习以输入图像为条件的透视变换)。

对于每条车道,拟合三阶多项式并将车道重新投影到图像上。下文将具体介绍每一部分实现的功能。

1. LaneNet网络架构

LaneNet网络架构

如图,有两个解码分支:

1)Segmentation branch 负责对输入图像进行语义分割(对像素进行二分类,判断像素属于车道线还是背景),得到Binary image;

为了训练一个这样的分割网络,原论文使用了tuSimple数据集,在数据集中,车道线可能被其他车辆阻挡,在这种情况下,将车道线的标注(Ground truth)贯穿障碍物,如下图所示,从而使得分割网络在车道线被其他障碍物阻挡的情况下,依然可以完整检测出完整的车道线像素。

分割网络使用标准的交叉熵损失函数进行训练,对于这个逐像素分类任务而言(车道线像素/非车道线像素分类),由于两个类别的像素极度不均衡,为了处理此问题,作者使用了bounded inverse class weighting方法。

实例分割任务由两部分组成,分割和聚类部分,在下面的部分中更详细地解释。 为了在速度和准确性方面提高性能 [27],这两个部分在多任务网络中联合训练

2) Embedding branch 对像素进行嵌入式表示,论文将嵌入式向量的维度设置为4,训练得到的 embedding 向量用于聚类。最后将两个分支的结果进行结合利用 Mean-Shift 算法进行聚类,得到实例分割的结果。

不受可以检测的车道数量的限制,并且能够应对车道变化。

通过叠加嵌入分支和分割分支,在使用神经网络提取出车道线像素的同时,还能够对每个车道线实现聚类(即像素属于哪一根车道线)。为了训练这样的聚类嵌入网络,聚类损失函数(嵌入网络)包含两部分,方差项 L v a r L_{var}Lvar​ 和距离项 L d i s t L_{dist}Ldist​ ,其中 L v a r L_{var}Lvar​ 将每个嵌入的向量往某条车道线聚类中心(均值)方向拉,这种“拉力”激活的前提是嵌入向量到平均嵌入向量的距离过远,大于阈值 δ v \delta_vδv​ ; L d i s t L_{dist}Ldist​ 使两个类别的车道线越远越好,激活这个“推力”的前提是两条车道线聚类中心的距离过近,近于阈值 δ d \delta_dδd​ 。最后总的损失函数L的公式如下:

在这里插入图片描述

其中 C CC 表示聚类的数量(也就是车道线的数量),N c N_cNc​ 表示聚类 c cc 中的元素数量,x i x_ixi​ 表示一个像素嵌入向量, μ c \mu_{c}μc​ 表示聚类 c cc 的均值向量,[ x ] + = m a x ( 0 , x ) [x]_{+} = max(0, x)[x]+​=max(0,x),最后的损失函数为 L = L v a r + L d i s t L = L_{var} + L_{dist}L=Lvar​+Ldist​ 。该损失函数在实际实现(TensorFlow)中代码如下:

2. H-Net网络架构

1. generate_tusimple_dataset.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 18-5-18 下午7:31
# @Author  : MaybeShewill-CV
# @Site    : https://github.com/MaybeShewill-CV/lanenet-lane-detection
# @File    : generate_tusimple_dataset.py
# @IDE: PyCharm Community Edition
"""
generate tusimple training dataset
"""
import argparse
import glob
import json
import os
import os.path as ops
import shutil
import sys
sys.path.append(os.getcwd())

import cv2
import numpy as np


def init_args():
    """

    :return:
    """
    parser = argparse.ArgumentParser()
    parser.add_argument('--src_dir', type=str, help='The origin path of unzipped tusimple dataset')

    return parser.parse_args()


def process_json_file(json_file_path, src_dir, ori_dst_dir, binary_dst_dir, instance_dst_dir):
    """

    :param json_file_path:
    :param src_dir: origin clip file path
    :param ori_dst_dir:
    :param binary_dst_dir:
    :param instance_dst_dir:
    :return:
    """
    assert ops.exists(json_file_path), '{:s} not exist'.format(json_file_path)

    image_nums = len(os.listdir(ori_dst_dir))

    with open(json_file_path, 'r') as file:
        for line_index, line in enumerate(file):
            info_dict = json.loads(line)

            image_dir = ops.split(info_dict['raw_file'])[0]
            image_dir_split = image_dir.split('/')[1:]
            image_dir_split.append(ops.split(info_dict['raw_file'])[1])
            image_name = '_'.join(image_dir_split)
            image_path = ops.join(src_dir, info_dict['raw_file'])
            assert ops.exists(image_path), '{:s} not exist'.format(image_path)

            h_samples = info_dict['h_samples']
            lanes = info_dict['lanes']

            image_name_new = '{:s}.png'.format('{:d}'.format(line_index + image_nums).zfill(4))

            src_image = cv2.imread(image_path, cv2.IMREAD_COLOR)
            dst_binary_image = np.zeros([src_image.shape[0], src_image.shape[1]], np.uint8)
            dst_instance_image = np.zeros([src_image.shape[0], src_image.shape[1]], np.uint8)

            for lane_index, lane in enumerate(lanes):
                assert len(h_samples) == len(lane)
                lane_x = []
                lane_y = []
                for index in range(len(lane)):
                    if lane[index] == -2:
                        continue
                    else:
                        ptx = lane[index]
                        pty = h_samples[index]
                        lane_x.append(ptx)
                        lane_y.append(pty)
                if not lane_x:
                    continue
                lane_pts = np.vstack((lane_x, lane_y)).transpose()
                lane_pts = np.array([lane_pts], np.int64)

                cv2.polylines(dst_binary_image, lane_pts, isClosed=False,
                              color=255, thickness=5)
                cv2.polylines(dst_instance_image, lane_pts, isClosed=False,
                              color=lane_index * 50 + 20, thickness=5)

            dst_binary_image_path = ops.join(binary_dst_dir, image_name_new)
            dst_instance_image_path = ops.join(instance_dst_dir, image_name_new)
            dst_rgb_image_path = ops.join(ori_dst_dir, image_name_new)

            cv2.imwrite(dst_binary_image_path, dst_binary_image)
            cv2.imwrite(dst_instance_image_path, dst_instance_image)
            cv2.imwrite(dst_rgb_image_path, src_image)

            print('Process {:s} success'.format(image_name))


def gen_train_sample(src_dir, b_gt_image_dir, i_gt_image_dir, image_dir):
    """
    generate sample index file
    :param src_dir:
    :param b_gt_image_dir:
    :param i_gt_image_dir:
    :param image_dir:
    :return:
    """

    with open('{:s}/training/train.txt'.format(src_dir), 'w') as file:

        for image_name in os.listdir(b_gt_image_dir):
            if not image_name.endswith('.png'):
                continue

            binary_gt_image_path = ops.join(b_gt_image_dir, image_name)
            instance_gt_image_path = ops.join(i_gt_image_dir, image_name)
            image_path = ops.join(image_dir, image_name)

            assert ops.exists(image_path), '{:s} not exist'.format(image_path)
            assert ops.exists(instance_gt_image_path), '{:s} not exist'.format(instance_gt_image_path)

            b_gt_image = cv2.imread(binary_gt_image_path, cv2.IMREAD_COLOR)
            i_gt_image = cv2.imread(instance_gt_image_path, cv2.IMREAD_COLOR)
            image = cv2.imread(image_path, cv2.IMREAD_COLOR)

            if b_gt_image is None or image is None or i_gt_image is None:
                print('图像对: {:s}损坏'.format(image_name))
                continue
            else:
                info = '{:s} {:s} {:s}'.format(image_path, binary_gt_image_path, instance_gt_image_path)
                file.write(info + '\n')
    return


def process_tusimple_dataset(src_dir):
    """

    :param src_dir:
    :return:
    """
    traing_folder_path = ops.join(src_dir, 'training')
    testing_folder_path = ops.join(src_dir, 'testing')

    os.makedirs(traing_folder_path, exist_ok=True)
    os.makedirs(testing_folder_path, exist_ok=True)

    for json_label_path in glob.glob('{:s}/label*.json'.format(src_dir)):
        json_label_name = ops.split(json_label_path)[1]

        shutil.copyfile(json_label_path, ops.join(traing_folder_path, json_label_name))

    for json_label_path in glob.glob('{:s}/test*.json'.format(src_dir)):
        json_label_name = ops.split(json_label_path)[1]

        shutil.copyfile(json_label_path, ops.join(testing_folder_path, json_label_name))

    gt_image_dir = ops.join(traing_folder_path, 'gt_image')
    gt_binary_dir = ops.join(traing_folder_path, 'gt_binary_image')
    gt_instance_dir = ops.join(traing_folder_path, 'gt_instance_image')

    os.makedirs(gt_image_dir, exist_ok=True)
    os.makedirs(gt_binary_dir, exist_ok=True)
    os.makedirs(gt_instance_dir, exist_ok=True)

    for json_label_path in glob.glob('{:s}/*.json'.format(traing_folder_path)):
        process_json_file(json_label_path, src_dir, gt_image_dir, gt_binary_dir, gt_instance_dir)

    gen_train_sample(src_dir, gt_binary_dir, gt_instance_dir, gt_image_dir)

    return


if __name__ == '__main__':
    args = init_args()

    process_tusimple_dataset(args.src_dir)

2. 

三、一些参考文献

1、图森TuSimple车道线检测数据集介绍_十栋前的猫的博客-CSDN博客

 tusimple-benchmark/doc/lane_detection at master · TuSimple/tusimple-benchmark · GitHub

简略总结:

tuSimple数据集大约包括7000个1秒钟长的20帧的视频剪辑(clips)。只有每个剪辑的最后一帧的车道带标签。

数据集的规模:

  1. 训练:3626个视频剪辑,3626个带标注的帧(每个剪辑clips有20帧,最后一帧带有标注)
  2. 测试:2782个视频剪辑

数据集采集时复杂条件:1. 复杂的天气条件(良好和中等) 2. 白天傍晚 3. 车道线数量(2/3/4/甚至更多) 4. 复杂的路况

注释类型: 折现标记

2、[深度学习] 车道线检测调研(lane detection)_Holeung blog-CSDN博客

 深度学习车道线检测论文集

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习车道线检测之 LaneNet (使用tensorflow2.4.0跑通) 的相关文章

  • 如何从 Python 返回 JSON 值?

    我从如下所示的 jQuery 文件发送 ajax 请求 该请求需要 JSON 格式的响应 jQuery ajax url Control getImageDetails file id currentId type GET contentT
  • Tensorflow:如何通过 tf.gather 传播梯度?

    我在尝试传播损失函数相对于代表收集索引的变量的梯度时遇到一些问题 类似于空间变换器网络中所做的事情 https github com tensorflow models blob master transformer spatial tra
  • 管理 Tweepy API 搜索

    如果这是对之前在其他地方回答过的问题的粗略重复 请原谅我 但我不知道如何使用 tweepy API 搜索功能 是否有任何有关如何使用搜索推文的文档api search 功能 有什么方法可以控制返回的推文数量 结果类型等功能 由于某种原因 结
  • 为什么我不能“string”.print()?

    我的理解print 在 Python 和 Ruby 以及其他语言 中 它是字符串 或其他类型 上的方法 因为它的语法非常常用 打印 嗨 works 那么为什么不呢 hi print 在 Python 中或 hi print在红宝石工作 当你
  • 将分布拟合到直方图

    I want to know the distribution of my data points so first I plotted the histogram of my data My histogram looks like th
  • 来自数据框 groupby 的条形图

    import pandas as pd import numpy as np import matplotlib pyplot as plt df pd read csv arrests csv df df replace np nan 0
  • 什么时候用==,什么时候用is?

    奇怪的是 gt gt gt a 123 gt gt gt b 123 gt gt gt a is b True gt gt gt a 123 gt gt gt b 123 gt gt gt a is b False Seems a is b
  • 直接打开Spyder还是通过Pythonxy打开?

    之前 我一直在运行PythonSpyder 我总是开始Spyder直接双击其图标 今天突然发现我还有一个东西叫Python x y 我注意到我也可以开始Spyder通过它 这两种方法有什么区别吗 如果不是的话 有什么意义Python x y
  • 获取 HTML 代码的结构

    我正在使用 BeautifulSoup4 我很好奇是否有一个函数可以返回 HTML 代码的结构 有序标签 这是一个例子 h1 Simple example h1 p This is a simple example of html page
  • 如何将 pip 指向 Mercurial 分支?

    我正在尝试通过 pip 将我的应用程序安装到 virtualenv 进行测试 安装时效果很好default or tip像这样 pip install e hg https email protected cdn cgi l email p
  • 如何将字符串方法应用于数据帧的多列

    我有一个包含多个字符串列的数据框 我想使用对数据帧的多列上的系列有效的字符串方法 我希望这样的事情 df pd DataFrame A 123f 456f B 789f 901f df Out 15 A B 0 123f 789f 1 45
  • 如何在 Python 中将 EXR 文件的 float16 转换为 uint8

    我正在使用 OpenEXR 读取 Python 中的 EXR 文件 我有带有半数据 float16 的 R G 和 B 通道 我尝试使用 Numpy 将数据从 float16 转换为 uint8 0 255 颜色 但没有成功 rCh get
  • 当我打印“查询”时获取 PY_VAR1

    我正在制作一个简单的网络抓取代码 当我尝试打印一个值时 它给了我其他东西 def PeopleSearch query SearchTerm query what is query print str query SearchTerm St
  • 在Python中确定句子中2个单词之间的邻近度

    我需要确定 Python 句子中两个单词之间的接近度 例如 在下面的句子中 the foo and the bar is foo bar 我想确定单词之间的距离foo and bar 确定之间出现的单词数foo and bar 请注意 该词
  • Learning_rate 不是合法参数

    我正在尝试通过实现 GridSearchCV 来测试我的模型 但我似乎无法在 GridSearch 中添加学习率和动量作为参数 每当我尝试通过添加这些代码来执行代码时 我都会收到错误 这是我创建的模型 def define model op
  • 如何使用 Ajax 在 Flask 中发布按钮值而不刷新页面?

    我有一个问题 当我单击 Flask 应用程序中的按钮时 我想避免重新加载 我知道有 Ajax 解决方案 但我想知道如何将我的按钮链接到 ajax 函数以发布按钮值并运行链接到其值的 python 函数 这是我的 html 按钮 div di
  • 单击 selenium 中的链接时循环遍历表格的行(python)

    示例页面源代码如下所示 div class div1 table class foot market tbody td class today name td tbody tbody td class today name td tbody
  • Matplotlib 渲染日期、图像的问题

    我在使用 conda forge 的 Matplotlib v 3 1 3 和 python 3 7 时遇到问题 我拥有 Matplotlib 所需的所有依赖项 当我输入这段代码时 它应该可以工作 我得到了泼溅艺术 它基于此 YouTube
  • Python模糊字符串匹配作为相关样式表/矩阵

    我有一个文件 其中包含 x 个字符串名称及其关联的 ID 本质上是两列数据 我想要的是一个格式为 x by x 的相关样式表 将相关数据作为 x 轴和 y 轴 但我想要 fuzzywuzzy 库的函数 fuzz ratio x y 作为输出
  • 稍微不同的形状会收敛到错误的数字 - 为什么?

    我试图弄清楚为什么 TensorFlow 会做一些令人惊讶的事情 我将其归结为一个测试用例 尝试对一个简单的问题进行线性回归 该问题只需将两个输入加在一起 权重收敛到 1 0 偏差收敛到 0 0 正如它们应该的那样 使用此版本的训练输出 t

随机推荐

  • 【C++奇遇记】函数模板

    博客主页 博主链接 本文由 M malloc 原创 首发于 CSDN 学习专栏推荐 LeetCode刷题集 数据库专栏 初阶数据结构 欢迎点赞 收藏 留言 如有错误敬请指正 未来很长 值得我们全力奔赴更美好的生活 文章目录 本章详情 函数模
  • XML的生成和解析

    一 什么是XML XML就是可扩展标记语言 HTML是超文本标记语言 标记语言就是通过一个一个的标记来组织数据的一种语法格式 与HTMl超文本语言比较的话XML这种可扩展语言它的标记是自己定义的 XML中自己定义的标记表示 例如 lt 标记
  • 复杂网络博弈:WS、NW小世界网络模型

    用Matlab程序分别绘制含有至少100个节点的WS NW小世界网络模型 并给出具体程序代码 带每行注释 Matlab版本 matlab R2022b 代码1 自己不用去创建函数体 设置节点数量为100 N 100 设置平均度数为4 K 4
  • 如何编写jstl自定义标签(示例:自定义jstl Long型时间转为date型)

    原文地址 http www cnblogs com icoding archive 2012 07 08 2581164 html 写jsp不可避免的会用到jstl 因为这个公司也没怎么用过velocity等模板 所以jstl就相对来说是比
  • 幼儿园分班问题 【Java】

    幼儿园分班问题 Java 题目描述 幼儿园两个班的小朋友在排队时混在了一起 每位小朋友都知道自己是否与前面一位小朋友是否同班 请你帮忙把同班的小朋友找出来 小朋友的编号是整数 与前一位小朋友同班用Y表示 不同班用N表示 输入描述 输入由空格
  • LaTeX 宏包(\usepackage)

    LaTeX 宏包引用及常用宏包简介 LaTeX 宏包 宏包介绍 常用宏包简介 如何安装宏包 MiKTeX Console 宏包调用 LaTeX 宏包 宏包介绍 宏包是用来扩展 增强LaTeX的功能 宏包与LaTeX的关系和浏览器插件与浏览器
  • hbuilderX自定义主题仿vscode暗黑主题

    目录 hbuilderX自定义主题仿vscode暗黑主题 效果图 设置方式 把主题代码复制进来即可 是基于雅蓝主题自定义的 设置好后需要切换到雅蓝主题 hbuilderx保存时自动整理代码 1 首先在顶部栏 找到工具 打开设置 2 点击旁边
  • net::ERR_CONNECTION_RESET 报错原因

    1 gt 向tomcat 服务器上上传视频 谷歌浏览器控制台报出 打开信地址栏后 发现 net ERR CONNECTION RESET 错误 但是此视频以经过mp4转码 注 浏览器支持的播放mp4视频编码格式为 AVC编码的H264 后发
  • Unity 打包至Android 平台 编译不通过 所遇到过的坑

    Now we are here to learn how to build a android app by unity game engine but Build 不出来咋办 你都遇到了那些情况的问题呢 1 入门 忘记设置包名 2 安装A
  • Intellj idea 中创建测试 test

    在idea中创建测试类有两种方法 1 鼠标点中类名 使用 Alt Enter 会弹出intention action gt create tests 2 鼠标点中类名 使用 Ctrl Shift T 默认 会弹出 create new te
  • 在uniapp微信小程序中实现无限级评论(vue递归组件+Java构建所有评论树状结构)

    1 前言 这是本人毕业设计中其中一个功能点 就是用户在微信小程序 使用uniapp框架 中的首页模块中可以对健身资讯进行评论或者社区模块对别人发布的动态进行评论 2 实现效果 最后放个演示视频吧 实现思路 1 首先 在前端页面中编写好一个递
  • 制作PCB的基本设计流程;

    基本流程 1 在电脑中建立一个自定义的文件夹 例如D AD project Project1 以备存储设计文件用 双击打开Altium Designer 进入软件工作界面 2 创建工程文件 单击 File 菜单 选择 New 选项中的 Pr
  • [知识/工具/安全渗透测试]简洁明了的Google Hacking教程,效率UPUP

    Google Hacking 简介 Google Hacking 是指利用谷歌搜索引擎中的高级操作符 在搜索结果中定位特定的文本字符串 依托于谷歌强大的后台爬虫数据库 灵活使用可大大提高效率 前排提醒 请遵守法律法规 科学上网 不要用于非法
  • 语音合成技术

    转自 https zhuanlan zhihu com p 27395458 语音合成又称文语转换 Text To Speech 简称TTS 指通过机械的 电子的方法生成语音的技术 随着科技的发展 合成语音的自然度和音质均得到了明显的改善
  • 在 MVC 4 中使用RDLC 报表

    前期知识点 RDLC 报表 Visual Studio NET进入2005版本以后 Crystal Report与IDE的结合更 紧密 了 至少我们看不到那个讨厌的注册窗口了 但是 Microsoft似乎并不容忍在自己的超级工具中竟然没有报
  • 如何完全卸载HbuilderX

    今天本来想发行打包安卓端 结果发现突然就不行了 前天还行 报错 然后我找了各种原因 排查了很久才发现是HbuilderX编辑器的问题 机智如我 所以我们需要重新去下载一个HbuilderX 但是问题来了 很多人不知道怎么卸载 我自己网上也百
  • EasyExcel使用、合并

    写入EXCEL 有两种方法 其一是通过 直接代码控制 缺点是不好掌握整个的页面设计 合并策略 根据 行开始和结束 进行控制 合并列 参数 mergeRowIndex 开始行 endmergeRowIndex截至行 mergeColumnIn
  • Makefile中的自动化变量说明

    文章目录 前言 常见自动化变量说明 前言 在做嵌入式开发的时候会经常要看到Makefile文件 来观察程序的编译过程 但是我们会经常看到诸如 lt 这种奇怪的符号 为此我进行了一番总结供大家翻看查阅 常见自动化变量说明 表示规则中的目标文件
  • Java基础之面向对象的概念

    面向对象的简称是OO Object Oriented 对于Java语言来说 一切都是对象 在编程世界中 一个对象代表了某个具体的操作 一个个对象最终组成了完整的程序设计 这些设计可以是独立存在的 也可以是从别的对象继承过来的 对象之间通过相
  • 深度学习车道线检测之 LaneNet (使用tensorflow2.4.0跑通)

    本文用来整理回顾所学知识 也能使视觉领域初学者的同伴们少走些弯路 参考链接 无人驾驶汽车系统入门 三十 基于深度神经网络LaneNet的车道线检测及ROS实现 AdamShan的博客 CSDN博客 论文原文地址 Towards End to