Question

Je travaille sur un site immobilier et je voudrais écrire un programme qui peut comprendre (classer) si une image est un plan d'étage ou d'un logo de l'entreprise.

Depuis que je suis en train d'écrire en php i préférera une solution php mais tout c ++ ou d'une solution de OpenCV sera bien aussi.

Plan d'étage Exemple:

texte alt http://www.rentingtime.com/uploads /listing/l0050/0000050930/68614.jpg

texte alt http://www.rentingtime.com/uploads /listing/l0031/0000031701/44199.jpg

Logo Exemple:

texte alt http://www.rentingtime.com/uploads /listing/l0091/0000091285/95205.jpg

Était-ce utile?

La solution

Comme toujours, il y a une fonction intégrée de PHP pour cette . Je rigole. =)

Tous les plans d'étage, je l'ai vu, ils sont assez monochrome, je pense que vous pouvez jouer avec le nombre de couleurs et la saturation des couleurs pour avoir une assez bonne estimation est l'image est un logo ou un plan d'étage.

.: is the image has less than 2 or 3 colors is a floor plan. par exemple

.: if the sum / average of the saturation is less than X it's a floor plan. par exemple

Noir et blanc (et d'autres couleurs semblables qui sont utilisés dans les plans de sol) ont une saturation qui est égal à zéro, ou très proche de zéro, alors que les logos ont tendance à être plus visuellement attrayant, utilisez donc des couleurs plus saturées.

Voici une fonction simple pour calculer la saturation d'une couleur RGB Hex:

function Saturation($color)
{
    $color = array_map('hexdec', str_split($color, 2));

    if (max($color) > 0)
    {
        return (max($color) - min($color)) / max($color);
    }

    return 0;
}

var_dump(Saturation('000000')); // black    0.0000000000000000
var_dump(Saturation('FFFFFF')); // white    0.0000000000000000
var_dump(Saturation('818185')); // grey     0.0300751879699249
var_dump(Saturation('5B9058')); // green    0.3888888888888889
var_dump(Saturation('DE1C5F')); // pink     0.8738738738738738
var_dump(Saturation('FE7A15')); // orange   0.9173228346456692
var_dump(Saturation('FF0000')); // red      1.0000000000000000
var_dump(Saturation('80FF80')); // ---      0.4980392156862745
var_dump(Saturation('000080')); // ---      1.0000000000000000

Utilisation imagecolorat () et

Autres conseils

Il peut être plus facile d'externaliser ce à l'homme.

Si vous avez un budget, pensez Mechanical Turk d'Amazon . Voir Wikipedia pour une description générale .

Sinon, vous pouvez faire vous-même la sous-traitance. Ecrire un script PHP pour afficher un de vos images et invite l'utilisateur à trier soit comme un « logo » notre « floorplan. » Une fois que vous avez cette course sur un serveur web, envoyez votre bureau en entier et demander à chacun de trier 20 images comme une faveur personnelle.

Mieux encore, en font un contest-- la personne qui trie les images les plus remportera un iPod!

Peut-être plus simplement, inviter tout le monde que vous connaissez sur la pizza et la bière et la configuration d'un groupe d'ordinateurs portables et de mettre tout le monde à passer quelques minutes de tri.

Il existe des moyens logiciels pour accomplir votre tâche, mais si elle est un événement unique avec moins de quelques milliers d'images et d'un budget d'au moins quelques centaines de dollars, que je pense que votre vie peut être plus facile en utilisant les humains.

L'une des premières choses qui vient à l'esprit est le fait que les plans d'étage ont tendance à avoir des lignes beaucoup plus orientées à 90 degrés que tout logo normale serait.

Un premier passage rapide serait d'exécuter détection de bord de Canny sur l'image et le vote sur les angles à l'aide d'un transformation de Hough et la définition rho, Theta d'une ligne. Si vous voyez une correspondance très forte pour Theta = (0, 90, 180, 270) sommé sur rho, vous pouvez classer l'image en tant que plan d'étage.

Une autre option serait de marcher l'image de bord après l'étape Canny à ne compter que les votes des segments de ligne longs et continus,, la suppression du bruit.

Je doute fortement un tel outil existe déjà, et de créer quoi que ce soit précis serait non négligeable. Si votre besoin est de trier un ensemble d'images existantes (par exemple, vous avez un répertoire non triés), alors vous pourriez être en mesure d'écrire un outil « assez bon » et gérer manuellement les échecs. Si vous avez besoin de faire cela de façon dynamique avec de nouvelles images, il est probablement une mauvaise approche.

Si je devais tenter cela pour le premier cas, je chercherais probablement quelque chose trivialement différent, je peux l'utiliser comme proxy. Sont des plans d'étage généralement beaucoup plus grand que les logos (soit dans la taille du fichier ou dimensions de l'image)? Est-ce que les plans d'étage ont moins de couleurs puis un logo? Si je peux obtenir une précision de 75% en utilisant quelque chose de trivial, il est probablement le chemin à parcourir.

Des trucs comme cela - recoginition des modèles en images -. A tendance à être horriblement cher en termes de temps, horriblement peu fiables et dans le besoin constant de mise à jour et de correction pour correspondre à de nouveaux cas

Puis-je demander pourquoi vous avez besoin de faire cela? N'y at-il un point dans le flux de travail de votre site Web où il pourrait être déterminé manuellement si une image est un logo ou un plan d'étage? Ne serait-il plus facile d'écrire une application qui permet aux utilisateurs de déterminer qui est qui, au moment du téléchargement? Pourquoi est-il un ensemble mixte de données en premier lieu?

En dépit de penser que c'est quelque chose qui nécessite une intervention manuelle, une chose que vous pouvez faire est de vérifier la taille de l'image.

Un petit (à la fois en termes de dimensions et Mo) image est susceptible d'être un logo.

Un grand (tant en termes de dimensions et Mo) image est susceptible d'être un floorplan.

Cependant, ce ne serait une mesure de probabilité et en aucun cas à toute épreuve.

Le type d'image est également un indicateur, mais moins d'un an. Les logos sont plus susceptibles d'être JPG, PNG ou GIF, floorplans sont peut-être vont être TIFF ou tout autre format sans perte - mais ce n'est pas garantie

.

Une simple tentative non-tête, je voudrais tout d'abord essayer serait d'utiliser SVM pour apprendre les points clés EIPD obtenus à partir des échantillons. Mais avant de pouvoir le faire, vous avez besoin d'étiqueter un petit sous-ensemble des images, en lui donnant soit -1 (un plan) ou 1 (un logo). si une image a plus de points clés classés comme un plan d'étage, alors il doit être un plan de masse, si elle a plus de points clés classés comme un logo alors il doit être un logo. Dans Computer Vision, ceci est connu comme l'approche sac de-caractéristiques, aussi l'une des méthodes les plus simples autour. Des méthodes plus complexes donnera probablement de meilleurs résultats, mais cela est un bon début.

Comme d'autres l'ont dit, une telle reconnaissance d'image est généralement horriblement complexe. Oubliez PHP.

Cependant, regardant par-dessus vos échantillons, je vois un critère qui peut très bien et serait assez facile à mettre en œuvre si elle a fait:

Exécuter l'image grâce à une bonne OCR, voir ce que les chaînes pop out. Si vous trouvez un tas de mots qui décrivent les chambres ou les caractéristiques ...

Je Réorienter l'image de 90 degrés et essayez à nouveau d'attraper des étiquettes verticales.

Edit: Puisque vous dites que vous avez essayé et cela ne peut-être fonctionne pas, vous devez nettoyer le désordre en premier. Couper l'image vers le haut en fonction des espaces. Exécutez l'OCR contre chaque sous-image dans le cas où il devient foiré en essayant d'analyser les lignes. Vous pouvez tester manuellement en utilisant un éditeur d'image pour le découper en tranches vers le haut.

Utilisez les deux saturation des couleurs et taille de l'image (à la fois suggéré séparément dans les réponses précédentes). Utilisez un grand échantillon de chiffres classés humains et de voir comment ils tracent dans l'espace 2-D (taille x saturation) décident alors où mettre la limite. Les besoins limites ne soient pas une ligne droite, mais ne font pas trop de rebondissements essayer de faire tous les points en forme, ou vous serez « memoryzing » l'échantillon au détriment des nouvelles données. Mieux vaut trouver une limite relativement simple qui correspond à la plupart des échantillons, et il devrait compatibles avec la plupart des données.

Vous devez tolérer une certaine erreur. Une solution à toute épreuve à cela est impossible. Que faire si je choisis un floorplan comme logo de mon entreprise? (Ce n'est pas une blague, il arrive juste d'être drôle)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top