?

TensorFlow 深度神經網絡圖像識別入門

2023-07-06 06:45牟曉東
電腦報 2023年25期
關鍵詞:圖像識別賦值攝像頭

牟曉東

通過對攝像頭所捕獲的畫面內容進行處理和分析的圖像識別,通常又稱為“圖像分類”任務。TensorFlow Lite 是深度神經網絡圖像識別解決方案中的一種,它提供了經過優化計算的若干預訓練模型數據和標簽文件,下載保存至本地后通過Python 編程調用即可實現畫面內容的快速圖像識別。

1.準備工作:安裝TensorFlow及下載模型和標簽文件

以Python 3.8 為例, 在本地安裝對應版本的TensorFlow, 通過在WindowsPowerShell 窗口中執行“pipinstall tensorflow==2.3.1 -i https://pypi.tuna.tsinghua.edu.cn/simple” 命令來實現;然后下載預訓練模型(mobilenet_v1_1.0_224_quant.tflite)和中英文標簽文件(labels_mobilenet_quant_v1_224.txt、labels_mobilenet_quant_v1_224_cn_baidu.txt),兩個txt 標簽文件內容是一一對應的,分別保存了包括“背景”在內的1001 種常見的動植物和生活辦公類物品,比如金魚(goldfish)、鴕鳥(ostrich)和酒瓶(wine bottle)等等,每種物品名稱均占單獨的一行(如圖1)。

2.Python代碼編程

(1)庫模塊的導入與標簽文件的讀取

首先,導入OpenCV、Numpy、tflite和PIL 庫模塊:“import cv2”“importnumpy as np”“import tflite_runtime.interpreter as tflite”“from PIL importImage,ImageFont,ImageDraw”; 接著, 建立變量file_model 和file_label,賦值為“mobilenet_v1_1.0_224_quant.t f lite”“la be ls_mobile n e t _qua n t _v1_224_cn_baidu.txt”, 分別對應分類模型和中文標簽(如果想加載英文標簽文件則將變量file_label 賦值為“labels_mobilenet_quant_v1_224.txt”);再進行標簽文件的讀取操作:“with open(file_label, 'r',encoding='utf-8') as f:labels =[line.strip() for line in f.readlines()]”。

(2)分類模型的加載預處理

建立變量Max_number 并賦值為3,作用是控制輸出概率最高的分類結果數量為3 個;建立變量interpreter,賦值為“tflite.Interpreter(model_path=file_model)”,再通過語句“interpreter.allocate_tensors()” 進行分類模型的加載; 建立變量Input_Details 和Output_Details,分別賦值為“interpreter.get_input_details()” 和“interpreter.get_output_details()”,作用是實現輸入數據和輸出數據的讀??; 此處可通過“print(Input_Details)” 和“print(Output_Details)”分別打印輸出二者的具體信息,均是包含了“'shape':array([1,224,224,3])” 和“'quantization':(0.0078125,128)” 等數據在內的列表;建立變量height 和width,賦值為“Input_Details[0]['shape'][1]”和“Input_Details[0]['shape'][2]”,即從列表Input_Details 取出輸入圖像的高度和寬度值,均為224(通道數為3);建立變量cap,賦值為“cv2.VideoCapture(0)”,準備讀取攝像頭的畫面數據(如圖2)。

(3)“whileTrue:”循環體部分建立變量success 和img 并賦值為“capture.read()”, 進行攝像頭一幀圖像數據的讀??; 建立變量img_rgb, 賦值為“cv2.cvtColor(img, cv2.COLOR_BGR2RGB)”, 進行顏色模式從BGR 到RGB 的轉換; 建立變量img_resize, 賦值為“cv2.resize(img_rgb,(width,height))”,進行圖像寬度與高度縮放;建立變量Input_Data,賦值為“np.expand_dims(img_resize,axis=0)”,作用是根據列表Input_Details 中的“'shape':array([1,224,224,3])” 內容格式增加一個維度;接著,通過語句“interpreter.set_tensor(Input_Details[0]['index'],Input_Data)”和“interpreter.invoke()”分別完成數據的輸入并進行識別;建立變量Output,賦值為“np.squeeze(interpreter.get_tensor(Output_Details[0]['index'])[0])”,獲取數據的輸出;“if Output_Details[0]['dtype'] == np.uint8:”部分完成的功能是根據圖像識別的量化對輸出數據進行還原,并且找出數目為Max_number 個“ 最大值”: 建立變量Ordered, 賦值為“np.argpartition(-Output,Max_number-1)”。

在“for i in range(Max_number):”中進行Max_number 次循環,依次執行以下操作:建立變量Notes,賦值為“"%s:%.1f%%"%(labels[Ordered[i]],Output[Ordered[i]]*100)”, 其內容為待輸出顯示的文字信息內容;建立變量position,賦值為“(400,1+i*30)”,對應的是文字信息的起始坐標值; 建立變量img_PIL, 賦值為“Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))”,仍是進行顏色模式的轉換;建立變量font,賦值為“ImageFont.truetype(r'C:\Windows\Fonts\Microsoft YaHei UI\msyhl.ttc',28,encoding="utf-8")”,作用是設置待顯示文字信息的字體,可根據自己Windows 操作系統字體目錄位置及內容來設置;建立變量draw 并賦值為“ImageDraw.Draw(img_PIL)”,作用是創建Draw 繪畫對象,通過語句“draw.text(position,Notes,(0,255,0),font)”在圖像上對應的位置用綠色添加文字信息;最后,仍是進行顏色模式轉換、畫面信息的顯示、熱鍵退出響應、攝像頭資源的釋放及窗口的關閉等操作(如圖3)。

3.圖像識別的運行測試

將程序保存為Recognize_image.py,按F5 鍵進行測試。先在攝像頭前展示三張電腦屏幕圖片,分別是大熊貓、金魚和波斯貓,程序均正確進行了圖像識別,各自的識別度分別是99.6%、99.6% 和84.4%;再來嘗試識別一組實物,分別是螺絲刀、鼠標和兩支圓珠筆,識別度也分別達到了97.3%、96.9% 和80.9%, 效果確實相當不錯,而且識別的速度也非??欤ㄈ鐖D4)。

猜你喜歡
圖像識別賦值攝像頭
浙江首試公路非現場執法新型攝像頭
L-代數上的賦值
攝像頭連接器可提供360°視角圖像
基于Resnet-50的貓狗圖像識別
高速公路圖像識別技術應用探討
圖像識別在物聯網上的應用
基于太赫茲技術的新一代攝像頭及其在安防領域的應用探討
圖像識別在水質檢測中的應用
強賦值幺半群上的加權Mealy機與加權Moore機的關系*
利用賦值法解決抽象函數相關問題オ
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合