在上一篇文章“讓現(xiàn)實(shí)世界的情感為人工智能所用(一)”中,我們介紹了本項(xiàng)目的背景內(nèi)容和工作流程,以及運(yùn)作時(shí)所需的物料、工具和其他資源。接下來(lái),我們要按照下文“軟件”一節(jié)中的步驟讓整個(gè)設(shè)備運(yùn)作起來(lái)。 軟件 圖6:默認(rèn)的Raspbian操作系統(tǒng)提供了編輯Python腳本以適合您的項(xiàng)目所需的所有工具 在本節(jié)中,我們將詳細(xì)介紹本項(xiàng)目軟件方面的內(nèi)容。本項(xiàng)目已在Raspbian的Buster版本上通過(guò)測(cè)試,此為撰寫本文時(shí)的最新版本。本項(xiàng)目在樹莓派3B+和樹莓派4上都進(jìn)行了測(cè)試。 如果您沒(méi)有任何將Raspbian OS刷入microSD存儲(chǔ)卡的經(jīng)驗(yàn),我們建議您使用Etcher應(yīng)用程序,該工具可通過(guò)Google搜索到;同時(shí)請(qǐng)按照這份教程來(lái)操作。 最后一點(diǎn),如果您的樹莓派4無(wú)法啟動(dòng),則EEPROM可能已損壞。請(qǐng)按照這些步驟來(lái)修復(fù)該問(wèn)題。 本指南余下的部分將重點(diǎn)介紹完成樹莓派初始設(shè)置并將其成功連接到Internet之后要采取的步驟。 安裝OpenVINO和經(jīng)過(guò)訓(xùn)練的神經(jīng)網(wǎng)絡(luò)模型 要在您自己的樹莓派上啟動(dòng)并運(yùn)行本項(xiàng)目,您最好擁有通過(guò)命令行在Linux中導(dǎo)航的經(jīng)驗(yàn)。以下是我們啟動(dòng)和運(yùn)行英特爾OpenVINO軟件所遵循的步驟。在得到指示前,請(qǐng)勿安裝神經(jīng)計(jì)算棒。 $sudo mkdir -p /opt/intel/openvino $cd ~/Downloads/ $wget –no-check-certificate https://download.01.org/opencv/2 ... an_p_2019.2.242.tgz $sudo tar -xf l_openvino_toolkit_runtime_raspbian_p_2019.2.242.tgz --strip 1 -C /opt/intel/openvino $sudo apt install cmake $source /opt/intel/openvino/bin/setupvars.sh $echo "source /opt/intel/openvino/bin/setupvars.sh" >> ~/.bashrc 要測(cè)試是否一切正常,請(qǐng)打開一個(gè)新的終端,此時(shí)您應(yīng)該看到這樣的內(nèi)容: [setupvars.sh] OpenVINO environment initialized 如果操作成功,接下來(lái)繼續(xù)在原先的終端窗口中操作。 $sudo usermod -a -G users "$(whoami)" $sh /opt/intel/openvino/install_dependencies/install_NCS_udev_rules.sh $sudo apt-get install -y python3-picamera $sudo -H pip3 install imutils --upgrade $git clone https://github.com/Mouser-Electr ... ysicalComputing.git $cd Emotions_and_PhysicalComputing 最后,如果您使用的是OV5647攝像頭,請(qǐng)執(zhí)行以下操作: $python3 main.py -wd 320 -ht 240 -numncs 2 -cm 1 或者,如果您使用的是USB攝像頭,請(qǐng)執(zhí)行以下操作: $python3 main.py -wd 320 -ht 240 -numncs 2 -cm 0 接下來(lái),讓我們更深入地研究Python文件。 項(xiàng)目文件 本項(xiàng)目GitHub存儲(chǔ)庫(kù)的Software文件夾中有以下源代碼文件: ● main.py:我們需要在此Python腳本中添加特定于項(xiàng)目的代碼,以便獲取神經(jīng)網(wǎng)絡(luò)的輸出,并根據(jù)推斷出的情感,通過(guò)伺服電機(jī)在現(xiàn)實(shí)世界中執(zhí)行操作。 ● face-detection-retail-0004.xml:包含用于檢測(cè)為其呈現(xiàn)的圖像中是否存在人臉的神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)拓?fù)洹?br /> ● face-detection-retail-0004.bin:包含用于檢測(cè)為其呈現(xiàn)的圖像中是否存在人臉的神經(jīng)網(wǎng)絡(luò)的權(quán)值和閾值。 ● emotions-recognition-retail-0003.xml:包含用于檢測(cè)人臉圖像所呈現(xiàn)表情的神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)拓?fù)洹?br /> ● emotions-recognition-retail-0003.bin:包含用于檢測(cè)人臉圖像所呈現(xiàn)表情的神經(jīng)網(wǎng)絡(luò)的權(quán)值和閾值。 庫(kù) 借助預(yù)處理程序的#include指令,可以將庫(kù)添加到項(xiàng)目中。此舉有利于代碼重用;除非您有非常特殊的需求,否則沒(méi)有必要自己從頭重新編寫代碼。本項(xiàng)目用到了下面這些庫(kù): ● sys:提供與解釋器進(jìn)行交互所需的變量和函數(shù),例如將命令行參數(shù)傳遞給Python腳本。 ● numpy:也稱為NumPy,是一個(gè)軟件包,其中包含供腳本使用的高級(jí)數(shù)學(xué)函數(shù)。 ● os:用來(lái)訪問(wèn)和操作系統(tǒng)相關(guān)的函數(shù),例如與文件系統(tǒng)和輸入/輸出相對(duì)接。 ● time:該庫(kù)提供與時(shí)間相關(guān)的函數(shù),例如從系統(tǒng)獲取日期和時(shí)間,或通過(guò)sleep()設(shè)置延遲。 ● multiprocessing:該庫(kù)提供了一種機(jī)制,用于生成可以同時(shí)運(yùn)行的多個(gè)進(jìn)程。 ● gpiozero:該庫(kù)提供的函數(shù)可與帶有各種執(zhí)行器和傳感器(例如伺服電機(jī)和LED)的40引腳GPIO接頭進(jìn)行交互。 ● openvino.inference_engine:使Python腳本能夠與NCS2設(shè)備上的推測(cè)引擎進(jìn)行交互。 ● heapq:該庫(kù)提供了堆隊(duì)列算法的一種實(shí)現(xiàn)。堆隊(duì)列是一種優(yōu)先級(jí)隊(duì)列,它實(shí)現(xiàn)了一個(gè)二叉樹,其中優(yōu)先級(jí)最低的元素始終保留在根節(jié)點(diǎn)位置。 ● threading:該庫(kù)提供了多線程機(jī)制,使并發(fā)線程能夠立刻運(yùn)行。 ● pivideostream:該庫(kù)提供了一種與攝像頭交互的機(jī)制。 ● imutils:該庫(kù)提供了一組圖像處理函數(shù),例如旋轉(zhuǎn)、平移和調(diào)整大小。 變量和常量 main.py文件中包含多個(gè)變量,這些變量使我們能夠與NCS2設(shè)備和伺服電機(jī)進(jìn)行交互。 以下為gpizero庫(kù)的伺服模型實(shí)例,每個(gè)伺服電機(jī)都有這樣的一個(gè)實(shí)例: happyServo =Servo(12) sadServo =Servo(13) angreyServo= Servo(18) 這些變量用于提取由NCS2檢測(cè)到的情緒,供Python腳本中的其他方法使用: emotion =str(object_info[7]) LABELS =["neutral", "happy", "sad", "surprise","anger"] 在main.py源文件大約333行處,需要添加本項(xiàng)目最重要的一段代碼: … out self.exec_net.requests[dev].outputs["prob_emotion"].flatten() emotion =LABELS[int(np.argmax(out))] if emotion== "happy": setServosHappy() else ifemotion == "sad": setServosSad() else ifemotion == "anger": setServosAngry() else: setServosNeutral() detection_list.extend([emotion]) self.resultsEm.put([detection_list]) self.inferred_request[dev]= 0 … 函數(shù) ● setServosHappy():檢測(cè)到快樂(lè)表情時(shí),此函數(shù)會(huì)將GPIO12上的伺服電機(jī)設(shè)置為最大位置,同時(shí)將GPIO13和GPIO18設(shè)置為最小位置。 ● setServosSad():檢測(cè)到悲傷表情時(shí),此函數(shù)會(huì)將GPIO13上的伺服電機(jī)設(shè)置為最大位置,同時(shí)將GPIO12和GPIO18設(shè)置為最小位置。 ● setServosAngry():檢測(cè)到憤怒表情時(shí),此函數(shù)會(huì)將GPIO18上的伺服電機(jī)設(shè)置為最大位置,同時(shí)將GPIO12和GPIO13設(shè)置為最小位置。 ● setServosNeutral():當(dāng)檢測(cè)不到人臉或者人臉上沒(méi)有表情(中性)時(shí),此函數(shù)會(huì)將所有伺服電機(jī)設(shè)置為最小位置。 運(yùn)行項(xiàng)目 組裝好項(xiàng)目并且安裝好軟件后,我們就可以把它運(yùn)行起來(lái)了,這真是激動(dòng)人心的時(shí)刻! 1、在終端中輸入以下命令: $cd ~/Downloads/Emotions_and_PhysicalComputing 如果使用的是OV5647攝像頭: $python3 main.py -wd 320 -ht 240 -numncs 2 -cm 1 或者,如果使用的是USB攝像頭: $python3 main.py -wd 320 -ht 240 -numncs 2 -cm 0 圖7:終端和攝像頭輸出 2、屏幕上會(huì)彈出一個(gè)小窗口,顯示攝像頭的視頻輸入以及一些文本和方框。 3、確保環(huán)境光線充足,然后站在鏡頭前,擺出快樂(lè)、悲傷和憤怒的表情。 4、檢測(cè)到的面部表情類型應(yīng)顯示在屏幕上以及終端窗口中。 5、伺服器應(yīng)正常工作,并根據(jù)您所做出的表情上下移動(dòng)花朵。人工智能真的實(shí)現(xiàn)了物理計(jì)算! 故障排除提示 1、首次運(yùn)行伺服電機(jī)時(shí),請(qǐng)?jiān)谒欧姍C(jī)已連接到樹莓派但尚未連接到機(jī)械組件的情況下運(yùn)行代碼。萬(wàn)一代碼導(dǎo)致伺服電機(jī)的移動(dòng)方向與實(shí)際安裝方向相反,此舉可以確保伺服電機(jī)不會(huì)受到損壞。 2、如果您用錯(cuò)了針對(duì)USB攝像頭的標(biāo)志和針對(duì)OV5647攝像頭的標(biāo)志,可能會(huì)出現(xiàn)問(wèn)題。請(qǐng)務(wù)必對(duì)OV5647攝像頭使用-cm 1、對(duì)USB攝像頭使用-cm 0。 請(qǐng)確保您使用的是低壓伺服電機(jī),并且使用樹莓派的5V引腳而非3V引腳。此外,也可以考慮配置專用于伺服電機(jī)的外部電源。請(qǐng)確保將接地線連接在一起。 圖8:圖中所示為滑塊機(jī)構(gòu)的設(shè)計(jì)概念,通過(guò)兩塊6英寸寬、帶有兩個(gè)反向45度切割斜面的松木塊來(lái)構(gòu)成一套簡(jiǎn)單的滑動(dòng)機(jī)構(gòu) 圖9:項(xiàng)目成果拼貼畫 |