資料介紹
描述
在織物印花廠的培訓(xùn)期間,我們注意到由于用于 GSM 測(cè)量的傳統(tǒng)方法,大量織物被浪費(fèi)。GSM(克每平方米)是織物質(zhì)量的指標(biāo),織物行業(yè)使用各種機(jī)器和技術(shù)在整個(gè)制造和印花過程中保持織物的 GSM 一致。
織物 GSM 測(cè)量的傳統(tǒng)方法包括切割一塊面積為 0.01 平方厘米的小圓形織物,并使用精密天平測(cè)量其重量。這是在拉幅過程中專門完成的,機(jī)器的超喂根據(jù)輸入和輸出 GSM 進(jìn)行控制。
該項(xiàng)目旨在用基于光學(xué)的方法取代這種傳統(tǒng)方法。目前,該項(xiàng)目的范圍僅限于單色(白色)平紋斜紋織物。(算法也可以應(yīng)用于具有相當(dāng)精確度的針織面料)
在 Ultra96 上設(shè)置 PYNQ
對(duì)于希望以最少的開發(fā)和調(diào)試時(shí)間實(shí)現(xiàn)硬件加速應(yīng)用程序的任何人,PYNQ是一個(gè)不錯(cuò)的選擇。目前 PYNQ 支持多個(gè)板,包括 Ultra96。所以如果你碰巧有一個(gè) Ultra96 或類似的板子,我強(qiáng)烈建議你試試 PYNQ。(根據(jù)我的經(jīng)驗(yàn),任何支持 Python 的東西都非常容易使用)
您要做的第一件事是從這里為您的電路板下載 PYNQ 2.3 映像。對(duì)于 Ultra96,您也可以在 board 的官方網(wǎng)站上找到它。
下載后,您可以使用 PYNQ 重新刷新開發(fā)板隨附的 SD 卡。如果您在格式化卡時(shí)遇到問題,此視頻將展示如何使用 DISKPART for windows 來完成。
安裝后,您應(yīng)該能夠使用 Ultra96 的 wifi 接入點(diǎn)(pynq_<您的主板的mac地址>)訪問您的 Ultra96。您可以通過從您喜歡的瀏覽器訪問192.168.2.1:9090打開 Jupyter Notebook ,并立即開始開發(fā)。
提示 :
登錄密碼是“xilinx”
獲取 PYNQ 計(jì)算機(jī)視覺庫
PYNQ 的計(jì)算機(jī)視覺庫提供了幾個(gè)用于在硬件中加速 OpenCV 功能的覆蓋。目前支持 Filter2D 和擴(kuò)張操作。(如果你是 Xilinx 的人讀到這篇文章,我希望你們也可以下載可以使用 xfopencv 庫構(gòu)建的其余疊加層。下載 17gigs 的 SDSoC 來構(gòu)建疊加層不是我可以用我的第三世界互聯(lián)網(wǎng))
或者簡(jiǎn)單地說,在 Jupyter Notebook 中打開一個(gè)終端并輸入,
sudo pip3 install --upgrade git+https://github.com/Xilinx/PYNQ-ComputerVision.git
你就完成了。
?
獲取 PYNQ:BNN 覆蓋
PYNQ 越來越好。Xilinx 的優(yōu)秀人員還提供了一些疊加層,使我們能夠在硬件中運(yùn)行量化神經(jīng)網(wǎng)絡(luò)!您可以在他們的GitHub 頁面上閱讀更多相關(guān)信息。(接下來我們將嘗試訓(xùn)練我們自己的小型神經(jīng)網(wǎng)絡(luò)來識(shí)別織物結(jié)構(gòu),從而使校準(zhǔn)更容易。)
sudo pip3 install git+https://github.com/Xilinx/BNN-PYNQ.git (on PYNQ v2.3)
現(xiàn)在我們已經(jīng)安裝了所有這些花哨的疊加層,讓我們開始做事吧。
機(jī)織物的經(jīng)緯紗分離
我們決定使用USB 顯微鏡相機(jī)來獲取織物的放大圖像。
盡管它的價(jià)格很高,但我們還是能夠獲得令人驚訝的好織物圖像。下圖顯示了機(jī)織織物放大后的樣子。
機(jī)織織物由沿水平和垂直方向運(yùn)行的紗線組成。那么有什么比使用可靠的 ol Sobel 過濾器更好的方法來分離它們!Sobel算子用于識(shí)別灰度圖像的邊緣(稱為圖像強(qiáng)度函數(shù),其中每個(gè)像素僅被賦予一個(gè)從最低強(qiáng)度到最高強(qiáng)度的值)。使用這些梯度,可以通過將它們的梯度與相鄰像素的梯度進(jìn)行比較來找到形成邊緣的像素。我們可以通過將原始圖像與 Sobel X 和 Y 核進(jìn)行卷積來生成經(jīng)紗和緯紗的子圖像。
?

?
Sobel 濾波器 - 使用 Filter2D 覆蓋在 Ultra96 硬件上實(shí)現(xiàn)
在我們開始使用硬件加速過濾器 2D 之前,我們需要導(dǎo)入必要的疊加層。讓我們打開一個(gè)新的 Notebook 并開始開發(fā)算法。安裝計(jì)算機(jī)視覺庫時(shí)獲得的筆記本中提供了使用疊加層時(shí)必須遵循的語法和結(jié)構(gòu)。
提示:自己運(yùn)行提供的筆記本,看看這些操作與軟件相比有多快!
提示 2 - 如果您在訪問相機(jī)時(shí)遇到錯(cuò)誤,請(qǐng)執(zhí)行 Kernel > Restart and Run All。
import cv2 #NOTE: This needs to be loaded first# Load filter2D + dilate overlay
# Load filter2D + dilate overlay
from pynq import Bitstreambs = Bitstream("/usr/local/lib/python3.6/dist-packages/pynq_cv/overlays/xv2Filter2DDilate.bit")bs.download()
import pynq_cv.overlays.xv2Filter2DDilate as xv2
# Load xlnk memory mangager
from pynq import XlnkXlnk.set_allocator_library('/usr/local/lib/python3.6/dist-packages/pynq_cv/overlays/xv2Filter2DDilate.so')mem_manager = Xlnk()
我們還需要從我們的網(wǎng)絡(luò)攝像頭捕捉幀。
camera = cv2.VideoCapture(0)
width = 640
height = 480
camera.set(cv2.CAP_PROP_FRAME_WIDTH,width)camera.set(cv2.CAP_PROP_FRAME_HEIGHT,height)
你還需要這個(gè)函數(shù)在 Jupyter 中顯示圖像。稍后我們將把這個(gè)項(xiàng)目與 Flask 集成,所以我們只需要在初始階段使用它來檢查事情是否正常工作。
import IPython
def imshow(img):
returnValue, buffer = cv2.imencode('.jpg', img)
IPython.display.display(IPython.display.Image(data=buffer.tobytes()))
讓我們將內(nèi)核設(shè)置為 numpy 數(shù)組。
sobelx = np.ones((480,640),np.uint8)sobely = np.ones((480,640),np.uint8)blur_frame = np.ones((480,640),np.uint8)
#These must be 3x3 since filter2d overlay supports a 3x3 kernel size
kernel_sobelx = np.array([[1.0,0.0,-1.0],[2.0,0.0,-2.0],[1.0,0.0,-1.0]],np.float32)#Sobel Xkernel_sobely = np.array([[1.0,2.0,1.0],[0.0,0.0,0.0],[-1.0,-2.0,-1.0]],np.float32)#Sobel Ykernel_sharp = np.array([[-1.0,-1.0,-1.0],[-1.0,32.0,-1.0],[-1.0,-1.0,-1.0]],np.float32)#sharpkernelb = np.array([[1/16.0,1/8.0,1/16.0],[1/8.0,1/4.0,1/8.0],[1/16.0,1/8.0,1/16.0]],np.float32)#blur
kernelVoid = np.zeros(0)
您將需要這些來運(yùn)行您的硬件功能。
xFin= mem_manager.cma_array((height,width),np.uint8)
xFbuf= mem_manager.cma_array((height,width),np.uint8)
xFout= mem_manager.cma_array((height,width),np.uint8)
blur = mem_manager.cma_array((height,width),np.uint8)
讓我們開始應(yīng)用 sobel 過濾器。
# Flush webcam buffers (needed when rerunning notebook)
for _ in range(5):
ret, frame_in = camera.read()# Read in a frame
ret, img = camera.read()
if ret:
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #Convert color image from webcam to grayscale image
xFin[:] = gray[:] # load grayscale image to frame in buffer
xv2.filter2D(xFin, -1, kernelb, xFout, borderType=cv2.BORDER_CONSTANT) #See how easy it is to call the overlay!
blur_frame[:] = xFout[:]
imshow(blur_frame) #Display gaussian blurred image
blur[:] = xFout[:]
xv2.filter2D(blur, -1, kernel_sobelx, xFbuf, borderType=cv2.BORDER_CONSTANT) #convolve with sobel x filter
xv2.filter2D(xFbuf, -1, kernelVoid, xFout, borderType=cv2.BORDER_CONSTANT)
sobelx[:] = xFout[:]
xv2.filter2D(blur, -1, kernel_sobely, xFbuf, borderType=cv2.BORDER_CONSTANT) #convolve with sobel y filter
xv2.filter2D(xFbuf, -1, kernelVoid, xFout, borderType=cv2.BORDER_CONSTANT)
sobely[:] = xFout[:]
imshow(sobelx)
imshow(sobely)
else:
print("Error reading frame from camera.")
?
輸出

由于我們需要強(qiáng)烈的模糊來去除紗線的細(xì)線部分,因此通過使用相機(jī)的焦距調(diào)整,輸入圖像略微失焦。
?
?

?
?

?
通過一些額外的形態(tài)變換和閾值處理,我們可以很容易地獲得黑色背景上的白色條紋的經(jīng)紗和緯紗。
由于我們需要獲取經(jīng)紗和緯紗的數(shù)量,因此我們不得不使用一些耗時(shí)的軟件功能。(回想一下我們使用上面的代碼獲得的 sobelx 和 sobely 圖像)
warpcount = 0
weftcount = 0
warparea = 0
weftarea = 0
draw_warp = 1
draw_weft = 1
warp_perimeter_thresh = 800
weft_perimeter_thresh = 800
############ This part should come after obtaining sobelx and y images##########
if draw_warp:
im2x, contoursx, hierarchyx = cv2.findContours(sobelx,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
for cnt in contoursx:
perimeter = cv2.arcLength(cnt,True)
if perimeter > warp_perimeter_thresh:
cv2.drawContours(img, cnt, -1, (204,50,153), 2)
warpcount = warpcount+1
warparea = +cv2.contourArea(cnt)
if draw_weft:
im2y, contoursy, hierarchyy = cv2.findContours(sobely,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
for cnt in contoursy:
perimeter = cv2.arcLength(cnt,True)
if perimeter > weft_perimeter_thresh:
cv2.drawContours(img, cnt, -1, (0,0,255), 2)
weftcount = weftcount+1
weftarea = +cv2.contourArea(cnt)
mem = "Warp Yarns : "+str(warpcount)
mem1 = "Warp Pixel Area : "+str(warparea)+ " pixels"
mem2 = "Weft Yarns : "+str(weftcount)mem3 = "Weft Pixel Area : "+str(weftarea)+ " pixels"
areatot = (warparea+weftarea)
mem4 = "Totalized Pixel Area : "+str(areatot)+ " pixels"
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,mem,(5,370), font, 1,(0,255,0),2,cv2.LINE_AA)
cv2.putText(img,mem1,(5,400), font, 1,(255,100,100),2,cv2.LINE_AA)
cv2.putText(img,mem2,(5,430), font, 1,(0,255,0),2,cv2.LINE_AA)
cv2.putText(img,mem3,(5,460), font, 1,(255,100,100),2,cv2.LINE_AA)
cv2.putText(img,mem4,(5,30), font, 1,(255,0,0),2,cv2.LINE_AA)
imshow(img)
這是輸出。這部分有點(diǎn)資源密集,但我們的幀速率已經(jīng)限制在 25FPS(由于它是 USB 攝像頭),所以它不會(huì)對(duì)我們產(chǎn)生太大影響。

至此,我們已經(jīng)得到了經(jīng)紗和緯紗的支數(shù)(我們可以直接用這些來得到紗線密度,也就是單位面積的紗線數(shù)量),以及紗線的總像素?cái)?shù)。由于在不知道給定織物類型的每個(gè)像素質(zhì)量的情況下,無法從像素?cái)?shù)量估計(jì)紗線質(zhì)量,因此我們可以簡(jiǎn)單地使用具有已知 GSM 的織物樣本進(jìn)行校準(zhǔn)。
舉個(gè)例子。上面顯示的織物樣品是 110GSM。讓我們結(jié)合它來校準(zhǔn)我們的算法來測(cè)量這種織物類型的 GSM。
gsm = (areatot/27747)*110mem5 = "Predicted GSM : "+str(gsm)+ " GSM"
cv2.putText(img,mem5,(5,60), font, 1,(255,0,0),2,cv2.LINE_AA)
讓我們?cè)俅芜\(yùn)行代碼并提供同一織物不同部分的圖片。
?

預(yù)測(cè)的 GSM 很接近,但可以觀察到一點(diǎn)偏差。校準(zhǔn)后,我們??必須確保傳感器和織物之間的距離在移動(dòng)到不同區(qū)域時(shí)不會(huì)發(fā)生變化。這促使我們開發(fā)了本文后半部分所示的 XY cartecean 滑塊系統(tǒng)。
針織面料測(cè)試
針織物的織物結(jié)構(gòu)更復(fù)雜,以便以這種方式捕捉。然而,如下圖所示,我們可以在一側(cè)捕獲交織在一起的紗線簇(稱為環(huán))。

所以我們大概可以在這些紗線簇和質(zhì)量之間建立關(guān)系。為此,我們需要更改我們的算法以僅找到垂直邊緣。
回憶一下 draw_warp 和 draw_weft 控制變量。我們可以將其中一個(gè)設(shè)置為零。
?
使用 PYNQ 使我們的算法更智能:BNN
如果我們的算法能夠在校準(zhǔn)過程中識(shí)別出機(jī)織織物和針織物,它就可以輕松適應(yīng)不同的織物結(jié)構(gòu)。讓我們利用 PYNQ BNN 覆蓋來加快推理速度。
(在 Ultra96 上安裝 BNN 后,請(qǐng)務(wù)必查看示例筆記本以熟悉自己)
為了在我們的數(shù)據(jù)集上訓(xùn)練提供的模型,我們需要使用我們相對(duì)更強(qiáng)大的計(jì)算機(jī)一段時(shí)間。(我是在 Linux 上完成的)所以將 PYNQ:BNN 存儲(chǔ)庫克隆到你的電腦上。
您需要按照此處的說明安裝 Theano、Lasagne、Pylearn2 和其他一些必需的軟件包。由于我們的數(shù)據(jù)集很小,我們現(xiàn)在不需要 CUDA 來進(jìn)行 GPU 加速,但是如果您的數(shù)據(jù)集變得更大,您可能需要它。
安裝 pylearn2 后,請(qǐng)記住通過輸入為 pylearn2 數(shù)據(jù)集設(shè)置路徑變量,
export PYLEARN2_VIEWER_COMMAND="eog --new-instance"
export PYLEARN2_DATA_PATH=/YOURPATHTOHERE/pylearn2/datasets
在您的終端中。
我們現(xiàn)在將嘗試為我們的模型生成一個(gè) MNIST 數(shù)據(jù)集進(jìn)行訓(xùn)練。首先,我們需要獲取一些梭織和針織織物結(jié)構(gòu)的照片。
您可以使用末尾附加的phototaker.py代碼從您的網(wǎng)絡(luò)攝像頭拍攝多張灰度圖像。
拿到照片后,我們可以使用這個(gè)神奇的工具來生成 MNIST 數(shù)據(jù)。
https://github.com/gskielian/JPG-PNG-to-MNIST-NN-Format
將 repo 克隆到您的 PC 中,將圖像復(fù)制到培訓(xùn)和測(cè)試目錄。
根據(jù)標(biāo)簽數(shù)量編輯batches.meta.txt 。
在終端上鍵入./resize-script.sh 將所有圖像調(diào)整為 28x28 大小并運(yùn)行convert-images-to-mnist-format.py以生成數(shù)據(jù)集。
提示:您將獲得 4 個(gè)文件。
?

gskielian 的工具將生成訓(xùn)練圖像集和標(biāo)簽作為 train-images-idx3-ubyte 和 train-labels-idx1-ubyte,但您必須將 train 重命名為 t10k,因?yàn)檫@是訓(xùn)練腳本要查找的內(nèi)容。
然后,您必須轉(zhuǎn)到 pylearn2/pyearn2/datasets 并編輯mnist.py文件并更改訓(xùn)練和測(cè)試數(shù)據(jù)的大小、時(shí)期數(shù)和批量大小以適合您的數(shù)據(jù)集。
一切調(diào)整好后,你可以進(jìn)入你的BNN目錄,運(yùn)行mnist.py

這將生成一個(gè)名為 mnist_parameters.npz 的文件。您需要使用 mnist-gen-weights-W1A1 或W1A2.py生成比特流
生成成功后,將生成的文件放在/usr/local/lib/python3.6/dist-packages/bnn/params/newmodel/lfcW1A1/
我們可以使用LFC-BNN_MNIST_Webcam.ipynb筆記本對(duì)其進(jìn)行測(cè)試。
import bnn
hw_classifier = bnn.LfcClassifier(bnn.NETWORK_LFCW1A1,"newmodel",bnn.RUNTIME_HW)
import cv2
from PIL import Image as PIL_Image
from PIL import ImageEnhance
from PIL import ImageOps# says we capture an image from a webcam
import numpy as np
import math
from scipy import misc
from array import *
cap = cv2.VideoCapture(0)
_ , cv2_im = cap.read()
cv2_im = cv2.cvtColor(cv2_im,cv2.COLOR_BGR2RGB)
img = PIL_Image.fromarray(cv2_im).convert("L")
Image enhancement
contr = ImageEnhance.Contrast(img)img = contr.enhance(3)
# The enhancement values (contrast and brightness)
bright = ImageEnhance.Brightness(img)
# depends on backgroud, external lightsetc
img = bright.enhance(4.0)
#Adding a border for future cropping
img = ImageOps.expand(img,border=80,fill='white')
inverted = ImageOps.invert(img)
box = inverted.getbbox()
img_new = img.crop(box)
width, height = img_new.size
ratio = min((28./height), (28./width))
background = PIL_Image.new('RGB', (28,28), (255,255,255))
if(height == width):
img_new = img_new.resize((28,28))
elif(height>width):
img_new = img_new.resize((int(width*ratio),28))
background.paste(img_new, (int((28-img_new.size[0])/2),int((28-img_new.size[1])/2)))
else:
img_new = img_new.resize((28, int(height*ratio)))
background.paste(img_new, (int((28-img_new.size[0])/2),int((28-img_new.size[1])/2)))
background
img_data=np.asarray(background)
img_data = img_data[:,:,0]
misc.imsave('/home/xilinx/img_webcam_mnist.png', img_data)
#Resize the image and invert it (white on black)
smallimg = ImageOps.invert(img_load)
smallimg = smallimg.rotate(0)
data_image = array('B')
pixel = smallimg.load()
for x in range(0,28):
for y in range(0,28):
if(pixel[y,x] == 255):
data_image.append(255)
else:
data_image.append(1)
# Setting up the header of the MNIST format file - Required as the hardware is designed for MNIST dataset
hexval = "{0:#0{1}x}".format(1,6)
header = array('B')
header.extend([0,0,8,1,0,0])
header.append(int('0x'+hexval[2:][:2],16))
header.append(int('0x'+hexval[2:][2:],16))
header.extend([0,0,0,28,0,0,0,28])
header[3] = 3 # Changing MSB for image data (0x00000803)
data_image = header + data_image
output_file = open('/home/xilinx/img_webcam_mnist_processed', 'wb')
data_image.tofile(output_file)
output_file.close()
class_out = hw_classifier.classify_mnist("/home/xilinx/img_webcam_mnist_processed")
print("Class name: {0}".format(hw_classifier.class_name(class_out)))
?
訓(xùn)練時(shí)放置在類名 1 下的針織面料圖像的輸出。
推理耗時(shí) 7.00 微秒分類率:每秒 142857.14 張圖像
班級(jí)名稱:1
偉大的。我們的模型能夠成功地確定織物結(jié)構(gòu),并且它使用硬件進(jìn)行推理,速度非常快!
制作 XYZ 滑塊
制作這種 XYZ 滑動(dòng)機(jī)構(gòu)是為了從織物的不同區(qū)域采集多個(gè)樣本,而不會(huì)在校準(zhǔn)后改變相機(jī)和傳感器之間的距離。它是 3D 打印部件和金屬制造部件的混合體。附上 3D 打印文件。
使用 EAGLE 設(shè)計(jì)了一個(gè) PCB,以使用 A4988 步進(jìn)電機(jī)驅(qū)動(dòng)器控制 4 個(gè)步進(jìn)電機(jī)。這些驅(qū)動(dòng)程序使用 STM32 F103C8T6 MCU 進(jìn)行控制。MCU根據(jù)Ultra96板通過Serial發(fā)送的數(shù)據(jù)控制各軸的絕對(duì)位置。附上 PCB gerber 文件和 STM32-Arduino 代碼。(轉(zhuǎn)到頁面末尾!)
您還需要為 Arduino 下載AccelStepper 庫。
MCU 期望以 '、' 作為分隔符的絕對(duì)位置和 * 表示字符串結(jié)束。我們可以輕松地生成一個(gè)字符串并使用 pySerial 通過串行方式發(fā)送它。
?

?
使用 Flask 創(chuàng)建 Web 界面
現(xiàn)在我們的代碼可以正常工作了,讓我們把所有東西放在一起。您可以使用 Flask 快速為您的圖像處理應(yīng)用程序生成一個(gè)漂亮的 webapp。而且很棒的是,Ultra96 開發(fā)板預(yù)裝了 Flask!您可以在 GitHub 上找到如何將 Flask 與 OpenCV 一起使用的一個(gè)很好的示例。
https://github.com/log0/video_streaming_with_flask_example
借助一點(diǎn) Bootstrap 和 Javascript 的魔力,您可以制作一個(gè)真正響應(yīng)式的 Web GUI,如下所示。即:我沒有提供整個(gè) Flask GUI,因?yàn)樗匀皇且粋€(gè)正在開發(fā)的用于商業(yè)用途的項(xiàng)目,但是如果您對(duì)如何制作 GUI 有任何疑問,我們非常樂意為您提供幫助。

結(jié)果
基于 Sobel 濾波器的紗線檢測(cè)是對(duì)來自 3 個(gè)不同織物樣本的 30 個(gè)圖像進(jìn)行的。下圖顯示了使用的樣本類型。

通過將相機(jī)放置在織物的不同部分上,獲得相同織物的不同樣品。紗線檢測(cè)算法在每個(gè)樣品的 10 張這樣的照片上運(yùn)行。結(jié)果表明,機(jī)織織物的準(zhǔn)確度 <94%,針織物的垂直毛圈結(jié)構(gòu)準(zhǔn)確度為 90%。(根據(jù)要求提供表格結(jié)果)

?
使用紗線像素區(qū)域的 GSM 測(cè)定
50 個(gè)不同的織物樣本(每個(gè)不同點(diǎn) 4 幀,共 200 張圖像),標(biāo)稱 GSM 為 107 GSM,用于該測(cè)試。全范圍誤差(最大讀數(shù)為 250GSM)被制成表格。下圖描述了讀數(shù)相對(duì)于實(shí)際值的變化。

可以觀察到相當(dāng)大的偏差,但這在織物行業(yè)中是可以接受的。然而,這可以通過增強(qiáng)算法進(jìn)一步最小化。
結(jié)論
Ultra96 板對(duì)于初學(xué)者和專家來說都是一個(gè)很棒的板。它與 PYNQ 的兼容性將其提升到了一個(gè)全新的水平。如果您對(duì) Xilinx 提供的令人驚嘆的計(jì)算機(jī)視覺和 BNN 庫不滿意,您可以使用 Vivado 編寫自己的“疊加層”,并在硬件上運(yùn)行某些部分(甚至整個(gè)程序)。
在硬件層中運(yùn)行卷積(對(duì)于 Sobel、Smoothing、Erosion、Blurs)等操作可以大大減少算法的運(yùn)行時(shí)間。然而,在這個(gè)應(yīng)用程序中,幀速率受到資源密集型輪廓檢測(cè)和相機(jī)的最大幀速率(24fps)的限制。
希望 Avnet 和 Xilinx 為 PYNQ 和 Ultra96 創(chuàng)建越來越多的資源和庫,這使開發(fā)人員能夠快速測(cè)試他們的想法,而無需經(jīng)歷從頭開始構(gòu)建一切的麻煩。
- Ultra96硬件用戶指南
- Ultra96 SDR第一部分:簡(jiǎn)單的射頻頻譜圖Web應(yīng)用程序
- Ultra96 CSI-2視頻輸出到Raspberry Pi攝像頭輸入
- Ultra96上的實(shí)時(shí)攝像頭饋送網(wǎng)頁
- 使用PYNQ的Ultra96面部識(shí)別鎖栓
- 使用Tensil、TF-Lite和PYNQ在Ultra96板上運(yùn)行YOLO v4 Tiny
- 在Ultra96 V2平臺(tái)上用Python實(shí)現(xiàn)人臉檢測(cè)和人臉跟蹤
- 用于Ultra96的夾層板96AnalogXperience
- Ultra96 FPGA上的Live NYC Subway Monitor應(yīng)用程序
- 關(guān)于Ultra96的Xilinx DDS編譯器IP教程
- 與Ultra96聯(lián)網(wǎng)端口轉(zhuǎn)發(fā)
- Ultra96 V2上基于標(biāo)記的增強(qiáng)現(xiàn)實(shí)
- Ultra96皮膚癌AI構(gòu)建
- 2018.2 Ultra96:從 Matchbox 桌面關(guān)斷 PetaLinux BSP,無法關(guān)斷電路板
- 一起玩Ultra96之GPIO操作
- 使用PYNQ訓(xùn)練和實(shí)現(xiàn)BNN 592次閱讀
- 米爾PYNQ開發(fā)板來了 964次閱讀
- dfrobotSIM808 GPS/GPRS/GSM擴(kuò)展板簡(jiǎn)介 2209次閱讀
- 源創(chuàng)通信SinoV-GSM400P 4線 GSM 無線Asterisk卡介紹 2589次閱讀
- 源創(chuàng)通信SINOV-GSM800P 8GSM模塊 Asterisk卡介紹 2837次閱讀
- 介紹用GSM網(wǎng)絡(luò)發(fā)現(xiàn)WCDMA盲區(qū)及盲區(qū)難點(diǎn)排查 612次閱讀
- PYNQ中MicroBlaze程序文件的加載過程 2271次閱讀
- 詳解Xilinx公司Zynq? UltraScale+?MPSoC產(chǎn)品 3357次閱讀
- 微軟正在尋求將觸摸傳感器帶入其硬件的織物材料中去 890次閱讀
- 基于Arm技術(shù)的16nm MPSoC開發(fā)套件Ultra96 6201次閱讀
- PYNQ 基于Zynq架構(gòu)添加了對(duì)python的支持 8860次閱讀
- gsm模塊如何與單片機(jī)通信? 2.7w次閱讀
- gsm模塊有哪些_常見三款GSM模塊介紹 9.5w次閱讀
- gsm模塊是什么_gsm模塊工作原理_gsm模塊的應(yīng)用 5.1w次閱讀
- 基于GSM的工業(yè)過程控制的實(shí)現(xiàn) 3422次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論