检测来自YouTube的重复视频

时间:2014-06-05 11:57:37

标签: algorithm matlab video image-processing youtube

考虑到我的M.tech项目 我想知道是否有任何算法可以检测来自youtube的重复视频。 例如(这里是两个视频的链接):

random user upload

upload by official channel

其中第二个是官方视频,T系列有版权。

youtube正式做些什么来删除youtube上的重复视频吗? 不仅是视频,还存在重复的YouTube视频通道。 有时原始视频的观看次数少于盗版版本。

所以,搜索时发现this (参见pdf的页码[49])

我从给定的链接中学到了什么

原创vs版权侵权视频检测使用分类器。 给定查询,首先检索前k个搜索结果。此后使用三个参数对视频进行分类

  1. 订阅者数量
  2. 用户个人资料
  3. 用户名受欢迎程度
  4. 并根据这些参数,如链接中所述识别原始视频。

    编辑1:

    基本上有两个不同的目标

    • 使用上述方法识别原始视频
    • 删除重复的视频

    显然识别原始视频比查找所有重复视频更容易。 所以我更愿意先找出原始视频。

    迄今为止能想的方法 提高准确度:

    • 我们可以先用上述方法找出原创视频
    • 然后使用该视频中最受欢迎的公开框架(可能是多个)在Google图片上进行搜索。因此,此方法会在Google图片搜索结果中检索重复视频列表。

    获取这些重复视频后,我们可以再次逐帧检查并达到满意度(是检索到的视频是“精确或”几乎是“原始视频的副本”)

    这种方法有效吗? 如果没有,是否有更好的算法,以改进给定的方法?

    如果我无法清楚地解释我的方法,请在评论部分写下来。 我将很快添加一些细节。

2 个答案:

答案 0 :(得分:0)

我最近一起入侵了small tool for that purpose。它仍在进行中,但通常非常准确。这个想法是简单地比较视频中心的最大亮度之间的时间。因此,它应在不同的分辨率,帧速率和视频旋转下工作。 ffmpeg用于解码,imageio作为与python的桥梁,numpy / scipy用于最大计算,一些k最近邻库(annoy,cyflann,hnsw)用于比较。

目前它还没有完善,因此您应该了解一些运行它的Python或直接复制它。

答案 1 :(得分:0)

我也有同样的问题..所以我自己写了一个程序..

问题是我有各种格式和分辨率的视频。因此需要对每个视频帧进行哈希处理并进行比较。

https://github.com/gklc811/duplicate_video_finder

您只需更改顶部的目录,就可以了。

from os import path, walk, makedirs, rename
from time import clock
from imagehash import average_hash
from PIL import Image
from cv2 import VideoCapture, CAP_PROP_FRAME_COUNT, CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT, CAP_PROP_FPS
from json import dump, load
from multiprocessing import Pool, cpu_count

input_vid_dir = r'C:\Users\gokul\Documents\data\\'
json_dir = r'C:\Users\gokul\Documents\db\\'
analyzed_dir = r'C:\Users\gokul\Documents\analyzed\\'
duplicate_dir = r'C:\Users\gokul\Documents\duplicate\\'

if not path.exists(json_dir):
    makedirs(json_dir)

if not path.exists(analyzed_dir):
    makedirs(analyzed_dir)

if not path.exists(duplicate_dir):
    makedirs(duplicate_dir)


def write_to_json(filename, data):
    file_full_path = json_dir + filename + ".json"
    with open(file_full_path, 'w') as file_pointer:
        dump(data, file_pointer)
    return


def video_to_json(filename):
    file_full_path = input_vid_dir + filename
    start = clock()
    size = round(path.getsize(file_full_path) / 1024 / 1024, 2)
    video_pointer = VideoCapture(file_full_path)
    frame_count = int(VideoCapture.get(video_pointer, int(CAP_PROP_FRAME_COUNT)))
    width = int(VideoCapture.get(video_pointer, int(CAP_PROP_FRAME_WIDTH)))
    height = int(VideoCapture.get(video_pointer, int(CAP_PROP_FRAME_HEIGHT)))
    fps = int(VideoCapture.get(video_pointer, int(CAP_PROP_FPS)))
    success, image = video_pointer.read()
    video_hash = {}
    while success:
        frame_hash = average_hash(Image.fromarray(image))
        video_hash[str(frame_hash)] = filename
        success, image = video_pointer.read()
    stop = clock()
    time_taken = stop - start
    print("Time taken for ", file_full_path, " is : ", time_taken)
    data_dict = dict()
    data_dict['size'] = size
    data_dict['time_taken'] = time_taken
    data_dict['fps'] = fps
    data_dict['height'] = height
    data_dict['width'] = width
    data_dict['frame_count'] = frame_count
    data_dict['filename'] = filename
    data_dict['video_hash'] = video_hash
    write_to_json(filename, data_dict)
    return


def multiprocess_video_to_json():
    files = next(walk(input_vid_dir))[2]
    processes = cpu_count()
    print(processes)
    pool = Pool(processes)
    start = clock()
    pool.starmap_async(video_to_json, zip(files))
    pool.close()
    pool.join()
    stop = clock()
    print("Time Taken : ", stop - start)


def key_with_max_val(d):
    max_value = 0
    required_key = ""
    for k in d:
        if d[k] > max_value:
            max_value = d[k]
            required_key = k
    return required_key


def duplicate_analyzer():
    files = next(walk(json_dir))[2]
    data_dict = {}
    for file in files:
        filename = json_dir + file
        with open(filename) as f:
            data = load(f)
        video_hash = data['video_hash']
        count = 0
        duplicate_file_dict = dict()
        for key in video_hash:
            count += 1
            if key in data_dict:
                if data_dict[key] in duplicate_file_dict:
                    duplicate_file_dict[data_dict[key]] = duplicate_file_dict[data_dict[key]] + 1
                else:
                    duplicate_file_dict[data_dict[key]] = 1
            else:
                data_dict[key] = video_hash[key]
        if duplicate_file_dict:
            duplicate_file = key_with_max_val(duplicate_file_dict)
            duplicate_percentage = ((duplicate_file_dict[duplicate_file] / count) * 100)
            if duplicate_percentage > 50:
                file = file[:-5]
                print(file, " is dup of ", duplicate_file)
                src = analyzed_dir + file
                tgt = duplicate_dir + file
                if path.exists(src):
                    rename(src, tgt)
                # else:
                #     print("File already moved")


def mv_analyzed_file():
    files = next(walk(json_dir))[2]
    for filename in files:
        filename = filename[:-5]
        src = input_vid_dir + filename
        tgt = analyzed_dir + filename
        if path.exists(src):
            rename(src, tgt)
        # else:
        #     print("File already moved")


if __name__ == '__main__':
    mv_analyzed_file()
    multiprocess_video_to_json()
    mv_analyzed_file()
    duplicate_analyzer()