Skip to content

Commit

Permalink
#16 ML Kit 적용됨.. 인터벌 설정해야 함
Browse files Browse the repository at this point in the history
  • Loading branch information
comye1 committed Mar 9, 2022
1 parent 548b9e6 commit d791800
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 56 deletions.
3 changes: 3 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -144,4 +144,7 @@ dependencies {

// 네이버 로그인
implementation("com.navercorp.nid:oauth-jdk8:5.0.1") // jdk 8

// ml kit
implementation 'com.google.android.gms:play-services-mlkit-face-detection:17.0.1'
}
5 changes: 4 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@
tools:targetApi="m">
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyCnRY2jHkBd3vsoUuI9oa_9eKdjiKWmsdQ"/>
android:value="${GOOGLE_MAP_KEY}"/>
<meta-data
android:name="com.google.firebase.ml.vision.DEPENDENCIES"
android:value="face" />
<activity
android:name=".DSDActivity"
android:exported="true"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@ import android.media.Image
import android.util.Log
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageProxy
import com.comye1.dontsleepdriver.ml.SleepModel
import com.google.mlkit.vision.common.InputImage
import org.tensorflow.lite.DataType
import com.google.mlkit.vision.face.FaceDetection
import com.google.mlkit.vision.face.FaceDetectorOptions
import org.tensorflow.lite.support.image.ImageProcessor
import org.tensorflow.lite.support.image.TensorImage
import org.tensorflow.lite.support.image.ops.ResizeOp
import java.io.ByteArrayOutputStream

Expand All @@ -19,59 +18,44 @@ import java.io.ByteArrayOutputStream
class SleepAnalyzer(context: Context, private val listener: (String) -> Unit) :
ImageAnalysis.Analyzer {

private val model: SleepModel by lazy {
SleepModel.newInstance(context)
companion object {
// High-accuracy landmark detection and face classification
private val options = FaceDetectorOptions.Builder()
.setPerformanceMode(FaceDetectorOptions.PERFORMANCE_MODE_ACCURATE)
.setLandmarkMode(FaceDetectorOptions.LANDMARK_MODE_NONE)
.setContourMode(FaceDetectorOptions.CONTOUR_MODE_ALL)
.setClassificationMode(FaceDetectorOptions.CLASSIFICATION_MODE_ALL)
.build()
val detector = FaceDetection.getClient(options)
}

override fun analyze(image: ImageProxy) {
Log.d("SleepAnalyzer", "image : ${image.image.toString()}")
if (image.image != null) {

// val input = TensorBuffer.createFixedSize(intArrayOf(1,320,320,3), DataType.FLOAT32)
// input.loadBuffer(TensorImage.fromBitmap(image.image!!.toBitmap()).buffer)


var tfImage = TensorImage(DataType.FLOAT32)
tfImage.load(image.image!!.toBitmap())
tfImage = imageProcessor.process(tfImage) // image resize
// Log.d("SleepAnalyzer", tfImage.tensorBuffer.shape.toString())

// val output = model.process(tfImage)

// Log.d("SleepAnalyzer", "model : ${model is SleepModel}")

// Log.d("SleepAnalyzer", output.toString())

// listener(output.toString())

// listener(tfImage.tensorBuffer.intArray.size.toString())
image.close()
override fun analyze(imageProxy: ImageProxy) {
val mediaImage = imageProxy.image
if (mediaImage != null) {
Log.d("facedetection", "running")

val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
// Pass image to an ML Kit Vision API
// ...

val result = detector.process(image)
.addOnSuccessListener { faces ->
faces.forEach {
listener("${it.leftEyeOpenProbability} ${it.rightEyeOpenProbability}")
Log.d(
"facedetection",
"${it.leftEyeOpenProbability} ${it.rightEyeOpenProbability}"
)
}

}
.addOnFailureListener { e ->
Log.d("facedetection", e.message.toString())
}
.addOnCompleteListener {
imageProxy.close()
}
}
}

private fun Image.toBitmap(): Bitmap {
val yBuffer = planes[0].buffer // Y
val vuBuffer = planes[2].buffer // VU

val ySize = yBuffer.remaining()
val vuSize = vuBuffer.remaining()

val nv21 = ByteArray(ySize + vuSize)

yBuffer.get(nv21, 0, ySize)
vuBuffer.get(nv21, ySize, vuSize)

val yuvImage = YuvImage(nv21, ImageFormat.NV21, this.width, this.height, null)
val out = ByteArrayOutputStream()
yuvImage.compressToJpeg(Rect(0, 0, yuvImage.width, yuvImage.height), 50, out)
val imageBytes = out.toByteArray()
return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size)
}

// image resize processor
private val imageProcessor =
ImageProcessor.Builder()
.add(ResizeOp(320, 320, ResizeOp.ResizeMethod.BILINEAR))
.build()
}

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.comye1.dontsleepdriver.main
import android.annotation.SuppressLint
import android.content.Context
import android.util.Log
import android.util.Size
import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.Preview
Expand Down Expand Up @@ -78,14 +79,14 @@ fun DetectionView(
Log.d("SleepAnalyzer", analyzer.toString())

val imageAnalysis = ImageAnalysis.Builder()
// .setMaxResolution(Size(224, 224))
.setMaxResolution(Size(480, 360))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
.apply {
setAnalyzer(executor, analyzer)
}

val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
val cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA

try {
cameraProvider.unbindAll()
Expand Down

0 comments on commit d791800

Please sign in to comment.