当前位置: 首页 > 编程日记 > 正文

利用OpenCV、Python和Ubidots构建行人计数器程序(附完整代码)

作者 | Jose Garcia

译者 | 吴振东

校对 | 张一豪、林亦霖,编辑 | 于腾凯

来源 | 数据派(ID:datapi)

导读:本文将利用OpenCV,Python和Ubidots来编写一个行人计数器程序,并对代码进行了较为详细的讲解。


数字图像处理(DIP)技术目前发展非常迅速,这在很大程度上要归功于开发人员可以访问云来运用机器学习技术。通过云处理数字图像可以绕过任何专用硬件的要求,这使得使用DIP成为了大家的首选。作为处理图像最经济和最通用的方法,DIP已经被广泛应用。这种其中最常见的当属行人检测和计数 - 这对于机场、火车站、零售店体育馆、公共活动和博物馆来说都是一项非常有用的指标。

现有的传统行人计数技术不仅价格昂贵,而且它们所生成的数据通常与专有系统相关联,这些系统限制了数据提取和KPI的优化选择。相反,使用你的个人相机和SBC的嵌入式DIP不仅可以节省时间和金钱,还可以根据你所关注的KPI来自由定制应用程序,并从云中获取独特的领悟。

使用云来启用DIP IoT(物联网)应用程序可以增强整体的功能性。随着可视化、报告、警报和交叉引用外部数据源(如天气、实时供应商定价或业务管理系统)等功能的增强,DIP为开发人员提供了他们所需的自由空间。

想象一下一家摆着冰淇淋冰柜的杂货店:他们想要追踪统计经过店门口的人数,顾客所选择的产品,以及门被打开的次数和冰柜的内部温度。 从这几个数据点中,零售商可以运行相关性分析,以更好地了解和优化他们的产品定价和冰箱的整体能耗。

为了开启你的数字图像处理应用程序开发工作,Ubidots运用OpenCV和Python来创建了一套人员计数系统教程,用于分析统计给定区域中的人数。其实不仅是统计人数这样简单,添加Ubidots IoT开发平台的资源还可以扩展你的应用程序。在这里,你可以看到如何实现利用Ubidots来构建的实时人数统计仪表板。

在本文中,我们将介绍如何使用OpenCV和Ubidots来实现简单的DIP叠加并创建行人计数器。此示例最适用于任何基于Linux的发行版系统,也适用于Raspberry Pi,Orange Pi或类似的嵌入式系统。
有关其他集成的查询,请与Ubidots支持中心取得联系,以便来了解你的企业如何使用这项增值技术。

目录:

  1. 应用需求
  2. 编码 – 8个小节
  3. 测试
  4. 创造你自己的仪表板
  5. 结果展示


1、应用需求

  • 任何带有Ubuntu衍生版本的嵌入式Linux
  • 操作系统中安装了Python 3或更高版本
  • OS中安装了OpenCV 3.0或更高版本。如果使用Ubuntu或其衍生产品,请按照官方安装教程或运行以下命令:

pip install opencv-contrib-python

当你成功安装Python 3和OpenCV时,你可以通过这段简单的代码来进行检验(首先在你的terminal里输入‘python’)

import cv2 cv2.__version__

你应该在屏幕上看到你所安装的OpenCV版本:

640?wx_fmt=png

按照官方操作指南来安装Numpy,或者运行下面的命令
pip install numpy

安装imutils
pip install imutils

安装requests
pip install requests

2、编码

可以在这一章节找到检测和发送数据的整个例程。为了更好地解释这段代码,我们将其分为八个部分,以便更好地解释代码的各个方面,让你更容易理解。

第1节
from imutils.object_detection	
import non_max_suppression	
import numpy as np	
import imutils	
import cv2	
import requests	
import time	
import argparse	URL_EDUCATIONAL = "http://things.ubidots.com"	
URL_INDUSTRIAL = "http://industrial.api.ubidots.com"	
INDUSTRIAL_USER = True  # Set this to False if you are an educational user	
TOKEN = "...."  # Put here your Ubidots TOKEN	
DEVICE = "detector"  # Device where will be stored the result	
VARIABLE = "people"  # Variable where will be stored the result	# Opencv pre-trained SVM with HOG people features	
HOGCV = cv2.HOGDescriptor()	
HOGCV.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
在第1节中,我们导入必要的库来实现我们的探测器,imutils是一个有用的DIP库工具,让我们从结果中执行不同的转换,cv2是我们的OpenCV Python包装器,requests 可以通过HTTP发送数据/结果到Ubidots,argparse让我们从脚本中的命令终端来读取命令。

重要提示:不要忘记使用您的Ubidots帐户TOKEN更改这段代码,如果是学生用户,请务必将INDUSTRIAL_USER设置为FALSE。

导入库后,我们将对方向梯度直方图(Histogram of Oriented Gradient)进行初始化。方向梯度直方图的简称是HOG,它是最受欢迎的对象检测技术之一,已经在多个应用程序中实现并取得成功。OpenCV已经以高效的方式将HOG算法与支持向量机这种用于预测目的的经典机器学习技术(SVM)相结合,成为了一笔我们可以利用的财富。

这项声明:
cv2.HOGDescriptor_getDefaultPeopleDetector()调用了预先训练的模型,用于OpenCV的行人检测,并提供支持向量机特征的评估功能。

第2节
def detector(image):	'''	@image is a numpy array	'''	image = imutils.resize(image, width=min(400, image.shape[1]))	clone = image.copy()	(rects, weights) = HOGCV.detectMultiScale(image, winStride=(8, 8),	padding=(32, 32), scale=1.05)	# Applies non-max supression from imutils package to kick-off overlapped	# boxes	rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects])	result = non_max_suppression(rects, probs=None, overlapThresh=0.65)	return result

detector()函数是“神奇”诞生的地方,它可以接收分成三个颜色通道的RGB图像。为了避免出现性能问题,我们用imutils来调整图像大小,再从HOG对象调用detectMultiScale()方法。然后,检测多尺度方法可以让我们使用SVM的分类结果去分析图像并知晓人是否存在。关于此方法的参数介绍超出了本教程的范围,但如果你想了解更多信息,请参阅官方OpenCV文档或查看Adrian Rosebrock的精彩解释。

HOG分析将会生成一些捕获框(针对检测到的对象),但有时这些框的重叠会导致误报或检测错误。为了避免这种混淆,我们将使用imutils库中的非最大值抑制实用程序来删除重叠的框 - 如下所示:
640?wx_fmt=png
图片转载自
https://www.pyimagesearch.com

第3节
def localDetect(image_path):	result = []	image = cv2.imread(image_path)	if len(image) <= 0:	print("[ERROR] could not read your local image")	return result	print("[INFO] Detecting people")	result = detector(image)	# shows the result	for (xA, yA, xB, yB) in result:	cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2)	cv2.imshow("result", image)	cv2.waitKey(0)	cv2.destroyAllWindows()	return (result, image)

现在,在这一部分代码中,我们必须定义一个函数来从本地文件中读取图像并检测其中是否有人存在。为了实现这一点,我只是简单地调用了detector()函数并添加了一个简单的循环来绘制探测器的圆框。它会返回检测到的框的数量和带有绘制检测的图像。然后,只需在新的OS窗口中重新创建结果即可。

第4节
def cameraDetect(token, device, variable, sample_time=5):	cap = cv2.VideoCapture(0)	init = time.time()	# Allowed sample time for Ubidots is 1 dot/second	if sample_time < 1:	sample_time = 1	while(True):	# Capture frame-by-frame	ret, frame = cap.read()	frame = imutils.resize(frame, width=min(400, frame.shape[1]))	result = detector(frame.copy())	# shows the result	for (xA, yA, xB, yB) in result:	cv2.rectangle(frame, (xA, yA), (xB, yB), (0, 255, 0), 2)	cv2.imshow('frame', frame)	# Sends results	if time.time() - init >= sample_time:	print("[INFO] Sending actual frame results")	# Converts the image to base 64 and adds it to the context	b64 = convert_to_base64(frame)	context = {"image": b64}	sendToUbidots(token, device, variable,	len(result), context=context)	init = time.time()	if cv2.waitKey(1) & 0xFF == ord('q'):	break	# When everything done, release the capture	cap.release()	cv2.destroyAllWindows()	def convert_to_base64(image):	image = imutils.resize(image, width=400)	img_str = cv2.imencode('.png', image)[1].tostring()	b64 = base64.b64encode(img_str)	return b64.decode('utf-8')

与第3节的函数类似,第4节的函数将调用detector()方法和绘图框,并使用OpenCV中的VideoCapture()方法直接从网络摄像头检索图像。我们还稍微修改了officialOpenCV,从而在相机中获取图像,并且每隔“n”秒将结果发送到一个Ubidots帐户(sendToUbidots()函数将在本教程的后面部分进行回顾)。 函数convert_to_base64()会将图像转换为基本的64位字符串,这个字符串对于在HTML Canvas widget中使用JavaScript代码查看Ubidots中的结果非常重要。

第5节
def detectPeople(args):	image_path = args["image"]	camera = True if str(args["camera"]) == 'true' else False	# Routine to read local image	if image_path != None and not camera:	print("[INFO] Image path provided, attempting to read image")	(result, image) = localDetect(image_path)	print("[INFO] sending results")	# Converts the image to base 64 and adds it to the context	b64 = convert_to_base64(image)	context = {"image": b64}	# Sends the result	req = sendToUbidots(TOKEN, DEVICE, VARIABLE,	len(result), context=context)	if req.status_code >= 400:	print("[ERROR] Could not send data to Ubidots")	return req	# Routine to read images from webcam	if camera:	print("[INFO] reading camera images")	cameraDetect(TOKEN, DEVICE, VARIABLE)

这个方法旨在通过终端插入参数并触发例程,对本地存储的图像文件或通过网络摄像来搜索行人。

第6节
def buildPayload(variable, value, context):	return {variable: {"value": value, "context": context}}	def sendToUbidots(token, device, variable, value, context={}, industrial=True):	# Builds the endpoint	url = URL_INDUSTRIAL if industrial else URL_EDUCATIONAL	url = "{}/api/v1.6/devices/{}".format(url, device)	payload = buildPayload(variable, value, context)	headers = {"X-Auth-Token": token, "Content-Type": "application/json"}	attempts = 0	status = 400	while status >= 400 and attempts <= 5:	req = requests.post(url=url, headers=headers, json=payload)	status = req.status_code	attempts += 1	time.sleep(1)	return req

第6节的这两个函数是把结果发送给Ubidots从而理解和对数据进行可视化的两条主干道。第一个函数 def buildPayload是在请求中构建有效的负载,而第二个函数 def sendToUbidots则接收你的Ubidots参数(TOKEN,变量和设备标签)用于存储结果。在这种情况下,OpenCV可以检测到圆盒的长度。作为备选,也可以发送上下文来将结果存储为base64图像,以便稍后进行检索。

第7节
def argsParser():	ap = argparse.ArgumentParser()	ap.add_argument("-i", "--image", default=None,	help="path to image test file directory")	ap.add_argument("-c", "--camera", default=False,	help="Set as true if you wish to use the camera")	args = vars(ap.parse_args())	return args

对于第7节,我们即将完成对代码的分析。函数 argsParser()简单地解析并通过终端将脚本的参数以字典的形式返回。在解析器中有两个参数:
· image:在你的系统中图片文件的路径
· camera:这个变量如果设置为‘true’,那么就会调用cameraDetect()方法

第8节
def main():	args = argsParser()	detectPeople(args)	if __name__ == '__main__':	main()

第8节是我们主函数代码中的最终部分,只是用来获取console中的参数,然后发起指定的程序。
别忘了,全部的代码都可以从Github上下载。

3、测试

打开你最喜爱的代码编辑器(sublime-text,notepad,nano等),然后复制并粘贴此处所提供的完整代码。使用你特定的Ubidots TOKEN更新代码并将文件另存为“peopleCounter.py”。

正确保存代码后,让我们从Caltech Dataset和Pexels公共数据集中随机选择的下面四个图像来进行测试:

640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
为了对这些图像进行分析,首先你必须将图像存储在笔记本电脑或PC中,并记录好要分析图像的存放路径。

python peopleCounter.py PATH_TO_IMAGE_FILE

在我的例子中,我将图像存储在标记为“dataset”的路径中。要执行一项有效的命令,请运行以下命令,但请更换为你个人的文件存放路径。

python peopleCounter.py -i dataset/image_1.png

如果你希望是从相机而不是本地文件中获取图像,只需运行以下命令:

python peopleCounter.py -c true

测试结果:
640?wx_fmt=png

除了这种查看测试结果的方式之外,你还可以实时查看存储在Ubidots帐户中的测试的结果:

4、创造你自己的仪表板

我们将使用HTML Canvas来实时观察所取得的结果,本教程不对HTML canvas widget做讲解,如果你不了解如何使用它们,请参阅以下文章:

  • Canvas Widget Examples
  • Canvas Widget Introductory Demo
  • Canvas Creating a Real Time Widget


我们将使用基本的实时示例加上微小的修改,便于观看我们的图像。 你可以在下面看到关于widget的代码。

HTML	
<img id="img" width="400px" height="auto"/>	
JS	
var socket;	
var srv = "industrial.ubidots.com:443";	
// var srv = "app.ubidots.com:443"  // Uncomment this line if you are an educational user	
var VAR_ID = "5ab402dabbddbd3476d85967"; // Put here your var Id	
var TOKEN = ""  // Put here your token	
$( document ).ready(function() {	function renderImage(imageBase64){	if (!imageBase64) return;	$('#img').attr('src', 'data:image/png;base64, ' + imageBase64);	
}	// Function to retrieve the last value, it runs only once  	
function getDataFromVariable(variable, token, callback) {	var url = 'https://things.ubidots.com/api/v1.6/variables/' + variable + '/values';	var headers = {	'X-Auth-Token': token,	'Content-Type': 'application/json'	};	$.ajax({	url: url,	method: 'GET',	headers: headers,	data : {	page_size: 1	},	success: function (res) {	if (res.results.length > 0){	renderImage(res.results[0].context.image);	}	callback();	}	});	
}	// Implements the connection to the server	
socket = io.connect("https://"+ srv, {path: '/notifications'});	
var subscribedVars = [];	// Function to publish the variable ID	
var subscribeVariable = function (variable, callback) {	// Publishes the variable ID that wishes to listen	socket.emit('rt/variables/id/last_value', {	variable: variable	});	// Listens for changes	socket.on('rt/variables/' + variable + '/last_value', callback);	subscribedVars.push(variable);	
};	// Function to unsubscribed for listening	
var unSubscribeVariable = function (variable) {	socket.emit('unsub/rt/variables/id/last_value', {	variable: variable	});	var pst = subscribedVars.indexOf(variable);	if (pst !== -1){	subscribedVars.splice(pst, 1);	}	
};	var connectSocket = function (){	// Implements the socket connection	socket.on('connect', function(){	console.log('connect');	socket.emit('authentication', {token: TOKEN});	});	window.addEventListener('online', function () {	console.log('online');	socket.emit('authentication', {token: TOKEN});	});	socket.on('authenticated', function () {	console.log('authenticated');	subscribedVars.forEach(function (variable_id) {	socket.emit('rt/variables/id/last_value', { variable: variable_id });	});	});	
}	/* Main Routine */	
getDataFromVariable(VAR_ID, TOKEN, function(){	connectSocket();	
});	connectSocket();	//connectSocket();	
// Subscribe Variable with your own code.	
subscribeVariable(VAR_ID, function(value){	var parsedValue = JSON.parse(value);	console.log(parsedValue);	//$('#img').attr('src', 'data:image/png;base64, ' + parsedValue.context.image);	renderImage(parsedValue.context.image);	})	
});

不要忘记把你的帐户TOKEN和变量ID放在代码段的开头。

第三部分的LIBRARIES

增加下面第三部分的libraries:

  • https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
  • https://iot.cdnedge.bluemix.net/ind/static/js/libs/socket.io/socket.io.min.js
  • 当你保存你的widget,你可以获得类似于下面的结果:

640?wx_fmt=png

5、结果展示

640?wx_fmt=png

在此链接中你可以看到带有结果的仪表板。

在本文中,我们探讨了如何使用DIP(图像处理),OpenCV和Ubidots来创建物联网人员计数器。通过这些服务,在对人物、场景或事物的检测与识别问题上,你的DIP应用程序会比PIR或其他光学传感器更加准确 – 这套程序提供了高效的行人计数器,而且不需要对早期数据的静态进行任何操作。

做一个快乐的码农!

关于作者Jose García:

UIS电子工程师,Ubuntu用户,布卡拉曼加人,程序员,有时很无聊,想要环游世界但却没太有希望完成这一梦想。 硬件和软件开发人员@Ubidots
译者介绍:
法国洛林大学计算机与决策专业硕士。现从事人工智能和大数据相关工作,以成为数据科学家为终生奋斗目标。来自山东济南,不会开挖掘机,但写得了Java、Python和PPT。

原文标题:
People Counting with OpenCV, Python & Ubidots
原文链接:
https://ubidots.com/blog/people-counting-with-opencv-python-and-ubidots/

(*本文为AI科技大本营转载文章,转载联系作者)

精彩推荐


倒计时!由易观携手CSDN联合主办的第三届易观算法大赛还剩 5 天,冠军团队将获得3万元!

本次比赛主要预测访问平台的相关事件的PV,UV流量(包括Web端,移动端等),大赛将会提供相应事件的流量数据,以及对应时间段内的所有事件明细表和用户属性表等数据,进行模型训练,并用训练好的模型预测规定日期范围内的事件流量。

推荐阅读

  • 知乎算法团队负责人孙付伟:Graph Embedding在知乎的应用实践

  • 大数据工程师手册:全面系统的掌握必备知识与工具

  • 经典再读 | NASNet:神经架构搜索网络在图像分类中的表现

激光雷达,马斯克看不上,却又无可替代?

  • 卷积神经网络中十大拍案叫绝的操作

  • Docker是啥?容器变革的火花?

  • 5大必知的图算法,附Python代码实现

  • 阿里云弹性计算负责人蒋林泉:亿级场景驱动的技术自研之路

640?wx_fmt=png
你点的每个“在看”,我都认真当成了喜欢

相关文章:

开源软件License汇总

开源软件英文为Open Source Software&#xff0c;简称OSS&#xff0c;又称开放源代码软件&#xff0c;是一种源代码可以任意获取的计算机软件&#xff0c;这种软件的著作权持有人在软件协议的规定之下保留一部分权利并允许用户学习、修改以及以任何目的向任何人分发该软件。 某…

前深度学习时代CTR预估模型的演化之路:从LR到FFM\n

本文是王喆在 AI 前线 开设的原创技术专栏“深度学习 CTR 预估模型实践”的第二篇文章&#xff08;以下“深度学习 CTR 预估模型实践”简称“深度 CTR 模型”&#xff09;。专栏第一篇文章回顾&#xff1a;《深度学习CTR预估模型凭什么成为互联网增长的关键&#xff1f;》。重看…

神器与经典--sp_helpIndex

每每和那些NB的人学习技术的时候&#xff0c;往往都佩服他们对各个知识点都熟捻于心,更佩服的是可以在很短时间找出很多业界大师写的文章和开发的工具,就像机器猫的口袋&#xff0c;让人羡慕嫉妒恨啊&#xff01;宋沄剑宋桑就是其中之一,打劫其硬盘的念头已计划很久,只待时机成…

评分9.7!这本Python书彻底玩大了?程序员:真香!

「超级星推官/每周分享」是一个围绕程序员生活、学习相关的推荐栏目。CSDN出品&#xff0c;每周发布&#xff0c;暂定5期。关键词&#xff1a;靠谱&#xff01;优质&#xff01;本期内容&#xff0c;我们将抽1人送出由我司程序员奉为“超级神作”的《疯狂Python讲义》1本&#…

Caffe源码中caffe.proto文件分析

Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件&#xff0c;这里介绍下caffe.proto文件。在src/caffe/proto目录下有一个caffe.proto文件。proto目录下除了caffe.proto文件外&#xff0c;还有caffe.pb.h和caffe.pb.cc两个文件&#xff0c;此两个文件是根…

这套完美的Java环境安装教程,完整,详细,清晰可观,让你一目了然,简单易懂。⊙﹏⊙...

JDK下载与安装教程 2017年06月18日 22:53:16 Danishlyy1995 阅读数&#xff1a;349980版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/u012934325/article/details/73441617学习JAVA&#xff0c;必须得安装一下JDK(java dev…

【畅谈百度轻应用】云时代·轻应用·大舞台

云时代轻应用大舞台刘志勇君不见&#xff0c;上下班的地铁上&#xff0c;低头看手机&#xff1b;同事吃饭聊天&#xff0c;低头看手机&#xff1b;甚至朋友聚会&#xff0c;忙里偷闲打个招呼&#xff0c;然后继续低头看手机。正如微博上一个流传甚广的段子&#xff1a;“世界上…

如何画出高级酷炫的神经网络图?优秀程序员都用了这几个工具

&#xff08;图片付费下载于视觉中国&#xff09;作者 | 言有三 来源 | 有三AI&#xff08;ID&#xff1a;yanyousan_ai&#xff09;【导读】本文我们聊聊如何才能画出炫酷高大上的神经网络图&#xff0c;下面是常用的几种工具。1、NN-SVGNN-SVG 可以非常方便的画出各种类型的…

OpenBLAS简介及在Windows7 VS2013上源码的编译过程

OpenBLAS(Open Basic Linear Algebra Subprograms)是开源的基本线性代数子程序库&#xff0c;是一个优化的高性能多核BLAS库&#xff0c;主要包括矩阵与矩阵、矩阵与向量、向量与向量等操作。它的License是BSD-3-Clause&#xff0c;可以商用&#xff0c;目前最新的发布版本是0.…

技本功丨请带上纸笔刷着看:解读MySQL执行计划的type列和extra列

本萌最近被一则新闻深受鼓舞&#xff0c;西工大硬核“女学神”白雨桐&#xff0c;获6所世界顶级大学博士录取通知书。货真价值的才貌双全&#xff0c;别人家的孩子高考失利与心仪的专业失之交臂&#xff0c;选择了软件工程这门自己完全不懂的专业.即便全部归零&#xff0c;也要…

精美素材分享:16套免费的扁平化图标下载

在这篇文章中你可以看到16套华丽的扁平化图标素材&#xff0c;对于设计师来说非常有价值&#xff0c;能够帮助他们节省大量的时间。这些精美的扁平化图标可用于多种用途&#xff0c;如&#xff1a;GUI 设计&#xff0c;印刷材料&#xff0c;WordPress 主题&#xff0c;演示&…

Caffe源码中math_functions文件分析

Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件&#xff0c;这里介绍下math_functions文件。1. include文件&#xff1a;(1)、<glog/logging.h>&#xff1a;GLog库&#xff0c;它是google的一个开源的日志库&#xff0c;其使用可以参考&…

论文推荐 | 目标检测中不平衡问题算法综述

&#xff08;图片付费下载于视觉中国&#xff09;作者 | CV君来源 | 我爱计算机视觉&#xff08;ID&#xff1a;aicvml&#xff09;今天跟大家推荐一篇前几天新出的投向TPAMI的论文&#xff1a;Imbalance Problems in Object Detection: A Review&#xff0c;作者详细考察了目标…

php使用redis的GEO地理信息类型

redis3.2中增中了对GEO类型的支持&#xff0c;该类型存储经纬度&#xff0c;提供了经纬设置&#xff0c;查询&#xff0c;范围查询&#xff0c;距离查询&#xff0c;经纬度hash等操作。 <?php$redis new Redis(); $redis->connect(127.0.0.1, 6379, 60); $redis->au…

Caffe源码中syncedmem文件分析

Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件&#xff0c;这里介绍下syncedmem文件。1. include文件&#xff1a;(1)、<caffe/common.hpp>&#xff1a;此文件的介绍可以参考&#xff1a;http://blog.csdn.net/fengbingchun/article/detail…

免费开源!新学期必收藏的AI学习资源,从课件、工具到源码都齐了

&#xff08;图片付费下载于视觉中国&#xff09;整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;2019 年 3 月 28 日&#xff0c;教育部公布了 2018 年度普通高等学校本科专业备案和审批结果&#xff0c;共有 35 所大学新增了独立的人工智能专…

win7利用remote连接服务器,显示发生身份验证错误 要求的函数不受支持

先参考1&#xff1a; https://blog.csdn.net/qq_35880699/article/details/81240010 发现我根本没找到oracle修正的那个文件&#xff01; 然后我搜索&#xff1a;win7没有oracle修正文件&#xff0c;-------按照参考2中的链接操作&#xff0c;我发现我根本没有CredSSP文件&…

java参数传递:值传递还是引用传递

2019独角兽企业重金招聘Python工程师标准>>> 基本类型作为参数传递时&#xff0c;是传递值的拷贝&#xff0c;无论你怎么改变这个拷贝&#xff0c;原值是不会改变的&#xff1b; 在Java中对象作为参数传递时&#xff0c;是把对象在内存中的地址拷贝了一份传给了参数…

干货 | 收藏!16段代码入门Python循环语句

&#xff08;图片付费下载于视觉中国&#xff09;作者 | 李明江 张良均 周东平 张尚佳&#xff0c;本文摘编自《Python3智能数据分析快速入门》来源 | 大数据&#xff08;ID&#xff1a;hzdashuju&#xff09;【导读】本文将重点讲述for语句和while语句。for语句属于遍历循环&a…

Intel TBB简介及在Windows7 VS2013上源码的编译过程

Intel TBB(Intel Threading Building Blocks)是Intel线程构建块开源库&#xff0c;它的License是Apache 2.0.Intel TBB是一种用于并行编程的基于C语言的框架&#xff0c;它是一套C模板库。它提供了大量特性&#xff0c;具有比线程更高程度的抽象。Intel TBB可以在Windows、Linu…

react中ref的使用

在react中获取真实dom的时候就需要用到ref属性&#xff0c;具体使用如下 var MyComponent React.createClass({handleClick: function() {console.log(this.input)},render: function() {return (<div><input type"text" ref{(input) > {this.input in…

Caffe源码中blob文件分析

Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件&#xff0c;这里介绍下include/caffe/blob.hpp文件的内容&#xff1a;1. Include文件&#xff1a;(1)、<caffe/common.hpp>&#xff1a;此文件的介绍可以参考&#xff1a;http://…

jQuery之替换节点

如果要替换节点&#xff0c;jQuery提供了两个方法&#xff1a;replaceWith()和replaceAll()。 两个方法的作用相同&#xff0c;只是操作颠倒了。 作用&#xff1a;将所有匹配的元素都替换成指定的HTML或者DOM元素。&#xff08;摘自《锋利的jQuery(第二版)》P72&#xff09; 基…

比特大陆发布第三代AI芯片,INT8算力达17.6Tops

9月17日&#xff0c;福州城市大脑暨闽东北信息化战略合作发布会在数字中国会展中心隆重召开。本次发布会上&#xff0c;比特大陆正式推出了第三代AI芯片BM1684&#xff0c;同时也宣布BM1684将作为底层算力&#xff0c;赋能福州城市大脑&#xff0c;助力数字福州、数字中国的建设…

在 Azure 网站上使用 Memcached 改进 WordPress

编辑人员注释&#xff1a;本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 和 Windows Azure 网站开发人员体验合作伙伴共同撰写。 您是否希望改善在 Azure 网站服务上运行的 WordPress 网站的性能&#xff1f;如果是&#xff0c;那么您就需要一个可帮助加快您…

Caffe源码中io文件分析

Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件&#xff0c;这里介绍下include/caffe/util/io.hpp文件的内容&#xff1a;1. include文件&#xff1a;(1)、<google/protobuf/message.h>&#xff1a;关于protobuf的介绍可以参考&…

DeepMind悄咪咪开源三大新框架,深度强化学习落地希望再现

作者 | Jesus Rodriguez译者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】近几年&#xff0c;深度强化学习&#xff08;DRL&#xff09;一直是人工智能取得最大突破的核心。尽管取得了很多进展&#xff0c;但由于缺乏工具和库&#xff0c;DRL 方法仍…

seq2seq

链接&#xff1a; https://blog.csdn.net/wuzqchom/article/details/75792501 转载于:https://www.cnblogs.com/yttas/p/10631442.html

vip能ping通,但80不通的解决方法

最近遇到一个很奇怪的问题&#xff0c;在做两台服务器负载均衡的时候&#xff0c;vip已经添加了&#xff0c;而且能ping通了&#xff0c;但是页面访问不了&#xff0c;也就是说80端口一直不通&#xff0c;ipvsadm -lnc查看链接状态全部是SYN_RECV。网上找了好长时间&#xff0c…

OpenCV中imread/imwrite与imdecode/imencode的异同

OpenCV中的cv::imdecode函数是从指定的内存缓存中读一幅图像&#xff0c;而cv::imencode是将一幅图像写进内存缓存中。cv::imread是从指定文件载入一幅图像&#xff0c;cv::imwrite是保存一幅图像到指定的文件中。cv::imread和cv::imdecode内部都是通过ImageDecoder类来进行图像…