如何使用OpenCV计算机视觉检测帕金森病图片

2023-05-16

在本教程中,您将学习如何使用OpenCV和机器学习在手绘的螺旋和波浪图像中自动检测帕金森病。

本教程来自来自巴西的博士生Joao。

Joao有兴趣利用计算机视觉和机器学习基于几何图形(即螺旋和符号波)自动检测和预测帕金森病

虽然我对帕金森病很熟悉,但我还没有听说过几何绘图测试 - 一些研究让我得到了一篇2017年论文,用复合速度指数和绘制螺旋笔压来区分帕金森病的不同阶段, Zham等人。

研究人员发现,帕金森病患者的拔牙速度较慢,笔压较低 - 这 对于患有更急性/晚期疾病的患者尤其明显。

帕金森症的症状之一是肌肉颤抖和僵硬,使得绘制光滑的螺旋和波浪变得更加困难。

Joao假设有可能仅使用图纸检测帕金森病,而不是必须测量笔在纸上的速度和压力。

降低跟踪笔速度和压力的要求:

  1. 在执行测试时无需额外的硬件。
  2. 使自动检测帕金森氏症变得更加容易。

Joao及其顾问慷慨地允许我访问他们收集的由(1)帕金森病患者和(2)健康参与者绘制的螺旋和波浪的数据集。

我看了一下数据集并考虑了我们的选择。

最初,Joao希望将深度学习应用于该项目,但经过考虑,我仔细解释过,深度学习虽然功能强大,但 并不总是适合这项工作的工具!例如,你不会想用锤子来拧螺丝。

相反,你看看你的工具箱,仔细考虑你的选择,并抓住正确的工具。

我向Joao解释了这一点,然后演示了我们如何使用标准计算机视觉和机器学习算法以83.33%的准确率 预测帕金森的图像 。

要学习如何应用计算机视觉和OpenCV来检测基于几何图形的帕金森症,请继续阅读!

使用OpenCV,计算机视觉和螺旋/波浪测试检测帕金森症

在本教程的第一部分中,我们将简要讨论帕金森病,包括几何图形如何用于检测和预测帕金森病。

然后,我们将检查从有和没有帕金森病的患者中收集的图纸数据集。

在查看数据集之后,我将教授如何使用HOG图像描述符来量化输入图像,然后教我们如何在提取的特征之上训练随机森林分类器。

我们将通过检查结果来结束。

什么是帕金森病?

图1:帕金森病患者有神经系统问题。症状包括运动问题,如震颤和僵硬。在这篇博文中,我们将使用OpenCV和机器学习从螺旋和波浪组成的手绘图中检测帕金森病。

帕金森病是一种影响运动的神经系统疾病。该疾病是进行性的,并且由五个不同阶段标记。

  1. 第1阶段:轻度症状不典型的日常生活,包括只震颤和运动干涉问题一个身体一侧。
  2. 第2阶段:症状继续与双方震颤和刚性现在影响到变得更糟两个身体的两侧。日常任务变得具有挑战
  3. 第3阶段:失去平衡和运动随着跌倒变得频繁和普遍。患者仍然能够(通常)独立生活。
  4. 第4阶段:症状变得严重和受限制。患者无法独自生活,需要帮助才能进行日常活动。
  5. 第五阶段:可能无法行走或站立。患者最有可能坐轮椅,甚至可能出现幻觉。

虽然帕金森病无法治愈,但早期检测和适当的药物治疗可以显着改善症状和生活质量,使其成为计算机视觉和机器学习从业者探索的重要课题。

绘制螺旋和波浪来检测帕金森病

Zham等人2017年的一项研究。发现可以通过让患者画螺旋然后跟踪来检测帕金森病:

  1. 绘图速度
  2. 笔压力

研究人员发现,帕金森病患者的拔牙速度较慢,笔压较低 - 尤其如此对于患有更急性/晚期疾病明显。

我们将利用两个最常见的帕金森症状包括震颤和肌肉僵硬这一事实直接影响手绘螺旋和波浪的视觉外观。

视觉外观的变化将使我们能够训练计算机视觉+机器学习算法以自动检测帕金森病。

螺旋和波浪数据集

图3:今天的帕金森图像数据集由来自Uberlândia联邦大学NIATS的Andrade和Folado策划。我们将使用Python和OpenCV来训练一个模型,用于从类似的螺旋/波浪图纸中自动分类帕金森氏症

数据集本身由204个图像组成,并预先分成训练集和测试集,包括:

  • 螺旋: 102个图像,72个训练和30个测试
  • Wave: 102张图片,72次训练和30次测试

上面的图3示出了每个附图和相应类的示例。

虽然对于一个人来说,如果不是不可能的话,一些人在这些图纸中对帕金森氏症与健康状况进行分类是有挑战性的,但其他人在视觉外观上表现出明显的偏差 - 我们的目标是量化这些图纸的视觉外观然后训练机器学习模型对它们进行分类。

为今天的项目准备计算环境

今天的环境可以直接在您的系统上启动和运行。

您将需要以下软件:

  • OpenCV的
  • NumPy的
  • Scikit学习
  • Scikit图像
  • imutils

每个包都可以使用Python的包管理器pip安装。

$ workon cv # insert your virtual environment name such as `cv`

$ pip install opencv-contrib-python # see the tutorial linked above

$ pip install scikit-learn

$ pip install scikit-image

$ pip install imutils

项目结构

zip文件包含螺旋和波形数据集以及单个Python脚本。

您可以 在终端中使用 tree命令来检查文件和文件夹的结构:

Detecting Parkinson's Disease with OpenCV, Computer Vision, and the Spiral/Wave TestShell

$ tree --dirsfirst --filelimit 10

.

├── dataset

│ ├── spiral

│ │ ├── testing

│ │ │ ├── healthy [15 entries]

│ │ │ └── parkinson [15 entries]

│ │ └── training

│ │ ├── healthy [36 entries]

│ │ └── parkinson [36 entries]

│ └── wave

│ ├── testing

│ │ ├── healthy [15 entries]

│ │ └── parkinson [15 entries]

│ └── training

│ ├── healthy [36 entries]

│ └── parkinson [36 entries]

└── detect_parkinsons.py

15 directories, 1 file

$ tree --dirsfirst --filelimit 10

.

├── dataset

│ ├── spiral

│ │ ├── testing

│ │ │ ├── healthy [15 entries]

│ │ │ └── parkinson [15 entries]

│ │ └── training

│ │ ├── healthy [36 entries]

│ │ └── parkinson [36 entries]

│ └── wave

│ ├── testing

│ │ ├── healthy [15 entries]

│ │ └── parkinson [15 entries]

│ └── training

│ ├── healthy [36 entries]

│ └── parkinson [36 entries]

└── detect_parkinsons.py

15 directories, 1 file

我们的 数据集/ 首先分解为 螺旋/ 和 波/ 。每个文件夹进一步分为 testing / 和training / 。最后,我们的图像位于 健康/ 或 帕金森/ 文件夹中。

我们今天将审查一个Python脚本: detect_parkinsons .py 。该脚本将读取所有图像,提取特征并训练机器学习模型。最后,结果将以蒙太奇显示。

实施帕金森探测器脚本

为了实现我们的帕金森探测器,您可能会倾向于在这个问题上投入深度学习和卷积神经网络(CNN) - 但这种方法存在问题。

首先,我们没有太多的训练数据,只有72张图像用于训练。当遇到缺乏跟踪数据时,我们通常应用数据增强 - 但在此上下文中的数据增加也存在问题。

您需要非常小心,因为不正确地使用数据增加可能会使健康的患者的绘图看起来像帕金森病患者的绘图(反之亦然)。

更重要的是,有效地将计算机视觉应用于问题就是将正确的工具带到工作中 - 例如,你不会用螺丝刀敲打钉子。

仅仅因为您可能知道如何将深度学习应用于问题并不一定意味着深度学习“始终”是问题的最佳选择。

在这个例子中,我将向您展示如果训练数据量有限,方向梯度直方图(HOG)图像描述符以及随机森林分类器如何能够很好地执行。

打开一个新文件,将其命名为 detect_parkinsons .py ,然后插入以下代码:

# import the necessary packages

from sklearn.ensemble import RandomForestClassifier

from sklearn.preprocessing import LabelEncoder

from sklearn.metrics import confusion_matrix

from skimage import feature

from imutils import build_montages

from imutils import paths

import numpy as np

import argparse

import cv2

import os

def quantify_image(image):

# compute the histogram of oriented gradients feature vector for

# the input image

features = feature.hog(image, orientations=9,

pixels_per_cell=(10, 10), cells_per_block=(2, 2),

transform_sqrt=True, block_norm="L1")

# return the feature vector

return features

def load_split(path):

# grab the list of images in the input directory, then initialize

# the list of data (i.e., images) and class labels

imagePaths = list(paths.list_images(path))

data = []

labels = []

# loop over the image paths

for imagePath in imagePaths:

# extract the class label from the filename

label = imagePath.split(os.path.sep)[-2]

# load the input image, convert it to grayscale, and resize

# it to 200x200 pixels, ignoring aspect ratio

image = cv2.imread(imagePath)

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

image = cv2.resize(image, (200, 200))

# threshold the image such that the drawing appears as white

# on a black background

image = cv2.threshold(image, 0, 255,

cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

# quantify the image

features = quantify_image(image)

# update the data and labels lists, respectively

data.append(features)

labels.append(label)

# return the data and labels

return (np.array(data), np.array(labels)

# construct the argument parser and parse the arguments

ap = argparse.ArgumentParser()

ap.add_argument("-d", "--dataset", required=True,

help="path to input dataset")

ap.add_argument("-t", "--trials", type=int, default=5,

help="# of trials to run")

args = vars(ap.parse_args()

# define the path to the training and testing directories

trainingPath = os.path.sep.join([args["dataset"], "training"])

testingPath = os.path.sep.join([args["dataset"], "testing"])

# loading the training and testing data

print("[INFO] loading data...")

(trainX, trainY) = load_split(trainingPath)

(testX, testY) = load_split(testingPath)

# encode the labels as integers

le = LabelEncoder()

trainY = le.fit_transform(trainY)

testY = le.transform(testY)

# initialize our trials dictionary

trials =

# loop over the number of trials to run

for i in range(0, args["trials"]):

# train the model

print("[INFO] training model {} of {}...".format(i + 1,

args["trials"]))

model = RandomForestClassifier(n_estimators=100)

model.fit(trainX, trainY)

# make predictions on the testing data and initialize a dictionary

# to store our computed metrics

predictions = model.predict(testX)

metrics = {}

# compute the confusion matrix and and use it to derive the raw

# accuracy, sensitivity, and specificity

cm = confusion_matrix(testY, predictions).flatten()

(tn, fp, fn, tp) = cm

metrics["acc"] = (tp + tn) / float(cm.sum())

metrics["sensitivity"] = tp / float(tp + fn)

metrics["specificity"] = tn / float(tn + fp)

# loop over the metrics

for (k, v) in metrics.items():

# update the trials dictionary with the list of values for

# the current metric

l = trials.get(k, [])

l.append(v)

trials[k] = l

# loop over our metrics

for metric in ("acc", "sensitivity", "specificity"):

# grab the list of values for the current metric, then compute

# the mean and standard deviation

values = trials[metric]

mean = np.mean(values)

std = np.std(values)

# show the computed metrics for the statistic

print(metric)

print("=" * len(metric))

print("u={:.4f}, o={:.4f}".format(mean, std))

print("

# randomly select a few images and then initialize the output images

# for the montage

testingPaths = list(paths.list_images(testingPath))

idxs = np.arange(0, len(testingPaths))

idxs = np.random.choice(idxs, size=(25,), replace=False)

images = []

# loop over the testing samples

for i in idxs:

# load the testing image, clone it, and resize it

image = cv2.imread(testingPaths[i])

output = image.copy()

output = cv2.resize(output, (128, 128))

# pre-process the image in the same manner we did earlier

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

image = cv2.resize(image, (200, 200))

image = cv2.threshold(image, 0, 255,

cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

# quantify the image and make predictions based on the extracted

# features using the last trained Random Forest

features = quantify_image(image)

preds = model.predict([features])

label = le.inverse_transform(preds)[0]

# draw the colored class label on the output image and add it to

# the set of output images

color = (0, 255, 0) if label == "healthy" else (0, 0, 255)

cv2.putText(output, label, (3, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5,

color, 2)

images.append(output)

# create a montage using 128x128 "tiles" with 5 rows and 5 columns

montage = build_montages(images, (128, 128), (5, 5))[0]

# show the output montage

cv2.imshow("Output", montage)

cv2.waitKey(0)

我们从第2-11行的进口开始 

  • 我们将大量使用scikit-learn,这在前三个进口中很明显:
  • 我们使用的分类器是 RandomForestClassifier 。
  • 我们将使用 LabelEncoder 将标签编码为整数。
  • 将构建一个 confusion_matrix,以便我们可以获得原始的准确性,灵敏度和特异性。
  • 定向梯度直方图(HOG)将来自 scikit-image 的 特征导入。
  • 来自imutils的两个模块 将被使用:
  • 我们将 build_montages 用于可视化。
  • 我们的 路径 导入将帮助我们提取数据集中每个图像的文件路径。
  • NumPy将帮助我们计算统计数据并获取随机指数。
  • 该 argparse 进口将使我们能够解析命令行参数。
  • OpenCV( cv2)将用于读取,处理和显示图像。
  • 我们的程序将使用os 模块同时支持Unix和Windows文件路径 。

让我们 用HOG方法定义一个量化波/螺旋图像的函数 :

我们将使用quanty_image 函数从每个输入图像中提取特征 。

Dalal和Triggs在他们的CVPR 2005论文中首次介绍了 人体检测的方向梯度直方图,HOG将用于量化我们的图像。

HOG是一种 结构描述符,用于捕获和量化输入图像中局部梯度的变化。HOG自然能够量化螺旋和波的方向如何变化。

此外,HOG将能够捕捉到这些图纸是否对他们有更多的“震动”,正如我们对帕金森病患者所期望的那样。

HOG的另一个应用是这个PyImageSearch Gurus示例课程。请务必参阅示例课程以获取有关该功能的完整说明 参数。

得到的特征是量化波或螺旋的12,996-dim特征向量(数字列表)。我们将在数据集中所有图像的特征之上训练随机森林分类器。

继续,让我们加载我们的数据并提取功能:

该 load_split 函数接受数据集的目标, 路径 和返回的所有特征 数据 和相关类 的标签 。让我们一步一步地分解它:

  • 该函数被定义为接受第23行 上数据集的 路径(波形或螺旋形) 。
  • 从那里我们抓住输入 imagePaths ,利用imutils(第26行)。
  • 这两个 数据 和 标签 列表被初始化(行27和28)。
  • 从那里 开始,我们遍历从第31行开始的所有 imagePath
  • 从路径中提取每个 标签(第33行)。
  • 加载并预处理每个 图像(第37-44行)。阈值处理步骤从输入图像中分割绘图,使绘图在黑色背景上显示为 白色前景 。
  • 通过我们的quanty_image 函数提取特征 (第47行)。
  • 的 特征 和 标签 被附加到 数据 和 标签 分别列表(线50-51)。
  • 最后, 数据 和 标签 被转换为NumPy数组,并在元组中方便地返回(第54行)。

让我们继续并解析我们的命令行参数:

我们的脚本处理两个命令行参数:

  • - dataset :输入数据集的路径(波形或螺旋形)。
  • - 试验 :试运行的次数(默认我们进行 5次 试验)。

为了准备培训,我们将执行初始化:

在这里,我们正在构建培训和测试输入目录的路径(第65和66行)。

从那里我们通过将每个路径传递给load_split来加载我们的训练和测试分裂 (第70和71行)。

我们的 试用 词典在第79行初始化 (回想一下,默认情况下我们将进行 5次 试验)。

让我们现在开始我们的试验:

在 第82行,我们遍历每个试验。在每个试验中,我们:

  • 初始化我们的随机森林分类器并训练模型(第86和87行)。有关随机森林的更多信息,包括它们如何在计算机视觉环境中使用,请务必参考 PyImageSearch Gurus
  • 请 预测 上测试数据(91号线)。
  • 计算准确度,灵敏度和特异性 指标 (第96-100行)。
  • 更新我们的 试用 词典(第103-108行)。

循环遍历每个指标,我们将打印统计信息:

第111行,我们遍历每个 指标 。

然后我们继续 从 试验中获取 值 (第114行)。

使用这些 值 ,计算每个度量的平均值和标准偏差(第115和116行)。

从那里,统计数据显示在终端中。

现在是眼睛糖果 - 我们将创建一个蒙太奇,以便我们可以直观地分享我们的工作:

首先,我们从我们的测试集中随机抽样图像(第126-128行)。

我们的 图像 列表将保存每个波形或螺旋图像以及通过OpenCV绘图功能添加的注释(第129行)。

我们继续循环第132行的随机图像索引 。

在循环内部,每个图像以与训练期间相同的方式处理(第134-142行)。

从那里我们将使用我们基于HOG + Random Forest的新分类器自动对图像进行分类,并添加颜色编码的注释:

每个 图像 用HOG 特征量化 (第146行)。

然后通过将这些特征传递 给模型来 对图像进行分类 。预测 (第147和148行)。

类标签的颜色为绿色,表示 “健康” ,红色表示红色第152行)。该 标签 被绘制在图像(的左上角线153和154)。

然后将每个 输出图像添加到 图像 列表(第155行),以便我们可以开发 蒙太奇 (第158行)。您可以通过OpenCV了解有关创建蒙太奇的更多信息 。

该 蒙太奇 然后通过显示 161线,直到按下一个键。

训练帕金森的探测器模型

图4:使用Python,OpenCV和机器学习(随机森林),我们使用他们的手绘螺旋对帕金森病患者进行了分类,准确率为83.33%。

让我们的帕金森病检测仪进行测试吧!

使用本教程的“下载”部分下载源代码和数据集。

从那里,导航到您下载.zip文件的位置,取消存档,然后执行以下命令来训练我们的“wave”模型:

$ python detect_parkinsons.py --dataset dataset/wave

[INFO] loading data...

[INFO] training model 1 of 5...

[INFO] training model 2 of 5...

[INFO] training model 3 of 5...

[INFO] training model 4 of 5...

[INFO] training model 5 of 5...

acc

===

u=0.7133, o=0.0452

sensitivity

===========

u=0.6933, o=0.0998

specificity

===========

u=0.7333, o=0.0730

检查我们的输出,你会发现我们在测试集上获得了71.33%的分类准确度,灵敏度为69.33%(真阳性率),特异性为73.33%(真阴性率)。

重要的是我们测量灵敏度和特异性:

  1. 敏感性衡量的是真正的积极因素,也被预测为积极因素。
  2. 特异性衡量的是真实的阴性,也被预测为阴性。

机器学习模型,尤其是医疗领域的机器学习模型,在平衡真正的积极因素和真正的负面因素时需要特别小心:

  • 我们不想将某人归类为“没有帕金森氏症”,因为他们实际上对帕金森氏症有积极作用。
  • 同样地,我们不想将某人归类为“帕金森氏阳性”,而实际上他们没有这种疾病。

现在让我们在“螺旋”图纸上训练我们的模型:

$ python detect_parkinsons.py --dataset dataset/spiral

[INFO] loading data...

[INFO] training model 1 of 5...

[INFO] training model 2 of 5...

[INFO] training model 3 of 5...

[INFO] training model 4 of 5...

[INFO] training model 5 of 5...

acc

===

u=0.8333, o=0.0298

sensitivity

===========

u=0.7600, o=0.0533

specificity

===========

u=0.9067, o=0.0327

这次我们在测试集上达到了83.33%的准确度灵敏度为76.00%特异性为90.67%。

从标准偏差来看,我们也可以看到差异越小,分布越紧凑。

时自动在手附图检测帕金森氏病,至少利用该特定数据集的情况下,“螺旋”图纸似乎是许多更多有用的信息。

相关源码关注微信公众号:“图像算法”或者微信搜索账号imalg_cn关注公众号回复parkinson 获取

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

如何使用OpenCV计算机视觉检测帕金森病图片 的相关文章

  • Argus camera API

    1 JETPACK CAMERA API LIBARGUS Advantage Open Standard Cross Platform Low level control of camera subsystem Frame based c
  • error: undefined reference to symbol '_ZN5boost6system15system_categoryEv

    使用boost时遇到下面error xff1a cmake version 3 5 1 usr bin ld CMakeFiles RGBD dir src ros rgbd cc o undefined reference to symb
  • ROS 使用signal 终止 Node

    在终端中使用ctrl 43 c可以强制终止运行的程序 xff0c 但有时需要在终止时作一些处理 xff08 如ros shotdown free等 xff09 xff0c 可使用信号函数作退出处理 头文件 include 34 csigna
  • flann error

    error usr include flann util serialization h 18 9 error class std unordered map lt unsigned int std vector lt unsigned i
  • 3个方法解决百度网盘限速

    转载自 lt 作者 xff1a 奔跑中的奶酪 原文链接 https www runningcheese com baiduyun gt 3个方法解决百度网盘限速 xff08 2019 06 20 更新 xff09 3个方法解决百度网盘限速
  • python 文件操作记录

    usr bin env python coding 61 utf 8 import os import shutil def getimagepath path file 61 open path data 61 file read lin
  • PCD格式保存

    coding utf 8 import time filename 61 34 1 txt 34 print 34 the input file name is r 34 filename start 61 time time print
  • 吴恩达机器学习笔记---持续更新

  • 边缘计算简介-1

  • 给Qt程序添加图片

    首先双击列表中的ui文件 xff0c 打开 设计器 然后从左侧列表拖一个 label 进去 然后右键点击 xff0c 出现菜单 xff0c 点击 改变样式表 然后在新出现的窗口里面输入image url 图片路径 jpg 比如 xff1a
  • 禁用win10自带的微软输入法!

    1 点击电脑主屏幕左下角开始图标 xff0c 选择设置 2 选择 时间和语言 gt 语言 gt 中文 3 单击选项 xff0c 删除微软拼音键盘即可 xff0c 这样就不会在不小心按到Ctrl 43 Shift建时 xff0c 出现切换输入
  • Office出现xukezheng问题,如何有效解决

    亲测有效哦 xff01 看原文原文出处 版本Office2019专业增强版
  • MatLab数据结构

    命名规则 xff1a 变量名区分大小写 必须以字母开头 xff0c 可以由字母 数字和下划线组成 xff0c 但不能使用标点 clc xff1a 清屏命令行窗口 clear all 清除工作区的变量 xff0c 但不清理命令行窗口 数据类型
  • MatLab矩阵运算

    1 矩阵构造及定义 A 61 1 3 5 7 8 9 构造多行矩阵 D 61 2 4 构造单行矩阵 B 61 1 2 9 最小值 xff1a 步长 xff1a 最大值 C 61 repmat D 4 3 将D的行重复四次 xff0c 列重复
  • MatLab补充

    1 matlab中所有的变量都是数组 x 61 4 实际是x数组 xff08 11大小 xff09 中存了4 y 61 6 9 是大小为12的数组存储y的数值 当您用空格 xff08 或逗号 xff09 分隔数值时 xff08 如前面的任务
  • MatLab使用注意事项

    1 在命令行输入指令 xff0c 当不加 xff1b 作为结尾时 xff0c 系统会在命令窗口输出数值 当使用 xff1b 作为命令结尾时 xff0c 系统不再输出数值 xff0c 但是会在工作区存储变量 对应的值 2 变量以字母开头 xf
  • EdgeCloudSim仿真实验平台使用介绍

    跑程序前的准备工作 xff1a Java环境配置 网上搜教程吧 xff0c 按着提示做就可以我使用的工具 xff1a Eclipse项目链接 xff1a 其中包含EdgeCloudSim英文说明文档和EdgeCloudSim工程文件夹 链接
  • 内存地址的应用

    学习python时真正了解了内存地址 cpu中的数据分类 cpu中的数据分为两类 xff1a 数据和指令 数据 xff1a 由指令产生的结果 指令 xff1a 键盘 鼠标等电脑输入设备操作以及人为对主机输入设备进行的目的性操作 值得注意的是
  • World插入图片显示不全

    在文档中直接插入图片 xff0c 显示不全 xff0c 具体的说是只能看到图片底部部分 给出两种办法解决 1 局部修改 把光标位置置于图片的末尾 xff0c 然后点击鼠标右键 xff0c 选择 段落 选项进入 段落 文本框 xff0c 选择
  • 快速消除Word文档中空格

    消除Word文档中的空格 0 待处理文档 1 选择文档的替换功能 2 选择 特殊格式 中的 段落标记p 3 设置成对应格式 4 选择全部替换 xff0c 效果如下 问题分析 xff1a 可以看出执行上述操作一次后 xff0c 相当于是扫描了

随机推荐

  • CCF推荐国际学术会议和期刊目录2019年

    链接 xff1a 全目录下载地址
  • 2022教资押题

    1 试题类型 2 具体文件夹 3 百度网盘链接 xff1a 链接 xff1a https pan baidu com s 17ZlLeE2E8Rzz7ELHptE8Fg 提取码 xff1a 9vky
  • 强化学习Q-learning入门教学

    1 问题描述 2 图形化展示 3 reward矩阵构建 4 Q表构建 这里需要说明的是Q表的转移规则原本是 xff1a 本例中为了方便介绍 xff0c 将 值设为1了 原文讲解的通俗易懂 xff0c 有兴趣的可以看一下 出处 xff1a h
  • 英文文献代码查找

    原文链接 xff1a https blog csdn net weixin 45656790 article details 109271019
  • Word中插入集合和元素的包含符号

    1 比较简单 xff0c 是元素和集合的包含关系 查找 xff1a word gt 插入 gt 符号栏下拉 xff0c 选择基础数学 2 集合间的包含关系 四个数字 xff0c 代表一个 输入文档中的指定位置 xff0c 选中数字以后 xf
  • 微信PC端聊天界面表情包无法显示

    我试成功的一个办法 xff0c 分享一下 具体步骤 xff1a 1 找到微信聊天界面的设置选项 xff0c 如图 2 进入微信文件保存位置 3 进入WeChat Files All Users config目录 4 删除config dat
  • MathType 提示需要一个新版本的MT Extra(True Type)字体

    1 打开C Windows Fonts文件夹 xff0c 若里面有MT Extra TrueType 字体或其快捷方式 xff0c 则将其删除 2 找到MathType安装目录下C Program Files x86 MathType Fo
  • Word快捷键设置上下标;Word取消表格虚线;Word查找数学符号

    问题1 快捷键设置上下角标 这个在论文写作时比较常用 xff0c 本人也是最近在写大论文 xff0c 遇到了这个情况 Word和Visio中 xff0c 都可以使用 步骤 xff1a 选中即将成为上下标的内容 xff0c 上标快捷键 xff
  • xcode中xib使用之轻松学习

    1 创建xib文件 在工程目录中New Files xff0c 选择user interface类型中的empty创建一个空的interface builder document文件 文件名没有强制的要求 xff0c 最好使用 前缀 xff
  • 用Opencv打造一台自动视觉目标跟踪系统

    平移 倾斜伺服装置 xff0c 帮助摄像机使用视觉自动跟踪颜色对象 简介 现在我们将使用我们的设备帮助相机自动跟踪颜色对象 xff0c 如下所示 xff1a OpenCV可免费用于学术和商业用途 它具有C 43 43 xff0c C xff
  • error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"【转载+修改】

    error Microsoft Visual C 43 43 14 0 is required Get it with Microsoft Visual C 43 43 Build Tools http landinghub visuals
  • 如何使用OpenCV实现多张图像拼接

    先来看看OpenCV官方的例子得到效果是非常的好 xff0c 输入的images如下 xff1a 效果 xff1a Stitcher类与detail命名空间 OpenCV提供了高级别的函数封装在Stitcher类中 xff0c 使用很方便
  • 如何使用OpenCV对物体进行搜索检测与识别

    在本教程中 xff0c 我们将了解对象检测中称为 选择性搜索 的重要概念 我们还将用C 43 43 和Python共享OpenCV代码 物体检测与物体识别 对象识别算法识别图像中存在哪些对象 它将整个图像作为输入 xff0c 并输出该图像中
  • 一种基于深度学习的方法来检测摩托车头盔的使用

    背景 据统计使用摩托车头盔可以将道路交通事故中摩托车驾驶员致命伤害的可能性降低42 xff05 xff0c 尽管如此 xff0c 遵守摩托车头盔还是较少 xff0c 尤其是在发展中国家 xff0c 为了有效开展针对性的头盔使用运动 xff0
  • 偏振光相机1——偏振光

    光的电磁波属性 光是一种电磁波 xff0c 这个概念大家应该不陌生 既然是电磁波 xff0c 那我们从电磁波的特性上来看它有哪些属性 用图1中的交变电磁场来描述光的特性 xff0c 电场和磁场在空间中相互垂直 xff0c 它们同时与光的传播
  • 偏振光相机2——索尼大法

    Stokes参量 在上一篇 偏振光相机 偏振光 中 xff0c 我们知道偏振光有线性偏振光 椭圆偏振光 圆偏光 那么如何定量的描述偏振光呢 xff1f Stokes矢量是一种广泛用来描述偏振光属性的方法 图1 不同类型的偏振光 线性偏振光和
  • 偏振光相机3——偏振应用

    在之前的2篇中 xff0c 介绍了偏振光的基本概念和基于SONY最新CMOS偏振传感器芯片的相机 在本篇中 xff0c 我们来看看偏振相机的一些应用 偏振相机的应用离不开偏振光 xff0c 那么先看看如何得到偏振光信息 如何获取偏光 在 偏
  • 【干货】生成对抗网络GANs算法在医学图像领域应用总结

    Goodfellow等人 介绍了生成对抗网络 xff08 GAN xff09 以模拟数据分布 由于与两个基本属性相关的原因 xff0c GAN可以合成真实图像 GAN是一种无监督的训练方法 xff0c 可以通过类似于人类学习图像特征的方式获
  • 图像算法之3D人脸识别技术原理概述

    随着深度学习技术的进步 xff0c 面部相关任务的研究也成为学术界和工业界的热门话题 众所周知的面部任务通常包括面部检测 xff0c 面部识别 xff0c 面部表情识别等 xff0c 其主要使用2D RGB面部 xff08 通常包括一些纹理
  • 如何使用OpenCV计算机视觉检测帕金森病图片

    在本教程中 xff0c 您将学习如何使用OpenCV和机器学习在手绘的螺旋和波浪图像中自动检测帕金森病 本教程来自来自巴西的博士生Joao Joao有兴趣利用计算机视觉和机器学习基于几何图形 xff08 即螺旋和符号波 xff09 自动检测