狠狠操夜夜甜|人妻在线中文字幕亚洲无码不卡av|一区二区欧美亚洲|日躁夜躁狠狠躁2001|亚洲,超碰,欧美|18AV成人电影|午夜成人免费在线|婷婷激情网深爱五月|色欲综合成人在线|在线美女搞黄大片

中企動力 > 頭條 > python中pil

網(wǎng)站性能檢測評分

注:本網(wǎng)站頁面html檢測工具掃描網(wǎng)站中存在的基本問題,僅供參考。

python中pil

解讀Keras在ImageNet中應(yīng)用:詳解5種圖像識別模型 營銷視頻課程

img

昌立輝

關(guān)注

更多深度文章,請關(guān)注:https://yq.aliyun/cloud

幾個月前,我寫了一篇關(guān)于如何使用CNN(卷積神經(jīng)網(wǎng)絡(luò))尤其是VGG16來分類圖像的教程,該模型能夠以很高的精確度識別我們?nèi)粘I钪械?000種不同種類的物品。

那時,模型還是和Keras包分開的,我們得從free-standingGitHubrepo上下載并手動安裝;現(xiàn)在模型已經(jīng)整合進Keras包,原先的教程也已經(jīng)不再適用,所以我決定寫一篇新的教程。

在教程中,你將學(xué)習到如何編寫一個Python腳本來分類你自己的圖像。

博客結(jié)構(gòu)

1.簡要說明一下這幾個網(wǎng)絡(luò)架構(gòu);

2.使用Python編寫代碼:載入訓(xùn)練好的模型并對輸入圖像分類;

3.審查一些樣本圖片的分類結(jié)果。

Keras中最新的深度學(xué)習圖像分類器

Keras提供了五種開箱即用型的CNN:

1.VGG16

2.VGG19

3.ResNet50

4.InceptionV3

5.Xception

什么是ImageNet

ImageNet曾是一個計算機視覺研究項目:(人工)打標簽并分類成22000個不同物品種類。然而,當我們在討論深度學(xué)習和CNN的時候,“ImageNet”意味著ImageNetLargeScaleVisualRecognitionChallenge,簡寫為ILSVRC。

ILSVRC的目的是訓(xùn)練一個能夠正確識別圖像并分類(1000種)的模型:模型使用約120萬張圖像用作訓(xùn)練,5萬張圖像用作驗證,10萬張圖像用作測試。

這1000種分類涵蓋了我們的日常生活接觸到的東西,具體列表請點擊。

在圖像分類上,ImageNet競賽已經(jīng)是計算機視覺分類算法事實上的評價標準——而自2012年以來,排行榜就被CNN和其它深度學(xué)習技術(shù)所統(tǒng)治。

過去幾年中ImageNet競賽里表現(xiàn)優(yōu)異的模型在Keras中均有收錄。通過遷移學(xué)習,這些模型在ImageNet外的數(shù)據(jù)集中也有著不錯的表現(xiàn)。

VGG16和VGG19

圖1:VGG網(wǎng)絡(luò)架構(gòu)(source)

VGG網(wǎng)絡(luò)架構(gòu)于2014年出現(xiàn)在Simonyan和Zisserman中的論文中,《VeryDeepConvolutionalNetworksforLargeScaleImageRecognition》。

該架構(gòu)僅僅使用堆放在彼此頂部、深度不斷增加的3×3卷積層,并通過maxpooling來減小volume規(guī)格;然后是兩個4096節(jié)點的全連接層,最后是一個softmax分類器。“16”和“19”代表網(wǎng)絡(luò)中權(quán)重層的數(shù)量(表2中的D和E列):

在2014年的時候,16還有19層網(wǎng)絡(luò)還是相當深的,Simonyan和Zisserman發(fā)現(xiàn)訓(xùn)練VGG16和VGG19很有難度,于是選擇先訓(xùn)練小一些的版本(列A和列C)。這些小的網(wǎng)絡(luò)收斂后被用來作為初始條件訓(xùn)練更大更深的網(wǎng)絡(luò)——這個過程被稱為預(yù)訓(xùn)練(pre-training)。

預(yù)訓(xùn)練很有意義,但是消耗大量時間、枯燥無味,在整個網(wǎng)絡(luò)都被訓(xùn)練完成前無法進行下一步工作。

如今大部分情況下,我們已經(jīng)不再使用預(yù)訓(xùn)練,轉(zhuǎn)而采用Xaiver/Glorot初始化或者MSRA初始化(有時也被稱作Heetal.初始化,詳見《DelvingDeepintoRectifiers:SurpassingHuman-LevelPerformanceonImageNetClassification》)。如果你感興趣,可以從這篇文章中理解到weightinitialization的重要性以及深度神經(jīng)網(wǎng)絡(luò)的收斂——《Allyouneedisagoodinit,MishkinandMatas(2015)》。

VGGNet有兩個不足:

1.訓(xùn)練很慢;

2.weights很大。

由于深度以及全連接節(jié)點數(shù)量的原因,VGG16的weights超過533MB,VGG19超過574MB,這使得部署VGG很令人討厭。雖然在許多深度學(xué)習圖像分類問題中我們?nèi)允褂肰GG架構(gòu),但是小規(guī)模的網(wǎng)絡(luò)架構(gòu)更受歡迎(比如SqueezeNet,GoogleNet等等)。

ResNet

與AlexNet、OverFeat還有VGG這些傳統(tǒng)順序型網(wǎng)絡(luò)架構(gòu)不同,ResNet的網(wǎng)絡(luò)結(jié)構(gòu)依賴于微架構(gòu)模組(micro-architecturemodules,也被稱為network-in-networkarchitectures)。

微架構(gòu)模組指構(gòu)成網(wǎng)絡(luò)架構(gòu)的“積木”,一系列的微架構(gòu)積木(連同你的標準CONV,POOL等)共同構(gòu)成了大的架構(gòu)(即最終的網(wǎng)絡(luò))。

ResNet于2015年出現(xiàn)在Heetal的論文《DeepResidualLearningforImageRecognition》中,它的出現(xiàn)很有開創(chuàng)性意義,證明極深的網(wǎng)絡(luò)也可以通過標準SGD(以及一個合理的初始化函數(shù))來訓(xùn)練:

圖3:Heetal.于2015年提出的殘差模組

在2016年的著作《IdentityMappingsinDeepResidualNetworks》中,他們證實了可以通過更新殘差模組(residualmodule)來使用標志映射(identifymappings),達到提高精度的目的。

圖4:(左)原始殘差模組(右)使用預(yù)激活(pre-activation)更新的殘差模組

盡管ResNet比VGG16還有VGG19要深,weights卻要?。?02MB),因為使用了全局平均池化(globalaveragepooling),而不是全連接層。

InceptionV3

“Inception”微架構(gòu)于2014年出現(xiàn)在Szegedy的論文中,《GoingDeeperwithConvolutions》。

圖5:GoogleNet中使用的Inception模組原型

Inception模組的目的是扮演一個“多級特征提取器”,在網(wǎng)絡(luò)相同的模組內(nèi)計算1×1、3×3還有5×5的卷積——這些過濾器的輸出在輸入至網(wǎng)絡(luò)下一層之前先被堆棧到channeldimension。

該架構(gòu)的原型被稱為GoogleNet,后繼者被簡單的命名為InceptionvN,N代表Google推出的數(shù)字。

Keras中的InceptionV3架構(gòu)來自于Szegedyetal.的后續(xù)論文,《RethinkingtheInceptionArchitectureforComputerVision(2015)》,該論文打算通過更新inception模組來提高ImageNet分類的準確度。

InceptionV3比VGG還有ResNet都要小,約96MB。

Xception

圖6:Xception架構(gòu)

Xception是被FranoisChollet提出的,后者是Keras庫的作者和主要維護者。

Xception是Inception架構(gòu)的擴展,用depthwise獨立卷積代替Inception標準卷積。

關(guān)于Xception的出版物《DeepLearningwithDepthwiseSeparableConvolutions》可以在這里找到。

Xception最小僅有91MB。

SqueezeNet

Figure7:“fire”模組,由一個“squeeze”和一個“expand”模組組成。(Iandolaetal.,2016)

僅僅4.9MB的SqueezeNet架構(gòu)能達到AlexNet級別的精確度(~57%rank-1and~80%rank-5),這都歸功于“fire”模組的使用。然而SqueezeNet的訓(xùn)練很麻煩,我會在即將出版的書——《DeepLearningforComputerVisionwithPython》——中介紹如何訓(xùn)練SqueezeNet來處理ImageNet數(shù)據(jù)集。

使用Python和Keras通過VGGNet,ResNet,Inception和Xception對圖像分類

新建一個文件,命名為classify_image.py,編輯插入下列代碼1#importthenecessarypackages2fromkeras.applicationsimportResNet503fromkeras.applicationsimportInceptionV34fromkeras.applicationsimportXception#TensorFlowONLY5fromkeras.applicationsimportVGG166fromkeras.applicationsimportVGG197fromkeras.applicationsimportimagenet_utils8fromkeras.applications.inception_v3importpreprocess_input9fromkeras.preprocessing.imageimportimg_to_array10fromkeras.preprocessing.imageimportload_img11importnumpyasnp12importargparse13importcv2

第2-13行導(dǎo)入需要的包,其中大部分都屬于Keras。

第2-6行分別導(dǎo)入ResNet,InceptionV3,Xception,VGG16,還有VGG19——注意Xception只兼容TensorFlow后端。

第7行導(dǎo)入的image_utils包包含了一系列函數(shù),使得對圖片進行前處理以及對分類結(jié)果解碼更加容易。

余下的語句導(dǎo)入其它有用的函數(shù),其中NumPy用于數(shù)學(xué)運算,cv2用于與OpenCV結(jié)合。15#constructtheargumentparseandparsethearguments16ap=argparse.ArgumentParser()17ap.add_argument("-i","--image",required=True,18help="pathtotheinputimage")19ap.add_argument("-model","--model",type=str,default="vgg16",20help="nameofpre-trainednetworktouse")21args=vars(ap.parse_args())

--image為希望進行分類的圖像的路徑。

--model為選用的CNN的類別,默認為VGG16。23#defineadictionarythatmapsmodelnamestotheirclasses24#insideKeras25MODELS={26"vgg16":VGG16,27"vgg19":VGG19,28"inception":InceptionV3,29"xception":Xception,#TensorFlowONLY30"resnet":ResNet5031}3233#esnureavalidmodelnamewassuppliedviacommandlineargument34ifargs["model"]notinMODELS.keys():35raiseAssertionError("The--modelcommandlineargumentshould"36"beakeyinthe`MODELS`dictionary")

第25-31行定義了一個詞典,將類映射到對應(yīng)的模型名稱。

如果沒有在該詞典中找到“--model”,就會報錯。

輸入一個圖像到一個CNN中會返回一系列鍵值,包含標簽及對應(yīng)的概率。

ImageNet采用的圖像尺寸一般為224×224,227×227,256×256,and299×299,但是并不是絕對。

VGG16,VGG19以及ResNet接受224×224的輸入圖像,而InceptionV3和Xception要求為299×299,如下代碼所示:38#initializetheinputimageshape(224x224pixels)alongwith39#thepre-processingfunction(thismightneedtobechanged40#basedonwhichmodelweusetoclassifyourimage)41inputShape=(224,224)42preprocess=imagenet_utils.preprocess_input4344#ifweareusingtheInceptionV3orXceptionnetworks,thenwe45#needtosettheinputshapeto(299x299)[ratherthan(224x224)]46#anduseadifferentimageprocessingfunction47ifargs["model"]in("inception","xception"):48inputShape=(299,299)49preprocess=preprocess_input

這里我們初始化inputShape為224×224像素,初始化預(yù)處理函數(shù)為keras.preprocess_input——執(zhí)行meansubtraction運算。

如果使用Inception或者Xception,inputShape需要改為299×299像素,預(yù)處理函數(shù)改為separatepre-processing函數(shù)。

下一步就是從磁盤載入網(wǎng)絡(luò)架構(gòu)的weights,并實例化模型:51#loadourthenetworkweightsfromdisk(NOTE:ifthisisthe52#firsttimeyouarerunningthisscriptforagivennetwork,the53#weightswillneedtobedownloadedfirst--dependingonwhich54#networkyouareusing,theweightscanbe90-575MB,sobe55#patient;theweightswillbecachedandsubsequentrunsofthis56#scriptwillbe*much*faster)57print("[INFO]loading{}...".format(args["model"]))58Network=MODELS[args["model"]]59model=Network(weights="imagenet")

注意:VGG16和VGG19的weights大于500MB,ResNet的約等于100MB,Inception和Xception的介于90-100MB之間。如果這是你第一次運行某個網(wǎng)絡(luò),這些weights會自動下載到你的磁盤。下載時間由你的網(wǎng)絡(luò)速度決定,而且下載完成后,下一次運行代碼不再需要重新下載。61#loadtheinputimageusingtheKerashelperutilitywhileensuring62#theimageisresizedto`inputShape`,therequiredinputdimensions63#fortheImageNetpre-trainednetwork64print("[INFO]loadingandpre-processingimage...")65image=load_img(args["image"],target_size=inputShape)66image=img_to_array(image)6768#ourinputimageisnowrepresentedasaNumPyarrayofshape69#(inputShape[0],inputShape[1],3)howeverweneedtoexpandthe70#dimensionbymakingtheshape(1,inputShape[0],inputShape[1],3)71#sowecanpassitthroughthenetwork72image=np.expand_dims(image,axis=0)7374#pre-processtheimageusingtheappropriatefunctionbasedonthe75#modelthathasbeenloaded(i.e.,meansubtraction,scaling,etc.)76image=preprocess(image)

第65行從磁盤載入輸入圖像,并使用提供的inputShape初始化圖像的尺寸。

第66行將圖像從PIL/Pillow實例轉(zhuǎn)換成NumPy矩陣,矩陣的shape為(inputShape[0],inputShape[1],3)。

因為我們往往使用CNN來批量訓(xùn)練/分類圖像,所以需要使用np.expand_dims在矩陣中添加一個額外的維度,如第72行所示;添加后矩陣shape為(1,inputShape[0],inputShape[1],3)。如果你忘記添加這個維度,當你的模型使用.predict時會報錯。

最后,第76行使用合適的預(yù)處理函數(shù)來執(zhí)行meansubtraction/scaling。

下面將我們的圖像傳遞給網(wǎng)絡(luò)并獲取分類結(jié)果:78#classifytheimage79print("[INFO]classifyingimagewith'{}'...".format(args["model"]))80preds=model.predict(image)81P=imagenet_utils.decode_predictions(preds)8283#loopoverthepredictionsanddisplaytherank-5predictions+84#probabilitiestoourterminal85for(i,(imagenetID,label,prob))inenumerate(P[0]):86print("{}.{}:{:.2f}%".format(i+1,label,prob*100))

第80行調(diào)用.predict函數(shù),并從CNN返回預(yù)測值。

第81行的.decode_predictions函數(shù)將預(yù)測值解碼為易讀的鍵值對:標簽、以及該標簽的概率。

第85行和86行返回最可能的5個預(yù)測值并輸出到終端。

案例的最后一件事,是通過OpenCV從磁盤將輸入圖像讀取出來,在圖像上畫出最可能的預(yù)測值并顯示在我們的屏幕上。88#loadtheimageviaOpenCV,drawthetoppredictionontheimage,89#anddisplaytheimagetoourscreen90orig=cv2.imread(args["image"])91(imagenetID,label,prob)=P[0][0]92cv2.putText(orig,"Label:{},{:.2f}%".format(label,prob*100),93(10,30),cv2.FONT_HERSHEY_SIMPLEX,0.8,(0,0,255),2)94cv2.imshow("Classification",orig)95cv2.waitKey(0)

VGGNet,ResNet,Inception,和Xception的分類結(jié)果

所有的例子都是使用2.0以上版本的Keras以及TensorFlow后臺做的。確保你的TensorFlow版本大于等于1.0,否則會報錯。所有例子也都使用Theano后端做過測試,工作良好。

案例需要的圖片以及代碼請前往原文獲取。

使用VGG16分類:1$pythonclassify_image.py--imageimages/soccer_ball.jpg--modelvgg16

圖8:使用VGG16來分類足球(source)

輸出為:soccer_ball,精確度為93.43%。

如果要使用VGG19,只需要替換下--network參數(shù)。1$pythonclassify_image.py--imageimages/bmw.png--modelvgg19

圖9:使用VGG19來分類汽車(source)

輸出為:convertible(敞篷車),精確度為91.76%。然而,我們看一下其它的4個結(jié)果:sportscar(跑車),4.98%(也對);limousine(豪華轎車),1.06%(不正確,但也合理);carwheel(車輪),0.75%(技術(shù)上正確,因為圖中確實出現(xiàn)了輪子)。

從下面的例子,我們可以看到類似的結(jié)果:1$pythonclassify_image.py--imageimages/clint_eastwood.jpg--modelresnet

圖10:使用ResNet分類(source).

ResNet成功將圖像分類為revolver(左輪手槍),精確度69.79%。有趣的是rifle(步槍)為7.74%,assaultrifle(突擊步槍)為5.63%??紤]到revolver的觀察角度還有相對于手槍來說巨大的槍管,CNN得出這么高的概率也是合理的。1$pythonclassify_image.py--imageimages/jemma.png--modelresnet

圖11:使用ResNet對狗進行分類

狗的種類被正確識別為beagle(小獵兔狗),精確度94.48%。

然后我試著分類《加勒比海盜》中的圖片:1$pythonclassify_image.py--imageimages/boat.png--modelinception

圖12:使用ResNet對沉船進行分類(source)

盡管ImageNet中有“boat”(船)這個類別,Inception網(wǎng)絡(luò)仍然正確地將該場景識別為“(ship)wreck”(沉船),精確度96.29%。其它的標簽,比如“seashore”(海灘),“canoe”(獨木舟),“paddle”(槳),還有“breakwater”(?...

Python提取圖片中的文字信息,騰訊內(nèi)部技術(shù),一行代碼搞定! 行業(yè)視頻課程

img

女神

關(guān)注

用過手機QQ就知道,點擊一個圖片會彈出一個小功能,那就是提取圖片中的文字。非常方便實用,那么很難實現(xiàn)嗎?

利用Python提取圖片中的文字信息,只需要一行代碼就能搞定!

當然,這是吹牛皮的,但是真正的Python代碼也就第4行,說是一行代碼搞定也沒錯。

示例:

效果

盡管運行Python代碼后也有幾個錯誤的地方,但是大部分是識別正確的。你以為就這樣結(jié)束了嗎?那這么簡單,我都不用出教程了。一行代碼實現(xiàn)這個功能當然也是要有前戲的。

一,pytesseract和PIL的安裝

pip安裝

2,pycharm編輯器能夠快速安裝,這就看你是否用pycharm了。

pycharm的Settings設(shè)置頁按照下面步驟操作

安裝好了pytesseract,安裝PIL在上面第三步里搜索PIL并點擊安裝就可以了。

安裝好了所有庫,運行下面Python代碼

出現(xiàn)報錯

可以看到提示:未安裝識別引擎tesseract-ocr

二,安裝識別引擎tesseract-ocr

1.網(wǎng)上下載安裝包,然后直接點擊安裝即可

因為tesseract-ocr默認不支持中文識別,所以解壓安裝tesseract-ocr后還需做如下操作

2,安裝完成tesseract-ocr后,我們還需配置好

打開后做如下操作

當然也能由pycharm快速打開pytesseract.py

第一步:

第二步:

第三步:

現(xiàn)在已經(jīng)完成了所有配置,運行下面Python代碼即可實現(xiàn)圖片里的文字提取

本文到此就結(jié)束了,希望各位Python越學(xué)越好,早日達成夢想。

python使用PIL庫合并圖片 流量視頻課程

img

彭文博

關(guān)注

本文研究的主要是python PIL實現(xiàn)圖片合成的相關(guān)內(nèi)容,具體介紹如下,分享實例代碼。

在項目中需要將兩張圖片合在一起。遇到兩種情況,一種就是兩張非透明圖片的合成, 一種是涉及到透明png的合成。

相關(guān)API見 http://pillow.readthedocs.io/en/latest/reference/Image.html

第一種情況,直接將兩張圖片合在一起就可以了。如下圖所示,將兩張圖片合在一起

將第1張和第2張合成第3張

詳細代碼

第一種情況時候規(guī)則的圖片進行合并,比如矩形,難以對于任意形狀的圖片。對于任意形狀的合并可以

第二種情況,將非透明的圖片放在底部,上面放一張局部透明的png圖片,然后合成一張圖片。

img

在線咨詢

建站在線咨詢

img

微信咨詢

掃一掃添加
動力姐姐微信

img
img

TOP