2019年11月18日 星期一

apt-get update異常處理

1. 問題描述

系統環境:Ubuntu 18.04.3 LTS

執行apt-get update更新時遇到如下狀況

錯誤訊息:
Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
  Could not resolve 'security.ubuntu.com'
Err:2 http://tw.archive.ubuntu.com/ubuntu bionic InRelease               
  Could not resolve 'tw.archive.ubuntu.com'
Err:3 http://packages.ros.org/ros/ubuntu bionic InRelease                
  Could not resolve 'packages.ros.org'
Err:4 http://tw.archive.ubuntu.com/ubuntu bionic-updates InRelease
  Could not resolve 'tw.archive.ubuntu.com'
Err:5 http://tw.archive.ubuntu.com/ubuntu bionic-backports InRelease
  Could not resolve 'tw.archive.ubuntu.com'
Reading package lists... Done
W: Failed to fetch http://tw.archive.ubuntu.com/ubuntu/dists/bionic/InRelease  Could not resolve 'tw.archive.ubuntu.com'
W: Failed to fetch http://tw.archive.ubuntu.com/ubuntu/dists/bionic-updates/InRelease  Could not resolve 'tw.archive.ubuntu.com'
W: Failed to fetch http://tw.archive.ubuntu.com/ubuntu/dists/bionic-backports/InRelease  Could not resolve 'tw.archive.ubuntu.com'
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease  Could not resolve 'security.ubuntu.com'
W: Failed to fetch http://packages.ros.org/ros/ubuntu/dists/bionic/InRelease  Could not resolve 'packages.ros.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.


2. 解決方法

Linux Force DHCP client (dhclient) to renew ip address

Linux renew ip command
$ sudo dhclient -r //release ip 釋出IP
$ sudo dhclient //獲取IP


Now obtain fresh IP:
$ sudo dhclient

$ sudo ifdown eth0
$ sudo ifup eth0
$ sudo /etc/init.d/network restart
OR
$ sudo /etc/init.d/networking restart

參考資料


2019年11月15日 星期五

麥輪車開發相關問題

  1. MeOrion 記憶空間不足
  2. 說明:
      MeOrion採用Arduino Uno架構,記憶體空間只有2048 bytes。若是要同時使用Makeblock及ros的函式庫,則會使得超過記憶體空間大小。

    處理方式:
    1. 透過修改ros nodehandle的宣告方式,減少rosarduino使用的publisher及subscriber數量,可以減少使用空間。但測試後仍然還是不夠使用。實際做法可參考此篇部落格 Using rosserial for a ATmega168/Arduino based motorcontroller

    2. 改為使用MeAuriga開發版,此開發版為Arduino 2560的架構,具有flash memory 256 KB。即可同時使用Mackblock及rosarduino函式庫。 

  3. MeAuriga無法與Raspberry PI3 進行連線
  4. 說明:
    1. Raspberry PI3預設將UART串口指定連接至藍芽介面

    2. MeAuriga UART埠為Serial2,但rosarduino預設為Serial

    處理方式
    1. 修改Raspberry PI3 UART設定的路徑,改為連接至UART Serial串口
      可參考此部落格,樹莓派3 串列埠使用 raspberry pi 3B+ uart boot overlay

    2. 修改rosarduino呼叫時,使用的nodehandle預設的UART埠,實際做法如下:

  5. ROS與C# UI連線之後,在使用者沒有操作的情況下,ROS端的callback函式也沒有做動
  6. 說明:
      ros端,Socket.recv 指令會導致系統block,才使得callback函式沒有執行

    處理方式
      在Socket初始化完成之後,加上fcntl函式設定socket參數為O_NONBLOCK,參考如下
      Beej's Guide to Network Programming 正體中文版




2019年7月26日 星期五

學習經典卷積神經網路一 (LeNet、AlexNet、VGGNet)

說明

簡單紀錄以下幾個經典卷積神經網路 ( AlexNet 、 VGGNet 、 Google Inception Net 、 ResNet ) 的概念及創新技術點。下圖為他們出現的順序及時間,其中AlexNet的出現為整個CNN的發展,帶來相當重大的一個突破。



並且它們分別在 ILSVRC ( ImageNet Large Scale Visual Recognition Challenge ) 比賽項目中取得如下的成就:
  1. AlexNet - 2012年冠軍 ( top-5 錯誤率 16.4%,使用額外資料可達15.3%,8層神經網路)
  2. VGGNet - 2014 年亞軍 ( top-5 錯誤率7.3%,19層神經網路 ) 
  3. Google Inception Net - 2014 年冠軍 ( top-5 錯誤率 6.7%,22層神經網路 ) 
  4. ResNet - 2015 年的冠軍 ( top-5 錯誤率 3.57% ,152 層神經網路 )

ILSVRC 的 top-5 錯誤率在最近幾年取得重大突破,而主要的突破點都是在深度學習和卷積神經網路,成績的大幅提升幾乎都伴隨著卷積神經網路的層數加深。目前在 ImageNet50 資料集上人眼能夠達到的錯誤率大約在 5.1%,而 ILSVRC 2015年冠軍 ResNet  (152層 ) 的成績已能夠達到錯誤率 3.57%。代表神經網路已基本解決了 ImageNet 資料集上的圖片分類問題。

「ILSVRC 層數」的圖片搜尋結果


LeNet (論文連結)

1998年,由電腦科學家Yann LeCun等提出的LeNet5採用了基於梯度的反向傳播演算法對網路進行有監督的訓練,Yann LeCun在機器學習、計算機視覺等都有傑出貢獻,被譽為卷積神經網路之父。 
LeNet5網路通過交替連接的卷積層 (Convolutions) 和池化層 (Subsampling),將原始影像逐漸轉換為一系列的特徵,之後再將這些特徵傳遞給全連接層 (Full Connection) 進行分類,並成功應用於手寫體識別。學術界對於卷積神經網路的關注,也正是開始於LeNet5網路的提出。LeNet網路架構如下。




卷積神經網路的特點在於 區域性連線 (Local Receptive Field)、權值共享 (Shared Weights)。
(1) 區域性連線 (Local Receptive Field)卷積網路的節點僅和其前一層的部分節點相連線,只用來學習區域性特徵。區域性感知結構的構思理念來源於動物視覺的皮層結構,其指的是動物視覺的神經元在感知外界物體的過程中起作用的只有一部分神經元。在計算機視覺中,影象中的某一塊區域中,畫素之間的相關性與畫素之間的距離同樣相關,距離較近的畫素間相關性強,距離較遠則相關性就比較弱,由此可見區域性相關性理論也適用於計算機視覺的影象處理領域。這種區域性連線的方式大幅減少了引數數量,加快了學習速率,同時也在一定程度上減少了過擬合的可能。


(2) 權值共享 (Shared Weights) 在卷積神經網路中,神經元對應的權值是相同的。由於權值相同,因此可以減少訓練的引數量。共享的權值和偏置也被稱作卷積核。

(3) 池化 (Pooling) - 池化層是卷積神經網路中另一個重要的概念,它實際上是一種形式的降採樣。透過將鄰近的區域內的特徵點整合得到新的特徵,用更高層的抽象表示圖像特徵達到降低維度的結果。並且因為區域降維的關係,具有對鄰近小區域抗干擾的能力。同時也減少了過度擬合 (over-fitting) 的情況。目前常見的作法有 mean-pooling、max-pooling和stochastic-pooling等三種,其中又以最大池化層 (Max-pooling) 最為常見。

AlexNet 

由深度學習大神 Hinton 的學生 Alex 於 2012年提出的深度卷積神經網路模型 AlexNet,將 LeNet 模型的思想發揚光大,把 CNN 的基本原理應用到了很深很寬的網路中。AlexNet 使用到的新技術點如下:

(1) ReLU - AlexNet成功使用 ReLU 作為 CNN 的啟動函數,並驗證其效果在較深的網路超過了 Sigmoid,成功解決了 Sigmoid 在網路較深時的梯度消失問題。

(2) Dropout - 訓練時使用 Dropout 隨機忽略一部分神經元,以避免模型過度擬合。

(3) 使用重疊的最大池化 ( max pooling ) - 此前 CNN 中普遍使用平均池化,而 AlexNet 中則全部使用最大池化,避免平均池化的模糊化效果。並且 AlexNet 提出讓步長比池化核的尺寸小,這樣池化層的輸出之間會有重疊和覆蓋,提升了特徵的豐富性。

(4) 提出 LRN 層 - 對局部神經元的活動建立競爭機制,使得其中響應較大的值變得更大,並抑制其他回饋較小的神經元,增強了模型的泛化性。

(5) 使用 CUDA 加速深度卷積網路的訓練

(6) 資料增強 ( data argumentation ) - 透過擷取影像中不同部位的子影像,以及水平翻轉的鏡像影像等作法,增加資料的豐富性,可以大大減輕過度擬合,提升泛化能力。


AlexNet 網路結構如下:
「Alexnet 網路結構」的圖片搜尋結果



VGGNet 

VGGNet 是牛津大學電腦視覺組 ( Visual Geometry Group ) 和 Google DeepMind 公司的研究員一起研發的深度卷積神經網路。

VGGNet 探索了卷積神經網路的深度與其效能之間的關係。透過反覆堆疊 3 x 3 的小型卷積核和 2 x 2 的最大池化層,VGGNet 成功構築了 16 ~ 19 層深的卷積神經網路。VGGNet 相比之前的網路結構,錯誤率大幅下降許多。同時 VGGNet 的拓展性很強,遷移到其他影像資料的泛化性非常好。VGGNet 的特點如下:


(1) 探索卷積神經網路的深度與其效能之間的關係 - 下圖為 VGGNet 各級別的網路結構圖,以及每一級別的參數量,從 11 層的網路一直到 19 層的網路都有詳盡的效能測試。其中 D、E 網路結構,也就是我們常說的 VGGNet-16 和 VGGNet-19。

「VGGNET 各級別參數量」的圖片搜尋結果

VGGNet 擁有 5 段卷積,每一段內有 2 ~ 3 個卷積層,同時每段尾部會連接一個最大池化層用來縮小圖片尺寸。每段內的卷積核數量一樣,越靠後段的卷積核數量越多。

(2) 使用同樣大小的卷積核 - VGGNet 中全部使用了 3 x 3 的卷積核和 2 x 2 的最大池化核。如下圖所示,兩個 3 x 3 的卷積層串聯相當於一個 5 x 5 的卷積層,即一個像素會跟周圍 5 x 5的像素產生關聯,可視為感受區大小為 5 x 5。
 ã€ŒVGGNET 卷積層 等效」的圖片搜尋結果

而 3 個 3 x 3 的卷積層串聯的效果則相當於 1 個 7 x 7 的卷積層。但 3 個串聯的 3 x 3 卷積層,擁有比 1 個 7 x 7 的卷積層更少的參數量,只有後者的 ( 3 * 3 * 3 ) / ( 7 * 7 ) = 55%。最重要的是, 3 個 3 x 3的卷積層擁有比 1 個 7 x 7 的卷積層更多的非線性變換 ( 前者可以使用三次 ReLU啟動函數,而後者只有一次 )。

(3) 採用 Multi-Scale 的方法 - 預測時將原始影像 Scale至不同的尺寸 ,並對不同尺寸進行分類預測,再將不同尺寸的預測結果平均得到最後結果。另外還使用 Multi-Scale的方法做資料增強,將原始影像縮放到不同尺寸,然後再隨機裁 224 x 224 的圖片。



另外Google Inception Net、ResNet則下次有機會再說明了...

參考資料






2019年1月31日 星期四

Jetson TX2上DeepStream安裝與範例執行 (deepstream-plugins)

DeepStream SDK是為大規模創建和部屬基於AI的視智慧視訊分析(IVA)方案而設計的,它提供完整的框架和所有基本構建模組。它可以讓開發者專注於自己的核心深度學習網路和應用,而不是從頭開始設計端到端解決方案。

應用程式開發人員可以使用此SDK快速構建原型,並構建從智慧相機到智慧城市應用裝置,機器人和工業自動化等產品。

NVIDIA DeepStream SDK官網介紹


Jetson上的DeepStream SDK使用Jetpack,包括L4T,多媒體API,CUDA和TensorRT。 SDK提供了豐富的外掛和庫集合,使用Gstreamer框架構建,使開發人員能夠構建靈活的應用程式,將視訊轉化為有價值的見解。DeepStream還附帶了示例應用程式,包括原始碼和應用程​​序適配指南,以幫助開發人員快速開始構建。

本篇執行的平台為 Jetson TX2,搭配軟體版本為:
1. Jetpack 3.3
2. CUDA 9.0
3. TensorRT 4.0

包含 DeepStream 安裝和範例 (deepstream-plugins) 執行測試兩個部分。主要紀錄在執行過程中遇到的問題,以及解決方式。

1. Jetson TX2上DeepStream安裝過程

首先,安裝步驟在以下這篇文章有完整的說明 ,按照其步驟執行即可。
Jetson TX2上运行Deepstream范例

錯誤 1.

在執行安裝的最後一步驟,測試安裝結果時:
$ nvgstiva-app -c ${HOME}/configs/PGIE-FP16-CarType-CarMake-CarColor.txt

出現以下錯誤訊息:
error_message: Segmentation fault (core dumped)

解決方式:
參考此篇NVIDIA論壇的回覆,執行以下指令將快取暫存內容清除即可。
$ rm ~/Model/*/*.cache
$ rm ~/.cache/gstreamer-1.0/ -rf


錯誤 2.

解決了Segmentation fault之後,接著很快就遇到另一個錯誤訊息。
error_message: Error from src_elem: Your GStreamer installation is missing a plug-in.
Missing decoder: H.264 (High Profile)

此錯誤主要是因為我的系統中缺少H.264的decoder (gstreamer),GStreamer的安裝指令如下。
$ sudo apt-get install gstreamer1.0-libav

安裝完成後應該就能夠順利執行DeepStream指令了!

2. deepstream-plugins範例執行 (github)


(2.1) 按照 github 上 Readme 說明,先安裝 Pre-requisites,及Setup步驟。

Installing Pre-requisites:

Install GStreamer pre-requisites using:
$ sudo apt-get install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
Install Google flags using:
$ sudo apt-get install libgflags-dev
1. 修改Makefile.config,按照個人電腦配置設定,參考如下:
#Update the install directory paths for dependencies below CXX=g++ 
CUDA_VER:=9.0
#Set to TEGRA for jetson or TESLA for dGPU's
PLATFORM:=TEGRA
#For Tesla Plugins 

OPENCV_INSTALL_DIR:= /path/to/opencv-3.4.x
TENSORRT_INSTALL_DIR:= /path/to/TensorRT-5.x
DEEPSTREAM_INSTALL_DIR:= /path/to/DeepStream_Release_3.0
#For Tegra Plugins
NVGSTIVA_APP_INSTALL_DIR:= /home/nvidia/nvgstiva-app_sources


2. 下載YOLOv3模型 (For yolo v3)
$ wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov3.cfg
$ wget https://pjreddie.com/media/files/yolov3.weights

3. 修改 "data/yolo/calibration_images.txt" 輸入圖片路徑

4. 執行安裝 (For tegra)
$cd sources/plugins/gst-yoloplugin-tegra
make && sudo make install


(2.2) 執行 nvgstiva-app [TEGRA platform only]

1. 按照 github 說明修改配置文件 config/nvgstiva-app_yolo_config.txt

2. 執行指令
$ nvgstiva-app -c config/nvgstiva-app_yolo_config.txt

錯誤 1.

輸入執行指令後,遇到以下錯誤訊息
** WARN: : Using software video decoder instead of hardware accelerated OMX decoder. Unsupported format. Try re-encoding.
** ERROR: : Failed to link decodebin to pipeline 
** INFO: : Pipeline running 

解決方式:
參考此篇論壇回復,需要再另外安裝以下套件:
$ apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools



(2.3) 測試trt-yolo-app

Object Detection using trt-yolo-app

$ cd sources/apps/trt-yolo
$ make && sudo make install
$ cd ../../../
$ trt-yolo-app --flagfile=config/yolov3.txt


錯誤 1.

trt-yolo-app編譯錯誤,錯誤訊息如下。

trt_utils.h:83:22: error: ‘nvinfer1::DimsHW YoloTinyMaxpoolPaddingFormula::compute(nvinfer1::DimsHW, nvinfer1::DimsHW, nvinfer1::DimsHW, nvinfer1::DimsHW, nvinfer1::DimsHW, const char*) const’ marked ‘override’, but does not override 
nvinfer1::DimsHW compute(nvinfer1::DimsHW inputDims, nvinfer1::DimsHW kernelSize,  




解決方式:

參考此篇論壇回復,deepstream-plugins改為使用DS2 Release版本即可。(下載連結)

錯誤 2. 選擇不同的YOLO模型

無法透過選擇不同的yolo.txt,去切換yolo模型 (yolov3.txt -> yolov3-tiny.txt)

解決方式:
(1) 需要修改文件 “./sources/lib/network_config.h”,並重新編譯才行。

(2) 並且需要將模型檔案放置於“./data/”中。



2019年1月28日 星期一

Jetson TX2安裝OpenCV3.4

TX2 install OpenCV3.4

在將TX2上原本的OpenCV升級至v3.4.0的過程中遇到了一些阻礙,將問題紀錄下來。


1. 安裝教學

此篇安裝教學寫得非常詳細,安裝的步驟大致與其相同
How to Install OpenCV (3.4.0) on Jetson TX2

在OpenCV安裝(更新)完成之後,能夠順利地import cv2執行。
但再重新開機之後卻會出現如下錯誤。




Error message
"ImportError: /usr/local/lib/python3.5/dist-packages/cv2.cpython-35m-aarch64-linux-gnu.so: undefined symbol: _ZTIN2cv3dnn19experimental_dnn_v35LayerE"


2. 解決方式

這個問題主要的原因是因為,需要更新環境變數 (/etc/bash.bashrc)。

以下這篇文章說明了一些可能問題的解決方法,其中也包括更新環境變數的方法。
Jetson TX2--python3下编译安装opencv3.4


1. 開啟文件 (/etc/bash.bashrc)
sudo vim /etc/bash.bashrc

2. 在文件底部加入以下內容,並儲存
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

#添加完成後應該會如下圖


之後就可以順利使用OpenCV囉~

apt-get update異常處理

1. 問題描述 系統環境:Ubuntu 18.04.3 LTS 執行apt-get update更新時遇到如下狀況 錯誤訊息: Err:1 http://security.ubuntu.com/ubuntu bionic-security InRe...