修复部分图片识别不准确的问题。

pull/34/head 1.2.5
jason 6 years ago
parent 2f5053f380
commit 2d2fd8bd9b
  1. 7
      app/build.gradle
  2. 1
      app/debug/output.json
  3. 2
      app/src/main/AndroidManifest.xml
  4. 105
      app/src/main/java/com/example/open_nsfw_android/MainActivity.kt
  5. 10
      app/src/main/java/com/example/open_nsfw_android/MainAdapter.kt
  6. 54
      app/src/main/res/layout/activity_main.xml
  7. 3
      app/src/main/res/values/colors.xml
  8. 1
      app/src/main/res/values/strings.xml
  9. 2
      nsfw/src/main/AndroidManifest.xml
  10. 132
      nsfw/src/main/java/com/zwy/nsfw/Classifier.java
  11. 53
      nsfw/src/main/java/com/zwy/nsfw/ClassifierFloatMobileNet.java
  12. 1
      openCVLibrary340/build/intermediates/annotation_processor_list/debug/annotationProcessors.json
  13. BIN
      openCVLibrary340/build/intermediates/compile_library_classes/debug/classes.jar
  14. BIN
      openCVLibrary340/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/generateDebugRFile/R.jar
  15. BIN
      openCVLibrary340/build/intermediates/incremental/debug-mergeJniLibs/merge-state
  16. 2
      openCVLibrary340/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
  17. 2
      openCVLibrary340/build/intermediates/incremental/mergeDebugShaders/merger.xml
  18. 2
      openCVLibrary340/build/intermediates/incremental/packageDebugAssets/merger.xml
  19. 1
      openCVLibrary340/build/intermediates/incremental/packageDebugResources/compile-file-map.properties
  20. 11
      openCVLibrary340/build/intermediates/incremental/packageDebugResources/merged.dir/values/values.xml
  21. 16
      openCVLibrary340/build/intermediates/incremental/packageDebugResources/merger.xml
  22. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/BuildConfig.class
  23. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/AsyncServiceHelper$1.class
  24. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/AsyncServiceHelper$2.class
  25. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/AsyncServiceHelper$3$1.class
  26. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/AsyncServiceHelper$3$2.class
  27. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/AsyncServiceHelper$3.class
  28. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/AsyncServiceHelper.class
  29. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/BaseLoaderCallback$1.class
  30. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/BaseLoaderCallback$2.class
  31. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/BaseLoaderCallback$3.class
  32. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/BaseLoaderCallback$4.class
  33. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/BaseLoaderCallback$5.class
  34. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/BaseLoaderCallback$6.class
  35. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/BaseLoaderCallback$7.class
  36. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/BaseLoaderCallback.class
  37. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/Camera2Renderer$1.class
  38. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/Camera2Renderer$2.class
  39. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/Camera2Renderer.class
  40. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/CameraBridgeViewBase$1.class
  41. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/CameraBridgeViewBase$CvCameraViewFrame.class
  42. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/CameraBridgeViewBase$CvCameraViewListener.class
  43. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/CameraBridgeViewBase$CvCameraViewListener2.class
  44. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/CameraBridgeViewBase$CvCameraViewListenerAdapter.class
  45. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/CameraBridgeViewBase$ListItemAccessor.class
  46. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/CameraBridgeViewBase.class
  47. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/CameraGLRendererBase.class
  48. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/CameraGLSurfaceView$CameraTextureListener.class
  49. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/CameraGLSurfaceView.class
  50. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/CameraRenderer.class
  51. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/FpsMeter.class
  52. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/InstallCallbackInterface.class
  53. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/JavaCameraView$1.class
  54. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/JavaCameraView$CameraWorker.class
  55. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/JavaCameraView$JavaCameraFrame.class
  56. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/JavaCameraView$JavaCameraSizeAccessor.class
  57. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/JavaCameraView.class
  58. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/LoaderCallbackInterface.class
  59. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/OpenCVLoader.class
  60. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/StaticHelper.class
  61. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/android/Utils.class
  62. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/calib3d/Calib3d.class
  63. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/calib3d/StereoBM.class
  64. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/calib3d/StereoMatcher.class
  65. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/calib3d/StereoSGBM.class
  66. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/Algorithm.class
  67. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/Core$MinMaxLocResult.class
  68. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/Core.class
  69. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/CvException.class
  70. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/CvType.class
  71. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/DMatch.class
  72. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/KeyPoint.class
  73. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/Mat.class
  74. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfByte.class
  75. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfDMatch.class
  76. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfDouble.class
  77. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfFloat.class
  78. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfFloat4.class
  79. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfFloat6.class
  80. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfInt.class
  81. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfInt4.class
  82. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfKeyPoint.class
  83. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfPoint.class
  84. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfPoint2f.class
  85. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfPoint3.class
  86. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfPoint3f.class
  87. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfRect.class
  88. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/MatOfRect2d.class
  89. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/Point.class
  90. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/Point3.class
  91. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/Range.class
  92. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/Rect.class
  93. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/Rect2d.class
  94. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/RotatedRect.class
  95. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/Scalar.class
  96. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/Size.class
  97. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/TermCriteria.class
  98. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/core/TickMeter.class
  99. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/dnn/DictValue.class
  100. BIN
      openCVLibrary340/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/org/opencv/dnn/Dnn.class
  101. Some files were not shown because too many files have changed in this diff Show More

@ -44,7 +44,10 @@ dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
// implementation project(path: ':nsfw')
implementation 'com.github.devzwy:open_nsfw_android:1.2.4'
implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3'
implementation project(path: ':nsfw')
// implementation 'com.github.devzwy:open_nsfw_android:1.2.4'
}

@ -1 +0,0 @@
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"app-debug.apk","properties":{}}]

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.open_nsfw_android">
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
@ -11,6 +10,7 @@
android:roundIcon="@mipmap/icon"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

@ -1,45 +1,120 @@
package com.example.open_nsfw_android
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.BitmapFactory
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.LinearLayoutManager
import android.view.View
import com.luck.picture.lib.PictureSelector
import com.luck.picture.lib.config.PictureConfig
import com.luck.picture.lib.config.PictureMimeType
import com.luck.picture.lib.entity.LocalMedia
import com.zwy.nsfw.api.NsfwHelper
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
class MainActivity : AppCompatActivity(), View.OnClickListener {
var nsfwHelper: NsfwHelper? = null
var mainAdapter: MainAdapter? = null
var index = 0
val listData: ArrayList<MyNsfwBean> = ArrayList<MyNsfwBean>()
@SuppressLint("SetTextI18n")
var listData: ArrayList<MyNsfwBean> = ArrayList<MyNsfwBean>()
var selectList: List<LocalMedia>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//assets 目录下的timg-10.jpeg为正常静态图片 ccc.gif 为动态正常图片 可用作测试
// val b = BitmapFactory.decodeStream(resources.assets.open("img/06 (1).jpg"))
// iv.setImageBitmap(b)
nsfwHelper = NsfwHelper.getInstance(this, true, 1)
initNsfwHelper()
initAdapter()
initClickListener()
}
override fun onClick(v: View) {
when (v.id) {
R.id.bt_sc_assets -> {
reScAssetsImgs()
}
R.id.bt_sc_from_other -> {
PictureSelector.create(this)
.openGallery(PictureMimeType.ofImage())//全部.ofAll()、图片.、视频.ofVideo()、音频.ofAudio()
.maxSelectNum(20)// 最大图片选择数量 int
.minSelectNum(1)// 最小选择数量 int
.imageSpanCount(3)// 每行显示个数 int
.selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 or PictureConfig.SINGLE
.previewImage(true)// 是否可预览图片 true or false
.isCamera(false)// 是否显示拍照按钮 true or false
.isZoomAnim(true)// 图片列表点击 缩放效果 默认true
.selectionMedia(selectList)
.sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
.previewEggs(true)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false
.forResult(0x01);//结果回调onActivityResult code
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 0x01 && resultCode == RESULT_OK) {
selectList = PictureSelector.obtainMultipleResult(data)
if (selectList != null && selectList?.size ?: 0 > 0)
reScFromImgs(selectList!!)
}
}
private fun initClickListener() {
bt_sc_assets.setOnClickListener(this)
bt_sc_from_other.setOnClickListener(this)
}
private fun initAdapter() {
mainAdapter = MainAdapter(null)
rv.layoutManager = LinearLayoutManager(this)
rv.adapter = mainAdapter
tv_start.setOnClickListener {
for (a in resources.assets.list("img")) {
val path = "img/${a}"
val b = BitmapFactory.decodeStream(resources.assets.open(path))
listData.add(MyNsfwBean(0f, 0f, path, b))
nsfwHelper?.scanBitmap(b) { sfw, nsfw ->
}
private fun initNsfwHelper() {
nsfwHelper = NsfwHelper.getInstance(this, false, 1)
}
private fun reScFromImgs(list: List<LocalMedia>) {
index = 0
mainAdapter?.setNewData(null)
listData = ArrayList<MyNsfwBean>()
Thread(Runnable {
for (lm in list) {
val bitmap = BitmapFactory.decodeFile(lm.path)
listData.add(MyNsfwBean(0.0f, 0.0f, lm.path, bitmap))
nsfwHelper?.scanBitmap(bitmap) { sfw, nsfw ->
listData[index].sfw = sfw
listData[index].nsfw = nsfw
mainAdapter?.addData(listData[index])
mainAdapter?.notifyItemInserted(index)
rv.scrollToPosition(index)
index++
}
}
}).start()
}
private fun reScAssetsImgs() {
index = 0
mainAdapter?.setNewData(null)
listData = ArrayList<MyNsfwBean>()
for (a in resources.assets.list("img")) {
val path = "img/${a}"
val b = BitmapFactory.decodeStream(resources.assets.open(path))
listData.add(MyNsfwBean(0f, 0f, path, b))
nsfwHelper?.scanBitmap(b) { sfw, nsfw ->
listData[index].sfw = sfw
listData[index].nsfw = nsfw
mainAdapter?.addData(listData[index])
mainAdapter?.notifyItemInserted(index)
rv.scrollToPosition(index)
index++
}
}
}
}

@ -8,7 +8,7 @@ import android.widget.TextView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
class MainAdapter(val nsfwList: List<MyNsfwBean>?) :
class MainAdapter(nsfwList: List<MyNsfwBean>?) :
BaseQuickAdapter<MyNsfwBean, BaseViewHolder>(R.layout.main_item, nsfwList) {
@SuppressLint("SetTextI18n")
@ -17,15 +17,15 @@ class MainAdapter(val nsfwList: List<MyNsfwBean>?) :
val imageView = helper.getView<ImageView>(R.id.iv)
val view = helper.getView<RelativeLayout>(R.id.view)
var nsfwStr = "色情图片"
var color = ContextCompat.getColor(mContext,R.color.nsfw1)
var color = ContextCompat.getColor(mContext, R.color.nsfw1)
when (item.nsfw) {
in 0.0..0.3 -> {
nsfwStr = "正常图片"
color = ContextCompat.getColor(mContext,R.color.nsfw3)
color = ContextCompat.getColor(mContext, R.color.nsfw3)
}
in 0.3..0.7 -> {
in 0.3..0.6 -> {
nsfwStr = "👙比基尼"
color = ContextCompat.getColor(mContext,R.color.nsfw2)
color = ContextCompat.getColor(mContext, R.color.nsfw2)
}
}
textView.text =

@ -4,13 +4,26 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textSize="18sp"
android:id="@+id/tv_start"
android:gravity="center"
android:layout_gravity="center"
android:padding="20dp"
android:text="点击开始识别Assets下的测试图片"/>
<LinearLayout android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<Button android:layout_width="0dp" android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="16sp"
android:id="@+id/bt_sc_assets"
android:gravity="center"
android:layout_gravity="center"
android:padding="20dp"
android:text="@string/str_bt1"/>
<Button android:layout_width="0dp" android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="16sp"
android:id="@+id/bt_sc_from_other"
android:gravity="center"
android:layout_gravity="center"
android:padding="20dp"
android:text="从相册选取"/>
</LinearLayout>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="sfw:适宜在公共场所浏览,nsfw:不适宜在公共场所浏览,两者都是0-1中间的浮点型值,nsfw数值越大表示色情程度越高,sfw反之"
android:padding="15dp"
@ -19,31 +32,4 @@
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<!--<ScrollView android:layout_width="match_parent" android:layout_height="match_parent">-->
<!--<LinearLayout android:layout_width="match_parent"-->
<!--android:orientation="vertical" android:layout_height="match_parent">-->
<!--<Button android:layout_width="wrap_content"-->
<!--android:layout_centerHorizontal="true"-->
<!--android:text="点击开始识别Assets下的测试图片"-->
<!--android:layout_gravity="center"-->
<!--android:id="@+id/bt_"-->
<!--android:gravity="center"-->
<!--android:layout_height="wrap_content"/>-->
<!--<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"-->
<!--android:layout_below="@+id/bt_"-->
<!--android:id="@+id/tv_"-->
<!--android:padding="20dp"-->
<!--android:text="sfw:适宜在公共场所浏览,nsfw:不适宜在公共场所浏览,两者都是0-1中间的浮点型值,nsfw数值越大表示色情程度越高,sfw反之"/>-->
<!--<TextView-->
<!--android:id="@+id/tvv"-->
<!--android:layout_width="match_parent"-->
<!--android:padding="20dp"-->
<!--android:textColor="@color/colorAccent"-->
<!--android:textSize="16sp"-->
<!--android:layout_height="match_parent"/>-->
<!--</LinearLayout>-->
<!--</ScrollView>-->
</LinearLayout>

@ -3,9 +3,8 @@
<color name="colorPrimary">#008577</color>
<color name="colorPrimaryDark">#00574B</color>
<color name="semi_transparent">#66000000</color>
<color name="nsfw1">#20EE1E0D</color>
<color name="nsfw1">#56FF0000</color>
<color name="nsfw2">#20FD9904</color>
<color name="nsfw3">#FFFFFF</color>
<color name="colorAccent">#D81B60</color>
</resources>

@ -1,3 +1,4 @@
<resources>
<string name="app_name">离线鉴黄</string>
<string name="str_bt1">识别Assets下图片</string>
</resources>

@ -1,4 +1,2 @@
<manifest package="com.zwy.nsfw" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>

@ -15,6 +15,7 @@ import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.Tensor;
import org.tensorflow.lite.gpu.GpuDelegate;
import java.io.FileInputStream;
@ -24,13 +25,22 @@ import java.nio.ByteOrder;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
/**
* A classifier specialized to label images using TensorFlow Lite.
*/
public abstract class Classifier {
import static java.lang.Math.max;
public class Classifier {
public static final String TAG = "open_nsfw_android";
/**
* tensor input img size
*/
private final int INPUT_WIDTH = 224;
private final int INPUT_HEIGHT = 224;
/**
* BytesPerChannel
*/
private final int BYTES_PER_CHANNEL_NUM = 4;
/**
* Dimensions of inputs.
*/
@ -41,21 +51,13 @@ public abstract class Classifier {
/**
* Preallocated buffers for storing image data in.
*/
private int[] intValues = new int[224 * 224];
/**
* Options for configuring the Interpreter.
*/
private final Interpreter.Options tfliteOptions = new Interpreter.Options();
private int[] intValues = new int[INPUT_WIDTH * INPUT_HEIGHT];
/**
* The loaded TensorFlow Lite model.
*/
private MappedByteBuffer tfliteModel;
/** Labels corresponding to the output of the vision model. */
// private List<String> labels;
/**
* Optional GPU delegate for accleration.
*/
@ -64,34 +66,29 @@ public abstract class Classifier {
/**
* An instance of the driver class to run model inference with Tensorflow Lite.
*/
protected Interpreter tflite;
private Interpreter tflite;
/**
* A ByteBuffer to hold image data, to be feed into Tensorflow Lite as inputs.
*/
protected ByteBuffer imgData = null;
private ByteBuffer imgData;
/**
* Creates a classifier with the provided configuration.
*
* @param activity The current Activity.
* @param numThreads The number of threads to use for classification.
* @param activity The current Activity.
* @param isAddGpuDelegate Add gpu delegate
* @param numThreads The number of threads to use for classification.
* @return A classifier with the desired configuration.
*/
public static Classifier create(Activity activity, Boolean isAddGpuDelegate, int numThreads)
throws IOException {
return new ClassifierFloatMobileNet(activity, isAddGpuDelegate, numThreads);
return new Classifier(activity, isAddGpuDelegate, numThreads);
}
/**
* An immutable result returned by a Classifier describing what was recognized.
*/
/**
* Initializes a {@code Classifier}.
*/
protected Classifier(Activity activity, Boolean isGPU, int numThreads) throws IOException {
private Classifier(Activity activity, Boolean isGPU, int numThreads) throws IOException {
tfliteModel = loadModelFile(activity);
Interpreter.Options tfliteOptions = new Interpreter.Options();
if (isGPU) {
gpuDelegate = new GpuDelegate();
tfliteOptions.addDelegate(gpuDelegate);
@ -101,14 +98,15 @@ public abstract class Classifier {
imgData =
ByteBuffer.allocateDirect(
DIM_BATCH_SIZE
* getImageSizeX()
* getImageSizeY()
* INPUT_WIDTH
* INPUT_HEIGHT
* DIM_PIXEL_SIZE
* getNumBytesPerChannel());
* BYTES_PER_CHANNEL_NUM);
imgData.order(ByteOrder.LITTLE_ENDIAN);
if (OpenCVLoader.initDebug()){
if (OpenCVLoader.initDebug()) {
Log.d(TAG, "OpenCv Initialization Success.");
}else {
} else {
Log.e(TAG, "OpenCv Initialization Error.");
}
Log.d(TAG, "Tensorflow Lite Image Classifier Initialization Success.");
@ -118,7 +116,7 @@ public abstract class Classifier {
* Memory-map the model file in Assets.
*/
private MappedByteBuffer loadModelFile(Activity activity) throws IOException {
AssetFileDescriptor fileDescriptor = activity.getAssets().openFd(getModelPath());
AssetFileDescriptor fileDescriptor = activity.getAssets().openFd("nsfw.tflite");
FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
FileChannel fileChannel = inputStream.getChannel();
long startOffset = fileDescriptor.getStartOffset();
@ -126,6 +124,7 @@ public abstract class Classifier {
return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
}
/**
* Writes Image data into a {@code ByteBuffer}.
*/
@ -137,13 +136,19 @@ public abstract class Classifier {
Matrix m = new Matrix();
m.setScale(-1, 1);//水平翻转
Bitmap reversePic = Bitmap.createBitmap(bitmap_, 0, 0, bitmap_.getWidth(), bitmap_.getHeight(), m, true);
int W = bitmap_.getWidth();
int H = bitmap_.getHeight();
int w_off = max((W - INPUT_WIDTH) / 2, 0);
int h_off = max((H - INPUT_HEIGHT) / 2, 0);
//把每个像素的颜色值转为int 存入intValues
reversePic.getPixels(intValues, 0, 224, 16, 16, 224, 224);
reversePic.getPixels(intValues, 0, INPUT_WIDTH, h_off, w_off, INPUT_WIDTH, INPUT_HEIGHT);
// Convert the image to floating point.
int pixel = 0;
long startTime = SystemClock.uptimeMillis();
for (int i = 16; i < 240; ++i) {
for (int j = 16; j < 240; ++j) {
for (int i = h_off; i < h_off + INPUT_HEIGHT; ++i) {
for (int j = w_off; j < w_off + INPUT_WIDTH; ++j) {
final int color = intValues[pixel++];
int r1 = Color.red(color);
int g1 = Color.green(color);
@ -163,20 +168,34 @@ public abstract class Classifier {
}
public NsfwBean run(Bitmap bitmap) {
Mat mat = new Mat();
Utils.bitmapToMat(bitmap, mat, false);
//线性采样
//add alpha
Utils.bitmapToMat(bitmap.copy(Bitmap.Config.ARGB_8888, false), mat, true);
Mat mat1 = new Mat();
Imgproc.resize(mat, mat1, new Size(256, 256), 0, 0, Imgproc.INTER_CUBIC);
Bitmap bitmap_256 = Bitmap.createBitmap(256, 256, Bitmap.Config.RGB_565);
//将原bitmap双线性采样为256*256大小
Imgproc.resize(mat, mat1, new Size(256, 256), 0, 0, Imgproc.INTER_LINEAR);
//add alpha
Bitmap bitmap_256 = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);
//convert
Utils.matToBitmap(mat1, bitmap_256);
//Writes image data into byteBuffer
convertBitmapToByteBuffer(bitmap_256);
long startTime = SystemClock.uptimeMillis();
float[][] labelProbArray = new float[1][2];
tflite.run(imgData, labelProbArray);
// out
float[][] outArray = new float[1][2];
Tensor aa = tflite.getInputTensor(tflite.getInputIndex("input"));
Log.d(TAG, "dataType : " + aa.dataType());
Log.d(TAG, "numBytes : " + aa.numBytes());
Log.d(TAG, "numDimensions : " + aa.numDimensions());
Log.d(TAG, "numElements : " + aa.numElements());
Log.d(TAG, "shape : " + aa.shape().length);
Log.d(TAG, "lastImgData : " + imgData);
tflite.run(imgData, outArray);
long endTime = SystemClock.uptimeMillis();
Log.d(TAG, "Timecost to run model inference: " + (endTime - startTime) + "ms");
return new NsfwBean(labelProbArray[0][0], labelProbArray[0][1]);
return new NsfwBean(outArray[0][0], outArray[0][1]);
}
@ -195,33 +214,4 @@ public abstract class Classifier {
tfliteModel = null;
}
/**
* Get the image size along the x axis.
*
* @return
*/
public abstract int getImageSizeX();
/**
* Get the image size along the y axis.
*
* @return
*/
public abstract int getImageSizeY();
/**
* Get the name of the model file stored in Assets.
*
* @return
*/
protected abstract String getModelPath();
/**
* Get the number of bytes that is used to store a single color channel value.
*
* @return
*/
protected abstract int getNumBytesPerChannel();
}

@ -1,53 +0,0 @@
/* Copyright 2019 The TensorFlow Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==============================================================================*/
package com.zwy.nsfw;
import android.app.Activity;
import java.io.IOException;
/**
* This TensorFlowLite classifier works with the float MobileNet model.
*/
public class ClassifierFloatMobileNet extends Classifier {
public ClassifierFloatMobileNet(Activity activity, Boolean isAddGpuDelegate, int numThreads)
throws IOException {
super(activity, isAddGpuDelegate, numThreads);
}
@Override
public int getImageSizeX() {
return 224;
}
@Override
public int getImageSizeY() {
return 224;
}
@Override
protected String getModelPath() {
return "nsfw.tflite";
}
@Override
protected int getNumBytesPerChannel() {
return 4;
}
}

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/src/main/jniLibs"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/src/debug/jniLibs"/></dataSet></merger>

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/src/main/shaders"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/src/debug/shaders"/></dataSet></merger>

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/src/main/assets"/><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/build/intermediates/shader_assets/debug/compileDebugShaders/out"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/src/debug/assets"/></dataSet></merger>

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CameraBridgeViewBase">
<attr format="boolean" name="show_fps"/>
<attr format="integer" name="camera_id">
<enum name="any" value="-1"/>
<enum name="back" value="99"/>
<enum name="front" value="98"/>
</attr>
</declare-styleable>
</resources>

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/src/main/res"/><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/build/generated/res/rs/debug"/><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/build/generated/res/resValues/debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/src/main/res"><file path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/src/main/res/values/attrs.xml" qualifiers=""><declare-styleable name="CameraBridgeViewBase">
<attr format="boolean" name="show_fps"/>
<attr format="integer" name="camera_id">
<enum name="any" value="-1"/>
<enum name="back" value="99"/>
<enum name="front" value="98"/>
</attr>
</declare-styleable></file></source><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/build/generated/res/rs/debug"/><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/build/generated/res/resValues/debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/src/debug/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug" generated-set="debug$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/jason/AndroidStudioProjects/open_nsfw_android/openCVLibrary340/src/debug/res"/></dataSet><mergedItems><configuration qualifiers=""><declare-styleable name="CameraBridgeViewBase">
<attr format="boolean" name="show_fps"/>
<attr format="integer" name="camera_id">
<enum name="any" value="-1"/>
<enum name="back" value="99"/>
<enum name="front" value="98"/>
</attr>
</declare-styleable></configuration></mergedItems></merger>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save