Heuzef - Les notes excentriques d'un bidouilleur.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. Title: Realiser une œuvre d'art avec des techniques modernes
  2. Category: Art
  3. Tags: art, ia, python, photo, pao, 3D
  4. Date: 2024-11-05
  5. Status: published
  6. Du pixel à la matière, je vous dévoile les différentes étapes m'ayant permis de réaliser une œuvre hybride né de l'IA, de la PAO et de la 3D. Ce projet met en évidence la synergie entre les outils numériques, l'intelligence artificielle et les savoir-faire artisanaux pour donner naissance à une œuvre unique : **un portrait en l'honneur de Nikola Tesla**.
  7. ![tesla_001](../../assets/tesla_001.jpg)
  8. # Partie 1 : La genèse numérique
  9. Nikola Tesla, c'est un peu le boss final des inventeurs. Archétype du savant fou, ce dernier a profondément changé l'avenir de l'humanité.
  10. Résumer un tel personnage n'est pas simple, mais s'il est facile de se renseigner sur lui, c'est cependant plus délicat de trouver des photos de bonne qualité du monsieur. Voici la plus célèbre et sûrement de meilleure qualité :
  11. ![tesla_002](../../assets/tesla_002.jpg)
  12. En contemplant cette photo, mon inspiration pour l'œuvre est née grâce aux nombreuses citations célèbres de Tesla. En voici quelques unes :
  13. > Si vous voulez trouver les secrets de l'univers, pensez en termes d'énergie, de fréquence et de vibration.
  14. > Je ne me soucie pas qu'ils aient volé mon idée… Je m'inquiète du fait qu'ils n'en aient pas eux-mêmes.
  15. > Le présent est à eux ; le futur, pour lequel j'ai réellement travaillé, est mien.
  16. Ainsi, à ce stade, j'ai fixé l'objectif de réaliser un portait de la photo en 3D, pour ajouter une profondeur dans son regard, afin de donner l'illusion qu'il nous suit du regard, mais également faire ressortir en lettre d'or les mots les plus "forts" de l'inventeur (littéralement).
  17. Pour réussir à sélectionner les mots justes, j'ai donc commencé par collecter une centaine de citations trouvé sur le site [quotefancy.com](https://quotefancy.com/nikola-tesla-quotes)
  18. J'ai donc codé la stratégie de webscraping en Python suivante :
  19. ```python
  20. # Import des librairies nécessaires au projet
  21. import pandas as pd
  22. import requests
  23. from bs4 import BeautifulSoup
  24. # Fixer les pages contenant les 100 citations
  25. page1 = requests.get("https://quotefancy.com/nikola-tesla-quotes/page/1")
  26. page2 = requests.get("https://quotefancy.com/nikola-tesla-quotes/page/2")
  27. page3 = requests.get("https://quotefancy.com/nikola-tesla-quotes/page/3")
  28. # Extraire les citations
  29. soup = BeautifulSoup(page1.content, "lxml")
  30. quotes_p = soup.find_all("p", class_="quote-p")
  31. quotes = []
  32. for i in range(0, 50):
  33. quote = quotes_p[i]
  34. quote_a = quote.select("a")
  35. for content in quote_a:
  36. quotes.append(content.text)
  37. ```
  38. Même logique, avec les 2 pages suivantes, pour alimenter notre array :
  39. ```python
  40. soup = BeautifulSoup(page2.content, "lxml")
  41. quotes_p = soup.find_all("p", class_="quote-p")
  42. for i in range(0, 50):
  43. quote = quotes_p[i]
  44. quote_a = quote.select("a")
  45. for content in quote_a:
  46. quotes.append(content.text)
  47. soup = BeautifulSoup(page3.content, "lxml")
  48. quotes_p = soup.find_all("p", class_="quote-p")
  49. for i in range(0, 13):
  50. quote = quotes_p[i]
  51. quote_a = quote.select("a")
  52. for content in quote_a:
  53. quotes.append(content.text)
  54. ```
  55. Nous obtenons ainsi, 113 citations, cela me permet ainsi de les récolter dans un fichier tableur au format CSV, exploitable pour la suite.
  56. ![tesla_003](../../assets/tesla_003.png)
  57. *NB : les citations sont en anglais, bien que Tesla parlait couramment huit
  58. langues, il adopta naturellement l'anglais comme langue principale pour
  59. la communauté scientifique.*
  60. J'ai ensuite exploité, toujours en Python, la librairie NLTK pour faire du text mining et afficher un nuage de mot avec Wordcloud.
  61. ```python
  62. # Import des librairies nécessaires au projet
  63. import numpy as np
  64. import pandas as pd
  65. import nltk
  66. from collections import Counter
  67. from nltk.tokenize import TweetTokenizer
  68. from nltk.corpus import stopwords
  69. from wordcloud import ImageColorGenerator, WordCloud
  70. import matplotlib.pyplot as plt
  71. import matplotlib.image as mpimg
  72. from PIL import Image
  73. ```
  74. ```python
  75. # Chargement des citations dans un dataframe
  76. df = pd.read_csv("tesla_quotes.csv", index_col = 0)
  77. # Créer une chaîne de caractères contenant la concaténation de toutes les citations
  78. paroles = ' '.join(df['Quotes'].astype(str).tolist()) # Attention à insérer une espace entre chaque ligne.
  79. # Creation des tokens
  80. tokenizer = TweetTokenizer()
  81. tokens = tokenizer.tokenize(paroles)
  82. ```
  83. Je dispose mainenant de 2818 mots, il faut les nettoyers, en supprimant les stop words.
  84. ```python
  85. # Création des stop words, afin de nettoyer nos citations
  86. nltk.download('stopwords')
  87. stop_words = set(stopwords.words('english'))
  88. stop_words.update(["?", "!", ".", ",", ":", ";", "-", "--", "...", "\"", "'", "’"])
  89. tokens_without_sw = [mot for mot in tokens if mot not in stop_words]
  90. ```
  91. ![tesla_004](../../assets/tesla_004.png)
  92. J'ai au final 1374 mots non-unique, quantifiés dans un dictionnaire. Ceci est directement exploitable avec WordCloud.
  93. Je réalise un masque de la silhouette de Nikola Tesla. Cela me permet d'obtenir alors une sortie de nuage de mot déjà positionné sur la silhouette.
  94. ```python
  95. mask = np.array(Image.open("tesla_max.jpg"))
  96. img = mpimg.imread("tesla_max.jpg")
  97. ```
  98. J'instancie le nuage de mot.
  99. ```python
  100. words = " ".join(tokens_without_sw)
  101. wc = WordCloud(background_color="white", max_words=50, stopwords=stop_words, min_font_size=30, max_font_size=100, collocations=False, mask=mask)
  102. # Générer et afficher le nuage de mots
  103. plt.figure(figsize= (30,15))
  104. wc.generate(words)
  105. plt.imshow(wc)
  106. plt.show();
  107. ```
  108. ![tesla_005](../../assets/tesla_005.png)
  109. À ce stade, il ne me reste plus qu'à affiner les réglages de taille et quantité de mots, je peux alors générer autant de nuages de mots aléatoirement que je souhaite. Cela me permet d'en sélectionner un qui me plaît, avec des mots très forts de sens. Plus ils sont gros, plus ils sont statistiquement nombreux dans l'ensemble des citations et donc, plus **"importants"**.
  110. ```python
  111. plt.figure(figsize= (30,30))
  112. wc.generate(words)
  113. plt.imshow(wc.recolor(color_func=ImageColorGenerator(mask)), interpolation="bilinear")
  114. plt.axis("off")
  115. plt.savefig('output.png')
  116. ```
  117. ![tesla_006](../../assets/tesla_006.png)
  118. # Étape 2 : Vers la dimension
  119. Maintenant, nous allons devoir vectoriser la photo pour une meilleure précision et
  120. scalabilité, cette étape est entièrement réalisé avec Inkscape, pour travailler en SVG.
  121. ![tesla_007](../../assets/tesla_007.png)
  122. Il est important de noter que j'ai volontairement fixé le nombre de couleur à cinq. Ce choix sera expliqué dans l'étape suivante.
  123. Je profite également de cette étape pour concevoir le cadre avec des éclairs (la maîtrise de l'électricité étant un détail très important de la vie de Nikola Tesla).
  124. Je place tout en haut la signature officielle de Nikola Tesla en guise de nom ([le format SVG de cette dernière est disponible sur Wikipédia](https://commons.wikimedia.org/wiki/File:TeslaSignature.svg) puis tout en
  125. bas, ma citation favorite.
  126. Enfin, je rajoute le nuage de mots par dessus, j'adapte ce dernier pour un meilleur rendu.
  127. À ce stade, la conception 2D de l'œuvre est terminée, il est temps d'ajouter une nouvelle dimension.
  128. ![tesla_008](../../assets/tesla_008.png)
  129. Nous basculons à présent sur l'outil Autodesk Fusion 360. Le SVG conçu précédemment peut être importé directement afin de le reproduire à l’identique avec des matériaux pour la couleur.
  130. ![tesla_009](../../assets/tesla_009.gif)
  131. Chaque polygone est alors retravaillé ici pour définir sa distance sur l'axe Z, les textes sont les éléments les plus hauts sur cet axe, soit 10 mm. Le cadre en fond, lui, est de 4 mm.
  132. Hélas, nous sommes dépendant de la méthode d'import du SVG de Fusion 360, ce qui rend l'étape de conversion 2D vers la 3D très fastidieuse, mais avec de la persevérence, nous pouvons parvenir à nos fins.
  133. <video id="tesla_010" controls preload="auto" width="900" height="500">
  134. <source src="../../assets/tesla_010.mp4" type='video/mp4'>
  135. </video>
  136. # Étape 3 : De l'écran à la réalité
  137. Le projet entièrement modélisé en 3D, il est temps de passer à la fabrication. Pour ceci, j'utilise une machine de pointe, la Prusa MK4 équipée du module MMU3 me permettant une impression avec 5 couleurs en simultanée.
  138. J'utilise donc des bobines de PLA avec les couleurs suivantes : blanche, noire, bleue, or (pour le texte) et ivoire (pour la peau).
  139. L'export du fichier 3D depuis Fusion 360 s'effectue au format **3MF**, qui permet de travailler la découpe et le multicouleur, j'utilise pour ça Prusa Sclicer, bien entendu, ce dernier est configuré avec le profil de mon imprimante 3D et de ses 5 bobines.
  140. Nous pouvons donc effectuer toute la colorisation, de nouveau, via l'outil peinture multi-matériaux du logiciel. Puis finalement, effectuer la configuration des paramètres d'impression, tel que la hauteur de couche, la vitesse, les supports, etc ...
  141. <video id="tesla_011" controls preload="auto" width="900" height="500">
  142. <source src="../../assets/tesla_011.mp4" type='video/mp4'>
  143. </video>
  144. Un point délicat à gérer, dû à l'utilisateur du multi-couleur, c'est la tour de purge, nécessaire pour nettoyer la couleur dans la buse entre chaque changement de couleur pour éviter un mélange des pigments. Hélas, cette dernière prend de la place, je parviens cependant à m'en sortir en modifiant les paramètres de cette dernière pour que celle-ci soit la plus longue et fine possible sur le côté du plateau. Je suis contraint néanmoins de réduire l'échelle de la pièce à 96 % de sa taille d'origine.
  145. ![tesla_012](../../assets/tesla_012.png)
  146. J'estime avoir fait au maximum des capacités de mon matériel. Même s'il est théoriquement possible de fabriquer en plusieurs parties, je tiens à éviter cela, pour éviter de créer des jointures visibles très inélégantes.
  147. ![tesla_013](../../assets/tesla_013.png)
  148. Ces étapes de découpe sont souvent effectuée au ressenti et selon l'expérience que nous avons en matière d'impression 3D, l'echec est toujours envisageable. Ce qui coûte malhereusement de la ressource. Il faut alors doser le risque, le coût de l'echec et le temps. Dans mon cas, je mise donc sur une impression la plus fine et la plus lente possible et un risque de décrochage minimum en sécurisant autant que possible. Cette stratégie est couteuse en temps et en ressources, mais diminue énormément le taux d'echec.
  149. ![tesla_014](../../assets/tesla_014.jpg)
  150. Une fois l'impression terminée avec succès, nous pouvons finaliser le projet avec du post-traitement, afin de nettoyer et réaliser des finitions, j'utilise pour ceci quelques produits (IPA et Cyanoacrylate), un pistolet thermique et un scalpel.
  151. Voici les détails techniques calculés :
  152. * Poids : 330g
  153. * Taille : 230mm x 200mm X 10mm
  154. * Temps de réalisation : 50 heures
  155. * Temps d'impression : 16 heures
  156. * Fabriqué en un seul exemplaire unique au monde
  157. Je rajouterais probablement une plaque de verre utlérieument si j'ai l'occasion de m'en procurer une, pour proteger le tout. En attendant, voici une vidéo du résultat final !
  158. <video id="tesla_art" controls preload="auto" width="900" height="500">
  159. <source src="../../assets/tesla_art.mp4" type='video/mp4'>
  160. </video>