2021

Oct 10, 2021

My Style'Z web app [Style transfer in action]


 Sometimes you start playing with an idea, time passes and you end up with a project that you need to finish.

I am sure this is not the case with most people, however this describes perfectly the process with which I've made the StyleZ app.

I have always been fascinated by the applications where neural networks are used, outside of the traditional context. One of the ideas that were proposed to utilize such technology is style transfer.


The Scream by Edvard Munch



In this post, I will explain the steps I followed to implement and deploy a Neural Network Style Transfer App. The ideas is not to make a technical post, but to lay out the process to take a very small project from an idea to production



Neural Style Transfer


Neural style transfer is an optimization technique used to take two images, the first a content image such as the image of a person, a building or any other image or photo, and the second a style reference image (such as an artwork by a famous painter for example), and blend them together so the output image looks like the content image, but “styled or painted” in the same style of the style reference image.

This is implemented by optimizing the output image to match the content statistics of the content image and the style statistics of the style reference image. 

These statistics are extracted from the images using a convolutional neural network.

In summary, the algorithm takes the content image and the style image that we want to match. it transforms the base input image by minimizing the content and style distances (losses) with back-propagation, creating an image that matches the content of the content image and the style of the style image.


I will not go into further detail, however here is a link to the article where the authors explain all the math details and the steps that goes into achieving this task of style transfer


The different styles applied to our Eminem Image



Building the front-end

I don't see myself as a super-star professional graphic designer per se, however along the years, I had to learn to do graphics work for my NGO, build the website, make brochures and posters for events... etc 

So I think I got that experience to thank for my way with graphical design.

For this app, I wasn't a complex job once you figure out the macro-idea, So I laid out the prerequisites for the web application. I wanted to have a page that allows the user to :

  • upload a photo
  • choose a style from a predefined styles list
  • submit and see the result


Those were the basic needs to make the overall concept works, however I wanted to add more swagg in the app. So the user should also be able to:

  • go back after seeing the result to choose an other style
  • have some useful information about the artwork
  • have links to the technical resources behind the style transfer


I put the sketches together in a blanc sheet and then moved to choosing the tools.




The trio : HTML, CSS and Javascript

I wanted the web app to have a soul. Being an admirer of harmony, I seemed like I would make sense for a style transfer app to have a certain "Style" for itself. So the main page was split into 3 parts:

Top section:

This is where the user will land at first. So it needed to be attractive and very easy to understand and use.




There are 3 component in this section:

  • The first one is a slider to showcase the possible styles a user could apply to a photo.
  • Just below that, the same concept but with the names of the styles with all of the available styles laid out in a row.
  • And the final sub-section is the upload form. In this part of the top section, I tried to keep it simple, with a button to choose the photo from a local directory, a drop down menu for style selection, and finally a submit button.


Center section:



This is really an extra part. I was just set and done with keeping it simple with the top part of the page, which is enough to do the work.
However, I really wanted to share an appreciation for the art that inspired the Style Transfer algorithm.

So I have selected some of the famous paintings and artwork and linked to their Wikipedia pages  or other pages that could provide sufficient information on the painting, the artist and the history behind it.


Bottom section:

This was also an optional part. However, if we are going to talk about the art, we need to also talk about the algorithm that made it happen.

So I linked to the Style Transfer original paper , and I linked to Google's Tensorflow tutorial about style transfer so the user (the curious ones) can see step by step the construction process.





Front-end of the results page:


This was also necessary to think about. The main thing here was based on 2 prerequisites:

- Keep the coherent style the same

- Provide a way for the user to try an other style

There was also a their point but I had to let it go. It was the possibility of making an automatic download button for the result image.

I had to et it go because it was a bit tricky to work on the Javascript, some browsers had limitations for allowing users to download something and I didn't have the time to dig deeper in that.



So the final results page has an upper section with both the original and the styled images, and a button to allow users to test an other style.

Responsive design!!

An important thing I need to mention here is the fact that nowadays, all websites are opened on mobile platforms. For certain cases, mobile penetration is way higher for particular websites.

People are always on the go and I can't assume that a future user should be on their laptop to use my app, so I had to make sure my front-end is compliant with this criteria.




Building the back-end


Since the whole project was about doing something fun and not too complex, I made the choice of keeping the complexity of the work limited to building the style transfer model.

That being said, the simplest backend choice that I could make was to build everything around Flask, and that is what I exactly dit.


For those of you unfamiliar with Flask,  Flask is a micro web framework written in Python. It is classified as a micro-framework because it does not require particular tools or libraries. It has no database abstraction layer, form validation, or any other components where pre-existing third-party libraries provide common functions



Testing everything

There were few test case scenarios that I needed to keep in mind where the user, intentionally or not does one of the following things:

  • upload a non-photo file (pdf , or zip for example)
  • upload a very small image, a grey or black an white or an image with only one color
  • adversarial attacks wanting to reveal the code, model or the backend
  • other security risks


For the first two, testing wasn't very difficult to implement, and taking into account both scenarios, I was able to correct and enhance the overall performance with warning messages displayed to the user in case they missed and uploaded the wrong file type.


For the adversarial attacks and other security risks, since it is a free access app, the only thing I wanted to avoid is to have the app broken or taken off line, other than that most of the codes are available online and I don't really have to worry about people trying to "hack" it, so I did what I knew was possible to make sure the app and users are safe.

That's why the app does not store any original image or result image, as soon as the user refreshes the page, everything is gone.


It was also important for me to implement this feature of not conserving anything, because otherwise the hosting fees will cost me a fortune. So security for users is guaranteed and my pockets wont hurt as much.



Deploying 


This wasn't a difficult thing to decide, since I had 2 conditions to respect:

  • Finding a free hosting tier
  • Easy to deploy without the hassle of too much configs


Amazon and Heroku were my to test options. The only concern I had an I needed to check was the hosting space. I have worked with both solutions in a professional / production setting, so most of the thinking about sizing, redundancy and availability was at a very different scale.

This app is supposed to be shared to my network and used probably intensively during the first week of me sharing the link and the blogpost publicly, and the usage is supposed to go down from there to a more stable level.

I shouldn't expect a 5000 hits/second ( unless something happens and a neural networks app goes viral for some reason)

Also, to make sure I wont get hit by a sudden crash due to high usage, I intended not to post any link on Hacker-news or any other public website.


So If I did the math right, based on my viewers ad interactions numbers on my blog, website landing page and my 2 social network accounts, Twitter and Linkedin, I calculated that in the event I choose to post on a "virality- prone" timing, on all of them, at the same time, I shouldn't be worried about going above the free tier limits of both platforms.


So considering all the above and other reasons, I decided to go with Heroku and did some testing from various locations around the world to check for latency and availability and all in all, everything was good to go.


To sum everything:


It was a nice fun project to do, outside of the do-stuff-for-work mindset. I took my time with it and had fun figuring out some of the parts I didn't have time before to work on deeply, especially javascript and CSS .


The front-end design was a pleasant part because it took me back to the days when I used to do graphic design for my NGO, I actually spent more time working on the front-end than what I spent doing my website landing page.

I wont say I didn't learn much or I learnt too much, It was fun and I was able to do something with an EMINEM photo on it.. So I'm happy, Slim Shady is happy and we all Good!

Next Steps?

Not sure what to do next, either add more styles inspired by other art works, add other features (ideas are yet to come) or probably think about an other thing to do ( while writing this blogpost, I already had an idea for the next weekend project, and I like it!)


I've hidden something in the app, I hope you're one of the smart and curious ones who will maybe find it



Jun 5, 2021

L'île au million d'yeux : Analyse des interactions sociales sur Twitter





#KohLanta : Finale de la saison 2021


Koh-Lanta est aujourd'hui un programme incontournable du paysage audiovisuel français. Cette émission inspirée du “Survivor” polarise les réseaux sociaux et suscite à la fois l’excitation, la joie et parfois la **colère** de ses milliers de fans.


Comme dans la vraie vie, où la nature humaine avec ses *qualités* et ses *défauts* se dévoile face aux épreuves, les **communautés** et les alliances se forment. 

Et souvent  la “trahison” et la “déception” se manifestent  (tiens, c’est comme si je te décrivais un épisode lambda de #Kohlanta 🧐) 


Dans cet article,  je joins l'utile à l'agréable et je partage quelques insights interessants, pour montrer que, comme dans la vraie vie (et exactement pareil dans #Kohlanta), les communautés sont souvent la formation sociale la plus **dominante** dans les interactions humaines et que le fait de partager la même vision/personnalité ou les mêmes opinions, joue un rôle important dans la formation de ces communautés et dans l’influence sur la formation des opinions. 




Visualisation des données collectées, identification visuelle des membres **importants** du réseau et identification des groupements d'utilisateurs


Contexte: Dans cet article, j'analyse les tweets publiques, les réactions, les mentions et les retweets autours du hashtag #Kohlanta. 

La récupération des données a été effectuée en temps réel durant la diffusion de l’émission et 2 heures avant et après cette diffusion pour garantir une exhaustivité maximale des données.

Les types/nature des relations entre les utilisateurs, et les tweets ont été analysés afin de comprendre ( et démontrer si possible) que ce qui se passe dans cette émission (et également sur les réseaux sociaux), n’est qu’une expression/manifestation de la nature humaine et sociale dans tous ses états .


(Interactions en temps réel entre les membres des communautés. @DenisBrogniart au centre des communautés dominantes sur le réseau )


[ PI: Juste avant la publication de ces analyses, toutes les données brutes ont été supprimées :) ]


🔥 Les top 5 utilisateurs sur Twitte🔥


Les tops 5 sont les utilisateurs ayant le nombre le plus élevés de followers == un reach maximal pour la diffusion d’un tweet. 

C’est les utilisateurs qui, en partageant une information, ont le **pouvoir** d’atteindre un grand nombre d’utilisateurs et, en fonction de la pertinence ou de l'intérêt que génère cette information, sont les premiers noeuds du graphe de diffusion de cette information (c'est ici que le concept de vitalité intervient)

Les utilisateurs dans notre top 5 ont le profil parfait pour ça: c'est 100% des utilisateurs/représentants  des médias:

1- @tf1 : 5 628 169 followers :




2- @le_parisien: 2 791 114 followers:




3- @20minutes : 2 448 378 followers:




4- @mediavenir : 1 155 465 followers :




5- @bchameroy : 1 047 579 followers:




Combinés, ces 5 utilisateurs seuls ont un reach total d’environ 13 millions d’utilisateurs. 

Le top 10 parmi les utilisateurs analysés ont un reach de 17 millions. 

Donc ils jouent bien leur rôle principale de relayer l'information et de lancer l'étincelle sur Twitter. 



🤼 Parlons des communautés 🤼


Sur les réseaux sociaux, il existe 4 sortes de groupements d’utilisateurs:

1. ceux qui suivent un utilisateurs ou un hashtag

2. ceux qui partagent sans suivre 

3. ceux qui créent eux mêmes le contenu 

4. ceux qui font 1 et/ou 2 et/ou 3


La formation d’une communauté est souvent basée sur des intérêts communs entre ses membres, soit ils sont amis ou se connaissent dans la vraie vie, soit ils partagent un dénominateur commun (ici, ils sont tous fans de l'émission #Kohlanta)


📊 Chiffres & Observations 📊


Sans trop rentrer dans les détails mathématiques, le point de départ de cette analyse est basé sur la théorie des graphes, et plus précisément sur les méthodes de détection de communautés, de cliques, de clans/clubs, de leaders et d'influenceurs

 (grossus-modus : il s'agit de mesurer les interactions et les relations entre tous les membres d'un réseaux, de trouver un points central, et réitérer pour arriver finalement à avoir des groupements d'utilisateurs ayant une certaine proximité)


J’ai pu ainsi détecter :

- 112 cliques d’utilisateurs

- 9 communautés à fort influence

- 3 leaders / influenceurs 


Ci-dessous une illustration des différents composantes de la "social network" du hashtag #Kohlanta sur Twitter: 



les cliques

Il s’agit d’un groupe d’individus qui interagissent et partagent des intérêts similaires. 

C’est les utilisateurs isolés, ayant un faible nombre de followers ( entre 0 et 60) donc un cercle réduit de contacts sur Twitter ce qui engendre un reach et des interactions inexistantes ou limités.

Les 112 cliques sont constitués de groupement d’utilisateurs qui s’interagissent en cercles fermés entre-eux, souvent ayant un nombre de membres limité entre 2 et 4 utilisateurs qui retweet ou like les tweets d’un des membres du clique.

  

Les communautés:

Elles sont 7, mais ont des liens communs très forts, c'est des utilisateurs “pivots” qui font le pont entre les différentes communautés. 

Tu vas comprendre toute suite le pourquoi du comment.



J’ai pu identifier le profil type de 3 de ces communautés, je les présente ici par ordre décroissant de leur taille totale en terme membres/ utilisateurs. 

Ci-dessous quelques exemples de la polarisation des opinions au sein des différentes communautés :













#1 : Les Fans neutres : 

Inexistence d’une polarisation particulière d’opinions. Il s’agit de fans qui suivent tout simplement l’émission et qui ne s’expriment pas sur le contenu et les événements . C’est la communauté qui a utilisé le moins d’insultes envers les participants de l’émission. L'analyse des tweets révèle  que l'utilisation (non intentionnelle) d'un certain champs lexical a une influence sur l'appartenance d'un utilisateur à l'une des 3 communautés.



#2: Les joyeux: 

C’est la communauté qui comptait le grand nombre de personnes contentes de résultats de la finale. Ceci ne se traduit pas forcément par une satisfaction par rapport au participant gagnant, mais selon leurs tweets, ces personnes n’ont pas exprimé un mécontentement particulier.  Ils ont cependant partager leurs avis particulièrement forts envers certain participants perdants.


#3: Les mécontents  : 


C’est un groupe d’utilisateurs qui partage une sensation de mécontentement généralisé envers l’émission, envers quelques participants ou tous, et surtout envers le résultat final.

C’est la communauté qui partagent aussi un point commun particulier: ils s’expriment d’une manière très prononcée et vont au-delà des commentaires simples, et emploient particulièrement les insultes ( parfois très personnelles et violentes) envers certains participants .


Une particularité de ces 3 groupes, est le fait que le lien de “follower” n’est pas le seul déterminant de l’appartenance préalable d’un utilisateur à un de ces 3 groupes. Certes, le fait de faire partie du réseau d’un leader ( on verra ça juste après), va confirmer une partie de l’hypothèse sur le partage des mêmes opinions sur certains sujets. 

Il faut préciser que, l'appartenance à ces communautés n'était pas un choix réfléchi des utilisateurs. C'est à dire, il n'y avait pas une sorte de condition nécessaire et obligatoire pour choisir ses mots ou ses sentiments dans le but de faire partie d'un groupe d'utilisateurs.

 C'est en fait la détection des communautés qui arrive pour confirmer des hypothèses à posteriori.

Ces utilisateurs n'ont pas donc forcement conscience qu'ils font partie d'une communautés partageant les mêmes avis et opinions sur la finale de #Kohlanta 2021 😉  (Même si en prenant 5 minutes pour y réfléchir, tout sera logiquement logique... all makes perfect sense at the end!)

  

👨‍✈️ Finalement les “Leaders” 👨‍✈️


J’ai pu identifier 3 leaders qui polarisent et orientent le “débat” sur Twitter.

Il ne s’agit pas des personnes les plus suivies (ah bon?).

C’est des utilisateurs qui ont les caractéristiques (ou avantages) suivants:

- être le premier à partager une capture ou une image de l’émission: quand #Kohlanta commence à apparaître dans les tendances Twitter,  c’est eux qui sont vus en premier et donc bénéficient du plus grand nombre de likes et de partages. Souvent les utilisateurs prennent l'option la plus facile de retweeter.

- Avoir un sens d’humour développé ? : Je ne pouvais pas expliquer ça d’un point de vu sociologique/psychologique, mais c’est le phénomène d'une personne qui trouve très rapidement un commentaire marrant sur un participant ou une situation dans l’émission et associe à ça une image ou un “meme”,  ce qui facilite leur accès à un grand nombre d’utilisateurs “passifs” qui ne font que partager, par manque de “créativité” peut - être. 

Comme par exemple:

 ou :

 ou encore :



- Etre le présentateur de l’émission : même si Denis Brogniart n’a pas fait de tweets durant l’émission (d’ailleurs inactif depuis le 28 mai), il centralise à lui seul l’ensemble des interactions des 9 communautés. 

Des mentions de son nom et de son compte Twitter ont monopolisé une grande partie des discussions durant la diffusion de l’émission:



(NB: Cet exercice n'avait pas pou objectif de classer et labelliser les gens dans ces 3 groupes, je n'ai pas donc révélé les identités des membres des différentes communautés ou les leaders. Sauf la mention de Denis Brogniart bien évidement)


à ma surprise: 

Les participants dans l’édition 2021 n’ont pas eu un effet sur les interactions sociales durant la finale de la saison 2021. Je m'explique:

Certains ont été mentionnés dans les tweets, mais leur présence sur Twitter n'a pas impacté ou orienté le **débat** entre les utilisateurs. Ils ont cependant, fait l'objet d'un nombre de commentaires "polarisants".  

Par contre,  plusieurs participants des éditions précédentes ont dominés une partie des interactions ( Go Sam! Go Claude! Go Teheiura!), donc c'est un effet de nostalgie si j'ose dire?

En gros hier soir,  c'était  les téléspectateurs qui ont animé et orienté le **débat** sur Twitter.




Bon voila! 

L'invest' total dans cet exercice était : 

5h pour récupérer les datas (j’ai surveillé le démarrage pendant 1h), 1h pour le nettoyage, 1h pour la construction et la validation des communautés et 1h30 pour avoir l’inspiration du texte ci-dessus.

4h30 de fun pour moi… 

Le sujet de SNA me fascinait depuis des années.. J’ai pu faire des travaux de recherche sur des problématiques similaires et j’ai réussi à mettre en prod quelques modèles qui tournent aujourd’hui (AKA générer du CA grace aux analyse des SN)

Ça me fascine car c’est la manifestation parfaite du comportement humain, et ça me permets de plonger sur des thématiques économiques, sociologiques et psychologiques afin de pouvoir donner un sens aux chiffres. 

Donc un projet SNA c'est souvent beaucoup de lecture et beaucoup de réflexions, mais surtout un exercice amusant !

🎤 💧

Mic drop


à lire dans le même thème, mon article de 2015 sur : l'analyse des interaction Twitter suite aux attaques terroristes en Tunisie 



Apr 25, 2021

On the hype around #DataScience


 Here is my latest twitter storm about the death of Data Science.. 

Enjoy!

Thomas Cole, The Course of Empire, Destruction, 1836, The Metropolitan Museum of Art, New York, USA.

 

 

 




For the rest of the Twitter Storm... I invite you to check it out.. on Twitter !