ওপেন সিভি ফেস রিকগনিশন সঠিক নয়


13

আমার অ্যাপ্লিকেশনটিতে আমি ওপেন সিভি ব্যবহার করে নির্দিষ্ট চিত্রটিতে মুখের স্বীকৃতি দেওয়ার চেষ্টা করছি, প্রথমে আমি একটি চিত্র প্রশিক্ষণ দিচ্ছি এবং তারপরে সেই চিত্রটি প্রশিক্ষণ দেওয়ার পরে যদি আমি সেই চিত্রটিতে মুখের স্বীকৃতি চালাই তবে এটি সফলভাবে সেই প্রশিক্ষিত মুখটিকে চিনতে পারে। যাইহোক, আমি একই ব্যক্তির অন্য কোনও ছবিতে যখন স্বীকৃতি কার্যকর হয় না। এটি কেবল প্রশিক্ষিত চিত্রটিতে কাজ করে, তাই আমার প্রশ্নটি কীভাবে আমি এটি সংশোধন করব?

আপডেট: আমি যা করতে চাই তা হ'ল ব্যবহারকারীর স্টোরেজ থেকে কোনও ব্যক্তির চিত্র নির্বাচন করা উচিত এবং তারপরে সেই নির্বাচিত চিত্রটি প্রশিক্ষণের পরে আমি স্টোরেজ থেকে সমস্ত চিত্র আনতে চাই যা আমার প্রশিক্ষিত চিত্রটির সাথে মেলে

এখানে আমার ক্রিয়াকলাপ ক্লাস:

public class MainActivity extends AppCompatActivity {
    private Mat rgba,gray;
    private CascadeClassifier classifier;
    private MatOfRect faces;
    private ArrayList<Mat> images;
    private ArrayList<String> imagesLabels;
    private Storage local;
    ImageView mimage;
    Button prev,next;
    ArrayList<Integer> imgs;
    private int label[] = new int[1];
    private double predict[] = new double[1];
    Integer pos = 0;
    private String[] uniqueLabels;
    FaceRecognizer recognize;
    private boolean trainfaces() {
        if(images.isEmpty())
            return false;
        List<Mat> imagesMatrix = new ArrayList<>();
        for (int i = 0; i < images.size(); i++)
            imagesMatrix.add(images.get(i));
        Set<String> uniqueLabelsSet = new HashSet<>(imagesLabels); // Get all unique labels
        uniqueLabels = uniqueLabelsSet.toArray(new String[uniqueLabelsSet.size()]); // Convert to String array, so we can read the values from the indices

        int[] classesNumbers = new int[uniqueLabels.length];
        for (int i = 0; i < classesNumbers.length; i++)
            classesNumbers[i] = i + 1; // Create incrementing list for each unique label starting at 1
        int[] classes = new int[imagesLabels.size()];
        for (int i = 0; i < imagesLabels.size(); i++) {
            String label = imagesLabels.get(i);
            for (int j = 0; j < uniqueLabels.length; j++) {
                if (label.equals(uniqueLabels[j])) {
                    classes[i] = classesNumbers[j]; // Insert corresponding number
                    break;
                }
            }
        }
        Mat vectorClasses = new Mat(classes.length, 1, CvType.CV_32SC1); // CV_32S == int
        vectorClasses.put(0, 0, classes); // Copy int array into a vector

        recognize = LBPHFaceRecognizer.create(3,8,8,8,200);
        recognize.train(imagesMatrix, vectorClasses);
        if(SaveImage())
            return true;

        return false;
    }
    public void cropedImages(Mat mat) {
        Rect rect_Crop=null;
        for(Rect face: faces.toArray()) {
            rect_Crop = new Rect(face.x, face.y, face.width, face.height);
        }
        Mat croped = new Mat(mat, rect_Crop);
        images.add(croped);
    }
    public boolean SaveImage() {
        File path = new File(Environment.getExternalStorageDirectory(), "TrainedData");
        path.mkdirs();
        String filename = "lbph_trained_data.xml";
        File file = new File(path, filename);
        recognize.save(file.toString());
        if(file.exists())
            return true;
        return false;
    }

    private BaseLoaderCallback callbackLoader = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch(status) {
                case BaseLoaderCallback.SUCCESS:
                    faces = new MatOfRect();

                    //reset
                    images = new ArrayList<Mat>();
                    imagesLabels = new ArrayList<String>();
                    local.putListMat("images", images);
                    local.putListString("imagesLabels", imagesLabels);

                    images = local.getListMat("images");
                    imagesLabels = local.getListString("imagesLabels");

                    break;
                default:
                    super.onManagerConnected(status);
                    break;
            }
        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        if(OpenCVLoader.initDebug()) {
            Log.i("hmm", "System Library Loaded Successfully");
            callbackLoader.onManagerConnected(BaseLoaderCallback.SUCCESS);
        } else {
            Log.i("hmm", "Unable To Load System Library");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, callbackLoader);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        prev = findViewById(R.id.btprev);
        next = findViewById(R.id.btnext);
        mimage = findViewById(R.id.mimage);
       local = new Storage(this);
       imgs = new ArrayList();
       imgs.add(R.drawable.jonc);
       imgs.add(R.drawable.jonc2);
       imgs.add(R.drawable.randy1);
       imgs.add(R.drawable.randy2);
       imgs.add(R.drawable.imgone);
       imgs.add(R.drawable.imagetwo);
       mimage.setBackgroundResource(imgs.get(pos));
        prev.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(pos!=0){
                  pos--;
                  mimage.setBackgroundResource(imgs.get(pos));
                }
            }
        });
        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(pos<5){
                    pos++;
                    mimage.setBackgroundResource(imgs.get(pos));
                }
            }
        });
        Button train = (Button)findViewById(R.id.btn_train);
        train.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
            @Override
            public void onClick(View view) {
                rgba = new Mat();
                gray = new Mat();
                Mat mGrayTmp = new Mat();
                Mat mRgbaTmp = new Mat();
                classifier = FileUtils.loadXMLS(MainActivity.this);
                Bitmap icon = BitmapFactory.decodeResource(getResources(),
                        imgs.get(pos));
                Bitmap bmp32 = icon.copy(Bitmap.Config.ARGB_8888, true);
                Utils.bitmapToMat(bmp32, mGrayTmp);
                Utils.bitmapToMat(bmp32, mRgbaTmp);
                Imgproc.cvtColor(mGrayTmp, mGrayTmp, Imgproc.COLOR_BGR2GRAY);
                Imgproc.cvtColor(mRgbaTmp, mRgbaTmp, Imgproc.COLOR_BGRA2RGBA);
                /*Core.transpose(mGrayTmp, mGrayTmp); // Rotate image
                Core.flip(mGrayTmp, mGrayTmp, -1); // Flip along both*/
                gray = mGrayTmp;
                rgba = mRgbaTmp;
                Imgproc.resize(gray, gray, new Size(200,200.0f/ ((float)gray.width()/ (float)gray.height())));
                if(gray.total() == 0)
                    Toast.makeText(getApplicationContext(), "Can't Detect Faces", Toast.LENGTH_SHORT).show();
                classifier.detectMultiScale(gray,faces,1.1,3,0|CASCADE_SCALE_IMAGE, new Size(30,30));
                if(!faces.empty()) {
                    if(faces.toArray().length > 1)
                        Toast.makeText(getApplicationContext(), "Mutliple Faces Are not allowed", Toast.LENGTH_SHORT).show();
                    else {
                        if(gray.total() == 0) {
                            Log.i("hmm", "Empty gray image");
                            return;
                        }
                        cropedImages(gray);
                        imagesLabels.add("Baby");
                        Toast.makeText(getApplicationContext(), "Picture Set As Baby", Toast.LENGTH_LONG).show();
                        if (images != null && imagesLabels != null) {
                            local.putListMat("images", images);
                            local.putListString("imagesLabels", imagesLabels);
                            Log.i("hmm", "Images have been saved");
                            if(trainfaces()) {
                                images.clear();
                                imagesLabels.clear();
                            }
                        }
                    }
                }else {
                   /* Bitmap bmp = null;
                    Mat tmp = new Mat(250, 250, CvType.CV_8U, new Scalar(4));
                    try {
                        //Imgproc.cvtColor(seedsImage, tmp, Imgproc.COLOR_RGB2BGRA);
                        Imgproc.cvtColor(gray, tmp, Imgproc.COLOR_GRAY2RGBA, 4);
                        bmp = Bitmap.createBitmap(tmp.cols(), tmp.rows(), Bitmap.Config.ARGB_8888);
                        Utils.matToBitmap(tmp, bmp);
                    } catch (CvException e) {
                        Log.d("Exception", e.getMessage());
                    }*/
                    /*    mimage.setImageBitmap(bmp);*/
                    Toast.makeText(getApplicationContext(), "Unknown Face", Toast.LENGTH_SHORT).show();
                }
            }
        });
        Button recognize = (Button)findViewById(R.id.btn_recognize);
        recognize.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(loadData())
                    Log.i("hmm", "Trained data loaded successfully");
                rgba = new Mat();
                gray = new Mat();
                faces = new MatOfRect();
                Mat mGrayTmp = new Mat();
                Mat mRgbaTmp = new Mat();
                classifier = FileUtils.loadXMLS(MainActivity.this);
                Bitmap icon = BitmapFactory.decodeResource(getResources(),
                        imgs.get(pos));
                Bitmap bmp32 = icon.copy(Bitmap.Config.ARGB_8888, true);
                Utils.bitmapToMat(bmp32, mGrayTmp);
                Utils.bitmapToMat(bmp32, mRgbaTmp);
                Imgproc.cvtColor(mGrayTmp, mGrayTmp, Imgproc.COLOR_BGR2GRAY);
                Imgproc.cvtColor(mRgbaTmp, mRgbaTmp, Imgproc.COLOR_BGRA2RGBA);
                /*Core.transpose(mGrayTmp, mGrayTmp); // Rotate image
                Core.flip(mGrayTmp, mGrayTmp, -1); // Flip along both*/
                gray = mGrayTmp;
                rgba = mRgbaTmp;
                Imgproc.resize(gray, gray, new Size(200,200.0f/ ((float)gray.width()/ (float)gray.height())));
                if(gray.total() == 0)
                    Toast.makeText(getApplicationContext(), "Can't Detect Faces", Toast.LENGTH_SHORT).show();
                classifier.detectMultiScale(gray,faces,1.1,3,0|CASCADE_SCALE_IMAGE, new Size(30,30));
                if(!faces.empty()) {
                    if(faces.toArray().length > 1)
                        Toast.makeText(getApplicationContext(), "Mutliple Faces Are not allowed", Toast.LENGTH_SHORT).show();
                    else {
                        if(gray.total() == 0) {
                            Log.i("hmm", "Empty gray image");
                            return;
                        }
                        recognizeImage(gray);
                    }
                }else {
                    Toast.makeText(getApplicationContext(), "Unknown Face", Toast.LENGTH_SHORT).show();
                }
            }
        });


    }
    private void recognizeImage(Mat mat) {
        Rect rect_Crop=null;
        for(Rect face: faces.toArray()) {
            rect_Crop = new Rect(face.x, face.y, face.width, face.height);
        }
        Mat croped = new Mat(mat, rect_Crop);
        recognize.predict(croped, label, predict);
        int indice = (int)predict[0];
        Log.i("hmmcheck:",String.valueOf(label[0])+" : "+String.valueOf(indice));
        if(label[0] != -1 && indice < 125)
            Toast.makeText(getApplicationContext(), "Welcome "+uniqueLabels[label[0]-1]+"", Toast.LENGTH_SHORT).show();
        else
            Toast.makeText(getApplicationContext(), "You're not the right person", Toast.LENGTH_SHORT).show();
    }
    private boolean loadData() {
        String filename = FileUtils.loadTrained();
        if(filename.isEmpty())
            return false;
        else
        {
            recognize.read(filename);
            return true;
        }
    }
}

আমার ফাইল ইউটিস ক্লাস:

   public class FileUtils {
        private static String TAG = FileUtils.class.getSimpleName();
        private static boolean loadFile(Context context, String cascadeName) {
            InputStream inp = null;
            OutputStream out = null;
            boolean completed = false;
            try {
                inp = context.getResources().getAssets().open(cascadeName);
                File outFile = new File(context.getCacheDir(), cascadeName);
                out = new FileOutputStream(outFile);

                byte[] buffer = new byte[4096];
                int bytesread;
                while((bytesread = inp.read(buffer)) != -1) {
                    out.write(buffer, 0, bytesread);
                }

                completed = true;
                inp.close();
                out.flush();
                out.close();
            } catch (IOException e) {
                Log.i(TAG, "Unable to load cascade file" + e);
            }
            return completed;
        }
        public static CascadeClassifier loadXMLS(Activity activity) {


            InputStream is = activity.getResources().openRawResource(R.raw.lbpcascade_frontalface);
            File cascadeDir = activity.getDir("cascade", Context.MODE_PRIVATE);
            File mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface_improved.xml");
            FileOutputStream os = null;
            try {
                os = new FileOutputStream(mCascadeFile);
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = is.read(buffer)) != -1) {
                    os.write(buffer, 0, bytesRead);
                }
                is.close();
                os.close();

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


            return new CascadeClassifier(mCascadeFile.getAbsolutePath());
        }
        public static String loadTrained() {
            File file = new File(Environment.getExternalStorageDirectory(), "TrainedData/lbph_trained_data.xml");

            return file.toString();
        }
    }

এই চিত্রগুলি আমি এখানে তুলনা করতে চেষ্টা করছি ব্যক্তির চেহারা এখনও স্বীকৃতি হিসাবে এটি মিলছে না! ছবি 1 ছবি 2


আমি যখন অটোমেটিক উপস্থিতি সিস্টেমের জন্য আমার চূড়ান্ত বছরের অ্যাসাইনমেন্টটি তৈরি করেছি, তখন শ্রেণিবদ্ধকে প্রশিক্ষণ দেওয়ার জন্য আমি নিজের 8-10 চিত্রগুলি কিছুটা ভিন্ন পোজ এবং আলোক শর্তের সাথে ব্যবহার করেছি।
জেডডিআর

আপনি এই প্রয়োজনীয়তাটি পরিচালনা করতে অনুভূমিকভাবে আপনার প্রশিক্ষণ চিত্রের সাদাকে ফ্লিপ করতে পারেন।
nfl-x

@ এনএফএল-এক্স ফ্লিপিং ইমেজগুলি নির্ভুলতার সমস্যার সমাধান করবে না আমাদের টেনস্রফ্লো সম্পর্কে সাম্প্রতিক আরও ভাল উত্তর প্রয়োজন ঠিক আছে তবে এটি অ্যান্ড্রয়েডের জন্য বাস্তবায়নের বিষয়ে পর্যাপ্ত তথ্য বা টিউটোরিয়াল উপলব্ধ নেই তাই আমাদের সেরা অনুমান এই পোস্টটিতে ভোট দেওয়া চালিয়ে যাওয়া যেমন কোনও বিশেষজ্ঞ হস্তক্ষেপ করতে এবং অ্যান্ড্রয়েডের জন্য একটি সঠিক সমাধান সরবরাহ করতে পারে
মিঃ প্যাটেল

উত্তর:


5

হালনাগাদ

প্রশ্নের নতুন সম্পাদনা অনুসারে, ফ্লাইতে নতুন লোকদের সনাক্ত করার জন্য আপনার এমন একটি উপায়ের প্রয়োজন রয়েছে যাদের মডেলটির প্রশিক্ষণ পর্বের সময় ছবিগুলি পাওয়া যায় নি। এই কাজগুলিকে কয়েকটি শট লার্নিং বলা হয় । এটি সিসিটিভি ক্যামেরা ফুটেজ ব্যবহার করে তাদের লক্ষ্যগুলি খুঁজে পেতে গোয়েন্দা সংস্থা / পুলিশ এজেন্সিগুলির প্রয়োজনীয়তার সাথে সমান। সাধারণত প্রশিক্ষণের সময় নির্দিষ্ট লক্ষ্যের পর্যাপ্ত চিত্র থাকে না, তারা ফেসনেটের মতো মডেল ব্যবহার করে । আমি সত্যিই কাগজটি পড়ার পরামর্শ দিই, তবে আমি এর কয়েকটি হাইলাইট এখানে ব্যাখ্যা করছি:

  • সাধারণত, শ্রেণিবদ্ধের শেষ স্তরটি হ'ল শূন্যের সমান উপাদানের N-1 সহ একটি * 1 ভেক্টর এবং 1 এর কাছাকাছি উপাদানটি ইনপুটটির লেবেল সম্পর্কে শ্রেণিবদ্ধের পূর্বাভাস নির্ধারণ করে। সাধারণ সিএনএন আর্কিটেকচার
  • লেখকরা বুঝতে পেরেছিলেন যে তারা যদি মুখের বিশাল ডেটাসেটে নির্দিষ্ট ক্ষতি ফাংশন সহ কোনও শ্রেণিবদ্ধকারী নেটওয়ার্ককে প্রশিক্ষণ দেয় তবে আপনি যে কোনও মুখের উপস্থাপনা হিসাবে সেমি-ফাইনাল স্তর আউটপুটটি ব্যবহার করতে পারেন, তা প্রশিক্ষণ সেটে থাকুক বা না থাকুক, লেখকগণ এই ভেক্টরটিকে ফেস এম্বেডিং বলে
  • পূর্ববর্তী ফলাফলের অর্থ হ'ল খুব দক্ষ প্রশিক্ষিত ফেসনেট মডেল দিয়ে আপনি যে কোনও মুখকে ভেক্টরে সংক্ষিপ্ত করতে পারেন। এই পদ্ধতির খুব আকর্ষণীয় বৈশিষ্ট্যটি হ'ল বিভিন্ন কোণ / অবস্থান / রাজ্যে নির্দিষ্ট ব্যক্তির মুখের ভেক্টরগুলি ইউক্যালিডিয়ান স্পেসের নিকটবর্তী (এই সম্পত্তিটি লেখকরা যে ক্ষতির কাজটি বেছে নিয়েছিলেন তার দ্বারা প্রয়োগ করা হয়)।এখানে চিত্র বর্ণনা লিখুন
  • সংক্ষেপে, আপনার কাছে একটি মডেল রয়েছে যা ইনপুট হিসাবে মুখ পেয়ে এবং ভেক্টরগুলি ফেরত দেয়। একে অপরের নিকটবর্তী ভেক্টরগুলি একই ব্যক্তির সাথে সম্পর্কিত বলে খুব সম্ভবত (আপনি কেএনএন বা কেবল সাধারণ ইউক্যালিডিয়ান দূরত্ব ব্যবহার করতে পারেন তা পরীক্ষা করার জন্য)।

ফেসনেটের একটি বাস্তবায়ন এখানে পাওয়া যাবে । আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আসলে কী কাজ করছেন তা জানতে আপনার কম্পিউটারে এটি চালানোর চেষ্টা করুন। এর পরে, নিম্নলিখিতগুলি করা ভাল হতে পারে:

  1. সংগ্রহস্থলীতে উল্লিখিত ফেসনেট মডেলটিকে তার টিফ্লাইট সংস্করণে রূপান্তর করুন ( এই ব্লগপোস্ট সাহায্য করতে পারে)
  2. ব্যবহারকারীর দ্বারা জমা দেওয়া প্রতিটি ছবির জন্য, মুখগুলি বের করতে ফেস এপিআই ব্যবহার করুন
  3. এক্সট্রাক্ট করা মুখের এম্বেডিংগুলি পেতে আপনার অ্যাপ্লিকেশনটিতে সংক্ষিপ্ত মডেলটি ব্যবহার করুন।
  4. ফটোতে মুখের জন্য ভেক্টর পেয়ে ব্যবহারকারীর গ্যালারীটিতে সমস্ত চিত্র প্রসেস করুন।
  5. তারপরে স্টেপ ৪-তে পাওয়া প্রতিটি ভেক্টরকে ম্যাচগুলি পেতে স্টিপি 3-তে পাওয়া প্রতিটি ভেক্টরের সাথে তুলনা করুন।

আসল উত্তর

আপনি মেশিন লার্নিংয়ের অন্যতম প্রচলিত চ্যালেঞ্জ পেরিয়ে এসেছেন: ওভারফিটিং। মুখ সনাক্তকরণ এবং স্বীকৃতি হ'ল নিজস্ব গবেষণার একটি বিশাল ক্ষেত্র এবং প্রায় সমস্ত যুক্তিসঙ্গতভাবে সঠিক মডেলগুলি একরকম গভীর শিখন ব্যবহার করছে। নোট করুন যে এমনকি কোনও মুখের সঠিকভাবে সনাক্তকরণ যতটা সহজ মনে হচ্ছে তত সহজ নয়, তবে, আপনি অ্যান্ড্রয়েডে যেমন করছেন, আপনি এই কাজের জন্য ফেস এপিআই ব্যবহার করতে পারেন । (অন্যান্য আরও উন্নত কৌশল যেমন এমটিসিএনএন হ্যান্ডসেটে স্থাপন করা খুব ধীর / কঠিন) এটি দেখানো হয়েছে যে কেবলমাত্র প্রচুর ব্যাকগ্রাউন্ড শোরগোল বা ভিতরে থাকা একাধিক ব্যক্তির সাথে মুখের ফটো দিয়ে মডেলটিকে খাওয়ানো কাজ করে না। সুতরাং, আপনি সত্যিই এই পদক্ষেপ এড়াতে পারবেন না।

ব্যাকগ্রাউন্ড থেকে প্রার্থীর লক্ষ্যবস্তুগুলির একটি সুন্দর ছাঁটাইযুক্ত মুখ পাওয়ার পরে, আপনাকে সনাক্ত করা মুখগুলি সনাক্ত করার চ্যালেঞ্জটি কাটিয়ে উঠতে হবে। আবার আমার জ্ঞানের সেরা সমস্ত দক্ষ মডেলরা কিছুটা গভীর শিখন / কনভোলশনাল নিউরাল নেটওয়ার্ক ব্যবহার করছে। একটি মোবাইল ফোনে এগুলি ব্যবহার করা একটি চ্যালেঞ্জ, তবে টেনসরফ্লো লাইটের জন্য আপনি এগুলিকে খাটো করতে এবং এটিকে আপনার অ্যাপের মধ্যে চালাতে পারেন। অ্যান্ড্রয়েড ফোনগুলিতে মুখের স্বীকৃতি সম্পর্কিত একটি প্রকল্প যা আমি কাজ করেছি তা এখানে আপনি পরীক্ষা করতে পারেন। মনে রাখবেন যে কোনও ভাল মডেলকে লেবেলযুক্ত ডেটার অসংখ্য উদাহরণে প্রশিক্ষণ দেওয়া উচিত, তবে মুখগুলি বা অন্যান্য চিত্র সনাক্তকরণের কাজগুলির বৃহত ডেটাসেটগুলিতে ইতিমধ্যে প্রশিক্ষিত মডেলগুলির আধিক্য রয়েছে, তাদের ঝাঁকানো এবং তাদের বিদ্যমান জ্ঞানটি ব্যবহার করার জন্য, আমরা নিয়োগ করতে পারিস্থানান্তর শেখার , বস্তুর সনাক্তকরণ এবং স্থানান্তর শেখার যে ঘনিষ্ঠভাবে আপনার ক্ষেত্রে সম্পর্কযুক্ত পরীক্ষা উপর একটি দ্রুত শুরুর জন্য এই ব্লগ পোস্টে।

সামগ্রিকভাবে, আপনাকে এমন মুখগুলির বিভিন্ন উদাহরণ পেতে হবে যা আপনি পছন্দ করেন না এমন বহু লোকের মুখোমুখি চিত্রগুলি সনাক্ত করতে চান, তারপরে আপনাকে উপরে বর্ণিত সংস্থানগুলির উপর ভিত্তি করে একটি মডেল প্রশিক্ষণ দিতে হবে এবং তারপরে আপনাকে প্রয়োজন এটির আকার হ্রাস করতে এবং এটি আপনার অ্যাপ্লিকেশনের মধ্যে এম্বেড করতে টেনসরফ্লো লাইট ব্যবহার করুন। তারপরে প্রতিটি ফ্রেমের জন্য, আপনি মডেলটিতে অ্যান্ড্রয়েড ফেস এপিআই এবং ফিড (সম্ভবত সনাক্ত হওয়া মুখ) কল করুন এবং ব্যক্তিকে সনাক্ত করুন।

বিলম্বের জন্য আপনার সহনশীলতার স্তরের উপর নির্ভর করে এবং প্রশিক্ষণের সেট আকার এবং লক্ষ্যগুলির সংখ্যার উপর নির্ভর করে আপনি বিভিন্ন ফলাফল পেতে পারেন তবে আপনার% মাত্র কয়েক জন লোক থাকলে% 90 + নির্ভুলতা সহজেই অর্জনযোগ্য।


আমি আমার অ্যাপ্লিকেশনটিতে নেটওয়ার্ক সংযোগটি ব্যবহার করতে চাই না তাই গুগল ক্লাউড ভিশন প্রশ্নবিদ্ধ নয় তবে টেনসর ফ্লো লাইটটি বেশ আকর্ষণীয় বলে মনে হচ্ছে এটি কি নিখরচায়? এবং যদি আপনি এটির একটি কার্যকরী উদাহরণ সরবরাহ করতে পারেন তবে আমি এটির প্রশংসা করব! ধন্যবাদ
আর.কোডার

দারুণ উত্তর!
আর.কোডার

এটা বিনামূল্যে. পরীক্ষা করে দেখুন এই ওয়ার্কিং উদাহরণস্বরূপ। ব্যবহারকারীর অভিজ্ঞতার দিকটিতে কিছু বিভ্রান্তি থাকলেও আমরা খুব উচ্চ নির্ভুলতার সাথে নেটওয়ার্ক সংযোগ ব্যবহার না করেই 225 জনের মুখ সনাক্ত করতে সক্ষম হয়েছি। তবে এটি একটি ভাল লাথি বন্ধ করা উচিত।
ফারজাদ ভার্টিগো

ঠিক আছে আমি এটি দিয়ে চেষ্টা করব
আর.কোডার

1
এটা কাজ করেছে!!!! আমি অবশেষে সেই মুখের নেট মডেল টিফ্লাইট বের করেছিলাম এবং একক প্রশিক্ষিত চিত্রের উপর 80% নির্ভুলতা পেয়েছি। তবে সময়ের জটিলতা সত্যিই বিশাল !!, দুটি চিত্রের তুলনা করার জন্য এটি কীভাবে হ্রাস করতে হবে সে সম্পর্কে নূন্যতম 5 থেকে 6 সেকেন্ড সময় লাগে?
আর.কোডার

2

যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনি একক চিত্র সহ শ্রেণিবদ্ধকে প্রশিক্ষণ দিচ্ছেন। সেক্ষেত্রে এই একটি নির্দিষ্ট চিত্র হ'ল শ্রেণিবদ্ধকারী যে কোনও সময় সনাক্ত করতে সক্ষম হবে। আপনার একই চিত্রের লক্ষণীয়ভাবে বড় প্রশিক্ষণের সেট লাগবে, খুব কমপক্ষে 5 বা 10 ভিন্ন চিত্রের মতো কিছু।


কীভাবে এটি করবেন তার কোনও উদাহরণ আছে?
আর.কোডার

হ্যাঁ আমি একক স্থিতিশীল চিত্রটিতে মুখের স্বীকৃতিটি দিচ্ছি
আর.কোডার

কীভাবে ব্যবহার করবেন তার উদাহরণের জন্য এখানে দেখুন train(): docs.opencv.org/3.4/dd/d65/…
ফ্লোরিয়ান ইকলার

এই উত্তরটি সাহায্য করে না যদি আপনি অ্যান্ড্রয়েড সম্পর্কিত কিছু কোডেড উদাহরণ সরবরাহ করতে পারেন তবে এটি আরও ভাল হবে!
কোডার

0

1) এলবিপিআরসিগনাইজারকে -> এলবিপিএইচবিসরেগনাইজার (1, 8, 8, 8, 100) থেকে শুরু করার সময় প্রান্তিক মান পরিবর্তন করুন

2) প্রতিটি মুখকে কমপক্ষে 2-3 টি ছবি দিয়ে প্রশিক্ষণ দিন যেহেতু এই সনাক্তকারীরা মূলত তুলনায় কাজ করে

3) স্বীকৃতি দেওয়ার সময় নির্ভুলতার প্রান্তিক সেট করুন। এরকম কিছু করুন:

//predicting result
// LoadData is a static class that contains trained recognizer
// _result is the gray frame image captured by the camera
LBPHFaceRecognizer.PredictionResult ER = LoadData.recog.Predict(_result);
int temp_result = ER.Label;

imageBox1.SizeMode = PictureBoxSizeMode.StretchImage;
imageBox1.Image = _result.Mat;

//Displaying predicted result on screen
// LBPH returns -1 if face is recognized
if ((temp_result != -1) && (ER.Distance < 55)){  
     //I get best accuracy at 55, you should try different values to determine best results
     // Do something with detected image
}

আচ্ছা আপনি কি আমার বর্তমান কোডটি সম্পাদনা করতে পারেন এবং জাভাতে এটি করার জন্য একটি কার্যকরী উদাহরণ সরবরাহ করতে পারেন?
আর.কোডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.