Найдите разницу между этими двумя изображениями - PullRequest
0 голосов
/ 01 июня 2018

Программно мой код обнаруживает разницу между двумя классами изображений и всегда отклоняет один класс, в то время как всегда допускает другой.

Мне еще предстоит найти какую-либо разницу между изображениями, которые дают ошибку, и изображениями, которые не дают ошибку.Но должна быть некоторая разница, потому что те, которые выдают ошибку, делают это 100% времени, а другие работают как положено 100% времени.

В частности, я проверил формат цвета:RGB в обеих группах;размер: нет заметной разницы;тип данных: uint8 в обоих;величина значений пикселей: одинаковые в обоих случаях.

Ниже приведены два изображения, которые никогда не работают, и два изображения, которые всегда работают:

Как определить разницу?

Сценарий состоит в том, что я использую Firebase с интерфейсом Swift для iOS, чтобы отправлять эти изображения в размещенный в сети Google Cloud ML-engine сервис-коннет.,Некоторые изображения работают постоянно, а некоторые другие никогда не работают так, как указано выше.Кроме того, все образы работают, когда я использую версии gcloud для CLI.Для меня проблема обязательно что-то в изображениях.Поэтому я публикую здесь для группы изображений.Код включен по запросу для полноты.

КОД файла index.js включен:

'use strict';

const functions = require('firebase-functions');
const gcs = require('@google-cloud/storage');
const admin = require('firebase-admin');
const exec = require('child_process').exec;
const path = require('path');
const fs = require('fs');
const google = require('googleapis');
const sizeOf = require('image-size');

admin.initializeApp(functions.config().firebase);
const db = admin.firestore();
const rtdb = admin.database();
const dbRef = rtdb.ref();

function cmlePredict(b64img) {
    return new Promise((resolve, reject) => {
        google.auth.getApplicationDefault(function (err, authClient) {
            if (err) {
                reject(err);
            }
            if (authClient.createScopedRequired && authClient.createScopedRequired()) {
                authClient = authClient.createScoped([
                    'https://www.googleapis.com/auth/cloud-platform'
                ]);
            }

        var ml = google.ml({
           version: 'v1'
        });

        const params = {
            auth: authClient,
            name: 'projects/myproject-18865/models/my_model',
            resource: {
                instances: [
                {
                    "image_bytes": {
                    "b64": b64img
                    }
                }
                ]
            }
        };

        ml.projects.predict(params, (err, result) => {
            if (err) {
                reject(err);
            } else {
                resolve(result);
            }
        });
    });
});
}

function resizeImg(filepath) {
    return new Promise((resolve, reject) => {
        exec(`convert ${filepath} -resize 224x ${filepath}`, (err) => {
          if (err) {
            console.error('Failed to resize image', err);
            reject(err);
          } else {
            console.log('resized image successfully');
            resolve(filepath);
          }
        });
      });
}

exports.runPrediction = functions.storage.object().onChange((event) => {

    fs.rmdir('./tmp/', (err) => {
        if (err) {
            console.log('error deleting tmp/ dir');
        }
    });

const object = event.data;
const fileBucket = object.bucket;
const filePath = object.name;
const bucket = gcs().bucket(fileBucket);
const fileName = path.basename(filePath);
const file = bucket.file(filePath);

if (filePath.startsWith('images/')) {  
    const destination = '/tmp/' + fileName;
    console.log('got a new image', filePath);
    return file.download({
        destination: destination
    }).then(() => {
        if(sizeOf(destination).width > 224) {
            console.log('scaling image down...');
            return resizeImg(destination);
        } else {
            return destination;
        }
    }).then(() => {
        console.log('base64 encoding image...');
        let bitmap = fs.readFileSync(destination);
        return new Buffer(bitmap).toString('base64');
    }).then((b64string) => {
        console.log('sending image to CMLE...');
        return cmlePredict(b64string);
    }).then((result) => {
        console.log(`results just returned and is: ${result}`);  



        let predict_proba = result.predictions[0]

        const res_pred_val = Object.keys(predict_proba).map(k => predict_proba[k])
        const res_val = Object.keys(result).map(k => result[k])

        const class_proba = [1-res_pred_val,res_pred_val]
        const opera_proba_init = 1-res_pred_val
        const capitol_proba_init = res_pred_val-0

        // convert fraction double to percentage int
        let opera_proba = (Math.floor((opera_proba_init.toFixed(2))*100))|0
        let capitol_proba = (Math.floor((capitol_proba_init.toFixed(2))*100))|0
        let feature_list = ["houses", "trees"]


        let outlinedImgPath = '';
        let imageRef = db.collection('predicted_images').doc(filePath.slice(7));
               outlinedImgPath = `outlined_img/${filePath.slice(7)}`;
               imageRef.set({
                image_path: outlinedImgPath,
                opera_proba: opera_proba,
                capitol_proba: capitol_proba
            });

        let predRef = dbRef.child("prediction_categories");
        let arrayRef = dbRef.child("prediction_array");

    predRef.set({
            opera_proba: opera_proba,
            capitol_proba: capitol_proba,
            });

       arrayRef.set({first: {
           array_proba: [opera_proba,capitol_proba],
           brief_description: ["a","b"],
           more_details: ["aaaa","bbbb"],
           feature_list: feature_list},
        zummy1: "",
        zummy2: ""});

        return bucket.upload(destination, {destination: outlinedImgPath});

    });
} else {
    return 'not a new image';
}
}); 

1 Ответ

0 голосов
/ 03 июня 2018

Проблема заключалась в том, что плохие изображения были в градациях серого, а не в RGB, как ожидалось моей моделью.Сначала я проверил это, посмотрев на форму.Но у «плохих» изображений было 3 цветовых канала, каждый из этих 3-х каналов хранил одно и то же число - поэтому моя модель отказывалась их принимать.Кроме того, как и ожидалось, и вопреки тому, что я первоначально думал, что наблюдал, оказывается, что CLI-движок gcloud предсказывает, что CLI фактически не удался для этих изображений.Мне понадобилось 2 дня, чтобы понять это!

...