基於虹軟人臉識別Demo android人臉識別

參加一個比賽,指定用虹軟的人臉識別功能,奈何虹軟人臉識別要本身建人臉庫,否則就只能離線用,總不能裝個樣子,簡單看了下虹軟Demo,下面決定用這種簡單方法實如今線人臉識別:數據庫

Android端(虹軟Demo)取出人臉信息和姓名,人臉信息寫入.data文件,存入手機本地------>取出文件上傳至Python Djano後臺,後臺把文件保
存在工程下並把路徑存入數據庫------>Android端訪問後臺接口,遍歷全部數據庫中文件路徑而後做爲參數再次訪問後臺,獲得全部人臉信息
文件和姓名,使用識別功能時,就能夠開始和全部人臉信息比對,獲得效果
Django 後臺代碼:

在工程下新建一個文件夾uploads,用來存放人臉數據.data文件django

爲簡單實現,在setting.py中註釋json

#'django.middleware.csrf.CsrfViewMiddleware', 否則post請求被攔截,認真作工程不建議這樣作 app.urls:網絡

from django.conf.urls import url, include
from . import views

urlpatterns = [
    url(r'^posts',views.posttest),
    url(r'^getallface',views.getface),
    url(r'^filedown',views.file_download),
]
views.py
#coding:utf-8
import json
from imp import reload
import sys
import os
from django.http import HttpResponse, HttpResponseRedirect, StreamingHttpResponse
from django.shortcuts import render, render_to_response
from django.template import RequestContext
from faceproject.settings import BASE_DIR, MEDIA_ROOT
reload(sys)
from faceapp.models import face, Faceinfos, FaceinfoForm


def getface(request):
    if request.method=='GET':
        WbAgreementModel = Faceinfos.objects.all()
        cflist = []
        cfdata = {}
        cfdata["coding"] = 1
        cfdata['message'] = 'success'
        for wam in WbAgreementModel:
            wlist = {}
            wlist['name'] = wam.username
            wlist['faceinfo']=wam.fileinfo
            cflist.append(wlist)
        cfdata['data'] = cflist
        return HttpResponse(json.dumps(cfdata, ensure_ascii=False), content_type="application/json")

def posttest(request):
    if request.method=='POST':
        files=request.FILES['fileinfo']
        if not files:
            return HttpResponse("no files for upload!")
        Faceinfos(
            username=request.POST['username'],
            fileinfo=MEDIA_ROOT+'/'+files.name
        ).save()
        f = open(os.path.join('uploads', files.name), 'wb')
        for line in files.chunks():
            f.write(line)
            f.close()
    return HttpResponseRedirect('/face/')

def file_download(request):
    global dirs
    if request.method=='GET':
        dirs=request.GET['dirs']
    def file_iterator(file_name, chunk_size=512):
        with open(file_name) as f:
            while True:
                c = f.read(chunk_size)
                if c:
                    yield c
                else:
                    break

    the_file_name = dirs
    response = StreamingHttpResponse(file_iterator(the_file_name))
    return response

Android代碼,使用Okhttp進行網絡鏈接app

網絡訪問類:ide

public class HttpUtil {
    public static void sendOkHttpRequestPost(String address, RequestBody requestBody, okhttp3.Callback callback) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(address)
                .post(requestBody)
                .build();
        client.newCall(request).enqueue(callback);
    }

    public static void sendOkHttpRequestGET(String address, okhttp3.Callback callback) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(address)
                .build();
        client.newCall(request).enqueue(callback);
    }

}
public class downloadf {
        private static downloadf downloadUtil;
        private final OkHttpClient okHttpClient;
        public static downloadf get() {
            if (downloadUtil == null) {
                downloadUtil = new downloadf();
            }
            return downloadUtil;
        }
        private downloadf() {
            okHttpClient = new OkHttpClient();
        }
        /**
         * @param url 下載鏈接
         * @param saveDir 儲存下載文件的SDCard目錄
         * @param listener 下載監聽
         */
        public void download(final String url, final String saveDir, final OnDownloadListener listener) {
            Request request = new Request.Builder().url(url).build();
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    // 下載失敗
                    listener.onDownloadFailed();
                }
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    InputStream is = null;
                    byte[] buf = new byte[2048];
                    int len = 0;
                    FileOutputStream fos = null;
                    // 儲存下載文件的目錄
                    String savePath = isExistDir(saveDir);
                    try {
                        is = response.body().byteStream();
                        long total = response.body().contentLength();
                        File file = new File(savePath, getNameFromUrl(url));
                        fos = new FileOutputStream(file);
                        long sum = 0;
                        while ((len = is.read(buf)) != -1) {
                            fos.write(buf, 0, len);
                            sum += len;
                            int progress = (int) (sum * 1.0f / total * 100);
                            // 下載中
                            listener.onDownloading(progress);
                        }
                        fos.flush();
                        // 下載完成
                        listener.onDownloadSuccess();
                    } catch (Exception e) {
                        listener.onDownloadFailed();
                    } finally {
                        try {
                            if (is != null)
                                is.close();
                        } catch (IOException e) {
                        }
                        try {
                            if (fos != null)
                                fos.close();
                        } catch (IOException e) {
                        }
                    }
                }
            });
        }

        /**
         * @param saveDir
         * @return
         * @throws IOException
         * 判斷下載目錄是否存在
         */
        private String isExistDir(String saveDir) throws IOException {
            // 下載位置
            File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir);
            if (!downloadFile.mkdirs()) {
                downloadFile.createNewFile();
            }
            String savePath = downloadFile.getAbsolutePath();
            return savePath;
        }

        /**
         * @param url
         * @return
         * 從下載鏈接中解析出文件名
         */
        @NonNull
        private String getNameFromUrl(String url) {
            return url.substring(url.lastIndexOf("/") + 1);
        }

        public interface OnDownloadListener {
            /**
             * 下載成功
             */
            void onDownloadSuccess();

            /**
             * @param progress
             * 下載進度
             */
            void onDownloading(int progress);

            /**
             * 下載失敗
             */
            void onDownloadFailed();
        }
    }

使用:post

MediaType type = MediaType.parse("application/octet-stream");//"text/xml;charset=utf-8"
File file = new File(mDBPath +"/"+name+".data");
            File file1=new File(mDBPath+"/face.txt");
RequestBody fileBody = RequestBody.create(type, file);
RequestBody fileBody1 = RequestBody.create(type, file1);
RequestBody requestBody1 = new MultipartBody.Builder()
      .setType(MultipartBody.FORM)
      .addFormDataPart("username",name)
      .addFormDataPart("fileinfo",name+".data",fileBody)
      .build();

HttpUtil.sendOkHttpRequestPost("http://120.79.51.57:8000/face/posts", requestBody1, new Callback() {
   @Override
   public void onFailure(Call call, IOException e) {
      Log.v("oetrihgdf","失敗");
   }
   @Override
   public void onResponse(Call call, Response response) throws IOException {
      Log.v("oifdhdfg","成功");

   }
});

HttpUtil.sendOkHttpRequestGET("http://120.79.51.57:8000/face/getallface", new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        final String responsedata=response.body().string();
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Gson gson=new Gson();
                Facelist facelist= gson.fromJson(responsedata,new TypeToken<facelist>(){}.getType());
                faces.addAll(facelist.getData());
                Log.v("faceilist",faces.get(0).getFaceinfo());
                for (Face face:faces){
                    Log.v("orihgdofg",face.getFaceinfo());
                    downloadf.get().download("http://120.79.51.57:8000/face/filedown?"+"dir="+face.getFaceinfo(), getExternalCacheDir().getPath(), new downloadf.OnDownloadListener() {
                        @Override
                        public void onDownloadSuccess() {
                            Log.v("jmhfgh","下載完成");
                            //Utils.showToast(MainActivity.this, "下載完成");
                        }
                        @Override
                        public void onDownloading(int progress) {
                            // progressBar.setProgress(progress);
                        }
                        @Override
                        public void onDownloadFailed() {
                            Log.v("jmhfgh","下載失敗");
                            // Utils.showToast(MainActivity.this, "下失敗載失敗");
                        }
                    });
                    FileInputStream fs = null;
                    try {
                        fs = new FileInputStream(getExternalCacheDir().getPath()+"/"+face.getName()+".data");
                        ExtInputStream bos = new ExtInputStream(fs);
                        //load version
                        byte[] version_saved = bos.readBytes();
                        FaceDB.FaceRegist frface = new FaceDB.FaceRegist(face.getName());
                        AFR_FSDKFace fsdkFace = new AFR_FSDKFace(version_saved);
                        frface.mFaceList.add(fsdkFace);
                        mResgist.add(frface);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

    }
});

最後是SDK下載地址:https://ai.arcsoft.com.cn/ucenter/user/reg?utm_source=csdn1&utm_medium=referral</facelist>ui

相關文章
相關標籤/搜索