版面规则
提问时请注意:尽量详细描述操作过程、AVS脚本内容等,最好能写出片名,只贴图有时无法看出问题原因。
提示:发布原创内容请尽量使用附件上传。使用网盘会出现过期失效的问题,请注意。
kewenyu
帖子: 33
注册时间: 2013-07-28 0:23

Re: TAAmbk - 发一个我自己胡思乱想改的TAAmod,可GPU加速及循环处理

lwjkk666 写了:DGDecode_mpeg2source("F:\encode\Regios\VTS_01_1.d2v", info=3)
tfm(order=1).tdecimate(hybrid=1)
TAAmbk(aatype=-3, sharp=-1, preaa=-1,mtype=5, aarepair=0, useOpenCL=true, preferSangNom2=true,cycle=3)
LanczosResize(720,400) # Lanczos (Sharp)

E3的U,显卡是HD7850
我这测试一切正常,怀疑是你GPU的问题
另外mtype=5是使用canny算法的tcanny,非常非常的慢, 而且范围小稍微厉害点的锯齿都mask不住。如果不必要尽量避免使用
上次由 kewenyu 在 2015-02-18 23:32,总共编辑 1 次。
lwjkk666
帖子: 321
注册时间: 2012-05-29 13:43

Re: TAAmbk - 发一个我自己胡思乱想改的TAAmod,可GPU加速及循环处理

画面有绿边,GPU的话都是A卡,驱动是最新的那个Omega
kewenyu
帖子: 33
注册时间: 2013-07-28 0:23

Re: TAAmbk - 发一个我自己胡思乱想改的TAAmod,可GPU加速及循环处理

lwjkk666 写了:画面有绿边,GPU的话都是A卡,驱动是最新的那个Omega
切一小段片源传上来,没有片源我也没法重演你的问题(哪怕5秒都好)
lwjkk666
帖子: 321
注册时间: 2012-05-29 13:43

Re: TAAmbk - 发一个我自己胡思乱想改的TAAmod,可GPU加速及循环处理

不关片源的事情,我也不清楚哪里出问题,压的都是原盘。关了那个OPENCL的就正常
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: TAAmbk - 发一个我自己胡思乱想改的TAAmod,带GPU加速、循环处理、时域限制与稳定等,部分情况速度提升20% [2月19日更新]

我觉得最简单也最实用的修改是把TCanny改成TCannyMod,速度会提高很多并且支持Sobel kernel(另外还有TEdgeMask改成TEMmod,但这个没太多区别)。而且针对mask的后处理也有很大的改进空间(你说的框不住也就是这个问题)。
然后cycle的话建议只对核心部分进行(aatype或aatype+sharp,可以单独写进一个函数),其他的前处理后处理以及mask部分多次使用除了增加计算量我没看出有什么实际的意义。
默认参数方面,我建议preaa要么设为0(不处理)要么设为-1(水平加垂直处理),之前默认的1是只处理垂直方向,但daa的这钟用法其实是对付某些特殊情况的(比如简单有效地去除缟缟、field shift,总之是和interlaced的源相关),我个人也只对这种情况用daa。注:TAA的preaa来源于daa,从它的实现原理来讲可以叫做blend AA。
kewenyu
帖子: 33
注册时间: 2013-07-28 0:23

Re: TAAmbk - 发一个我自己胡思乱想改的TAAmod

对TAAmbk进行了一次大改
首先以模块化重写了脚本,将TAA原先的功能按prepass、mainpass、postpass、mask拆成四个函数执行
1.将preaa默认值按mawen菊苣的建议改成0,cycle也只循环mainpass了
3.增加参数showmask,打开将输出mask。这样可以比较方便的调试mask,生成的mask也许还可以给其他函数用。
4.调整了mtype,1、2、3分别使用tcannymod、MSharpen、TEdgeMask。4、5、6分别为sobel、roberts、prewitt。默认mtype为1
5.移除参数mclip。想要使用自己的mask直接mtype=clip
6.增加参数mtype2和mthr2。生成第二个mask,并与mtype的mask取max。主要用途是当某些锯齿断线比较厉害的时候tcannymod出来的mask也是断线,而其他mask又有漏线时,可以用这种方法弥补一下。
7.增加参数averagemask。将aa后的clip与input先average再建mask,目的同上
8.增加参数auxmthr,当mtype=1时为tcannymod的sigma,当mtype=3时为TEdgeMask的threshY。
9.增加参数eedi3mask。用msharpen建一个mask供eedi3的mclip使用以提升速度
另外修复了很多bug。其中之前因为理解错误,limit貌似并没有正确发挥效果,修改过后limit能正常生效且速度有所提升。

大改后用640x480视频做了次benchmark发现速度似乎再次有所提升
EF1%MDVOD$EJ8UW@TVK11B9.png
EF1%MDVOD$EJ8UW@TVK11B9.png (5.77 KiB) 查看 6858 次

然后改的过程中一直有几个地方不太明白
1、从菊苣间交谈得知nnedi3(dh=true)是nnedi3_rpow2的内部实现方式,既然这样那aatype=-3与aatype=4有什么不同呢?
2、一直想不明白repair为什么要反着用,我测试过程中发现即使aarepair=24锯齿恢复仍然很厉害。正着用repair(20,20)则既不会恢复太多锯齿,而且貌似还能略微挽救OP的credit。求菊苣们指教
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: TAAmbk - 发一个我自己胡思乱想改的TAAmod [2月23日大改,速度提升]

aatype=-3和aatype=4从本质上来说确实没啥区别,设计时的思路是前者用nnedi3做AA的同时进行upscale,后者用nnedi3_rpow2进行高质量upscale(虽然也有AA效果但不强调),所以两者的nnedi3的参数有区别(前者为nsize=3,nns=1,偏向AA,而后者为nsize=1,nns=3,偏向upscale)。
另外一个区别是前者在每个方向的upscale以后用Spline36Resize调整到目标大小,所以放大倍数小于2时可以略微提高第二次nnedi3的速度。
但是其实TAA整个脚本里存在一个问题是,对于4:2:0、4:2:2的源,用各种edi进行拉伸后,各个plane上的center shift值是固定的,但用Spline36Resize直接修正shift时,chroma的修正值由于chroma subsampling被减半了。
我的建议:
1. 把所有resize替换为一个分平面修正shift的函数
2. 去掉用nnedi3_rpow2的那些type只保留nnedi3的,参数直接用偏向于AA的就可以了。

repair反着用的思路是,把AA后的画面作为源,而AA前的画面作为存在缺陷的,将AA前的画面的每个像素限制到AA后的画面的3x3的窗口中。
主要考虑到存在aliasing的线条边缘较为突兀,而AA后的线条则较为平滑,可以通过repair消除这些突兀的部分(被认为是artifacts)。
至于如果有些情况下正着用repair会更好的话,可以当aarepair设为负值时正着用。
头像
mawen1250
核心会员
核心会员
帖子: 670
注册时间: 2011-07-24 20:33

Re: TAAmbk - 发一个我自己胡思乱想改的TAAmod [2月23日大改,速度提升]

今天更新了Resize8到v1.2:viewtopic.php?f=7&t=1323
增加的一个函数Resize8_Separate()可以用于替换TAA中所有的resize,解决了之前存在的chroma center shift处理错误的问题,resize kernel自适应,而且对于upscale会自动应用non-ringing算法。
如果后续TAA加入chroma处理的开关的话也可以方便设置U、V为False来避免chroma处理,从而加速(不过直接在resize、turn的前后加上ConvertToY8()和ConvertToYV12()是更快速的选择)。

简单改了一下mainpass部分:

代码: 全选

Function TAAmbk_mainpass(clip preaaC, int "aatype", int "cycle", bool "useOpenCL", bool "preferSangNom2", float "p1", float "p2", float "p3", float "p4", float "p5", float "p6", int "w", int "h", int "uph4", int "upw4", int "eedi3mask") {
    nnedi3type = (useOpenCL == true) ? "nnedi3ocl" : "nnedi3"
	sangnomtype = (preferSangNom2 == true) ? "SangNom2" : "SangNom"
	eedi3mclip = (eedi3mask == 0 ) ? nop() : preaaC.MSharpen(threshold=eedi3mask/5, strength=0, mask=true, highq=false)
	eedi3mclip_r = (eedi3mask == 0 ) ? nop() : eedi3mclip.BilinearResize(w, uph4).mt_binarize(63, U=3, V=3).TAAmbk_TurnRight()
  Eval("""
    aa_clip =
    \ (aatype == -3 || aatype == 4) ? preaaC."""+nnedi3type+"""(dh=true, field=1, nsize=int(p2), nns=int(p3), qual=int(p4)).Resize8_Separate(w, uph4, 0, -0.5).TAAmbk_TurnRight()
    \                        ."""+nnedi3type+"""(dh=true, field=1, nsize=int(p2), nns=int(p3), qual=int(p4)).Resize8_Separate(uph4, upw4, 0, -0.5)
    \                        ."""+sangnomtype+"""(aa=int(p1)).TAAmbk_TurnLeft()."""+sangnomtype+"""(aa=int(p1)).Resize8_Separate(w, h)                                                                      :
    \ (aatype == -2) ? (eedi3mask == 0) ? preaaC.eedi3(dh=true, field=1, alpha=p2, beta=p3, gamma=p4, nrad=int(p5), mdis=int(p6)).Resize8_Separate(w, uph4, 0, -0.5).TAAmbk_TurnRight()
    \                                     .eedi3(dh=true, field=1, alpha=p2, beta=p3, gamma=p4, nrad=int(p5), mdis=int(p6)).Resize8_Separate(uph4, upw4, 0, -0.5)."""+sangnomtype+"""(aa=int(p1)).TAAmbk_TurnLeft()."""+sangnomtype+"""(aa=int(p1)).Resize8_Separate(w, h)     	:
	\                                      preaaC.eedi3(dh=true, field=1, alpha=p2, beta=p3, gamma=p4, nrad=int(p5), mdis=int(p6), mclip=eedi3mclip).Resize8_Separate(w, uph4, 0, -0.5).TAAmbk_TurnRight()
    \                                     .eedi3(dh=true, field=1, alpha=p2, beta=p3, gamma=p4, nrad=int(p5), mdis=int(p6),mclip=eedi3mclip_r).Resize8_Separate(uph4, upw4, 0, -0.5)."""+sangnomtype+"""(aa=int(p1)).TAAmbk_TurnLeft()."""+sangnomtype+"""(aa=int(p1)).Resize8_Separate(w, h)     	:        
    \ (aatype == -1) ? preaaC.eedi2(field=1, mthresh=int(p2), lthresh=int(p3), vthresh=int(p4), maxd=int(p5), nt=int(p6)).Resize8_Separate(w, uph4, 0, -0.5).TAAmbk_TurnRight()
    \                        .eedi2(field=1, mthresh=int(p2), lthresh=int(p3), vthresh=int(p4), maxd=int(p5), nt=int(p6)).Resize8_Separate(uph4, upw4, 0, -0.5)
    \                        ."""+sangnomtype+"""(aa=int(p1)).TAAmbk_TurnLeft()."""+sangnomtype+"""(aa=int(p1)).Resize8_Separate(w, h)                                                                      :
    \ (aatype ==  1) ? preaaC.eedi2(field=1, mthresh=int(p1), lthresh=int(p2), vthresh=int(p3), maxd=int(p4), nt=int(p5)).Resize8_Separate(w, h, 0, -0.5).TAAmbk_TurnRight()
    \                        .eedi2(field=1, mthresh=int(p1), lthresh=int(p2), vthresh=int(p3), maxd=int(p4), nt=int(p5)).Resize8_Separate(h, w, 0, -0.5).TAAmbk_TurnLeft()         :
    \ (aatype ==  2) ? (eedi3mask == 0) ? preaaC.eedi3(dh=true, field=1, alpha=p1, beta=p2, gamma=p3, nrad=int(p4), mdis=int(p5)).Resize8_Separate(w, h, 0, -0.5).TAAmbk_TurnRight()
    \                                     .eedi3(dh=true, field=1, alpha=p1, beta=p2, gamma=p3, nrad=int(p4), mdis=int(p5)).Resize8_Separate(h, w, 0, -0.5).TAAmbk_TurnLeft()                    :
	\                                     preaaC.eedi3(dh=true, field=1, alpha=p1, beta=p2, gamma=p3, nrad=int(p4), mdis=int(p5),mclip=eedi3mclip).Resize8_Separate(w, h, 0, -0.5).TAAmbk_TurnRight()
    \                                     .eedi3(dh=true, field=1, alpha=p1, beta=p2, gamma=p3, nrad=int(p4), mdis=int(p5),mclip=eedi3mclip.TAAmbk_TurnRight()).Resize8_Separate(h, w, 0, -0.5).TAAmbk_TurnLeft()   :
    \ (aatype ==  3) ? preaaC."""+nnedi3type+"""(dh=true, field=1, nsize=int(p1), nns=int(p2), qual=int(p3)).Resize8_Separate(w, h, 0, -0.5).TAAmbk_TurnRight()
    \                                     ."""+nnedi3type+"""(dh=true, field=1, nsize=int(p1), nns=int(p2), qual=int(p3)).Resize8_Separate(h, w, 0, -0.5).TAAmbk_TurnLeft()                                  :
    \ (aatype ==  5) ? preaaC.Resize8_Separate(upw4, uph4)
    \                        ."""+sangnomtype+"""(aa=int(p1)).TAAmbk_TurnRight()
    \                        ."""+sangnomtype+"""(aa=int(p1)).Resize8_Separate(h, w).TAAmbk_TurnLeft()                                                                                          :
    \ (aatype ==  6) ? preaaC.Resize8_Separate(w, uph4)."""+sangnomtype+"""(aa=int(p1)).Resize8_Separate(w, h).TAAmbk_TurnRight()                                 
    \                        .Resize8_Separate(h, upw4)."""+sangnomtype+"""(aa=int(p1)).Resize8_Separate(h, w).TAAmbk_TurnLeft().Repair(preaaC, mode=int(p2))                                     :
    \ predown        ? preaaC."""+nnedi3type+"""(dh=true, field=1, nsize=1, nns=3, qual=2).Resize8_Separate(preaaC.Width(), h, 0, -0.5).TAAmbk_TurnRight()
    \                        ."""+nnedi3type+"""(dh=true, field=1, nsize=1, nns=3, qual=2).Resize8_Separate(h, w, 0, -0.5)                                                              :
    \                  preaaC
   """)
   
   return (cycle == 0 ) ? aa_clip : aa_clip.TAAmbk_mainpass(aatype, cycle - 1, useOpenCL, preferSangNom2, p1, p2, p3, p4, p5, p6, w, h, uph4, upw4, eedi3mask)
 }
 
 
 Function TAAmbk_TurnLeft(clip input)
 {
    try
    {
        return input.fturnleft()
    }
    catch(error_msg)
    {
        return input.TurnLeft()
    }
 }
 
 
 Function TAAmbk_TurnRight(clip input)
 {
    try
    {
        return input.fturnright()
    }
    catch(error_msg)
    {
        return input.TurnRight()
    }
 }
alexz220
帖子: 115
注册时间: 2012-07-21 17:15

Re: TAAmbk - 发一个我自己胡思乱想改的TAAmod,可GPU加速及循环处理

lwjkk666 写了:画面有绿边,GPU的话都是A卡,驱动是最新的那个Omega
是否切了邊?不切邊試試。
alexz220
帖子: 115
注册时间: 2012-07-21 17:15

Re: TAAmbk - 发一个我自己胡思乱想改的TAAmod [2月23日大改,速度提升]

nnedi3ocl的nsize固定为0, TAA里nnedi3默认的nsize默认为3。nsize=3/6适合AA,nsize=0/4适合upscale。
改用nnedi3ocl后结果是不同的。这个还是在主楼提醒一下吧。

回到 “AviSynth”