NSFWJS + TFJS WASM + Web Worker

2022. 10. 20. 14:42Develop/Javascript

728x90

개요

한국어로는 후방주의 ㅎㅂ) 이런식으로 혼자있을때가 아닌 경우 음란물이 있을 수 있으니 주의하라는 의미로 많이 사용하는 용어인데, 영어로는 nsfw(not safe for work) 라고 표현합니다.

 

 

nsfwjs는 Tensorflow의 JS버전인 tfjs를 사용하여 mobile net 버전의 모델을 사용해서 client side에서 성인 이미지를 판별하는 오픈소스입니다.

하지만 첫 페이지 접근시 모델을 불러오는 속도가 굉장히 느립니다.

 

 

이 문제를 해결하기 위해서 저는 nsfwjs의 코드가 그리많지 않았고, Tensorflow js를 사용하는것을 확인해서  TFJS WASM 버전으로 직접 만들게 되었습니다.

 

 

 

 

Demo

https://nsfw.tlnd.cc 

 

NSFW JS + WASM on Web Worker

- with Tensorflow.js wasm version - with Web Worker Not Main Thread - don't request upload a server. - only client side nsfw validate.

nsfw.tlnd.cc

 

 

그래서 이게 뭔데?

서버 없이 Javascript 만 사용해서, 성인 이미지를 판별할 수 있는 코드 입니다.

 

 

 

 

문제점

하지만 tfjs wasm을 사용했을때는 첫 페이지 접근시 메인스레드에 영향은 없지만, 첫 호출시에는 모델을 로드할때 nsfwjs 와 마찬가지로 메인스레드에 부하가 심해, 브라우저가 멈추는 현상이 있습니다.

이 시간이 짧으면 괜찮지만, 사양에 따라서 2~7초 정도 소요되었는데 이걸 개선하기 위해 Web Worker를 사용하여 백그라운드 스레드를 이용해 메인스레드에 영향이 없도록 개선하는 방법을 착안했습니다.

 

 

 

결과

NSFWJS의 결과
상단: TFJS WASM / 하단 TFJS WASM + Webworker

 

NSFWJS와 비교했을때 약간의 오차가 있기는 하지만, 이미지를 판별하는데 있어서는 문제가 될 정도는 아닙니다.

메인스레드와도 오차가 있기는 한데 그것도 판별하는데 있어서 문제가 될 정도의 수치는 아닙니다.

 

 

카카오 비전 성인 이미지 판별 API와 비교했을때는 더이상 모델 학습을 안하는지 생각보다 좋은 결과를 주지 못합니다.

또한 adult 점수만 매기기 때문에, 굉장히 애매모호합니다.

 

 

무료인데 서버도 없이 이렇게 판단할 수 있다는 것은 굉장히 강력하다고 생각됩니다.

또 누군가에게는 반드시 필요로 할 것이라 생각해서 오픈소스로 공개합니다.

해당 코드는 아래에서 확인하실 수 있습니다.

 

기호에 맞게 Hentai, Porn, Drawing, Sexy, Neutral 문구를 변경해서 사용하시면 됩니다.

 

https://gist.github.com/YankeeTube/ee96f60f57b9038ee0b703fc6620e7d9

 

So Very Fast NSFWJS on TFJS WASM + Web Worker

So Very Fast NSFWJS on TFJS WASM + Web Worker. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

728x90