I had trouble getting this to work so I made some changes, maybe someone will find it useful.
drop the script into the folder with DommeName (Test on .gif) and click 2x on script will check the Test folder and subfolders
Code: Select all
# pip install --upgrade nudenet
# pip install Pillow
import os
import shutil
from nudenet import NudeDetector
from PIL import Image
min_face_size = 0
min_breast_size = 1
min_ass_size = 1
min_pussy_size = 0
min_feet_size = 1
min_closeup_size_face = 30
min_closeup_size_breasts = 30
min_closeup_size_pussy = 5
min_closeup_size_ass = 40
min_closeup_size_feet = 20
dressings = ["TagFullyDressed", "TagHalfDressed", "TagGarmentCovering", "TagHandsCovering", "TagSeeThrough", "TagNaked"]
def main():
folder = os.getcwd()
if not os.path.isdir(folder):
print("ERROR: Current directory not found")
exit(1)
tagsfile = os.path.join(folder, "ImageTags.txt")
if os.path.isfile(tagsfile):
backup_file = tagsfile + "-beforeNudeDetector"
if not os.path.isfile(backup_file):
shutil.copyfile(tagsfile, backup_file)
tagsdata = get_tags_data(tagsfile)
do_folder(folder, tagsdata)
def write_tags(tags_file, tagsdata):
with open(tags_file, "w") as tf:
for t in tagsdata:
tf.write(t + " " + " ".join(tagsdata[t]) + "\n")
def get_tags_data(tagsfile):
tagsdata = {}
tagsinfile = None
if os.path.isfile(tagsfile):
with open(tagsfile, "r") as f:
for line in f:
if len(line.split(" ")) < 2:
continue
filename = line.split(" ")[0].lower()
tags = line.split(" ")[1:]
tagsf = []
for t in tags:
if t.strip() != "":
tagsf.append(t.strip())
tagsdata.update({filename: tagsf})
return tagsdata
def do_folder(folder, parent_tagsdata):
subfolders = [f.path for f in os.scandir(folder) if f.is_dir()]
images = [f.name for f in os.scandir(folder) if f.is_file() and f.name.lower().endswith(('.png', '.jpg', '.jpeg', '.gif'))]
if images:
detector = NudeDetector()
imgcounter = 0
tagsfile = os.path.join(folder, "ImageTags.txt")
log_file = os.path.join(folder, "log.txt")
tagsdata = get_tags_data(tagsfile)
with open(log_file, "w") as log:
for img in images:
imgcounter += 1
imgfile = os.path.join(folder, img)
try:
image = Image.open(imgfile)
width, height = image.size
size = (width * height) / 100
detected = detector.detect(imgfile)
image.close()
except Exception as e:
if img != "ImageTags.txt" and img != "ImageTags.txt-beforeNudeDetector":
print(f"Error: cannot identify image file: {imgfile}. Error: {e}")
continue
covered = 0
exposed = 0
detected_tags = set()
breast_size = 0
face_size = 0
ass_size = 0
feet_size = 0
pussy_size = 0
for d in detected:
if d['class'] == 'FACE_FEMALE':
face_size += d['box'][2] * d['box'][3]
if (face_size / size) > min_face_size:
detected_tags.add("TagFace")
if d['class'] == 'FEMALE_BREAST_COVERED':
breast_size += d['box'][2] * d['box'][3]
if (breast_size / size) > min_breast_size:
detected_tags.add("TagBoobs")
covered += 1
if d['class'] == 'FEMALE_BREAST_EXPOSED':
breast_size += d['box'][2] * d['box'][3]
if (breast_size / size) > min_breast_size:
detected_tags.add("TagBoobs")
exposed += 1
if d['class'] == 'FEMALE_GENITALIA_COVERED':
pussy_size += d['box'][2] * d['box'][3]
if (pussy_size / size) > min_pussy_size:
detected_tags.add("TagPussy")
covered += 1
if d['class'] == 'FEMALE_GENITALIA_EXPOSED':
pussy_size += d['box'][2] * d['box'][3]
if (pussy_size / size) > min_pussy_size:
detected_tags.add("TagPussy")
exposed += 1
if d['class'] == 'BUTTOCKS_COVERED':
ass_size += d['box'][2] * d['box'][3]
if (ass_size / size) > min_ass_size:
detected_tags.add("TagAss")
covered += 1
if d['class'] == 'BUTTOCKS_EXPOSED':
ass_size += d['box'][2] * d['box'][3]
if (ass_size / size) > min_ass_size:
detected_tags.add("TagAss")
exposed += 1
if d['class'] == 'ANUS_EXPOSED':
detected_tags.add("TagAss")
exposed += 1
if d['class'] == 'FEET_EXPOSED':
feet_size += d['box'][2] * d['box'][3]
if (feet_size / size) > min_feet_size:
detected_tags.add("TagFeet")
exposed += 1
if (face_size / size) > min_closeup_size_face:
detected_tags.add("TagCloseUp")
if (breast_size / size) > min_closeup_size_breasts:
detected_tags.add("TagCloseUp")
if (ass_size / size) > min_closeup_size_ass:
detected_tags.add("TagCloseUp")
if (pussy_size / size) > min_closeup_size_pussy:
detected_tags.add("TagCloseUp")
if (feet_size / size) > min_closeup_size_feet:
detected_tags.add("TagCloseUp")
log.write(f"{img}\n")
log.write(f"{detected}\n")
log.write(f"covered: {covered}\n")
log.write(f"exposed: {exposed}\n")
log.write(f"breast_size: {round(breast_size / size, 1)}%\n")
log.write(f"face_size: {round(face_size / size, 1)}%\n")
log.write(f"ass_size: {round(ass_size / size, 1)}%\n")
log.write(f"feet_size: {round(feet_size / size, 1)}%\n")
log.write(f"pussy_size: {round(pussy_size / size, 1)}%\n")
if img in tagsdata:
if not any(elem in tagsdata[img] for elem in dressings):
if exposed > 0:
if covered > 0:
detected_tags.add("TagHalfDressed")
else:
detected_tags.add("TagNaked")
else:
if covered > 0:
detected_tags.add("TagFullyDressed")
olddata = set(tagsdata[img])
for tag in detected_tags:
olddata.add(tag)
if len(olddata) > 0:
tagsdata.update({img: list(olddata)})
else:
del tagsdata[img]
else:
if exposed > 0:
if covered > 0:
detected_tags.add("TagHalfDressed")
else:
detected_tags.add("TagNaked")
else:
if covered > 0:
detected_tags.add("TagFullyDressed")
if len(detected_tags) > 0:
tagsdata.update({img: detected_tags})
if img in tagsdata:
print("(" + str(imgcounter) + "/" + str(len(images)) + ") " + " ".join([img] + list(tagsdata[img])))
else:
print("(" + str(imgcounter) + "/" + str(len(images)) + ") " + img + " no tags found, removing tag line")
current_folder_tagsfile = os.path.join(folder, "ImageTags.txt")
write_tags(current_folder_tagsfile, tagsdata)
for subfolder in subfolders:
subfolder_tagsdata = dict(parent_tagsdata)
do_folder(subfolder, subfolder_tagsdata)
if __name__ == "__main__":
main()
Code: Select all
ImageTags.txt:
0004.jpg TagFullyDressed TagFace TagBoobs
0025.jpg TagFace
0046.jpg TagPussy TagFullyDressed TagFace TagBoobs
0137.jpg TagPussy TagBoobs TagFace TagNaked
0175.jpg TagPussy TagBoobs TagFace TagNaked
-------------------------------------------------------------------------------------------
log.txt:
0004.jpg
[{'class': 'FACE_FEMALE', 'score': 0.8451889753341675, 'box': [677, 465, 278, 261]}, {'class': 'FEMALE_BREAST_COVERED', 'score': 0.6339001655578613, 'box': [869, 979, 288, 305]}, {'class': 'FEMALE_BREAST_COVERED', 'score': 0.5970433354377747, 'box': [584, 1010, 276, 304]}]
covered: 2
exposed: 0
breast_size: 4.1%
face_size: 1.7%
ass_size: 0.0%
feet_size: 0.0%
pussy_size: 0.0%
0025.jpg
[{'class': 'FACE_FEMALE', 'score': 0.7126649618148804, 'box': [190, 890, 216, 185]}, {'class': 'FEET_COVERED', 'score': 0.698259711265564, 'box': [362, 2014, 221, 320]}, {'class': 'FEET_COVERED', 'score': 0.6864796876907349, 'box': [1349, 1958, 228, 340]}]
covered: 0
exposed: 0
breast_size: 0.0%
face_size: 1.0%
ass_size: 0.0%
feet_size: 0.0%
pussy_size: 0.0%
0046.jpg
[{'class': 'FACE_FEMALE', 'score': 0.8106878399848938, 'box': [676, 203, 187, 171]}, {'class': 'BELLY_EXPOSED', 'score': 0.7625148892402649, 'box': [666, 763, 289, 271]}, {'class': 'FEMALE_BREAST_COVERED', 'score': 0.7466608285903931, 'box': [636, 546, 201, 196]}, {'class': 'FEMALE_BREAST_COVERED', 'score': 0.740764856338501, 'box': [827, 542, 217, 196]}, {'class': 'FEET_COVERED', 'score': 0.6916413903236389, 'box': [850, 2024, 208, 371]}, {'class': 'FEMALE_GENITALIA_COVERED', 'score': 0.6599462032318115, 'box': [693, 1091, 166, 152]}, {'class': 'FEET_COVERED', 'score': 0.6093620657920837, 'box': [710, 2086, 178, 324]}]
covered: 2
exposed: 0
breast_size: 2.0%
face_size: 0.8%
ass_size: 0.0%
feet_size: 0.0%
pussy_size: 0.6%
0137.jpg
[{'class': 'FACE_FEMALE', 'score': 0.8321080207824707, 'box': [587, 515, 301, 286]}, {'class': 'BELLY_EXPOSED', 'score': 0.7961225509643555, 'box': [535, 1407, 405, 403]}, {'class': 'FEMALE_BREAST_EXPOSED', 'score': 0.7858959436416626, 'box': [802, 1024, 312, 287]}, {'class': 'FEMALE_BREAST_EXPOSED', 'score': 0.7823674082756042, 'box': [504, 1046, 283, 292]}, {'class': 'FEMALE_GENITALIA_EXPOSED', 'score': 0.6504278182983398, 'box': [528, 1977, 225, 216]}]
covered: 0
exposed: 3
breast_size: 4.1%
face_size: 2.1%
ass_size: 0.0%
feet_size: 0.0%
pussy_size: 1.2%
0175.jpg
[{'class': 'FACE_FEMALE', 'score': 0.804704487323761, 'box': [1236, 269, 207, 208]}, {'class': 'FEMALE_BREAST_EXPOSED', 'score': 0.7938959002494812, 'box': [1442, 715, 215, 191]}, {'class': 'FEMALE_BREAST_EXPOSED', 'score': 0.7776776552200317, 'box': [1204, 711, 221, 226]}, {'class': 'FEMALE_GENITALIA_EXPOSED', 'score': 0.7422179579734802, 'box': [1380, 1251, 156, 187]}, {'class': 'BELLY_EXPOSED', 'score': 0.7043899297714233, 'box': [1293, 946, 319, 240]}, {'class': 'ARMPITS_EXPOSED', 'score': 0.2738102078437805, 'box': [1585, 577, 107, 172]}]
covered: 0
exposed: 2
breast_size: 2.2%
face_size: 1.0%
ass_size: 0.0%
feet_size: 0.0%
pussy_size: 0.7%