在Nvidia Jetson Nano 2GB開發(fā)板上構(gòu)建人臉識(shí)別系統(tǒng)
Nvidia Jetson Nano 2GB開發(fā)板(今天宣布。┦且豢钚碌膯伟鍣C(jī),售價(jià)59美元,運(yùn)行帶有GPU加速的人工智能軟件。
在2020年,你可以從一臺(tái)售價(jià)59美元的單板計(jì)算機(jī)中獲得令人驚嘆的性能,讓我們用它來(lái)創(chuàng)建一個(gè)簡(jiǎn)易版的門鈴攝像頭,該攝像頭可以識(shí)別走到房屋前門的每個(gè)人。通過(guò)面部識(shí)別,即使這些人穿著不同,它也可以立即知道你家門口的人是否曾經(jīng)來(lái)拜訪過(guò)你。什么是Nvidia Jetson Nano 2GB Jetson Nano 2GB是一款單板計(jì)算機(jī),具有四核的1.4GHz ARM CPU和內(nèi)置的Nvidia Maxwell GPU。它是最便宜的Nvidia Jetson機(jī)型,針對(duì)的是購(gòu)買樹莓派的業(yè)余愛好者。
如果你已經(jīng)熟悉樹莓派的系列產(chǎn)品,則除了Jetson Nano配備Nvidia GPU外,和其他產(chǎn)品幾乎完全相同的。它可以運(yùn)行GPU加速的應(yīng)用程序(如深度學(xué)習(xí)模型),其速度遠(yuǎn)比樹莓派這樣的開發(fā)板(不支持大多數(shù)深度學(xué)習(xí)框架的GPU)快得多。雖然有很多AI開發(fā)板和加速器模塊,但Nvidia擁有一大優(yōu)勢(shì)——它與桌面AI庫(kù)直接兼容,不需要你將深度學(xué)習(xí)模型轉(zhuǎn)換為任何特殊格式即可運(yùn)行他們。它使用幾乎所有每個(gè)基于Python的深度學(xué)習(xí)框架都已使用的相同的CUDA庫(kù)進(jìn)行GPU加速,這意味著你可以采用現(xiàn)有基于Python的深度學(xué)習(xí)程序,幾乎無(wú)需修改就可以在Jetson Nano 2GB上運(yùn)行它,并且可以獲得良好的性能(只要你的應(yīng)用程序可以在2GB的RAM上運(yùn)行)。它將為強(qiáng)大的服務(wù)器端Python代碼部署在價(jià)格為59美元的獨(dú)立設(shè)備上的能力非常出色。這款新的Jetson Nano 2GB主板也比Nvidia以前的硬件版本更加光鮮亮麗。第一個(gè)Jetson Nano機(jī)型莫名其妙地缺少WiFi,但該機(jī)型隨附一個(gè)可插入的WiFi模塊,因此你不必再加上雜亂的以太網(wǎng)電纜了。他們還將電源輸入升級(jí)到了更現(xiàn)代的USB-C端口,并且在軟件方面,一些粗糙的邊緣已被磨掉,例如,你無(wú)需執(zhí)行諸如啟用交換文件之類的基本操作。讓我們組裝系統(tǒng)對(duì)于任何硬件項(xiàng)目,第一步都是收集我們需要的所有零件:1. Nvidia Jetson Nano 2GB主板(59美元)這開發(fā)板板目前可預(yù)訂(截至2020年10月5日),預(yù)計(jì)將于10月底發(fā)布。我不知道發(fā)行后的初始可用性會(huì)如何,但是先前的Jetson Nano機(jī)型在發(fā)行后的幾個(gè)月中供不應(yīng)求。2. USB-C電源適配器新型Jetson Nano 2GB使用USB-C供電,其不包括電源適配器。3. 攝像頭—— USB網(wǎng)絡(luò)攝像頭或樹莓派攝像頭模塊v2.x(約30美元)如果你希望將小型相機(jī)安裝在機(jī)殼中,那么樹莓派相機(jī)模塊v2.x是一個(gè)不錯(cuò)的選擇(注意:v1.x相機(jī)模塊是無(wú)法使用的),你可以在Amazon或各種經(jīng)銷商處獲得它們。一些USB網(wǎng)絡(luò)攝像頭(如Logitech的C270或C920)也可以在Jetson Nano 2GB上正常工作,因此如果你已經(jīng)擁有一個(gè)USB攝像頭,也可以拿來(lái)使用,以下是一個(gè)攝像頭的不完整清單。并非所有功能都支持Linux驅(qū)動(dòng)程序,但有些功能會(huì)支持。我插入了在亞馬遜上買的價(jià)值20美元的通用HDMI到USB的適配器,它可以很好地工作,因此,我無(wú)需任何額外配置就可以將我的高端數(shù)碼相機(jī)作為使用HDMI的視頻源。
除此之外,我們還需要其它設(shè)備,包括:至少具有32GB空間的microSD卡。我們將在此安裝Linux。一個(gè)microSD讀卡器:使用它可以安裝Jetson軟件。一個(gè)有線USB鍵盤和一個(gè)有線USB鼠標(biāo)用來(lái)控制Jetson Nano。加載Jetson Nano 2GB軟件首先我們需要下載Jetson Nano的軟件映像。Nvidia的默認(rèn)軟件映像包括預(yù)裝了Python 3.6和OpenCV的Ubuntu Linux 18.04。以下是將Jetson Nano軟件安裝到SD卡上的方法:從Nvidia下載Jetson Nano Developer Kit SD卡映像。下載Etcher,該程序?qū)etson軟件映像寫入SD卡。運(yùn)行Etcher并使用它來(lái)編寫下載到SD卡的Jetson Nano Developer Kit SD卡映像,這大約需要20分鐘。組裝所有設(shè)備零件首先,請(qǐng)拿出你的Jetson Nano 2GB:
第一步是插入microSD卡,microSD卡插槽是隱藏的,但你可以在散熱器底部的背面找到它:
你還應(yīng)該繼續(xù)將隨附的USB WiFi適配器插入以下USB端口之一:
接下來(lái),你需要插入相機(jī)。如果你使用的是樹莓派 v2.x相機(jī)模塊,則它會(huì)通過(guò)帶狀電纜連接。在Jetson上找到帶狀電纜插槽,彈出連接器,插入電纜,然后將其彈出關(guān)閉。確保帶狀電纜上的金屬觸點(diǎn)向內(nèi)朝向散熱器:
如果你使用USB網(wǎng)絡(luò)攝像頭,可以直接將其插入U(xiǎn)SB端口,而不需要使用帶狀電纜端口。現(xiàn)在,插入其他所有零件:將鼠標(biāo)和鍵盤插入U(xiǎn)SB端口。使用HDMI電纜插入顯示器。最后,插入U(xiǎn)SB-C電源線以啟動(dòng)它。如果你使用的是樹莓派相機(jī)模塊,則最終會(huì)得到如下所示的內(nèi)容:
或者,如果你使用的是USB視頻輸入設(shè)備,則如下所示:
插入電源線后,Jetson Nano會(huì)自動(dòng)啟動(dòng),幾秒鐘后,你應(yīng)該會(huì)看到Linux設(shè)置屏幕出現(xiàn)在顯示器上,按照提示步驟來(lái)創(chuàng)建你的帳戶并連接到WiFi。安裝Linux和Python庫(kù)來(lái)進(jìn)行人臉識(shí)別一旦完成了Linux的初始設(shè)置,就需要安裝幾個(gè)我們將在人臉識(shí)別系統(tǒng)中使用的庫(kù)。在Jetson Nano桌面上,打開一個(gè)LXTerminal窗口并運(yùn)行以下命令。每次要求輸入密碼時(shí),請(qǐng)輸入創(chuàng)建用戶帳戶時(shí)輸入的密碼:sudo apt-get update
sudo apt-get install python3-pip cmake libopenblas-dev liblapack-dev libjpeg-dev
首先,我們要更新apt,這是標(biāo)準(zhǔn)的Linux軟件安裝工具,我們將使用它來(lái)安裝所需的其他系統(tǒng)庫(kù)。然后,我們將安裝一些尚未預(yù)先安裝我們軟件需要的linux庫(kù)。最后,我們需要安裝face_recognition Python庫(kù)及其依賴項(xiàng),包括機(jī)器學(xué)習(xí)庫(kù)dlib。你可以使用以下單個(gè)命令自動(dòng)執(zhí)行此操作:sudo pip3 -v install Cython face_recognition
因?yàn)闆]有可用于Jetson平臺(tái)的dlib和numpy的預(yù)構(gòu)建版本,所以此命令將從源代碼編譯這些庫(kù),所以這可能需要一個(gè)小時(shí)的時(shí)間!當(dāng)最終完成后,Jetson Nano 2GB就可以通過(guò)使用CUDA GPU來(lái)對(duì)人臉識(shí)別進(jìn)行加速。運(yùn)行門鈴攝像頭的人臉識(shí)別應(yīng)用程序face_recognition庫(kù)是我編寫的一個(gè)Python庫(kù),它使用DLIB做人臉識(shí)別超級(jí)簡(jiǎn)單。它可以檢測(cè)到人臉,并將每個(gè)檢測(cè)到的人臉轉(zhuǎn)換為唯一的人臉特征編碼,然后比較這些特征編碼以查看它們是否屬于同一個(gè)人,該過(guò)程只需幾行代碼即可。face_recognition庫(kù):我使用該庫(kù)構(gòu)建了一個(gè)門鈴攝像頭的人臉識(shí)別應(yīng)用程序,該應(yīng)用程序可以識(shí)別走到你家門的人并對(duì)其進(jìn)行跟蹤。運(yùn)行時(shí)如下所示:
首先,請(qǐng)下載代碼。我已經(jīng)在此處添加了完整的代碼和注釋。但是這里有一個(gè)更簡(jiǎn)單的方法,可以從命令行下載到你的Jetson Nano上:wget -O doorcam.py tiny.cc/doorcam2gb
在程序中你需要編輯一行代碼來(lái)設(shè)置是使用USB相機(jī)還是樹莓派相機(jī)模塊。你可以像這樣編輯文件:gedit doorcam.py
按照說(shuō)明進(jìn)行操作,然后保存它,退出GEdit并運(yùn)行代碼:python3 doorcam.py
你會(huì)在桌面上看到一個(gè)視頻窗口,每當(dāng)有新人走到攝像機(jī)前時(shí),它都會(huì)記錄他們的臉并開始跟蹤他們?cè)谀慵议T口的時(shí)間。如果同一個(gè)人離開并在5分鐘后回來(lái),它將重新注冊(cè)并再次跟蹤他們,你可以隨時(shí)按鍵盤上的“ q”退出。該應(yīng)用程序會(huì)自動(dòng)將看到的每個(gè)人信息保存到一個(gè)名為known_faces.dat的文件中。當(dāng)你再次運(yùn)行該程序時(shí),它將使用該數(shù)據(jù)記住以前的訪問(wèn)者。如果要清除已知面孔的列表,只需退出程序并刪除該文件。將其變成獨(dú)立的硬件設(shè)備至此,我們有一個(gè)運(yùn)行人臉識(shí)別模型的開發(fā)板,但它仍被束縛在桌面上,以實(shí)現(xiàn)強(qiáng)大的功能和顯示效果。讓我們看看無(wú)需插入如何運(yùn)行它,F(xiàn)代單板計(jì)算機(jī)幾乎都支持相同的硬件標(biāo)準(zhǔn),例如USB,這意味著你可以在亞馬遜上買到很多便宜的附件,例如觸摸屏顯示器和電池。你可以很多輸入,輸出和電源選項(xiàng)。這是我訂購(gòu)的東西(但類似的東西都可以):一個(gè)7英寸觸摸屏HDMI顯示屏,使用USB電源:
以及一個(gè)通用的USB-C電池組來(lái)供電:
讓我們將其連接起來(lái),看看作為獨(dú)立設(shè)備運(yùn)行時(shí)的外觀。只需插入U(xiǎn)SB電池而不是壁式充電器,然后將HDMI顯示器插入HDMI端口和USB端口,即可充當(dāng)屏幕和鼠標(biāo)輸入。
可以看到效果很好。觸摸屏可以像普通的USB鼠標(biāo)一樣操作,無(wú)需任何其他配置。唯一的缺點(diǎn)是,如果Jetson Nano 2GB消耗的電量超過(guò)USB電池組可提供的電量,則會(huì)降低GPU的速度。如果你有其它的創(chuàng)意,可以將所有這些打包到一個(gè)項(xiàng)目案例中,用作原型硬件設(shè)備來(lái)測(cè)試你的想法,而且,如果你想批量生產(chǎn)某些產(chǎn)品,則可以購(gòu)買Jetson主板的生產(chǎn)版本,并將其用于構(gòu)建真正的硬件產(chǎn)品。門鈴攝像頭的Python代碼解析代碼從導(dǎo)入我們使用的庫(kù)開始,其中最重要的是OpenCV(Python中稱為cv2),我們將使用OpenCV從相機(jī)讀取圖像,以及檢測(cè)和識(shí)別人臉。import face_recognition
import cv2
from datetime import datetime, timedelta
import numpy as np
import platform
import pickle
然后,我們需要知道如何訪問(wèn)相機(jī)——從樹莓派相機(jī)模塊獲取圖像的方法與使用USB相機(jī)的方法不同,因此,只需根據(jù)你的硬件將此變量更改為True或False即可:# 這里的設(shè)置取決于你的攝像機(jī)設(shè)備類型:
# - True = 樹莓派 2.x camera module
# - False = USB webcam or other USB video input (like an HDMI capture device)
USING_RPI_CAMERA_M(jìn)ODULE = False
接下來(lái),我們將創(chuàng)建一些變量來(lái)存儲(chǔ)有關(guān)在攝像機(jī)前行走的人的數(shù)據(jù),這些變量將充當(dāng)已知訪客的簡(jiǎn)單數(shù)據(jù)庫(kù)。known_face_encodings = []
known_face_metadata = []
該應(yīng)用程序只是一個(gè)演示,因此我們將已知的人臉存儲(chǔ)在Python列表中。接下來(lái),我們具有保存和加載已知人臉數(shù)據(jù)的功能,以下是保存功能:def save_known_faces():
with open("known_faces.dat", "wb") as face_data_file:
face_data = [known_face_encodings, known_face_metadata]
pickle.dump(face_data, face_data_file)
print("Known faces backed up to disk.")
這將使用Python的內(nèi)置pickle功能將已知的人臉寫入磁盤中,數(shù)據(jù)也可以以相同的方式加載回去,但是我在這里沒有寫。每當(dāng)我們的程序檢測(cè)到新面孔時(shí),我們都會(huì)調(diào)用一個(gè)函數(shù)將其添加到已知的人臉數(shù)據(jù)庫(kù)中:def register_new_face(face_encoding, face_image):
known_face_encodings.a(chǎn)ppend(face_encoding)
known_face_metadata.a(chǎn)ppend({
"first_seen": datetime.now(),
"first_seen_this_interaction": datetime.now(),
"last_seen": datetime.now(),
"seen_count": 1,
"seen_frames": 1,
"face_image": face_image,
})
首先,我們將表征人臉的編碼存儲(chǔ)在列表中,然后,我們將有關(guān)人臉的匹配數(shù)據(jù)字典存儲(chǔ)在第二個(gè)列表中。我們將使用它來(lái)跟蹤我們第一次見到該人的時(shí)間,他們最近在攝像頭周圍閑逛了的時(shí)間,他們?cè)L問(wèn)過(guò)我們房屋的次數(shù)以及他們的人臉圖像。我們還需要一個(gè)輔助函數(shù)來(lái)檢查人臉數(shù)據(jù)庫(kù)中是否已經(jīng)存在未知人臉:def lookup_known_face(face_encoding):
metadata = None
if len(known_face_encodings) == 0:
return metadata
face_distances = face_recognition.face_distance(
known_face_encodings,
face_encoding
)
best_match_index = np.a(chǎn)rgmin(face_distances)
if face_distances[best_match_index] < 0.65:
metadata = known_face_metadata[best_match_index]
metadata["last_seen"] = datetime.now()
metadata["seen_frames"] += 1
if datetime.now() - metadata["first_seen_this_interaction"]
> timedelta(minutes=5):
metadata["first_seen_this_interaction"] = datetime.now()
metadata["seen_count"] += 1
return metadata
我們?cè)谶@里做了一些重要的事情:使用face_recogntion庫(kù),我們檢查未知人臉與所有以前的訪問(wèn)者的相似程度。所述face_distance()函數(shù)為我們提供了未知臉部和所有已知人臉之間的相似性的數(shù)值測(cè)量——數(shù)字越小,人臉越相似。如果人臉與我們的一位已知訪客非常相似,則我們可以假設(shè)他們是重復(fù)訪客,在這種情況下,我們將更新它們的“上次拜訪”時(shí)間,并增加在視頻幀中看到這人臉的次數(shù)。最后,如果在最近的五分鐘內(nèi)有人在鏡頭前看到這個(gè)人,那么我們假設(shè)他們?nèi)匀辉谶@里作為同一次訪問(wèn)的一部分,否則,我們假設(shè)這是對(duì)我們房屋的新訪問(wèn),因此我們將重置跟蹤他們最近訪問(wèn)的時(shí)間戳。程序的其余部分是主循環(huán)——一個(gè)無(wú)限循環(huán),在該循環(huán)中,我們獲取視頻幀,在圖像中查找人臉并處理我們看到的每個(gè)人臉。這是該程序的主要核心。讓我們來(lái)看看:def main_loop():
if USING_RPI_CAMERA_M(jìn)ODULE:
video_capture =
cv2.VideoCapture(
get_jetson_gstreamer_source(),
cv2.CAP_GSTREAMER
)
else:
video_capture = cv2.VideoCapture(0)
第一步是使用適合我們計(jì)算機(jī)硬件的任何一種方法來(lái)訪問(wèn)相機(jī),F(xiàn)在讓我們開始獲取視頻幀:while True:
# Grab a single frame of video
ret, frame = video_capture.read()
# Resize frame of video to 1/4 size
small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
# Convert the image from BGR color
rgb_small_frame = small_frame[:, :, ::-1]
每次抓取一幀視頻圖像時(shí),我們都會(huì)將其縮小到1/4尺寸,這將使人臉識(shí)別過(guò)程運(yùn)行得更快,但代價(jià)是僅檢測(cè)圖像中較大的人臉,但是由于我們正在構(gòu)建一個(gè)門鈴攝像頭,該攝像頭只能識(shí)別攝像頭附近的人,所以這不是問(wèn)題。同時(shí)我們還必須處理另外一個(gè)問(wèn)題,OpenCV從攝像機(jī)中提取圖像,每個(gè)像素存儲(chǔ)為藍(lán)綠色-紅色值,這不是標(biāo)準(zhǔn)的紅色-綠色-藍(lán)色值。在圖像上進(jìn)行人臉識(shí)別之前,我們需要轉(zhuǎn)換圖像格式。接著我們檢測(cè)圖像中的所有人臉,并將每個(gè)人臉轉(zhuǎn)換為人臉特征編碼,這只需兩行代碼:face_locations = face_recognition.face_locations(rgb_small_frame)
face_encodings = face_recognition.face_encodings(
rgb_small_frame,
face_locations
)
接下來(lái),我們會(huì)遍歷每一個(gè)檢測(cè)到的面孔,并確定該面孔是我們過(guò)去見過(guò)的人還是新的訪客:for face_location, face_encoding in zip(
face_locations,
face_encodings):
metadata = lookup_known_face(face_encoding)
if metadata is not None:
time_at_door = datetime.now() -
metadata['first_seen_this_interaction']
face_label = f"At door {int(time_at_door.total_seconds())}s"
else:
face_label = "New visitor。
# Grab the image of the face
top, right, bottom, left = face_location
face_image = small_frame[top:bottom, left:right]
face_image = cv2.resize(face_image, (150, 150))
# Add the new face to our known face data
register_new_face(face_encoding, face_image)
如果我們以前見過(guò)此人,我們將檢索我們存儲(chǔ)的有關(guān)他們先前訪問(wèn)的元數(shù)據(jù)。如果沒有,我們將它們添加到我們的人臉數(shù)據(jù)庫(kù)中,并從視頻圖像中獲取他們的人臉圖片以添加到我們的數(shù)據(jù)庫(kù)中,F(xiàn)在我們找到了所有的人并弄清了他們的身份,我們可以再次遍歷檢測(cè)到的人臉,在每個(gè)人臉周圍繪制矩陣框并為每個(gè)人臉添加標(biāo)簽:for (top, right, bottom, left), face_label in
zip(face_locations, face_labels):
# Scale back up face location
# since the frame we detected in was 1/4 size
top *= 4
right *= 4
bottom *= 4
left *= 4
# Draw a box around the face
cv2.rectangle(
frame, (left, top), (right, bottom), (0, 0, 255), 2
)
# Draw a label with a description below the face
cv2.rectangle(
frame, (left, bottom - 35), (right, bottom),
(0, 0, 255), cv2.FILLED
)
cv2.putText(
frame, face_label,
(left + 6, bottom - 6),
cv2.FONT_HERSHEY_DUPLEX, 0.8,
(255, 255, 255), 1
)
同時(shí)在屏幕上方繪制一份最近訪問(wèn)者的運(yùn)行列表,其中包含他們?cè)L問(wèn)過(guò)你房屋的次數(shù):
要繪制該圖像,我們需要遍歷所有已知的人臉,并查看最近在鏡頭前的人臉。對(duì)于每個(gè)最近的訪客,我們將在屏幕上繪制他們的人臉圖像并顯示其訪問(wèn)次數(shù):number_of_recent_visitors = 0
for metadata in known_face_metadata:
# 如果我們?cè)谧詈笠环昼娨娺^(guò)此人,
if datetime.now() - metadata["last_seen"]
< timedelta(seconds=10):
# 繪制已知的面部圖像
x_position = number_of_recent_visitors * 150
frame[30:180, x_position:x_position + 150] =
metadata["face_image"]
number_of_recent_visitors += 1
# Label the image with how many times they have visited
visits = metadata['seen_count']
visit_label = f"{visits} visits"
if visits == 1:
visit_label = "First visit"
cv2.putText(
frame, visit_label,
(x_position + 10, 170),
cv2.FONT_HERSHEY_DUPLEX, 0.6,
(255, 255, 255), 1
)
最后,我們可以在屏幕上顯示當(dāng)前視頻幀,并在其頂部顯示所有注釋:cv2.imshow('Video', frame)
為了確保程序不會(huì)崩潰,我們將每100幀將已知人臉列表保存到磁盤上:if len(face_locations) > 0 and number_of_frames_since_save > 100:
save_known_faces()
number_of_faces_since_save = 0
else:
number_of_faces_since_save += 1
程序退出時(shí),僅需一行或兩行清理代碼即可關(guān)閉相機(jī)。該程序的啟動(dòng)代碼位于該程序的最底部:if __name__ == "__main__":
load_known_faces()
main_loop()
我們要做的是加載已知的人臉(如果有的話),然后啟動(dòng)主循環(huán),該循環(huán)從相機(jī)讀取并在屏幕上顯示結(jié)果。整個(gè)程序只有大約200行,但是它可以檢測(cè)到訪客,對(duì)其進(jìn)行識(shí)別并每當(dāng)他們來(lái)到你的家門時(shí)進(jìn)行跟蹤。擴(kuò)展程序該程序是一個(gè)示例,說(shuō)明了如何在便宜的Jetson Nano 2GB板上運(yùn)行少量的Python 3代碼來(lái)構(gòu)建功能強(qiáng)大的系統(tǒng)。如果你想把它變成一個(gè)真正的門鈴攝像頭系統(tǒng),你可以添加其它額外功能:當(dāng)系統(tǒng)檢測(cè)到門口有新人時(shí),它會(huì)用Twilio向你發(fā)送短信,而不是僅僅在你的顯示器上顯示,或者你可以嘗試用真實(shí)的數(shù)據(jù)庫(kù)替換在內(nèi)存中的人臉數(shù)據(jù)庫(kù)。你也可以嘗試將這個(gè)程序轉(zhuǎn)換成完全不同的程序。閱讀一幀視頻,在圖像中尋找內(nèi)容,然后采取行動(dòng)的模式是各種計(jì)算機(jī)視覺系統(tǒng)的基礎(chǔ)。嘗試更改代碼,看看你能想出什么!比如當(dāng)你回家走到自己家門口時(shí),讓它播放你自己定制的主題音樂怎么樣?你可以查看其他一些人臉識(shí)別示例,以了解如何進(jìn)行類似的操作。面部識(shí)別示例:了解有關(guān)Nvidia Jetson平臺(tái)的更多信息如果你想了解有關(guān)使用Nvidia Jetson硬件平臺(tái)進(jìn)行構(gòu)建的更多信息,Nvidia會(huì)提供新的免費(fèi)Jetson培訓(xùn)課程。查看他們的網(wǎng)站以獲取更多信息。他們也有很棒的社區(qū)資源,例如JetsonHacks網(wǎng)站。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-10.29立即報(bào)名>> 2024德州儀器嵌入式技術(shù)創(chuàng)新發(fā)展研討會(huì)
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月14日立即報(bào)名>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
推薦專題
- 1 Intel宣布40年來(lái)最重大轉(zhuǎn)型:年底前裁員15000人、拋掉2/3房產(chǎn)
- 2 因美封殺TikTok,字節(jié)股價(jià)骨折!估值僅Meta1/5
- 3 宏山激光重磅發(fā)布行業(yè)解決方案,助力智能制造產(chǎn)業(yè)新飛躍
- 4 國(guó)產(chǎn)AI芯片公司破產(chǎn)!白菜價(jià)拍賣
- 5 具身智能火了,但規(guī)模落地還需時(shí)間
- 6 國(guó)產(chǎn)英偉達(dá)們,抓緊沖刺A股
- 7 三次錯(cuò)失風(fēng)口!OpenAI前員工殺回AI編程賽道,老東家捧金相助
- 8 英特爾賦能智慧醫(yī)療,共創(chuàng)數(shù)字化未來(lái)
- 9 英偉達(dá)的麻煩在后頭?
- 10 將“網(wǎng)紅”變成“商品”,AI“爆改”實(shí)力拉滿
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市