python 多進程處理圖像


主要內容

比較是否開啟多進程對圖片處理速度的差異

任務目標:

研究生的第一個任務是做皮膚檢測,這是一個老問題了,我還記得小時候買的數碼相機就有這個功能。因為這里主要是比較處理的速度,所以只使用簡單的基於RGB顏色空間。
處理上采用對每個像素點遍歷的方法

def deal_img(img, func, axis=2):  # func 對每個像素做的處理
    return apply_along_axis(func, axis, img)
def rgb_test(pixel):
    B, G, R = int(pixel[0]), int(pixel[1]), int(pixel[2])
    # 均勻日光照射環境下
    return R > 95 and G > 40 and B > 20 and max(R, G, B)-min(R, G, B) > 15 \
        and abs(R-G) > 15 and R > G and R > B

多進程的核心就是下面的代碼

def skin_test(img):
    return deal_img(img, rgb_test)

def skin_test_multiprocess(imgs):
    res = []
    with ProcessPoolExecutor() as executor:
        # 將一系列源數據送入同一個函數中處理,返回的結果是一個迭代器
        #   結果                處理函數    源數據
        for ans in executor.map(skin_test, imgs):
            res.append(ans)
    return res

ProcessPoolExecutor

這個類的簡單使用就像上面寫的那樣,值得注意的有兩點

  1. executor.map(func, iterables, timeout=None)其中func是執行的函數,iterables是一個可迭代對象,返回的是一個可迭代對象,不能直接print;
  2. 實踐過程中發現在skin_test_multiprocess()中嵌套定義func函數會導致AttributeError,原因不明;
  3. 過程中發現了一些有趣的現象:兩種方式在數據量小的時候差別不大,但多進程在處理大量數據時會比較有優勢。

結果

本地運行的結果如下圖所示,CPU為i5-1035G1

服務器運行的結果如下圖,CPU為雙核四線程

(圖中的multipeocesses有誤,應為multipeocess)

注意點:

  1. ipython可以在啟動時自動導入包,可以參考文檔中對c.InteractiveShellApp.exec_files的描述
    http://ipython.org/ipython-doc/stable/config/intro.html#setting-configurable-options
    但要注意【】

  2. ubuntu上opencv的安裝

    apt install python3-opencv

    上面這一行代碼就可以了,注意的是pip中直接安裝opencv可能會有問題,容易出現缺少運行庫的問題,至少在我的實踐中conda和pip都沒能安裝好opencv


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM