imageai庫里面提供了目標識別,其實也可以說是目標檢測,和現在很多的收集一樣就是物體識別。他可以幫你識別出各種各樣生活中遇見的事物。比如貓、狗、車、馬、人、電腦、收集等等。
感覺imageai有點差就是沒有返回檢測目標的坐標出來,所以感覺很low,而且和計算消耗很大,耗時很大,與opencv做實時檢測效果很差。不推薦使用。
安裝imageai方法見:https://github.com/OlafenwaMoses/ImageAI
resnet50_coco_best_v2.1.0.h5 模型下載地址:https://github.com/fizyr/keras-retinanet/releases/
下面提供兩種調用方式。
第一文件流調用:
# coding:utf-8
# imageai下載地址:https://github.com/OlafenwaMoses/ImageAI
# resnet50_coco_best_v2.1.0.h5 模型下載地址:https://github.com/fizyr/keras-retinanet/releases/
from imageai.Detection import ObjectDetection # 導入了 ImageAI 目標檢測類
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
execution_path = os.path.join(os.getcwd(),'imgData/') # 定義了一個變量用來保存我們的 python 文件
print(execution_path)
detector = ObjectDetection() # 定義了目標檢測類
detector.setModelTypeAsRetinaNet() # 模型的類型設置為 RetinaNet
detector.setModelPath(os.path.join(execution_path, "resnet50_coco_best_v2.1.0.h5")) # 將模型路徑設置為 RetinaNet 模型的路徑
detector.loadModel() # 模型加載到的目標檢測類
# 調用目標檢測函數,解析輸入的和輸出的圖像路徑。
detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path, "ji.jpg"),
output_image_path=os.path.join(execution_path, "imagenew1.jpg"),input_type='file')
for eachObject in detections:
print(eachObject["name"] + " : " + eachObject["percentage_probability"]) # 打印出所檢測到的每個目標的名稱及其概率值。
print(detections)
第二種numpy數據類型調用:
# coding:utf-8
# imageai下載地址:https://github.com/OlafenwaMoses/ImageAI
# resnet50_coco_best_v2.1.0.h5 模型下載地址:https://github.com/fizyr/keras-retinanet/releases/
from imageai.Detection import ObjectDetection # 導入了 ImageAI 目標檢測類
import cv2
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import matplotlib.pyplot as plt
def targetDetection(imgArray,model_path):
"""
:param imgArray: 圖片數據,類型為ndarray
:param model_path: retinanet模型路徑
:return:
"""
path = os.path.abspath(model_path)
detector = ObjectDetection() # 定義了目標檢測類
detector.setModelTypeAsRetinaNet() # 模型的類型設置為 RetinaNet
detector.setModelPath(path) # 將模型路徑設置為 RetinaNet 模型的路徑
detector.loadModel() # 模型加載到的目標檢測類
# 調用目標檢測函數,解析輸入的和輸出的圖像路徑。
detections = detector.detectObjectsFromImage(input_image=imgArray,
input_type='array',output_type='array')
return detections
data = plt.imread('./imgData/avenue.jpg')
model_path = ('./imgData/resnet50_coco_best_v2.0.1.h5')
imgInfo = targetDetection(data,model_path)
plt.imshow(imgInfo[0])
plt.show()

下面內容作為擴展,有興趣的朋友可以試試,但是很不理想。
# coding:utf-8
# imageai下載地址:https://github.com/OlafenwaMoses/ImageAI
# resnet50_coco_best_v2.1.0.h5 模型下載地址:https://github.com/fizyr/keras-retinanet/releases/
from imageai.Detection import ObjectDetection # 導入了 ImageAI 目標檢測類
import cv2
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import matplotlib.pyplot as plt
def targetDetection(imgArray,model_path):
"""
:param imgArray: 圖片數據,類型為ndarray
:param model_path: retinanet模型路徑
:return:
"""
path = os.path.abspath(model_path)
detector = ObjectDetection() # 定義了目標檢測類
detector.setModelTypeAsRetinaNet() # 模型的類型設置為 RetinaNet
detector.setModelPath(path) # 將模型路徑設置為 RetinaNet 模型的路徑
detector.loadModel() # 模型加載到的目標檢測類
# 調用目標檢測函數,解析輸入的和輸出的圖像路徑。
detections = detector.detectObjectsFromImage(input_image=imgArray,
input_type='array',output_type='array')
return detections
# data = plt.imread('./imgData/avenue.jpg')
# model_path = ('./imgData/resnet50_coco_best_v2.0.1.h5')
# imgInfo = targetDetection(data,model_path)
# plt.imshow(imgInfo[0])
# plt.show()
if __name__=='__main__':
# 獲取攝像頭0表示第一個攝像頭
model_path = ('./imgData/resnet50_coco_best_v2.0.1.h5')
cap = cv2.VideoCapture(0)
while (True): # 逐幀顯示
ret, img = cap.read() # 強調img是ndarray類型的。
imgData=targetDetection(img,model_path)
cv2.imshow('image',imgData[0])
if cv2.waitKey(1) & 0xFF == ord(' '):
break
cap.release() # 釋放攝像頭
cv2.destroyAllWindows() # 釋放窗口資源
打開本地攝像頭進行實時檢測
