pos機(jī)開機(jī)一直初始化怎么解決

 新聞資訊3  |   2023-09-03 11:42  |  投稿人:pos機(jī)之家

網(wǎng)上有很多關(guān)于pos機(jī)開機(jī)一直初始化怎么解決,你需要訓(xùn)練一只眼球追蹤AI嗎的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)開機(jī)一直初始化怎么解決的問題,今天pos機(jī)之家(www.shbwcl.net)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!

本文目錄一覽:

1、pos機(jī)開機(jī)一直初始化怎么解決

pos機(jī)開機(jī)一直初始化怎么解決

圓栗子 編譯整理

量子位 出品 | 公眾號(hào) QbitAI

啊,老板的眼神飛過來了,還不快切回工作界面?

從前,我們幾乎無從躲避來自身后的目光,但現(xiàn)在不一定了。

如果有個(gè)眼球追蹤AI,加上人臉識(shí)別,或許就能在被老板盯上的瞬間,進(jìn)入奮力工作模式。

戲是有點(diǎn)多。不過眼球追蹤這件事,只要有電腦的前置攝像頭,再有個(gè)瀏覽器,真的可以做到。

來自慕尼黑的程序猿Max Schumacher,就用TensorFlow.js做了一個(gè)模型,你看向屏幕的某一點(diǎn),它就知道你在看的是哪一點(diǎn)了。

我來訓(xùn)練一把

這個(gè)模型叫Lookie Lookie,不用服務(wù)器,打開攝像頭就可以在瀏覽器上訓(xùn)練,不出三分鐘就能養(yǎng)成一只小AI。

在下試了一試。

攝像頭拍到的畫面就顯示在屏幕左上角,臉上是綠色的輪廓,眼睛被一個(gè)紅色方框框住。

收集數(shù)據(jù)的方式很簡(jiǎn)單,只要四處移動(dòng)鼠標(biāo),眼睛跟著鼠標(biāo)走,然后隨時(shí)按下空格鍵,每按一次就采集一個(gè)數(shù)據(jù)點(diǎn)。

第一波,只要按20次空格,系統(tǒng)就提示,可以點(diǎn)擊訓(xùn)練按鈕了。

訓(xùn)練好之后,屏幕上出現(xiàn)一個(gè)綠圈圈。這時(shí)候,我的眼睛看哪里,綠圈圈都應(yīng)該跟著我走的。

可它似乎有些猶豫。系統(tǒng)又提示:現(xiàn)在數(shù)據(jù)不太夠,可能還沒訓(xùn)練好,再取一些數(shù)據(jù)吧。

那好,再取個(gè)二三十張圖,訓(xùn)練第二波。

果然,這次綠圈圈跑得自信了一些,左看右看它都馳騁 (比較) 如風(fēng)。

相比之下,對(duì)于上下移動(dòng)的目光,AI的反應(yīng)似乎沒有那么敏銳。大概是因?yàn)椋娔X屏幕上下距離不夠?qū)挘矍蜣D(zhuǎn)動(dòng)不充分吧。

不過,在訓(xùn)練數(shù)據(jù)如此貧乏的前提下,神經(jīng)網(wǎng)絡(luò)也算是茁壯成長了。

需要注意的是,收集數(shù)據(jù)的時(shí)候,臉不要離屏幕太遠(yuǎn) (也不要倒立) 。

DIY全攻略 (上) :架子搭起來

作為一個(gè)不需要任何服務(wù)器就能訓(xùn)練的模型,如果要處理整幅整幅的視頻截圖,負(fù)擔(dān)可能有些重。

所以,還是先檢測(cè)人臉,再框出眼睛所在的部分。只把這個(gè)區(qū)域 (上圖右一) 交給神經(jīng)網(wǎng)絡(luò)的話,任務(wù)就輕松了。

德國少年選擇了clmtrackr人臉檢測(cè)模型,它的優(yōu)點(diǎn)也是跑起來輕快。

那么,先把它下下來:

https://raw.githubusercontent.com/auduno/clmtrackr/dev/build/clmtrackr.js

然后,打開一個(gè)空的html文件,導(dǎo)入jQuery, TensorFlow.js,clmtrackr.js,以及main.js。代碼如下:

1 <!doctype html>2 <html>3 <body>4 <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>5 <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"></script>6 <script src="clmtrackr.js"></script>7 <script src="main.js"></script>8 </body>9 </html>

這樣,準(zhǔn)備活動(dòng)就做好了。下面正式開始。

導(dǎo)出視頻流

第一步,要經(jīng)過你 (用戶) 的同意,才能打開攝像頭,渲染視頻流,把畫面顯示在頁面上。

先寫這行代碼 (此處默認(rèn)用的是最新版本的Chrome) :

1 <video id="webcam" width="360px",height="auto" />

然后從main.js開始:

1 $(document).ready(function() {2 const video = $(\'#webcam\')[0];3 4 function onStreaming(stream) {5 video.srcObject = stream;6 }7 8 navigator.mediaDevices.getUserMedia({ video: true }).then(onStreaming);9 });

到這里,瀏覽器就該問你“要不要打開攝像頭”了。

找到你的臉

上文提到的clmtrackr.js人臉追蹤器,這里就出場(chǎng)。

先在const video=…下面,初始化追蹤器:

1 const ctrack = new clm.tracker();2 ctrack.init();

然后,在onStreaming() 里面,加下面這句話,就能讓追蹤器檢測(cè)視頻里的人臉了:

1 ctrack.start(video);

寫好這幾行,它應(yīng)該已經(jīng)能看出你的臉。不相信的話,就讓它描出來

這里需要一個(gè)繪圖工具。用html里面的<canvas>標(biāo)簽,在視頻上面重疊一張畫布

在<video>下面,寫上這一串代碼:

1 <canvas id="overlay" width="360px",height="auto" />

這樣,就有了跟視頻尺寸一樣的畫布。CSS能保證畫布和視頻的位置完全吻合。

瀏覽器每做一次渲染,我們就要在畫布上畫點(diǎn)什么了。畫之前,要先把之前畫過的內(nèi)容擦掉。

代碼長這樣,寫在ctrack.init() 下面:

1 const overlay = $(\'#overlay\')[0]; 2 const overlayCC = overlay.getContext(\'2d\'); 3 4 function trackingLoop() { 5 // Check if a face is detected, and if so, track it. 6 requestAnimationFrame(trackingLoop); 7 8 let currentPosition = ctrack.getCurrentPosition(); 9 overlayCC.clearRect(0, 0, 400, 300);10 11 if (currentPosition) {12 ctrack.draw(overlay);13 }14 }

現(xiàn)在,在onStreaming() 的ctrack.starg() 后面,調(diào)用trackingLoop() 。每一幀里,它都會(huì)重新運(yùn)行。

這個(gè)時(shí)候,刷新一下瀏覽器,你的臉上應(yīng)該有一個(gè)綠色又詭異的輪廓了。

眼睛截下來

這一步,是要在眼睛周圍畫個(gè)矩形框

cmltrackr很善良,除了畫個(gè)輪廓之外,還有70個(gè)面部特征,我們可以選擇自己需要的部分。

這里,選23、28、24、26就夠了,在每個(gè)方向上,往外擴(kuò)大5個(gè)像素。

然后,矩形框應(yīng)該足夠覆蓋重要面部信息了 (不離太遠(yuǎn)、不倒立) 。

現(xiàn)在,再拿另外一張畫布,來捕捉這個(gè)截下來的矩形。這張畫布50 x 25像素即可,只要把矩形框的尺寸調(diào)一下,就能放進(jìn)去:

1 <canvas id="eyes" width="360px",height="auto" />

下面這個(gè)函數(shù),會(huì)返回 (x,y) 坐標(biāo),以及矩形的長寬。給它輸入的是clmtrackr里面的位置陣列 (Position Array) :

1 function getEyesRectangle(positions) { 2 const minX = positions[23][0] - 5; 3 const maxX = positions[28][0] + 5; 4 const minY = positions[24][1] - 5; 5 const maxY = positions[26][1] + 5; 6 7 const width="360px",height="auto" />

接下來,要把矩形框提取出來。具體方法是,在第一張畫布上把它描成紅色,再復(fù)制到第二張畫布上。

替換trackingLoop() 里面的if塊:

1 if (currentPosition) { 2 // Draw facial mask on overlay canvas: 3 ctrack.draw(overlay); 4 5 // Get the eyes rectangle and draw it in red: 6 const eyesRect = getEyesRectangle(currentPosition); 7 overlayCC.strokeStyle = \'red\'; 8 overlayCC.strokeRect(eyesRect[0], eyesRect[1], eyesRect[2], eyesRect[3]); 910 // The video might internally have a different size, so we need these11 // factors to rescale the eyes rectangle before cropping:12 const resizeFactorX = video.videowidth="360px",height="auto" />

現(xiàn)在,應(yīng)該看得到眼睛周圍的紅色矩形框了。

DIY全攻略 (下) :訓(xùn)練與測(cè)試收集數(shù)據(jù)

眼球追蹤,收集數(shù)據(jù)的方法其實(shí)有很多種。不過,讓眼睛跟著鼠標(biāo)走,是最簡(jiǎn)單的,隨時(shí)按下空格都可以捕獲一幅圖像。

1 追蹤鼠標(biāo)

想知道鼠標(biāo)每時(shí)每刻都在什么位置,就給document.onmousemove加上一個(gè)EventListener。

這樣做還可以把坐標(biāo)歸一化 (轉(zhuǎn)化到 [-1, 1] 的范圍里) :

1 // Track mouse movement: 2 const mouse = { 3 x: 0, 4 y: 0, 5 6 handleMouseMove: function(event) { 7 // Get the mouse position and normalize it to [-1, 1] 8 mouse.x = (event.clientX / $(window).width="360px",height="auto" />

2 捕捉圖像

這里要做的是,按下空格鍵之后的任務(wù):從畫布上捕捉圖像,儲(chǔ)存為張量。

TensorFlow.js提供了一個(gè)助手函數(shù),叫tf.fromPixels() ,只要用它來儲(chǔ)存第二張畫布里走出的圖像,然后歸一化:

1 function getImage() { 2 // Capture the current image in the eyes canvas as a tensor. 3 return tf.tidy(function() { 4 const image = tf.fromPixels($(\'#eyes\')[0]); 5 // Add a batch dimension: 6 const batchedImage = image.expandDims(0); 7 // Normalize and return it: 8 return batchedImage.toFloat().div(tf.scalar(127)).sub(tf.scalar(1)); 9 });10 }

注意注意,雖然把所有數(shù)據(jù)做成一個(gè)大訓(xùn)練集也是可以的,但還是留一部分做驗(yàn)證集比較科學(xué),比如20%。

這樣,便與檢測(cè)模型的性能,以及確認(rèn)它沒有過擬合

以下是添加新數(shù)據(jù)點(diǎn)用的代碼:

1 const dataset = { 2 train: { 3 n: 0, 4 x: null, 5 y: null, 6 }, 7 val: { 8 n: 0, 9 x: null,10 y: null,11 },12 }1314 function captureExample() {15 // Take the latest image from the eyes canvas and add it to our dataset.16 tf.tidy(function() {17 const image = getImage();18 const mousePos = tf.tensor1d([mouse.x, mouse.y]).expandDims(0);1920 // Choose whether to add it to training (80%) or validation (20%) set:21 const subset = dataset[Math.random() > 0.2 ? \'train\' : \'val\'];2223 if (subset.x == null) {24 // Create new tensors25 subset.x = tf.keep(image);26 subset.y = tf.keep(mousePos);27 } else {28 // Concatenate it to existing tensors29 const oldX = subset.x;30 const oldY = subset.y;3132 subset.x = tf.keep(oldX.concat(image, 0));33 subset.y = tf.keep(oldY.concat(mousePos, 0));34 }3536 // Increase counter37 subset.n += 1;38 });39 }

最后,把空格鍵關(guān)聯(lián)進(jìn)來:

1 $(\'body\').keyup(function(event) {2 // On space key:3 if (event.keyCode == 32) {4 captureExample();56 event.preventDefault();7 return false;8 }9 });

至此,只要你按下空格,數(shù)據(jù)集里就會(huì)增加一個(gè)數(shù)據(jù)點(diǎn)了。

訓(xùn)練模型

就搭個(gè)最簡(jiǎn)單的CNN吧。

TensorFlow.js里面有一個(gè)和Keras很相似的API可以用。

這個(gè)網(wǎng)絡(luò)里,要有一個(gè)卷積層,一個(gè)最大池化,還要有個(gè)密集層,帶兩個(gè)輸出值 (坐標(biāo)) 的那種。

中間,加了一個(gè)dropout作為正則化器;還有,用flatten把2D數(shù)據(jù)降成1D。訓(xùn)練用的是Adam優(yōu)化器。

模型代碼長這樣:

1 let currentModel; 2 3 function createModel() { 4 const model = tf.sequential(); 5 6 model.add(tf.layers.conv2d({ 7 kernelSize: 5, 8 filters: 20, 9 strides: 1,10 activation: \'relu\',11 inputShape: [$(\'#eyes\').height(), $(\'#eyes\').width="360px",height="auto" />

訓(xùn)練開始之前,要先設(shè)置一個(gè)固定的epoch數(shù),再把批尺寸設(shè)成變量 (因?yàn)閿?shù)據(jù)集很小) :

1 function fitModel() { 2 let batchSize = Math.floor(dataset.train.n * 0.1); 3 if (batchSize < 4) { 4 batchSize = 4; 5 } else if (batchSize > 64) { 6 batchSize = 64; 7 } 8 9 if (currentModel == null) {10 currentModel = createModel();11 }1213 currentModel.fit(dataset.train.x, dataset.train.y, {14 batchSize: batchSize,15 epochs: 20,16 shuffle: true,17 validationData: [dataset.val.x, dataset.val.y],18 });19 }

然后,在頁面上做個(gè)訓(xùn)練按鈕吧:

1 <button id="train">Train!</button> 2 <style> 3 #train { 4 position: absolute; 5 top: 50%; 6 left: 50%; 7 transform: translate(-50%, -50%); 8 font-size: 24pt; 9 }10 </style>

還有JS:

1 <button id="train">Train!</button> 2 <style> 3 #train { 4 position: absolute; 5 top: 50%; 6 left: 50%; 7 transform: translate(-50%, -50%); 8 font-size: 24pt; 9 }10 </style>拉出來遛遛

綠色圈圈終于來了。AI判斷你在看哪,它就出現(xiàn)在哪。

先寫綠圈圈:

1 <div id="target"></div> 2 <style> 3 #target { 4 background-color: lightgreen; 5 position: absolute; 6 border-radius: 50%; 7 height: 40px; 8 width="360px",height="auto" />

然后,想讓綠圈圈動(dòng)起來,就要定期把眼睛圖像傳給神經(jīng)網(wǎng)絡(luò)。問它你在看哪,它就回答一個(gè)坐標(biāo):

1 function moveTarget() { 2 if (currentModel == null) { 3 return; 4 } 5 tf.tidy(function() { 6 const image = getImage(); 7 const prediction = currentModel.predict(image); 8 9 // Convert normalized position back to screen position:10 const targetwidth="360px",height="auto" />

間隔設(shè)的是100毫秒,不過也可以改的。

總之,大功告成。

鼻孔眼睛分不清?

眼球追蹤模型很有意思,不過還是有一些可愛的缺陷。

比如,算法還只能識(shí)別正面,臉稍微側(cè)一點(diǎn)AI就會(huì)困惑。

比如,有時(shí)候會(huì)把鼻孔識(shí)別成眼睛。

比如,必須整張臉都出現(xiàn)在畫面里,才能識(shí)別眼睛的所在,捂住嘴也不行。

△ 來自怪異君

Max也說,還有很多可以探索的空間。

自己訓(xùn)練傳送門:

https://cpury.github.io/lookie-lookie/

代碼實(shí)現(xiàn)傳送門:

https://github.com/cpury/lookie-lookie

教程原文傳送門:

https://cpury.github.io/learning-where-you-are-looking-at/

誠摯招聘

量子位正在招募編輯/記者,工作地點(diǎn)在北京中關(guān)村。期待有才氣、有熱情的同學(xué)加入我們!相關(guān)細(xì)節(jié),請(qǐng)?jiān)诹孔游还娞?hào)(QbitAI)對(duì)話界面,回復(fù)“招聘”兩個(gè)字。

量子位 QbitAI · 頭條號(hào)簽約作者

?\'?\' ? 追蹤AI技術(shù)和產(chǎn)品新動(dòng)態(tài)

以上就是關(guān)于pos機(jī)開機(jī)一直初始化怎么解決,你需要訓(xùn)練一只眼球追蹤AI嗎的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)開機(jī)一直初始化怎么解決的知識(shí),希望能夠幫助到大家!

轉(zhuǎn)發(fā)請(qǐng)帶上網(wǎng)址:http://www.shbwcl.net/newstwo/107358.html

你可能會(huì)喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 babsan@163.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。