diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..2efccd5d2753a47013eb7510fc953dc90aae29b9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,31 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +pictures_data/Abena_02_408.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/Abena_03_513.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/Abena_04_539.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/IMadeYou_01_053.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/IMadeYou_02_220.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/IMadeYou_03_406.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/IMadeYou_04_710.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/IMadeYou_05_828.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/IMadeYou_06_1243.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/Isabella_2_1737.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/Isabella_3_1910.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/Odamado_04_734.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/Odamado_06_1230.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/Odamado_07_1554.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/de-refter-msk-0721.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/het-kind-met-de-vissen-msk-0351.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/kind-slapend-op-zijn-trommel-msk-0317.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/lezend-kind-msk-0335.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/moederschap-msk-0639.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/nieuwsgierigheid-msk-0449.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/portret-van-een-jonge-man-17de18de-eeuw-msk-0033.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/spaarpot-geglazuurd-aardewerk-torhout-1ste-helft-20ste-eeuw-mos-7357.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/strandtoneel-msk-0235.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/tegel-faience-noord-nederland-18de-eeuw-mos-5161.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/tegel-faience-noord-nederland-18de-eeuw-mos-5162.jpg filter=lfs diff=lfs merge=lfs -text +pictures_data/winterlandschap-met-kinderen-msk-0337.jpg filter=lfs diff=lfs merge=lfs -text +src/art_pieces_db/resources/places/BE.csv.lzma filter=lfs diff=lfs merge=lfs -text +src/art_pieces_db/resources/places/FR.csv.lzma filter=lfs diff=lfs merge=lfs -text diff --git a/PP1-Collection_Database_new-cleaned.csv b/PP1-Collection_Database_new-cleaned.csv new file mode 100644 index 0000000000000000000000000000000000000000..d4058ed13313bac93e15db42a476848ee5b4d3b9 --- /dev/null +++ b/PP1-Collection_Database_new-cleaned.csv @@ -0,0 +1,241 @@ +1;;Le Fresnoy;movie;2016;Alexandru;;;child abuse, sadness, childhood, children drawings, family photo archive, autobiography;sad, angry, frustrated, bitter, intimate;"Making this film at this time in my life seems essential for me. I have always felt great shame talking about my childhood, even if it always made me sad."" This creative documentary made in animation from children's drawings, films and family photographs, uniquely evokes the traumas of a painful childhood in the small town of Frătăuții Vechi in Romania";And You? What was your childhood like? Happy, Sad, boring? Would you like to share one memorable memory from your childhood?;IMadeYou_01_053, IMadeYou_02_220, IMadeYou_03_406, IMadeYou_04_710, IMadeYou_05_828, +2;;Le Fresnoy;movie;2015;Isabelle;;Boulogne-sur-Mer;childhood portraits, city daily life, toy, boredom;agressive, confused, bored, threatened, lonely,;"“It is early. Still very early. Stop acting as if you’re an owl, Isabelle. Let us sleep, and get back to sleep. We’re not interested in your dreams and your poetry.” + +Between the wild stories of Adriana, a modern little girl, and the poetry of Isabelle, accused of treason by her brothers in the 16th century,what is the connection? Between the literary text by André Pieyre de Mandiargues and the prerecorded worlds of love on a modern automatic doll, what possible, fantasised echoes can there be? + +Here, Adriana is telling a story, Camille grumbling and Océane, in who knows what boredom, is trying to get her doll to speak its never-ending discourse. The trace of a programme or, on the contrary, the hope of a possible emancipation. + +This film, freely inspired by André Pieyre de Mandiargues’ play Isabella Morra, came out of a shoot with children on a housing estate in the upper reaches of Boulogne-sur-Mer. Through material made up of everyday activities and portraits of children in their spontaneous theatricality, a play of resonances is established with the world of the text.";And You? What was your childhood like? Happy, Sad, boring? Would you like to share one memorable memory from your childhood?;Isabella_1_045, Isabella_2_1737, Isabella_3_1910 +3;;Le Fresnoy;movie;2024;Emilien;;;cooking recipe, grand mother, family film archive, DNA storage;joyful, confused, interested, thankful, intimate;"I’ve just stored memories of my grandmother Mado in synthetic DNA. My memories have taken on physical form. + +Before, in order to store our images and share our recipes, there was the Internet, but the web is getting old and is being privatised at breakneck speed, while its energy consumption promises us scorching tomorrows. + +DNA is the future: its storage requires no energy, and it can be kept for eternity (even if fifty years would have been enough for me). But DNA is expensive to synthesise. With my budget, I can only afford to store 200 kilobytes of data; the suitcase of the future is small. What memories should I choose? And how should I do it? So far, there are no tutorials. + +I saved a few traces: a letter to Mado, the recipe for the dessert that made her famous (the coconut flan), the image of a red disc that I will use in my film, a family photo and an imprint of her voice. + +ODAMADO, an imperfect manual for saving memories in DNA.";If you had a very limited space to store memories, what are 3 memories you would keep?;Odamado_01_400, Odamado_02_433, Odamado_03_649, Odamado_04_734, Odamado_05_818, Odamado_06_1230, Odamado_07_1554 +4;;Le Fresnoy;movie;2015;Amel;;;blanket, tradition, story, family, wool, gift, wedding, colors, green, white, pink;Happy, intimate, loving, thankful, valued;Abena (blanket in tunisian) is a video that mixes sound interviews and graphic animation, to tell the story of my blanket. A wollen blanket woven by my tunisian grandmother, my father,s mother, and given to my mother for her wedding.I collected what the members of my family had to say about this object, and kept the sound to weave the story of this blanket with the threads of everyone’story. Thes are differents stories wich talk about and toy with the same object without ever really referring to it. What particullary interested me is what revolves around this blanket, talking of it without naming it, speaking of it without saying it, describing it without showing it.;And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;Abena_01_021, Abena_02_408, Abena_03_513, Abena_04_539 +5;MSK_0320;Abby;"Sculpture +(Marble)";1896;Godfried, Edmond, Pierre, Marie;;;White, stone, marble, child, barefoot, nightgown,;unfocussed, Lonely, Sad, distant, afraid, insecure, scared, sleepy, fragile;"Marble sculpture depicting a standing child in a nightgown, barefoot and with hands behind the back, lost in thought.The purity and restraint of this work attest to Devreese’s mastery. The sculpture represents Edmond Desmeth, son of Pierre and Marie Pauwels. It is based on a plaster model exhibited in Kortrijk in 1896. +Nineteenth-century society reflected profound social changes, particularly due to the rise of the middle class as an influential force. Art became an important means for this class to express their status and lifestyle. +Godefroid Devreese’s marble sculpture presents a boy in a nightgown and raises questions about his social standing. The sculpture is not only an artistic creation but also a sociological document that highlights the role of children in the nineteenth-century bourgeoisie.";Do you have childhood memories of waking up at night because of a nightmare? Or what was a memorable good dream you remember still?;de-kleine-filosoof-msk-0320 +6;MSK_0721;Abby;Painting;1973;Marc;;;Cantine, children, tables, houseware, nanny, caretakers;"bored, confused, +Lonely, Scared, anxious, dissaproving";"In De refter, we are struck by the cold and penetrating gaze of the caretakers. The chilly colors and the vacant stares of the children leave a lasting impression. There is a tension in the image. The painting evokes a specific atmosphere of temporary calm—a calm imposed with a certain force through its sober, intimidating ambiance. +As a talented young artist, Marc Stockman left for Paris in 1955. There, he drew inspiration from the latest developments in modern painting: surrealism, abstraction, the fantastic, and American action painting. After a period of abstract work influenced by Kandinsky, the roots of Flemish expressionism resurfaced, and the human figure once again took center stage. From 1972 onward, Marc Stockman focused on a more direct approach to reality, aligned with American hyperrealism. +Starting from photographs and documents—often depicting everyday subjects—he constructed his canvases. The aim was no longer to interpret reality, but to convey its essence.";And You? What was your childhood like? Happy, Sad, boring? Would you like to share one memorable memory from your childhood?;de-refter-msk-0721 +7;MOS_7357;Abby;"Sculpture +(Ceramic)";first half 20th century;;;Torhout, Bruges, Sint-Niklaas;Money box, Baby, hat, head, crying, ceramic;Angry, Desperate, Sad;"Money box in the shape of a crying child’s head with a green cap (or pinned helmet), featuring an opening at the bottom. Folk pottery. The growing sociological interest in social groups and classes during the late nineteenth and early twentieth centuries brought about a fascination with folk culture. Industrialization and its social consequences, along with the increasing presence of technology and the rise of mass production, triggered a counterreaction: a distinct visual language was developed to reflect local cultures. +Special attention was paid to everyday life and domesticity—an interest that also manifested in ceramic production. In Torhout, too, the focus of local ceramic production in the early twentieth century lay primarily on household wares. However, the region also saw more artistic or personalized creations, often made to order. The pottery from this period shows strong similarities with works produced in prominent centers such as Kortrijk, but also in places like Bruges and Sint-Niklaas.";And You? What was your childhood like? Happy, Sad, boring? Would you like to share one memorable memory from your childhood?;spaarpot-geglazuurd-aardewerk-torhout-1ste-helft-20ste-eeuw-mos-7357 +9;MSK_0351;Abby;Painting;20th century;Hermann;;;Little girl, child, bowl, fish, painting;Curious, Playful, free;Portrait of a girl reaching into a fishbowl. A loosely executed yet confident painting that reflects a loving observation. Hermann Courtens (1884–1956) was the son of Baron Franz Courtens. He painted landscapes, but was especially known for his still lifes with flowers, interiors, children, and young girls—often in costume and set in intimate, domestic scenes.;Did you have pets when you were a kid? What's your best childhood memory with a pet?;het-kind-met-de-vissen-msk-0351 +10;MSK_0033;Abby;Painting;18th century;Arnold;;;Portrait, painting, little boy, child, nice clothes, red;pressured, distant;Portrait of a young man with long blond hair and a shy gaze. The child portraits, attributed to the workshop of Arnold van Houbraken, fit within the long portrait tradition of the upper class, where the expectations of the parents are often reflected in the portraits of their young children.;And You? What was your childhood like? Happy, Sad, boring? Would you like to share one memorable memory from your childhood?;portret-van-een-jonge-man-17de18de-eeuw-msk-0033 +11;MSK_0639;Abby;Drawing;20th century;Georges;;;Mother, child, Madonna, drawing;Loving, peaceful;A seated mother holds a child in her arms. A recurring motif in the work of the artist George Minne. Minne portrays motherhood in a non-stereotypical way, far removed from traditional Madonna images. The drawing shows a slender and sorrowful female figure, contrasting with the usual image of maternal care and strength.;And You? What was your childhood like? Happy, Sad, boring? Would you like to share one memorable memory from your childhood?;moederschap-msk-0639 +13;MOS_5162;Abby;"Tile +(Ceramic)";18th century;;;Delft;Children, game, stilts tile, ceramic,;Happy, Playful, Free;Tile with a blue depiction of a children’s game: stilts. In the corners, small ox heads. The first shipment of Chinese porcelain (known as ‘kraak porcelain’) arrived in Amsterdam in 1602. Shortly after, the Delft pottery makers began copying Chinese porcelain. As they were unfamiliar with the process of making porcelain, their ceramics were produced in a much thinner version and made from finer, higher-quality yellow clay instead of coarse red clay. This led to the fact that, around 1620-1625, tiles were no longer just used as floor tiles, but were also sold as wall tiles, featuring various depictions of Chinese gardens, and later also scenes from daily life with main motifs such as flowers, flower vases, various animals, mythical creatures, insects, birds, portraits, riders and soldiers, and later also trades, cupids, and children’s games. Tiles depicting children's games in blue-and-white design were first circulated in 1630. By the mid-17th century, around 1650, a series of children’s game tiles were made in Rotterdam. Early children’s game tiles featured large figures. Soon after, a series of children's game tiles with 48 different depictions appeared in Rotterdam, with a spider motif in the corners. The spider became a popular corner motif from the second half of the 17th century, as it was easy to make and remained in circulation until the 20th century. A contemporary tile tableau by Tinus Vermeersch (MSK/1237) evokes the memory of similar Delft and Northern Dutch tiles from the 17th and 18th centuries.;What was your favorite game when you were a child?;tegel-faience-noord-nederland-18de-eeuw-mos-5162 +14;MOS_5161;Abby;"Tile +(Ceramic)";18th century;;;;Children, game, marbles, tile, ceramic,;Happy, Playful, Free;Tile with a blue depiction of a children's game: marbles. In the corners, small ox heads. The first shipment of Chinese porcelain (known as ‘kraak porcelain’) arrived in Amsterdam in 1602. Shortly after, the Delft pottery makers began copying Chinese porcelain. As they were unfamiliar with the process of making porcelain, their ceramics were produced in a much thinner version and made from finer, higher-quality yellow clay instead of coarse red clay. This led to the fact that, around 1620-1625, tiles were no longer just used as floor tiles, but were also sold as wall tiles, featuring various depictions of Chinese gardens, and later also scenes from daily life with main motifs such as flowers, flower vases, various animals, mythical creatures, insects, birds, portraits, riders and soldiers, and later also trades, cupids, and children’s games. Tiles depicting children's games in blue-and-white design were first circulated in 1630. By the mid-17th century, around 1650, a series of children’s game tiles were made in Rotterdam. Early children’s game tiles featured large figures. Soon after, a series of children's game tiles with 48 different depictions appeared in Rotterdam, with a spider motif in the corners. The spider became a popular corner motif from the second half of the 17th century, as it was easy to make and remained in circulation until the 20th century. A contemporary tile tableau by Tinus Vermeersch (MSK/1237) evokes the memory of similar Delft and Northern Dutch tiles from the 17th and 18th centuries.;What was your favorite game when you were a child?;tegel-faience-noord-nederland-18de-eeuw-mos-5161 +15;MSK_1199;Abby;Photograph;;Titus;;Ostende;boy;Lonely, Isolated, empty;Since 2011, Titus Simoens has been working on a series about students living under strict school regimes. In Blue, see, we see the boys from the Ostend maritime school IBIS. In the photo series Mount Song, Simoens shows the students of a Chinese kung fu school. The final part, Los Domadores, takes place in a boxing school in Cuba. In these school lives, an intense discipline brings order to the days, and the years are spent on specialized training that aims to offer the students future prospects. Simoens captures the small moments of doubt, camaraderie, loneliness, and joy in which these young people momentarily escape the heavy obedience required of them. This photo is part of the documentary series Blue, see, about the lives of children at the Ibis Maritime School in Ostend. The Ibis School is a boarding school for children with behavioral problems or difficult home situations. These children are trained to become fishermen or sailors. The training helps them develop more discipline and provides structure to their lives. The series shows the institutionalized lives of boys who share the same fate, becoming almost like family to one another. Despite the strict visual language, Titus manages to tell a human story, contrasting the camaraderie with the Spartan conditions of their training. The photo was used as the cover for Rats (2012) by the Kortrijk band Balthazar. Titus Simoens (1985) won the Nikon Young Promising Award in 2012. His work appears in numerous Belgian and international media and is exhibited in various museums. In 2014, he won the Monography Series Award from Nikon and Bozar, resulting in a solo exhibition at the Palais des Beaux-Arts in Brussels. That year, he was also featured in an episode of De Canvasconnectie on Canvas.;; +16;MSK_0449;Abby;Painting;19th century;Louis, Pierre;;;Little girl, painting, dress, flowers, pink, furniture;"Curious +Playful";Portrait of a girl, a child of the wealthy, rummaging through the drawer of a chest of drawers. In a typical bourgeois interior, the work provides an intimate insight into the daily life of the middle class. Louis Pierre Verwee (1804 – 1877) is the father of the renowned animal painter Alfred Verwee. He was a student of J.B. De Jonghe and Eugène Verboeckhoven. He mainly painted animal scenes and winter landscapes.;And You? What was your childhood like? Happy, Sad, boring? Would you like to share one memorable memory from your childhood?;nieuwsgierigheid-msk-0449 +17;MSK_0235;Abby;Painting;19th century;Albert;;;Children, beach, poppet, holiday's, umbrella, sailing boat, sea;"Playful +Happy";Summer genre scene with two bourgeois children on the beach. Albert Roosenboom (Rotterdam 1845 – Ixelles 1893) was a student of Jean-Baptiste Meunier. He frequently painted women and, especially, children from the upper class, in bourgeois interiors or civilized surroundings;What was your favourite game when you were a child?;strandtoneel-msk-0235 +18;MSK_0317;Abby;Sculpture;19th century;Constant;;;Litte boy, child, drum, sleeping, white, marble, sculpture, instrument;Peaceful;The marble sculpture 'Child Sleeping on His Drum' is an anecdotal, yet very skillfully executed work, fitting within the 19th-century tradition of sculpting sleeping children. It is the work of Constant Devreese (1823–1900) from 1880, a native of Kortrijk. Constant Devreese was the father of Godfried Devreese, who is best known for creating the Groeninge Monument;Do you have childhood memories of waking up at night because of a nightmare? Or what was a memorable good dream you remember still?;kind-slapend-op-zijn-trommel-msk-0317 +19;MSK_0337;Abby;Painting;19th century;Harald, Bertrand;;;Snow, children, game, village, broter, sister, painting;Playful, happy, dissaproving, skeptical, excited;A genre scene in a Norwegian snow landscape. A suspicious girl, holding hands with a boy, is coming from school: two boys are ready to pelt them with snowballs.;What was your favourite game when you were a child?;winterlandschap-met-kinderen-msk-0337 +20;MSK_0335;Abby;Painting;19th century;Henri;;;Little boy, book, dog, hat, reading, painting;Peaceful, interested, Sad, perplexed;"Genre scene of a boy sitting on a wooden floor. He is reading a book, surrounded by various objects; a white dog watches. Henri Baekelandt (1834 – 1855) was a student at the Academy of Kortrijk and was seen as a promising portrait and genre painter until his early death.";And You? What was your childhood like? Happy, Sad, boring? Would you like to share one memorable memory from your childhood?;lezend-kind-msk-0335 +21;JL.2022.0.22;Maison des collections, Ville de Mons;Hand written paper note;1803;Sophie, Félicité;09/10/2025;Cuesmes;Signe de reconnaissance, feuille de papier, enfant trouvé, nourrice, bébé, abandon;Sad, preplexed;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.22 +22;JL.2022.0.23;Maison des collections, Ville de Mons;Hand written paper note;1802;Nicolas;07/01/2025;;Signe de reconnaissance, billet de papier, ruban, enfant déposé, bons soins, bébé;hopeful, loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.23 +23;JL.2022.0.24;Maison des collections, Ville de Mons;Engraving;1834;Michel, Cécile;;Paris;Signe de reconnaissance, gravure, martyr;Sad, perplexed,;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons. + Michel Corneille?";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.24 +24;JL.2022.0.25;Maison des collections, Ville de Mons;Printed sheet;1800-1850;Pierre;;Tournai;Signe de reconnaissance, prière, vierge, Notre-dame, livre, page, impression;Sad, perplexed,;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons. + explication prière";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.25 +25;JL.2022.0.26;Maison des collections, Ville de Mons;Rubans;1800-1850;;;;Signe de reconnaissance, rubans, tissu;Sad, perplexed,;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.26 +26;JL.2022.0.27;Maison des collections, Ville de Mons;Hand written paper note;1800-1850;Constant;;;Signe de reconnaissance, morceau de tissu, billet de papier, enfant, mère, père, abandon, orphelin;Sad, worried, lonely;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Can you remember a childhood memory involving an important letter or note ? Can you share your story?;MAR-BVM-7-2022.0.27 +27;JL.2022.0.28;Maison des collections, Ville de Mons;painted Drawing;1834;Dorothée, Joseph;;;Signe de reconnaissance, palme, fleurs, couleurs, encre, femme,;worried;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons. + explication Icono";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.28 +28;JL.2022.0.29;Maison des collections, Ville de Mons;Hand written paper note;1813;Armand;;;Signe de reconnaissance, ruban, garçon, hospice, billet de papier, enfant déposé;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.29 +29;JL.2022.0.30;Maison des collections, Ville de Mons;watercolor;1823;Jean, Baptiste, Octave;19/03/2025;;Signe de reconaissance, aquarelle, crucifix, baptème, hospice, bons soins;hopeful, loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.30 +30;JL.2022.0.31;Maison des collections, Ville de Mons;hand written page of paper;1790;Eugénie, Sophie;29/07/2025;;Signe de reconnaissance, enfant, nourrice, baptème, papier, sceau de cire;hopeful, loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.31 +31;JL.2022.0.32;Maison des collections, Ville de Mons;Hand written paper note;1797;Marie-Thérèse;11/04/2025;;Signe de reconnaissance, sceau de cire, ruban ligné, tissu, billet de papier, enfant, récompense, bons soins;hopeful, thankful,;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.32 +32;JL.2022.0.33;Maison des collections, Ville de Mons;hand written document;1804;Joseph;31/07/2025;;Signe de reconnaissance, tissu, papier, triangle;thankful, sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.33 +33;JL.2022.0.35;Maison des collections, Ville de Mons;hand written page of paper;1819;Nicolas, Louis;;;Signe de reconnaissance, morceau de tissu, rayures, triangle, lettres brodées, bons soins, nourrice, baptème;hopeful, loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.35 +34;JL.2022.0.36;Maison des collections, Ville de Mons;Printed sheet;1816;Arnould;;;Signe de reconnaissance, extrait, patron des brasseurs, saint, image, bleu, orange, église, brasserie, texte imprimé;sad, curious;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you, when you were a child, did you have a saint, a relative or a character, real or imaginary, invoked by your parents or grandparents to protect you?;MAR-BVM-7-2022.0.36 +35;JL.2022.0.38;Maison des collections, Ville de Mons;Engraving;1824;Louise;;;Signe de reconnaissance, gravure, bleu, saint;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you, when you were a child, did you have a saint, a relative or a character, real or imaginary, invoked by your parents or grandparents to protect you?;MAR-BVM-7-2022.0.38 +36;JL.2022.0.40;Maison des collections, Ville de Mons;Medal;1800-1850;;;Rome;Signe de reconnaissance, médaille, métal, collier, cadeau, famille, Italie;loving, sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.40 +37;JL.2022.0.42;Maison des collections, Ville de Mons;Sheet of paper;1826;Agathe;;;Signe de reconnaissance, papier, découpe, bordure en zig-zag, cercle;sad, creative, curious;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.42 +38;JL.2022.0.43;Maison des collections, Ville de Mons;wood case;1815;;;;Signe de reconnaissance, message, étui, bois, décor, précieux, ivoir, pendentif,;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.43 / MAR-BVM-7-2022.0.43-45 +39;JL.2022.0.46;Maison des collections, Ville de Mons;Hand written paper note;1834;Paul;;;Signe de reconnaissance, billet de papier, découpe, cercle, baptème;sad, hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.46 +40;JL.2022.0.47;Maison des collections, Ville de Mons;Hand written paper note;1823;;25/06/2025;;Signe de reconnaissance, tissu brodé, bons soins, enfant déposé;hopeful;"Les bébés que l'on plaçait dans le tour étaient accompagnés de ""signes de reconnaissance"". On épinglait aux langes de l'enfant soit une image pieuse, soit une carte à jouer, soit une médaille ou un ruban, mais l'objet était toujours découpé de façon irrégulière et le-ou les - parents en conservaient l'autre moitié. Ceci indique clairement que c'était généralement à contrecœur que l'on se résignait à l'abandon, avec l'espoir de pouvoir récupérer l'enfant plus tard, dans des temps meilleurs. Le signe de reconnaissance est très souvent accompagné d'un papier plié contenant un message écrit émouvant : on donne le nom de baptême de l'enfant et on supplie d'en prendre soin.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-47 +41;JL.2022.0.48;Maison des collections, Ville de Mons;Piece of fabric;1814;;11/10/2025;;Signe de reconnaisance, message, manuscrit, tissu brodé, triangle, tonneau, baptème, bonnet, chemise, rouge, violet, bleu, blanc, enveloppe;sad, hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you have a childhood memory linked to a special piece of clothe of yours or a uniform you were wearing when you were little ?;MAR-BVM-7-2022.0.48 +42;JL.2022.0.49;Maison des collections, Ville de Mons;Engraving;1818;Claire;01/05/2025;;Signe de reconnaissance, message, vert, rouge, couleurs, crucifix, enfant déposé, récompense;hopeful, thankful, devotion, awe;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.49 +43;JL.2022.0.50;Maison des collections, Ville de Mons;medal;1814;Sophie, Benoit, Ghislain;;Saint-Ghislain;Signe de reconnaisance, message, baptème, médaille, présent, abbé, Saint Benoit, enfant;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.50 +44;JL.2022.0.52;Maison des collections, Ville de Mons;Piece of Fabric;1816;;;;Signe de reconnaissance, jarretière, soie, devise, parents, amour, tissu;loving, sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.52 +45;JL.2022.0.54;Maison des collections, Ville de Mons;Engraving;1818;;11/12/2025;Walcourt;Signe de reconnaissance, triangle, papier, gravure, couleurs, bleu, orange, cheval, arbre, Vierge, prière, garcon, bons soins;worried, loving, curious;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.54 +46;JL.2022.0.58;Maison des collections, Ville de Mons;pious image;1817;Louis;;;Signe de reconnaissance, anges, enfant déposé, image, couleurs;thankful, sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.58 +47;JL.2022.0.59;Maison des collections, Ville de Mons;Playing card;1800-1850;Cesar;;;Signe de reconnaissance, carte, jeu de société, jeux, roi, carreaux;hopefull, sad, playful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";What was your favorite game when you were a child?;MAR-BVM-7-2022.0.59 +48;JL.2022.0.60;Maison des collections, Ville de Mons;pious image;1800-1851;Georges;;;Signes de reconnaissance, image, couleurs, anges, enfant, Saint-Georges;hopeful, sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you, when you were a child, did you have a saint, a relative or a character, real or imaginary, invoked by your parents or grandparents to protect you?;MAR-BVM-7-2022.0.60 +49;JL.2022.0.62;Maison des collections, Ville de Mons;Engraving;1816;Gustave, Joseph, Jean;27/07/2025;;Signes de reconnaissance, gravure, lion, épée, oiseau, martyr, enfant;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.62 +51;JL.2022.0.67;Maison des collections, Ville de Mons;Printed book page;1820;Joseph, Joachim, Anna, Marie;;;Signe de reconnaissance, image, famille, prière,;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? What was your childhood like? Happy, Sad, boring? Would you like to share one memorable memory from your childhood?;MAR-BVM-7-2022.0.67 +52;JL.2022.0.74;Maison des collections, Ville de Mons;Piece of fabric;1800-1850;Désirée, Eloi;;;Signe de reconnaissace, tissu ligné, baptème, message;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.74 +53;JL.2022.0.75;Maison des collections, Ville de Mons;Hand written note;1767;Guillaume;16/04/2025;;Signe de reconnaissance, baptème, papier, message, moitié;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.75 +54;JL.2022.0.76;Maison des collections, Ville de Mons;Hand written note;1813;Antoine;;;Signe de reconnaissance, soldat, papier;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.76 +55;JL.2022.0.78;Maison des collections, Ville de Mons;Piece of fabric;1812;Alexandrine, Françoise;26/02/2025;;Signe de reconnaissance, ruban, trèfles, baptème, enfant, jaune;loving, worried;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.78 +56;JL.2022.0.80.2;Maison des collections, Ville de Mons;Handwritten note;1822;Henri;31/03/2025;;Signe de reconnaissance, mouchoir, baptème, enfant, message, billet de papier, tissu rouge;loving, worried;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.80.1 / MAR-BVM-7-2022.0.80.2 +57;JL.2022.0.81;Maison des collections, Ville de Mons;Ribon;1815;Marie, Emilie, Françoise;01/10/2025;;Signe de reconnaissance, fille, nourrice, baptème, bons soins, ruban;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.81 - 2022.0.81 +58;JL.2022.0.82;Maison des collections, Ville de Mons;pious image;1830;Nicolas, Bernard;;;Signe de reconnaissance, enfants, bassine, arbre, bleu, dorure, anges;sad, curious;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";What's your best childhood memory linked with a celebration like Saint-Nicolas's day or christmas?;MAR-BVM-7-2022.0.82 - 2022.0.82 +59;JL.2022.0.83;Maison des collections, Ville de Mons;small bag;1833;;;;Signe de reconnaissance, objet précieux, pochette, tissu, etiquette, bleu,;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.83 - 2022.0.83 +60;JL.2022.0.84;Maison des collections, Ville de Mons;fabric and locket;1816;Benoit, Ghislain;;Saint-Ghislain;Signe de reconnaissance, tissu, rouge, fleurs, médaillon, Saint, pendentif, métal;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.84 - 2022.0.84 +61;JL.2022.0.85;Maison des collections, Ville de Mons;crucifix and locket;1800-1850;Benoit, Ghislain;;Saint-Ghislain;Signe de reconnaissance, crucifix, crois, christ, metal, saint, abbé, médaillon, pendentif;loving, sad, devotion, awe;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.85 +62;JL.2022.0.86;Maison des collections, Ville de Mons;locket;1837;Jeanne, Françoise, Chantal;;;Signe de reconnaissance, sainte, femme, doré, sœur, médaillon,;loving, sad, devotion, awe;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons. + explication Sainte jeanne-Françoise de chantal";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.86 +63;JL.2022.0.88;Maison des collections, Ville de Mons;locket;1800-1850;;;;Signe de reconnaissance, médaillon, métal, pendentif, cerf, vierge, cadeau;sad, devotion, awe;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.88 +64;JL.2022.0.80;Maison des collections, Ville de Mons;Piece of fabric;1813;;;;Signe de reconnaissance, tissu, décors, bruns, feuilles, entrelats, feuillage;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.80.1 / MAR-BVM-7-2022.0.80.2 +65;JL.2022.0.91;Maison des collections, Ville de Mons;pious image;1800-1850;Sophie;;;Signe de reconnaissance, bleu, vert, rouge, baptème;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-91-001 +66;JL.2022.0.95;Maison des collections, Ville de Mons;Piece of Printed sheet;1818;;07/06/2025;Liège;Signe de reconnaissance, billet de papier, baptème texte;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.95.001/MAR-BVM-7-2022.0.95.002 +67;JL.2022.0.96;Maison des collections, Ville de Mons;Hand written note;1800-1850;Marie, Aldegonde;28/07/2025;;Signe de reconnaissance, billet de papier, ruban, blanc,soie;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.96 +68;JL.2022.0.97;Maison des collections, Ville de Mons;Hand written note;1829;Virginie,;12/08/2025;;Signe de reconnaissance, billet de papier découpé, vagues, découpe,;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.97 -001 +69;JL.2022.0.97b;Maison des collections, Ville de Mons;Printed image;1818;Lucie;;;Signe de reconnaissance,image imprimée, moitié, triangle, papier;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.97.003 +70;JL.2022.0.99;Maison des collections, Ville de Mons;painted drawing on paper;1814;;;;Signe de reconnaissance, découpe, papier, feuillages, couleurs, peinture, bleu, enfant, christ, père,;loving, amazed;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.99 +71;JL.2022.0.100;Maison des collections, Ville de Mons;Printed image;1818;Charles, Rose;;;Signes de reconnaissance, papier, saint, feuillage, fleurs, découpe, vague, moitié;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.100 - +72;JL.2022.0.105;Maison des collections, Ville de Mons;Playing card;1890;;;;Signe de reconnaissance, carte, jeu de société, dame, cœur, rouge;playful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";What was your favorite game when you were a child?;MAR-BVM-7-2022.0.105 +73;JL.2022.0.123;Maison des collections, Ville de Mons;pious image;1800-1850;;;;Signe de reconnaissance, annonciation, femme, papier, découpe, zig-zag;loving, surprised;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.123 +74;JL.2022.0.125;Maison des collections, Ville de Mons;pious image;1816;Flore, Marc;;;Signe de reconnaissance, papier, image imprimée, saint, lion, triangle, découpe, moitié;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.125 +75;JL.2022.0.128;Maison des collections, Ville de Mons;drawing;1816;;;;Signe de reconnaissance, papier, aquarelle, couleurs, vert, orange, bleu, fleurs, découpe, moitié, triangle;creative, sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.128 +76;JL.2022.0.130;Maison des collections, Ville de Mons;printed image;1815;;;;Signe de reconnaissance, papier, moitié, anges, cœur, croix;loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.130 +77;JL.2022.0.131;Maison des collections, Ville de Mons;printed image;1815;Rosalie;;;Signe de reconnaissance, femme, bleu, papier, couleurs, moitié, triangle;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-131 - 2022.0.131 / MAR-BVM-7-2022.0.131 +78;JL.2022.0.132;Maison des collections, Ville de Mons;Piece of fabric;1800-1850;;;;Signe de reconnaisance, entrelats, tissu, tissage, impression, angelots, feuillage, couronne;creative, sensitive;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.132 +79;JL.2022.0.133;Maison des collections, Ville de Mons;Piece of fabric;1813;Zoé, Hélène;05/10/2025;;Signe de reconnaissance, note manuscrite, bons soins, tissu, récompense, baptème, enfant;hopeful, thankful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.133 +80;JL.2022.0.134;Maison des collections, Ville de Mons;Piece of fabric;1813;Eugénie;14/10/2025;;Signe de reconnaissance, billet de papier, message, tissu, fleurs, blanc, baptème;loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.134 +81;JL.2022.0135;Maison des collections, Ville de Mons;Printed image;1815;Alexandrine, Sophie;04/03/2025;;Signe de reconnaissance, image imprimée, saint, papier, moitié, rouge, anges, baptème,;loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.135 +82;JL.2022.0.136;Maison des collections, Ville de Mons;Hand written note;1838;Julie;10/06/2025;;Signe de reconnaissance, enfant déposé, baptème, papier, découpe,;loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022-0-136 +83;JL.2022.0.138;Maison des collections, Ville de Mons;pious image;1816;Juliette;26/07/2025;;Signe de reconnaissance, moitié, papier, image imprimée, couleurs, colombe, vierge, femme, bleu, rose, rouge, ruban blanc, baptème, enfant;loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022-0-138 +84;JL.2022.0.139;Maison des collections, Ville de Mons;Piece of fabric;1820;;;;Signe de reconnaissance, tissu, rouge, motifs, fleurs, bleu;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-139 +85;JL.2022.0.143;Maison des collections, Ville de Mons;Ribon;1802;Geneviève;16/10/2025;;Signe de reconnaissance, billet de papier, ruban, tissu, enfant trouvé;sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.143 +86;JL.2022.0.145;Maison des collections, Ville de Mons;Hand written note;1802;Adrien;16/05/2025;;Signe de reconnaissance, billet de papier, ruban, noir,;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.145 +87;JL.2022.0.147;Maison des collections, Ville de Mons;Piece of fabric;1800-1850;;;;Signe de reconnaissance, tissu, broderie, fleurs, motifs, rouge, blanc;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.147 +88;JL.2022.0.148;Maison des collections, Ville de Mons;pious image;1800-1851;;;;Signe de reconnaissance, famille, père, mère, moitié, couleurs, vert, panier, végétaux, chérubin, papier, impression;loving, devotion;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.148 +89;JL.2022.0.149;Maison des collections, Ville de Mons;crucifix;1800-1852;;;;Signe de reconnaissance, metal, pendentif, crucifix, christ, vierge, croix;loving, devotion;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.149 +90;JL.2022.0.153;Maison des collections, Ville de Mons;piece of fabric;1804;Barthelemy, Joseph;;Ixelles;Signe de reconnaissance, ruban, rond, billet papier, baptème, enfant,;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-2022-0-153 +91;JL.2022.0.154;Maison des collections, Ville de Mons;piece of fabric;1802;Laurent;;;Signe de reconnaissance, tissu, lignes, rayures, brun, enfant, billet de papier, baptème;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.154 +92;JL.2022.0.155;Maison des collections, Ville de Mons;piece of fabric;1800-1850;;;;Signe de reconnaissance, végétal, tissu, noir, feuilles, rouge, fleurs, motifs, billet de papier, enfant, bonne nourrice, récompense;hopeful, thankful, loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.155 +93;JL.2022.0.156;Maison des collections, Ville de Mons;locket;1800-1850;Benoit, Ghislain;;Saint-Ghislain;Signe de reconnaissance, cheveux, souvenirs, médaillons, métal, saint, pendentif, abbé;loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.156 +94;JL.2022.0.161;Maison des collections, Ville de Mons;Piece of fabric;1800-1850;Françoise;;;Signe de reconnaissance, tissu, message, billet de papier, rouge, triangle, pois, nourrice, bons soins, enfant, récompense;thankful, sad;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.161 +95;JL.2022.0.165;Maison des collections, Ville de Mons;handwritten note;1800-1850;Joseph;;;Signe de reconnaissance, billet de papier, baptème, nom, moitié;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022-0-165 / MAR-BVM-7-2022.0.165 +96;JL.2022.0.170;Maison des collections, Ville de Mons;Drawing;1800-1850;;;;Signe de reconnaissance, papier, saints, épée, rouge, moitié, baptème;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-170 +97;JL.2022.0.175;Maison des collections, Ville de Mons;Piece of fabric;1801;François, Louis;28/11/2025;;Signe de reconnaissance, tissu, damier rouge, billet de papier;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022-0-175 +98;JL.2022.0.179;Maison des collections, Ville de Mons;pious image;1801;Charlotte, Colette;;;Signe de reconnaissance, papier, serpent, bleu, moitié, baptème, enfant;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022-0-179 +99;JL.2022.0.180;Maison des collections, Ville de Mons;Playing card;1800-1850;Victoire;13/03/2025;;Signe de reconnaissance, valet de cœur,carte, jeu de société, menthe, moitié;hopeful, playful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";What was your favourite game when you were a child?;MAR-BVM-7-2022-0-180 +100;JL.2022.0.182;Maison des collections, Ville de Mons;Playing card;1800-1850;Marie, Joseph;;;Signe de reconnaissance, carte, jeu de société, pique, noir, moitié, vague, découpe, baptème;hopeful, payful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";What was your favourite game when you were a child?;MAR-BVM-7-2022-0-182 +101;JL.2022.0.191;Maison des collections, Ville de Mons;Engraving;1802;;27/04/2025;;Signe de reconnaissance, moitié, femme, couronne, collier, papier, bons soins, enfant,;thankful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-191 +102;JL.2022.0.192;Maison des collections, Ville de Mons;pious image;1802;Charles;;;Signe de reconnaissance, christ, croix, enfant, bleu, papier, baptème, reconnaissance, bons soins;thankful, devotion, awe;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-192 +103;JL.2022.0.196;Maison des collections, Ville de Mons;Printed image;1800-1850;Michiel, Eloi;;;Signe de reconnaissance, homme, couleurs, rouge, vert, bleu, épée, bonnet, gravure, moitié, bonté;loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022-0-196 +104;JL.2022.0.200;Maison des collections, Ville de Mons;drawing;1800-1850;Andreas, Gabrielle;;;Signe de reconnaissance, fleurs, couleurs, roses, vert, moitié, papier, nourrice, directrice,;worried, thankful, creative;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022-0-200 +105;JL.2022.0.201;Maison des collections, Ville de Mons;drawing;1800-1850;Pauline;;;Signe de reconnaissance, dessins, papier, couleurs, rose, vert, rouge, œillets, fleurs, moitié, découpe, vague, feuillage, entrelats;hopeful, creative;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-201 +106;JL.2022.0.204;Maison des collections, Ville de Mons;pious image;1800-1850;Louis;;;Signe de reconnaissance, palme, coleurs, vert, rouge, saint, moitié, enfant;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022-0-204 +107;JL.2022.0.206;Maison des collections, Ville de Mons;pious image;1800-1850;Joséphine;;;Signe de reconaissance, moitié, papier, couleurs, anges, chérubins, entrelats, vert, bleu, enfant, baptème,;worried, hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022-0-206 +108;JL.2022.0.212;Maison des collections, Ville de Mons;drawing;1802;Adelaide;;;Signe de reconnaissance, papier, couleurs, roses, fleurs, feuillage, bleu, rouge, vert, entrelats, moitié;hopeful, creative,;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-212 +109;JL.2022.0.224;Maison des collections, Ville de Mons;Engraving;1800-1850;;;;Signe de reconnaissance, gravure, papier, prière, cœur, moitié, bons soins;hopeful, worried;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-224 +110;JL.2022.0.225;Maison des collections, Ville de Mons;Playing card;1800-1850;Charles;;;Signe de reconnaissance, carte, carreaux, rouge, moitié, jeu de société,;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022-0-225 +111;JL.2022.0.233;Maison des collections, Ville de Mons;pious image;1807;Joseph, Gabriel;16/04/2025;;Signe de reconnaissance, papier, gravure, anges, reprise, espoir, mère, réunion;joyful, curious;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you have any childhood memories of reunions with loved ones?;MAR-BVM-7-2022-0-233 +112;JL.2022.0.234;Maison des collections, Ville de Mons;drawing;1800-1850;;;;Signe de reconnaissance, papier, couleurs, moitié, reprise, cœur, fleurs, rose, bouquet, réunion;joyful, creative;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you have any childhood memories of reunions with loved ones?;MAR-BVM-7-2022-0-234 +113;JL.2022.0.235;Maison des collections, Ville de Mons;pious image;1800-1850;Elisabeth;;;Signe de reconnaissance, gravure, sainte, couleurs, feuillages, arbres, papier, moitié, réunion, baptème;Joyful, creative;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you have any childhood memories of reunions with loved ones?;MAR-BVM-7-2022-0-235 +114;JL.2022.0.238;Maison des collections, Ville de Mons;Printed sheet;1800-1850;Henri, Victor;02/07/2025;;Signe de reconnaissance, papier, livre, fleurs, moitié, réunion, saint, imprimeur, libraire, adoration, anges;joyful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you have any childhood memories of reunions with loved ones?;MAR-BVM-7-2022.0.238 +115;JL.2022.0.247;Maison des collections, Ville de Mons;baby hat;1800-1850;;;;Signe de reconnaissance, vêtement, tissu, couleurs, broderie, fleurs, rouge, bébé,;loving, curious;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you have a childhood memory linked to a special piece of clothe of yours or a uniform you were wearing when you were little ?;MAR-BVM-7-2022-0-247 +116;JL.2022.0.256;Maison des collections, Ville de Mons;bracelet;1800-1850;;;;Signe de reconnaissance, bracelet, bijoux, pierre, bleu;loving;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-256 / MAR-BVM-7-2022-0-256 +117;JL.2022.0.37.1;Maison des collections, Ville de Mons;Hand written note;1812;Waudru;25/05/2025;;Signe de reconnaissance, billet de papier, mère, bureau de bienfaisance, petite fille, nourrice, bons soins, reconnaissance, amour, parent, moitié, image, batpème,;loving, sad, thankful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-37-1-001 / MAR-BVM-7-2022-0-37-1-002 +118;JL.2022.0.37.2;Maison des collections, Ville de Mons;Locket;1800-1850;;04/02/2025;;Signe de reconnaissance, image pieuse, baptème, abbé, médaillon, pendentif, taureau, rouge, bleu, enfant;hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022-0-37-2 -001 / MAR-BVM-7-2022-0-37-2 -002 / MAR-BVM-7-2022-0-37-3 -002/ MAR-BVM-7-2022-0-37-3 -001 +119;JL.2022.0.39;Maison des collections, Ville de Mons;Rosary;1818;Louis;24/08/2025;;Signe de reconaissance, prière, chapelet, collier, billet de papier, petit garçon;loving, hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";And you? Do you keep a special object from your childhood inherited by your parents? Can you share it's story?;MAR-BVM-7-2022.0.39 +120;JL.2022.0.34.1-3;Maison des collections, Ville de Mons;pious image;1802;Narcisse;;;Signe de reconnaissance, enfant, ville, nourrice, image, moitié, couleurs, rouge, vert, bleu;worried, hopeful;"Signes de reconnaissance : images de piété, assignats, cartes à jouer, etc., coupés en deux fragments : l'un des fragments était attaché aux langes de l'enfant, l'autre était conservé par la mère, pour le cas où elle voulait reprendre l'enfant et justifier son +identité, par la présentation du fragment correspondant à celui que portait l'abandonné. Cette collection a été léguée par les hospices civils de Mons.";Do you know why your parents choose your name? What's the story behind?;MAR-BVM-7-2022.0.34 diff --git a/README.md b/README.md index b21633e39b7a2b44f28776b437b132961e90dd19..ca45d4a5533a4e80ab317b60bb1abff126b24cc4 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,17 @@ --- -title: CreativUp Demo -emoji: ⚡ -colorFrom: indigo -colorTo: green +title: Art Matcher - CreativUp Demo +emoji: 🎨 +colorFrom: purple +colorTo: pink sdk: gradio sdk_version: 5.44.1 app_file: app.py pinned: false +license: mit --- -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +# Art Matcher - Beta Test + +Découvrez l'œuvre d'art qui vous correspond dans notre collection ! + +Cette application utilise vos informations personnelles et vos préférences visuelles pour trouver l'œuvre qui vous correspond le mieux. diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..da2e2f0f94a8348f37fc0b6615393981632d6fb3 --- /dev/null +++ b/app.py @@ -0,0 +1,1281 @@ +#!/usr/bin/env python3 +""" +Web Demo v2 pour la base de données d'œuvres d'art - Version Sécurisée et Optimisée +Interface multi-étapes avec matching basé sur prénom, date, ville et émotions +Optimisé pour les performances avec caching et indexation +Version sécurisée avec validation des entrées et gestion d'état propre +""" + +import gradio as gr +import os +import sys +import logging +import random +import re +from datetime import datetime +from typing import List, Dict, Tuple, Optional, Any, Set +from collections import Counter, defaultdict +from functools import lru_cache +from dataclasses import dataclass, field +import pandas as pd + +logging.basicConfig( + level=logging.INFO, + format="[%(asctime)s] %(levelname)s: %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", +) +logger = logging.getLogger(__name__) + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src")) + +from art_pieces_db.database import Database +from art_pieces_db.query import TargetProfile, WeightedLeximaxOptimizer, Optimizer +from art_pieces_db.emotions import EmotionWheel +from art_pieces_db.utils import str_to_date + + +@dataclass +class ScoringWeights: + """Centralise toutes les constantes de scoring pour éviter les magic numbers""" + + PRESELECTION_NAME_WEIGHT: float = 3.0 + PRESELECTION_DATE_WEIGHT: float = 1.0 + PRESELECTION_PLACE_WEIGHT: float = 2.0 + PRESELECTION_EMOTION_WEIGHT: float = 0.0 + + MIN_PRESELECTION_COUNT: int = 20 + MAX_IMAGES_PER_SELECTION: int = 3 # nombre d'images par sélection + TOTAL_ROUNDS: int = 3 # nombre de rounds avant la recommandation finale + + +@dataclass +class SessionState: + """Gère l'état de session""" + + firstname: str = "" + birthday: str = "" + city: str = "" + + current_round: int = 0 + selected_images: List[str] = field(default_factory=list) + current_image_ids: List[str] = field(default_factory=list) + + preselected_pieces: Optional[pd.DataFrame] = None + + def reset(self): + """Réinitialise l'état de session""" + self.firstname = "" + self.birthday = "" + self.city = "" + self.current_round = 0 + self.selected_images = [] + self.current_image_ids = [] + self.preselected_pieces = None + + def is_complete(self) -> bool: + """Vérifie si la sélection est complète""" + return self.current_round >= ScoringWeights.TOTAL_ROUNDS + + +class SecurityValidator: + """Classe pour centraliser les validations de sécurité""" + + PATH_TRAVERSAL_PATTERN = re.compile(r"\.\.|\.\/") + VALID_FILENAME_PATTERN = re.compile(r"^[\w\-\.\s]+$") + VALID_INPUT_PATTERN = re.compile( + r"^[\w\-\s\'\.,àâäéèêëïîôûùüÿæœçÀÂÄÉÈÊËÏÎÔÛÙÜŸÆŒÇ]+$", re.UNICODE + ) + DATE_PATTERN = re.compile(r"^\d{1,2}/\d{1,2}$") + + @classmethod + def validate_filename(cls, filename: str) -> bool: + """Valide qu'un nom de fichier est sécurisé""" + if not filename: + return False + + # Vérifier les tentatives de path traversal + if cls.PATH_TRAVERSAL_PATTERN.search(filename): + logger.warning(f"Tentative de path traversal détectée: {filename}") + return False + + # Vérifier que le nom ne contient que des caractères autorisés + base_name = os.path.basename(filename) + if not cls.VALID_FILENAME_PATTERN.match(base_name): + logger.warning(f"Nom de fichier invalide: {filename}") + return False + + return True + + @classmethod + def sanitize_input(cls, input_str: str, max_length: int = 100) -> str: + """Nettoie et valide une entrée utilisateur""" + if not input_str: + return "" + + # Tronquer si trop long + input_str = input_str[:max_length].strip() + + if not cls.VALID_INPUT_PATTERN.match(input_str): + # Garder seulement les caractères valides + cleaned = "".join(c for c in input_str if cls.VALID_INPUT_PATTERN.match(c)) + logger.info(f"Input sanitized: '{input_str}' -> '{cleaned}'") + return cleaned + + return input_str + + @classmethod + def validate_date(cls, date_str: str) -> Tuple[bool, Optional[datetime]]: + """Valide et parse une date au format JJ/MM""" + if not date_str: + return False, None + + if not cls.DATE_PATTERN.match(date_str): + return False, None + + try: + day, month = map(int, date_str.split("/")) + if not (1 <= day <= 31 and 1 <= month <= 12): + return False, None + + date_obj = datetime(year=2000, month=month, day=day) + return True, date_obj + except (ValueError, Exception) as e: + logger.error(f"Erreur de parsing de date: {e}") + return False, None + + +class ImageIndexer: + """Classe pour indexer et mapper les images depuis la base de données CSV""" + + # Constants for better maintainability + IMAGE_EXTENSIONS = (".jpg", ".png") + COMMON_SUFFIXES = [".jpg", ".png", "_medium"] + MAR_BVM_TEST_SUFFIXES = ["-001", "-002", "-003"] + + def __init__(self, images_dir: str): + self.images_dir = os.path.abspath(images_dir) + self.available_files = set() + self.image_lookup = {} # normalized_name -> filename + self.mar_bvm_lookup = {} # Special handling for MAR-BVM files + self._build_index() + + def _strip_file_extensions(self, filename: str) -> str: + """Remove file extensions from filename""" + base_name = filename.lower() + if base_name.endswith("_medium.jpg"): + return base_name[:-11] + elif base_name.endswith((".jpg", ".png")): + return base_name[:-4] + return base_name + + def _normalize_basic_patterns(self, name: str) -> str: + """Apply basic normalization patterns""" + # Remove trailing comma and normalize whitespace + normalized = name.lower().strip().rstrip(",") + + # Remove common suffixes + for suffix in self.COMMON_SUFFIXES: + if normalized.endswith(suffix): + normalized = normalized[: -len(suffix)] + + # Normalize spaces and underscores to dashes + return re.sub(r"[\s_]+", "-", normalized) + + def _normalize_mar_bvm_format(self, name: str) -> str: + """Handle MAR-BVM specific normalization""" + if "mar-bvm" not in name: + return name + + # Replace .0. with -0- and remaining dots with dashes + return name.replace(".0.", "-0-").replace(".", "-") + + def _normalize_name(self, name: str) -> str: + """Normalise un nom pour la comparaison""" + normalized = self._normalize_basic_patterns(name) + + # Special handling for MAR-BVM format + if "mar-bvm" in normalized: + normalized = self._normalize_mar_bvm_format(normalized) + # For files starting with year (like 2022.0.86), keep dots + elif not normalized.startswith("20"): + normalized = normalized.replace(".", "-") + + return normalized + + def _create_mar_bvm_lookups(self, normalized: str, filename: str): + """Create additional lookup entries for MAR-BVM files""" + if "mar-bvm" not in normalized: + return + + parts = normalized.split("-") + for i, part in enumerate(parts): + if part.isdigit() and i >= 5: # After mar-bvm-7-2022-0 + base_key = "-".join(parts[:6]) # mar-bvm-7-2022-0-22 + if base_key not in self.mar_bvm_lookup: + self.mar_bvm_lookup[base_key] = [] + self.mar_bvm_lookup[base_key].append(filename) + break + + def _process_image_file(self, filename: str): + """Process a single image file for indexing""" + if not SecurityValidator.validate_filename(filename): + logger.warning(f"Fichier ignoré pour raison de sécurité: {filename}") + return + + if not filename.lower().endswith(self.IMAGE_EXTENSIONS): + return + + self.available_files.add(filename) + + base_name = self._strip_file_extensions(filename) + normalized = self._normalize_name(base_name) + self.image_lookup[normalized] = filename + self._create_mar_bvm_lookups(normalized, filename) + + def _build_index(self): + """Construit un index des images disponibles""" + try: + all_files = os.listdir(self.images_dir) + for filename in all_files: + self._process_image_file(filename) + + logger.info( + f"Index des images construit: {len(self.available_files)} fichiers disponibles, " + f"{len(self.image_lookup)} entrées normalisées" + ) + except Exception as e: + logger.error(f"Erreur lors de la construction de l'index: {e}") + self.available_files = set() + + def _clean_input_name(self, image_name: str) -> str: + """Clean and prepare input name for processing""" + # Basic cleaning + cleaned = image_name.strip().rstrip(",").rstrip("-").strip() + # Remove spaces before -001, -002, etc. + return re.sub(r"\s+(-\d)", r"\1", cleaned) + + def _normalize_mar_bvm_input(self, image_name: str) -> str: + """Handle MAR-BVM specific input normalization""" + if "MAR-BVM" not in image_name: + return image_name + + # Handle missing "7-" in MAR-BVM-2022-0-153 + if "MAR-BVM-2022-0-" in image_name: + image_name = image_name.replace("MAR-BVM-2022-0-", "MAR-BVM-7-2022-0-") + + # Convert .0. to -0- + if ".0." in image_name: + image_name = image_name.replace(".0.", "-0-") + + # Handle .001, .002 at the end (convert to -001, -002) + image_name = re.sub(r"\.(\d{3})$", r"-\1", image_name) + + # Handle .1 or .2 suffix + if image_name.endswith(".1"): + image_name = image_name[:-2] + "-1" + elif image_name.endswith(".2"): + image_name = image_name[:-2] + "-2" + + # Replace any remaining dots with dashes (but be careful not to mess up already processed parts) + return image_name.replace(".", "-") + + def _try_mar_bvm_lookups(self, normalized: str) -> Optional[str]: + """Try various MAR-BVM specific lookup strategies""" + # Check special MAR-BVM lookup + if normalized in self.mar_bvm_lookup and self.mar_bvm_lookup[normalized]: + return self.mar_bvm_lookup[normalized][0] + + # Try with suffix variations + for suffix in self.MAR_BVM_TEST_SUFFIXES: + test_pattern = f"{normalized}{suffix}" + if test_pattern in self.image_lookup: + return self.image_lookup[test_pattern] + + return None + + def _try_year_format_lookup(self, image_name: str) -> Optional[str]: + """Handle special case for files starting with year""" + if not image_name.startswith("20"): + return None + + test_name = image_name.lower().replace(" ", "-") + return self.image_lookup.get(test_name) + + def _try_partial_matching(self, normalized: str) -> Optional[str]: + """Try partial matching as last resort""" + for key, filename in self.image_lookup.items(): + if key.startswith(normalized) or normalized in key: + return filename + return None + + def _split_multiple_names(self, image_name: str) -> List[str]: + """Split image names that contain multiple names separated by commas or slashes""" + # First try comma separation + if "," in image_name: + return [name.strip() for name in image_name.split(",") if name.strip()] + + # Then try slash separation + if "/" in image_name: + return [name.strip() for name in image_name.split("/") if name.strip()] + + # Handle " - " separation (for cases like "MAR-BVM-7-2022.0.81 - 2022.0.81") + if " - " in image_name and image_name.count(" - ") == 1: + parts = [name.strip() for name in image_name.split(" - ")] + # Only use the first part if they look like duplicates + if len(parts) == 2: + first, second = parts + # Check if second part is a suffix of the first (like duplicate year) + if first.endswith(second) or second in first: + return [first] + return parts + + return [image_name] + + def find_image(self, image_name: str) -> Optional[str]: + """Trouve un fichier image correspondant au nom donné""" + if not image_name: + return None + + # Handle multiple image names in one field + possible_names = self._split_multiple_names(image_name) + + # Try each name individually + for name in possible_names: + result = self._find_single_image(name) + if result: + return result + + return None + + def _find_single_image(self, image_name: str) -> Optional[str]: + """Find a single image by name""" + # Clean and normalize the input + cleaned_name = self._clean_input_name(image_name) + processed_name = self._normalize_mar_bvm_input(cleaned_name) + normalized = self._normalize_name(processed_name) + + # Try direct lookup first + if normalized in self.image_lookup: + return self.image_lookup[normalized] + + # Try MAR-BVM specific lookups + if "mar-bvm" in normalized: + result = self._try_mar_bvm_lookups(normalized) + if result: + return result + + # Try year format lookup + result = self._try_year_format_lookup(image_name) + if result: + return result + + # Try partial matching as last resort + return self._try_partial_matching(normalized) + + def get_all_files(self) -> Set[str]: + """Retourne tous les fichiers disponibles""" + return self.available_files.copy() + + +class ArtMatcherV2: + """Classe principale pour le matching d'œuvres d'art""" + + def __init__(self, csv_path: str, images_dir: str): + """Initialise le système avec la base de données et le répertoire d'images""" + self.db = Database(csv_path) + self.images_dir = os.path.abspath(images_dir) + self.emotion_wheel = EmotionWheel() + self.weights = ScoringWeights() + + self.optimizer_helper = WeightedLeximaxOptimizer(TargetProfile(), {}) + + self.image_indexer = ImageIndexer(images_dir) + + df = self.db.get_dataframe() + self.df_with_images = df[ + df["name_image"].notna() + & (df["name_image"] != "") + & (df["name_image"].str.strip() != "") + ].copy() + + self.df_with_images["database_id_str"] = self.df_with_images[ + "database_id" + ].astype(str) + self.id_to_index = { + str(row["database_id"]): idx for idx, row in self.df_with_images.iterrows() + } + + self.artwork_images = self._build_artwork_image_index() + + self.temp_db_with_images = Database.__new__(Database) + self.temp_db_with_images.dataframe = self.df_with_images + + logger.info(f"Base de données chargée: {self.db.n_pieces()} œuvres") + logger.info(f"Œuvres avec images: {len(self.df_with_images)}") + logger.info(f"Index des images: {len(self.artwork_images)} œuvres mappées") + + def _sanitize_input(self, input_str: str) -> str: + """Nettoie et valide une entrée utilisateur""" + return SecurityValidator.sanitize_input(input_str) + + def _parse_date(self, date_str: str) -> Optional[datetime]: + """Parse une date avec validation""" + is_valid, date_obj = SecurityValidator.validate_date(date_str) + return date_obj if is_valid else None + + def _build_artwork_image_index(self) -> Dict[str, List[str]]: + """Construit un index artwork_id -> [image_paths] au démarrage""" + artwork_images = {} + + for idx, row in self.df_with_images.iterrows(): + artwork_id = str(row["database_id"]) + image_paths = [] + + if row["name_image"] and str(row["name_image"]).strip(): + # Parse the image names - handle special separators + image_string = str(row["name_image"]).strip().strip('"') + + # Handle cases with " / " or " - " separators + if " / " in image_string: + # Take first part before the slash + image_string = image_string.split(" / ")[0].strip() + + # Special case: if it has " - 2022" it's a separator, not part of the name + if " - 2022" in image_string: + # Take the part before " - 2022" + image_string = image_string.split(" - 2022")[0].strip() + elif " - " in image_string and "MAR-BVM-7-2022-0-" not in image_string: + # For other MAR-BVM formats with " - " separator + parts = image_string.split(" - ") + if "MAR-BVM" in parts[0]: + image_string = parts[0].strip() + + # Clean up trailing " -" or spaces before "-001" + image_string = re.sub( + r"\s+-\s*$", "", image_string + ) # Remove trailing " -" + image_string = re.sub( + r"\s+(-\d)", r"\1", image_string + ) # Remove spaces before -001 + + # Parse comma-separated list + images = [ + img.strip() + for img in re.split(r"[,/]", image_string) + if img.strip() + ] + + for img_name in images: + # Find the actual file for this image name + matched_file = self.image_indexer.find_image(img_name) + if matched_file: + img_path = os.path.join(self.images_dir, matched_file) + image_paths.append(img_path) + + if image_paths: + artwork_images[artwork_id] = image_paths + + return artwork_images + + def preselect_artworks( + self, firstname: str, birthday: str, city: str + ) -> pd.DataFrame: + """ + Pré-sélectionne les œuvres selon la hiérarchie: prénom > date > ville + """ + logger.info("=== DÉBUT PRÉ-SÉLECTION ===") + + # Nettoyer les entrées + firstname = self._sanitize_input(firstname) + city = self._sanitize_input(city) + + logger.info( + f"Critères de pré-sélection: prénom='{firstname}', date='{birthday}', ville='{city}'" + ) + + birth_date = self._parse_date(birthday) + if birth_date: + logger.info(f"Date convertie: {birth_date.strftime('%d/%m')}") + + profile = TargetProfile() + profile.set_target_name(firstname) + profile.set_target_date(birth_date) + profile.set_target_place(city) + + weights = { + "related_names": self.weights.PRESELECTION_NAME_WEIGHT, + "related_dates": self.weights.PRESELECTION_DATE_WEIGHT, + "related_places": self.weights.PRESELECTION_PLACE_WEIGHT, + "related_emotions": self.weights.PRESELECTION_EMOTION_WEIGHT, + } + + logger.info( + f"Poids utilisés: nom={weights['related_names']}, date={weights['related_dates']}, lieu={weights['related_places']}, émotions={weights['related_emotions']}" + ) + + optimizer = WeightedLeximaxOptimizer(profile, weights) + result = optimizer.optimize_max(self.temp_db_with_images) + + preselected = result[result["score"] > (0, 0, 0)] + logger.info(f"Œuvres avec score > 0: {len(preselected)}") + + if len(preselected) < self.weights.MIN_PRESELECTION_COUNT: + preselected = result.head(self.weights.MIN_PRESELECTION_COUNT) + logger.info(f"Ajustement au minimum requis: {len(preselected)} œuvres") + + logger.info("Top 5 pré-sélections:") + for i, (idx, piece) in enumerate(preselected.head(5).iterrows()): + logger.info( + f" {i+1}. Œuvre #{piece['database_id']} - Score: {piece['score']}" + ) + if firstname and piece["related_names"]: + name_score = Optimizer.name_similarity( + firstname, piece["related_names"] + ) + if name_score > 0: + logger.info( + f" → Nom: {piece['related_names']} (score: {name_score:.2f})" + ) + if birth_date and piece["related_dates"]: + date_score = Optimizer.date_similarity( + birth_date, piece["related_dates"] + ) + if date_score > 0: + logger.info( + f" → Dates: {[d.strftime('%d/%m') for d in piece['related_dates']]} (score: {date_score:.2f})" + ) + if city and piece["related_places"]: + place_score = self.optimizer_helper.place_similarity( + city, piece["related_places"] + ) + if place_score > 0: + logger.info( + f" → Lieux: {piece['related_places']} (score: {place_score:.2f})" + ) + + logger.info("=== FIN PRÉ-SÉLECTION ===") + return preselected + + def get_random_images_for_selection( + self, round_num: int, already_selected: List[str] = None + ) -> List[Tuple[str, str]]: + """ + Retourne 3 images aléatoires depuis l'index pré-construit + Exclut les œuvres déjà sélectionnées dans les tours précédents + """ + logger.info(f"=== SÉLECTION D'IMAGES POUR LE TOUR {round_num} ===") + + if already_selected: + logger.info(f"Œuvres déjà sélectionnées à exclure: {already_selected}") + + available_artworks = list(self.artwork_images.keys()) + + # Exclure les œuvres déjà sélectionnées + if already_selected: + already_selected_set = set(already_selected) + available_artworks = [ + a for a in available_artworks if a not in already_selected_set + ] + + logger.info( + f"Nombre total d'œuvres avec images disponibles: {len(available_artworks)}" + ) + + if len(available_artworks) < self.weights.MAX_IMAGES_PER_SELECTION: + logger.warning( + f"Seulement {len(available_artworks)} œuvres avec images disponibles" + ) + direct_images = [] + for filename in list(self.image_indexer.get_all_files())[:10]: + if filename.endswith(".jpg"): + img_path = os.path.join(self.images_dir, filename) + direct_images.append((img_path, "0")) + return direct_images[: self.weights.MAX_IMAGES_PER_SELECTION] + + num_to_select = min( + self.weights.MAX_IMAGES_PER_SELECTION, len(available_artworks) + ) + selected_artworks = random.sample(available_artworks, num_to_select) + + logger.info(f"Œuvres sélectionnées aléatoirement: {selected_artworks}") + + selected = [] + for artwork_id in selected_artworks: + img_path = random.choice(self.artwork_images[artwork_id]) + selected.append((img_path, artwork_id)) + if artwork_id in self.id_to_index: + idx = self.id_to_index[artwork_id] + artwork = self.df_with_images.loc[idx] + logger.info(f" Image {len(selected)}: Œuvre #{artwork_id}") + logger.info(f" Type: {artwork['art_piece_type']}") + logger.info(f" Émotions: {artwork['related_emotions']}") + + logger.info(f"=== FIN SÉLECTION IMAGES TOUR {round_num} ===") + return selected + + def extract_emotions_from_image_id(self, database_id: str) -> List[str]: + """ + Extrait les émotions associées à une œuvre via son ID + Utilise l'index pré-calculé pour éviter les conversions répétées + """ + if database_id in self.id_to_index: + idx = self.id_to_index[database_id] + emotions = self.df_with_images.loc[idx, "related_emotions"] + if isinstance(emotions, list): + return emotions + return [] + + @lru_cache(maxsize=1024) + def _cached_emotion_similarity(self, emotion1: str, emotion2: str) -> float: + """Cache les calculs de similarité émotionnelle""" + return self.emotion_wheel.calculate_emotion_similarity(emotion1, emotion2) + + def calculate_emotion_profile(self, selected_ids: List[str]) -> Dict[str, float]: + """ + Calcule le profil émotionnel basé sur les images sélectionnées + """ + logger.info("=== CALCUL DU PROFIL ÉMOTIONNEL ===") + logger.info(f"Images sélectionnées: {selected_ids}") + + emotion_counter = Counter() + + for db_id in selected_ids: + emotions = self.extract_emotions_from_image_id(db_id) + logger.info(f" Image {db_id}: émotions = {emotions}") + emotion_counter.update(emotions) + + total = sum(emotion_counter.values()) + if total > 0: + emotion_profile = { + emotion: count / total for emotion, count in emotion_counter.items() + } + logger.info(f"Profil émotionnel calculé: {emotion_profile}") + else: + emotion_profile = {} + logger.info("Aucune émotion trouvée dans les images sélectionnées") + + logger.info("=== FIN CALCUL PROFIL ÉMOTIONNEL ===") + return emotion_profile + + def _get_artwork_image(self, artwork) -> Optional[str]: + """Retourne le chemin de l'image pour une œuvre d'art""" + artwork_id = str(artwork["database_id"]) + + # Simply return the first image from our pre-built index + if artwork_id in self.artwork_images: + return self.artwork_images[artwork_id][0] + + return None + + def find_best_match( + self, firstname: str, birthday: str, city: str, selected_image_ids: List[str] + ) -> Tuple[Optional[str], str, Dict]: + """ + Trouve la meilleure correspondance selon la hiérarchie du scénario: + 1. Match exact (name/date/city) = gagnant automatique + 2. Si pré-sélection existe: utiliser émotions pour départager + 3. Si aucune pré-sélection: utiliser émotions seules + 4. Type d'objet comme critère de départage final + """ + firstname = self._sanitize_input(firstname) + city = self._sanitize_input(city) + birth_date = self._parse_date(birthday) + + logger.info( + f"Recherche de correspondance pour: {firstname}, {birthday}, {city}" + ) + + preselected = self.preselect_artworks(firstname, birthday, city) + + logger.info("=== DÉTECTION DE MATCH EXACT ===") + for idx, piece in preselected.iterrows(): + if firstname and piece["related_names"]: + name_score = Optimizer.name_similarity( + firstname, piece["related_names"] + ) + if name_score >= 0.95: + logger.info( + f"🎯 MATCH EXACT TROUVÉ: prénom '{firstname}' → œuvre #{piece['database_id']} (score: {name_score:.2f})" + ) + logger.info(f" Noms dans l'œuvre: {piece['related_names']}") + match_image = self._get_artwork_image(piece) + match_info = { + "title": f"Œuvre #{piece['database_id']}", + "type": piece["art_piece_type"], + "place": piece["art_piece_place"], + "emotions": piece["related_emotions"], + "explanation": piece["explanation"], + } + return ( + match_image, + f"Prénom '{firstname}' correspond exactement", + match_info, + ) + + if birth_date and piece["related_dates"]: + date_score = Optimizer.date_similarity( + birth_date, piece["related_dates"] + ) + if date_score == 1.0: + logger.info( + f"🎯 MATCH EXACT TROUVÉ: date '{birthday}' → œuvre #{piece['database_id']}" + ) + logger.info( + f" Dates dans l'œuvre: {[d.strftime('%d/%m/%Y') for d in piece['related_dates']]}" + ) + match_image = self._get_artwork_image(piece) + match_info = { + "title": f"Œuvre #{piece['database_id']}", + "type": piece["art_piece_type"], + "place": piece["art_piece_place"], + "emotions": piece["related_emotions"], + "explanation": piece["explanation"], + } + return ( + match_image, + f"Date d'anniversaire {birthday} correspond exactement", + match_info, + ) + + if city and piece["related_places"]: + place_score = self.optimizer_helper.place_similarity( + city, piece["related_places"] + ) + if place_score == 1.0: + logger.info( + f"🎯 MATCH EXACT TROUVÉ: ville '{city}' → œuvre #{piece['database_id']}" + ) + logger.info(f" Lieux dans l'œuvre: {piece['related_places']}") + match_image = self._get_artwork_image(piece) + match_info = { + "title": f"Œuvre #{piece['database_id']}", + "type": piece["art_piece_type"], + "place": piece["art_piece_place"], + "emotions": piece["related_emotions"], + "explanation": piece["explanation"], + } + return ( + match_image, + f"Ville '{city}' correspond exactement", + match_info, + ) + + logger.info("Aucun match exact trouvé, passage à la sélection par émotions") + + emotion_profile = self.calculate_emotion_profile(selected_image_ids) + + logger.info("=== STRATÉGIE DE MATCHING ===") + valid_preselection = preselected[preselected["score"] > (0, 0, 0)] + + if len(valid_preselection) > 0: + logger.info( + f"📋 CAS A: {len(valid_preselection)} œuvres pré-sélectionnées - utilisation des émotions pour départager" + ) + candidates = valid_preselection + else: + logger.info( + f"📋 CAS B: Aucune pré-sélection valide - recherche par émotions sur {len(self.df_with_images)} œuvres" + ) + candidates = self.df_with_images + + # Exclure les œuvres déjà sélectionnées par l'utilisateur + selected_artwork_ids = set(selected_image_ids) + candidates = candidates[ + ~candidates["database_id"].astype(str).isin(selected_artwork_ids) + ] + logger.info( + f"Après exclusion des œuvres déjà sélectionnées {selected_artwork_ids}: {len(candidates)} candidats restants" + ) + + logger.info("=== CALCUL DES SCORES ÉMOTIONNELS ===") + best_matches = [] + best_emotion_score = -1 + + for idx, piece in candidates.iterrows(): + emotion_score = 0 + + if emotion_profile and piece["related_emotions"]: + for user_emotion, weight in emotion_profile.items(): + best_similarity = 0 + for piece_emotion in piece["related_emotions"]: + similarity = self._cached_emotion_similarity( + user_emotion, piece_emotion + ) + if similarity > best_similarity: + best_similarity = similarity + emotion_score += best_similarity * weight + + if len(piece["related_emotions"]) > 0: + emotion_score /= len(piece["related_emotions"]) + + if emotion_score > best_emotion_score: + best_emotion_score = emotion_score + best_matches = [piece] + logger.info( + f" Nouveau meilleur score émotionnel: {emotion_score:.3f} - Œuvre #{piece['database_id']}" + ) + elif emotion_score == best_emotion_score and emotion_score > 0: + best_matches.append(piece) + logger.info( + f" Score égal au meilleur: {emotion_score:.3f} - Œuvre #{piece['database_id']}" + ) + + logger.info( + f"Nombre de meilleures correspondances: {len(best_matches)} avec score {best_emotion_score:.3f}" + ) + + if len(best_matches) > 1: + logger.info("=== DÉPARTAGE PAR TYPE D'OBJET ===") + selected_types = [] + for img_id in selected_image_ids: + if img_id in self.id_to_index: + idx = self.id_to_index[img_id] + selected_types.append( + self.df_with_images.loc[idx, "art_piece_type"] + ) + + selected_types_counter = Counter(selected_types) + + type_scored_matches = [] + best_type_score = -1 + + for piece in best_matches: + type_score = selected_types_counter.get(piece["art_piece_type"], 0) + if type_score > best_type_score: + best_type_score = type_score + type_scored_matches = [piece] + elif type_score == best_type_score: + type_scored_matches.append(piece) + + if len(type_scored_matches) > 1: + logger.info( + f" {len(type_scored_matches)} œuvres avec le même score de type ({best_type_score}) - sélection aléatoire" + ) + best_match = random.choice(type_scored_matches) + match_reason = ( + "Sélection aléatoire parmi les meilleures correspondances" + ) + else: + best_match = type_scored_matches[0] + match_reason = f"Type d'objet '{best_match['art_piece_type']}' préféré" + logger.info( + f" Type '{best_match['art_piece_type']}' sélectionné avec score {best_type_score}" + ) + elif len(best_matches) == 1: + best_match = best_matches[0] + match_reason = "Meilleure correspondance émotionnelle" + else: + logger.info("Aucune correspondance trouvée") + return None, "Aucune correspondance trouvée", {} + + reasons = [] + if len(valid_preselection) > 0: + if firstname and best_match["related_names"]: + name_score = Optimizer.name_similarity( + firstname, best_match["related_names"] + ) + if name_score > 0: + reasons.append(f"prénom '{firstname}' trouvé") + + if birth_date and best_match["related_dates"]: + date_score = Optimizer.date_similarity( + birth_date, best_match["related_dates"] + ) + if date_score > 0: + reasons.append( + f"date {'exacte' if date_score == 1.0 else 'partielle'}" + ) + + if city and best_match["related_places"]: + place_score = self.optimizer_helper.place_similarity( + city, best_match["related_places"] + ) + if place_score > 0: + reasons.append(f"ville '{city}' trouvée") + + if best_emotion_score > 0: + reasons.append( + f"correspondance émotionnelle (score: {best_emotion_score:.2f})" + ) + + if len(reasons) == 0: + reasons.append(match_reason) + + final_reason = " ; ".join(reasons) + + logger.info(f"\n🏆 RÉSULTAT FINAL: Œuvre #{best_match['database_id']}") + logger.info(f" Raison: {final_reason}") + logger.info(f" Type: {best_match['art_piece_type']}") + logger.info(f" Lieu: {best_match['art_piece_place']}") + + match_image = self._get_artwork_image(best_match) + + match_info = { + "title": f"Œuvre #{best_match['database_id']}", + "type": best_match["art_piece_type"], + "place": best_match["art_piece_place"], + "emotions": best_match["related_emotions"], + "explanation": best_match["explanation"], + } + + return match_image, final_reason, match_info + + +csv_path = "PP1-Collection_Database_new-cleaned.csv" +images_dir = "pictures_data" + +if not os.path.exists(csv_path): + logger.error(f"Fichier CSV introuvable: {csv_path}") +if not os.path.exists(images_dir): + logger.error(f"Répertoire images introuvable: {images_dir}") + +matcher = ArtMatcherV2(csv_path, images_dir) + + +def process_user_info(firstname: str, birthday: str, city: str, state: SessionState): + """Traite les informations utilisateur avec validation""" + firstname = SecurityValidator.sanitize_input(firstname) + city = SecurityValidator.sanitize_input(city) + + state.firstname = firstname + state.birthday = birthday + state.city = city + + if not firstname or not birthday: + return ( + gr.update(visible=True), + gr.update(visible=False), + gr.update(visible=False), + "Veuillez remplir au moins votre prénom et date de naissance.", + state, + ) + + is_valid, _ = SecurityValidator.validate_date(birthday) + if not is_valid: + return ( + gr.update(visible=True), + gr.update(visible=False), + gr.update(visible=False), + "Format de date invalide. Utilisez JJ/MM (ex: 15/03)", + state, + ) + + return ( + gr.update(visible=False), + gr.update(visible=True), + gr.update(visible=False), + "Informations enregistrées ! Passons à la sélection d'images.", + state, + ) + + +def load_images_for_round(round_num: int, state: SessionState): + """Charge 3 images pour un tour de sélection""" + images_data = matcher.get_random_images_for_selection( + round_num, state.selected_images + ) + + if len(images_data) < ScoringWeights.MAX_IMAGES_PER_SELECTION: + logger.warning(f"Seulement {len(images_data)} images disponibles") + return ( + [None, None, None], + [], + f"Pas assez d'images disponibles (seulement {len(images_data)} trouvées)", + state, + ) + + images = [img[0] for img in images_data] + ids = [img[1] for img in images_data] + + state.current_image_ids = ids + + return ( + images, + ids, + f"Tour {round_num + 1}/{ScoringWeights.TOTAL_ROUNDS} : Sélectionnez l'image qui vous attire le plus", + state, + ) + + +def select_image(choice: Optional[int], state: SessionState): + """Traite la sélection d'image""" + if choice is None: + return ( + gr.update(), + gr.update(), + gr.update(), + gr.update(), + "Veuillez sélectionner une image", + state, + ) + + if state.current_image_ids and len(state.current_image_ids) > choice: + selected_id = state.current_image_ids[choice] + else: + return ( + gr.update(), + gr.update(), + gr.update(), + gr.update(), + "Erreur: image non trouvée", + state, + ) + + state.selected_images.append(selected_id) + state.current_round += 1 + + logger.info( + f"Tour {state.current_round}: Image {choice+1} sélectionnée (ID: {selected_id})" + ) + + if state.current_round < ScoringWeights.TOTAL_ROUNDS: + new_images, new_ids, message, state = load_images_for_round( + state.current_round, state + ) + return ( + gr.update(value=new_images[0]), + gr.update(value=new_images[1]), + gr.update(value=new_images[2]), + gr.update(value=None), + message, + state, + ) + else: + return ( + gr.update(), + gr.update(), + gr.update(), + gr.update(), + "Sélection terminée ! Calcul de votre œuvre correspondante...", + state, + ) + + +def show_results(state: SessionState): + """Affiche les résultats finaux""" + if not state.is_complete(): + return ( + gr.update(visible=False), + gr.update(visible=True), + gr.update(visible=False), + None, + "", + "", + ) + + match_image, reason, info = matcher.find_best_match( + state.firstname, + state.birthday, + state.city, + state.selected_images, + ) + + if match_image: + explanation = f""" +**Votre œuvre correspondante a été trouvée !** + +**Raison du match :** {reason} + +**Détails de l'œuvre :** +- Type : {info.get('type', 'Non spécifié')} +- Lieu : {info.get('place', 'Non spécifié')} +- Émotions : {', '.join(info.get('emotions', [])) if info.get('emotions') else 'Non spécifiées'} + +**Description :** +{info.get('explanation', 'Aucune description disponible')} +""" + else: + explanation = "Désolé, aucune œuvre correspondante n'a pu être trouvée." + + return ( + gr.update(visible=False), + gr.update(visible=False), + gr.update(visible=True), + match_image, + info.get("title", "Œuvre non trouvée"), + explanation, + ) + + +with gr.Blocks(title="Art Matcher", theme=gr.themes.Soft()) as demo: + gr.Markdown( + """ + # 🎨 Art Matcher + ### Découvrez l'œuvre d'art qui vous correspond ! + + Cette application utilise vos informations personnelles et vos préférences visuelles + pour trouver l'œuvre d'art qui vous correspond le mieux dans notre collection. + """ + ) + + session_state = gr.State(SessionState()) + + with gr.Group(visible=True) as info_section: + gr.Markdown("### Étape 1 : Vos informations") + with gr.Row(): + firstname_input = gr.Textbox( + label="Prénom", placeholder="Entrez votre prénom", max_lines=1 + ) + birthday_input = gr.Textbox( + label="Date d'anniversaire (JJ/MM)", + placeholder="Ex: 25/12", + max_lines=1, + ) + city_input = gr.Textbox( + label="Ville de résidence", placeholder="Ex: Paris", max_lines=1 + ) + + submit_info_btn = gr.Button("Valider mes informations", variant="primary") + + with gr.Group(visible=False) as selection_section: + selection_title = gr.Markdown("### Étape 2 : Sélection d'images") + + with gr.Row(): + img1 = gr.Image(label="Image 1", type="filepath", height=300) + img2 = gr.Image(label="Image 2", type="filepath", height=300) + img3 = gr.Image(label="Image 3", type="filepath", height=300) + + image_choice = gr.Radio( + choices=["Image 1", "Image 2", "Image 3"], + label="Quelle image vous attire le plus ?", + type="index", + ) + + select_btn = gr.Button("Valider mon choix", variant="primary") + + with gr.Group(visible=False) as results_section: + gr.Markdown("### Votre œuvre correspondante") + + with gr.Row(): + with gr.Column(scale=1): + result_image = gr.Image(label="Votre œuvre", height=400) + result_title = gr.Markdown("## Titre de l'œuvre") + + with gr.Column(scale=1): + result_explanation = gr.Markdown("") + + restart_btn = gr.Button("Recommencer", variant="secondary") + + status_message = gr.Markdown("") + + def on_info_submit(firstname, birthday, city, state): + state.reset() + + info_vis, select_vis, results_vis, message, state = process_user_info( + firstname, birthday, city, state + ) + + if select_vis["visible"]: + images, ids, round_message, state = load_images_for_round(0, state) + return ( + info_vis, + select_vis, + results_vis, + images[0] if len(images) > 0 else None, + images[1] if len(images) > 1 else None, + images[2] if len(images) > 2 else None, + round_message, + state, + ) + else: + return (info_vis, select_vis, results_vis, None, None, None, message, state) + + submit_info_btn.click( + fn=on_info_submit, + inputs=[firstname_input, birthday_input, city_input, session_state], + outputs=[ + info_section, + selection_section, + results_section, + img1, + img2, + img3, + status_message, + session_state, + ], + ) + + def on_image_select(choice, state): + (img1_update, img2_update, img3_update, choice_update, message, state) = ( + select_image(choice, state) + ) + + return ( + gr.update(), # info_section + gr.update(), # selection_section + gr.update(), # results_section + img1_update, # img1 + img2_update, # img2 + img3_update, # img3 + choice_update, # image_choice + message, # status_message + state, + ) + + def handle_final_results(state): + if state.is_complete(): + return show_results(state) + else: + return gr.update(), gr.update(), gr.update(), None, "", "" + + select_btn.click( + fn=on_image_select, + inputs=[image_choice, session_state], + outputs=[ + info_section, + selection_section, + results_section, + img1, + img2, + img3, + image_choice, + status_message, + session_state, + ], + ).then( + fn=handle_final_results, + inputs=[session_state], + outputs=[ + info_section, + selection_section, + results_section, + result_image, + result_title, + result_explanation, + ], + ) + + def restart_app(state): + state.reset() + + return ( + gr.update(visible=True), + gr.update(visible=False), + gr.update(visible=False), + "", + "", + "", + None, + "Application réinitialisée. Veuillez entrer vos informations.", + state, + ) + + restart_btn.click( + fn=restart_app, + inputs=[session_state], + outputs=[ + info_section, + selection_section, + results_section, + firstname_input, + birthday_input, + city_input, + image_choice, + status_message, + session_state, + ], + ) + + +if __name__ == "__main__": + demo.launch() diff --git a/pictures_data/2022.0.86_medium.jpg b/pictures_data/2022.0.86_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d761f168f94a3b1d4af29aa743206eab3ca7577 Binary files /dev/null and b/pictures_data/2022.0.86_medium.jpg differ diff --git a/pictures_data/Abena_01_021.jpg b/pictures_data/Abena_01_021.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d048005011e22fdf839d82d26633671ff02f1b5 Binary files /dev/null and b/pictures_data/Abena_01_021.jpg differ diff --git a/pictures_data/Abena_02_408.jpg b/pictures_data/Abena_02_408.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6b92671c99b33b1a7cf633f7796f4adb4ac59a5 --- /dev/null +++ b/pictures_data/Abena_02_408.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3db9f21b69b2d197c4e7725bcea24053a908376298e8d8e858424e286bcce447 +size 126084 diff --git a/pictures_data/Abena_03_513.jpg b/pictures_data/Abena_03_513.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8fa19dc0f57d63712109c6bc741b2ae3ea905950 --- /dev/null +++ b/pictures_data/Abena_03_513.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efcc0bda6c86f6ef68dc09aaac4852201c161fd568ff3da55876cef8d71dca83 +size 142166 diff --git a/pictures_data/Abena_04_539.jpg b/pictures_data/Abena_04_539.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f275be2f5ce5a084aab95ac9d9e91b51980e9d6 --- /dev/null +++ b/pictures_data/Abena_04_539.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:190096fb96d0b80bfe2f81185f5720e0297cfc0ca8dcdfdd0e4265ca1f19c4af +size 110552 diff --git a/pictures_data/IMadeYou_01_053.jpg b/pictures_data/IMadeYou_01_053.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc13305d20452a893cad2eddc85c2faa6495966a --- /dev/null +++ b/pictures_data/IMadeYou_01_053.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0606213bea9332a7246d2357d0c0ab6dea139789a9d1e12141031d7b7106ada1 +size 155304 diff --git a/pictures_data/IMadeYou_02_220.jpg b/pictures_data/IMadeYou_02_220.jpg new file mode 100644 index 0000000000000000000000000000000000000000..379d8d630ffe054a7c54c8611fcb5cba6d563865 --- /dev/null +++ b/pictures_data/IMadeYou_02_220.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e67d5279cc1c3e3daa2b0dcf2fb6d683aa4967fcacc1a44b05892c407c5bb739 +size 287856 diff --git a/pictures_data/IMadeYou_03_406.jpg b/pictures_data/IMadeYou_03_406.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c9a76f1dff9f12f7762a0e32fc0eb05f440c2d9 --- /dev/null +++ b/pictures_data/IMadeYou_03_406.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e11b317426180dedf9cc5a6ced794304280a4c35d0bd99f1a3415b48abace9fc +size 289880 diff --git a/pictures_data/IMadeYou_04_710.jpg b/pictures_data/IMadeYou_04_710.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d4422022259ba10bc4d7b21edaca3569d3ea07b2 --- /dev/null +++ b/pictures_data/IMadeYou_04_710.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4eaaa1bea3d79f100c6480fb49cd2cbc14e6d2d633dcaeab4471d3135d8db5df +size 315146 diff --git a/pictures_data/IMadeYou_05_828.jpg b/pictures_data/IMadeYou_05_828.jpg new file mode 100644 index 0000000000000000000000000000000000000000..77f570bef010b9ba911652b0b686bc780da1c7db --- /dev/null +++ b/pictures_data/IMadeYou_05_828.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d31ab83eb00f0f2d18cc1e813c24a728cf0b0d7c646e998b0e494f2cd7e0c35 +size 263498 diff --git a/pictures_data/IMadeYou_06_1243.jpg b/pictures_data/IMadeYou_06_1243.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e123752ad50051b28e2bf8ad82fae67970dd55a9 --- /dev/null +++ b/pictures_data/IMadeYou_06_1243.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95d7f625fb455e132978abf9f427b8283a71fc65be33d7656e4db585e5ba7a43 +size 287415 diff --git a/pictures_data/Isabella_1_045.jpg b/pictures_data/Isabella_1_045.jpg new file mode 100644 index 0000000000000000000000000000000000000000..adb8ed2199bb0e36da94e05ddbe2d8cc0629359f Binary files /dev/null and b/pictures_data/Isabella_1_045.jpg differ diff --git a/pictures_data/Isabella_2_1737.jpg b/pictures_data/Isabella_2_1737.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2713c26e2a0504fc4cb8e657e1b968501c7f5807 --- /dev/null +++ b/pictures_data/Isabella_2_1737.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2658ed9d704194b3aa695eab706cffd327cddbcaba318bc10f936fa6738a333 +size 137313 diff --git a/pictures_data/Isabella_3_1910.jpg b/pictures_data/Isabella_3_1910.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ed316cd0418e4ff44349b682135501ced8944d9 --- /dev/null +++ b/pictures_data/Isabella_3_1910.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81088ef5475339a37d2d8d7b4e63c57701c5236b28c751d2b44139bbd29ec470 +size 140693 diff --git a/pictures_data/MAR-BVM-7-2022-0-100-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-100-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d3bfccd62ea087ca76d813cd913f2ff4b4e2809 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-100-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-100-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-100-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74955aa58206ceff733c5f8993339f900b5a99f3 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-100-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-105-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-105-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3c19bccff613d698ee08b75045f1fb2033f4480a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-105-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-105-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-105-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de927b0458035e257f6eb3a0b2c7092df1a61a2f Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-105-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-125-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-125-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..979f9c91c7c45fb1dfe05f6574174514cd588e9b Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-125-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-128-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-128-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c08a3169e9d9a9ccc85cd50cbd9228a5585ed8e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-128-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-128-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-128-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd3c83a931882718d31510018cbc730db8b93fa0 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-128-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-130-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-130-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7cf4322f8cfd2c87dd7de22865b5d57421b2e63 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-130-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-130-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-130-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..739918bfc4474b5913cf250e0b344357e033fe60 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-130-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-131-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-131-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b4ea402d23630259d8a437b9fa42e0355e012fd Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-131-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-132-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-132-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a3f48d73e03b145044fc86f4f0a06e3e350a5ba Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-132-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-132-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-132-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe165d7ed77eac369b010bf073d1e5151e7847b4 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-132-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-133_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-133_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1301450e5313565c0aa2cba3a891d5d04df6d4e8 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-133_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-134-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-134-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6cb659e95363339f4944c453c3cfbcf0fd3941a3 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-134-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-134-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-134-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1fbe2b52baee9b7e28f102698870405c9fae00b Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-134-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-134-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-134-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2686d26922614da84a8b0f8d3500104549997f2c Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-134-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-135-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-135-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a805719050a938236a1da0f5536772b492a73457 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-135-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-135-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-135-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53cfdee5565b64f2b1cd7a9f13925d6e5a1df5a9 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-135-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-136-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-136-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95d2e6f03f46c644e0aea3a6a7befe87f22c6212 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-136-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-136-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-136-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1646c48eac5b1d463f628d32c8e0af3881f5b43a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-136-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-138-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-138-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..35c3b71b350506057d4c1ae222d5975758692a13 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-138-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-138-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-138-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..311a5582c2ccfa859e14f5283481698db968ac3d Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-138-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-139-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-139-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f8d134a693ee5c74807f5d7f53ee26e93f9b180 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-139-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-139-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-139-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76f88e397d1fe7b43ab0053d361ed23e536c3281 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-139-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-147-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-147-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d345d4d3defd70eb51c51856704f4dea4a823f81 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-147-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-147-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-147-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f72193112a3b9902af695727ab39b77f4fc8895 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-147-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-148-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-148-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9aa8ce76ae56268f9aa043d719297849fec1693c Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-148-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-148-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-148-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76d2db50a123fa9e296593f8fd776f2e4a00d9bd Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-148-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-149-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-149-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..942af0e196651b9e9e0a6e67a4b0367cd676770f Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-149-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-149-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-149-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9700ffc31ad92eba7aab5ca40bf208d7af96e6eb Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-149-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-153-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-153-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97d7704c9623ee59d3fc03ad0ef5439aff755d8e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-153-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-153-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-153-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f43b5210c41057d47fbd1f1c97bf66760c6ddc52 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-153-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-154-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-154-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d6344bdfd61243cd1c0c3f4e1d94706878ab2c09 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-154-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-154-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-154-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2f6ff0b983deb3dd2eaa64631497226674ecde38 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-154-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-155-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-155-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48c61188168e4c33e8c450d2147b08b6fe039a3c Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-155-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-155-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-155-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9bab8737d42b566cd1d6d6bd754642dfcacd4a54 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-155-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-156-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-156-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..879c6900685e29899f4a3e6c22aa4b95834980e9 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-156-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-156-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-156-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f124f70ba6cb090dc359f8d31c86d2349b53fde6 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-156-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-161-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-161-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94ab7fb40b6e742e2b1c2830ad3ce906d172be0a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-161-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-161-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-161-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f0cd1db2bdbe974d41c5d1b16c982e6cd07ccb0 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-161-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-165-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-165-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab089405e83b9707403bc155b9d497fa89dce78f Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-165-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-170-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-170-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1323183943353447cf2150b079aa92b0dae2bd55 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-170-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-170-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-170-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e4f78806ee514f3660598ce5ab24a7d34d5e99f Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-170-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-175-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-175-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43ed25afc5f547b1d0fc1554c35155f07b0354af Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-175-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-175-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-175-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..495f6b5d6c2819187d0f10a810ddeeab8ca0627d Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-175-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-179-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-179-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e15346317a0c54ead2b6e6828f5186f630adcb8 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-179-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-179-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-179-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e6c4cbafcb776cfd1e9741ea189f24da03af97ee Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-179-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-180-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-180-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5a2979363b0d9d766cd8c8506d091d56c59385c Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-180-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-180-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-180-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..298dc3f416d4f80aea511f894c5375ad33c49e59 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-180-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-182-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-182-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98e4069eb4987ab8b79dff9cb87773c9fa1bd30e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-182-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-182-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-182-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..596f78439bcb89f5780be54f7d2f64a2ece495e4 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-182-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-191-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-191-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a9531c267a2c990edf75d32c06ca6a864ff580b0 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-191-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-191-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-191-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6dd25c67ffc1a0cc08629b45a8dbe9631b8e91cc Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-191-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-192-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-192-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c24020838068f3e02f46d3694cab294fdbe523c Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-192-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-192-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-192-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..911077e23ec4fa607c172aedb072a67e65a00a42 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-192-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-196-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-196-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db63c3b90699c0acd946f499a521ffd8aa79e51a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-196-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-196-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-196-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25459fa48a54f4459d8ac807c97a95ed8ae92809 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-196-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-200-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-200-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38064e91f556c1804536e6460e05fdca93a473b9 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-200-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-200-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-200-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7c957929de39a646e0f9f0887bb18e62c9c1183 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-200-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-201-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-201-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f610b0fe36e00d65751f561325be1abac441e168 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-201-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-201-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-201-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d4f19ac15f9ef07e24f649699dd0c86a47bf865 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-201-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-204-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-204-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..095bf440ffb38b2d9949b91d2da29bdf0619dd3d Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-204-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-204-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-204-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..371c36e3100bd045586184d8817405e21662d1cb Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-204-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-206-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-206-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9187c53c861b23ec9fa7ea27376e28996bbfb2bf Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-206-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-206-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-206-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0ec231f26854e1c1ffdbf95b08243046db743d0 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-206-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-212-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-212-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9f41f161a0f29dd56882e75eb400064b37bfe71 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-212-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-212-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-212-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e438243e8d33aea14c8821f414cf6fa15b71c90e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-212-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-22-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-22-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1aa22d985e1e90c7de9d2bfaf1611240f8587ec5 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-22-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-22-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-22-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c8e291a26aa48eba14f8dbd11ee9ed91669b8ce Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-22-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-224-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-224-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a102153aaee769763158c1f500a4b8cc85d3be1 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-224-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-224-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-224-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..080d662c37463022e170635a8d0f8bc330555d78 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-224-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-225-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-225-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e36c824b3448b65b11fb2cda7da9e899c357f80 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-225-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-225-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-225-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a8d41981c210853a9bec18438246b4f61ec8426 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-225-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-23-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-23-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34d4342dfb10e46a46bd1921b7dd92e13111d3a4 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-23-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-23-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-23-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4ad4ba9d27220343952e758c4a02a900a87291ee Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-23-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-233-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-233-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..73a7c2212a34b7a834c84a074a1a9fa94abbb94d Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-233-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-233-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-233-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68ddd7524e8bf682e1794ac0dab79e6f89bea06b Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-233-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-234-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-234-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d33b70a248bc2dded04b0be66f38c13fef0eef3 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-234-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-234-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-234-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..669666ca6cc8dfa713c87c46c1af0c716564d543 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-234-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-235-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-235-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0babe14f17542427ad837899c7739f2de180614c Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-235-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-235-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-235-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cef0b0800c9a0395c9b8a08e6aafa1e20a20667b Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-235-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-24-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-24-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68a3289366f124196584831bcaffbb6637e46a03 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-24-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-24-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-24-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19644e46ce10149a24a20b026d9aedd8c25b3530 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-24-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-247-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-247-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..abbc3938cd19ef5906789f24dfaef84d20648139 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-247-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-247-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-247-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98d43d6c88f29dade8279da8ea9446eaf60055e0 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-247-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-25-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-25-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..521b0a40ff633e4524c148aa0581b50d1bd194d2 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-25-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-25-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-25-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3192d3a7068bd72f655265774ca27d4737868cdf Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-25-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-256_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-256_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c7d0fa9097354adaa4121d35c3950ef6ce251cfd Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-256_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-26_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-26_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50ba0347effa3cb9b0e238202e833f4168df89ad Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-26_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-27-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-27-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3679f947e41aa9076da64d792f8eb2c8a0ebd212 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-27-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-27-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-27-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b09e62c9c048ee67b26165a2d194b4e442a14ff Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-27-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-28-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-28-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4554c120f12bab969d179a78e10d96e1fc643b4 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-28-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-28-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-28-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b53d12f446a3d6c89815e9bafb566ff6303fd20 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-28-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-29-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-29-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3f4c1f52cea5837e8380c4de37a63740998a3ef Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-29-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-29-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-29-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c720bd291df6f65a115e45fb01679d91d05faf9 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-29-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-30-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-30-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..29ac69c47e2290fbb144e69dc2c7b8a7b3890692 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-30-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-30-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-30-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..222bf3560b0c414cb8769414eb2c1bddffd93513 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-30-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-31-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-31-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b5eb2bf75c4c7302359095d75b1effc103764d3 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-31-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-31-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-31-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe59ee755cf772638f589d929c19d09465803674 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-31-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-32-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-32-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f2acce013a600274df3743ca98d5fbd76f9a2f8d Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-32-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-32-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-32-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d9cf60b2117e6462df67ca1c9e7e90ea73a5799 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-32-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-33-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-33-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6fe1939c10410fdeaaa3304c0a0316a5a86250aa Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-33-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-33-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-33-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f5fc34266def2f60cea991e203c4d39fd6600f2d Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-33-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-34-1-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-34-1-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0270a300a9081a7afb2172f515e5bc4c23afe09a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-34-1-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-34-1-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-34-1-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8b51c69d9c90b86629787e994b8ba099068d473 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-34-1-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-34-2_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-34-2_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..87cf600f482ac51ac6dc0142023b57a9a24ac154 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-34-2_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-34-3_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-34-3_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a98bbc94f99c369a25ed24a830f45e2a23e32f86 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-34-3_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-35-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-35-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..def98c58d00fca45e0d4b944d216b4f011d3774a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-35-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-35-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-35-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d75ce6221d3537e4a76543328eb2ac5cd5b40f4 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-35-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-36-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-36-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec0575c1e0ba5a645533719996e89fb4eae1e07e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-36-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-36-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-36-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f9276da196c02b2873ae6b48506f11eb1057353 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-36-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-37-1-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-37-1-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7c3e2a759df2b7ece3443fc8de284c5217d611a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-37-1-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-37-1-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-37-1-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c5e00ec24337052b870d53ffb2fe4f81aa1a84e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-37-1-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-37-2-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-37-2-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d25dd23e65fdc336bf086e5e00ee670911b8cccb Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-37-2-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-37-2-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-37-2-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..60408e27327b5cf79a45ec2e86daf6547a6fea42 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-37-2-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-37-3-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-37-3-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e2f21c45b381637d3dbd7fbb6e24a6fcb01adeb Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-37-3-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-37-3-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-37-3-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..671e04e9e789a056a51cafdcaddce6fad1b15fa4 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-37-3-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-38-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-38-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed5b1a2b1e73cf876a4722b5901380f61924eceb Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-38-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-38-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-38-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..041e2bcba786064a2263c414097a3a14b5e3db63 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-38-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-39-1-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-39-1-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7baa7ca12521ad292d56599f3fff0eff4e96aa96 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-39-1-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-39-1-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-39-1-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..58b7d07f9f63093149093b1651df72e929cf2889 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-39-1-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-39-2_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-39-2_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4262f23a8a4dc0fd20e955c20efbf5d1fe30f774 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-39-2_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-40-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-40-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31aeceb85159c833af128de1fb5a2bc841e783d9 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-40-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-40-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-40-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..350fccf70aff9b9ffea8f051993e23a10e084f5f Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-40-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-42-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-42-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcf1c6376c9479c246b157389263353dbdc0fcbd Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-42-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-43_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-43_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ceec32b3736112d55494447de0bde7154774ef8 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-43_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-46-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-46-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01112d9eda9e661e060eee04fe181dfccf336ed0 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-46-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-46-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-46-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2be4ee122c17d3a587acc7ad417633e066c66619 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-46-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-47-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-47-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17ea18da927e6c2671360a5003be5b0b4d90e51e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-47-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-47-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-47-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d937ba23c814f6199b17bcd8b9d8fc5f681d42d1 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-47-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-48-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-48-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e322b514fb85d1955d2ec616bac19c081cb4654 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-48-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-48-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-48-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3083d14e717227aa2d13af99d780833f0751ac5d Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-48-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-48-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-48-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fcc17ef27df5eb86705c975492448b2ebfb1e4e9 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-48-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-48-004_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-48-004_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f716e39f7c9931da083cc1546b24cd6f76546b29 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-48-004_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-49-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-49-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1be35e21de8e08124d92fbce0a78acdc38368c65 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-49-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-49-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-49-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae522fd9e5ba02d38d43afd5818eeeee0aec14b9 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-49-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-49-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-49-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8faffc01d70428990ab76a963f9b2d6da5a58a2c Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-49-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-50-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-50-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d6aa5d332583637750b9de9433b4f0f696ffe8d6 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-50-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-50-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-50-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2d77fcd3986643ff56ccc10378c8aa2fc719db0a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-50-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-52-1-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-52-1-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cdcacc67284191f5673b8bbc70a1011b7e1ff106 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-52-1-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-52-1-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-52-1-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a67c1cdb33dde260288c3f0c8e57f774e9373d2 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-52-1-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-52-2-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-52-2-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..435826d85dfa344acfa0a3e5a43140337c93624b Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-52-2-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-52-2-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-52-2-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea63f97c42e190cecdf8e00db4aa9cc12874b017 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-52-2-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-54-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-54-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6b009efa0c26b6f7adaaf6315c2c039f581e2a3 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-54-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-54-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-54-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6fa0df39ba150f5edfc359ec1cda7f28519ac210 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-54-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-54-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-54-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f95c4af044d425b01edec5843d72484ff6efe0f Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-54-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-54-004_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-54-004_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..943e01e3e2691c045e07808ed985e3e8ca9cbeba Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-54-004_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-58-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-58-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50e2c95b8cc230d073d55ccb894db248fdcc2af8 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-58-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-58-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-58-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..120b68c727956f4fbdff9123431f720102ab13a1 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-58-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-59-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-59-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba730d076c075572c307a022e30dc9d3e9c1c81d Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-59-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-59-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-59-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4cedff3ff396ab9bd28c8b5e4b2b5a26a7abcf4f Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-59-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-60-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-60-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f4b30baaf191182ef9ba081d2c92ea04be1eb59 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-60-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-60-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-60-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2224696c92fefe7860e6f399d1ea457be4c9e93c Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-60-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-62-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-62-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90ce4d238c56abe4afe974c409f67b76880b0594 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-62-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-62-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-62-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0738495e5123dacff2d8dad92352c5fb0242dac Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-62-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-65-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-65-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95c0a316c8b89c71b7e3b5072e5469acd235f504 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-65-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-65-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-65-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8930d7421aac1e75108f83851d93966090571ce1 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-65-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-67-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-67-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66047dccabc6169eadf868dc5007fecda2b809fa Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-67-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-74-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-74-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8fa5b955e2b9e9b0c086632663790d8b0737224f Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-74-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-74-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-74-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e811ed5ecbb73fadd580b3f0c004d89501c8530 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-74-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-75-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-75-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68a6490a638c3681252a627c443ea9f2dacf63e3 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-75-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-75-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-75-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5b7fca01ea50effafb6f2f872c989192c5da50a5 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-75-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-76-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-76-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..902b10d35c4ff10904a09203a5a4c67781e1d54e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-76-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-76-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-76-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b4f7f1c1df6e8cfca96b78b55dd9f34db57f710 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-76-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-78-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-78-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..59fa8b5122e204a2cdf819ddff46ae2559be2038 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-78-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-78-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-78-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b2f6ea5e039b6da7ecaae2ce85079e514f9eeca Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-78-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-80-1-001_medium-1.jpg b/pictures_data/MAR-BVM-7-2022-0-80-1-001_medium-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..714c8f90c710292f8f2258174be1e413ee8bafc3 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-80-1-001_medium-1.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-80-1-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-80-1-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..714c8f90c710292f8f2258174be1e413ee8bafc3 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-80-1-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-80-1-002_medium-1.jpg b/pictures_data/MAR-BVM-7-2022-0-80-1-002_medium-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3711665a5c85fb613fc95c0970df4b89767fdee5 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-80-1-002_medium-1.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-80-1-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-80-1-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3711665a5c85fb613fc95c0970df4b89767fdee5 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-80-1-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-80-2-001_medium-1.jpg b/pictures_data/MAR-BVM-7-2022-0-80-2-001_medium-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6fa00a2ae48521fabcd16941f9e274a88ef33c54 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-80-2-001_medium-1.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-80-2-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-80-2-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6fa00a2ae48521fabcd16941f9e274a88ef33c54 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-80-2-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-80-2-002_medium-1.jpg b/pictures_data/MAR-BVM-7-2022-0-80-2-002_medium-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5871a218f6b29fd0ac1bed0b5f470c8fc8da5cc2 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-80-2-002_medium-1.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-80-2-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-80-2-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5871a218f6b29fd0ac1bed0b5f470c8fc8da5cc2 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-80-2-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-80-2-003_medium-1.jpg b/pictures_data/MAR-BVM-7-2022-0-80-2-003_medium-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..afd2b728c7adeb42b972a8db1cb82a5361c8ae6e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-80-2-003_medium-1.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-80-2-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-80-2-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..afd2b728c7adeb42b972a8db1cb82a5361c8ae6e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-80-2-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-81-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-81-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de1f7532595c5df5fa4ba6332683f3be821a6c9c Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-81-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-81-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-81-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d82787b367d01ab500b3baf558e194d24903e508 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-81-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-81-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-81-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92bcf2be376c3cad191d7f1e7aaa0f346e62ea0b Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-81-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-82-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-82-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..361b80b9e7701cff7891b01b442eb42a4f582397 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-82-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-82-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-82-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8ea9d521d4deb8047fa0893e51960c9f9967e4e5 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-82-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-83-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-83-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6848b11d06be8549127d77bb2c556d66ab958d06 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-83-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-83-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-83-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b727e44771794b8ce78fbd5cba0037706e9f651 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-83-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-84-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-84-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c278fa54bcb6216c76e440c795a55e4b68b20249 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-84-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-84-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-84-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7068a35fc4c0b2cfd87050b5ae6c56c356bf1f3a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-84-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-84-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-84-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4f8d8bec734515be08836fc84e535ec4bcc75d9 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-84-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-84-004_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-84-004_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c79de891162735259aba4c8a86f493ed169c9c07 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-84-004_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-85-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-85-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d70ad68f41a38d432c40b4890854de61d40e813 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-85-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-85-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-85-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4ab7ff11f1d7ea2595c49cb6dc84f9923fc8062c Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-85-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-85-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-85-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ffee8cf0ad1bceded4b165d1592faec162fa3ab8 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-85-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-85-004_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-85-004_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5bd916c3d02e3f76eed32b339e75b1f097922d2 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-85-004_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-85-005_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-85-005_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..03eaddab9aa08b63b92dc00de943b8be5fa1031a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-85-005_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-86-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-86-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e53df3eb4c645bb41f4bbc524ac3c1835fa36f41 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-86-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-86-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-86-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dbd198e2d2d9b501779323f12f4e4b8fcfbb72c0 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-86-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-86-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-86-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db469b348e0d2305a5960bc80b869321f3629e1e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-86-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-86-004_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-86-004_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34017516fa98c5f78b5892ec0833e23df900a775 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-86-004_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-86-005_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-86-005_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c3fb55e08539527740505ffff7d78378cd1802e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-86-005_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-88-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-88-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76f86c39f35646279b21137edb088380a75ebe66 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-88-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-88-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-88-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f6ef48963282ac40ff26a0c8a8ffa28e501f6e28 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-88-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-91-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-91-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc04ee2ff88c4d2041373deef13a5814eb82d8f8 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-91-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-91-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-91-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a7942cec18ae5fac973a1f7f6b6870e5a9e4a623 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-91-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-91-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-91-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9d13b8c1bde86ae5b6e85e7349b35d1632ee9d7 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-91-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-95-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-95-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..785ff60782767a2f7976307f309d634da6424a5a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-95-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-95-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-95-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2d7492ce3e82dd2ef27121ca2e70bcf9d6c9e8a3 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-95-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-95-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-95-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7fa1b7ebf627698a9cb7b782be7d40cc7fe2a1bc Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-95-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-96-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-96-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..56b3a5d47cc823a597c6ade06bf7a892f677af16 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-96-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-96-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-96-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d4523304c284b055d8e9b7781c9173bbf2cd163 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-96-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-97-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-97-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9e12c195edd0744039fef7d3c619dc56f4e9eb5b Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-97-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-97-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-97-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17cafc2075a20e474bcc38e9529aadb472d0c30a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-97-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-97-003_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-97-003_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36d60cf035e88cb0fbd373fac480bbe62dbc20ea Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-97-003_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-97-004_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-97-004_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0825aee2113c1fd37a3105618d6b4b5f4c1c631d Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-97-004_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-99-001_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-99-001_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1be2724b03f67ad1a38e5435c13f05cfda30ee9f Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-99-001_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022-0-99-002_medium.jpg b/pictures_data/MAR-BVM-7-2022-0-99-002_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..71f790ec3c2218e342369cb71b98c339b6135a54 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022-0-99-002_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.123-1_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.123-1_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9ceb0af6829d4139133e4fcb26bdcee69fa49d8 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.123-1_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.123-2_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.123-2_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f24b7e5290c4da6400a45f6b55f5235ea74f3955 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.123-2_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.125-2_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.125-2_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f500f232508b263383b3519e62d03f5c33b7da8f Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.125-2_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.131-1_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.131-1_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..797e6c9e088392128c0cc77fe4a01214b53dfa0a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.131-1_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.131-2_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.131-2_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3561ce2fa654c6207f5b95c5ad55e2c9edabaf6 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.131-2_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.143.1_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.143.1_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be1ae8945f88a1b2139d535120407f87383f39ee Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.143.1_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.143_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.143_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..743d79ad2331c379d17580acd47be28233055ade Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.143_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.145.1_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.145.1_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..20a216daa1b82014660c436cf759bcc87640347a Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.145.1_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.145_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.145_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3fa183cd2304e7095022c106117def305ab89680 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.145_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.238.1_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.238.1_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c28d22ee10f5486a40016ad256da8895fc8fdd18 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.238.1_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.238_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.238_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95580737324e1c33dce332288877fd02338afb2c Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.238_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.43-45.2_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.43-45.2_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07a3a1fad9513d8aa2a4f4ea4be440fe64c5a571 Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.43-45.2_medium.jpg differ diff --git a/pictures_data/MAR-BVM-7-2022.0.43-45_medium.jpg b/pictures_data/MAR-BVM-7-2022.0.43-45_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df3335c0b892b84b070e9b206436a89f6fc2522e Binary files /dev/null and b/pictures_data/MAR-BVM-7-2022.0.43-45_medium.jpg differ diff --git a/pictures_data/Mar-bvm-7-2022.0.54_medium.jpg b/pictures_data/Mar-bvm-7-2022.0.54_medium.jpg new file mode 100644 index 0000000000000000000000000000000000000000..09c34f330c34d152d8d9c67412d5ba8cefb1f549 Binary files /dev/null and b/pictures_data/Mar-bvm-7-2022.0.54_medium.jpg differ diff --git a/pictures_data/Odamado_01_400.jpg b/pictures_data/Odamado_01_400.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f17ae530b546c56404f87939083a75d4ace7a7fc Binary files /dev/null and b/pictures_data/Odamado_01_400.jpg differ diff --git a/pictures_data/Odamado_02_433.jpg b/pictures_data/Odamado_02_433.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f115affa3746b96be3841f323d6cf2180c2523c9 Binary files /dev/null and b/pictures_data/Odamado_02_433.jpg differ diff --git a/pictures_data/Odamado_03_649.jpg b/pictures_data/Odamado_03_649.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0553d2c849977c00ada6e81655a7b571c6db7e5a Binary files /dev/null and b/pictures_data/Odamado_03_649.jpg differ diff --git a/pictures_data/Odamado_04_734.jpg b/pictures_data/Odamado_04_734.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b43b7b1b08f43ad9035a39733bc956a99dcb5914 --- /dev/null +++ b/pictures_data/Odamado_04_734.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe18c936baad72a308d8eabaf61161ba98929364652cbdd2fb6a58807ae1f5de +size 108132 diff --git a/pictures_data/Odamado_05_818.jpg b/pictures_data/Odamado_05_818.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a3a5334933950eae506bc585ccd80df18da453a Binary files /dev/null and b/pictures_data/Odamado_05_818.jpg differ diff --git a/pictures_data/Odamado_06_1230.jpg b/pictures_data/Odamado_06_1230.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0aa7e609594df03c89d49a6097d37c5b2041b491 --- /dev/null +++ b/pictures_data/Odamado_06_1230.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de4ca79103a945d204739ab12a56c90d392531b72c9594550b62f69174429942 +size 124608 diff --git a/pictures_data/Odamado_07_1554.jpg b/pictures_data/Odamado_07_1554.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f61a6494f0027bf63ccfe72537e3ac543710bbc7 --- /dev/null +++ b/pictures_data/Odamado_07_1554.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bfa2524cedf9e7976b1b2e8a50bb9c639e6a0dd5d8f633ad40cf29919cb3ce2 +size 115971 diff --git a/pictures_data/de-kleine-filosoof-msk-0320.jpg b/pictures_data/de-kleine-filosoof-msk-0320.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32050fb6f8fdbc8cc5713cd3cc6e9f8e696caaf6 Binary files /dev/null and b/pictures_data/de-kleine-filosoof-msk-0320.jpg differ diff --git a/pictures_data/de-refter-msk-0721.jpg b/pictures_data/de-refter-msk-0721.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac39e998022910dfb2d1b4ffb3ebd4f71df96705 --- /dev/null +++ b/pictures_data/de-refter-msk-0721.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3508aabbd8c8443b355c1ead45f3df80d5f4c1fcd66daf774c53e6d967db3c2 +size 415646 diff --git a/pictures_data/het-kind-met-de-vissen-msk-0351.jpg b/pictures_data/het-kind-met-de-vissen-msk-0351.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74f10d07e7dcb9ade0fcab491072a28deb7a81d7 --- /dev/null +++ b/pictures_data/het-kind-met-de-vissen-msk-0351.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af59344c829089056fdc2076ee9d702bffc154c2c7fedf78a3dda879bedea908 +size 599514 diff --git a/pictures_data/kind-slapend-op-zijn-trommel-msk-0317.jpg b/pictures_data/kind-slapend-op-zijn-trommel-msk-0317.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb4bb40895793e57db8fcf9b03b8ea419c719e1c --- /dev/null +++ b/pictures_data/kind-slapend-op-zijn-trommel-msk-0317.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04c85c7ac99cfab28ddae7bbe85946e810cc2d53da07cc63409ea543b0a143da +size 172211 diff --git a/pictures_data/lezend-kind-msk-0335.jpg b/pictures_data/lezend-kind-msk-0335.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2f8d1790a7eb2f58118de2978d7af6d6d51f809 --- /dev/null +++ b/pictures_data/lezend-kind-msk-0335.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0eb066663989ea355dc26a063566b130cd946200d7aff27feb8b40e9ef05a792 +size 669333 diff --git a/pictures_data/moederschap-msk-0639.jpg b/pictures_data/moederschap-msk-0639.jpg new file mode 100644 index 0000000000000000000000000000000000000000..497b2f93af68834a0fb00a79c111724778dde4d1 --- /dev/null +++ b/pictures_data/moederschap-msk-0639.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e7a026b9817a1edc71cba0b4fb2a7c1ac25d669ebbe2e14da9413ea2e2c3377 +size 382032 diff --git a/pictures_data/nieuwsgierigheid-msk-0449.jpg b/pictures_data/nieuwsgierigheid-msk-0449.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11f53ee1380900a401f50449ad196c02ba3c7d51 --- /dev/null +++ b/pictures_data/nieuwsgierigheid-msk-0449.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6004ffb637c37e512b2ccf53c6d6072337f11ba60b2c87da98e08c4c68da3662 +size 614449 diff --git a/pictures_data/portret-van-een-jonge-man-17de18de-eeuw-msk-0033.jpg b/pictures_data/portret-van-een-jonge-man-17de18de-eeuw-msk-0033.jpg new file mode 100644 index 0000000000000000000000000000000000000000..145c07d41d7e354abe7862ac1c6ffde99aed0117 --- /dev/null +++ b/pictures_data/portret-van-een-jonge-man-17de18de-eeuw-msk-0033.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59c4354787fc5a70d228b3b703e276607bce02457314f9db0e84f648f301349d +size 699799 diff --git a/pictures_data/spaarpot-geglazuurd-aardewerk-torhout-1ste-helft-20ste-eeuw-mos-7357.jpg b/pictures_data/spaarpot-geglazuurd-aardewerk-torhout-1ste-helft-20ste-eeuw-mos-7357.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9128c05bed506d50e07b49f331e8a126b5f55c3d --- /dev/null +++ b/pictures_data/spaarpot-geglazuurd-aardewerk-torhout-1ste-helft-20ste-eeuw-mos-7357.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:013ea45b746c92458427b3f5e1444ded1b7e88f7a67a716d68576873a6ebe798 +size 226461 diff --git a/pictures_data/strandtoneel-msk-0235.jpg b/pictures_data/strandtoneel-msk-0235.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e43d7761148a92816f7d3372200499e14265c85 --- /dev/null +++ b/pictures_data/strandtoneel-msk-0235.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a09f6103225adb3237437a351bde0f1eb63de0c91b695b2f819f25a9dfc2c437 +size 584482 diff --git a/pictures_data/tegel-faience-noord-nederland-18de-eeuw-mos-5161.jpg b/pictures_data/tegel-faience-noord-nederland-18de-eeuw-mos-5161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39455173ad7960c66941d9a745e4ea904dd61e28 --- /dev/null +++ b/pictures_data/tegel-faience-noord-nederland-18de-eeuw-mos-5161.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a70ef98e7a5a75cabcbfcaa40c6f54bfa38a51354d120d6fc0f6de52078396d +size 223314 diff --git a/pictures_data/tegel-faience-noord-nederland-18de-eeuw-mos-5162.jpg b/pictures_data/tegel-faience-noord-nederland-18de-eeuw-mos-5162.jpg new file mode 100644 index 0000000000000000000000000000000000000000..44f91d9f3eaa31d933708ccd0855b1ba2d1f7b30 --- /dev/null +++ b/pictures_data/tegel-faience-noord-nederland-18de-eeuw-mos-5162.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86d70fabe36df114d030828e7710bd40364578de10820dbbb7dad2f760137c50 +size 163747 diff --git a/pictures_data/winterlandschap-met-kinderen-msk-0337.jpg b/pictures_data/winterlandschap-met-kinderen-msk-0337.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f939ca8dc954b9db31ab9f814cffbc83143ce078 --- /dev/null +++ b/pictures_data/winterlandschap-met-kinderen-msk-0337.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:735d5874ba9866192a0125dfc5c2b9fca1b90dee386c72aad7fb9ae34d64377d +size 622239 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..f9851b7b6e6ed2766a7f61ac169354422c8f77e7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +gradio>=4.0.0 +pandas>=2.0.0 +rapidfuzz>=3.0.0 +coloredlogs>=15.0.0 \ No newline at end of file diff --git a/src/art_pieces_db.egg-info/PKG-INFO b/src/art_pieces_db.egg-info/PKG-INFO new file mode 100644 index 0000000000000000000000000000000000000000..7eef60ef335d818632ba2263560881b8c6de6c67 --- /dev/null +++ b/src/art_pieces_db.egg-info/PKG-INFO @@ -0,0 +1,86 @@ +Metadata-Version: 2.4 +Name: art_pieces_db +Version: 0.0.1 +Summary: A small example package +Author-email: Emmanuel Lonca , Aurélien Testelin +License-Expression: MIT +Requires-Python: >=3.12 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: coloredlogs~=15.0.1 +Requires-Dist: pandas~=2.3.0 +Requires-Dist: rapidfuzz~=3.13.0 +Dynamic: license-file + +# Pilot Projet 1: art pieces database + +## Input database + +The input database must be a CSV file, which text encoding is UTF-8, field separators are semicolons and string separators are double quotes. + +## Developer how-to + +Build a virtual environ around Python 3.12 and load it. +Execute `pip install --editable .` +You can now work and the code and test the program simply by executing `art_pieces_db`. + +## License + +This software is made available under the terms of the MIT license. + +## Emotional Analysis System + +This system uses **Plutchik's Wheel of Emotions** to analyze and compare emotional content in art pieces. The implementation provides psychologically-grounded emotion similarity calculations. + +### Key Features + +1. **Eight Primary Emotions** arranged in a circular wheel: + - Joy ↔ Sadness (opposites) + - Trust ↔ Disgust (opposites) + - Fear ↔ Anger (opposites) + - Surprise ↔ Anticipation (opposites) + +2. **Three Intensity Levels** for each emotion: + - Mild (e.g., serenity, acceptance, apprehension) + - Basic (e.g., joy, trust, fear) + - Intense (e.g., ecstasy, admiration, terror) + +3. **Emotion Combinations (Dyads)**: + - Primary dyads: Adjacent emotions combine (e.g., joy + trust = love) + - Secondary dyads: Emotions 2 petals apart (e.g., joy + fear = guilt) + - Tertiary dyads: Emotions 3 petals apart (e.g., joy + surprise = delight) + +### How Distance Calculation Works + +The system calculates emotional similarity using geometric distance on Plutchik's wheel: + +- **Same emotion**: distance = 0.0 (100% similar) +- **Adjacent emotions** (1 petal): distance = 0.25 (75% similar) +- **2 petals apart**: distance = 0.5 (50% similar) +- **3 petals apart**: distance = 0.75 (25% similar) +- **Opposite emotions** (4 petals): distance = 1.0 (0% similar) + +Intensity differences add 0.1 per level (e.g., joy vs. ecstasy = 0.1 distance). + +### Advanced: Distance Between Dyads (Emotion Combinations) + +When comparing two dyads (emotion combinations), the system uses a sophisticated approach that considers the component emotions: + +1. **Extract Components**: Each dyad is decomposed into its two primary emotions + - Example: "love" = joy + trust, "optimism" = anticipation + joy + +2. **Calculate All Distances**: The system computes distances between all possible pairs of components + - For love vs optimism: + - joy ↔ anticipation (distance) + - joy ↔ joy (distance) + - trust ↔ anticipation (distance) + - trust ↔ joy (distance) + +3. **Average the Results**: The final distance is the average of all component distances + +This approach provides nuanced results: +- Dyads sharing a component have lower distances (e.g., love and optimism both contain joy) +- Dyads with opposing components have higher distances (e.g., love and contempt) +- The calculation captures the psychological relationships between complex emotions + + diff --git a/src/art_pieces_db.egg-info/SOURCES.txt b/src/art_pieces_db.egg-info/SOURCES.txt new file mode 100644 index 0000000000000000000000000000000000000000..7cc6b247eaa569f31c7577d2f2ee105b10613528 --- /dev/null +++ b/src/art_pieces_db.egg-info/SOURCES.txt @@ -0,0 +1,16 @@ +LICENSE +README.md +pyproject.toml +src/art_pieces_db/__init__.py +src/art_pieces_db/__main__.py +src/art_pieces_db/cli_options.py +src/art_pieces_db/database.py +src/art_pieces_db/emotions.py +src/art_pieces_db/query.py +src/art_pieces_db/utils.py +src/art_pieces_db.egg-info/PKG-INFO +src/art_pieces_db.egg-info/SOURCES.txt +src/art_pieces_db.egg-info/dependency_links.txt +src/art_pieces_db.egg-info/entry_points.txt +src/art_pieces_db.egg-info/requires.txt +src/art_pieces_db.egg-info/top_level.txt \ No newline at end of file diff --git a/src/art_pieces_db.egg-info/dependency_links.txt b/src/art_pieces_db.egg-info/dependency_links.txt new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/src/art_pieces_db.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/art_pieces_db.egg-info/entry_points.txt b/src/art_pieces_db.egg-info/entry_points.txt new file mode 100644 index 0000000000000000000000000000000000000000..4ddb15601fd4caca9f6f097486c3c3be27bb33c8 --- /dev/null +++ b/src/art_pieces_db.egg-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +art-pieces-db = art_pieces_db.__main__:main diff --git a/src/art_pieces_db.egg-info/requires.txt b/src/art_pieces_db.egg-info/requires.txt new file mode 100644 index 0000000000000000000000000000000000000000..4ca7fb02fd13ab3f7147136cac6151dd7bbc6159 --- /dev/null +++ b/src/art_pieces_db.egg-info/requires.txt @@ -0,0 +1,3 @@ +coloredlogs~=15.0.1 +pandas~=2.3.0 +rapidfuzz~=3.13.0 diff --git a/src/art_pieces_db.egg-info/top_level.txt b/src/art_pieces_db.egg-info/top_level.txt new file mode 100644 index 0000000000000000000000000000000000000000..9e9567c6ef329b65d70e4c5d9743e3d6fe6a5f60 --- /dev/null +++ b/src/art_pieces_db.egg-info/top_level.txt @@ -0,0 +1 @@ +art_pieces_db diff --git a/src/art_pieces_db/__init__.py b/src/art_pieces_db/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/art_pieces_db/__main__.py b/src/art_pieces_db/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..97e14f895b8cf3096ec576a48c56e664c0dd06b6 --- /dev/null +++ b/src/art_pieces_db/__main__.py @@ -0,0 +1,17 @@ +from . import cli_options + +import coloredlogs +import logging + + +def main(): + logging.basicConfig( + format='[%(asctime)s] %(message)s', datefmt='%d-%m-%Y %H:%M:%S') + coloredlogs.install(level='DEBUG') + logging.info('Program start') + cli_options.CliOptions() + logging.info('Program ended normally') + + +if __name__ == '__main__': + main() diff --git a/src/art_pieces_db/__pycache__/__init__.cpython-312.pyc b/src/art_pieces_db/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdc8174d35e5558bbd3f0fd8bab882547d6fc593 Binary files /dev/null and b/src/art_pieces_db/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/art_pieces_db/__pycache__/__init__.cpython-313.pyc b/src/art_pieces_db/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad481daf4cf77e26706872c0a0b429fa054b1e68 Binary files /dev/null and b/src/art_pieces_db/__pycache__/__init__.cpython-313.pyc differ diff --git a/src/art_pieces_db/__pycache__/__main__.cpython-312.pyc b/src/art_pieces_db/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a96c39a90166d05577f28a081e42bea4ba52469a Binary files /dev/null and b/src/art_pieces_db/__pycache__/__main__.cpython-312.pyc differ diff --git a/src/art_pieces_db/__pycache__/__main__.cpython-313.pyc b/src/art_pieces_db/__pycache__/__main__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15941a92f159a5d66f7e4ec01f77c1f1b105611b Binary files /dev/null and b/src/art_pieces_db/__pycache__/__main__.cpython-313.pyc differ diff --git a/src/art_pieces_db/__pycache__/cli_options.cpython-312.pyc b/src/art_pieces_db/__pycache__/cli_options.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f695ea2134a768351211a737ced582071467ac57 Binary files /dev/null and b/src/art_pieces_db/__pycache__/cli_options.cpython-312.pyc differ diff --git a/src/art_pieces_db/__pycache__/cli_options.cpython-313.pyc b/src/art_pieces_db/__pycache__/cli_options.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..735dff7fa2286e17b1955f2a8e09be1b8ae07f53 Binary files /dev/null and b/src/art_pieces_db/__pycache__/cli_options.cpython-313.pyc differ diff --git a/src/art_pieces_db/__pycache__/database.cpython-312.pyc b/src/art_pieces_db/__pycache__/database.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93c65b3b102ca6a0609463c6babb032e8a82fbcf Binary files /dev/null and b/src/art_pieces_db/__pycache__/database.cpython-312.pyc differ diff --git a/src/art_pieces_db/__pycache__/database.cpython-313.pyc b/src/art_pieces_db/__pycache__/database.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cec6e0c0f26c88549c07e6e7376128e823be7605 Binary files /dev/null and b/src/art_pieces_db/__pycache__/database.cpython-313.pyc differ diff --git a/src/art_pieces_db/__pycache__/emotions.cpython-312.pyc b/src/art_pieces_db/__pycache__/emotions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57376c5100c59535db276aa75be0c41875c3dd47 Binary files /dev/null and b/src/art_pieces_db/__pycache__/emotions.cpython-312.pyc differ diff --git a/src/art_pieces_db/__pycache__/emotions.cpython-313.pyc b/src/art_pieces_db/__pycache__/emotions.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b9f160a79f928e78c11097242cf0808c85871dc Binary files /dev/null and b/src/art_pieces_db/__pycache__/emotions.cpython-313.pyc differ diff --git a/src/art_pieces_db/__pycache__/places.cpython-312.pyc b/src/art_pieces_db/__pycache__/places.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03dca29d7db98400d50810e740d379cdda7b9174 Binary files /dev/null and b/src/art_pieces_db/__pycache__/places.cpython-312.pyc differ diff --git a/src/art_pieces_db/__pycache__/query.cpython-312.pyc b/src/art_pieces_db/__pycache__/query.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49b2fcc85205da618f74b93a649ce569838b1d7b Binary files /dev/null and b/src/art_pieces_db/__pycache__/query.cpython-312.pyc differ diff --git a/src/art_pieces_db/__pycache__/query.cpython-313.pyc b/src/art_pieces_db/__pycache__/query.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9920dcf168f01e46e0c2817e2165a66cd332407b Binary files /dev/null and b/src/art_pieces_db/__pycache__/query.cpython-313.pyc differ diff --git a/src/art_pieces_db/__pycache__/utils.cpython-312.pyc b/src/art_pieces_db/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28f1263540da7da8da37f6649faef6afcfd1e63b Binary files /dev/null and b/src/art_pieces_db/__pycache__/utils.cpython-312.pyc differ diff --git a/src/art_pieces_db/__pycache__/utils.cpython-313.pyc b/src/art_pieces_db/__pycache__/utils.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c2a98b9590379d955b6b621492743c328be6784 Binary files /dev/null and b/src/art_pieces_db/__pycache__/utils.cpython-313.pyc differ diff --git a/src/art_pieces_db/cli_options.py b/src/art_pieces_db/cli_options.py new file mode 100644 index 0000000000000000000000000000000000000000..50d0c6fa7ace0e39c1f636fd0363a35409aa359b --- /dev/null +++ b/src/art_pieces_db/cli_options.py @@ -0,0 +1,181 @@ +from .database import Database +from .query import TargetProfile, WeightedLeximaxOptimizer, WeightedSumOptimizer +from .utils import str_to_date +from .emotions import EmotionWheel + +import argparse +import logging +import os +import sys + + +class CliOptions: + """ + A class used to manage the CLI options. + """ + + def __init__(self): + """ + Loads the options using argparse and check them, throwing an exception + in case the arguments do not fit the requirements. + """ + parser = argparse.ArgumentParser( + prog="art_pieces_db", description="Manage the database of art pieces" + ) + subparsers = parser.add_subparsers(required=True) + + parser_help = subparsers.add_parser( + "check-csv", help="checks the CSV input data and exit" + ) + parser_help.add_argument("input_csv") + parser_help.set_defaults(func=self.execute_check_csv) + + parser_query = subparsers.add_parser( + "query", + help="query the CSV input data to find the the pieces that are the closest to a target profile", + ) + parser_query.add_argument("input_csv") + parser_query.add_argument("--name") + parser_query.add_argument("--date") + parser_query.add_argument("--emotion") + parser_query.add_argument("--place") + parser_query.add_argument( + "--aggregator", choices=["sum", "leximax"], default="leximax" + ) + parser_query.add_argument("--limit", type=int, default=10) + parser_query.add_argument( + "--weight-name", + type=float, + default=1.0, + help="Weight for name similarity (default: 1.0)", + ) + parser_query.add_argument( + "--weight-date", + type=float, + default=1.0, + help="Weight for date similarity (default: 1.0)", + ) + parser_query.add_argument( + "--weight-emotion", + type=float, + default=1.0, + help="Weight for emotion similarity (default: 1.0)", + ) + parser_query.add_argument( + "--weight-place", + type=float, + default=1.0, + help="Weight for place similarity (default: 1.0)", + ) + + parser_query.set_defaults(func=self.execute_query) + + parser_emotions = subparsers.add_parser( + "list-emotions", help="list all valid emotions from Plutchik's wheel" + ) + parser_emotions.set_defaults(func=self.execute_list_emotions) + + args = parser.parse_args() + args.func(args) + + def execute_check_csv(self, args): + """ + Checks an input CSV file. + """ + CliOptions.load_database(args) + + def execute_query(self, args): + """ + Query the CSV input data to find the the pieces that are the closest to a target profile. + """ + database = CliOptions.load_database(args) + optimizer = CliOptions.create_optimizer(args) + df = optimizer.optimize_max(database).head(args.limit) + df.index.name = "result_index" + df.to_csv( + sys.stdout, + columns=[ + "database_id", + "related_names", + "related_dates", + "related_places", + "related_emotions", + "score", + ], + ) + + def execute_list_emotions(self, args): + """ + List all valid emotions from Plutchik's wheel. + """ + wheel = EmotionWheel() + print("\nPlutchik's Wheel of Emotions") + print("=" * 50) + print("\nPrimary Emotions with Intensity Levels:") + print("-" * 50) + + for primary, emotion in wheel.emotions.items(): + print(f"\n{primary.value.upper()}:") + print(f" Mild: {emotion.mild}") + print(f" Basic: {emotion.basic}") + print(f" Intense: {emotion.intense}") + + print("\n\nEmotion Opposites:") + print("-" * 50) + shown = set() + for e1, e2 in wheel.opposites.items(): + pair = tuple(sorted([e1.value, e2.value])) + if pair not in shown: + print(f" {e1.value} <-> {e2.value}") + shown.add(pair) + + print("\n\nEmotion Combinations (Dyads):") + print("-" * 50) + for (e1, e2), result in sorted(wheel.dyads.items()): + print(f" {e1} + {e2} = {result}") + + def load_database(args): + csv_file = os.path.abspath(args.input_csv) + if not os.access(csv_file, os.R_OK): + logging.fatal(f"cannot read input file {csv_file}") + CliOptions.exit_on_param_error() + logging.info(f"reading CSV file {csv_file}") + database = Database(csv_file) + logging.info(f"read a database with {database.n_pieces()} art pieces") + return database + + def create_optimizer(args): + profile = TargetProfile() + if args.name is not None: + profile.set_target_name(args.name) + if args.date is not None: + try: + profile.set_target_date(str_to_date(args.date)) + except ValueError: + logging.fatal( + f'cannot translate argument "{args.date}" into a date (type e.g. 25/12/2025)' + ) + CliOptions.exit_on_param_error() + if args.emotion is not None: + profile.set_target_emotion(args.emotion.lower()) + if args.place is not None: + profile.set_target_place(args.place) + logging.info(f"target profile is {profile}") + weights = { + "related_names": args.weight_name, + "related_dates": args.weight_date, + "related_emotions": args.weight_emotion, + "related_places": args.weight_place, + } + if args.aggregator == "sum": + logging.info("aggregator is Sum") + return WeightedSumOptimizer(profile, weights) + elif args.aggregator == "leximax": + logging.info("aggregator is Leximax") + return WeightedLeximaxOptimizer(profile, weights) + else: + logging.fatal(f'unknown aggregator "{args.aggregator}"') + CliOptions.exit_on_param_error() + + def exit_on_param_error(): + os._exit(3) diff --git a/src/art_pieces_db/database.py b/src/art_pieces_db/database.py new file mode 100644 index 0000000000000000000000000000000000000000..6533f57f765551777c20d9969cbb65ea79928aa2 --- /dev/null +++ b/src/art_pieces_db/database.py @@ -0,0 +1,160 @@ +from .utils import str_to_date, str_to_list +import logging +import pandas as pd +import re + +COL_NAMES = [ + 'database_id', + 'museum_id', + 'art_piece_place', + 'art_piece_type', + 'art_piece_date', + 'related_names', + 'related_dates', + 'related_places', + 'keywords', + 'related_emotions', + 'explanation', + 'question', + 'name_image' # à implémenter +] + + +class Database: + """ + A database, backed by Pandas. + """ + + def __init__(self, csv): + """ + Creates a new database given a CSV file which separator is ";". + """ + self.dataframe = pd.read_csv( + csv, sep=";", names=COL_NAMES, usecols=range(0, len(COL_NAMES)), na_filter=False) + self.normalize_fields() + + def get_dataframe(self): + """ + Access to the underlying dataframe. + """ + return self.dataframe + + def n_pieces(self): + """ + Returns the number of art pieces in the database. + """ + return len(self.dataframe) + + def normalize_fields(self): + """ + Normalize all the fields, e.g. by translating string split by commas into lists. + """ + self.normalize_field_related_names() + self.normalize_field_related_dates() + self.normalize_field_related_places() + self.normalize_field_related_emotions() + + def normalize_field_related_names(self): + """ + Translates the string content of the related_names column into lists of names. Firstname and lastname are split. + In case a name seems too short or too long, a warning is raised and the value is ignored. + """ + def normalize(row): + value = row['related_names'] + try: + names = str_to_list(value, separators=',;\n ') + except ValueError: + logging.warning( + f"ignoring dubious list of related names \"{value}\" for database_id={row['database_id']}") + return [] + + def is_name(name): + is_name = len(name) > 2 and len(name) < 16 + if not is_name: + logging.warning( + f"ignoring dubious related name \"{name}\" for database_id={row['database_id']}") + return is_name + return list(filter(is_name, names)) + self.dataframe['related_names'] = self.dataframe.apply( + normalize, axis=1) + + def normalize_field_related_dates(self): + """ + Translates the string content of the related_dates column into lists of dates. + In case a value cannot be translated, a warning is raised and the value is ignored. + """ + def normalize(row): + value = row['related_dates'] + try: + str_dates = str_to_list(value) + except ValueError: + logging.warning( + f"ignoring dubious list of related dates \"{value}\" for database_id={row['database_id']}") + return [] + + def to_date(str_date): + try: + return str_to_date(str_date) + except ValueError: + logging.warning( + f"ignoring dubious related date \"{str_date}\" for database_id={row['database_id']}") + return None + return list(filter(lambda x: x is not None, map(to_date, str_dates))) + self.dataframe['related_dates'] = self.dataframe.apply( + normalize, axis=1) + + def normalize_field_related_places(self): + """ + Translates the string content of the related_places column into lists of places. + In case a name seems too short or too long, a warning is raised and the value is ignored. + """ + def normalize(row): + value = row['related_places'] + try: + places = str_to_list(value) + except ValueError: + logging.warning( + f"ignoring dubious list of related places \"{value}\" for database_id={row['database_id']}") + return [] + + def is_place(place): + is_place = len(place) > 2 and len(place) < 32 + if not is_place: + logging.warning( + f"ignoring dubious related place \"{place}\" for database_id={row['database_id']}") + return is_place + return list(filter(is_place, places)) + self.dataframe['related_places'] = self.dataframe.apply( + normalize, axis=1) + def normalize_field_related_emotions(self): + """ + Translates the string content of the related_emotions column into lists of emotions. + """ + def normalize(row): + value = row['related_emotions'] + try: + emotions = str_to_list(value) + except ValueError: + logging.warning( + f"ignoring dubious list of related emotions \"{value}\" for database_id={row['database_id']}") + return [] + + # Clean and normalize emotions + def is_emotion(emotion): + # Filter out very long strings that are likely not emotions + is_emotion = len(emotion) > 1 and len(emotion) < 30 + if not is_emotion: + logging.warning( + f"ignoring dubious related emotion \"{emotion}\" for database_id={row['database_id']}") + return is_emotion + + # Normalize to lowercase and strip whitespace + cleaned = [] + for e in emotions: + normalized = e.lower().strip() + if is_emotion(normalized): + cleaned.append(normalized) + return cleaned + + self.dataframe['related_emotions'] = self.dataframe.apply( + normalize, axis=1) diff --git a/src/art_pieces_db/emotions.py b/src/art_pieces_db/emotions.py new file mode 100644 index 0000000000000000000000000000000000000000..010d17fdb9f0e9528e6221859bbc47c1ed28d693 --- /dev/null +++ b/src/art_pieces_db/emotions.py @@ -0,0 +1,297 @@ +""" +Plutchik's Wheel of Emotions implementation for art piece emotional analysis. +""" + +from enum import Enum +from typing import List, Tuple, Optional +from dataclasses import dataclass + + +class PrimaryEmotion(Enum): + """Eight primary emotions from Plutchik's wheel.""" + JOY = "joy" + TRUST = "trust" + FEAR = "fear" + SURPRISE = "surprise" + SADNESS = "sadness" + DISGUST = "disgust" + ANGER = "anger" + ANTICIPATION = "anticipation" + + +@dataclass +class Emotion: + """Represents an emotion with its intensity levels.""" + primary: PrimaryEmotion + mild: str + basic: str + intense: str + + def get_intensity_level(self, level: int) -> str: + """Get emotion name at specific intensity (1=mild, 2=basic, 3=intense).""" + if level == 1: + return self.mild + elif level == 2: + return self.basic + elif level == 3: + return self.intense + else: + raise ValueError(f"Invalid intensity level: {level}") + + +class EmotionWheel: + """Plutchik's Wheel of Emotions model.""" + + def __init__(self): + # Define emotions with their intensity variations + self.emotions = { + PrimaryEmotion.JOY: Emotion( + primary=PrimaryEmotion.JOY, + mild="serenity", + basic="joy", + intense="ecstasy" + ), + PrimaryEmotion.TRUST: Emotion( + primary=PrimaryEmotion.TRUST, + mild="acceptance", + basic="trust", + intense="admiration" + ), + PrimaryEmotion.FEAR: Emotion( + primary=PrimaryEmotion.FEAR, + mild="apprehension", + basic="fear", + intense="terror" + ), + PrimaryEmotion.SURPRISE: Emotion( + primary=PrimaryEmotion.SURPRISE, + mild="distraction", + basic="surprise", + intense="amazement" + ), + PrimaryEmotion.SADNESS: Emotion( + primary=PrimaryEmotion.SADNESS, + mild="pensiveness", + basic="sadness", + intense="grief" + ), + PrimaryEmotion.DISGUST: Emotion( + primary=PrimaryEmotion.DISGUST, + mild="boredom", + basic="disgust", + intense="loathing" + ), + PrimaryEmotion.ANGER: Emotion( + primary=PrimaryEmotion.ANGER, + mild="annoyance", + basic="anger", + intense="rage" + ), + PrimaryEmotion.ANTICIPATION: Emotion( + primary=PrimaryEmotion.ANTICIPATION, + mild="interest", + basic="anticipation", + intense="vigilance" + ) + } + + # Define opposites + self.opposites = { + PrimaryEmotion.JOY: PrimaryEmotion.SADNESS, + PrimaryEmotion.SADNESS: PrimaryEmotion.JOY, + PrimaryEmotion.TRUST: PrimaryEmotion.DISGUST, + PrimaryEmotion.DISGUST: PrimaryEmotion.TRUST, + PrimaryEmotion.FEAR: PrimaryEmotion.ANGER, + PrimaryEmotion.ANGER: PrimaryEmotion.FEAR, + PrimaryEmotion.SURPRISE: PrimaryEmotion.ANTICIPATION, + PrimaryEmotion.ANTICIPATION: PrimaryEmotion.SURPRISE + } + + # Define dyads (combinations of adjacent emotions) + self.dyads = { + # Primary dyads (adjacent emotions : 1 petal distance) + ("joy", "trust"): "love", + ("trust", "fear"): "submission", + ("fear", "surprise"): "awe", + ("surprise", "sadness"): "disapproval", + ("sadness", "disgust"): "remorse", + ("disgust", "anger"): "contempt", + ("anger", "anticipation"): "aggressiveness", + ("anticipation", "joy"): "optimism", + + # Secondary dyads (2 petals distance) + ("joy", "fear"): "guilt", + ("trust", "surprise"): "curiosity", + ("fear", "sadness"): "despair", + ("surprise", "disgust"): "horror", + ("sadness", "anger"): "envy", + ("disgust", "anticipation"): "cynicism", + ("anger", "joy"): "pride", + ("anticipation", "trust"): "fatalism", + + # Tertiary dyads (2 petals distance) + ("joy", "surprise"): "rapture", + ("trust", "sadness"): "insipidness", + ("fear", "disgust"): "shame", + ("surprise", "anger"): "outrage", + ("sadness", "anticipation"): "pessimism", + ("disgust", "joy"): "morbidness", + ("anger", "trust"): "dominance", + ("anticipation", "fear"): "anxiety", + } + + def get_opposite(self, emotion: PrimaryEmotion) -> PrimaryEmotion: + """Get the opposite emotion.""" + return self.opposites.get(emotion) + + def get_wheel_distance(self, emotion1: PrimaryEmotion, emotion2: PrimaryEmotion) -> int: + """Get distance between two emotions on the wheel (0-4 petals).""" + positions = { + PrimaryEmotion.JOY: 0, + PrimaryEmotion.TRUST: 1, + PrimaryEmotion.FEAR: 2, + PrimaryEmotion.SURPRISE: 3, + PrimaryEmotion.SADNESS: 4, + PrimaryEmotion.DISGUST: 5, + PrimaryEmotion.ANGER: 6, + PrimaryEmotion.ANTICIPATION: 7 + } + + pos1, pos2 = positions[emotion1], positions[emotion2] + # Calculate shortest distance around the wheel + return min(abs(pos1 - pos2), 8 - abs(pos1 - pos2)) + + def get_dyad(self, emotion1: str, emotion2: str) -> Optional[str]: + """Get the combined emotion from two primary emotions.""" + emotion1 = self._normalize_to_basic(emotion1) + emotion2 = self._normalize_to_basic(emotion2) + # Check if they form a dyad + return self.dyads.get((emotion1, emotion2)) or self.dyads.get((emotion2, emotion1)) + + def _normalize_to_basic(self, emotion_name: str) -> str: + """Convert any intensity variation to basic form.""" + for emotion in self.emotions.values(): + if emotion_name.lower() in [emotion.mild, emotion.basic, emotion.intense]: + return emotion.basic + return emotion_name.lower() + + def get_all_variations(self) -> List[str]: + """Get all emotion variations (all intensities of all primaries).""" + variations = [] + for emotion in self.emotions.values(): + variations.extend([emotion.mild, emotion.basic, emotion.intense]) + return variations + + def get_emotion_family(self, emotion_name: str) -> Optional[Tuple[PrimaryEmotion, int]]: + """ + Identify which primary emotion family an emotion belongs to and its intensity. + Returns (PrimaryEmotion, intensity_level) or None if not found. + """ + emotion_lower = emotion_name.lower() + for primary, emotion in self.emotions.items(): + if emotion_lower == emotion.mild: + return (primary, 1) + elif emotion_lower == emotion.basic: + return (primary, 2) + elif emotion_lower == emotion.intense: + return (primary, 3) + return None + + def is_dyad(self, emotion_name: str) -> bool: + """Check if an emotion is a dyad (combination of two primary emotions).""" + return emotion_name.lower() in self.dyads.values() + + def get_dyad_components(self, dyad_name: str) -> Optional[Tuple[str, str]]: + """ + Get the two primary emotions that compose a dyad. + Returns tuple of (emotion1, emotion2) or None if not a dyad. + """ + dyad_lower = dyad_name.lower() + for (e1, e2), dyad in self.dyads.items(): + if dyad == dyad_lower: + return (e1, e2) + return None + + def calculate_dyad_to_dyad_distance(self, dyad1: str, dyad2: str) -> float: + """ + Calculate distance between two dyads by considering their components. + Returns distance between 0.0 (identical) and 1.0 (maximally different). + """ + # Get components of each dyad + components1 = self.get_dyad_components(dyad1) + components2 = self.get_dyad_components(dyad2) + + if not components1 or not components2: + return 1.0 + # Calculate all possible distances between components + distances = [] + for e1 in components1: + for e2 in components2: + dist = self.calculate_emotion_distance(e1, e2) + distances.append(dist) + + # Return the average of all component distances + return sum(distances) / len(distances) if distances else 1.0 + + def calculate_emotion_distance(self, emotion1: str, emotion2: str) -> float: + """ + Calculate distance between two emotions (0.0 = identical, 1.0 = opposite). + Handles both primary emotions and dyads. + """ + if emotion1.lower() == emotion2.lower(): + return 0.0 + + is_dyad1 = self.is_dyad(emotion1) + is_dyad2 = self.is_dyad(emotion2) + + if is_dyad1 or is_dyad2: + if is_dyad1 and is_dyad2: + return self.calculate_dyad_to_dyad_distance(emotion1, emotion2) + if is_dyad1: + components = self.get_dyad_components(emotion1) + if components: + norm_e2 = self._normalize_to_basic(emotion2) + if norm_e2 in components: + return 0.25 # If emotion2 is one of the dyad components, distance is 0.25 + distances = [self.calculate_emotion_distance(comp, emotion2) for comp in components] + return sum(distances) / len(distances) + return 0.75 # If dyad1 is not valid, assume max distance + else: + components = self.get_dyad_components(emotion2) + if components: + norm_e1 = self._normalize_to_basic(emotion1) + if norm_e1 in components: + return 0.25 + distances = [self.calculate_emotion_distance(emotion1, comp) for comp in components] + return sum(distances) / len(distances) + return 0.75 + + # Both are primary emotions - use proper wheel distance + family1 = self.get_emotion_family(emotion1) + family2 = self.get_emotion_family(emotion2) + + if not family1 or not family2: + return 1.0 + + primary1, intensity1 = family1 + primary2, intensity2 = family2 + + # Calculate wheel distance between primary emotions + wheel_distance = self.get_wheel_distance(primary1, primary2) + + # Map wheel distance to normalized distance + distance_map = {0: 0.0, 1: 0.25, 2: 0.5, 3: 0.75, 4: 1.0} + base_distance = distance_map[wheel_distance] + + # Adjust the distance based on intensity levels of emotions + intensity_factor = abs(intensity1 - intensity2) / 10.0 + + return min(1.0, base_distance + intensity_factor) + + def calculate_emotion_similarity(self, emotion1: str, emotion2: str) -> float: + """ + Calculate similarity score between two emotions (1.0 = identical, 0.0 = opposite). + This is the inverse of distance, making it consistent with name and date scoring. + """ + distance = self.calculate_emotion_distance(emotion1, emotion2) + return 1.0 - distance diff --git a/src/art_pieces_db/places.py b/src/art_pieces_db/places.py new file mode 100644 index 0000000000000000000000000000000000000000..48c24d48ce7c691ede41f02cece045b26bc48c4d --- /dev/null +++ b/src/art_pieces_db/places.py @@ -0,0 +1,74 @@ +from .utils import str_to_list +import importlib +import importlib.resources +import logging +import lzma +import pandas as pd + +COL_NAMES = [ + 'geonameid', + 'name', + 'ascii_name', + 'alternate_names', + 'latitude', + 'longitude', + 'feature_class', + 'feature_code', +] + + +class Places: + """ + A class used to manage places, in particular retrieve the city names translations. + """ + + def __init__(self): + resources_dir = Places.load_resource_dir(["resources", "places"]) + self.places_dataframes = {} + for resource_file_compressed in resources_dir.iterdir(): + country = str.split(resource_file_compressed.name, '.')[0] + logging.info(f"reading places resources for country {country}") + resource = lzma.open(resource_file_compressed, mode='r') + dataframe = pd.read_csv(resource, sep="\t", names=COL_NAMES, usecols=range( + 0, len(COL_NAMES)), na_filter=False) + dataframe = dataframe[dataframe['feature_class'] == 'P'] + + def normalize(row): + value = row['alternate_names'] + names = str_to_list(value) + return list(map(str.lower, names)) + dataframe['alternate_names'] = dataframe.apply( + normalize, axis=1) + self.places_dataframes[country] = dataframe + self.alternate_names('Lille') + + def alternate_names(self, target_name): + result = [] + for df in self.places_dataframes.values(): + filtered = df[df['alternate_names'].apply( + lambda x: target_name in x)] + for row in filtered.iterrows(): + result = result + row[1]['alternate_names'] + return result + + def load_resource_dir(dir_parts): + current = None + i = 0 + for module_file in importlib.resources.files("art_pieces_db").iterdir(): + if module_file.is_dir() and module_file.name == dir_parts[i]: + current = module_file + i = i+1 + break + if current is None: + raise ValueError + while i < len(dir_parts): + found = False + for current_sub in current.iterdir(): + if current_sub.is_dir() and current_sub.name == dir_parts[i]: + current = current_sub + i = i+1 + found = True + break + if not found: + raise ValueError + return current diff --git a/src/art_pieces_db/query.py b/src/art_pieces_db/query.py new file mode 100644 index 0000000000000000000000000000000000000000..8230bc80007a7aca050530b7c9626168bcbd444e --- /dev/null +++ b/src/art_pieces_db/query.py @@ -0,0 +1,213 @@ +from .places import Places +from functools import reduce +from rapidfuzz import fuzz +from .emotions import EmotionWheel + + +class Optimizer: + """ + An object used to process optimization queries on a database. + This class is general: you should consider using one of its derivate e.g. WeightedSumOptimizer. + + Such queries use the "Aggregate and Compare" paradigm: for each piece of art, + a score is given, which is then compared to the scores of the other pieces. + """ + + def __init__(self, scoring_fn, sorting_fn): + """ + Creates a new optimization query given the function that create the score + column (called "obj") in the dataframe and the one that sorts the dataframe + according to it. + """ + self.scoring_fn = scoring_fn + self.sorting_fn = sorting_fn + self.places = None + + def optimize_max(self, database): + """ + Returns a table containing the maximal elements w.r.t. the objective function. + """ + df = database.get_dataframe() + df['score'] = df.apply(self.scoring_fn, axis=1) + result = self.sorting_fn(df.copy()) + df.drop(columns='score', inplace=True) + return result + + def name_similarity(target_name, related_names): + """ + Returns a score indicating a similarity between the target name and a list of related name. + The similarity is the maximal similarity between the target and any of the related names. + + The similarity between two names is computed using rapidfuzz partial ratio. + """ + if target_name is None: + return 0. + + def similarity(related): + return fuzz.partial_ratio(related, target_name, score_cutoff=90)/100 + return reduce(max, map(similarity, related_names), 0.) + + def date_similarity(target_date, related_dates): + """ + Returns a score indicating a similarity between the target date and a list of related dates. + The similarity is the maximal similarity between the target and any of the related dates. + + If days and months correspond, the similarity is maximal. + If days or months correspond, the similarity is half the maximal. + """ + if target_date is None: + return 0. + + def similarity(related): + if related.day == target_date.day and related.month == target_date.month: + return 1. + if related.day == target_date.day or related.month == target_date.month: + return 0.5 + return 0. + return reduce(max, map(similarity, related_dates), 0.) + + def place_similarity(self, target_place, related_places): + """ + Returns a score indicating a similarity between the target place and a related place. + """ + if target_place is not None: + if self.places is None: + self.places = Places() + self.places_alt_names_cache = {} + for related_place in related_places: + related_place_lower = related_place.lower() + if related_place_lower not in self.places_alt_names_cache: + self.places_alt_names_cache[related_place_lower] = list(map(str.lower, self.places.alternate_names( + related_place_lower))) + if target_place.lower() in self.places_alt_names_cache[related_place_lower]: + return 1. + return 0. + + # Initialize EmotionWheel for all Optimizer instances + emotion_wheel = EmotionWheel() + + def emotion_similarity(target_emotion, related_emotions): + """ + Returns a score indicating emotional similarity using Plutchik's geometric distance. + Only works when target_emotion is provided. + """ + if not related_emotions or not target_emotion: + return 0.0 + + wheel = Optimizer.emotion_wheel + scores = [] + for emotion in related_emotions: + similarity = wheel.calculate_emotion_similarity(target_emotion, emotion) + scores.append(similarity) + + # Return average similarity + return sum(scores) / len(scores) if scores else 0.0 + + +class WeightedSumOptimizer(Optimizer): + """ + An object used to process optimization queries on a database which underlying + optimization function is a weighted sum computing the closeness of an art piece + to a target profile. + """ + + def __init__(self, profile, weights): + """ + Creates a new weighted sum based optimization function. + + The "weights" parameter is a mapping from the database column names to their weights. + The "profile" parameter is the target profile. + """ + self.profile = profile + self.weights = weights + for col in ['related_names', 'related_dates', 'related_places', 'related_emotions']: + if col not in self.weights: + self.weights[col] = 0 + + def scoring_fn(row): + score_name = self.weights['related_names'] * Optimizer.name_similarity( + self.profile.target_name, row['related_names']) + score_date = self.weights['related_dates'] * Optimizer.date_similarity( + self.profile.target_date, row['related_dates']) + score_place = self.weights['related_places'] * self.place_similarity( + self.profile.target_place, row['related_places']) + score_emotion = self.weights['related_emotions'] * Optimizer.emotion_similarity( + self.profile.target_emotion, row['related_emotions']) + return score_name + score_date + score_place + score_emotion + + def sorting_fn(df): + return df.sort_values(by='score', ascending=False) + Optimizer.__init__(self, scoring_fn, sorting_fn) + + +class WeightedLeximaxOptimizer(Optimizer): + """ + An object used to process optimization queries on a database which underlying + optimization function is a weighted leximax computing the closeness of an art + piece to a target profile. + """ + + def __init__(self, profile, weights): + """ + Creates a new weighted leximax based optimization function. + + The "weights" parameter is a mapping from the database column names to their weights. + The "profile" parameter is the target profile. + """ + self.profile = profile + self.weights = weights + for col in ['related_names', 'related_dates', 'related_places', 'related_emotions']: + if col not in self.weights: + self.weights[col] = 0 + + def scoring_fn(row): + score_name = self.weights['related_names'] * Optimizer.name_similarity( + self.profile.target_name, row['related_names']) + score_date = self.weights['related_dates'] * Optimizer.date_similarity( + self.profile.target_date, row['related_dates']) + score_place = self.weights['related_places'] * self.place_similarity( + self.profile.target_place, row['related_places']) + score_emotion = self.weights['related_emotions'] * Optimizer.emotion_similarity( + self.profile.target_emotion, row['related_emotions']) + scores = [score_name, score_date, score_place, score_emotion] + # Store original scores for logging before sorting + row['_original_scores'] = tuple(scores) + scores.sort(reverse=True) + return tuple(scores) + + def sorting_fn(df): + return df.sort_values(by='score', ascending=False) + Optimizer.__init__(self, scoring_fn, sorting_fn) + + +class TargetProfile: + """ + The query, in term of searched values (i.e. the name we look for, the date we look for, ...) + """ + + def __init__(self): + """ + Create a new, empty target profile. + """ + self.target_name = None + self.target_date = None + self.target_place = None + self.target_emotion = None + + def __str__(self): + return (f"TargetProfile(target_name={self.target_name}, " + f"target_date={self.target_date}, " + f"target_place={self.target_place}, " + f"target_emotion={self.target_emotion})") + + def set_target_name(self, target_name): + self.target_name = target_name + + def set_target_date(self, target_date): + self.target_date = target_date + + def set_target_emotion(self, target_emotion): + self.target_emotion = target_emotion + + def set_target_place(self, target_place): + self.target_place = target_place diff --git a/src/art_pieces_db/resources/places/BE.csv.lzma b/src/art_pieces_db/resources/places/BE.csv.lzma new file mode 100644 index 0000000000000000000000000000000000000000..ce4568bb2ca5555b9b26e575b1176bbdcd7b4cbb --- /dev/null +++ b/src/art_pieces_db/resources/places/BE.csv.lzma @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fa1c0ca6922c9a380c717ede36068e3a07bbe745e269f6959dc34fb46c2c2a1 +size 482765 diff --git a/src/art_pieces_db/resources/places/FR.csv.lzma b/src/art_pieces_db/resources/places/FR.csv.lzma new file mode 100644 index 0000000000000000000000000000000000000000..9a17973aa7a2d80ac6c53c34b9335a5dbef51a97 --- /dev/null +++ b/src/art_pieces_db/resources/places/FR.csv.lzma @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1c5eb1832f0e54f18940a76a46118a829fa6663e2cd9bb9295c4791de98591e +size 5118081 diff --git a/src/art_pieces_db/utils.py b/src/art_pieces_db/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..2604dbe8fe5833f72867599c49db8c055286ad7f --- /dev/null +++ b/src/art_pieces_db/utils.py @@ -0,0 +1,20 @@ +import datetime +import re + + +def str_to_date(str_date): + return datetime.datetime.strptime(str_date, "%d/%m/%Y").date() + + +def str_to_list(value, separators=',;\n'): + """ + Tries to translate a string of separated values into a list of strings. + The separators are commas and carriage returns. + + In case the string does not seem to represent a list of values, a warning is logged and an empty list is returned. + """ + if not isinstance(value, str): + raise TypeError + if value == '': + return [] + return list(filter(lambda x: x != '', map(lambda x: x.strip(), re.split('['+separators+']', value))))