前端机器学习落地——检测员工是否不在工位!!!

364 阅读3分钟

前端机器学习——逻辑回归传送门

前端实现机器学习落地——检测员工是否不在工位

虽然不知道为什么要做这个。!。感觉像是自己给自己下套一样。

如何实现的

调用摄像头,获得图片,图片本质就是数组,那么我们就把图片这个数组当作逻辑回归的入参传入逻辑回归模型,然后根据先前的经验(我们点开这个网页要先录入几组在工位和不在工位的照片作为入参),然后点击开始检测就好了!

lsf的小玩意儿

lsf的小玩意儿
代码也就100多行,灰常简单的小玩意儿!

使用方式

先把代码复制下来,直接运行就好,点击开启摄像头,然后点击拍照,然后如果你在照片里就点击我在照片里,不在就点击我不在照片里,大概在照片里有个5张,不在照片里有个五张就好了,然后——开始检测,5s拍张照片,机器判断你不在照片里就会alert

代码

<!doctype html>
<html lang="en">
<head>
   <title>GET VIDEO</title>
   <meta charset="utf-8">
</head>
<body>
<input type="button" title="开启摄像头" value="开启摄像头" onclick="getMedia()" />
<video id="video" width="50px" height="50px" autoplay="autoplay"></video>
<canvas id="canvas" width="50px" height="50px"></canvas>
<button id="snap" onclick="takePhoto()">拍照</button>
<button id="snap" onclick="ifIn(0)">我在照片里</button>
<button id="snap" onclick="ifIn(1)">我不照片里</button>
<button id="snap" onclick="ok()">结束</button>
<button id="snap" onclick="auto()">开始检测</button>

<script>
   //获得video摄像头区域
   let video = document.getElementById("video")
   let x = []
   let y = []
   function getMedia() {
       let constraints = {
           video: {width: 50, height: 50},
           audio: true
       };
       /*
       这里介绍新的方法:H5新媒体接口 navigator.mediaDevices.getUserMedia()
       这个方法会提示用户是否允许媒体输入,(媒体输入主要包括相机,视频采集设备,屏幕共享服务,麦克风,A/D转换器等)
       返回的是一个Promise对象。
       如果用户同意使用权限,则会将 MediaStream对象作为resolve()的参数传给then()
       如果用户拒绝使用权限,或者请求的媒体资源不可用,则会将 PermissionDeniedError作为reject()的参数传给catch()
       */
       let promise = navigator.mediaDevices.getUserMedia(constraints)
       promise.then(function (MediaStream) {
           video.srcObject = MediaStream
           video.play()
       }).catch(function (PermissionDeniedError) {
           console.log(PermissionDeniedError)
   	})
   }
   function auto() {
   	setInterval(() => {
   		takePhoto()
   		ok()
   	}, 5000)
   }
   function ifIn(c) {
       let canvas = document.getElementById("canvas")
       let ctx = canvas.getContext('2d')
   	let imgData = ctx.getImageData(0, 0, 50, 50)
   	x.push(imgData.data)
   	y.push(c)
   }
   function takePhoto() {
       //获得Canvas对象
       let canvas = document.getElementById("canvas")
       let ctx = canvas.getContext('2d')
   	ctx.drawImage(video, 0, 0, 50, 50)
   }
   function ok() {
       let canvas = document.getElementById("canvas")
       let ctx = canvas.getContext('2d')
   	let imgData = ctx.getImageData(0, 0, 50, 50)
   	z = imgData.data
   	console.log(MySigmod(x,y,z))
   	if(MySigmod(x,y,z) < 0.5) {
   		alert('您不在工位了么?')
   	}
   }
   const MySigmod = function(x, y, z) {
   	//sigmod函数
   	const sigmod = function(z) {
   		let c = []
   		for(let i = 0; i < z.length; i++) {
   			c.push(1/(1+Math.exp(-z[i])))
   		}
   		return c
   	}
   	//梯度方向
   	const gradient = function(x, h, y) {
   		let g = []
   		for(let j = 0; j < x[0].length; j++) {
   			let c = 0
   			for(let i = 0; i < y.length; i++) {
   				c = c + x[i][j] * (h[i] - y[i])
   			}
   			c = c / y.length
   			g.push(c)
   		}
   		return g
   	}
   	//逻辑回归过程
   	function Logistic_Regression(x, y, lr=0.0000001, count=500) {
   		let w = []
   		for(let i = 0; i < x[0].length; i++) {
   			w.push(0)
   		}
   		for(let m = 0; m < count; m++) {
   			let z = []
   			for(let i = 0; i < x.length; i++) {
   				let item = 0
   				for(let j = 0; j < w.length; j++) {
   					item = item + x[i][j] * w[j]
   				}
   				z.push(item)
   			}
   			let h = sigmod(z)
   			let g = gradient(x, h, y)
   			for(let i = 0; i < w.length; i++) {
   				w[i] = w[i] - lr * g[i]
   			}
   			// l = loss(h, y)
   		}
   		return w
   	}

   	let w = Logistic_Regression(x,y)
   	//使用求出的权重系数尽心选择
   	let p = w[0]
   	for(let i = 0; i < z.length; i++) {
   		p = p + z[i] * w[i]
   	}
   	p = 1/(1+Math.exp(p))
   	return p
   }
</script>
</body>
</html>