## 說明
本文為東哥原創(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ā)板信息可以參考下面的這個硬件配置圖

## 準(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ù),外接攝像頭進行實時檢測,對生活中的垃圾進行檢測分類,輔助人們進行垃圾的投遞,提升垃圾回收效率。


**數(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)料瓶
```
經(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、散熱**

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)用, 希望能帶給大家一些參考意見。