ss"> 集成人脸比对,继电器 · f2e37bc74c - Nuosi Git Service
Browse Source

集成人脸比对,继电器

wuyong3 5 years ago
parent
commit
f2e37bc74c

+ 3 - 1
asiainfo-aiface-client/app/build.gradle

@ -4,7 +4,7 @@ android {
4 4
    compileSdkVersion 28
5 5
    defaultConfig {
6 6
        minSdkVersion 19
7
        targetSdkVersion 28
7
        targetSdkVersion 27
8 8
        versionCode 1
9 9
        versionName "1.0"
10 10
    }
@ -48,5 +48,7 @@ dependencies {
48 48
    implementation 'com.android.support:appcompat-v7:28.0.0'
49 49
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
50 50
    implementation 'androidx.annotation:annotation:1.1.0'
51
    implementation 'org.tensorflow:tensorflow-android:+'
51 52
	implementation(name: 'ipu-mobile-aiface',ext: 'aar')
53
    implementation(name: 'facelib-release',ext: 'aar')
52 54
}

BIN
asiainfo-aiface-client/app/libs/facelib-release.aar


+ 1 - 0
asiainfo-aiface-client/app/src/main/AndroidManifest.xml

@ -5,6 +5,7 @@
5 5
6 6
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
7 7
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
8
    <uses-permission android:name="android.permission.INTERNET"/>
8 9
    <uses-permission android:name="android.permission.CAMERA"/>
9 10
10 11
    <uses-feature android:name="android.hardware.camera"/>

+ 85 - 0
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/FaceCompare.java

@ -0,0 +1,85 @@
1
package com.ai.ipu.aiface.scanCamera;
2
3
import android.app.Activity;
4
import android.app.ProgressDialog;
5
import android.graphics.Bitmap;
6
import android.util.Log;
7
import android.widget.Toast;
8
9
import com.ai.ipu.aiface.scanCamera.util.BitmapUtil;
10
import com.ai.ipu.aiface.scanCamera.util.HttpRequest;
11
import com.ai.ipu.aiface.scanCamera.util.Relay;
12
13
import org.json.JSONException;
14
import org.json.JSONObject;
15
16
public class FaceCompare {
17
18
    private boolean isComparing = false;
19
    private ProgressDialog dialog;
20
21
    public FaceCompare() {
22
        super();
23
    }
24
25
    public void startCampare(Activity activity,Bitmap bmp){
26
        if(!isComparing){
27
            isComparing = true;
28
            new Thread(new Runnable() {
29
                @Override
30
                public void run() {
31
                    JSONObject param = new JSONObject();
32
                    String bitmap64 = BitmapUtil.bitmapToBase64(bmp);
33
                    try {
34
                        param.put("image_value_base64",bitmap64);
35
                    } catch (JSONException e) {
36
                        e.printStackTrace();
37
                    }
38
                    long startMill = System.currentTimeMillis();
39
                    String result = HttpRequest.httpRequest("http://10.20.12.218:59666/mobile",param.toString(),"POST");
40
                    Log.e("MainActivity","time:"+(System.currentTimeMillis()-startMill));
41
                    try {
42
                        JSONObject object = new JSONObject(result);
43
                        int code = object.getInt("errorCode");
44
                        String name =HttpRequest.unicodeToString(object.getString("message"));
45
                        activity.runOnUiThread(new Runnable() {
46
                            @Override
47
                            public void run() {
48
                                if(code == 200){
49
                                    Relay.setEnable();
50
                                    Toast.makeText(activity,name+"识别成功",Toast.LENGTH_SHORT).show();
51
                                }else{
52
                                    Toast.makeText(activity,name,Toast.LENGTH_SHORT).show();
53
                                }
54
                            }
55
                        });
56
                    } catch (JSONException e) {
57
                        e.printStackTrace();
58
                    }
59
                    isComparing = false;
60
                }
61
            }).start();
62
        }
63
    }
64
65
    private void showProgressDialog(Activity activity){
66
        dialog = new ProgressDialog(activity);
67
        dialog.setMessage("识别中!");
68
        activity.runOnUiThread(new Runnable() {
69
            @Override
70
            public void run() {
71
                dialog.show();
72
            }
73
        });
74
    }
75
    private void dismissDialog(Activity activity){
76
        activity.runOnUiThread(new Runnable() {
77
            @Override
78
            public void run() {
79
                if(dialog!=null){
80
                    dialog.dismiss();
81
                }
82
            }
83
        });
84
    }
85
}

+ 63 - 0
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/MainActivity.java

@ -3,21 +3,34 @@ package com.ai.ipu.aiface.scanCamera;
3 3
import android.annotation.SuppressLint;
4 4
import android.content.pm.PackageManager;
5 5
import android.graphics.Bitmap;
6
import android.graphics.Rect;
6 7
import android.graphics.drawable.BitmapDrawable;
7 8
import android.os.Bundle;
8 9
import android.os.Handler;
9 10
import android.os.Message;
10 11
import android.text.format.DateFormat;
12
import android.util.Log;
11 13
import android.view.View;
12 14
import android.widget.ImageView;
13 15
import android.widget.TextView;
14 16
15 17
import com.ai.ipu.aiface.R;
18
import com.ai.ipu.aiface.scanCamera.util.BitmapUtil;
16 19
import com.ai.ipu.aiface.scanCamera.util.DymicPermissionTool;
20
import com.ai.ipu.aiface.scanCamera.util.HttpRequest;
17 21
import com.ai.ipu.aiface.scanCamera.util.LEDLight;
22
import com.example.vcvyc.myapplication.Box;
23
import com.example.vcvyc.myapplication.FaceFeature;
24
import com.example.vcvyc.myapplication.Facenet;
25
import com.example.vcvyc.myapplication.MTCNN;
26
import com.example.vcvyc.myapplication.Utils;
18 27
import com.google.android.cameraview.CameraView;
19 28
29
import org.json.JSONException;
30
import org.json.JSONObject;
31
20 32
import java.util.Calendar;
33
import java.util.Vector;
21 34
22 35
import androidx.annotation.NonNull;
23 36
import androidx.annotation.Nullable;
@ -29,6 +42,12 @@ public class MainActivity extends FaceScanBaseActivity {
29 42
    private ImageView led_switch;
30 43
    private LEDLight ledLight;
31 44
45
    public static String model_path = "file:///android_asset/facenet.pb";
46
    public Facenet facenet;
47
    public MTCNN mtcnn;
48
49
    private FaceCompare compare;
50
32 51
    @Override
33 52
    public void onCreate(@Nullable Bundle savedInstanceState) {
34 53
        super.onCreate(savedInstanceState);
@ -39,6 +58,7 @@ public class MainActivity extends FaceScanBaseActivity {
39 58
        mCv.setFacing(CameraView.FACING_BACK);
40 59
        ledLight = new LEDLight();
41 60
        new TimeThread().start();
61
        compare = new FaceCompare();
42 62
    }
43 63
44 64
    @Override
@ -71,6 +91,7 @@ public class MainActivity extends FaceScanBaseActivity {
71 91
    public boolean handlePreview(Bitmap bmp) {
72 92
        preview.setVisibility(View.VISIBLE);
73 93
        preview.setImageDrawable(new BitmapDrawable(getResources(),bmp));
94
        compare.startCampare(this,bmp);
74 95
        return false;
75 96
    }
76 97
@ -147,4 +168,46 @@ public class MainActivity extends FaceScanBaseActivity {
147 168
        return week;
148 169
    }
149 170
171
    public double compareFaces(Bitmap bitmap1,Bitmap bitmap2) {
172
        //(1)圈出人脸,人脸检测(可能会有多个人脸)
173
        /*安卓自带人脸检测实现
174
        Rect rect1 = FaceDetect.detectBiggestFace(bitmap1);
175
        if (rect1==null) return -1;
176
        Rect rect2 = FaceDetect.detectBiggestFace(bitmap2);
177
        if (rect2==null) return -2;*/
178
        Bitmap bm1 = Utils.copyBitmap(bitmap1);
179
        Bitmap bm2 = Utils.copyBitmap(bitmap2);
180
        Vector<Box> boxes = mtcnn.detectFaces(bitmap1, 40);
181
        Vector<Box> boxes1 = mtcnn.detectFaces(bitmap2, 40);
182
        if (boxes.size() == 0) return -1;
183
        if (boxes1.size() == 0) return -2;
184
        for (int i = 0; i < boxes.size(); i++)
185
            Utils.drawBox(bitmap1, boxes.get(i), 1 + bitmap1.getWidth() / 500);
186
        for (int i = 0; i < boxes1.size(); i++)
187
            Utils.drawBox(bitmap2, boxes1.get(i), 1 + bitmap2.getWidth() / 500);
188
        Rect rect1 = boxes.get(0).transform2Rect();
189
        Rect rect2 = boxes1.get(0).transform2Rect();
190
        //MTCNN检测到的人脸框,再上下左右扩展margin个像素点,再放入facenet中。
191
        int margin = 20; //20这个值是facenet中设置的。自己应该可以调整。
192
        Utils.rectExtend(bitmap1, rect1, margin);
193
        Utils.rectExtend(bitmap2, rect2, margin);
194
        //要比较的两个人脸,加厚Rect
195
        Utils.drawRect(bitmap1, rect1, 1 + bitmap1.getWidth() / 100);
196
        Utils.drawRect(bitmap2, rect2, 1 + bitmap2.getWidth() / 100);
197
        //(2)裁剪出人脸(只取第一张)
198
        Bitmap face1 = Utils.crop(bitmap1, rect1);
199
        Bitmap face2 = Utils.crop(bitmap2, rect2);
200
        //(显示人脸)
201
//        imageView1.setImageBitmap(bitmap1);
202
//        imageView2.setImageBitmap(bitmap2);
203
        //(3)特征提取
204
        FaceFeature ff1 = facenet.recognizeImage(face1);
205
        FaceFeature ff2 = facenet.recognizeImage(face2);
206
        bitmap1 = bm1;
207
        bitmap2 = bm2;
208
        //(4)比较
209
        //return ff1.compare(ff2);
210
        return FaceFeature.sim_distance(ff1, ff2);
211
    }
212
150 213
}

+ 11 - 0
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/Test.java

@ -0,0 +1,11 @@
1
package com.ai.ipu.aiface.scanCamera;
2
3
import com.ai.ipu.aiface.scanCamera.util.HttpRequest;
4
5
public class Test {
6
7
    public static void main(String[] arg){
8
        String a = HttpRequest.unicodeToString("\\u4f0d\\u52c7");
9
        System.out.println(a);
10
    }
11
}

+ 39 - 0
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/util/BitmapUtil.java

@ -0,0 +1,39 @@
1
package com.ai.ipu.aiface.scanCamera.util;
2
3
import android.graphics.Bitmap;
4
import android.util.Base64;
5
6
import java.io.ByteArrayOutputStream;
7
import java.io.IOException;
8
9
public class BitmapUtil {
10
11
    public static String bitmapToBase64(Bitmap bitmap) {
12
        String result = null;
13
        ByteArrayOutputStream baos = null;
14
        try {
15
            if (bitmap != null) {
16
                baos = new ByteArrayOutputStream();
17
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
18
19
                baos.flush();
20
                baos.close();
21
22
                byte[] bitmapBytes = baos.toByteArray();
23
                result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
24
            }
25
        } catch (IOException e) {
26
            e.printStackTrace();
27
        } finally {
28
            try {
29
                if (baos != null) {
30
                    baos.flush();
31
                    baos.close();
32
                }
33
            } catch (IOException e) {
34
                e.printStackTrace();
35
            }
36
        }
37
        return result;
38
    }
39
}

+ 6 - 0
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/util/Constance.java

@ -0,0 +1,6 @@
1
package com.ai.ipu.aiface.scanCamera.util;
2
3
public class Constance {
4
5
    public static final String DATA_URL = "http://10.20.12.97:38080/ai-msp/iac/androidDevice/getEmployeeInfos";
6
}

+ 58 - 0
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/util/Hardware.java

@ -0,0 +1,58 @@
1
package com.ai.ipu.aiface.scanCamera.util;
2
3
import android.util.Log;
4
5
import com.ai.ipu.aiface.BuildConfig;
6
7
import java.io.File;
8
import java.io.FileInputStream;
9
import java.io.FileOutputStream;
10
import java.io.IOException;
11
12
public class Hardware {
13
    public static final String LED_PATH = "/dev/led_en";
14
    public static final String RELAY_PATH = "/dev/relay";
15
16
    public static boolean write_file(String name, int value){
17
//        if(BuildConfig.DEBUG){
18
//            return true;
19
//        }
20
        File myFile = new File(name);
21
        String str = ""+value;
22
        try {
23
            FileOutputStream fos = new FileOutputStream(myFile);
24
            fos.write(str.getBytes());
25
            fos.close();
26
        } catch (IOException e) {
27
            Log.e(LEDLight.class.getSimpleName(),e.getMessage(),e);
28
            return false;
29
        }
30
        return true;
31
    }
32
    public static String read_file(String path){
33
//        if(BuildConfig.DEBUG){
34
//            return "null";
35
//        }
36
        File myFile = new File(path);
37
        byte[] buffer = new byte[4];
38
        int len=0;
39
        try {
40
            FileInputStream fis = new FileInputStream(myFile);
41
            len = fis.read(buffer);
42
            fis.close();
43
        } catch (IOException e) {
44
            e.printStackTrace();
45
        }
46
        if(len>0){
47
            String s = new String(buffer);
48
            if(s.startsWith("1"))
49
                return "1";
50
            else if(s.startsWith("0"))
51
                return "0";
52
            else
53
                return "null";
54
        }
55
        else
56
            return "null";
57
    }
58
}

+ 92 - 0
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/util/HttpRequest.java

@ -0,0 +1,92 @@
1
package com.ai.ipu.aiface.scanCamera.util;
2
3
import java.io.BufferedReader;
4
import java.io.IOException;
5
import java.io.InputStream;
6
import java.io.InputStreamReader;
7
import java.io.OutputStream;
8
import java.net.HttpURLConnection;
9
import java.net.MalformedURLException;
10
import java.net.ProtocolException;
11
import java.net.URL;
12
import java.util.regex.Matcher;
13
import java.util.regex.Pattern;
14
15
public class HttpRequest {
16
17
    public static String httpRequest(String requestUrl, String data, String type)  {
18
        try {
19
            URL url = new URL(requestUrl);
20
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
21
            connection.setConnectTimeout(30000);
22
            if("POST".equals(type)){
23
                connection.setRequestMethod("POST");
24
                connection.setDoOutput(true);
25
                connection.setDoInput(true);
26
            }else{
27
                connection.setRequestMethod("GET");
28
            }
29
            //至少要设置的两个请求头
30
            connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
31
32
            //post的方式提交实际上是留的方式提交给服务器
33
            if(data!=null){
34
                connection.setRequestProperty("Content-Length", data.length()+"");
35
                OutputStream outputStream = connection.getOutputStream();
36
                outputStream.write(data.getBytes());
37
            }
38
39
            //获得结果码
40
            int responseCode = connection.getResponseCode();
41
            if(responseCode ==200||responseCode == 400){
42
                //请求成功
43
                InputStream is = connection.getInputStream();
44
                return parseInputStream(is,"US-ASCII");
45
            }else {
46
                //请求失败
47
                return null;
48
            }
49
        } catch (MalformedURLException e) {
50
            e.printStackTrace();
51
        } catch (ProtocolException e) {
52
            e.printStackTrace();
53
        } catch (IOException e) {
54
            e.printStackTrace();
55
        }
56
        return null;
57
    }
58
59
    public static String parseInputStream(InputStream is, String encode) throws IOException {
60
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, encode));
61
        StringBuffer buff = new StringBuffer();
62
        String result;
63
        String nl = System.getProperties().getProperty("line.separator");
64
65
        while((result = reader.readLine()) != null) {
66
            buff.append(result).append(nl);
67
        }
68
69
        if (buff.length() > 0) {
70
            buff.setLength(buff.length() - 1);
71
        }
72
        result = buff.toString();
73
        return result;
74
    }
75
76
    public static String unicodeToString(String str) {
77
        Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
78
        Matcher matcher = pattern.matcher(str);
79
        char ch;
80
        while (matcher.find()) {
81
            //group 6728
82
            String group = matcher.group(2);
83
            //ch:'木' 26408
84
            ch = (char) Integer.parseInt(group, 16);
85
            //group1 \u6728
86
            String group1 = matcher.group(1);
87
            str = str.replace(group1, ch + "");
88
        }
89
        return str;
90
    }
91
92
}

+ 2 - 40
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/util/LEDLight.java

@ -9,7 +9,6 @@ import java.io.IOException;
9 9
10 10
public class LEDLight {
11 11
12
    private static final String LED_PATH = "/dev/led_en";
13 12
    private static final int LED_ENABLE = 1;
14 13
    private static final int LED_DISABLE = 0;
15 14
    private boolean currentStatus = false;
@ -21,46 +20,9 @@ public class LEDLight {
21 20
    public boolean setLEDEnable(boolean enable){
22 21
        currentStatus = enable;
23 22
        if(enable){
24
            return write_file(LED_PATH,LED_ENABLE);
23
            return Hardware.write_file(Hardware.LED_PATH,LED_ENABLE);
25 24
        }else{
26
            return write_file(LED_PATH,LED_DISABLE);
25
            return Hardware.write_file(Hardware.LED_PATH,LED_DISABLE);
27 26
        }
28 27
    }
29
30
    private static boolean write_file(String name, int value){
31
        File myFile = new File(name);
32
        String str = ""+value;
33
        try {
34
            FileOutputStream fos = new FileOutputStream(myFile);
35
            fos.write(str.getBytes());
36
            fos.close();
37
        } catch (IOException e) {
38
            Log.e(LEDLight.class.getSimpleName(),e.getMessage(),e);
39
            return false;
40
        }
41
        return true;
42
    }
43
    private static String read_file(String path){
44
        File myFile = new File(path);
45
        byte[] buffer = new byte[4];
46
        int len=0;
47
        try {
48
            FileInputStream fis = new FileInputStream(myFile);
49
            len = fis.read(buffer);
50
            fis.close();
51
        } catch (IOException e) {
52
            e.printStackTrace();
53
        }
54
        if(len>0){
55
            String s = new String(buffer);
56
            if(s.startsWith("1"))
57
                return "1";
58
            else if(s.startsWith("0"))
59
                return "0";
60
            else
61
                return "null";
62
        }
63
        else
64
            return "null";
65
    }
66 28
}

+ 7 - 0
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/util/Relay.java

@ -0,0 +1,7 @@
1
package com.ai.ipu.aiface.scanCamera.util;
2
3
public class Relay {
4
    public static void setEnable(){
5
        Hardware.write_file(Hardware.RELAY_PATH,1);
6
    }
7
}