我将介绍如何在自己的图像和视频流中应用神经

2019-08-08 08:24 来源:未知

原标题:手把手教你用OpenCV和Python完毕图像和录制神经风格迁移(代码)

图片 1

新智元推荐

来源:pyimagesearch

编译:Bing

【新智元导读】在那篇教程中,我Adrian罗斯brock将教您怎样用OpenCV、Python和纵深学习技能对图像和实时摄像举办神经风格迁移。

二零一四年,Gatsys等人在故事集A Neural Algorithm of Artistic Style中建议了最初的神经风格迁移算法。二〇一五年,Johnson等人宣布了Perceptual Losses for Real-Time Style Transfer and Super-Resolutioin一文,将神经网络迁移作为用感知损失管理超分辨率难点的框架。结果注解该算法比Gatys等人的格局快了三倍。接下来,小编将介绍怎么着在友好的图像和录制流中运用神经风格迁移。

用OpenCV举办神经风格迁移

先是表明的少数是,今天探讨的不二等秘书技在叁个CPU上得以高达近似实时的作用,假若在GPU上则完全能够完成实时效果。

第一我们会轻巧塔伦下什么是神经风格迁移,以及它是怎么着运行的。之后大家会用OpenCV和Python出手操作。

什么样是神经风格迁移?

图片 2

从左至右:大家的内容图像;风格图像;输出的作风迁移图像

神经风格迁移首要有八个经过:

  • 领取某张图纸的作风
  • 将该种风格应用到另一张图片上

上海体育场所正是将梵高闻明的画作《星夜》的品格应用到常见的活着照上,大家保留了原照片中的山、人物和鸡尾酒等有着故事情节,但总体替换到了梵高的雕塑风格。

难点不怕,我们应有怎么样定义叁个神经互连网,让它试行神经风格迁移呢?

神经风格迁移怎样职业?

图片 3

在Gatys等人建议的首篇杂文中,神经风格迁移算法无需新的架构。相反,大家得以用一个预陶冶互连网(日常在ImageNet上实行的预陶冶),而且定义一个损失函数,能让我们完结风格迁移的对象,然后对损失函数不断优化。

那正是说,这里的难题就不是“该用什么神经互联网”了,而是“该用什么损失函数”。

答案富含:内容损失、风格损失和总变差损失。各种部分都以独立总计,然后在一个元损失函数中结成。通过将元损失函数最小化,大家将相继对剧情、风格和总变差损失实行优化。

就算如此Gatys等人的主意能生成不错的神经风格迁移结果,可是它的进程非常慢。二〇一五年,Johnson等人在Gatys的底蕴上建议的斩新算法速度快了三倍,但与此同一时间也设有着劣点,即用户不能够轻便选择想要应用的风骨图像。用户率先要磨练贰个网络,生成你想要的品格。互连网练习好后,你能够将它应用到自由内容图像上。

可是到了二零一七年,Ulyanov等人公布了Instance Normalization: The Missing Ingredient for FastStylization一文,他们表示将batch normalization替换来instance normalization(然后在教练和测验时都应用instance normalization),能够达到越来越快的效果与利益,並且艺术效果也越来越好。

种类结构

在开头明日的学科前,请先下载作者提供的素材(点击文末原作地址获取资料)。打算好了剧本、模型和图像后,你能够用tree指令检查项指标布局:

1$ tree --dirsfirst

2.

3├── images

4│ ├── baden_baden.jpg

5│ ├── giraffe.jpg

6│ ├── jurassic_park.jpg

7│ └── messi.jpg

8├── models

9│ ├── eccv16

10│ │ ├── composition_vii.t7

11│ │ ├── la_muse.t7

12│ │ ├── starry_night.t7

13│ │ └── the_wave.t7

14│ └── instance_norm

15│ ├── candy.t7

16│ ├── feathers.t7

17│ ├── la_muse.t7

18│ ├── mosaic.t7

19│ ├── starry_night.t7

20│ ├── the_scream.t7

21│ └── udnie.t7

22├── neural_style_transfer.py

23├── neural_style_transfer_examine.py

24└── neural_style_transfer_video.py

假定您从下载了.zip文件,就无需上网找其余资料了。小编在其间提供了广大测量试验用的图像和模型。同一时间还也是有二种Python脚本。

起来神经风格迁移

接下去让我们用OpenCV和Python进行神经风格迁移的推行。

率先张开neural_style_transfer.py文件,插入如下代码:

1# import the necessary packages

2importargparse

3importimutils

4importtime

5importcv2

6

7# construct the argument parser and parse the arguments

8ap = argparse.ArgumentParser()

9ap.add_argument("-m", "--model", required=True,

10help="neural style transfer model")

11ap.add_argument("-i", "--image", required=True,

12help="input image to apply neural style transfer to")

13args = vars(ap.parse_args())

第一,大家导入所需的包并分析命令行参数。

导入的有:

  • imutils:那个包能够因此pip install --upgrade imutils安装。近期本人发布了imutils==0.5.1,所以并不是遗忘更新!
  • OpenCV:你须要贰个OpenCV 3.4如故更加高版本。

该脚本下要求多个命令行:

  • --model:神经风格迁移的模型路线。在“下载”区中,作者投入了1第11中学经过与教练的模型。
  • --image:供给举行作风迁移的图像(输入图像)。在内部作者归入了四张图片。

您无需转移命令行代码,参数会在运转进度中举办处理。假若您面生这一经过,能够阅读作者另一篇小说:

www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/

接下去的一对可比有意思,大家要下载图像和模型,然后总括神经风格迁移:

15# load the neural style transfer model from disk

16print("[INFO] loading style transfer model...")

17net = cv2.dnn.readNetFromTorch(args["model"])

18

19# load the input image, resize it to have a width of 600 pixels, and

20# then grab the image dimensions

21image = cv2.imread(args["image"])

22image = imutils.resize(image, width=600)

23(h, w) = image.shape[:2]

24

25# construct a blob from the image, set the input, and then perform a

26# forward pass of the network

27blob = cv2.dnn.blobFromImage(image, 1.0, (w, h),

28(103.939, 116.779, 123.680), swapRB=False, crop=False)

29net.setInput(blob)

30start = time.time()

31output = net.forward()

32end = time.time()

在那有的代码中,大家开始展览了:

  • 将下载的预练习神经风格迁移模型称为net(第17行);
  • 下载输入图像并调治尺寸(21和22行);
  • 用均值减法创造blob(27和28行);
  • 执行forward,获取output图像(31行)。

接下去,首要的是对出口图像进行后甩卖:

34# reshape the output tensor, add back in the mean subtraction, and

35# then swap the channel ordering

36output = output.reshape((3, output.shape[2], output.shape[3]))

37output[0] = 103.939

38output[1] = 116.779

39output[2] = 123.680

40output /= 255.0

41output = output.transpose(1, 2, 0)

最终一步是将出口图像呈今后显示屏上:

43# show information on how long inference took

44print("[INFO] neural style transfer took {:.4f} seconds".format(

45end - start))

46

47# show the images

48cv2.imshow("Input", image)

49cv2.imshow("Output", output)

50cv2.waitKey(0)

神经风格迁移结果

当您下载好文件后,打开终端奉行以下命令:

1$ python neural_style_transfer.py --image images/giraffe.jpg

2--model models/eccv16/the_wave.t7

3[INFO] loading style transfer model...

4[INFO] neural style transfer took 0.3152seconds

图片 4

现今,对命令行参数做轻便退换,然后用《侏罗纪公园》中的截图作为内容图像,进行作风迁移:

1$ python neural_style_transfer.py --image images/jurassic_park.jpg

2--model models/instance_norm/the_scream.t7

3[INFO] loading style transfer model...

4[INFO] neural style transfer took 0.1202seconds

图片 5

另一个例子:

1$ python neural_style_transfer.py --image images/messi.jpg

我将介绍如何在自己的图像和视频流中应用神经风格迁移。2--model models/instance_norm/udnie.t7

3[INFO] loading style transfer model...

4[INFO] neural style transfer took 0.1495seconds

图片 6

那是本人最快乐的案例,感到都能作为酒吧的装裱画了。

实时神经风格迁移

下面我们讲了哪些在单一图像上行使风格迁移,以往我们要把这一进程放在录制上。

大要流程和图像处理大致,在这一脚本中,大家将:

  • 运用三个异样的Python迭代器,它可以让大家在模型路线中循环使用全部可用的神经风格迁移模型。
  • 我将介绍如何在自己的图像和视频流中应用神经风格迁移。我将介绍如何在自己的图像和视频流中应用神经风格迁移。起步网络雕塑头录像流,大家会(近乎)实时管理录制头的帧。对于有个别相当的大的模子,系统或许会慢一些。
  • 在每一帧上运用风格迁移,对输出进行后甩卖,并将结果展现在荧屏上。
  • 假设用户按下“n”键,大家将把迭代器循环利用到下贰个神经风格迁移模型上,不用重启脚本。

首先,打开neural_style_transfer_我将介绍如何在自己的图像和视频流中应用神经风格迁移。video.py文件,插入以下代码:

1# import the necessary packages

2fromimutils.video importVideoStream

3fromimutils importpaths

4importitertools

5importargparse

6importimutils

7importtime

8importcv2

9

10# construct the argument parser and parse the arguments

11ap = argparse.ArgumentParser()

12ap.add_argument("-m", "--models", required=True,

13help="path to directory containing neural style transfer models")

14args = vars(ap.parse_args())

然后,成立模型路线迭代器:

16# grab the paths to all neural style transfer models in our 'models'

17# directory, provided all models end with the '.t7' file extension

18modelPaths = paths.list_files(args["models"], validExts=(".t7",))

19modelPaths = sorted(list(modelPaths))

20

21# generate unique IDs for each of the model paths, then combine the

22# two lists together

23models = list(zip(range(0, len(modelPaths)), (modelPaths)))

24

25# use the cycle function of itertools that can loop over all model

26# paths, and then when the end is reached, restart again

27modelIter = itertools.cycle(models)

28(modelID, modelPath) = next(modelIter)

要是大家初阶在while循环中拍卖帧,“n”按键就能够在迭代器中下载“下三个”模型。

为了创设模型迭代器,大家:

  • 征集全部神经风格迁移模型并分类(18和19行)
  • 为各样模型分配ID(23行)
  • 应用itertools和cycle创设迭代器(27行)。

让大家开端下载第贰个模型并对录像张开管理:

30# load the neural style transfer model from disk

31print("[INFO] loading style transfer model...")

32net = cv2.dnn.readNetFromTorch(modelPath)

33

34# initialize the video stream, then allow the camera sensor to warm up

35print("[INFO] starting video stream...")

36vs = VideoStream(src=0).start()

37time.sleep(2.0)

38print("[INFO] {}. {}".format(modelID 1, modelPath))

在32行,大家读取了第二个模型利用的路线。在36和37行,运行了录制,从录像头中搜集帧。

随后在帧与帧之间进行巡回:

40# loop over frames from the video file stream

41whileTrue:

42# grab the frame from the threaded video stream

43frame = vs.read()

44

45# resize the frame to have a width of 600 pixels (while

46# maintaining the aspect ratio), and then grab the image

47# dimensions

48frame = imutils.resize(frame, width=600)

49orig = frame.copy()

50(h, w) = frame.shape[:2]

51

52# construct a blob from the frame, set the input, and then perform a

53# forward pass of the network

54blob = cv2.dnn.blobFromImage(frame, 1.0, (w, h),

55(103.939, 116.779, 123.680), swapRB=False, crop=False)

56net.setInput(blob)

57output = net.forward()

随后进行后管理并将出口图像突显出来:

59# reshape the output tensor, add back in the mean subtraction, and

60# then swap the channel ordering

61output = output.reshape((3, output.shape[2], output.shape[3]))

62output[0] = 103.939

63output[1] = 116.779

64output[2] = 123.680

65output /= 255.0

66output = output.transpose(1, 2, 0)

67

68# show the original frame along with the output neural style

69# transfer

70cv2.imshow("Input", frame)

71cv2.imshow("Output", output)

72key = cv2.waitKey(1) & 0xFF

对按钮的拍卖:

74# if the `n` key is pressed (for "next"), load the next neural

75# style transfer model

76ifkey == ord("n"):

77# grab the next neural style transfer model model and load it

78(modelID, modelPath) = next(modelIter)

79print("[INFO] {}. {}".format(modelID 1, modelPath))

80net = cv2.dnn.readNetFromTorch(modelPath)

81

82# otheriwse, if the `q` key was pressed, break from the loop

83elifkey == ord("q"):

84break

85

86# do a bit of cleanup

87cv2.destroyAllWindows()

88vs.stop()

三种差异的开关会对台本运维发生分歧的震慑:

  • “n”:抓取下一个模子的路线和ID,并开始展览下载。要是大家早就获取上三个模型,迭代器就能从头起始循环。
  • “q”:按下q会退出while循环。

实时风格迁移的结果

试行以下命令就可以在录像上行使风格迁移啦:

1$ python neural_style_transfer_video.py --models models

图片 7

能够见到,只须求按多个开关就能够轻轻便松地举办巡回。下边是自己本身做的demo摄像:

结语

明日的课程是教大家怎么着用OpenCV和Python在图纸和摄像上利用神经风格迁移。具体来讲,我们用的模型是Johnson等人于2014年提议的,你可以在小编提供的链接中下载。希望那篇教程对你有用!

(本文经授权转发自民众号“论智 ID:jqr_AI”)

回去知乎,查看越来越多

主编:

TAG标签: 40469太阳集团
版权声明:本文由40469太阳集团发布于国际前线,转载请注明出处:我将介绍如何在自己的图像和视频流中应用神经