From patchwork Thu Aug 22 09:08:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xuewei Meng X-Patchwork-Id: 14651 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B4E61449148 for ; Thu, 22 Aug 2019 12:08:40 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 91BD068ABAA; Thu, 22 Aug 2019 12:08:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E8DEB68AB7E for ; Thu, 22 Aug 2019 12:08:33 +0300 (EEST) Received: by mail-pl1-f179.google.com with SMTP id h3so3086689pls.7 for ; Thu, 22 Aug 2019 02:08:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=bPvib+oMU5lV+Fc9WqWok/t+w2wIQDf7bcQKfHWKsC8=; b=C1Eyov2ba7egumetAMKmIbCWlyPNEGNU9iUb2+9LcdU6n8bUgkMNWoZjb/9Q2wTRhx BUCo4yfk+ADLscMXfP+W3d1Upf83LLvDClkNEw3TNTNnNjSn6oWWYDDftv3QYMOSeaG7 4ccWijvTiayEzaJFU1JYhFYLWKFGOYB8qL/oqqLhfcuxjrZUAPSp+Q5G3vOKUYMX83kR YqkftnC8B+M8AjCB/XVj0T3rd5O5RuX6KiNA/TAQTjck+pcjHQGENbUU01p3cxk9NgT/ 8OFLujV5JBqoeeBCJ0YsQki5AqSx3cefa5C8RoZtWMoJ4g9Q4d2JlE4ABlouEz32a9WC mPeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=bPvib+oMU5lV+Fc9WqWok/t+w2wIQDf7bcQKfHWKsC8=; b=oqAWVgXrUj0hc4AEDxGr3kbGQ8K61mLWDVbpYBBNn0kIcjEyzCkM4gO9OMwPCAMywL hrjksusu329iFew8h+8KlJgzjA5CA3lEPNK9a4z/zqCV48lVcCViMspka7onBSLH66Dz Tgd2/0p5hx0udTGs0Ibr0e5lmH8wyIXUT9Rbc3MCGSA970fHvkyvDHJ673utqTp56/Iq 5/g0eLudCw8TZmqAPz3rTcBDkdRMlsHh/JcyrSN/wSyeekp/ebWDQSfr7QnhCNOkQQ6a 4LfxY5c/3RJSc+ckD0+0m0+nVshLyyT6z/csvilWchaeArblqF7O/0v9im1xUkK7/vsy E5bA== X-Gm-Message-State: APjAAAV1U4WtmMgt9rf/NPuNRUbPlSKZe5OomVCV+RR5yoFIZ+BShAEz c0NKSoEMqst8UrZqgBRqb1bCg4bpIIk= X-Google-Smtp-Source: APXvYqzzOS3JUZxL2NKaM7qBBq5DhQn0qE488udxyw6X+fUCWhyBZhVAa4qigQoba1Tvcs0KrS/F8g== X-Received: by 2002:a17:902:8204:: with SMTP id x4mr7789133pln.37.1566464911903; Thu, 22 Aug 2019 02:08:31 -0700 (PDT) Received: from DESKTOP-IACK8OK.localdomain ([2001:da8:201:3250:1459:1827:9d0e:70ed]) by smtp.gmail.com with ESMTPSA id 67sm2469283pjo.29.2019.08.22.02.08.30 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Aug 2019 02:08:31 -0700 (PDT) From: Xuewei Meng To: ffmpeg-devel@ffmpeg.org Date: Thu, 22 Aug 2019 17:08:27 +0800 Message-Id: <20190822090827.111-1-xwmeng96@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH] libavfilter: Add dehaze-filter option in existing derain filter. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Add the support of dehaze filter in existing derain filter source code. As the processing procedure in FFmpeg is the same for current derain and dehaze, we reuse the derain filter source code. The model training and generation scripts are in repo https://github.com/XueweiMeng/derain_filter.git. Signed-off-by: Xuewei Meng --- doc/filters.texi | 14 +++++++++++++- libavfilter/vf_derain.c | 13 +++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 323c02970e..49fc030489 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -8431,7 +8431,7 @@ delogo=x=0:y=0:w=100:h=77:band=10 @section derain -Remove the rain in the input image/video by applying the derain methods based on +Remove the rain/haze in the input image/video by applying the derain/dehaze methods based on convolutional neural networks. Supported models: @itemize @@ -8449,6 +8449,18 @@ files (.pb) by using tools/python/convert.py The filter accepts the following options: @table @option +@item filter_type +Specify which filter to use. This option accepts the following values: + +@table @samp +@item derain +Derain filter. To conduct derain filter, you need to use a derain model. + +@item dehaze +Dehaze filter. To conduct dehaze filter, you need to use a dehaze model. +@end table +Default value is @samp{derain}. + @item dnn_backend Specify which DNN backend to use for model loading and execution. This option accepts the following values: diff --git a/libavfilter/vf_derain.c b/libavfilter/vf_derain.c index c380b40122..b33c37bfb4 100644 --- a/libavfilter/vf_derain.c +++ b/libavfilter/vf_derain.c @@ -35,6 +35,7 @@ typedef struct DRContext { const AVClass *class; char *model_filename; + int filter_type; DNNBackendType backend_type; DNNModule *dnn_module; DNNModel *model; @@ -46,12 +47,16 @@ typedef struct DRContext { #define OFFSET(x) offsetof(DRContext, x) #define FLAGS AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM static const AVOption derain_options[] = { - { "dnn_backend", "DNN backend", OFFSET(backend_type), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, "backend" }, - { "native", "native backend flag", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, "backend" }, + { "filter_type", "filter type(derain/dehaze)", OFFSET(filter_type), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, "type" }, + { "derain", "derain filter flag", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, "type" }, + { "dehaze", "dehaze filter flag", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, "type" }, + + { "dnn_backend", "DNN backend", OFFSET(backend_type), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, "backend" }, + { "native", "native backend flag", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, "backend" }, #if (CONFIG_LIBTENSORFLOW == 1) - { "tensorflow", "tensorflow backend flag", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, "backend" }, + { "tensorflow", "tensorflow backend flag", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, "backend" }, #endif - { "model", "path to model file", OFFSET(model_filename), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, FLAGS }, + { "model", "path to model file", OFFSET(model_filename), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, FLAGS }, { NULL } };