예제 #1
0
class CensorNudity:
    def __init__(self,
                 blur_mask_fade=NUDITY_DETECTION_SETTINGS['blur_mask_fade'],
                 threshold=NUDITY_DETECTION_SETTINGS['threshold']):
        self._classifier = NudeClassifier()
        self._blur = ImageBlur(PixelBlur(30), blur_mask_fade)
        self._threshold = threshold
        self._graph = tf.get_default_graph()

    def __call__(self, image: Image) -> Image:
        # Create temporary file (nudenet needs image to be saved)
        path = Path(str(uuid.uuid4()) + '.jpg')
        Image.save(image, path)

        with self._graph.as_default():
            detected_nudity = self._classifier.classify([path])

        # Delete temporary file
        path.unlink()

        if detected_nudity[path]['unsafe'] > self._threshold:
            nudity_boxes = [BoundingBox(0, 0, *image.size)]
            blurred_image_np = self._blur.blur(image, nudity_boxes)
            return fromarray(blurred_image_np)
        else:
            return image
예제 #2
0
def detect(src_path, video):
    frame_size = (160, 90)
    interval_millis = 1000
    classifier = NudeClassifier(settings.NUDE_NET_CLASSIFIER_MODEL_PATH)

    video.status = Video.Status.DETECTING
    video.save()

    src_name = os.path.splitext(os.path.basename(src_path))[0]
    output_dir = os.path.join(os.path.dirname(src_path), src_name)
    os.makedirs(output_dir)
    extract_frames(src_path, output_dir, frame_size, interval_millis)

    detected = list()
    thresold = 3 * interval_millis
    print('start detecting %d files' % (len(os.listdir(output_dir))))
    for frame in sorted(os.listdir(output_dir), key=lambda f: frame_order(f)):
        order = frame_order(frame)
        if order < 0:
            continue
        framepath = os.path.join(output_dir, frame)
        if not os.path.exists(framepath) or os.path.isdir(framepath):
            continue
        result = classifier.classify(framepath)[framepath]
        nudity_prob = result['nude']
        if nudity_prob > 0.8:
            start_millis = order * interval_millis
            end_millis = (order + 1) * interval_millis
            if not detected:
                detected.append(
                    DetectedScene(src_video=video,
                                  start_millis=start_millis,
                                  end_millis=end_millis,
                                  cause=DetectedScene.DetectionCause.NUDITY))
            else:
                latest = detected[-1]
                if latest.end_millis + thresold <= start_millis:
                    detected.append(
                        DetectedScene(
                            src_video=video,
                            start_millis=start_millis,
                            end_millis=end_millis,
                            cause=DetectedScene.DetectionCause.NUDITY))
                else:
                    latest.end_millis = end_millis
    print('the number of detected scenes is %d' % len(detected))
    for scene in detected:
        scene.save()
    video.status = Video.Status.DETECTED
    video.save()
    try:
        shutil.rmtree(output_dir)
    except Exception as e:
        print('fail to remove directory', e)
    return detected
예제 #3
0
async def sex_message_check(redis, db):
    classifier = NudeClassifier()
    while True:
        lst = await redis.hgetall('avr', encoding='utf-8')
        if not lst == {}:
            for i in lst.keys():
                path = lst[i]
                status = classifier.classify(path)
                if status[path]['safe'] < status[path]['unsafe']:
                    await Message.delete_image(db=db, user=i, image=path)

        await asyncio.sleep(10)
예제 #4
0
def scan_image(image_url):
    if image_url is None:
        return None

    file_name = ''.join(
        random.choices(string.ascii_uppercase + string.digits, k=18))
    tmp_path = os.path.join(tempfile.gettempdir(), file_name)

    with urllib.request.urlopen(image_url) as url:
        output = open(tmp_path, "wb")
        output.write(url.read())
        output.close()

    classifier = NudeClassifier()
    img_scan_result = classifier.classify(tmp_path)
    os.remove(tmp_path)
    return img_scan_result[tmp_path]['unsafe']
예제 #5
0
def check_for_nudity(user_data: dict):
    photo_path_list = user_data["message_photo_paths"]
    print(
        "\nChecking for nudity in message photos. This might take a while depending on the number of photos."
    )
    classifier = NudeClassifier()
    classification = classifier.classify(photo_path_list, 4)
    unsafe_photo_paths = []
    for photo_path in photo_path_list:
        try:
            if classification[photo_path]["unsafe"] > 0.95:
                print("OYASHII: ", photo_path)
                unsafe_photo_paths.append(photo_path)
        except KeyError:
            print("A photo is mysteriously missing.")

    nbr_of_unsafe_photos = len(unsafe_photo_paths)
    output_html = unsafe_photo_carousel_html_generator(unsafe_photo_paths)
    user_data["unsafe_html"] = output_html
    user_data["nbr_of_unsafe_photos"] = nbr_of_unsafe_photos
    user_data["unsafe_photo_paths"] = unsafe_photo_paths
    return user_data
예제 #6
0
파일: __init__.py 프로젝트: XorgX304/rvt2
    def run(self, path):
        """ Classify an image using NudeNet."""
        # if there is not a classifier, create it. This takes a long time, so create only one classifier (global variable)
        global classifier
        if classifier is None:
            self.logger().debug('Creating classifier from model=%s',
                                self.myconfig('model'))
            modelfile = self.myconfig('model')
            classifier = NudeClassifier(modelfile)
        threshold = float(self.myconfig('threshold'))

        self.logger().debug('Classifying path=%s', path)

        # classify path
        if os.path.isabs(path):
            abspath = path
            relpath = relative_path(path, self.myconfig('casedir'))
        else:
            abspath = os.path.join(self.myconfig('casedir'), path)
            relpath = path
        result = dict(path=relpath,
                      aiclassify=dict(classifier='NudeNet'),
                      preview=relpath)
        try:
            # we must convert the results, since they are returned as numpy object
            classification = classifier.classify(abspath)[abspath]
            result['aiclassify']['results'] = dict(
                safe=float(classification['safe']),
                unsafe=float(classification['unsafe']))
            result['aiclassify']['is_nude'] = result['aiclassify']['results'][
                'unsafe'] > threshold
        except Exception as exc:
            self.logger().warning('Cannot process path=%s %s', path, exc)
            result['aiclassify']['results'] = dict(safe=None, unsafe=None)
            result['aiclassify']['is_nude'] = None
        yield result
예제 #7
0
class Nudity(commands.Cog):
    """Monitor images for NSFW content and moves them to a nsfw channel if possible"""

    def __init__(self, bot: Red):
        super().__init__()
        self.bot = bot
        self.config = Config.get_conf(self, identifier=9811198108111121, force_registration=True)

        default_guild = {"enabled": False, "channel_id": None}

        self.config.register_guild(**default_guild)

        # self.detector = NudeDetector()
        self.classifier = NudeClassifier()

        self.data_path: pathlib.Path = cog_data_path(self)

        self.current_processes = 0

    async def red_delete_data_for_user(self, **kwargs):
        """Nothing to delete"""
        return

    @commands.command(aliases=["togglenudity"], name="nudity")
    async def nudity(self, ctx: commands.Context):
        """Toggle nude-checking on or off"""
        is_on = await self.config.guild(ctx.guild).enabled()
        await self.config.guild(ctx.guild).enabled.set(not is_on)
        await ctx.send("Nude checking is now set to {}".format(not is_on))

    @commands.command()
    async def nsfwchannel(self, ctx: commands.Context, channel: discord.TextChannel = None):
        if channel is None:
            await self.config.guild(ctx.guild).channel_id.set(None)
            await ctx.send("NSFW Channel cleared")
        else:
            if not channel.is_nsfw():
                await ctx.send("This channel isn't NSFW!")
                return
            else:
                await self.config.guild(ctx.guild).channel_id.set(channel.id)
                await ctx.send("NSFW channel has been set to {}".format(channel.mention))

    async def get_nsfw_channel(self, guild: discord.Guild):
        channel_id = await self.config.guild(guild).channel_id()

        if channel_id is None:
            return None
        else:
            return guild.get_channel(channel_id=channel_id)

    async def nsfw(self, message: discord.Message, images: dict):
        content = message.content
        guild: discord.Guild = message.guild
        if not content:
            content = "*`None`*"
        try:
            await message.delete()
        except discord.Forbidden:
            await message.channel.send("NSFW Image detected!")
            return

        embed = discord.Embed(title="NSFW Image Detected")
        embed.add_field(name="Original Message", value=content)
        embed.set_author(name=message.author.name, icon_url=message.author.avatar_url)
        await message.channel.send(embed=embed)

        nsfw_channel = await self.get_nsfw_channel(guild)

        if nsfw_channel is None:
            return
        else:
            for image, r in images.items():
                if r["unsafe"] > 0.7:
                    await nsfw_channel.send(
                        "NSFW Image from {}".format(message.channel.mention),
                        file=discord.File(
                            image,
                        ),
                    )

    @commands.Cog.listener()
    async def on_message(self, message: discord.Message):
        is_private = isinstance(message.channel, discord.abc.PrivateChannel)

        if not message.attachments or is_private or message.author.bot:
            # print("did not qualify")
            return

        if await self.bot.cog_disabled_in_guild(self, message.guild):
            return

        try:
            is_on = await self.config.guild(message.guild).enabled()
        except AttributeError:
            return

        if not is_on:
            print("Not on")
            return

        channel: discord.TextChannel = message.channel

        if channel.is_nsfw():
            print("nsfw channel is okay")
            return

        check_list = []
        for attachment in message.attachments:
            # async with aiohttp.ClientSession() as session:
            #     img = await fetch_img(session, attachment.url)

            ext = attachment.filename

            temp_name = self.data_path / f"nudecheck{self.current_processes}_{ext}"

            self.current_processes += 1

            print("Pre attachment save")
            await attachment.save(temp_name)
            check_list.append(temp_name)

        print("Pre nude check")
        # nude_results = self.detector.detect(temp_name)
        nude_results = self.classifier.classify([str(n) for n in check_list])
        # print(nude_results)

        if True in [r["unsafe"] > 0.7 for r in nude_results.values()]:
            # print("Is nude")
            await message.add_reaction("❌")
            await self.nsfw(message, nude_results)
        else:
            # print("Is not nude")
            await message.add_reaction("✅")
예제 #8
0
import os
import tensorflow as tf

tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)

from nudenet import NudeClassifier

classifier = NudeClassifier()

result = classifier.classify('/nsfw/one.jpg')
result2 = classifier.classify('/nsfw/two.xjpg')

print('')
print('')
print('TEST RESULTS:')
print('********************************************')
print('')

print('one.jpg')
print(result)
print('')
print('two.xjpg')
print(result2)

print('')
print('********************************************')
print('')
예제 #9
0
class sorter():
    def __init__(self, mode, specific_formats=None, specific_folder=None):

        self.mode = mode
        self.lst_of = {}
        self.doc_ext = []
        self.img_ext = []
        self.vid_ext = []
        self.sound_ext = []
        self.zip_ext = []
        self.code_ext = []
        self.media_ext = []
        self.data_ext = []
        self.app_ext = []
        self.font_ext = []
        self.sys_ext = []
        self.flags = []
        self.specifics = []
        self.all_files = {}
        self.errors = []
        self.file_structure = {}
        self.load_ext()
        self.now = datetime.now()
        self.dt_string = self.now.strftime("%d-%m-%Y %Hh%M")
        self.nude_classifier = NudeClassifier()
        self.nude_detector = NudeDetector()
        self.s = sched.scheduler(time.time, time.sleep)

        self.number_of_files = 0
        self.time_taken = 0
        self.prev_dir = None
        self.curr_dir = None
        self.faces = None
        self.points = None

        self.walked_dir = "checked.dir"
        self.all_walked = []
        self.load_walked()

        self.available_dirs = []
        self.non_available_dirs = []
        self.attach = ":/"
        self.let_dir = [
            "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
            "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
        ]

        self.runt = threading.Thread(target=self.find_all_dirs)
        self.runt.start()

        self.master_ext = [
            self.doc_ext, self.img_ext, self.vid_ext, self.sound_ext,
            self.zip_ext, self.code_ext, self.media_ext, self.data_ext,
            self.app_ext, self.font_ext, self.sys_ext, self.flags
        ]

        self.type_s = [
            "Documents", "Images", "Videos", "Sounds", "Compressed_Files",
            "Programming_Files", "Discs_Media", "Databases", "Applications",
            "Fonts", "System_Files", "Infected"
        ]

        self.face_detection = fc.Detection()
        self.face_recognition = fc.Recognition()
        self.face_verification = fc.Verification()

        if specific_formats is not None and specific_folder is not None:
            self.specifics = self.specifics + specific_formats
            self.master_ext.append(self.specifics)

            self.type_s.append(specific_folder)

    def get_mode(self):
        return self.__mode

    def get_lst_of(self):
        return self.__lst_of

    def get_doc_ext(self):
        return self.__doc_ext

    def get_img_ext(self):
        return self.__img_ext

    def get_vid_ext(self):
        return self.__vid_ext

    def get_sound_ext(self):
        return self.__sound_ext

    def get_zip_ext(self):
        return self.__zip_ext

    def get_code_ext(self):
        return self.__code_ext

    def get_media_ext(self):
        return self.__media_ext

    def get_data_ext(self):
        return self.__data_ext

    def get_app_ext(self):
        return self.__app_ext

    def get_font_ext(self):
        return self.__font_ext

    def get_sys_ext(self):
        return self.__sys_ext

    def get_flags(self):
        return self.__flags

    def get_specifics(self):
        return self.__specifics

    def get_all_files(self):
        return self.__all_files

    def get_errors(self):
        return self.__errors

    def get_file_structure(self):
        return self.__file_structure

    def get_now(self):
        return self.__now

    def get_dt_string(self):
        return self.__dt_string

    def get_nude_classifier(self):
        return self.__nude_classifier

    def get_number_of_files(self):
        return self.__number_of_files

    def get_time_taken(self):
        return self.__time_taken

    def get_prev_dir(self):
        return self.__prev_dir

    def get_curr_dir(self):
        return self.__curr_dir

    def get_master_ext(self):
        return self.__master_ext

    def get_type_s(self):
        return self.__type_s

    def set_mode(self, value):
        self.__mode = value

    def set_lst_of(self, value):
        self.__lst_of = value

    def set_doc_ext(self, value):
        self.__doc_ext = value

    def set_img_ext(self, value):
        self.__img_ext = value

    def set_vid_ext(self, value):
        self.__vid_ext = value

    def set_sound_ext(self, value):
        self.__sound_ext = value

    def set_zip_ext(self, value):
        self.__zip_ext = value

    def set_code_ext(self, value):
        self.__code_ext = value

    def set_media_ext(self, value):
        self.__media_ext = value

    def set_data_ext(self, value):
        self.__data_ext = value

    def set_app_ext(self, value):
        self.__app_ext = value

    def set_font_ext(self, value):
        self.__font_ext = value

    def set_sys_ext(self, value):
        self.__sys_ext = value

    def set_flags(self, value):
        self.__flags = value

    def set_specifics(self, value):
        self.__specifics = value

    def set_all_files(self, value):
        self.__all_files = value

    def set_errors(self, value):
        self.__errors = value

    def set_file_structure(self, value):
        self.__file_structure = value

    def set_now(self, value):
        self.__now = value

    def set_dt_string(self, value):
        self.__dt_string = value

    def set_nude_classifier(self, value):
        self.__nude_classifier = value

    def set_number_of_files(self, value):
        self.__number_of_files = value

    def set_time_taken(self, value):
        self.__time_taken = value

    def set_prev_dir(self, value):
        self.__prev_dir = value

    def set_curr_dir(self, value):
        self.__curr_dir = value

    def set_master_ext(self, value):
        self.__master_ext = value

    def set_type_s(self, value):
        self.__type_s = value

    def del_mode(self):
        del self.__mode

    def del_lst_of(self):
        del self.__lst_of

    def del_doc_ext(self):
        del self.__doc_ext

    def del_img_ext(self):
        del self.__img_ext

    def del_vid_ext(self):
        del self.__vid_ext

    def del_sound_ext(self):
        del self.__sound_ext

    def del_zip_ext(self):
        del self.__zip_ext

    def del_code_ext(self):
        del self.__code_ext

    def del_media_ext(self):
        del self.__media_ext

    def del_data_ext(self):
        del self.__data_ext

    def del_app_ext(self):
        del self.__app_ext

    def del_font_ext(self):
        del self.__font_ext

    def del_sys_ext(self):
        del self.__sys_ext

    def del_flags(self):
        del self.__flags

    def del_specifics(self):
        del self.__specifics

    def del_all_files(self):
        del self.__all_files

    def del_errors(self):
        del self.__errors

    def del_file_structure(self):
        del self.__file_structure

    def del_now(self):
        del self.__now

    def del_dt_string(self):
        del self.__dt_string

    def del_nude_classifier(self):
        del self.__nude_classifier

    def del_number_of_files(self):
        del self.__number_of_files

    def del_time_taken(self):
        del self.__time_taken

    def del_prev_dir(self):
        del self.__prev_dir

    def del_curr_dir(self):
        del self.__curr_dir

    def del_master_ext(self):
        del self.__master_ext

    def del_type_s(self):
        del self.__type_s

    def run_t(self):
        self.s.enter(60, 1, self.find_all_dirs, (self.s, ))
        self.s.run()

    def find_all_dirs(self):

        for i in range(len(self.let_dir)):
            dr = self.let_dir[i] + self.attach
            if os.path.isdir(dr):
                self.available_dirs.append(dr)
            else:
                self.non_available_dirs.append(dr)

        #self.s.enter(60, 1, self.find_all_dirs, (self.s,))

    def load_ext(self):
        extensions_path = "C:/Users/GabhaDi/eclipse-workspace2/project sortMyFiles/src/extensions/"
        name = [
            "application", "code", "data", "document", "flags", "font",
            "image", "media", "sound", "system", "video", "zip"
        ]
        #full_path = os.path.abspath(extensions_path)

        i = 0

        print("The full to your extensions is ", extensions_path)

        if os.path.isdir(extensions_path) is True:
            print("loading all extensions...")
            list_files = os.listdir(extensions_path)

            for file in list_files:

                if "document" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.doc_ext.append(line.rstrip("\n"))

                    print("Successfully loaded document exts, size : ",
                          len(self.doc_ext), self.doc_ext)

                if "image" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.img_ext.append(line.rstrip("\n"))

                    print("Successfully loaded image exts, size : ",
                          len(self.img_ext), self.img_ext)

                if "video" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.vid_ext.append(line.rstrip("\n"))

                    print("Successfully loaded video exts, size : ",
                          len(self.vid_ext), self.vid_ext)

                if "application" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.app_ext.append(line.rstrip("\n"))

                    print("Successfully loaded app exts, size : ",
                          len(self.app_ext), self.app_ext)

                if "code" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.code_ext.append(line.rstrip("\n"))

                    print("Successfully loaded source code exts, size : ",
                          len(self.code_ext), self.code_ext)

                if "data" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.data_ext.append(line.rstrip("\n"))

                    print("Successfully loaded database exts, size : ",
                          len(self.data_ext), self.data_ext)

                if "flags" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.flags.append(line.rstrip("\n"))

                    print(
                        "Successfully loaded dangerous and malicious exts, size : ",
                        len(self.flags), self.flags)

                if "font" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.font_ext.append(line.rstrip("\n"))

                    print("Successfully loaded font exts, size : ",
                          len(self.font_ext), self.font_ext)

                if "media" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.media_ext.append(line.rstrip("\n"))

                    print("Successfully loaded media exts, size : ",
                          len(self.media_ext), self.media_ext)

                if "sound" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.sound_ext.append(line.rstrip("\n"))

                    print("Successfully loaded sound and audio exts, size : ",
                          len(self.sound_ext), self.sound_ext)

                if "system" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.sys_ext.append(line.rstrip("\n"))

                    print("Successfully loaded system exts, size : ",
                          len(self.sys_ext), self.sys_ext)

                if "zip" in file:

                    with open(extensions_path + file) as f:
                        for line in f:
                            self.zip_ext.append(line.rstrip("\n"))

                    print(
                        "Successfully loaded archive and compressions exts, size : ",
                        len(self.zip_ext), self.zip_ext)

            print("Successfully loaded all extensions...")

    def load_walked(self):

        if os.path.isfile(self.walked_dir):

            with open(self.walked_dir) as f:
                for line in f:
                    self.all_walked.append(line.rstrip("\n"))
        else:
            print("File doesnt't exist.")

    def load_session(self, dir):

        if len(self.all_files) != 0:
            self.all_files.clear()
        all_files = []
        pc = []
        if os.path.isdir(dir) == True:
            dir_list = os.listdir(dir)
            session = "session.sess"
            session_cp = "session_cp.sess"
            if (session in dir_list) is True and (session_cp
                                                  in dir_list) is True:
                with open(session) as f:
                    for line in f:
                        all_files.append(
                            [int(n) for n in line.strip().split(',')])
                    for pair in all_files:
                        try:
                            self.all_files[pair[0]] = pair[1]
                        except IndexError:
                            print(
                                "A line in the file doesn't have enough entries"
                            )

                    with open(session_cp) as fn:
                        for line in fn:
                            pc.append(
                                [int(n) for n in line.strip().split(',')])

                        for pair in pc:
                            try:
                                self.prev_dir = pair[0]
                                self.curr_dir = pair[1]
                            except IndexError:
                                print(
                                    "A line in the file doesn't have enough entries"
                                )
                    print(
                        f"Successfully loaded sessions for from files {session} and {session_cp} from directory {dir}"
                    )
                    return 1
            else:
                print(
                    f"Something went wrong...i couldnt find the files {session} and {session_cp} in dir"
                )
                return -1
        else:
            print(
                f"Something went wrong...invalid directory provided ERROR : {dir} doesn't exist"
            )
            return -1

    def add_dir(self, new_dir):

        if (os.path.exists(self.walked_dir) == False):
            f = open(self.walked_dir, "w+")
        else:
            f = open(self.walked_dir, "a+")

        _checked = open(self.walked_dir, 'r').readlines()
        _checked = [i.strip() for i in _checked]

        if (new_dir in _checked) is True:
            print("Skipping ", new_dir, " it has been added.")

        elif new_dir not in _checked:

            f.write(new_dir + "\n")
        else:
            f.write(new_dir + "\n")

        f.close()

    def files(self, directory):
        total_files = 0
        total_directories = 0
        if os.path.isdir(directory) == True:
            dir_list = os.listdir(directory)
            print("Listing dir")
            print(dir_list)
            print("Total size : ", len(dir_list))

            for file in dir_list:
                print(file)
                if os.path.isfile(os.path.abspath(file) == True):
                    i = 0

                    for extensions in self.master_ext:

                        for ext in extensions:

                            if ext in file:

                                self.lst_of[file] = self.type_s[i]

                if os.path.isdir(os.path.abspath(file)) == True:
                    #new_dir_list = os.listdir(file)
                    print()
                    print()
                    print(os.path.dirname(file))
                    self.files(os.path.abspath(file))

                    i += 1

    def copy_(self, new_directory):
        if not os.path.exists(new_directory):
            os.mkdir(new_directory)

            for key, value in self.lst_of.items():
                #new_directory = new_directory + value + "/"
                try:
                    print(key, new_directory + "/" + value + "/")
                    if not os.path.exists(new_directory + "/" + value + "/"):
                        os.mkdir(new_directory + "/" + value + "/")
                        copy(key, new_directory + "/" + value + "/")
                    else:
                        copy(key, new_directory + "/" + value + "/")
                except Exception as e:
                    print(e)
                    continue

        else:

            for key, value in self.lst_of.items():
                try:
                    #new_directory = new_directory + value + "/"
                    print(key, new_directory + "/" + value + "/")
                    if not os.path.exists(new_directory + "/" + value + "/"):
                        os.mkdir(new_directory + "/" + value + "/")
                        copy(key, new_directory + "/" + value + "/")
                    else:
                        copy(key, new_directory + "/" + value + "/")
                except Exception as e:
                    print(e)
                    continue

    def move_(self, new_directory):
        if not os.path.exists(new_directory):
            os.mkdir(new_directory)

            for key, value in self.lst_of.items():
                #new_directory = new_directory + value + "/"
                try:
                    print(key, new_directory + "/" + value + "/")
                    if not os.path.exists(new_directory + "/" + value + "/"):
                        os.mkdir(new_directory + "/" + value + "/")
                        move(key, new_directory + "/" + value + "/")
                    else:
                        move(key, new_directory + "/" + value + "/")
                except Exception as e:
                    print(e)
                    continue

        else:

            for key, value in self.lst_of.items():
                try:
                    #new_directory = new_directory + value + "/"
                    print(key, new_directory + "/" + value + "/")
                    if not os.path.exists(new_directory + "/" + value + "/"):
                        os.mkdir(new_directory + "/" + value + "/")
                        move(key, new_directory + "/" + value + "/")
                    else:
                        move(key, new_directory + "/" + value + "/")
                except Exception as e:
                    print(e)
                    continue

    def rollback(self, files, prev_dir, curr_dir):

        if len(files) < 0:
            print(
                "Please provide the files that you want to undo the process.")
            return

        if type(files) is not dict:
            print("files should be list, but ", type(files),
                  " was provided instead.")
            return

        if not os.path.isdir(prev_dir):
            print(
                "The provided previous directory is not a directory or doesn't exist, please check ",
                prev_dir)
            return

        if not os.path.isdir(curr_dir):
            print(
                "The provide current directory is not a directory or doesn't exist, please check ",
                curr_dir)
            return

        print("Rollback Operation started : from - ", curr_dir, " to  - ",
              prev_dir)

        dir_walk = os.walk(curr_dir)
        new_files = {}

        for (root, dirs, files_) in dir_walk:

            for f in files_:
                for file, full_path in files.items():

                    if f == file:

                        new_files[os.path.join(root, f)] = full_path

        print(new_files)
        for each_file, fullpath in new_files.items():
            try:
                print("FROM -- [", each_file, "] TO -- [", fullpath,
                      "] success")
                move(each_file, fullpath)

            except Exception as e:
                print(e)
                continue

    def display(self, dic):

        for key, value in dic.items():
            try:
                print(key, value)
            except Exception as e:
                print(e)
                continue

    #Todo rollback code here
    #Main function is to reverse any sorting done by the program
    # 1. Get all the files and their paths
    # 2. Move them from their curr directory to their previous directories
    # 3. Verify and check if the operation was successful
    # 4. Save the progress for later use

    def check_for_faces(self, directory):

        (self.im_width, self.im_height) = (160, 160)
        face_pic = 0
        file_sess = "face.check"
        print("Checking for faces...", directory)

        directory = directory + "/images"

        face_ = directory + "/" + "faces"

        file_s = directory + "/" + file_sess

        if os.path.exists(file_s) is False:
            f = open(file_s, 'w+')
        else:
            f = open(file_s, 'a+')

        previous_session = open(file_s, 'r').readlines()
        previous_session = [i.strip() for i in previous_session]
        print(file_s, len(previous_session), previous_session)

        if os.path.isdir(face_) is False:
            os.mkdir(face_)

        if os.path.isdir(directory) is True:
            images = os.listdir(directory)

            for each_pic in images:
                self.pin = (sorted([
                    int(n[:n.find(".")])
                    for n in os.listdir(face_) if n[0] != "."
                ] + [0])[-1] + 1)
                if (each_pic in previous_session) is True:
                    print("Skipping file", each_pic, "already scanned")
                    continue

                elif each_pic not in previous_session:
                    f.write(each_pic + "\n")

                    try:
                        image = cv2.imread(
                            os.path.abspath(directory + "/" + each_pic), 1)

                        normal = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
                        normal = cv2.cvtColor(normal, cv2.COLOR_RGB2BGR)

                        if self.face_recognition.detection(image) is None:
                            faces = None

                        if self.face_recognition.detection(image) is not None:
                            faces, points = self.face_recognition.detection(
                                image)

                        if faces is not None:
                            for face in faces:
                                face_bb = face.bounding_box.astype(int)

                                yourface = normal[
                                    max(0, face_bb[1]
                                        ):min(face_bb[3], normal.shape[0] - 1),
                                    max(0, face_bb[0]
                                        ):min(face_bb[2], normal.shape[1] -
                                              1), ]

                                for i in range(points.shape[1]):
                                    pts = points[:, i].astype(np.int32)
                                    for j in range(pts.size // 2):
                                        pt = (pts[j], pts[5 + j])
                                        cv2.circle(
                                            image,
                                            center=pt,
                                            radius=1,
                                            color=(255, 0, 0),
                                            thickness=2,
                                        )

                                face_resize = cv2.resize(
                                    yourface, (self.im_width, self.im_height))

                                cv2.rectangle(
                                    image,
                                    (face_bb[0], face_bb[1]),
                                    (face_bb[2], face_bb[3]),
                                    (22, 20, 60),
                                    1,
                                )

                                cv2.imwrite("%s/%s.png" % (face_, self.pin),
                                            face_resize)

                                print(
                                    f"Face detected in image {each_pic} now creating face in {face_+'/'+str(self.pin)}.png"
                                )

                                face_pic += 1

                                cv2.destroyAllWindows()
                    except:
                        continue
                else:
                    f.write(each_pic + "\n")

        print(f"Process done. Created {face_pic} face files to {face_+'/'}")

    def check_for_porn(self, directory):

        profane_pic = 0
        file_sess = "profanity.check"
        print("Checking for nudity and pornographic material...", directory)
        directory = directory + "/images"

        profanity = directory + "/" + "Profanity"

        file_s = directory + "/" + file_sess

        if os.path.exists(file_s) is False:

            f = open(file_s, 'w+')
        else:
            f = open(file_s, 'a+')
        previous_session = open(file_s, 'r').readlines()
        previous_session = [i.strip() for i in previous_session]
        print(file_s, len(previous_session), previous_session)

        if os.path.isdir(profanity) is False:
            os.mkdir(profanity)

        if os.path.isdir(directory) is True:

            images = os.listdir(directory)

            for each_pic in images:

                if (each_pic in previous_session) is True:
                    print("Skipping file", each_pic, "already scanned")
                    continue

                elif each_pic not in previous_session:
                    f.write(each_pic + "\n")
                    preds = self.nude_classifier.classify(
                        os.path.abspath(directory + "/" + each_pic))

                    #print(preds, type(preds))
                    for (path, dicti) in preds.items():

                        for lvl, score in dicti.items():
                            if lvl is 'unsafe' and score >= 0.9:
                                print(
                                    f"Profanity detected ",
                                    f"Image ({each_pic}) MOVING to {profanity}..."
                                )
                                move(path, os.path.abspath(profanity))
                                profane_pic += 1

                            elif lvl is 'unsafe' and score >= .6 and score < 0.9:

                                print(
                                    f"Indecency detected ",
                                    f"Am not sure about Image ({each_pic}) should i move it to {profanity}..."
                                )

                                image = cv2.imread(path, 1)
                                width = 320
                                height = 320

                                dim = (width, height)
                                try:
                                    resized_img = cv2.resize(
                                        image, dim, cv2.INTER_AREA)
                                    cv2.imshow("SUGGESTION", resized_img)
                                except:
                                    print(e)
                                    continue
                                print(
                                    f" Move {path} Press(y) to move or n to continue?"
                                )
                                k = cv2.waitKey(0)

                                if (k == ord('y')):
                                    move(path, os.path.abspath(profanity))
                                    profane_pic += 1
                                    cv2.destroyAllWindows()
                                    print(
                                        f"Suggestion moved {path} to {profanity}"
                                    )
                                else:
                                    cv2.destroyAllWindows()
                                    continue

                    #print(preds)

                    #f.append(each_pic+"\n")
                else:

                    f.write(each_pic + "\n")
        print(
            f"Process done. Moved {profane_pic} profane files to {profanity}")

    def save_session(self, fls, prev, curr):

        #if(type(self.files) is not dict):

        #    print(f"Must be dictionary not {type(files)}")
        #    return

        if (len(fls) == 0):

            print("print data not provided its empty")
            return

        if (os.path.isdir(prev) == False):

            print("Please provide a valid directory ERROR : ", prev)

        if (os.path.isdir(curr) == False):

            print("Please provide a valid directory ERROR : ", curr)

        filename = "session.sess"
        full_filename = str(os.path.abspath(os.path.join(curr, filename)))
        #full_dr = new_directory + "/" + filename
        print(full_filename, self.dt_string, "string : ", fls)
        fn = "session_cp.sess"
        full_fn = str(os.path.abspath(os.path.join(curr, fn)))

        if os.path.exists(full_filename) is False:
            f = open(full_filename, 'w+', encoding="utf-8")
            fp = open(full_fn, 'w+', encoding="utf-8")
            fp.write(prev + "," + curr + "\n")
        else:
            f = open(full_filename, 'a+', encoding="utf-8")
            fp = open(full_fn, 'w+', encoding="utf-8")
            fp.write(prev + "," + curr + "\n")

        _checked_ = open(full_filename, 'r').readlines()
        _checked_ = [i.strip() for i in _checked_]

        for file, dr in self.all_files.items():
            x = file + "," + dr
            if (x in _checked_):
                print("Skipping ", x, "it has been added")
                continue
            elif x not in _checked_:

                f.write(x + "\n")
            else:
                f.write(x + "\n")

        f.close()
        fp.close()

        print("Successfully Saved session at ", self.dt_string)

    def sort_dir(self, directory):

        self.prev_dir = directory

        #given a dir, check if its a dir or not
        print("Starting sorting operation...", directory)
        if os.path.isdir(directory) == True:
            #print("Listing dir")
            dir_list = os.walk(directory)
            #print(dir_list)
            #print("Total size : ", len(dir_list))

            for (root, dirs, files) in dir_list:

                self.number_of_files = len(files)

                #print(files)

                i = 0

                print("files LEN ", self.number_of_files, " DIRS LEN ",
                      len(dirs), "root ", root, "dirs ", dirs, "files ", files)

                for direct in dirs:
                    full_dir = os.path.join(root, direct)

                    if os.path.isdir(full_dir) is True:
                        full_dir_files = os.listdir(full_dir)

                        self.file_structure[full_dir] = full_dir_files

                for extensions in self.master_ext:

                    for ext in extensions:

                        for file in files:

                            try:
                                EXT_ = file.split(".")[1]
                                EXT_ = "." + EXT_
                                if EXT_ == ext:
                                    #print("ROOT ", root, "DIRECTORIES : ", dirs, "FILES ", files)
                                    self.lst_of[os.path.join(
                                        root, file)] = self.type_s[i]
                                    print("TYPE : ", self.type_s[i],
                                          "FILE EXT FOUND : ", ext,
                                          "FILE NAME : ",
                                          os.path.join(root, file), "ITER : ",
                                          i, EXT_)

                                    #self.all_files.append(file)
                                    self.all_files[file] = os.path.join(
                                        root, file)
                            except:
                                print("ERROR WITH FILE : ", file)
                                continue

                    i += 1

            new_directory = input("Please enter name of new directory...")

            print("Available dirs please choose which dir to ", self.mode,
                  " to?")
            self.runt.join()
            for i in range(len(self.available_dirs)):
                print(i, self.available_dirs[i])

            choice = input("Please choose directory?")

            while True:

                if int(choice) < 0 or int(choice) > len(self.available_dirs):
                    print("Invalid choice!!!, Please choose again.")
                    choice = input("Please choose directory?")
                    continue
                else:
                    break

            new_directory = self.available_dirs[int(
                choice)] + new_directory + "_" + os.path.basename(directory)

            self.curr_dir = new_directory
            print(new_directory)
            print(self.lst_of)
            self.display(self.lst_of)
            if self.mode == 'move':
                self.move_(new_directory)
            else:
                self.copy_(new_directory)

            self.save_session(self.all_files, self.prev_dir, self.curr_dir)

            self.add_dir(new_directory)
            print("All files : ", self.all_files, " Previous Directory : ",
                  self.prev_dir, " Current Directory : ", self.curr_dir)

            choice = input(
                f"Operation {self.mode} is done, Are you sure you want to continue or Rollback the process Y - Yes(Rollback) / N - No(Continue)?"
            )
            choice = choice.lower()
            if "y" in choice or choice is "y" or choice is "yes" or "yes" in choice:
                #prev_dir = input("Please enter the previous directory where the files where located before operation")
                #curr_dir = input("Please enter the current directory where the files where are located now")
                self.rollback(self.all_files, self.prev_dir, self.curr_dir)

                print(
                    "Rollback operation successfully files where placed back to their original places."
                )

            threading.Thread(target=self.check_for_porn(new_directory)).start()

        else:

            print("Directory doesn't exist : ", directory,
                  "Please enter a valid directory!")

            path = input(
                "Please enter the directory or folder or file path you want to sort?"
            )
            srt.sort_dir(rf"{path}")

    mode = property(get_mode, set_mode, del_mode, "mode's docstring")
    lst_of = property(get_lst_of, set_lst_of, del_lst_of, "lst_of's docstring")
    doc_ext = property(get_doc_ext, set_doc_ext, del_doc_ext,
                       "doc_ext's docstring")
    img_ext = property(get_img_ext, set_img_ext, del_img_ext,
                       "img_ext's docstring")
    vid_ext = property(get_vid_ext, set_vid_ext, del_vid_ext,
                       "vid_ext's docstring")
    sound_ext = property(get_sound_ext, set_sound_ext, del_sound_ext,
                         "sound_ext's docstring")
    zip_ext = property(get_zip_ext, set_zip_ext, del_zip_ext,
                       "zip_ext's docstring")
    code_ext = property(get_code_ext, set_code_ext, del_code_ext,
                        "code_ext's docstring")
    media_ext = property(get_media_ext, set_media_ext, del_media_ext,
                         "media_ext's docstring")
    data_ext = property(get_data_ext, set_data_ext, del_data_ext,
                        "data_ext's docstring")
    app_ext = property(get_app_ext, set_app_ext, del_app_ext,
                       "app_ext's docstring")
    font_ext = property(get_font_ext, set_font_ext, del_font_ext,
                        "font_ext's docstring")
    sys_ext = property(get_sys_ext, set_sys_ext, del_sys_ext,
                       "sys_ext's docstring")
    flags = property(get_flags, set_flags, del_flags, "flags's docstring")
    specifics = property(get_specifics, set_specifics, del_specifics,
                         "specifics's docstring")
    all_files = property(get_all_files, set_all_files, del_all_files,
                         "all_files's docstring")
    errors = property(get_errors, set_errors, del_errors, "errors's docstring")
    file_structure = property(get_file_structure, set_file_structure,
                              del_file_structure, "file_structure's docstring")
    now = property(get_now, set_now, del_now, "now's docstring")
    dt_string = property(get_dt_string, set_dt_string, del_dt_string,
                         "dt_string's docstring")
    nude_classifier = property(get_nude_classifier, set_nude_classifier,
                               del_nude_classifier,
                               "nude_classifier's docstring")
    number_of_files = property(get_number_of_files, set_number_of_files,
                               del_number_of_files,
                               "number_of_files's docstring")
    time_taken = property(get_time_taken, set_time_taken, del_time_taken,
                          "time_taken's docstring")
    prev_dir = property(get_prev_dir, set_prev_dir, del_prev_dir,
                        "prev_dir's docstring")
    curr_dir = property(get_curr_dir, set_curr_dir, del_curr_dir,
                        "curr_dir's docstring")
    master_ext = property(get_master_ext, set_master_ext, del_master_ext,
                          "master_ext's docstring")
    type_s = property(get_type_s, set_type_s, del_type_s, "type_s's docstring")
def main(SUBREDDIT_NAMES):
    tempjpg = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                           'temp.jpg')
    classifier = NudeClassifier()
    valid_extensions = ['.jpg', '.jpeg', '.bmp', '.png', '.tiff']
    SUBREDDIT_NAMES = SUBREDDIT_NAMES.replace(',', '+').replace(' ', '')
    while True:
        con = sqlite3.connect('log.db')
        cur = con.cursor()
        try:

            for submission in reddit.subreddit(
                    SUBREDDIT_NAMES).stream.submissions():

                gallery = []
                URL = submission.url
                #add .jpg to image link if its an imgur link
                if 'imgur.com' in URL:
                    URL += '.jpg'
                    gallery.append(URL)
                #get inidividual images from gallery
                elif 'reddit.com/gallery' in URL:
                    ids = [
                        i['media_id'] for i in submission.gallery_data['items']
                    ]
                    for i in ids:
                        try:
                            url = submission.media_metadata[i]['p'][0]['u']
                            url = url.split("?")[0].replace("preview", "i")
                            gallery.append(url)
                        except KeyError:
                            pass
                #normal image url
                else:
                    gallery.append(URL)

                for i in gallery:
                    isimage = False
                    if i.endswith(tuple(valid_extensions)):
                        isimage = True
                    if isimage == True:
                        try:
                            #save image as temp file
                            with urllib.request.urlopen(i) as url:
                                with open(tempjpg, 'wb') as f:
                                    f.write(url.read())
                                    f.close()
                        except Exception as err:
                            print(err)

                        prediction = classifier.classify(
                            tempjpg)[tempjpg]['unsafe']
                        #remove post if REMOVE_SUBMISSION is True
                        if prediction > NSFW_PROB_THRESHOLD:
                            #print("nsfw")
                            if LOGGING_ON:
                                cur.execute(
                                    "INSERT INTO logbook VALUES (?,?,?)",
                                    (submission.created_utc,
                                     str(submission.author),
                                     submission.permalink))
                                con.commit()
                            if not MOD_TEST:
                                submission.mod.nsfw()
                                if REMOVE_SUBMISSION:
                                    submission.mod.remove()
                                    submission.mod.send_removal_message(
                                        REMOVAL_MESSAGE)
                            #send mod mail to mod discussions for testing
                            else:
                                submission.subreddit.message(
                                    "NSFW image detected!",
                                    "post: " + submission.permalink + ' p = ' +
                                    str(prediction) +
                                    ', threshold is currently ' +
                                    str(NSFW_PROB_THRESHOLD))
                            break
                        else:
                            #print("notnsfw")
                            pass

        except Exception as err:
            con.close()
            print(err)

    con.close()
예제 #11
0
from nudenet import NudeClassifier
import os
files = os.listdir('Valid')
if not os.path.exists('Valid/Pron'):
    os.makedirs('Valid/Pron')
if not os.path.exists('Valid/Error'):
    os.makedirs('Valid/Error')
files.remove('Pron')
files.remove('Error')
classifier = NudeClassifier()
for i in files:
    try:
        data = classifier.classify('Valid/' + i)[i]['unsafe']
        if data > 0.7:
            print(i + ' is OK')
            os.rename('Valid/' + i, 'Valid/Pron/' + i)
        else:
            os.rename('Valid/' + i, 'Valid/Error/' + i)
    except:
        continue
예제 #12
0
from nudenet import NudeClassifier
import sys

classifier = NudeClassifier()

image_path = sys.argv[1]

result = classifier.classify(image_path)
print(0 if result[image_path]['safe'] > result[image_path]['unsafe'] else 1)
예제 #13
0
from pathlib import Path
from shutil import copyfile

mypath = '../img/'
safePath = mypath + 'safe/'
unsafePath = mypath + 'unsafe/'

onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
Path(safePath).mkdir(parents=True, exist_ok=True)
Path(unsafePath).mkdir(parents=True, exist_ok=True)

for f in listdir(mypath):
    if isfile(join(mypath, f)):
        filename = mypath + f
        try:
            resultData = classifier.classify(filename)
            print(resultData)
            if (resultData[filename]['safe'] < resultData[filename]['unsafe']):
                # print(resultData[mypath+f]['unsafe'])
                copyfile(filename, unsafePath + f)
            else:
                # print(resultData[mypath+f]['safe'])
                copyfile(filename, safePath + f)
        except:
            print('Error : ' + filename)

sec = time.time() - start
times = str(datetime.timedelta(seconds=sec)).split(".")
times = times[0]
print(times)
'''
예제 #14
0
from nudenet import NudeClassifier
import sys

classifier = NudeClassifier()
print(classifier.classify("images/%s" % sys.argv[1]))