2020年4月6日 星期一

【Raspberry Pi 4】【python】【openCV】【TensorFlow】對象檢測API安裝教學


1.更新Raspberry Pi


首先,需要對Raspberry Pi進行全面更新。打開終端並發出:

sudo apt-get update
sudo apt-get dist-upgrade


根據您更新Pi的時間長短,升級可能需要一分鐘到一個小時。





2.安裝TensorFlow


接下來,我們將安裝TensorFlow。下載量很大(超過100MB),因此可能需要重新加載。發出以下命令:

pip3 install tensorflow

TensorFlow還需要LibAtlas軟件包。通過發出以下命令進行安裝。(如果此命令不起作用,請發出“sudo易於得到更新”,然後重試)。

sudo apt-get install libatlas-base-dev

在我們討論的同時,讓我們安裝其他將由TensorFlow目標檢測API使用的依賴項。這些列在TensorFlow的目標檢測的GitHub庫存儲中的安裝說明上。問題:

sudo pip3 install pillow lxml jupyter matplotlib cython
sudo apt-get install python-tk


3.安裝OpenCV

TensorFlow的對象檢測示例通常使用matplotlib來顯示圖像,但我更喜歡使用OpenCV,因為它使用起來更容易,出錯的可能也較小。本指南的GitHub存儲庫中的對象檢測腳本使用OpenCV。因此,我們需要安裝OpenCV。


為了使OpenCV在Raspberry Pi上運行,需要通過apt-get安裝很多依賴項。如果以下任何命令不起作用,請發出“ sudo apt-get update”,然後重試。

sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install qt4-dev-tools libatlas-base-dev

現在我們已經安裝了這些,我們可以安裝OpenCV。問題:

sudo pip3 install opencv-python

4.編譯並安裝Protobuf

TensorFlow對象檢測API使用Protobuf,這是一個實現Google協議標題數據格式的串行。您以前需要從源代碼進行編譯,但是現在這很容易安裝!

sudo apt-get install protobuf-compiler

protoc --version


5.設置TensorFlow目錄結構和PYTHONPATH變量
現在我們已經安裝了所有擴展,我們需要設置TensorFlow目錄。返回到您的主目錄,然後創建一個稱為“ tensorflow1”的目錄,將其cd輸入。

mkdir tensorflow1
cd tensorflow1


通過發布從GitHub下載tensorflow存儲庫:

git clone --depth 1 https://github.com/tensorflow/models.git

接下來,我們需要修改PYTHONPATH環境變量,以指向剛下載的TensorFlow存儲庫中的某些目錄。我們希望打開終端時都設置PYTHONPATH,因此我們必須修改.bashrc文件。通過發出以下命令打開它:

sudo nano ~/.bashrc

移至文件末尾,並在最後一行添加:

export PYTHONPATH=$PYTHONPATH:/home/pi/tensorflow1/models/research:/home/pi/tensorflow1/models/research/slim




然後,保存並退出文件。這樣一來,每次打開新終端時都會調用“ export PYTHONPATH”命令,因此將始終正確設置PYTHONPATH變量。關閉,然後重新打開終端。


現在,我們需要使用Protoc來編譯對象檢測API使用的協議協議(.proto)文件。.proto文件放在/ research / object_detection / protos中,但是我們需要從/ research目錄執行命令。問題:

cd /home/pi/tensorflow1/models/research
protoc object_detection/protos/*.proto --python_out=.



此命令將所有“名稱” .proto文件轉換為“ name_pb2” .py文件。接下來,進入object_detection目錄:

cd /home/pi/tensorflow1/models/research/object_detection

現在,我們將從TensorFlow檢測模型動物園中下載SSD_Lite模型。模型動物園是谷歌的預訓練對象檢測模型的集合,這些模型具有不同水平的速度和準確性。樹莓派的處理器性能較弱,因此我們需要使用處理能力較小的模型。儘管該模型將運行得更快,但要以降低精度為代價。在本教程中,我們將使用SSDLite-MobileNet,這是目前最快的模型。

Google不斷發布具有改進速度和性能的模型,因此請經常回訪模型動物園以查看是否有更好的模型。

下載SSDLite-MobileNet模型並通過發出以下命令解壓縮:

wget http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz

tar -xzvf ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz



6.檢測物體!

好的,現在一切就緒,可以在皮上執行對象檢測!此存儲庫中的Python的腳本Object_detection_picamera.py用於檢測來自Picamera或USB網絡攝像頭的實時供稿中的對象。基本上,腳本會設置模型和標籤映射的路徑,將模型加載到內存中,初始化Picamera,然後開始對Picamera中的每個視頻幀執行對象檢測。

如果您使用的是Picamera,請確保在Raspberry Pi配置菜單中將其啟用。



通過發出以下命令,將Object_detection_picamera.py文件下載到object_detection目錄中:


wget https://raw.githubusercontent.com/EdjeElectronics/TensorFlow-Object-Detection-on-the-Raspberry-Pi/master/Object_detection_picamera.py


通過發出以下命令來運行腳本:


python3 Object_detection_picamera.py


該腳本默認為使用附加的Picamera。如果您有USB網絡攝像頭,則在命令末尾添加--usbcam:


python3 Object_detection_picamera.py --usbcam


腳本初始化後(最多可能需要30秒),您將看到一個窗口,顯示相機實時取景。視圖內的公共對象將被識別並在其周圍繪製一個矩形。


使用SSDLite模型,Raspberry Pi 3的性能相當好,實現了高於1FPS的幀速率。對於大多數實時對象檢測應用來說,這足夠快。



注意:如果您打算長時間在Pi上運行此程序(大於5分鐘),請確保在Pi的主CPU上安裝了散熱器!所有處理都會導致CPU熱運行。沒有散熱器,由於高溫會關閉。



2019年5月27日 星期一

【中階】【MATLAB】【影像物體追蹤】【使用範例】




function [] = select()
clc ;close all;clear all;
%------------------------------------------------------------------------------------------------------------------------

%根據一幅目標全可見的圖像圈定跟蹤目標%

I=imread('1s.jpg');    %選取圖片
figure(1);             %創建一個窗口
imshow(I);             %默認色值
[temp,rect]=imcrop(I); %利用"滑鼠""剪下""視窗"
[a,b,c]=size(temp);    %長 寬 高大小=剪下

%------------------------------------------------------------------------------------------------------------------------

%計算目標圖像的權值矩陣%

y(1)=a/2;
y(2)=b/2;
tic_x =rect(1)+rect(3)/2;
tic_y=rect(2)+rect(4)/2;
m_wei=zeros(a,b);%權值矩陣
h=y(1)^2+y(2)^2 ;%帶寬

for i=1:a
for j=1:b
dist=(i-y(1))^2+(j-y(2))^2;
m_wei(i,j)=1-dist/h; %epanechnikov profile
end
end
C=1/sum(sum(m_wei));%歸一化係數

%------------------------------------------------------------------------------------------------------------------------

%計算目標權值直方圖qu
%hist1=C*wei_hist(temp,m_wei,a,b);%target model
hist1=zeros(1,a*b);
for i=1:a
for j=1:b 
%rgb顏色空間量化為16*16*16 bins
q_r=fix(double(temp(i,j,1))/16); %fix為趨近0取整函數
q_g=fix(double(temp(i,j,2))/16);
q_b=fix(double(temp(i,j,3))/16);
q_temp=q_r*256+q_g*16+q_b;%設置每像素點紅色,綠色,藍色分量所占比重
hist1(q_temp+1)= hist1(q_temp+1)+m_wei(i,j);%計算直方圖統計中每個像素點佔的權重?
end
end
hist1=hist1*C;
rect(3)=ceil(rect(3));
rect(4)=ceil(rect(4));

%------------------------------------------------------------------------------------------------------------------------


myfile=dir('*.jpg');%尋找jpg類型的資料
lengthfile=length(myfile);
for l=1:lengthfile
Im=imread(myfile(l).name);
num=0;
Y=[2,2];

%mean shift跌代
while((Y(1)^2+Y(2)^2>0.5)&num<20)%跌代條件
 num=num+1;
temp1=imcrop(Im,rect);
%計算候選區域直方圖
%hist2=C*wei_hist(temp1,m_wei,a,b);%target candidates pu
hist2=zeros(1,a*b);
for i=1:a
for j=1:b
q_r=fix(double(temp1(i,j,1))/16);
q_g=fix(double(temp1(i,j,2))/16);
q_b=fix(double(temp1(i,j,3))/16);
q_temp1(i,j)=q_r*256+q_g*16+q_b;
hist2(q_temp1(i,j)+1)= hist2(q_temp1(i,j)+1)+m_wei(i,j);
end
end

%------------------------------------------------------------------------------------------------------------------------

hist2=hist2*C;
figure(2);%創建一個窗口
subplot(1,2,1);%放置圖片位置
plot(hist2);
hold on;

w=zeros(1,a*b);
for i=1:a*b
if(hist2(i)~=0)
w(i)=sqrt(hist1(i)/hist2(i));
else
w(i)=0;
end
end

%------------------------------------------------------------------------------------------------------------------------

%變量初始化
sum_w=0;
xw=[0,0];
for i=1:a;
for j=1:b
sum_w=sum_w+w(uint32(q_temp1(i,j))+1);
xw=xw+w(uint32(q_temp1(i,j))+1)*[i-y(1)-0.5,j-y(2)-0.5];
end
end

%------------------------------------------------------------------------------------------------------------------------

Y=xw/sum_w;
%中心點位置更新
rect(1)=rect(1)+Y(2);
rect(2)=rect(2)+Y(1);
end

%------------------------------------------------------------------------------------------------------------------------

%跟蹤矩陣軌跡
tic_x=[tic_x;rect(1)+rect(3)/2];
tic_y=[tic_y;rect(2)+rect(4)/2];

v1=rect(1);
v2=rect(2);
v3=rect(3);
v4=rect(4);
%顯示跟蹤結果

%------------------------------------------------------------------------------------------------------------------------

subplot(1,2,2);%設定圖片位置
imshow(uint8(Im));%顯示圖像
title('目標跟蹤結果與運動軌跡');%命名圖像
hold on;
plot([v1,v1+v3],[v2,v2],[v1,v1],[v2,v2+v4],[v1,v1+v3],[v2+v4,v2+v4],[v1+v3,v1+v3],[v2,v2+v4],'LineWidth',2,'Color','r');
plot(tic_x,tic_y,'LineWidth',2,'Color','b');

end

%------------------------------------------------------------------------------------------------------------------------