├── table.jpg ├── someExamples ├── 155.jpg ├── 158.jpg ├── 175.jpg ├── 205.jpg ├── 305.jpg ├── 371.jpg ├── 451.jpg ├── 579.jpg ├── 601.jpg ├── 616.jpg ├── 624.jpg └── 626.jpg ├── inferenceCode ├── inference.py └── loadModel.py └── README.md /table.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/table.jpg -------------------------------------------------------------------------------- /someExamples/155.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/155.jpg -------------------------------------------------------------------------------- /someExamples/158.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/158.jpg -------------------------------------------------------------------------------- /someExamples/175.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/175.jpg -------------------------------------------------------------------------------- /someExamples/205.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/205.jpg -------------------------------------------------------------------------------- /someExamples/305.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/305.jpg -------------------------------------------------------------------------------- /someExamples/371.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/371.jpg -------------------------------------------------------------------------------- /someExamples/451.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/451.jpg -------------------------------------------------------------------------------- /someExamples/579.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/579.jpg -------------------------------------------------------------------------------- /someExamples/601.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/601.jpg -------------------------------------------------------------------------------- /someExamples/616.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/616.jpg -------------------------------------------------------------------------------- /someExamples/624.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/624.jpg -------------------------------------------------------------------------------- /someExamples/626.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99eren99/DIS25k/HEAD/someExamples/626.jpg -------------------------------------------------------------------------------- /inferenceCode/inference.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import cv2 3 | from PIL import Image 4 | import pandas as pd 5 | import os 6 | from loadModel import model as model 7 | import torch 8 | 9 | 10 | model = model.to("cuda") 11 | 12 | 13 | metaData=pd.read_csv(r"C:\newDataset\metaDataTrain.csv") 14 | oldLabels=[] 15 | newLabels=[] 16 | for row in metaData.values: 17 | oldPath=os.path.join(r"C:\data\new_OPA\composite\train_set",row[5].split("/")[-1]) 18 | print(row[5].split("/")[-1], row[-1]) 19 | oldImg=Image.open(oldPath).resize((512,512)).convert("RGB") 20 | newPath=os.path.join(r"C:\newDataset\images",str(row[-1])+".jpg") 21 | newImg=Image.open(newPath).resize((512,512)).convert("RGB") 22 | with torch.no_grad(): 23 | _,labelOld,__=model(oldImg) 24 | tup1=(_,labelOld,__) 25 | print(labelOld,__) 26 | _,labelNew,__=model(newImg) 27 | tup2=(_,labelNew,__) 28 | print(labelNew,__) 29 | oldLabels.append(labelOld) 30 | newLabels.append(labelNew) 31 | 32 | oldLabels=np.array(oldLabels) 33 | newLabels=np.array(newLabels) 34 | print(sum(oldLabels==0)) 35 | print(sum(newLabels==0)) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | ## DIS25k 4 | 5 |
6 | 7 |
8 | 9 | Official repository of "Deep Image Composition Meets Image Forgery" 10 | 11 |
12 | 13 |
14 | 15 | [![arXiv](https://img.shields.io/badge/arXiv-2404.02897-b31b1b.svg)](https://arxiv.org/abs/2404.02897v2) 16 | 17 |
18 | 19 | 20 | * This is repository of the DIS25k image splicing dataset. It was generated by refining [OPA dataset](https://github.com/bcmi/Object-Placement-Assessment-Dataset-OPA) with deep image composition models. 21 | 22 | * To download dataset [![Kaggle](https://a11ybadges.com/badge?logo=kaggle)](https://www.kaggle.com/datasets/erentahir/dis25k) 23 | 24 | * :point_right: To download DIS100k [![Kaggle](https://a11ybadges.com/badge?logo=kaggle)](https://www.kaggle.com/datasets/erentahir/dis100k) 25 | 26 | * Comparison of some cherry picked OPA images and their equivalents in the DIS25k[(for more)](https://github.com/99eren99/DIS25k/tree/main/someExamples): 27 |

28 | ![img](https://raw.githubusercontent.com/99eren99/DIS25k/main/table.jpg) 29 | 30 | ## Citation 31 | ```` 32 | @misc{tahir2024deep, 33 | title={Deep Image Composition Meets Image Forgery}, 34 | author={Eren Tahir and Mert Bal}, 35 | year={2024}, 36 | eprint={2404.02897}, 37 | archivePrefix={arXiv}, 38 | primaryClass={cs.CV} 39 | } 40 | ```` 41 | -------------------------------------------------------------------------------- /inferenceCode/loadModel.py: -------------------------------------------------------------------------------- 1 | import sys,os 2 | path = os.path.join(os.path.dirname(os.path.realpath(__file__))) 3 | if path not in sys.path: 4 | sys.path.append(path) 5 | 6 | import argparse 7 | from PIL import Image 8 | import numpy as np 9 | import torch 10 | import torchvision.transforms.functional as TF 11 | import logging 12 | import torch.nn as nn 13 | from models.cmnext_conf import CMNeXtWithConf 14 | from models.modal_extract import ModalitiesExtractor 15 | from configs.cmnext_init_cfg import _C as config, update_config 16 | 17 | parser = argparse.ArgumentParser(description='Infer') 18 | parser.add_argument('-gpu', '--gpu', type=int, default=0, help='device, use -1 for cpu') 19 | parser.add_argument('-log', '--log', type=str, default='INFO', help='logging level') 20 | parser.add_argument('-exp', '--exp', type=str, default='./experiments/ec_example_phase2.yaml', help='Yaml experiment file') 21 | parser.add_argument('-ckpt', '--ckpt', type=str, default='./ckpt/early_fusion_detection.pth', help='Checkpoint') 22 | parser.add_argument('-path', '--path', type=str, default='example.png', help='Image path') 23 | parser.add_argument('opts', help="other options", default=None, nargs=argparse.REMAINDER) 24 | 25 | args = parser.parse_args() 26 | 27 | config = update_config(config, args.exp) 28 | 29 | loglvl = getattr(logging, args.log.upper()) 30 | logging.basicConfig(level=loglvl) 31 | 32 | gpu = args.gpu 33 | 34 | device = 'cuda:%d' % gpu if gpu >= 0 else 'cpu' 35 | np.set_printoptions(formatter={'float': '{: 7.3f}'.format}) 36 | 37 | if device != 'cpu': 38 | # cudnn setting 39 | import torch.backends.cudnn as cudnn 40 | 41 | cudnn.benchmark = False 42 | cudnn.deterministic = True 43 | cudnn.enabled = config.CUDNN.ENABLED 44 | 45 | modal_extractor = ModalitiesExtractor(config.MODEL.MODALS[1:], config.MODEL.NP_WEIGHTS) 46 | 47 | model = CMNeXtWithConf(config.MODEL) 48 | 49 | ckpt = torch.load(args.ckpt) 50 | 51 | model.load_state_dict(ckpt['state_dict']) 52 | modal_extractor.load_state_dict(ckpt['extractor_state_dict']) 53 | 54 | modal_extractor.to(device) 55 | model = model.to(device) 56 | modal_extractor.eval() 57 | model.eval() 58 | 59 | class MMF(nn.Module): 60 | def __init__(self,modal_extractor,model): 61 | super().__init__() 62 | self.model=model 63 | self.modal_extractor=modal_extractor 64 | self.modal_extractor.eval() 65 | self.model.eval() 66 | 67 | def forward(self, x, originalShape=(512,512)): 68 | img = np.array(x) 69 | img=torch.tensor(np.expand_dims(np.transpose(img,(2, 0, 1)), axis=0), dtype=torch.float) / 256.0 #0-1 scale 70 | x=img.to(device) 71 | 72 | modals = self.modal_extractor(x) 73 | 74 | images_norm = TF.normalize(x, mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) 75 | inp = [images_norm] + modals 76 | 77 | anomaly, confidence, detection = self.model(inp) 78 | 79 | map = torch.nn.functional.softmax(anomaly, dim=1)[:, 1, :, :].squeeze().cpu().numpy() 80 | 81 | det = detection#label 82 | probability = torch.sigmoid(det).item() 83 | label=0 84 | if probability>0.5: 85 | label=1 86 | 87 | #seg_map = Image.fromarray(map).resize(originalShape) 88 | 89 | return map,label,probability 90 | 91 | model=MMF(modal_extractor,model) --------------------------------------------------------------------------------