使用Python,OpenCV应用EAST文本检测器检测自然场景图像中的文本

2023-10-26

这篇博客将介绍如何使用Python,OpenCV应用EAST文本检测器检测自然场景图像和视频流中的文本。

OpenCV的EAST文本检测器是一种深度学习模型,基于一种新颖的体系结构和训练模式。它能够(1)在720p图像上以13 FPS的速度近实时运行,(2)获得最先进的文本检测精度。
《EAST:高效准确的场景文本检测》称该算法为“EAST”,是一种高效、准确的场景文本检测管道。

文本检测器不仅准确,而且能够在720p图像上以大约13 FPS的速度近实时运行。

为了提供OpenCV的EAST文本检测器的实现,需要转换OpenCV的C++示例;然而遇到了许多挑战,如:

  • 无法使用OpenCV的NMSBox进行非最大值抑制,而必须使用imutils中的实现。
  • 由于缺少RotatedRect的Python绑定,无法计算真正的旋转边界框。
  • 尽最大可能使实现尽可能接近OpenCV,但注意:该版本与C++版本并非完全相同,随着时间的推移,可能需要解决一到两个小问题。

1. 效果图

成都玩的照片,检测效果图1如下:
可以看到文本被正确识别,EAST很快,每张照片耗时0.15s左右;
在这里插入图片描述

拉萨羊卓雍错湖路上拍的照片,效果图2如下:
可以看到大多数文本被正确识别;
在这里插入图片描述

侏罗纪世界电影开头,视频流中检测效果图如下:

在这里插入图片描述

2. 原理

opencv >=3.4.2或者4
什么是EAST文本检测器,为什么使用它,以及是什么使该算法如此新颖

在受约束的可控环境中检测文本通常可以通过使用基于启发式的方法来实现,例如利用梯度信息或文本通常分组为段落并且字符出现在直线上的事实。这种基于启发式的文本检测器的示例可以关于检测护照图像中的机器可读区域中看到。

自然场景文本检测是不同的,但更具挑战性。

2.1 为什么自然场景文本检测如此具有挑战性?

  • 图像/传感器噪声:手持式相机的传感器噪声通常高于传统扫描仪的噪声。此外,低价相机通常会对原始传感器的像素进行插值,以产生真实的颜色。
  • 视角:自然场景文本可以自然地具有与文本不平行的视角,从而使文本更难识别。
  • 模糊:不受控制的环境往往会产生模糊。
  • 照明条件:不能对自然场景图像中的照明条件做出任何假设。它可能接近黑暗,相机上的闪光灯可能亮着,或者太阳可能明亮地照耀着,使整个图像饱和。
  • 分辨率:并非所有相机分辨率一致,可能正在处理分辨率低于标准的相机。
  • 非纸张对象:大多数(但不是全部)纸张都不反射(至少在尝试扫描的纸张的上下文中)。自然场景中的文字可能是反射性的,包括徽标、标志等。
    非平面物体:考虑瓶子表面上的文字可能是扭曲和变形的。尽管人仍然能够轻松地“检测”和阅读文本,但算法很难处理。
    未知布局:不能使用任何先验信息为算法提供文本所在位置的“线索”。

OpenCV的EAST文本检测器实现非常健壮,即使文本模糊、反射或部分模糊,也能够定位文本

2.2 替代EAST文本检测实现

这里使用的EAST文本检测模型是与OpenCV兼容的TensorFlow实现,即可以使用TensorFlow或OpenCV使用该模型进行文本检测预测。也可以使用PyTorch实现

Tesseract和EasyOCR都具有文本检测(检测文本在输入图像中的位置)和文本识别(OCR文本本身)

使用Python,OpenCV进行Tesseract-OCR绑定及文本检测识别
使用EasyOCR执行文本检测
这两个都使用基于深度学习的模型来执行文本检测和定位。

然而根据项目,可以使用基本的图像处理和计算机视觉技术来执行文本检测。
使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones)
使用OpenCV和Python识别数字
https://blog.csdn.net/qq_40985985/article/details/113944141
使用Python,OpenCV进行卡类型及16位卡号数字的OCR
使用Python,OpenCV进行银行支票数字和符号的OCR
虽然传统的计算机视觉和图像处理技术可能没有基于深度学习的文本检测技术那么普遍,但它们在某些情况下可以工作得出奇地好。

3. 源码

3.1 text_detection.py

# text_detection.py 对图像进行文本检测
# text_detection_video 对视频流(实时视频/视频文件)进行文本检测
# frozen_east_text_detection.pb EAST自然场景文本检测序列化的模型
# USAGE
# python text_detection.py --image images/yh.jpg --east frozen_east_text_detection.pb

import argparse
import time

import cv2
import imutils
import numpy as np
# 导入必要的包
from imutils.object_detection import non_max_suppression  # 从IMUTIL中导入了NumPy、OpenCV的非最大单位抑制实现

# 构建命令行参数及解析
# --image 输入图像路径
# --east east场景文本检测器模型路径
# --min-confidence 可选 过滤弱检测的置信度值
# --width 可选 缩放图像宽度,必须是32的倍数
# --height 可选 缩放图像高度,必须是32的倍数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str,
                help="path to input image")
ap.add_argument("-east", "--east", type=str,
                help="path to input EAST text detector")
ap.add_argument("-c", "--min-confidence", type=float, default=0.5,
                help="minimum probability required to inspect a region")
ap.add_argument("-w", "--width", type=int, default=320,
                help="resized image width (should be multiple of 32)")
ap.add_argument("-e", "--height", type=int, default=320,
                help="resized image height (should be multiple of 32)")
args = vars(ap.parse_args())

# 加载图像获取维度
image = cv2.imread(args["image"])
orig = image.copy()
(H, W) = image.shape[:2]

# 计算宽度,高度及分别的比率值
(newW, newH) = (args["width"], args["height"])
rW = W / float(newW)
rH = H / float(newH)

# 缩放图像获取新维度
image = cv2.resize(image, (newW, newH))
(H, W) = image.shape[:2]

# 为了使用OpenCV和EAST深度学习模型执行文本检测,需要提取两层的输出特征图:
# 定义EAST探测器模型的两个输出层名称,感兴趣的是——第一层输出可能性,第二层用于提取文本边界框坐标
# 第一层是输出sigmoid激活,提供了一个区域是否包含文本的概率。
# 第二层是表示图像“几何体”的输出特征映射-将能够使用该几何体来推导输入图像中文本的边界框坐标
layerNames = [
    "feature_fusion/Conv_7/Sigmoid",
    "feature_fusion/concat_3"]

# cv2.dnn.readNet加载预训练的EAST text detector
print("[INFO] loading EAST text detector...")
net = cv2.dnn.readNet(args["east"])

# 从图像构建一个blob,然后执行预测以获取俩层输出结果
# 将图像转换为blob来准备图像
blob = cv2.dnn.blobFromImage(image, 1.0, (W, H),
                             (123.68, 116.78, 103.94), swapRB=True, crop=False)
start = time.time()
# 通过将层名称作为参数提供给网络以指示OpenCV返回感兴趣的两个特征图:
# 分数图,包含给定区域包含文本的概率
# 几何图:输入图像中文本的边界框坐标的输出几何图
net.setInput(blob)
(scores, geometry) = net.forward(layerNames)
end = time.time()

# 展示文本预测耗时信息
print("[INFO] text detection took {:.6f} seconds".format(end - start))

# 从分数卷中获取行数和列数,然后初始化边界框矩形集和对应的信心分数
(numRows, numCols) = scores.shape[2:4]
rects = []
confidences = []

# 两个嵌套for循环用于在分数和几何体体积上循环,这将是一个很好的例子,说明可以利用Cython显著加快管道操作。
# 我已经用OpenCV和Python演示了Cython在快速、优化的“for”像素循环中的强大功能。
# 遍历预测结果
for y in range(0, numRows):
    # 提取分数(概率),然后是环绕文字的几何(用于推导潜在边界框坐标的数据)
    scoresData = scores[0, 0, y]
    xData0 = geometry[0, 0, y]
    xData1 = geometry[0, 1, y]
    xData2 = geometry[0, 2, y]
    xData3 = geometry[0, 3, y]
    anglesData = geometry[0, 4, y]

    # 遍历列
    for x in range(0, numCols):
        # 过滤弱检测
        if scoresData[x] < args["min_confidence"]:
            continue

        # 计算偏移因子,因为得到的特征图将比输入图像小4倍
        (offsetX, offsetY) = (x * 4.0, y * 4.0)

        # 提取用于预测的旋转角度,然后计算正弦和余弦
        angle = anglesData[x]
        cos = np.cos(angle)
        sin = np.sin(angle)

        # 使用几何体体积导出边界框
        h = xData0[x] + xData2[x]
        w = xData1[x] + xData3[x]

        # 计算文本边界框的开始,结束x,y坐标
        endX = int(offsetX + (cos * xData1[x]) + (sin * xData2[x]))
        endY = int(offsetY - (sin * xData1[x]) + (cos * xData2[x]))
        startX = int(endX - w)
        startY = int(endY - h)

        # 将边界框坐标和概率分数添加到各自的列表
        rects.append((startX, startY, endX, endY))
        confidences.append(scoresData[x])

# 对边界框应用非最大值抑制(non-maxima suppression),以抑制弱重叠边界框,然后显示结果文本预测
# apply overlapping to suppress weak, overlapping bounding boxes
boxes = non_max_suppression(np.array(rects), probs=confidences)

# 遍历边界框
for i, (startX, startY, endX, endY) in enumerate(boxes):
    # 根据相对比率缩放边界框坐标
    startX = int(startX * rW)
    startY = int(startY * rH)
    endX = int(endX * rW)
    endY = int(endY * rH)

    # cv2.putText(orig, str(confidences[i]), (startX, startY - 10),
    #             cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
    # 在图像上绘制边界框
    cv2.rectangle(orig, (startX, startY), (endX, endY), (0, 255, 0), 2)

# 展示输出图像
cv2.imshow("Text Detection", imutils.resize(orig,width=500))
cv2.waitKey(0)

3.2 text_detection_video.py

# text_detection.py 对图像进行文本检测
# text_detection_video 对视频流(实时视频/视频文件)进行文本检测
# frozen_east_text_detection.pb EAST自然场景文本检测序列化的模型
# USAGE
# python text_detection_video.py --east frozen_east_text_detection.pb
# python text_detection_video.py --east frozen_east_text_detection.pb --video images/jurassic_park_trailer.mp4

import argparse
import time

import cv2
import imutils
import numpy as np
from imutils.object_detection import non_max_suppression  # 从IMUTIL中导入了NumPy、OpenCV的非最大单位抑制实现
from imutils.video import FPS
# 导入必要的包
from imutils.video import VideoStream  # 使用VideoStream访问网络摄像机和FPS,以对该脚本每秒的帧进行基准测试


# 定义一个新函数来解码预测函数-它将被重新用于每个帧,并使循环代码更简洁
def decode_predictions(scores, geometry):
    # 获取分数集中的行列,初始化边界框坐标和分数list
    (numRows, numCols) = scores.shape[2:4]
    rects = []
    confidences = []

    # 遍历行
    for y in range(0, numRows):
        # 提取分数,潜在的包围文本的边界框坐标
        scoresData = scores[0, 0, y]
        xData0 = geometry[0, 0, y]
        xData1 = geometry[0, 1, y]
        xData2 = geometry[0, 2, y]
        xData3 = geometry[0, 3, y]
        anglesData = geometry[0, 4, y]

        # 遍历列
        for x in range(0, numCols):
            # 过滤弱检测
            if scoresData[x] < args["min_confidence"]:
                continue

            # 计算偏移量因子,由于结果特征图比原始图像小4倍
            (offsetX, offsetY) = (x * 4.0, y * 4.0)

            # 提取预测结果的旋转角度,和正弦余弦函数
            angle = anglesData[x]
            cos = np.cos(angle)
            sin = np.sin(angle)

            # 使用几何体计算边界框的宽高
            h = xData0[x] + xData2[x]
            w = xData1[x] + xData3[x]

            # 计算文本边界框的开始,结束坐标
            endX = int(offsetX + (cos * xData1[x]) + (sin * xData2[x]))
            endY = int(offsetY - (sin * xData1[x]) + (cos * xData2[x]))
            startX = int(endX - w)
            startY = int(endY - h)

            # 添加边界框坐标和相应的分数到list中
            rects.append((startX, startY, endX, endY))
            confidences.append(scoresData[x])

    # 返回一系列边界框坐标和对应的分数
    return (rects, confidences)


# 构建命令行参数及解析
# --video 可选的,输入视频文件路径
# --east east场景文本检测器模型路径
# --min-confidence 可选 过滤弱检测的置信度值
# --width 可选 缩放图像宽度,必须是32的倍数
# --height 可选 缩放图像高度,必须是32的倍数
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", type=str,
                help="path to optinal input video file")
ap.add_argument("-east", "--east", type=str,
                help="path to input EAST text detector")
ap.add_argument("-c", "--min-confidence", type=float, default=0.5,
                help="minimum probability required to inspect a region")
ap.add_argument("-w", "--width", type=int, default=320,
                help="resized image width (should be multiple of 32)")
ap.add_argument("-e", "--height", type=int, default=320,
                help="resized image height (should be multiple of 32)")
args = vars(ap.parse_args())

# 初始化原始帧的维度,新维度及比率
(W, H) = (None, None)
(newW, newH) = (args["width"], args["height"])
(rW, rH) = (None, None)

# 为了使用OpenCV和EAST深度学习模型执行文本检测,需要提取两层的输出特征图:
# 定义EAST探测器模型的两个输出层名称,感兴趣的是——第一层输出可能性,第二层用于提取文本边界框坐标
# 第一层是输出sigmoid激活,提供了一个区域是否包含文本的概率。
# 第二层是表示图像“几何体”的输出特征映射-将能够使用该几何体来推导输入图像中文本的边界框坐标
layerNames = [
    "feature_fusion/Conv_7/Sigmoid",
    "feature_fusion/concat_3"]

# cv2.dnn.readNet加载预训练的EAST text detector
print("[INFO] loading EAST text detector...")
net = cv2.dnn.readNet(args["east"])

# 如果未提供视频文件,则获取摄像头指针
if not args.get("video", False):
    print("[INFO] starting video stream...")
    vs = VideoStream(src=0).start()
    time.sleep(1.0)

# 否则,获取文件指针
else:
    vs = cv2.VideoCapture(args["video"])

# 开始帧吞吐量计数器
fps = FPS().start()

num = 0
# 遍历视频流的帧
while True:
    # 获取当前帧,兼容 VideoStream or VideoCapture对象
    frame = vs.read()
    frame = frame[1] if args.get("video", False) else frame

    # 检查是否到达文件末尾
    if frame is None:
        break

    # 保持比率的缩放帧
    frame = imutils.resize(frame, width=1000)
    orig = frame.copy()

    # 如果宽度,高度为None,则计算原始帧到新帧的比率
    if W is None or H is None:
        (H, W) = frame.shape[:2]
        rW = W / float(newW)
        rH = H / float(newH)

    # 缩放帧,忽略比率
    frame = cv2.resize(frame, (newW, newH))

    # 从帧构建一个blob,执行net.forward获取俩层输出结果
    blob = cv2.dnn.blobFromImage(frame, 1.0, (newW, newH),
                                 (123.68, 116.78, 103.94), swapRB=True, crop=False)
    net.setInput(blob)
    # 通过将层名称作为参数提供给网络以指示OpenCV返回感兴趣的两个特征图:
    # 分数图,包含给定区域包含文本的概率
    # 几何图:输入图像中文本的边界框坐标的输出几何图
    (scores, geometry) = net.forward(layerNames)

    # 解码预测结果,然后应用非最大值抑制以抑制重叠边界框
    # 解码预测并应用NMS(non-maxima suppression)
    (rects, confidences) = decode_predictions(scores, geometry)
    boxes = non_max_suppression(np.array(rects), probs=confidences)

    # 遍历边界框
    for (startX, startY, endX, endY) in boxes:
        # 按相对比率缩放边界框
        startX = int(startX * rW)
        startY = int(startY * rH)
        endX = int(endX * rW)
        endY = int(endY * rH)

        # cv2.putText(orig, str(confidences[i]), (startX, startY - 10),
        #             cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
        # 在帧上绘制边界框
        cv2.rectangle(orig, (startX, startY), (endX, endY), (0, 255, 0), 2)

    # 更新fps计数器
    fps.update()

    num = num + 1
    cv2.imwrite("imgs/" + str(num) + ".jpg", imutils.resize(orig, width=500))

    # 展示输出帧
    cv2.imshow("Text Detection", orig)
    key = cv2.waitKey(1) & 0xFF

    # 按下‘q’键,退出循环
    if key == ord("q"):
        break

# 停止计数器,展示fps信息
fps.stop()
print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))

# 如果使用的摄像头流,释放指针
if not args.get("video", False):
    vs.stop()

# 否则,释放文件指针
else:
    vs.release()

# 关闭所有窗口
cv2.destroyAllWindows()

参考

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

使用Python,OpenCV应用EAST文本检测器检测自然场景图像中的文本 的相关文章

  • 使用 Peewee 追溯创建索引?

    有没有办法用 Peewee 追溯索引 sql 文件的列 即初始规范未建立索引的情况 询问是因为执行所有插入然后建立索引应该更快 而不是相反 有没有办法用 Peewee 追溯索引 sql 文件的列 Yes Pewee s http docs
  • 当参数具有相同名称时如何恢复内置函数? [复制]

    这个问题在这里已经有答案了 我知道你是 不应该 https stackoverflow com questions 2417979 can i use variable name type as function argument in p
  • Anaconda-Python RequestsDependencyWarning:urllib3 (1.22) 或 chardet (2.3.0) 与支持的版本不匹配

    我收到一条警告 该警告似乎没有在任何其他在线资源中涵盖 我安装了 Anaconda Python 3 6 创建新的 Conda 环境时收到的警告是 RequestsDependencyWarning urllib3 1 22 or char
  • python 中的 fiona 导入问题

    我已经使用whl发行版安装了fiona 但是在导入时我收到以下错误 ImportError Traceback most recent call last
  • Python 中 iter 函数的第二个参数是什么?

    让我们考虑一个文件 echo e This is a foo bar sentence nAnd this is the first txtfile in the corpus gt test txt cat test txt This i
  • 如何通过 Python 的请求使用 FTP

    是否可以使用requests与 FTP 站点交互的模块 requests获取 HTTP 页面非常方便 但当我尝试使用 FTP 站点时 我似乎遇到架构错误 我有什么遗漏的吗requests允许我执行 FTP 请求 还是不支持 对于像我一样得到
  • Python Popen grep

    我希望 Popen 执行 grep i line buffered grave data txt 当从 shell 运行时 这给了我想要的结果 如果我开始 在我测试的同一目录中grep 一个 python repl 并遵循文档中的说明 ht
  • 如何在 PyQt 中使用 QThreads 双向设置信号和槽?

    这是基于 ekhumoro 答案的后续问题here https stackoverflow com a 52005755 4464653 and here https stackoverflow com a 20818401 4464653
  • 在 Pandas 中计算滚动回归并存储斜率

    我有一些时间序列数据 我想计算 Pandas 中最后 n 天的分组滚动回归 并将该回归的斜率存储在新列中 我搜索了较旧的问题 它们要么没有得到解答 要么使用了 Pandas OLS 我听说它已被弃用 我想我可能可以使用df rolling
  • python 求数组中正数之和的函数

    我需要编写一个函数 它接受一个数字数组并找到所有数字的最大和 换句话说 我需要找到正数的总和 我写了这个 我收到 列表超出范围 想法 def maximum sub A x 0 i 0 for i in A while A i gt 0 x
  • 使用 anaconda3 python 3.5 安装 Tensorflow 出现“读取超时错误”

    我正在尝试安装tensorflow gpu 使用python3 6和anaconda 3 我正在按照以下链接中的安装步骤进行操作https www tensorflow org install install windows https w
  • pip install 找不到包,但 pip search 找到

    我想安装hdbcli https pypi org project hdbcli 包 SAP HANA 连接器 当我搜索时pip正在找到该包 但是当我想安装它时 pip找不到包裹 指定当前包也不会产生任何结果 pip install hdb
  • 在 python 中对自定义类执行集合操作

    我想将 Python 的内置 set 类与我创建的自定义类一起使用 如果我愿意 要创建包含自定义类实例的集合 我需要实现哪些函数才能执行测试 例如 set a set b 它可以开箱即用 但是 在某些情况下 过载是有意义的 eq https
  • python中通过命令查找进程

    在我的 Python 脚本中 我想检查是否otherscript py目前正在 Linux 系统上运行 这psutil http psutil readthedocs io en latest 图书馆看起来是一个很好的解决方案 import
  • 从列表中删除元素的最佳方法

    我想知道从列表中删除元素的最佳方法 有效方法是什么 有功能很少 https docs python org 3 tutorial datastructures html more on lists由Python提供 some list re
  • Django 查询集权限

    我正在构建一个相当复杂的Django在电子邮件扫描服务之上使用的应用程序 这Django应用程序是使用 Python 3 5 编写的 该应用程序主要使用Django Rest Framework处理与浏览器前端的通信 我目前遇到的问题是我尝
  • SymPy 无法对产品进行羔羊化

    我正在使用 SymPy 1 0 和 Python 2 7 我想计算前 100 个整数的总和 此代码运行成功 import sympy as sy from sympy tensor import IndexedBase Idx import
  • Pandas ImportError:绘图需要 matplotlib

    Pandas 无法识别已安装的 matplotlib 库 这是代码 import pandas as pd import numpy as np import matplotlib pyplot as plt matplotlib inli
  • DateField 未呈现为 type="date"

    class Form Form plan start DateField Plan Start validators Required 这段代码将渲染这个 html
  • 处理在没有全局变量的情况下跨函数使用的变量

    所以我正在开发一个基本的文字游戏 你会得到一只字母 手 字典对象 你可以用它来创建单词并获得分数 这个 手牌 被用在许多函数的参数中 计算玩家的分数 在玩家使用一个或多个字母后更新手牌中的字母数量 显示手牌 检查玩家单词的有效性 ETC 从

随机推荐

  • Ubuntu下如何将普通用户提升到root权限

    1 打开超级终端 输入指令sudo gedit etc passwd 2 则找到crystal x 1000 1000 crystal home linuxidc bin bash 将两个1000改成0即可 3 重新登陆之后打开超级终端发现
  • BLEU 评价指标总结

    Bleu 评测 一 Bleu通常用来度量一组机器产生的翻译句子集合 candidates 与一组人工翻译句子集合 references 的相似程度 Bleu的具体计算过程看下图 在这里解释一下 式中的n 为当前匹配n gram的长度 这里的
  • Win10 + vs2017 编译并配置tesseract4.1.0

    tesseract 是一个开源的OCR Optical Character Recognition 光学字符识别 引擎 本文就介绍一下自己在编译 tesseract4 1 0时遇到的一些坑 希望能给大家带来一些帮助 一 下载 tessera
  • mybatis mysql autoreconnect=true_Mysql8.0主从搭建,shardingsphere+springboot+mybatis读写分离...

    cd usr local mysql mkdir mysql files chown mysql mysql mysql files chmod 750 mysql files bin mysqld initialize user mysq
  • StringUtils中 isNotEmpty 和isNotBlank的区别 以及StringUtil类的方法

    StringUtils方法的操作对象是java lang String类型的对象 是JDK提供的String类型操作方法的补充 并且是null安全的 即如果输入参数String为null则不会抛出NullPointerException 而
  • Apollo:实时通信架构CyberRT入门

    发现一开始就深入源码 很容易陷进去 特别是模块非常多的情况 需要看很多遍才能理解清楚 要写出更容易理解的文档 需要的不是事无巨细的分析代码 更主要的是能够把复杂的东西抽象出来 变为简单的东西 一个很简答的例子是画函数调用流程图很简单 但是要
  • C++指针定义和使用

    目录 1 指针简介 2 指针的声明和使用 1 指针简介 学习指针前需要先分清几个概念 1 1内存单元的地址和内存单元的内容 在程序中定义一个变量 当程序进行编译时就会给定义的变量分配内存单元 这个内存单元的大小由变量的数据类型决定 例如对有
  • 算法

    算法的效率 算法的效率主要由以下两个复杂度来评估 时间复杂度 评估执行程序所需要的时间 可以估算出程序对处理器的使用程度 空间复杂度 评估执行程序所需要的的存储空间 可以估算出程序对计算机内存的使用程度 设计算法时 一般要先考虑系统环境 然
  • torch.exp()的使用举例

    参考链接 torch exp input out None 参考链接 exp 代码实验展示 Microsoft Windows 版本 10 0 18363 1256 c 2019 Microsoft Corporation 保留所有权利 C
  • Highcharts的3D饼图上下颠倒及解决办法

    我需要的样式效果 那发现常规的echarts不满足了 就改成了highcharts进行3d图表开发 but在开发的过程中发现了这个现象 来吧 看看问题 第一次进入页面 饼图是正常的 戳这个进去瞅瞅 喵 那你进去就看到这个样子的饼图呢 但是由
  • Spring5框架一:IOC实现的两种方式和底层原理

    1 概念 先了解 原理后面再写 1 spring是一个轻量级的开源的JavaEE框架 引入jar包的数量以及体积都比较小 2 spring框架可以解决企业应用开发的复杂性 3 spring里面有很多组成部分 IOC和AOP两个核心部分 IO
  • OpenVX 的 立即模式(immediate mode)和图模式(graph mode)和示例讲解

    OpenVX 的 立即模式 immediate mode 和图模式 graph mode openvx的执行模型一般分为 立即模式 和 图模式 直接模式非常简单 以vxu 开头的函数类似于opencv 习惯于传统的opencv api的 能
  • 整理gitHub项目JavaGuide-CSDN版

    文章目录 java 基础 基础知识系统总结 重要知识点详解 其他 容器 并发 面试题总结 面试常问知识点 JVM 其他 网络 操作系统 Linux系统 数据结构与算法 数据结构 算法 常见算法问题总结 数据库 MySQL 总结 重要知识点
  • 小程序文件系统之 -- 读写文件

    1 文件写入 获取文件系统管理器 const fs wx getFileSystemManager const writeFile data url gt const filePath wx env USER DATA PATH test
  • JAVA8将集合中的某个字段相加、批量修改某个值、高效率循环、高效便捷遍历map

    1 集合中的某个字段相加 BigDecimal 类型保留两位 Objects为你的list集合 BigDecimal freightSum objects stream map Object getMoney reduce BigDecim
  • 获得python的list中含有重复值的index

    关于怎么获得 我想其实网上有很多答案 list index 获得值的索引值 但是如果list中含有的值一样 例如含有两个11 22 这样每次获得的都是第一个值的位置 那么怎么去解决这个问题呢 下面的程序对这个问题做了一定的解答 usr bi
  • 二维码图片生成,并返回给前端

    GetMapping value qrCode produces MediaType IMAGE PNG VALUE public byte qrCode return demoService qrCode public byte qrCo
  • vscode+ssh连接远程linux系统服务器,并用anaconda管理python环境

    vscode ssh连接远程linux系统服务器 并用anaconda管理python环境 一 vscode连接服务器 1 vscode下载插件 remote SSH 2 连接服务器 3 修改配置 二 将代码拷贝到服务器上与代码同步 1 转
  • 在内部局域网内搭建HTTPs

    在内部局域网内搭建HTTPs 配置环境 Windows版本 Windows Server 2008 R2 Standard Service Pack 1 系统类型 64 位操作系统 内存 4GB 了解HTTPS 为什么需要 HTTPS 多数
  • 使用Python,OpenCV应用EAST文本检测器检测自然场景图像中的文本

    使用Python OpenCV应用EAST文本检测器检测自然场景图像中的文本 1 效果图 2 原理 2 1 为什么自然场景文本检测如此具有挑战性 2 2 替代EAST文本检测实现 3 源码 3 1 text detection py 3 2