用pythonnet为计算机视觉做图像整理
??中國的.NETer是國內(nèi)技術(shù)的另類,當(dāng)他們強(qiáng)調(diào).NET也可以做啥啥時都會給別的技術(shù)藐視,畢竟主流都不用.NET。本人這幾年其實(shí)花在.NET時間也少,都投入在Python/Go社區(qū)。可我還是有點(diǎn)工作外的寄托,就是讓.NET也有一個很好的推廣,畢竟在使用Python/Go中有些東西比不少.NET來得方便。機(jī)器學(xué)習(xí)對于.NETer又是一個危機(jī),特別在國內(nèi)有一句名言".NET 不行"。幸虧這是9012年了,Github上有很多開源項(xiàng)目,有不少.NET Core的開源項(xiàng)目讓大家有了和其他技術(shù)競爭的底氣。SciSharp(https://github.com/SciSharp)就是一個基于.NET的機(jī)器學(xué)習(xí)/深度學(xué)習(xí)解決方案,讓.NETer不需要學(xué)習(xí)Python,就可以用Keras/TensorFlow/Torch 通過C#/F# 來完成機(jī)器學(xué)習(xí)/深度學(xué)習(xí)。
? ? ? ? SciSharp現(xiàn)在有兩種不同的綁定方式如TensorFlow.NET/NumSharp都是基于原生c庫做擴(kuò)展,不需要依賴客戶端的環(huán)境,隨處可以調(diào)用,但有個問題是因?yàn)榻壎ǖ墓ぷ魈?#xff0c;往往功能上不太完整。而另一種方式就是通過pythonnet去完成,這種方式依賴于客戶端的Python環(huán)境可以直接通過C#/F#直接調(diào)用任何本機(jī)已經(jīng)安裝的Python庫和自帶方法,如之前提到的Keras.NET / Numpy.NET都是這種形式。就我個人而言比較喜歡后者,畢竟實(shí)現(xiàn)更快,更容易上手,而且對于現(xiàn)在SciSharp社區(qū)不同子項(xiàng)目的擴(kuò)展也有不少幫助,畢竟社區(qū)內(nèi)的都是業(yè)余時間,功能不可能一時半刻都完成,所以這種方式能更好地填補(bǔ)缺陷。
? ? ? ?pythonnet允許Python代碼與CLR做交互,也可以將Python代碼嵌入.NET 應(yīng)用中(https://github.com/pythonnet/pythonnet).你可以編譯源碼為本機(jī)Python和.NET互相調(diào)用的支持。如果你只是單一希望通過.NET調(diào)用Python可以基于你系統(tǒng)和Python版本通過Nuget添加SciSharp社區(qū)編譯好的Python.Runtime包。下面通過圖像整理來說明一下我是如何做的。
??做計(jì)算機(jī)視覺,圖像前期的處理很重要。首先收集來的圖像大小不一,其次是像素,還有格式。在Python下通過Pilow對圖片進(jìn)行處理,通過Pillow可以對圖片像素,大小,方向,格式進(jìn)行調(diào)整。通過pip install pillow就可以添加Pillow庫。如果希望通過.NET調(diào)用Pillow就需要通過pythonnet進(jìn)行引用。我們來看看一個實(shí)例:
? ? ? ?1. 首先我創(chuàng)建一個.NET Core的控制臺程序,然后添加Python.Runtime包, 因?yàn)槲沂莔acOS,所以添加的是Python.Runtime.OSX, 而機(jī)上的Python版本是3.7 所以對應(yīng)的是Python.Runtime.OSX 3.7.0的版本, 然后通過VSCode打開創(chuàng)建好的項(xiàng)目
? ? ? ? 2. 使用pythonenet, Py.GIL()是必須有的,初始化后,通過Py.Import引入不同的模塊(注意這里必須還是得強(qiáng)調(diào)必須是本機(jī)已經(jīng)有的模塊,沒有是不能引用的), 還有引用后參數(shù)類型都是dynamic
?
? ? ? ?我這里分別引用了Numpy , Matplotlib, Pillow三個庫,Pillow負(fù)責(zé)圖像處理/Numpy負(fù)責(zé)數(shù)值計(jì)算,存儲和處理矩陣/Matplotlib主要用于繪制2D圖形,通常用來顯示相關(guān)處理后的結(jié)果。對圖像處理,我們基本上就是用這三個庫。
? ? ? 3. 方法調(diào)用,我這里針對一張圖完成三種處理,旋轉(zhuǎn)/灰度/還有就是縮放。先來看看效果
? ? ? ?我們這里需要通過Matplotlib顯示一個一行四列的圖片,通過numpy為Matplotlib設(shè)置好大小,第一個是原圖,第二個是旋轉(zhuǎn),第三個是灰度,因?yàn)橐肓藥?#xff0c;所以你可以直接調(diào)用庫自帶相應(yīng)的方法。
?
? ? ? ? 遇到一個問題是PIL.Image 有一個自帶方法new,這個方法是不能直接調(diào)用的,因?yàn)楹虲#的關(guān)鍵字new沖突,這個時候你需要通過InvokeMethod的方法去觸發(fā)new方法,以下是實(shí)現(xiàn)方式?
? ? ? ? 最后別忘記使用plt.show() 顯示結(jié)果。
? ? ? ? 上面的例子把pythonnet如何在C#使用展示出來,我也通過ICSharpCore在JupyterNotebook 上進(jìn)行了調(diào)用。擴(kuò)展了一下Plot.NET(https://github.com/SciSharp/Plot.NET)讓它支持圖像顯示, 這是在Notebook上使用的效果
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的用pythonnet为计算机视觉做图像整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用VS Code 开发.NET COR
- 下一篇: ABP虚拟文件系统(VirtualFil