[圖像]用edge impulse訓練你的目標檢測模型並部署至Linux


從學長推薦這個到跑通大概也就一個下午,edge impulse把模型訓練做的非常方便,標注和訓練都是在網頁端即可完成。在部署到Linux方便也是做的非常便捷,幾乎沒有遇到過很嚴重的問題。

edge impulse的官網
官方文檔
關於目標檢測文檔

這篇文章只是走一遍訓練並部署的流程,並不會提及有關深度學習的知識

那么接下來直接開始

一、創建賬號並新建一個工程

創建賬號就不講了

關於新建工程,新建第一個工程之后會彈出如下界面,我們因為要做目標檢測,所以我們選擇Images->Classify multiple objects

image

image

后面的界面不用選直接get started即可

然后一開始的界面是這樣的:
image

二、收集數據並標注

網站的引導做的很好,我們點擊哪個藍藍的按鈕就是收集數據了,給的收集方式也很多,你可以直接用連接上的板卡去收集數據,調用收集或電腦的攝像頭都是可行的,也可以直接上傳已經拍好的照片。這里的話就以直接上傳拍好的數據為例子了。

image

簡潔明了

標注

我們點擊側邊欄的Data acquisition然后點進去Labeling queue
image

用鼠標拖動畫框,每畫完一個框就會讓你輸入標簽名,完成之后點擊Save labels,就會跳到下一張圖片,重復操作即可。

image

帶上耳機然后慢慢把數據集都標注上吧

三、Impulse design

Create impulse

我們點開側邊欄的Impulse design中的Create impulse
image

需要添加一個預處理塊和深度學習塊,在Processing block中我們可以選擇Image或raw data,然后在Learning block中就只有一個目標檢測的選項了。

之后點保存即可

Image

同樣點進Image中即可

其他一般不用動,我們點進上方的Generate Features,然后等待它生成
最后會有下面的圖

image

如果你的數據集比較好的話,同樣顏色的點會聚集在同一片區域,通過這一點可以去檢查你的數據集質量以及是否有標錯的情況。

Object detection

不懂深度學習的知識的話,直接點綠油油的按鈕就好了,后續可以通過學習來調整其中的參數。

稍候片刻即可。

四、Model testing

這里可以測試你訓練的模型的好壞,同樣點綠色按鈕就一步到位。
image
每張測試集中的圖片都可以點進去具體看結果

五、部署!

5.1 安裝sdk

我這里使用的是官方提供的Linux Python SDK

安裝方法:
對於樹莓派:

sudo apt-get install libatlas-base-dev libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev
pip3 install edge_impulse_linux

對於一般的單板:

pip3 install edge_impulse_linux

如果下載慢甚至下載失敗的話記得換個源或者搞點科*上網

然后是官方提供的sdk代碼和例程

5.2 安裝Linux-impulse-linux

筆者參照的是Linux x86_64,如果是樹莓派或者jsnano的話官方有給更詳細的教程

下面大概率用國內的網是無法完整安裝完成的,所以建議上proxychains4或者其他工具

sudo apt install -y curl
curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -
sudo apt install -y gcc g++ make build-essential nodejs sox gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-base gstreamer1.0-plugins-base-apps
npm config set user root && sudo npm install edge-impulse-linux -g --unsafe-perm

5.3 連接至edge-impulse

在命令行中輸入:

edge-impulse-linux

之后會讓你去登錄網站並選擇工程啥啥的,看着提示來就行
成功的話可以在網站側邊欄Devices中看見自己的設備
image
實際上如果這樣連接上單板電腦的話就可以直接調用單板電腦的攝像頭了

5.4 build模型

edge-impulse-linux-runner

這里官方是需要.eim文件的模型文件,但是我也出錯了,查了查大概是官方用nodejs寫的一個bug
image
其實我們直接手動把它提到轉移失敗的文件復制並重命名為.eim后綴的文件然后放到我們想要的位置,然后給一個777權限即可。

5.5 運行代碼

我比較懶就直接貼我改的官方代碼了
輸入圖像需要320*320,這取決於你訓練時填的參數,如果不匹配的話會導致框出來的框比例不對

import numpy as np
from edge_impulse_linux.image import ImageImpulseRunner

def main():
    model = 'test.eim'
    dir_path = os.path.dirname(os.path.realpath(__file__))
    modelfile = os.path.join(dir_path, model)
    print('MODEL:'+modelfile) # 記得要加777
    
    with ImageImpulseRunner(modelfile) as runner:
        try:
            model_info = runner.init()
            print('loaded runner for"' + model_info['project']['owner']+'/'+model_info['project']['name'] + '"')
            
            labels = model_info['model_parameters']['labels']
            
            cap = cv.VideoCapture(1)  # 攝像頭編號
            if not cap.isOpened():  # 如果攝像頭沒有沒打開就退出程序
                print('cannot open the cam')
                exit()
            while True:
                t = cv.getTickCount()
                ret, frame = cap.read()  # 第一個返回是否有圖像
                if not ret:  # 如果沒有獲取圖像退出
                    print('cam break!')
                    break
                frame = cv.resize(frame,(320,320))
                #frame = cv.resize(frame,None,fx=0.5,fy=0.5)
                
                img = cv.cvtColor(frame,cv.COLOR_BGR2RGB)
                
                features, cropped = runner.get_features_from_image(img)
                
                res = runner.classify(features)
                
                print('Found %d bounding boxes (%d ms.)' % (len(res["result"]["bounding_boxes"]), res['timing']['dsp'] + res['timing']['classification']))
                for bb in res["result"]["bounding_boxes"]:
                    cv.rectangle(frame,(bb['x'],bb['y']),(bb['x']+bb['width'],bb['y']+bb['height']),(0,255,0),2)
                    cv.putText(frame,bb['label']+str(int(100*bb['value'])),(bb['x'],bb['y']),cv.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2,cv.LINE_AA)
                    
                    # print('\t%s (%.2f): x=%d y=%d w=%d h=%d' % (bb['label'], bb['value'], bb['x'], bb['y'], bb['width'], bb['height']))
            
                if cv.waitKey(1) == ord('q'):
                    break
                t = cv.getTickCount()-t
                fps = cv.getTickFrequency()/t
                cv.putText(frame,'fps:'+str(int(fps)),(30,30),cv.FONT_HERSHEY_COMPLEX,0.7,(0,255,0))
                cv.imshow('frame', frame)
            
            cap.release()
            cv.destroyAllWindows()
            
        finally:
            if(runner):
                runner.stop()
    
    
if __name__ == '__main__':
    main()

在僅有100張圖片的數據集下的效果還不錯但是幀數說實話不是很好看
image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM