目標(biāo)檢測(cè)必須要OpenCV?10行Python代碼也能實(shí)現(xiàn)紊浩,親測(cè)好用南窗!
大數(shù)據(jù)文摘
發(fā)布時(shí)間:18-07-0212:59
大數(shù)據(jù)文摘出品
編譯:朱一輝、雪清郎楼、小魚(yú)
短短10行代碼就可以實(shí)現(xiàn)目標(biāo)檢測(cè)万伤?!
本文作者和他的團(tuán)隊(duì)構(gòu)建了一個(gè)名為ImageAI 的Python庫(kù)呜袁,集成了現(xiàn)今流行的深度學(xué)習(xí)框架和計(jì)算機(jī)視覺(jué)庫(kù)敌买。本文將手把手教你構(gòu)建自己的第一個(gè)目標(biāo)檢測(cè)應(yīng)用,而且文摘菌已經(jīng)幫你踩過(guò)坑了阶界,親測(cè)有效虹钮!
無(wú)人超市聋庵、人臉識(shí)別、無(wú)人駕駛芙粱,眾多的使用場(chǎng)景及案例祭玉,使得【目標(biāo)檢測(cè)】正成為計(jì)算機(jī)視覺(jué)最有前景的方向。
聽(tīng)起來(lái)似乎是個(gè)很難實(shí)現(xiàn)的技術(shù)春畔,需要大量訓(xùn)練數(shù)據(jù)和算法才能完成脱货。事實(shí)上,本文作者開(kāi)發(fā)了一個(gè)基于Python的函數(shù)庫(kù)律姨,可以用十行代碼高效實(shí)現(xiàn)目標(biāo)檢測(cè)振峻。
還不熟悉的讀者,我們先來(lái)看看择份,目標(biāo)檢測(cè)到底是什么扣孟,以及軟件開(kāi)發(fā)人員面臨的挑戰(zhàn)。
目標(biāo)檢測(cè)是借助于計(jì)算機(jī)和軟件系統(tǒng)在圖像/場(chǎng)景中荣赶,定位目標(biāo)并識(shí)別出每個(gè)目標(biāo)的類別的技術(shù)凤价。目前已廣泛用于人臉檢測(cè)、車(chē)輛檢測(cè)拔创、行人計(jì)數(shù)利诺、網(wǎng)絡(luò)圖像、安全系統(tǒng)和無(wú)人駕駛汽車(chē)等領(lǐng)域伏蚊。隨著計(jì)算機(jī)技術(shù)不斷發(fā)展和軟件開(kāi)發(fā)人員的不懈努力立轧,未來(lái)目標(biāo)檢測(cè)技術(shù)將更廣泛的普及開(kāi)來(lái)。
在應(yīng)用程序和系統(tǒng)中使用先進(jìn)的目標(biāo)檢測(cè)方法躏吊,以及基于這些方法構(gòu)建新的應(yīng)用程序并不容易氛改。早期目標(biāo)檢測(cè)是基于經(jīng)典算法而實(shí)現(xiàn)的,如 OpenCV(廣受歡迎的計(jì)算機(jī)視覺(jué)庫(kù))所支持的一些算法比伏。然而胜卤,這些經(jīng)典算法的性能會(huì)因條件而受到限制。
2012年赁项,深度學(xué)習(xí)領(lǐng)域取得眾多突破葛躏,學(xué)者們提出了一系列全新、高精度的目標(biāo)檢測(cè)算法和方法悠菜,比如R-CNN, Fast-RCNN, Faster-RCNN, RetinaNet舰攒,以及既快又準(zhǔn)的SSD和YOLO等。要使用這些基于深度學(xué)習(xí)的方法和算法(當(dāng)然深度學(xué)習(xí)也是基于機(jī)器學(xué)習(xí))悔醋,需要對(duì)數(shù)學(xué)和深度學(xué)習(xí)框架有很深的理解摩窃。數(shù)百萬(wàn)的軟件開(kāi)發(fā)人員致力于整合目標(biāo)檢測(cè)技術(shù)進(jìn)行新產(chǎn)品的開(kāi)發(fā)。但是想要理解這項(xiàng)技術(shù)并加以使用,對(duì)非深度學(xué)習(xí)領(lǐng)域的程序員來(lái)說(shuō)并不容易猾愿。
一位自學(xué)了計(jì)算機(jī)的開(kāi)發(fā)者M(jìn)oses Olafenwa在幾個(gè)月前意識(shí)到了這個(gè)問(wèn)題鹦聪,并與同伴一起開(kāi)發(fā)了一個(gè)名叫ImageAI的Python函數(shù)庫(kù)。
ImageAI可以讓程序員和軟件開(kāi)發(fā)者只用幾行代碼蒂秘,就能輕易地把最先進(jìn)的計(jì)算機(jī)視覺(jué)技術(shù)整合到他們現(xiàn)有的以及新的應(yīng)用程序里面泽本。
用ImageAI實(shí)現(xiàn)目標(biāo)檢測(cè),你只需要以下步驟:
1. 安裝Python
2. 安裝ImageAI和相關(guān)函數(shù)庫(kù)
3. 下載目標(biāo)檢測(cè)模型文件
4. 運(yùn)行示例代碼(只有10行)
準(zhǔn)備工作
文摘菌測(cè)試環(huán)境為Windows 64位系統(tǒng)姻僧,Python版本為3.6规丽。關(guān)注大數(shù)據(jù)文摘微信公眾號(hào),在后臺(tái)回復(fù)“檢測(cè)”可獲取代碼和模型文件~
1) 從Python官網(wǎng)下載并安裝Python 3段化,并安裝pip嘁捷。
下載地址:
https://python.org
https://pip.pypa.io/en/stable/installing/
2)用pip安裝下列依賴
找到Pyhthon安裝目錄下的Scripts文件夾造成,如C:\XXX \Python\Python36\Scripts显熏,打開(kāi)cmd命令窗口,依次輸入下列安裝命令即可晒屎。
1. Tensorflow:
pip install tensorflow
no => --let it run after 9 then yes
2.Numpy:
pip install numpy
3.SciPy
pip install scipy
4.OpenCV
pip install opencv-python
5.Pillow
pip install pillow
6.Matplotlib
pip install matplotlib
7. H5py
pip install h5py
8. Keras
pip install keras
9. ImageAI
pip install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl
注:在安裝ImageAI時(shí)如果出現(xiàn)異常喘蟆,可先下載.whl文件,并放在Scripts文件夾下鼓鲁,用下列命令進(jìn)行安裝:
pip install imageai-2.0.1-py3-none-any.whl
3) 下載用于目標(biāo)檢測(cè)的RetinaNet模型文件:
下載地址:
https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5
準(zhǔn)備工作到此結(jié)束蕴轨,你可以寫(xiě)自己的第一個(gè)目標(biāo)檢測(cè)代碼了。新建一個(gè)Python文件并命名(如FirstDetection.py)骇吭,然后將下述代碼寫(xiě)入此文件橙弱。接著將RetinaNet模型文件、FirstDetection.py和你想檢測(cè)的圖片放在同一路徑下燥狰,并將圖片命名為“image.jpg”棘脐。
下面是FirstDetection.py中的10行代碼:
from imageai.Detection import ObjectDetection
import os
execution_path = os.getcwd()
detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))
for eachObject in detections:
? print(eachObject["name"] + " : " + eachObject["percentage_probability"] )
然后,雙擊FirstDetection.py運(yùn)行代碼龙致,并稍等片刻蛀缝,識(shí)別結(jié)果就會(huì)在控制臺(tái)打印出來(lái)。一旦結(jié)果在控制臺(tái)輸出目代,在包含F(xiàn)irstDetection.py的文件夾里屈梁,你會(huì)發(fā)現(xiàn)一張新保存的圖片,文件名為“imagenew.jpg”榛了。
注:如果運(yùn)行代碼時(shí)出現(xiàn)下列異常:
則需要安裝Numpy+MKL依賴在讶,下載對(duì)應(yīng)的.whl文件并放在Scripts文件夾下,用pip安裝.whl文件即可霜大。
下載地址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
檢測(cè)結(jié)果
來(lái)看看下面這2張示例圖片以及經(jīng)過(guò)檢測(cè)后保存的新圖片构哺。
檢測(cè)前:
檢測(cè)后:
檢測(cè)結(jié)果:
person : 55.8402955532074
person : 53.21805477142334
person : 69.25139427185059
person : 76.41745209693909
bicycle : 80.30363917350769
person : 83.58567953109741
person : 89.06581997871399
truck : 63.10953497886658
person : 69.82483863830566
person : 77.11606621742249
bus : 98.00949096679688
truck : 84.02870297431946
car : 71.98476791381836
檢測(cè)結(jié)果:
person : 71.10445499420166
person : 59.28672552108765
person : 59.61582064628601
person : 75.86382627487183
motorcycle : 60.1050078868866
bus : 99.39600229263306
car : 74.05484318733215
person : 67.31776595115662
person : 63.53200078010559
person : 78.2265305519104
person : 62.880998849868774
person : 72.93365597724915
person : 60.01397967338562
person : 81.05944991111755
motorcycle : 50.591760873794556
motorcycle : 58.719027042388916
person : 71.69321775436401
bicycle : 91.86570048332214
motorcycle : 85.38855314254761
文摘菌測(cè)試了另外幾張圖片,結(jié)果如下:
檢測(cè)前:
檢測(cè)后:
檢測(cè)結(jié)果:
car : 59.04694199562073
car : 50.62631368637085
car : 71.59191966056824
car : 52.60368585586548
person : 76.51243805885315
car : 56.73831105232239
car : 50.02853870391846
car : 94.18612122535706
car : 70.23521065711975
car : 75.06842017173767
car : 87.21032738685608
car : 89.46954607963562
person : 73.89532923698425
bicycle : 90.31689763069153
bus : 65.3587281703949
竟然可以檢測(cè)出派希……
檢測(cè)結(jié)果:
person : 55.15214800834656
person : 62.79672980308533
person : 69.01599168777466
person : 67.26776957511902
person : 75.51649808883667
person : 52.9820442199707
person : 67.23594665527344
person : 69.77047920227051
person : 83.80664587020874
person : 61.785924434661865
person : 82.354336977005
person : 93.08169484138489
cow : 84.69656705856323
檢測(cè)結(jié)果:
person : 65.07909297943115
person : 65.68368077278137
person : 68.6377465724945
person : 83.80006551742554
person : 85.69389581680298
person : 55.40691018104553
person : 56.62997364997864
person : 58.07020664215088
person : 70.90385556221008
person : 95.06895542144775
代碼解釋
下面我們來(lái)解釋一下這10行代碼的含義遮婶。
from imageai.Detection import ObjectDetectionimport osexecution_path = os.getcwd()
上面3行代碼中蝗碎,第一行導(dǎo)入ImageAI的目標(biāo)檢測(cè)類,第二行導(dǎo)入Python的os類旗扑,第三行定義一個(gè)變量蹦骑,用來(lái)保存Python文件、RetianNet模型文件和圖片所在文件夾的路徑臀防。
detector = ObjectDetection()detector.setModelTypeAsRetinaNet()detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))detector.loadModel()detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))
上面5行代碼中眠菇,第一行定義目標(biāo)檢測(cè)類,第二行將模型類型設(shè)置為RetinaNet袱衷,第三行將模型的路徑設(shè)為RetinaNet模型文件所在路徑捎废,第四行將模型載入目標(biāo)檢測(cè)類,然后第五行調(diào)用檢測(cè)函數(shù)致燥,并解析輸入圖片和輸出圖片的路徑登疗。
for eachObject in detections:print(eachObject["name"] + " : " + eachObject["percentage_probability"] )
上面2行代碼中,第一行迭代所有detector.detectObjectsFromImage函數(shù)返回的結(jié)果嫌蚤,然后辐益,第二行打印出模型檢測(cè)出的圖片中每個(gè)目標(biāo)的類型和概率。
ImageAI還支持配置目標(biāo)檢測(cè)過(guò)程中的其他功能脱吱。例如智政,將檢測(cè)到的每個(gè)目標(biāo)的圖片單獨(dú)提取出來(lái)。通過(guò)簡(jiǎn)單地把extract_detected_objects=True寫(xiě)入detectObjectsFromImage函數(shù)箱蝠,目標(biāo)檢測(cè)類就會(huì)為圖片對(duì)象集新建一個(gè)文件夾续捂,然后提取出每個(gè)圖片,將它們存入這個(gè)文件夾宦搬,并返回一個(gè)數(shù)組用來(lái)保存每個(gè)圖片的路徑牙瓢,如下所示:
detections, extracted_images = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"), extract_detected_objects=True)
我們用第一個(gè)示例圖片提取出來(lái)的檢測(cè)結(jié)果如圖所示:
參數(shù)配置
為了滿足目標(biāo)檢測(cè)的生產(chǎn)需求,ImageAI提供了一些可配置的參數(shù)床三,包括:
Adjusting Minimum Probability(可調(diào)整最小概率閾值)
默認(rèn)閾值為50%寨昙,如果檢測(cè)結(jié)果的概率值低于50%槐瑞,則不顯示檢測(cè)結(jié)果颜骤。你可以根據(jù)具體需求對(duì)該閾值進(jìn)行修改孝宗。
Custom Objects Detection(自定義目標(biāo)檢測(cè))
使用提供的CustomObject類,你可以讓檢測(cè)結(jié)果只顯示特定類型的目標(biāo)四瘫。
Detection Speeds(檢測(cè)速度)
可以將檢測(cè)速度設(shè)置為“fast”汉嗽、“ faster”和“fastest”,以減少檢測(cè)圖片所需的時(shí)間找蜜。
Input Types(輸入類型)
你可以解析并修改圖像的文件路徑饼暑,其中,Numpy數(shù)組,或是圖片文件流都可以作為輸入類型弓叛。
Output Types(輸出類型)
你可以修改detectObjectsFromImage 函數(shù)的返回結(jié)果彰居,例如返回圖片文件或Numpy數(shù)組。
詳細(xì)的說(shuō)明文檔在GitHub上撰筷,GitHub鏈接:
https://github.com/OlafenwaMoses/ImageAI
關(guān)注大數(shù)據(jù)文摘微信公眾號(hào)陈惰,在后臺(tái)回復(fù)“檢測(cè)”可獲取代碼和模型文件~
動(dòng)手試試吧,歡迎在留言區(qū)分享~
作者最新文章
? ? 賽博朋克毕籽!靈感來(lái)自楓樹(shù)種子莢的多翼滑翔機(jī)抬闯,空中可分體
? ? 北京電影學(xué)院發(fā)了滿是數(shù)學(xué)公式的計(jì)算機(jī)頂會(huì)論文,并開(kāi)源了其代碼
? ? 入職一年后关筒,一位算法工程師給初學(xué)者的一封信
相關(guān)文章
? ? java網(wǎng)絡(luò)編程之基礎(chǔ)知識(shí)點(diǎn)總結(jié)
? ? 一行 Python 代碼能實(shí)現(xiàn)什么喪心病狂的功能溶握?|CSDN博文精選
? ? 深度學(xué)習(xí)賦能視頻編碼
? ? 想要了解圖或圖神經(jīng)網(wǎng)絡(luò)?沒(méi)有比看論文更好的方式
? ? 初學(xué)者如何入門(mén)編程語(yǔ)言
設(shè)為首頁(yè)? Baidu 使用百度前必讀 意見(jiàn)反饋 京ICP證030173號(hào)
京公網(wǎng)安備11000002000001號(hào)