.. _imagemarypoppinsrst: =============================== Quelques images de Mary Poppins =============================== .. only:: html **Links:** :download:`notebook `, :downloadlink:`html `, :download:`PDF `, :download:`python `, :downloadlink:`slides `, :githublink:`GitHub|_doc/notebooks/exemples/image_mary_poppins.ipynb|*` Le notebook télécharge une petite vidéo de Mary Poppins, extrait une dizaine de secondes, convertit la vidéo sous forme d’images, enlève le fond de chaque image et recompose une vidéo. .. code:: ipython3 from jyquickhelper import add_notebook_menu add_notebook_menu() .. contents:: :local: Le module utilise `moviepy `__ et `pytube3 `__. .. code:: ipython3 %matplotlib inline Télécharger une vidéo et extraire une partie -------------------------------------------- On choisit une vidéo de Mary Poppins : `Supercalifragilisticexpialidocious `__. .. code:: ipython3 from pytube import YouTube from pytube.exceptions import RegexMatchError try: y = YouTube("https://www.youtube.com/watch?v=DYacXAd3eAo") except RegexMatchError as e: print("Youtube... changes sometimes, don't ask me why", e) .. parsed-literal:: Youtube... changes sometimes, don't ask me why regex pattern (yt\.akamaized\.net/\)\s*\|\|\s*.*?\s*c\s*&&\s*d\.set\([^,]+\s*,\s*(?P[a-zA-Z0-9$]+)\() had zero matches .. code:: ipython3 import os name = 'Supercalifragilisticexpialidocious (from Mary Poppins) - Julie Andrews Dick Van Dyke.mp4' if not os.path.exists(name): from code_beatrix.art.video import download_youtube_video name = download_youtube_video(tag='DYacXAd3eAo', res=None) name .. parsed-literal:: 'Marie Poppins - Supercalifragilisticexpilialidocious.mp4' On extraire une dizaine de secondes. .. code:: ipython3 from code_beatrix.art.video import video_extract_video, video_save vid = video_extract_video(name, '00:00:32', '00:00:45') video_save(vid, "mpoppins.mp4") Convertir la vidéo en images ---------------------------- .. code:: ipython3 folder = "images" import os if not os.path.exists(folder): os.mkdir(folder) .. code:: ipython3 from code_beatrix.art.video import video_enumerate_frames imgs = list(video_enumerate_frames("mpoppins.mp4", folder=folder)) imgs[:5] .. parsed-literal:: ['images\\images_0000.jpg', 'images\\images_0001.jpg', 'images\\images_0002.jpg', 'images\\images_0003.jpg', 'images\\images_0004.jpg'] .. code:: ipython3 from IPython.display import Image Image(imgs[0], width=360) .. image:: image_mary_poppins_12_0.jpg :width: 360px .. code:: ipython3 Image(imgs[10], width=360) .. image:: image_mary_poppins_13_0.jpg :width: 360px .. code:: ipython3 Image(imgs[-1], width=360) .. image:: image_mary_poppins_14_0.jpg :width: 360px Extraire les personnages de l’image ----------------------------------- On essaye différentes résolutions. On s’aperçoit que les personnages de dessin animé sont aussi considérés comme des personnes. .. code:: ipython3 from code_beatrix.ai import DLImageSegmentation model = DLImageSegmentation() .. code:: ipython3 feat, pred = model.predict(imgs[0], resize=('max2', 400)) .. code:: ipython3 viz = model.plot(feat, pred) .. code:: ipython3 import matplotlib.pyplot as plt fig, ax = plt.subplots(1, 1, figsize=(14, 12)) ax.imshow(viz); .. image:: image_mary_poppins_19_0.png .. code:: ipython3 feat, pred = model.predict(imgs[10], resize=('max2', 400)) viz = model.plot(feat, pred) fig, ax = plt.subplots(1, 1, figsize=(14, 12)) ax.imshow(viz); .. image:: image_mary_poppins_20_0.png .. code:: ipython3 feat, pred = model.predict(imgs[10]) viz = model.plot(feat, pred) fig, ax = plt.subplots(1, 1, figsize=(14, 12)) ax.imshow(viz); .. image:: image_mary_poppins_21_0.png Combiner les personnages avec une autre image --------------------------------------------- .. code:: ipython3 pred[pred!=0] .. parsed-literal:: array([15, 15, 15, ..., 15, 15, 15]) .. code:: ipython3 feat.shape .. parsed-literal:: (360, 480, 3) .. code:: ipython3 feat[pred!=15] = 0 .. code:: ipython3 fig, ax = plt.subplots(1, 1, figsize=(7, 6)) ax.imshow(feat); .. image:: image_mary_poppins_26_0.png .. code:: ipython3 from skimage.io import imread from skimage.transform import resize from skimage import img_as_ubyte img = imread("data/plage.jpg") img = img_as_ubyte(resize(img, (360, 480))) fig, ax = plt.subplots(1, 1, figsize=(7, 6)) ax.imshow(img); .. image:: image_mary_poppins_27_0.png .. code:: ipython3 img.shape, feat.shape .. parsed-literal:: ((360, 480, 3), (360, 480, 3)) .. code:: ipython3 img[pred==15] = feat[pred==15] .. code:: ipython3 fig, ax = plt.subplots(1, 1, figsize=(7, 6)) ax.imshow(img); .. image:: image_mary_poppins_30_0.png