• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁(yè) > 牛人業(yè)話 > OpenCV DNN 模塊-風(fēng)格遷移

    OpenCV DNN 模塊-風(fēng)格遷移

    作者: 時(shí)間:2020-07-05 來(lái)源:計(jì)算機(jī)視覺(jué)與機(jī)器學(xué)習(xí) 收藏

    本文主要介紹OpenCV的DNN模塊的使用。OpenCV的DNN模塊自從contrib倉(cāng)庫(kù)開(kāi)始,就是只支持推理,不支持訓(xùn)練。但是僅僅只是推理方面,也夠強(qiáng)大了。現(xiàn)在OpenCV已經(jīng)支持TensorFlow、Pytorch/Torch、Caffe、DarkNet等模型的讀取。本文們就以風(fēng)格遷移為例,來(lái)看一下OpenCV DNN模塊的用法。

    本文引用地址:http://www.czjhyjcfj.com/article/202007/415158.htm

    相比于復(fù)雜而耗時(shí)的模型訓(xùn)練過(guò)程,模型推理就顯得簡(jiǎn)單多了。簡(jiǎn)單來(lái)說(shuō),過(guò)程就是:

    1. 加載模型

    2. 輸入圖像預(yù)處理(跟訓(xùn)練過(guò)程一樣的方式,增強(qiáng)除外)

    3. 模型推理

    1. 加載模型

    因?yàn)镺penCV只支持推理,所以首先你需要有一個(gè)訓(xùn)練好的模型。OpenCV支持所有主流框架的大部分模型。從OpenCV的readNet系列函數(shù)就可以看出來(lái):

    • readNetFromCaffe

    • readNetFromTensorflow

    • readNetFromTorch

    • readNetFromDarknet

    • readNetFromONNX

    • readNetFromModelOptimizer

    本文所用風(fēng)格遷移模型是李飛飛的文章<<Perceptual Losses for Real-Time Style Transfer and Super-Resolution>>開(kāi)源的Torch/Lua的模型,地址在這里:https://github.com/jcjohnson/fast-neural-style。他們提供了十種風(fēng)格遷移的模型,模型的下載腳本在:https://github.com/jcjohnson/fast-neural-style/blob/master/models/download_style_transfer_models.sh。顯然這里需要用OpenCV的readNetFromTorch函數(shù)去加載模型,由于模型較多,這里提供的函數(shù)可以選擇加載指定的模型:

    import cv2

    model_base_dir = "/cvpy/style_transfer/models/"
    d_model_map = {
        1"udnie",
        2"la_muse",
        3"the_scream",
        4"candy",
        5"mosaic",
        6"feathers",
        7"starry_night"
    }

    def get_model_from_style(style: int):
        """
        加載指定風(fēng)格的模型
        :param style: 模型編碼
        :return: model
        """
        model_name = d_model_map.get(style, "mosaic")
        model_path = model_base_dir + model_name + ".t7"
        model = cv2.dnn.readNetFromTorch(model_path)
        return model

    2. 圖像預(yù)處理

    在OpenCV中,輸入給模型的圖像需要首先被構(gòu)建成一個(gè)4維的Blob,看到Blob這個(gè)詞感覺(jué)是受到了Caffe的影響。在構(gòu)建Blob的時(shí)候會(huì)做一些諸如resize、歸一化和縮放之類的簡(jiǎn)單預(yù)處理。OpenCV提供的函數(shù)為:

    blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)

    這個(gè)函數(shù)在構(gòu)建Blob的之前會(huì)先做如下計(jì)算:

    (image - mean) * scalefactor。

    函數(shù)中的swapRB參數(shù)的含義是swap Blue and Red channels,干的是cvtColor(image, cv2.COLOR_BGR2RGB)的事情。

    本文的風(fēng)格遷移所需要做的圖像預(yù)處理很簡(jiǎn)單,只是三通道分別減去均值即可。代碼如下:

    (h, w) = img.shape[:2]
    blob = cv2.dnn.blobFromImage(img, 1.0, (w, h), (103.939, 116.779, 123.680), swapRB=False, crop=False)

    3. 模型推理

    模型推理過(guò)程就是神經(jīng)網(wǎng)絡(luò)模型進(jìn)行一次前向傳播,在OpenCV中,用以下可讀性非常強(qiáng)的兩行代碼即可完成:

    net.setInput(blob)
    output = net.forward()

    把第一節(jié)構(gòu)建的blob輸入給模型,然后執(zhí)行一次前向傳播。

    得到輸出output再做一些處理使得我們可以更好的可視化圖像:

    # reshape輸出結(jié)果, 將減去的平均值加回來(lái),并交換各顏色通道
    output = output.reshape((3output.shape[2], output.shape[3]))
    output[0] += 103.939
    output[1] += 116.779
    output[2] += 123.680
    output = output.transpose(120)

    效果展示

    找一張測(cè)試圖片,選擇不同的風(fēng)格,試一下效果。

    OpenCV DNN 模塊-風(fēng)格遷移

    想用自己的圖片風(fēng)格遷移一下嗎?cvpy.net網(wǎng)站剛部署成功,來(lái)試試吧。




    關(guān)鍵詞:

    評(píng)論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 舟曲县| 历史| 湟源县| 健康| 武强县| 科技| 扎兰屯市| 边坝县| 宜良县| 青神县| 洛宁县| 绍兴县| 兰溪市| 浑源县| 永康市| 石林| 视频| 湛江市| 尼木县| 隆子县| 塘沽区| 桃江县| 出国| 苏尼特右旗| 麻江县| 台中市| 侯马市| 巍山| 南宫市| 容城县| 新泰市| 遂昌县| 广昌县| 南部县| 手游| 琼结县| 军事| 化德县| 依安县| 繁峙县| 铅山县|