利用ImageAI庫只需幾行python代碼實(shí)現(xiàn)目標(biāo)檢測
什么是目標(biāo)檢測
目標(biāo)檢測關(guān)注圖像中特定的物體目標(biāo),需要同時(shí)解決解決定位(localization) + 識別(Recognition)。相比分類,檢測給出的是對圖片前景和背景的理解,我們需要從背景中分離出感興趣的目標(biāo),并確定這一目標(biāo)的描述(類別和位置),因此檢測模型的輸出是一個(gè)列表,列表的每一項(xiàng)使用一個(gè)數(shù)組給出檢出目標(biāo)的類別和位置(常用矩形檢測框的坐標(biāo)表示)。
通俗的說,Object Detection的目的是在目標(biāo)圖中將目標(biāo)用一個(gè)框框出來,并且識別出這個(gè)框中的是啥,而且最好的話是能夠?qū)D片的所有物體都框出來。
目標(biāo)檢測算法
目前目標(biāo)檢測領(lǐng)域的深度學(xué)習(xí)方法主要分為兩類:兩階段(Two Stages)的目標(biāo)檢測算法;一階段(One Stage)目標(biāo)檢測算法。
Two Stages
首先由算法(algorithm)生成一系列作為樣本的候選框,再通過卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行樣本(Sample)分類。也稱為基于候選區(qū)域(Region Proposal)的算法。常見的算法有R-CNN、Fast R-CNN、Faster R-CNN等等。
One Stage
不需要產(chǎn)生候選框,直接將目標(biāo)框定位的問題轉(zhuǎn)化為回歸(Regression)問題處理,也稱為基于端到端(End-to-End)的算法。常見的算法有YOLO、SSD等等。
python實(shí)現(xiàn)
本文主要講述如何實(shí)現(xiàn)目標(biāo)檢測,至于背后的原理不過多贅述,可以去看相關(guān)的論文。
ImageAI是一個(gè)簡單易用的計(jì)算機(jī)視覺Python庫,使得開發(fā)者可以輕松的將最新的最先進(jìn)的人工智能功能整合進(jìn)他們的應(yīng)用。
ImageAI本著簡潔的原則,支持最先進(jìn)的機(jī)器學(xué)習(xí)算法,用于圖像預(yù)測,自定義圖像預(yù)測,物體檢測,視頻檢測,視頻對象跟蹤和圖像預(yù)測訓(xùn)練。
依賴
•Python 3.5.1(及更高版本)
•pip3
•Tensorflow 1.4.0(及更高版本)
•Numpy 1.13.1(及更高版本)
•SciPy 0.19.1(及更高版本)
•OpenCV
•pillow
•Matplotlib
•h5py
•Keras 2.x
安裝
•命令行安裝
pip3 install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl
•下載imageai-2.1.0-py3-none-any.whl 安裝文件并在命令行中指定安裝文件的路徑
pip3 install .\imageai-2.1.0-py3-none-any.whl
使用
Image支持的深度學(xué)習(xí)的算法有RetinaNet,YOLOv3,TinyYoLOv3。ImageAI已經(jīng)在COCO數(shù)據(jù)集上預(yù)先訓(xùn)練好了對應(yīng)的三個(gè)模型,根據(jù)需要可以選擇不同的模型??梢酝ㄟ^下面的鏈接進(jìn)行下載使用:
•Download RetinaNet Model - resnet50_coco_best_v2.0.1.h5
•Download YOLOv3 Model - yolo.h5
•Download TinyYOLOv3 Model - yolo-tiny.h5
以上模型可以檢測并識別以下80種不同的目標(biāo):
person, bicycle, car, motorcycle, airplane,
bus, train, truck, boat, traffic light, fire hydrant, stop_sign,
parking meter, bench, bird, cat, dog, horse, sheep, cow,
elephant, bear, zebra, giraffe, backpack, umbrella,
handbag, tie, suitcase, frisbee, skis, snowboard,
sports ball, kite, baseball bat, baseball glove, skateboard,
surfboard, tennis racket, bottle, wine glass, cup, fork, knife,
spoon, bowl, banana, apple, sandwich, orange, broccoli, carrot,
hot dog, pizza, donot, cake, chair, couch, potted plant, bed,
dining table, toilet, tv, laptop, mouse, remote, keyboard,
cell phone, microwave, oven, toaster, sink, refrigerator,
book, clock, vase, scissors, teddy bear, hair dryer,
toothbrush
先來看看完整的代碼,使用YOLOv3算法對13張照片進(jìn)行目標(biāo)識別。
from imageai.Detection import ObjectDetection import os detector = ObjectDetection() detector.setModelTypeAsYOLOv3() detector.setModelPath("./model/yolo.h5") detector.loadModel() path = os.getcwd() input_image_list = os.listdir(path+"\pic\input") input_image_list = sorted(input_image_list, key = lambda i:len(i),reverse = False) size = len(input_image_list) for i in range(size): input_image_path = os.path.join(path+"\pic\input", input_image_list[i]) output_image_path = os.path.join(path+"\pic\output", input_image_list[i]) detections, extract_detected_objects = detector.detectObjectsFromImage(input_image=input_image_path, output_image_path=output_image_path, extract_detected_objects=True) print('------------------- %d -------------------' % int(i + 1)) for eachObject in detections: print(eachObject["name"], " : ", eachObject["percentage_probability"], " : ", eachObject["box_points"]) print('------------------- %d -------------------' % int(i + 1))
首先第一行導(dǎo)入ImageAI Object Detection
類,在第二行導(dǎo)入os庫。
然后創(chuàng)建了ObjectDetection類的新實(shí)例,接著就可以選擇要使用的算法。分別有以下三個(gè)函數(shù):
.setModelTypeAsRetinaNet()
.setModelTypeAsYOLOv3()
.setModelTypeAsTinyYOLOv3()
選擇好算法之后就要設(shè)置模型文件路徑,這里給出的路徑必須要和選擇的算法一樣。
.setModelPath()
- 參數(shù)path(必須):模型文件的路徑
載入模型。
.loadModel()
- 參數(shù)detection_speed(可選):最多可以減少80%的時(shí)間,單身會導(dǎo)致精確度的下降。可選的值有: “normal”, “fast”, “faster”, “fastest” 和 “flash”。默認(rèn)值是 “normal”。
通過os庫的函數(shù)得到輸入輸出文件的路徑等,這不是本文重點(diǎn),跳過不表。
開始對圖像進(jìn)行目標(biāo)檢測。
.detectObjectsFromImage()
- 參數(shù)input_image(必須):待檢測圖像的路徑
- 參數(shù)output_image(必須):輸出圖像的路徑
- 參數(shù)parameter minimum_percentage_probability(可選):能接受的最低預(yù)測概率。默認(rèn)值是50%。
- 參數(shù)display_percentage_probability(可選):是否展示預(yù)測的概率。默認(rèn)值是True。
- 參數(shù)display_object_name(可選):是否展示識別物品的名稱。默認(rèn)值是True。
- 參數(shù)extract_detected_objects(可選):是否將識別出的物品圖片保存。默認(rèn)是False。
返回值根據(jù)不同的參數(shù)也有不同,但都會返回一個(gè)an array of dictionaries。字典包括以下幾個(gè)屬性:
* name (string)
* percentage_probability (float)
* box_points (tuple of x1,y1,x2 and y2 coordinates)
前面說過可以識別80種目標(biāo),在這里也可以選擇只識別自己想要的目標(biāo)。
custom = detector.CustomObjects(person=True, dog=True) detections = detector.detectCustomObjectsFromImage( custom_objects=custom, input_image=os.path.join(execution_path , "image3.jpg"), output_image_path=os.path.join(execution_path , "image3new-custom.jpg"), minimum_percentage_probability=30)
首先用定義自己想要的目標(biāo),其余的目標(biāo)會被設(shè)置為False。然后配合.detectCustomObjectsFromImage()進(jìn)行目標(biāo)檢測。
主要的代碼基本如上所述,接下來看結(jié)果。先看看圖片中只有一個(gè)目標(biāo)的效果。
------------------- 10 -------------------
dog : 98.83476495742798 : (117, 91, 311, 360)
dog : 99.24255609512329 : (503, 133, 638, 364)
dog : 99.274742603302 : (338, 38, 487, 379)
------------------- 10 -------------------
效果還是不錯的。再看看如果圖片中有多個(gè)目標(biāo)識別的結(jié)果如何。
------------------- 4 ------------------- book : 55.76887130737305 : (455, 74, 487, 146) book : 82.22097754478455 : (466, 11, 482, 69) tv : 99.34800863265991 : (25, 40, 182, 161) bed : 88.7190580368042 : (60, 264, 500, 352) cat : 99.54025745391846 : (214, 125, 433, 332) ------------------- 4 -------------------
識別度還是很高的,背后人眼都看不清的書本都能被識別。
附錄
GitHub:https://github.com/Professorchen/Computer-Vision/tree/master/object-detection
總結(jié)
以上所述是小編給大家介紹的利用ImageAI庫只需幾行python代碼超簡實(shí)現(xiàn)目標(biāo)檢測,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
python xlsxwriter庫生成圖表的應(yīng)用示例
這篇文章主要介紹了python xlsxwriter庫生成圖表的應(yīng)用示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03Django restframework 框架認(rèn)證、權(quán)限、限流用法示例
這篇文章主要介紹了Django restframework 框架認(rèn)證、權(quán)限、限流用法,結(jié)合實(shí)例形式詳細(xì)分析了Djangorestframework 框架認(rèn)證、權(quán)限、限流的具體使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-12-12Python使用poplib模塊和smtplib模塊收發(fā)電子郵件的教程
smtplib模塊一般我們比較熟悉、這里我們會來講解使用smtplib發(fā)送SSL/TLS安全郵件的方法,而poplib模塊則負(fù)責(zé)處理接收pop3協(xié)議的郵件,下面我們就來看Python使用poplib模塊和smtplib模塊收發(fā)電子郵件的教程2016-07-07Python利用pywin32實(shí)現(xiàn)自動操作電腦
在windows系統(tǒng)上,重復(fù)性的操作可以用Python腳本來完成,其中常用的模塊是win32gui、win32con、win32api,要使用這三個(gè)模塊需要先安裝pywin32。本文就為大家介紹了如何利用這些模塊實(shí)現(xiàn)自動操作電腦,感興趣的可以了解一下2022-11-11Python softmax實(shí)現(xiàn)及數(shù)值穩(wěn)定性詳解
這篇文章主要為大家介紹了Python softmax實(shí)現(xiàn)及數(shù)值穩(wěn)定性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Python中函數(shù)eval和ast.literal_eval的區(qū)別詳解
eval函數(shù)在Python中做數(shù)據(jù)類型的轉(zhuǎn)換還是很有用的。它的作用就是把數(shù)據(jù)還原成它本身或者是能夠轉(zhuǎn)化成的數(shù)據(jù)類型。那么eval和ast.literal_val()的區(qū)別是什么呢?本文將大家介紹關(guān)于Python中函數(shù)eval和ast.literal_eval區(qū)別的相關(guān)資料,需要的朋友可以參考下。2017-08-08python統(tǒng)計(jì)函數(shù)庫scipy.stats的用法解析
今天小編就為大家分享一篇python統(tǒng)計(jì)函數(shù)庫scipy.stats的用法解析,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02