Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
4dc14b9
[chore]: modify docker composee
Cryptoverso May 4, 2025
dcfd05d
[chore]: append 8080:80 port
Cryptoverso May 4, 2025
1b30977
[chore]: return 5000:- in port
Cryptoverso May 4, 2025
c6ac5f5
[append]: debug
Cryptoverso May 4, 2025
0996530
[append]: container_name
Cryptoverso May 4, 2025
fa3b217
[append]: router fastApi
Cryptoverso May 4, 2025
b4e4eb7
[append]: router
Cryptoverso May 4, 2025
4291ecf
[append]: debug test
Cryptoverso May 4, 2025
6cc9daf
[refactor]: -1
Cryptoverso May 4, 2025
ab4610b
[fix]: apps.pyserver.app.api.v1.NSTW
Cryptoverso May 4, 2025
750512e
[append]: alternative route
Cryptoverso May 4, 2025
4167a37
tent
Cryptoverso May 4, 2025
1f28e5a
[append]: tent3
Cryptoverso May 4, 2025
7126202
tent4
Cryptoverso May 4, 2025
62067ff
tent5
Cryptoverso May 4, 2025
a0e0b03
remove names repeat
Cryptoverso May 4, 2025
03fa469
[append]: alterned names
Cryptoverso May 4, 2025
8510e67
[append]: router in main
Cryptoverso May 4, 2025
6f6596f
tent6
Cryptoverso May 4, 2025
49e061d
[append]: oracle
Cryptoverso May 5, 2025
057d43c
test1
Cryptoverso May 5, 2025
82a3020
[chore]: nstw
Cryptoverso May 5, 2025
5085a71
[append]: cocoa in crud
Cryptoverso May 5, 2025
df6036e
[append]: nstw
Cryptoverso May 5, 2025
89839af
[fix]: crud.nstw
Cryptoverso May 5, 2025
7a53c7d
[append]: opennsfw2 in requirements
Cryptoverso May 5, 2025
3dc2c94
[append]: force bool preditcion
Cryptoverso May 5, 2025
d38d964
[append]: tensorflow&nsfw
Cryptoverso May 5, 2025
316a6d3
append version python3.8 requeriments
Cryptoverso May 5, 2025
55aad2b
[append]: nsfw 1.1.1
Cryptoverso May 5, 2025
d9a05d8
test
Cryptoverso May 5, 2025
afa2024
[append]: nsfw labels
Cryptoverso May 5, 2025
7f7fe38
append nstw model
Cryptoverso May 5, 2025
68df68a
[append]: init repositoory
Cryptoverso May 5, 2025
04c05a1
Add files via upload
Cryptoverso May 5, 2025
10b575f
rename
Cryptoverso May 5, 2025
dd71315
Delete apps/pyserver/nsfw_model/nsfw_mobilenet2.224x224.h5
Cryptoverso May 5, 2025
87c2a79
Add files via upload
Cryptoverso May 5, 2025
3253b6e
init debug
Cryptoverso May 5, 2025
c6442ec
[refactor]: move it
Cryptoverso May 5, 2025
bd11df6
[fix]: remove a with dockerfileg
Cryptoverso May 5, 2025
68af158
[append]: model
Cryptoverso May 5, 2025
b55bca1
[append]: router
Cryptoverso May 5, 2025
9d2be6a
[fix]: endpoint nsfw
Cryptoverso May 5, 2025
c117f4c
[append]: describe
Cryptoverso May 5, 2025
e924dc1
[append]: describe
Cryptoverso May 5, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ numpy = "*"
Pillow = "*"
requests = "*"
opencv-python = "*"
opennsfw2= "*"

[requires]
python_version = "3.8"
Empty file added apps/__init__.py
Empty file.
2 changes: 2 additions & 0 deletions apps/pyserver/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ EXPOSE 5000
FROM base as debug
RUN pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org ptvsd

ENV PYTHONPATH=/app

WORKDIR /app
CMD ["python", "-m", "ptvsd", "--host", "0.0.0.0", "--port", "5678", \
"--wait", "--multiprocess", "-m", \
Expand Down
Empty file added apps/pyserver/__init__.py
Empty file.
Empty file added apps/pyserver/app/__init__.py
Empty file.
Empty file.
Empty file added apps/pyserver/app/api/deps.py
Empty file.
68 changes: 68 additions & 0 deletions apps/pyserver/app/api/v1/nstw.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
from fastapi import APIRouter
from fastapi import APIRouter, UploadFile, File
from nsfw_detector import predict
from core.use_case.nstw.crud import CRUDNstw
from PIL import Image
import io

TENSORFLOW_URL = "http://tensorflow:8501/v1/models/rfcn:predict"
router = APIRouter()


@router.get("/hello")
def hello():
return {"hello": "world"}



@router.post("/nstw/")
async def detect_nstw(file: UploadFile = File(...)):
"""
NSTW Model: Detects Explicit or Implicit Pornography in an Image
It returns a value from 0.99 to 0.01. Being 0.99 being safe (99% safe)
and 0.01 being unsafe (1% safe)

Typically, the values indicate the following possible outcomes:

=> 0.99 would be an image without any kind of nudity captured
=<0.90 person without pants or shirt, or showing some part of the body, but not pornographic.
=< 0.80 person without pants or shirt, or showing some part of the body.
=< 0.20 person without pants and without shirt
=< 0.10 explicit pornographic content detected.

Acceptable values to proceed: 0.95 - 0.99
"""
try:
image_bytes = await file.read()
result = CRUDNstw.detect_nsfw(image_bytes)
return result
except Exception as e:
return {"error": str(e)}


model = predict.load_model("/app/nsfw_model/nsfw_mobilenet2.224x224.h5")


@router.post("/nsfw/")
async def detect_nsfw_labels(file: UploadFile = File(...)):
"""
NSFW Model: Detects Explicit or Implicit Pornography with a More Detailed Index
Faster model, but may be less sensitive to soft porn detection

Categories detected:
drawings: 0.0057229697704315186,
"hentai": 0.0005879989475943148,
"neutral": 0.3628992736339569,
"porn": 0.011622844263911247,
sexy: 0.619166910648346

"""
try:
image_bytes = await file.read()
image = Image.open(io.BytesIO(image_bytes)).convert("RGB")
tmp_path = "/tmp/tmp.jpg"
image.save(tmp_path)
result = predict.classify(model, tmp_path)
return result
except Exception as e:
return {"error": str(e)}
52 changes: 52 additions & 0 deletions apps/pyserver/app/api/v1/oracle.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
from fastapi import APIRouter
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import StreamingResponse
from starlette.responses import RedirectResponse
import io


from core.use_case.oracle.crud import CRUDOracle

TENSORFLOW_URL = "http://tensorflow:8501/v1/models/rfcn:predict"

router = APIRouter()


@router.get("/hello_oracle")
def hello_oracle():
return {"hello": "world"}


@router.post("/get_predictions/")
async def get_predictions(file: UploadFile = File(...)):
"""
Submit a picture to be analyzed by the R-FCN model and retrieve the objects
identified on the scene.
"""
image_file = await file.read()
r = CRUDOracle.get_predictions(image_file, TENSORFLOW_URL)

return r


@router.post("/get_predicted_image/")
async def get_predicted_image(file: UploadFile = File(...), detections_limit: int = 20):
"""
Submit a picture to be analyzed by the R-FCN model and get then download the picture
with all the objects identified in the scene highlighted.

- **detections_limit** [int]: Define the limit of objects to be ploted in the returning image.
"""
try:
image_file = await file.read()
processed_image = CRUDOracle.get_predicted_image(image_file, TENSORFLOW_URL, detections_limit)
filename = file.filename.split(".")[0]
extension = file.filename.split(".")[-1]
filename = "".join([filename, " (processed).", extension])

return StreamingResponse(io.BytesIO(processed_image),
headers={'Content-Disposition': 'attachment; filename=' + filename},
media_type="image/jpg")

except Exception as e:
return {"error": str(e)}
9 changes: 9 additions & 0 deletions apps/pyserver/app/api/v1/router.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from fastapi import APIRouter, FastAPI

from api.v1 import nstw, oracle

api_router = APIRouter()
app = FastAPI()

api_router.include_router(nstw.router, tags=["nstw"])
api_router.include_router(oracle.router, tags=["oracle"])
Empty file.
Empty file.
26 changes: 26 additions & 0 deletions apps/pyserver/app/core/use_case/nstw/crud.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from PIL import Image
import io
import opennsfw2 as n2


class CRUDNstw:
@staticmethod
def detect_nsfw(image_bytes: bytes):
# Carrega a imagem a partir dos bytes
image = Image.open(io.BytesIO(image_bytes)).convert("RGB")

# Preprocessa a imagem conforme o modelo
processed_image = n2.preprocess_image(image, n2.Preprocessing.YAHOO)

# Cria o modelo
model = n2.make_open_nsfw_model()

# Realiza a predição
prediction = model.predict(processed_image[None, ...])[0][0]

# Define o limiar para considerar como NSFW
threshold = 0.9
is_nsfw = bool(prediction >= threshold)
detail = f"Probabilidade NSFW: {prediction:.2f}"

return {"nsfw": is_nsfw, "detail": detail}
Empty file.
Empty file.
80 changes: 80 additions & 0 deletions apps/pyserver/app/core/use_case/oracle/coco-labels-2014_2017.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
person
bicycle
car
motorcycle
airplane
bus
train
truck
boat
traffic light
fire hydrant
stop sign
parking meter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
backpack
umbrella
handbag
tie
suitcase
frisbee
skis
snowboard
sports ball
kite
baseball bat
baseball glove
skateboard
surfboard
tennis racket
bottle
wine glass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hot dog
pizza
donut
cake
chair
couch
potted plant
bed
dining table
toilet
tv
laptop
mouse
remote
keyboard
cell phone
microwave
oven
toaster
sink
refrigerator
book
clock
vase
scissors
teddy bear
hair drier
toothbrush
91 changes: 91 additions & 0 deletions apps/pyserver/app/core/use_case/oracle/coco-labels-paper.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
person
bicycle
car
motorcycle
airplane
bus
train
truck
boat
traffic light
fire hydrant
street sign
stop sign
parking meter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
hat
backpack
umbrella
shoe
eye glasses
handbag
tie
suitcase
frisbee
skis
snowboard
sports ball
kite
baseball bat
baseball glove
skateboard
surfboard
tennis racket
bottle
plate
wine glass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hot dog
pizza
donut
cake
chair
couch
potted plant
bed
mirror
dining table
window
desk
toilet
door
tv
laptop
mouse
remote
keyboard
cell phone
microwave
oven
toaster
sink
refrigerator
blender
book
clock
vase
scissors
teddy bear
hair drier
toothbrush
hair brush
Loading