CoolFace
Apppublic

ricezilla/video_tampering_detection

sourceHugging Faceupdated 4y agoView on Hugging Face
1likes
utils.py265 linesDownload Raw Back to root
1import matplotlib.pyplot as plt2from PIL import ImageFont3from PIL import ImageDraw 4import multiprocessing5from PIL import Image6import numpy as np7import itertools8# import logging9import math10import cv211import os12 13 14# logging.basicConfig(filename=f'{os.getcwd()}/frame_processing.log', level=logging.INFO)15# logging.info('Starting frame processing')16fps = 017def read_file(name):18    global fps19    cap = cv2.VideoCapture(name)20    fps = cap.get(cv2.CAP_PROP_FPS)21    if not cap.isOpened():22        # logging.error("Cannot open Video")23        exit()24    frames = []25    while True:26        ret,frame = cap.read()27        if not ret:28            # logging.info("Can't receive frame (stream end?). Exiting ...")29            break30        frames.append(frame)31 32    cap.release()33    cv2.destroyAllWindows()34    for i in range(len(frames)):35        # print(frames[i].shape)36        frames[i]=cv2.cvtColor(frames[i], cv2.COLOR_BGR2GRAY)37 38    frames_with_index = [(frame, i) for i, frame in enumerate(frames)]39    return frames_with_index40 41st = [0,1,2,3,4]42dt = {}43idx = 0;44l = (tuple(i) for i in itertools.product(st, repeat=4) if tuple(reversed(i)) >= tuple(i))45l=list(l)46cnt = 047for i in range(0,len(l)):48    lt=l[i]49    mirror = tuple(reversed(lt))50    dt[mirror]=i;51    dt[lt]=i;52 53 54def calc_filtered_img(img):55    # residual_img= np.zeros(img.shape)56    # residual_img = np.array(img);57    fil = np.array([[-1,3,-3,1]])58    residual_img = cv2.filter2D(img, -1, fil)59    # for i in range(img.shape[0]):60    #     for j in range(img.shape[1]):61    #         residual_img[i, j] = - 3*img[i, j];62    #         if(j>0):63    #             residual_img[i, j] += img[i, j-1]64    #         if(j+1<img.shape[1]):65    #             residual_img[i, j] += 3*img[i, j+1]66    #         if(j+2<img.shape[1]):67    #             residual_img[i,j]-= img[i, j+2]68    # residual_img = np.convolve(img,[1,-3,3,-1],mode='same')69    return residual_img70 71def calc_q_t_img(img, q, t):72    # qt_img = np.zeros(img.shape)73    # for i in range(img.shape[0]):74    #     for j in range(img.shape[1]):75            # val = np.minimum(t, np.maximum(-t, np.round(img[i, j]/q)))76    #         qt_img[i, j] = val77    # print(dct)78    qt_img = np.minimum(t, np.maximum(-t, np.round(img/q)))79    return qt_img80 81def process_frame(frame_and_index):82    frame, index = frame_and_index83    # processing logic for a single frame84    # logging.info(f"Processing frame {index}")85    filtered_image = calc_filtered_img(frame)86    output_image = calc_q_t_img(filtered_image, q, t)87    output_image=output_image+288    # plt.imshow(output_image)89    return output_image.astype(np.uint8)90 91# Center the filtered image at zero by adding 12892q = 393t = 294def process_video(frames_with_index):95    num_processes = multiprocessing.cpu_count()96    # logging.info(f"Using {num_processes} processes")97    pool = multiprocessing.Pool(num_processes)  98    # process the frames in parallel99    processed_frames = pool.map(process_frame, frames_with_index)100    pool.close() 101    pool.join()102    processed_frame_with_index = [(frame, i) for i, frame in enumerate(processed_frames)]103    return processed_frame_with_index104 105co_occurrence_matrix_size = 5106co_occurrence_matrix_distance = 4107def each_frame(frame_and_index,processed_frames):108    # go rowise and column wise109    frame,index = frame_and_index110    freq_dict = {}111    for i in range( frame.shape[0]):112        for j in range( frame.shape[1]-co_occurrence_matrix_distance):113            row = frame[i]114            v1 = row[j:j+4]115            k1 = tuple(v1)116            freq_dict[k1]=freq_dict.get(k1,0)+1117    freq_dict2={}118    for i in range( frame.shape[0]-co_occurrence_matrix_distance):119        for j in range( frame.shape[1]):120            column = frame[:, j]121            v2 = column[i:i+4]122            k2 = tuple(v2)123            freq_dict2[k2]=freq_dict2.get(k2,0)+1124    freq_dict3={}125    for i in range( frame.shape[0]):126        for j in range( frame.shape[1]):127            # get next possible 4 frames128            if index < len(processed_frames)-3:129                f1 = processed_frames[index+1][i,j]130                f2 = processed_frames[index+2][i,j]131                f3 = processed_frames[index+3][i,j]132                k = (frame[i,j], f1, f2, f3)133                freq_dict3[k]=freq_dict3.get(k,0)+1134    # logging.info(f"hist made for frame {index}")135    return (freq_dict,freq_dict2,freq_dict3)136 137def extract_video(processed_frame_with_index):138    processed_frames = [frame for frame, index in processed_frame_with_index]139    num_processes = multiprocessing.cpu_count()140    # logging.info(f"Using2 {num_processes} processes")141    pool = multiprocessing.Pool(num_processes)  142    # process the frames in parallel143    freq_dict_list = pool.starmap(each_frame, zip(processed_frame_with_index,itertools.repeat(processed_frames)))144    pool.close() 145    pool.join()146    return freq_dict_list147def final(freq_dict_list):148    descriptors = []149    for freq_dicts in freq_dict_list:150        di1=[]151        for freq_dict in freq_dicts:152            frame = np.zeros(325);153            for(k,v) in freq_dict.items():154                frame[dt[k]]+=v155            di1.append(frame);156        descriptors.append(di1)157    descriptors=np.array(descriptors);158    desc_1d = descriptors.reshape(descriptors.shape[0],-1)159    mean_1d = np.mean(desc_1d,axis=0)160    co_variance_1d = np.zeros((1,1))161    for frame in desc_1d:162        mean_1d+=frame163    mean_1d=frame/len(desc_1d)164        165    for frame in desc_1d:166        tmp = frame-mean_1d167        co_variance_1d+=np.matmul(tmp,tmp.T)168    co_variance_1d=co_variance_1d/len(desc_1d)169 170    mean = np.zeros(descriptors[0].shape)171    co_variance = np.zeros((3,3))172    for frame in descriptors:173        mean+=frame174    mean=frame/len(descriptors)175 176    # print(mean)177    for frame in descriptors:178        tmp=frame-mean179        tc=np.matmul(tmp,tmp.T)180        co_variance+=tc181 182    co_variance=co_variance/len(descriptors)183    return (mean,co_variance,descriptors,mean_1d,co_variance_1d,desc_1d)184 185def final_main(input1,input2):186    f1 = read_file(input1) 187    of1 = read_file(input2)188    pf1 = process_video(f1)189    print("video1 processed residual and quantization")190    pof1=process_video(of1)191    print("video2 processed residual and quantization")192    fd1 = extract_video(pf1)193    print("video1 Created co-variance matrix")194    ofd1 = extract_video(pof1)195    print("video2 Created co-variance matrix")196    mean1,co_variance1,disc1,mean_1d_1,co_variance_1d_1,desc_1d_1=final(fd1)197    mean2,co_variance2,disc2,mean_1d_2,co_variance_1d_2,desc_1d_2=final(ofd1)198    distances = []199    print("creating Descriptors");200    for index,disc in enumerate(disc1):201        gm = disc - mean2202        dm = np.matmul(np.matmul(gm.T,np.linalg.inv(co_variance2)),gm)203        dm_sq = np.sqrt(np.abs(dm))204        distances.append(dm_sq)205 206    distances = np.array(distances)207 208    dist2 = []209    for index, disc in enumerate(disc2):210        gm = disc - mean2211        dm = np.matmul(np.matmul(gm.T,np.linalg.inv(co_variance2)),gm)212        dm_sq = np.sqrt(np.abs(dm))213        dist2.append(dm_sq)214 215    dist2 = np.array(dist2)216    fourcc = cv2.VideoWriter_fourcc(*'mp4v') 217    height =f1[0][0].shape[0]+of1[0][0].shape[0]218    width = 325+f1[0][0].shape[1]219    video = cv2.VideoWriter('video.mp4', fourcc, 30, (width,height))220    inital_diff,final_diff = 10000,-1221    result = ''222    print("writing video")223    for index, dist in enumerate(distances):224        heatmap = dist;225        frame,index = f1[index]226        different = False227        if index<len(of1):228            frame2 = of1[index][0]229            diff = dist - dist2[index]230            if not np.allclose(diff, np.zeros(diff.shape)):231                different = True232                inital_diff = min(inital_diff, index)233                final_diff = max(final_diff, index)234                sum1= np.sum(dist)235                sum2 = np.sum(dist2[index])236                    237        new_im = Image.new('RGB', (width, height))238        new_im.paste(Image.fromarray(frame), (0, 0))239        new_im.paste(Image.fromarray(frame2), (0, frame.shape[0]))240        heatmapshow = None241        heatmapshow = cv2.normalize(heatmap, heatmapshow, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)242        heatmapshow = cv2.applyColorMap(heatmapshow, cv2.COLORMAP_JET)243        new_im.paste(Image.fromarray(heatmapshow), (frame.shape[1], 0))244 245        draw = ImageDraw.Draw(new_im)246        text = "The images are same."247        if different:248            text = "The images are different."249        text_width, text_height = draw.textsize(text)250 251        x = (new_im.width - text_width) / 2252        y = (new_im.height - text_height) / 2253 254        draw.text((x, y), text, fill=(255, 255, 255))255 256        new_im = np.array(new_im)257        video.write(new_im)258    outputString = ""259    if inital_diff != 10000:260        outputString+=f"Initial difference at frame {inital_diff} at time {inital_diff/fps} seconds"261        outputString+=f"Final difference at frame {final_diff} at time {final_diff/fps} seconds"262    video.release()263    if(outputString==""):264        outputString= "Not tampering are detected"265    return ("video.mp4",outputString)