東哥教你如何用Orange Ai pro為家里做一個垃圾分類檢測機器

## 說明

本文為東哥原創(chuàng),東哥科技,暢想未來科技,官方網(wǎng)站:[www.dgstudyblog.top](www.dgstudyblog.top)

## 前言

最近入手了一塊香橙派(Orange Ai Pro)的板子,他們的口號是:為AI而生,這讓一個算法工程師按捺不住了, 之前主要是在RKNN和ESP32等設(shè)備上部署AI模型,看到官方介紹的強大AI算力,很想知道能否滿足工作生活中的實時視頻流模型部署,也為未來公司的戰(zhàn)略部署多做一份準(zhǔn)備。

AIpro是一款采用昇騰AI技術(shù)路線的強大開發(fā)板,配備4核64位處理器, 8GB的LPDDR4X內(nèi)存,就足以滿足大部分的AI推理應(yīng)用場景,AI Pro 配備8TOPS-12TOPS的AI算力,相當(dāng)于英偉達(dá)的RTX3080顯卡,同時很多車企早期L2級自動駕駛的算力需求也才2-2.5TOPS,所以在AI 算力方面完全是充足的。

同時開發(fā)板支持外接eMMC模塊,從32GB到256GB, 充足的存儲空間能夠滿足日常開發(fā)所需。

AI Pro還支持外接4K的高清顯示器,能夠利用HDMI幫我們更好的可視化操作,大大提升了開發(fā)體驗,只需要自帶一個小的顯示屏,便可以做一臺便攜mini電腦。

更多的開發(fā)板信息可以參考下面的這個硬件配置圖

![](https://devpress.csdnimg.cn/5ab9e4bb84fc4abc9b970b0a9207c7e6.png)![](https://i-blog.csdnimg.cn/direct/49e01819e60f45378ede80a8e4bc6136.jpeg#pic_center)

## 準(zhǔn)備

1. 一塊Orange Ai Pro

相關(guān)的硬件資料可參考:[Orange Ai Pro 介紹和應(yīng)用](https://www.hiascend.com/forum/thread-0285140173361311056-1-1.html "Orange Ai Pro 介紹和應(yīng)用")

購買地址: [淘寶](https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.52de3d0dSuCWxb&ft=t&id=754769404362 "淘寶") 、[京東](https://item.jd.com/10092318175356.html "京東")

2. 一個USB 攝像頭

主要用于實時檢測素材

3. 外接鼠標(biāo)、鍵盤

4. 顯示器

用于可視化操作Orange Ai Pro

## 鏡像燒錄

需要下載官方的燒錄工具, 將鏡像燒錄到存儲卡內(nèi),官方鏡像地址:[下載地址](https://cloud.tencent.com.cn/developer/tools/blog-entry?target=http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-AIpro.html&source=article&objectId=2425172)

## 開機登錄

接好設(shè)備后,就可以點擊開機按鈕, 我這邊的設(shè)備主要是1個攝像頭,1塊32G的存儲卡,系統(tǒng)這邊用的是Ubuntu系統(tǒng),比較適合個人的習(xí)慣

## 環(huán)境準(zhǔn)備

### 配置編譯依賴的頭文件與庫文件路徑

```c

export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest

export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub

```

### 安裝ACLLite庫和ffmpeg

**Tips: ACLLite是必備的庫文件**

```c

apt-get install ffmpeg libavcodec-dev libswscale-dev libavdevice-dev

```

獲取ACLLite 源碼

```c

git clone https://gitee.com/ascend/ACLLite.git

```

進入到項目目錄進行編譯, 會編譯到上面設(shè)置的lib 目錄

```c

bash build_so.sh

```

**到這里環(huán)境的基本配置已經(jīng)完成了,接下來就是代碼的準(zhǔn)備和編譯了**

### 官方的Ai Demo項目

```c

git clone https://gitee.com/ascend/EdgeAndRobotics.git

```

這是官方提供的sample demo ,里面有基礎(chǔ)的圖像檢測,分類,人臉識別等demo,可以幫助我們快速上手,同時也適合在源碼上根據(jù)需要進行二次修改。

### 模型轉(zhuǎn)換

Orange Ai pro 需要的是.om的格式,我們需要把pt 的模型轉(zhuǎn)成onnx 再利用平臺的 Atc工具轉(zhuǎn)成.om的格式

**什么是ATC**

昇騰張量編譯器(Ascend Tensor Compiler,簡稱ATC)是昇騰CANN架構(gòu)體系下的模型轉(zhuǎn)換工具,類似RKNN或hisi 都有自己處理器需要的模型格式,CANN架構(gòu)也不例外。

- 它可以將開源框架的網(wǎng)絡(luò)模型(例如TensorFlow、ONNX等)轉(zhuǎn)換為昇騰AI處理器支持的模型文件(.om格式),用于后續(xù)的模型推理

- 它可以將基于Ascend IR定義的單算子描述文件(*.json格式)轉(zhuǎn)換為昇騰AI處理器支持的模型文件(.om格式),后續(xù)在整網(wǎng)中驗證算子功能

**如何轉(zhuǎn)換**

```c

atc --model=yolov5s.onnx --framework=5 --output=yolov5s --input_shape="images:1,3,640,640"? --soc_version=Ascend310B4? --insert_op_conf=aipp.cfg

```

--framework:原始網(wǎng)絡(luò)模型框架類型,5表示onnx。

--soc_version:模型轉(zhuǎn)換時昇騰AI處理器的版本,例如Ascend310B1。

--model:原始網(wǎng)絡(luò)模型文件,含擴展名。

--weight:原始網(wǎng)絡(luò)模型權(quán)重文件路徑,含文件名,僅當(dāng)原始網(wǎng)絡(luò)模型是Caffe時需要指定。

--output:轉(zhuǎn)換后的*.om模型文件路徑,含文件名,轉(zhuǎn)換成功后,模型文件名自動以.om后綴結(jié)尾

--insert_op_conf: 模型相關(guān)的配置文件,包含圖像大小,預(yù)處理等參數(shù)

**tips: 內(nèi)存小于8G最好將atc 的進程數(shù)減少,否則轉(zhuǎn)換可能會報錯**

```c

export TE_PARALLEL_COMPILER=1

export MAX_COMPILE_CORE_NUMBER=1

```

**你也可以下載官方的yolov5 模型**

```c

#下載yolov5s的模型和轉(zhuǎn)換模型

wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/yolov5s.onnx --no-check-certificate

wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/yolov5s/aipp.cfg --no-check-certificate

```

## 搭建Orange Ai Pro 垃圾檢測項目

### 項目說明

項目的重點是利用計算機視覺技術(shù),外接攝像頭進行實時檢測,對生活中的垃圾進行檢測分類,輔助人們進行垃圾的投遞,提升垃圾回收效率。

![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/9c7fbb4c540c4b5889ac745cb761ce13.jpeg)

![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/82b0ebde35894aeeb2a13a63eb03cfe6.jpeg)

**數(shù)據(jù)集**

我這里是利用了之前公司做的垃圾分類數(shù)據(jù)集訓(xùn)練的垃圾分類模型,訓(xùn)練數(shù)據(jù)總共19000張,驗證集3000張,準(zhǔn)確率92%。

**模型**

利用yolov5 原有基礎(chǔ)上進行模型的搭建,修改了核心的backbone, 加入了注意力機制。

```c

class SE(nn.Module):

? ? def __init__(self, c1, c2, ratio=16):

? ? ? ? super(SE, self).__init__()

? ? ? ? #c*1*1

? ? ? ? self.avgpool = nn.AdaptiveAvgPool2d(1)

? ? ? ? self.l1 = nn.Linear(c1, c1 // ratio, bias=False)

? ? ? ? self.relu = nn.ReLU(inplace=True)

? ? ? ? self.l2 = nn.Linear(c1 // ratio, c1, bias=False)

? ? ? ? self.sig = nn.Sigmoid()

? ? def forward(self, x):

? ? ? ? b, c, _, _ = x.size()

? ? ? ? y = self.avgpool(x).view(b, c)

? ? ? ? y = self.l1(y)

? ? ? ? y = self.relu(y)

? ? ? ? y = self.l2(y)

? ? ? ? y = self.sig(y)

? ? ? ? y = y.view(b, c, 1, 1)

? ? ? ? return x * y.expand_as(x)

```

**模型部署**

在源碼demo中,基于 YOLOV5USBCamera 項目進行修改,基本上官方已經(jīng)很好的把模型的加載和推理等模塊,基于這個項目進行修改部署。

```c

class sampleYOLOV7(object):

? ? '''load the model, and do preprocess, infer, postprocess'''

? ? def __init__(self, model_path, model_width, model_height):

? ? ? ? self.model_path = model_path

? ? ? ? self.model_width = model_width

? ? ? ? self.model_height = model_height

? ? def init_resource(self):

? ? ? ? # initial acl resource, create image processor, create model

? ? ? ? self._resource = AclLiteResource()

? ? ? ? self._resource.init()


? ? ? ? self._dvpp = AclLiteImageProc(self._resource)

? ? ? ? self._model = AclLiteModel(self.model_path)

? ? def preprocess(self, frame):

? ? ? ? # resize frame, keep original image

? ? ? ? self.src_image = frame

? ? ? ? self.resized_image = cv2.resize(frame, (self.model_width, self.model_height))

? ? def infer(self):

? ? ? ? # infer frame

? ? ? ? image_info = np.array([640, 640,

? ? ? ? ? ? ? ? ? ? ? ? ? ? 640, 640],

? ? ? ? ? ? ? ? ? ? ? ? ? ? dtype=np.float32)

? ? ? ? self.result = self._model.execute([self.resized_image, image_info])

```

也可以參考這個官方項目:[ https://gitee.com/ascend/samples/tree/master/python/contrib/garbage_picture](https://gitee.com/ascend/samples/tree/master/python/contrib/garbage_picture)

## 模型準(zhǔn)備

利用yolov5 代碼訓(xùn)練出垃圾分類的模型, yolov5 源碼可以在github 下載。

運行export導(dǎo)出onnx模型,拷貝到orange ai pro里。

### 轉(zhuǎn)換模型

將我們的模型轉(zhuǎn)成om的格式,參考上面的模型轉(zhuǎn)換內(nèi)容。

這里可以直接用官方的python版本進行修改

```c

/home/HwHiAiUser/project/EdgeAndRobotics/Samples/YOLOV5USBCamera/python/

```

**項目的目錄設(shè)計如下**

```c

- index.py 模型推理的核心代碼,包含推理類

- main.py? 應(yīng)用的主函數(shù)入口

- imgs? ? 存放推理的結(jié)果

- logs? ? 存放運行的日志

```

編寫index.py, 加入自己的預(yù)處理和后處理邏輯

```c

def preprocess_image(image, cfg, bgr2rgb=True):

? ? """圖片預(yù)處理"""

? ? img, scale_ratio, pad_size = letterbox(image, new_shape=cfg['input_shape'])

? ? if bgr2rgb:

? ? ? ? img = img[:, :, ::-1]

? ? img = img.transpose(2, 0, 1)? # HWC2CHW

? ? img = np.ascontiguousarray(img, dtype=np.float32)

? ? return img, scale_ratio, pad_size

def draw_bbox(bbox, img0, color, wt, names):

? ? """在圖片上畫預(yù)測框"""

? ? det_result_str = ''

? ? for idx, class_id in enumerate(bbox[:, 5]):

? ? ? ? if float(bbox[idx][4] < float(0.05)):

? ? ? ? ? ? continue

? ? ? ? img0 = cv2.rectangle(img0, (int(bbox[idx][0]), int(bbox[idx][1])), (int(bbox[idx][2]), int(bbox[idx][3])),

? ? ? ? ? ? ? ? ? ? ? ? ? ? color, wt)

? ? ? ? img0 = cv2.putText(img0, str(idx) + ' ' + names[int(class_id)], (int(bbox[idx][0]), int(bbox[idx][1] + 16)),

? ? ? ? ? ? ? ? ? ? ? ? ? cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)

? ? ? ? img0 = cv2.putText(img0, '{:.4f}'.format(bbox[idx][4]), (int(bbox[idx][0]), int(bbox[idx][1] + 32)),

? ? ? ? ? ? ? ? ? ? ? ? ? cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)

? ? ? ? det_result_str += '{} {} {} {} {} {}\n'.format(

? ? ? ? ? ? names[bbox[idx][5]], str(bbox[idx][4]), bbox[idx][0], bbox[idx][1], bbox[idx][2], bbox[idx][3])

? ? return img0

```

### 推理結(jié)果

在完成推理后,輸出模型的推理結(jié)果同時保存推理圖像

```c

2-紙盒紙箱

2-紙盒紙箱

3-筷子

5-垃圾桶

9-塑料玩具

16-干電池

22-洗護用品

30-茶葉渣

28-調(diào)料瓶

```

![](https://i-blog.csdnimg.cn/direct/eda41b04192c4d34980fcd238c65d3e6.jpeg#pic_center)經(jīng)過測試發(fā)現(xiàn),推理一張圖像耗費的時間大約為16-20ms之間,后續(xù)還有優(yōu)化的空間

```c

handler img 18.02ms

hanlder img 16.01ms

handler img 19.92ms

handler img 15.02ms

handler img 18.24ms

handler img 17.02ms

handler img 16.82ms

handler img 14.92ms

```

## 性能體驗

對于開發(fā)版的表現(xiàn),總體來說是比較絲滑的,上手體驗較好。

**1、負(fù)載**

能夠?qū)崟r進行推理60FPS的視頻,同時推理一張640*640的圖像大約只要15-20ms,目前沒有做量化設(shè)計,精度還是float16, 做完Int量化后,應(yīng)該還可以進一步提升。

**2、散熱**

![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/124505382a394492809be45c234250cd.png)

Orange AI Pro 在散熱方面還是做的比較好的,配備了散熱風(fēng)扇, 運行3個小時后,板子的溫度還是處于一個較低的溫度,個人覺得散熱效果還是比較讓人滿意的。

**噪音**

體驗了3天下來,只有在開機啟動的時候大約有6~10s左右比較大的聲音,但也在可接受范圍內(nèi),平時運行各種AI模型都是靜默的,幾乎感受不到風(fēng)扇的聲音存在。

## 使用總結(jié)

1、本來以為可能部署會比較麻煩, 需要大量查閱資料后才能完成部署流程,體驗下來發(fā)現(xiàn)官方的材料和項目demo還是比較完善的,基本上可以很快上手,各種環(huán)境的部署也有相應(yīng)完善的文檔, 比我預(yù)期的難度要小的多。

2、同時在AI算力上,推理的速度也非常給力,npu的推理速度可以滿足大部分的實時處理需求,能夠滿足我做一些diy的智能家居方向。

3、豐富的硬件功能,Orang ai pro 配備了豐富的硬件接口,給開發(fā)更復(fù)雜的AI應(yīng)用提供了更多可能性。

總體來說,Orang AI Pro 強大的AI能力和便捷的使用體驗,還是給我留下了美好的印象,未來我也希望能通過Orange AI Pro 創(chuàng)作出更多的AI應(yīng)用,喜歡的朋友千萬不要錯過??!

接下來,我也會利用Orange AI Pro 做一些新的嘗試和AI應(yīng)用, 希望能帶給大家一些參考意見。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容